|
GLAMERDOC++
Gravitational Lensing Code Library
|
13 #include <type_traits>
15 #include "utilities_slsim.h"
25 enum class PixelMapUnits {
34 std::string
to_string(PixelMapUnits unit);
40 template <
typename T=
double>
44 static_assert( std::is_same<T, float>::value || std::is_same<T, double>::value
45 ,
"PixeMap can only be instantated with a double or float template argument");
54 PixelMap(
const double* center, std::size_t Npixels
56 ,PixelMapUnits u = PixelMapUnits::ndef);
57 PixelMap(
const double* center, std::size_t Nx, std::size_t Ny
59 ,PixelMapUnits u = PixelMapUnits::ndef);
63 ,PixelMapUnits u = PixelMapUnits::ndef
64 ,std::string extension =
""
68 template<
typename OtherT>
79 void ChangeUnits(PixelMapUnits u){units=u;}
80 PixelMapUnits getUnits()
const {
return units;}
82 inline bool valid()
const {
return map.size(); };
83 inline std::size_t size()
const {
return map.size(); };
85 inline std::size_t getNx()
const {
return Nx; }
86 inline std::size_t getNy()
const {
return Ny; }
87 inline double getRangeX()
const {
return rangeX; }
88 inline double getRangeY()
const {
return rangeY; }
90 void const getCenter(
Point_2d &c)
const{ c[0]=center[0]; c[1]=center[1];}
95 inline double getResolution()
const {
return resolution; }
98 inline Point_2d getLLBoundary()
const{
return Point_2d(map_boundary_p1[0],map_boundary_p1[1]); }
99 inline Point_2d getURBoundary()
const{
return Point_2d(map_boundary_p2[0],map_boundary_p2[1]); }
113 void Clean(){
for(
auto &a : map) a = 0;}
114 void clear(){Clean();}
117 void AddImages(std::vector<ImageInfo> &imageinfo,
int Nimages,
float rescale = 1.);
123 PosType AddSource(
Source &source);
125 PosType AddSource(
Source &source,
int oversample);
126 void AddPointSource(
const Point_2d &x,T flux);
174 template <
typename S>
177 source.getTheta(s_center);
179 if( (s_center[0] + source.getRadius() ) < map_boundary_p1[0] )
return 0.0;
180 if( (s_center[0] - source.getRadius() ) > map_boundary_p2[0] )
return 0.0;
181 if( (s_center[1] + source.getRadius() ) < map_boundary_p1[1] )
return 0.0;
182 if( (s_center[1] - source.getRadius() ) > map_boundary_p2[1] )
return 0.0;
185 PosType totals[nthreads];
186 std::vector<std::thread> thr;
188 size_t block = map.size()/nthreads;
189 for(
int i = 0; i < nthreads ;++i){
191 ,i*block,std::min((i+1)*block-1,map.size()-1)
192 ,oversample,std::ref(source)
193 ,std::ref(totals[i])));
196 for(
int ii=0;ii < nthreads;++ii) thr[ii].join();
199 for(
int ii=0;ii < nthreads;++ii) total += totals[ii];
205 void AddCurve(Kist<Point> *imagekist,T value);
206 void AddCurve(std::vector<Point_2d> &curve,T value);
207 void AddCurve(std::vector<RAY> &curve,T value);
210 void drawline(
double x1[],
double x2[],T value,
bool add);
212 void DrawLine(
long x0,
long x1,
long y0,
long y1,T value,
bool add);
213 void DrawLineGS(
long x0,
long x1,
long y0,
long y1,T value,
bool add);
214 void drawcircle(PosType r_center[],PosType radius,PosType value);
215 void drawdisk(PosType r_center[],PosType radius,PosType value,
int Nstrip);
220 void AddValue(std::size_t i, T value);
224 void printFITS(std::string filename,
bool Xflip =
false,
bool ctype =
false,
bool verbose =
false);
225 void printFITS(std::string filename,std::vector< std::tuple<std::string,double,std::string> > &extra_header_info,
bool verbose);
229 ,std::vector<std::string> &headercards
232 void smooth(
double sigma);
234 inline T getValue(std::size_t i)
const {
return map[i]; }
235 inline T & operator[](std::size_t i) {
return map[i]; };
236 const T &operator[](std::size_t i)
const {
return map[i]; };
237 inline T & operator()(std::size_t i) {
return map[i]; };
238 inline T operator()(std::size_t i)
const {
return map[i]; };
239 inline T operator()(std::size_t i,std::size_t j)
const {
return map[i + Nx*j]; };
240 inline T & operator()(std::size_t i,std::size_t j) {
return map[i + Nx*j]; };
262 std::valarray<T>& data() {
return map; }
271 PosType
ave()
const {
return map.sum()/map.size();}
273 PosType
sum()
const {
return map.sum();};
275 size_t size(){
return map.size();}
276 T max()
const{
return map.max(); }
277 T min()
const{
return map.min(); }
279 void FindArc(PosType &radius,PosType *xc,PosType *arc_center,PosType &arclength,PosType &width
283 long find_index(PosType
const x[],
long &ix,
long &iy)
const;
288 long find_index(PosType x,PosType y,
long &ix,
long &iy)
const;
293 void find_position(PosType x[],std::size_t
const index)
const;
295 void find_position(PosType x[],std::size_t
const ix,std::size_t
const iy)
const;
308 void drawPoints(std::vector<Point *> points,PosType size,PosType value);
310 void drawPoints(std::vector<Point> points,PosType size,PosType value);
312 void drawCurve(std::vector<Point *> points,PosType value){
313 for(
int i=0;i<points.size()-1;++i)
drawline(points[i]->x,points[i+1]->x,value,
false);
315 void drawCurve(std::vector<Point> points,PosType value){
316 for(
int i=0;i<points.size()-1;++i)
drawline(points[i].x,points[i+1].x,value,
false);
318 void drawPoints(std::vector<Point_2d> points,PosType size,PosType value);
319 void drawCurve(std::vector<Point_2d> points,PosType value){
320 for(
int i=0;i<points.size()-1;++i)
drawline(points[i].x,points[i+1].x,value,
false);
323 void drawSquare(PosType p1[],PosType p2[],PosType value);
324 void drawBox(PosType p1[],PosType p2[],PosType value,
int Nstrip);
328 ,std::vector<PosType> &lvec
329 ,
bool overwrite =
true
334 ,
const std::vector<PosType> &lbins
335 ,std::vector<PosType> &lave
336 ,
bool overwrite =
true
339 void AdaptiveSmooth(PosType value);
343 ,std::vector<std::vector<Point_2d> > &points
344 ,std::vector<bool> &hits_edge
359 std::vector<std::vector<size_t>> &points,
360 std::vector<std::vector<Point_2d>> &boundaries,
361 std::vector<bool> &hits_edge,
362 std::vector<std::vector<int> > &holes)
const;
387 ,T &total_sig_noise_source
388 ,std::vector<size_t> &maxima_indexes
389 ,std::vector<std::vector<size_t> > &image_points
392 ,
size_t &n_pix_in_source
393 ,
bool verbose =
false
413 double &angle,
double &thinness,
double &radius,
double &nonrad,
double &range)
const;
416 std::vector<size_t>
maxima(T minlevel)
const;
427 size_t threshold(std::list<size_t> &pixel_index, PosType value)
429 for (
size_t i = 0; i < map.size(); ++i)
431 pixel_index.push_back(i);
432 return pixel_index.size();
438 for (
size_t i = 0; i < Nx; ++i)
440 for (
size_t j = 0; j < (Ny - 1) / 2; ++j)
442 std::swap(map[i + Nx * j], map[i + Nx * (Ny - j - 1)]);
449 for (
size_t i = 0; i < (Nx - 1) / 2; ++i)
451 for (
size_t j = 0; j < Ny; ++j)
453 std::swap(map[i + Nx * j], map[Nx - i - 1 + Nx * j]);
492 void addheader(std::string label,
long value, std::string comment)
495 for (
auto &a : headers_long)
497 if (std::get<0>(a) == label)
499 std::get<1>(a) = value;
500 std::get<2>(a) = comment;
506 headers_long.push_back(std::make_tuple(label, value, comment));
508 void addheader(std::string label,
size_t value, std::string comment)
511 for (
auto &a : headers_long)
513 if (std::get<0>(a) == label)
515 std::get<1>(a) = value;
516 std::get<2>(a) = comment;
522 headers_long.push_back(std::make_tuple(label, value, comment));
524 void addheader(std::string label,
float value, std::string comment)
527 for (
auto &a : headers_float)
529 if (std::get<0>(a) == label)
531 std::get<1>(a) = value;
532 std::get<2>(a) = comment;
538 headers_float.push_back(std::make_tuple(label, value, comment));
540 void addheader(std::string label,
double value, std::string comment)
543 for (
auto &a : headers_float)
545 if (std::get<0>(a) == label)
547 std::get<1>(a) = value;
548 std::get<2>(a) = comment;
554 headers_float.push_back(std::make_tuple(label, value, comment));
556 void addheader(std::string label, std::string value, std::string comment)
559 for (
auto &a : headers_string)
561 if (std::get<0>(a) == label)
563 std::get<1>(a) = value;
564 std::get<2>(a) = comment;
570 headers_string.push_back(std::make_tuple(label, value, comment));
574 std::vector<std::tuple<std::string, float, std::string>> headers_float;
575 std::vector<std::tuple<std::string, long, std::string>> headers_long;
576 std::vector<std::tuple<std::string, std::string, std::string>> headers_string;
578 std::valarray<T> map;
581 double resolution, rangeX, rangeY, center[2];
582 double RA = 0, DEC = 0;
583 double map_boundary_p1[2], map_boundary_p2[2];
584 PixelMapUnits units = PixelMapUnits::ndef;
588 double LeafPixelArea(IndexType i,
Branch * branch1);
589 void PointsWithinLeaf(
Branch * branch1, std::list<unsigned long> & neighborlist);
590 bool inMapBox(
Branch * branch1)
const;
591 bool inMapBox(
double *branch1)
const;
594 bool pixels_are_neighbors(
size_t i,
size_t j)
const;
598 void _count_islands_(
size_t current, std::list<size_t> &reservoir, std::list<size_t>::iterator &group)
const;
604 template <
typename S>
605 void addsource_(
size_t i1,
size_t i2,
int oversample,
609 PosType tmp_res = resolution * 1.0 / oversample;
610 PosType tmp = tmp_res * tmp_res;
611 PosType bl = resolution / 2 - 0.5 * tmp_res;
616 for (
size_t index = i1; index <= i2; ++index)
621 for (
int i = 0; i < oversample; ++i)
623 x[0] = y[0] + i * tmp_res;
624 for (
int j = 0; j < oversample; ++j)
626 x[1] = y[1] + j * tmp_res;
627 map[index] += source.SurfaceBrightness(x) * tmp;
628 total += source.SurfaceBrightness(x) * tmp;
635 bool incurve(
long k, std::vector<Point_2d> &curve)
const;
647 swap(x.resolution, y.resolution);
648 swap(x.rangeX, y.rangeX);
649 swap(x.rangeY, y.rangeY);
651 swap(x.center[0], y.center[0]);
652 swap(x.center[1], y.center[1]);
654 swap(x.map_boundary_p1[0], y.map_boundary_p1[0]);
655 swap(x.map_boundary_p1[1], y.map_boundary_p1[1]);
656 swap(x.map_boundary_p2[0], y.map_boundary_p2[0]);
657 swap(x.map_boundary_p2[1], y.map_boundary_p2[1]);
PixelMap & operator-=(const PixelMap &rhs)
Subtract the values of another PixelMap from this one.
Definition: pixelmap.cpp:566
PixelMap interpolate(int n)
Makes a PixelMap with resolution 1/n of the original with the values linearly interpolated.
Definition: pixelmap.cpp:398
void flipX()
reflects the image about the vertical mid-line
Definition: pixelmap.h:447
Base class for all sources.
Definition: source.h:44
void paste(const PixelMap &pmap)
Replace overlaping pixel values with those of the input map.
Definition: pixelmap.cpp:2871
long find_index(PosType const x[], long &ix, long &iy) const
get the index for a position, returns -1 if out of map, this version returns the 2D grid coordinates
Definition: pixelmap.cpp:2522
void setRAandDec(double RAin, double DECin)
set the coordinates of center
Definition: pixelmap.h:107
Structure to contain both source and image trees.
Definition: grid_maintenance.h:24
The box representing a branch of a binary tree structure. Used specifically in TreeStruct for organiz...
Definition: point.h:677
void addheader(std::string label, long value, std::string comment)
add a heaader keyword that will appear in fits output
Definition: pixelmap.h:492
void drawcircle(PosType r_center[], PosType radius, PosType value)
Draws a circle.
Definition: pixelmap.cpp:1952
void AddValue(std::size_t i, T value)
Adds a value to the i-th pixel.
Definition: pixelmap.cpp:516
void drawgrid(int N, PosType value)
draw a grid on the image that divides the each demension into N cells
Definition: pixelmap.cpp:2012
double getDEC()
returns declination of center
Definition: pixelmap.h:104
link list for points, uses the linking pointers within the Point type unlike Kist
Definition: point.h:804
std::vector< size_t > maxima(T minlevel) const
find maxima that are above minlevel
Definition: pixelmap.cpp:1029
void AssignValue(std::size_t i, T value)
Assigns a value to the i-th pixel.
Definition: pixelmap.cpp:523
PosType sum() const
return sum of all pixel values
Definition: pixelmap.h:273
void printASCIItoFile(std::string filename) const
Print an ASCII table of all the pixel values.
Definition: pixelmap.cpp:1592
void recenter(PosType newcenter[2])
recenter the map without changing anything else.
Definition: pixelmap.cpp:3052
void AddGrid(const Grid &grid, T value=1.0)
Fills in pixels where the image plane points in the grid are located with the value given.
Definition: pixelmap.cpp:2231
PixelMap< T > convolve(const PixelMap< T > &kernel)
convolve the image with a kernel.
Definition: pixelmap.cpp:2937
Class for representing points or vectors in 2 dimensions. Not that the dereferencing operator is over...
Definition: point.h:48
PixelMap & operator+=(const PixelMap &rhs)
Add the values of another PixelMap to this one.
Definition: pixelmap.cpp:542
void AddGridBrightness(Grid &grid)
Add an image from a the surface brightnesses of a Grid to the PixelMap.
Definition: pixelmap.cpp:685
void find_islands_holes(T level, std::vector< std::vector< size_t >> &points, std::vector< std::vector< Point_2d >> &boundaries, std::vector< bool > &hits_edge, std::vector< std::vector< int > > &holes) const
Definition: pixelmap.cpp:942
A simplified version of the Grid structure for making non-adaptive maps of the lensing quantities (ka...
Definition: gridmap.h:31
PixelMap & operator*=(const PixelMap &rhs)
Multiply the values of another PixelMap by this one.
Definition: pixelmap.cpp:589
PixelMap operator*(const PixelMap &a) const
Multiply two PixelMaps.
Definition: pixelmap.cpp:618
PixelMap< T > downsize(int n)
Creates a PixelMap with a lower resolution. The value of the pixels are added for the new pixels....
Definition: pixelmap.cpp:371
size_t size()
Total number of pixels.
Definition: pixelmap.h:275
double getRA()
returns right accention of center
Definition: pixelmap.h:102
void DrawLine(long x0, long x1, long y0, long y1, T value, bool add)
line by Bresenham's line algorithm
Definition: pixelmap.cpp:1873
void copy_in(const PixelMap &pmap)
copy a PixelMap into this one.
Definition: pixelmap.cpp:2775
bool agrees(const PixelMap &other) const
Check whether two PixelMaps agree in their physical dimensions.
Definition: pixelmap.cpp:529
void printFITS(std::string filename, bool Xflip=false, bool ctype=false, bool verbose=false)
Output the pixel map as a fits file.
Definition: pixelmap.cpp:1613
void drawline(double x1[], double x2[], T value, bool add)
simple line
Definition: pixelmap.cpp:1826
int count_islands(std::vector< size_t > &pixel_index) const
For a list of pixel indexes this will count and separated islands that are not connected.
Definition: pixelmap.cpp:1445
void lens_definition(T min_sn_per_image, T pixel_threshold, int &Nimages, T &total_sig_noise_source, std::vector< size_t > &maxima_indexes, std::vector< std::vector< size_t > > &image_points, bool &lens_TF, T &level, size_t &n_pix_in_source, bool verbose=false)
Definition: pixelmap.cpp:1071
PixelMap operator-(const PixelMap &) const
Subtract two PixelMaps.
Definition: pixelmap.cpp:578
size_t threshold(std::list< size_t > &pixel_index, PosType value)
get a list of pixels above value
Definition: pixelmap.h:427
void AddGridMapBrightness(const GridMap &grid)
Add an image from a the surface brightnesses of a GridMap to the PixelMap.
Definition: pixelmap.cpp:720
void AddImages(ImageInfo *imageinfo, int Nimages, float rescale=1.)
Add an image to the map.
Definition: pixelmap.cpp:641
void drawBox(PosType p1[], PosType p2[], PosType value, int Nstrip)
Draws a box (filling the inside with horizontal lines, starting from the top)
Definition: pixelmap.cpp:2110
void FindArc(PosType &radius, PosType *xc, PosType *arc_center, PosType &arclength, PosType &width, PosType threshold)
Find arcs in image WARNING: THIS IS UNDER CONSTRUCTION!
Definition: pixelmap.cpp:2377
void find_contour(T level, std::vector< std::vector< Point_2d > > &points, std::vector< bool > &hits_edge) const
returns a vector of contour curves
Definition: pixelmap.cpp:858
void find_position(PosType x[], std::size_t const index) const
get the index for a position, returns -1 if out of map
Definition: pixelmap.cpp:2573
PosType ave() const
return average pixel value
Definition: pixelmap.h:271
void flipY()
reflects the image about the horizontal mid-line
Definition: pixelmap.h:436
void find_islands_holes(T level, std::vector< std::vector< size_t >> &points) const
PixelMap operator+(const PixelMap &) const
Add two PixelMaps.
Definition: pixelmap.cpp:555
void doubleFlip()
rotate the image by 180deg or equivalently reflect it through the origin
Definition: pixelmap.h:458
void drawSquare(PosType p1[], PosType p2[], PosType value)
Draw a rectangle.
Definition: pixelmap.cpp:2078
void duplicate(const PixelMap &pmap)
copy a PixelMap that must be the same without creating a new one..
Definition: pixelmap.cpp:2763
void drawdisk(PosType r_center[], PosType radius, PosType value, int Nstrip)
Draws a disk.
Definition: pixelmap.cpp:1976
void AddCurve(ImageInfo *curve, T value)
Draws a closed curve through the points in curve->imagekist.
Definition: pixelmap.cpp:2164
PixelMap operator/(const PixelMap &a) const
Multiply two PixelMaps.
Definition: pixelmap.cpp:627
T linear_interpolate(PosType x[])
interpolate to point x[]
Definition: pixelmap.cpp:2635
Image structure that can be manipulated and exported to/from fits files.
Definition: pixelmap.h:42
void printASCII() const
Print an ASCII table of all the pixel values.
Definition: pixelmap.cpp:1581
void PowerSpectrum(std::vector< PosType > &power_spectrum, std::vector< PosType > &lvec, bool overwrite=true)
Find the power spectrum of the map.
Definition: pixelmap.cpp:3075
PosType AddSource_parallel(S &source, int oversample)
Adds source to map. This version breaks pixels up into blocks and does them in seporate threads.
Definition: pixelmap.h:175
LensingVariable
output lensing variables
Definition: standard.h:89
void arc_parameters(T level, Point_2d center, bool &ring, double &angle, double &thinness, double &radius, double &nonrad, double &range) const
find arc parameters for a contour at level inputs: level : contour level to use center : proposed cen...
Definition: pixelmap.cpp:1237
int GetNThreads()
returns the compiler variable N_THREADS that is maximum number of threads to be used.
Definition: utilities.cpp:553
void smooth(double sigma)
Smoothes a map with a Gaussian kernel of width sigma (in arcseconds)
Definition: pixelmap.cpp:1760
PixelMap< T > rotate(PosType theta, T scale=1)
rotate and scale the image while keeping pixels, resoluiton
Definition: pixelmap.cpp:2600
void Renormalize(T factor)
Multiplies the whole map by a scalar factor.
Definition: pixelmap.cpp:509
void AddUniformImages(ImageInfo *imageinfo, int Nimages, T value)
Add images with uniform surface brightness set by input parameter value.
Definition: pixelmap.cpp:769
Structure for storing information about images or curves.
Definition: image_info.h:20
PixelMap< T > cutout(long xmin, long xmax, long ymin, long ymax)
cut out a part of the PixelMap
Definition: pixelmap.cpp:3007