15#include "utilities_slsim.h"
25enum class PixelMapUnits {
34std::string to_string(PixelMapUnits unit);
40template <
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]); }
112 void Clean(){
for(
auto &a : map) a = 0;}
114 void AddImages(ImageInfo *imageinfo,
int Nimages,
float rescale = 1.);
115 void AddImages(std::vector<ImageInfo> &imageinfo,
int Nimages,
float rescale = 1.);
121 PosType AddSource(Source &source);
123 PosType AddSource(Source &source,
int oversample);
124 void AddPointSource(
const Point_2d &x,T flux);
172 template <
typename S>
175 source.getTheta(s_center);
177 if( (s_center[0] + source.getRadius() ) < map_boundary_p1[0] )
return 0.0;
178 if( (s_center[0] - source.getRadius() ) > map_boundary_p2[0] )
return 0.0;
179 if( (s_center[1] + source.getRadius() ) < map_boundary_p1[1] )
return 0.0;
180 if( (s_center[1] - source.getRadius() ) > map_boundary_p2[1] )
return 0.0;
183 PosType totals[nthreads];
184 std::vector<std::thread> thr;
186 size_t block = map.size()/nthreads;
187 for(
int i = 0; i < nthreads ;++i){
188 thr.push_back(std::thread(&PixelMap<T>::addsource_<S>,
this
189 ,i*block,std::min((i+1)*block-1,map.size()-1)
190 ,oversample,std::ref(source)
191 ,std::ref(totals[i])));
194 for(
int ii=0;ii < nthreads;++ii) thr[ii].join();
197 for(
int ii=0;ii < nthreads;++ii) total += totals[ii];
203 void AddCurve(Kist<Point> *imagekist,T value);
204 void AddCurve(std::vector<Point_2d> &curve,T value);
205 void AddCurve(std::vector<RAY> &curve,T value);
208 void drawline(
double x1[],
double x2[],T value,
bool add);
210 void DrawLine(
long x0,
long x1,
long y0,
long y1,T value,
bool add);
211 void DrawLineGS(
long x0,
long x1,
long y0,
long y1,T value,
bool add);
212 void drawcircle(PosType r_center[],PosType radius,PosType value);
213 void drawdisk(PosType r_center[],PosType radius,PosType value,
int Nstrip);
218 void AddValue(std::size_t i, T value);
222 void printFITS(std::string filename,
bool Xflip =
false,
bool ctype =
false,
bool verbose =
false);
223 void printFITS(std::string filename,std::vector< std::tuple<std::string,double,std::string> > &extra_header_info,
bool verbose);
227 ,std::vector<std::string> &headercards
230 void smooth(
double sigma);
232 inline T getValue(std::size_t i)
const {
return map[i]; }
233 inline T & operator[](std::size_t i) {
return map[i]; };
234 inline T operator[](std::size_t i)
const {
return map[i]; };
235 inline T & operator()(std::size_t i) {
return map[i]; };
236 inline T operator()(std::size_t i)
const {
return map[i]; };
237 inline T operator()(std::size_t i,std::size_t j)
const {
return map[i + Nx*j]; };
238 inline T & operator()(std::size_t i,std::size_t j) {
return map[i + Nx*j]; };
260 std::valarray<T>& data() {
return map; }
269 PosType
ave()
const {
return map.sum()/map.size();}
271 PosType
sum()
const {
return map.sum();};
273 size_t size(){
return map.size();}
274 T max()
const{
return map.max(); }
275 T min()
const{
return map.min(); }
277 void FindArc(PosType &radius,PosType *xc,PosType *arc_center,PosType &arclength,PosType &width
281 long find_index(PosType
const x[],
long &ix,
long &iy)
const;
286 long find_index(PosType x,PosType y,
long &ix,
long &iy)
const;
291 void find_position(PosType x[],std::size_t
const index)
const;
293 void find_position(PosType x[],std::size_t
const ix,std::size_t
const iy)
const;
306 void drawPoints(std::vector<Point *> points,PosType size,PosType value);
308 void drawPoints(std::vector<Point> points,PosType size,PosType value);
310 void drawCurve(std::vector<Point *> points,PosType value){
311 for(
int i=0;i<points.size()-1;++i)
drawline(points[i]->x,points[i+1]->x,value,
false);
313 void drawCurve(std::vector<Point> points,PosType value){
314 for(
int i=0;i<points.size()-1;++i)
drawline(points[i].x,points[i+1].x,value,
false);
316 void drawPoints(std::vector<Point_2d> points,PosType size,PosType value);
317 void drawCurve(std::vector<Point_2d> points,PosType value){
318 for(
int i=0;i<points.size()-1;++i)
drawline(points[i].x,points[i+1].x,value,
false);
321 void drawSquare(PosType p1[],PosType p2[],PosType value);
322 void drawBox(PosType p1[],PosType p2[],PosType value,
int Nstrip);
326 ,std::vector<PosType> &lvec
327 ,
bool overwrite =
true
332 ,
const std::vector<PosType> &lbins
333 ,std::vector<PosType> &lave
334 ,
bool overwrite =
true
337 void AdaptiveSmooth(PosType value);
341 ,std::vector<std::vector<Point_2d> > &points
342 ,std::vector<bool> &hits_edge
351 std::vector<std::vector<size_t> > &points
369 ,T &total_sig_noise_source
370 ,std::vector<size_t> &maxima_indexes
371 ,std::vector<std::vector<size_t> > &image_points
374 ,
size_t &n_pix_in_source
375 ,
bool verbose =
false
380 std::vector<size_t>
maxima(T minlevel)
const;
392 size_t threshold(std::list<size_t> &pixel_index,PosType value){
393 for(
size_t i=0;i<map.size();++i)
if(value < map[i]) pixel_index.push_back(i);
394 return pixel_index.size();
399 for(
size_t i=0;i<Nx;++i){
400 for(
size_t j=0;j<(Ny-1)/2;++j){
401 std::swap( map[i + Nx*j],map[i + Nx*(Ny-j-1)] );
407 for(
size_t i=0;i<(Nx-1)/2;++i){
408 for(
size_t j=0;j<Ny;++j){
409 std::swap( map[i + Nx*j],map[Nx-i-1 + Nx*j] );
447 void addheader(std::string label,
long value,std::string comment){
449 for(
auto &a : headers_long){
450 if(std::get<0>(a) == label){
451 std::get<1>(a)=value;
452 std::get<2>(a)=comment;
457 if(!found) headers_long.push_back(std::make_tuple(label,value,comment));
459 void addheader(std::string label,
size_t value,std::string comment){
461 for(
auto &a : headers_long){
462 if(std::get<0>(a) == label){
463 std::get<1>(a)=value;
464 std::get<2>(a)=comment;
469 if(!found) headers_long.push_back(std::make_tuple(label,value,comment));
471 void addheader(std::string label,
float value,std::string comment){
473 for(
auto &a : headers_float){
474 if(std::get<0>(a) == label){
475 std::get<1>(a)=value;
476 std::get<2>(a)=comment;
481 if(!found) headers_float.push_back(std::make_tuple(label,value,comment));
483 void addheader(std::string label,
double value,std::string comment){
485 for(
auto &a : headers_float){
486 if(std::get<0>(a) == label){
487 std::get<1>(a)=value;
488 std::get<2>(a)=comment;
493 if(!found) headers_float.push_back(std::make_tuple(label,value,comment));
495 void addheader(std::string label,std::string value,std::string comment){
497 for(
auto &a : headers_string){
498 if(std::get<0>(a) == label){
499 std::get<1>(a)=value;
500 std::get<2>(a)=comment;
505 if(!found) headers_string.push_back(std::make_tuple(label,value,comment));
509 std::vector<std::tuple<std::string,float,std::string> > headers_float;
510 std::vector<std::tuple<std::string,long,std::string> > headers_long;
511 std::vector<std::tuple<std::string,std::string,std::string> > headers_string;
513 std::valarray<T> map;
516 double resolution,rangeX,rangeY,center[2];
518 double map_boundary_p1[2],map_boundary_p2[2];
519 PixelMapUnits units= PixelMapUnits::ndef;
523 double LeafPixelArea(IndexType i,Branch * branch1);
524 void PointsWithinLeaf(Branch * branch1, std::list <unsigned long> &neighborlist);
525 bool inMapBox(Branch * branch1)
const;
526 bool inMapBox(
double * branch1)
const;
529 bool pixels_are_neighbors(
size_t i,
size_t j)
const;
533 void _count_islands_(
size_t current,std::list<size_t> &reservoir
534 ,std::list<size_t>::iterator &group)
const;
540 template <
typename S>
541 void addsource_(
size_t i1,
size_t i2,
int oversample,
544 PosType tmp_res = resolution*1.0/oversample;
545 PosType tmp = tmp_res*tmp_res;
546 PosType bl = resolution /2 - 0.5*tmp_res;
551 for(
size_t index = i1 ;index <= i2; ++index){
555 for(
int i = 0 ; i < oversample ; ++i){
556 x[0] = y[0] + i*tmp_res;
557 for(
int j=0; j < oversample;++j){
558 x[1] = y[1] + j*tmp_res;
559 map[index] += source.SurfaceBrightness(x)*tmp;
560 total += source.SurfaceBrightness(x)*tmp;
567 bool incurve(
long k,std::vector<Point_2d> &curve)
const;
579 swap(x.resolution, y.resolution);
580 swap(x.rangeX, y.rangeX);
581 swap(x.rangeY, y.rangeY);
583 swap(x.center[0], y.center[0]);
584 swap(x.center[1], y.center[1]);
586 swap(x.map_boundary_p1[0], y.map_boundary_p1[0]);
587 swap(x.map_boundary_p1[1], y.map_boundary_p1[1]);
588 swap(x.map_boundary_p2[0], y.map_boundary_p2[0]);
589 swap(x.map_boundary_p2[1], y.map_boundary_p2[1]);
Image structure that can be manipulated and exported to/from fits files.
Definition pixelmap.h:42
void flipY()
reflects the image about the horizontal mid-line
Definition pixelmap.h:398
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:857
void duplicate(const PixelMap &pmap)
copy a PixelMap that must be the same without creating a new one..
Definition pixelmap.cpp:2468
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:2082
double getRA()
returns right accention of center
Definition pixelmap.h:101
double getDEC()
returns declination of center
Definition pixelmap.h:103
void AddUniformImages(ImageInfo *imageinfo, int Nimages, T value)
Add images with uniform surface brightness set by input parameter value.
Definition pixelmap.cpp:769
void copy_in(const PixelMap &pmap)
copy a PixelMap into this one.
Definition pixelmap.cpp:2480
PixelMap< T > rotate(PosType theta, T scale=1)
rotate and scale the image while keeping pixels, resoluiton
Definition pixelmap.cpp:2305
void AddGridBrightness(Grid &grid)
Add an image from a the surface brightnesses of a Grid to the PixelMap.
Definition pixelmap.cpp:685
PixelMap & operator-=(const PixelMap &rhs)
Subtract the values of another PixelMap from this one.
Definition pixelmap.cpp:566
PixelMap & operator+=(const PixelMap &rhs)
Add the values of another PixelMap to this one.
Definition pixelmap.cpp:542
void drawSquare(PosType p1[], PosType p2[], PosType value)
Draw a rectangle.
Definition pixelmap.cpp:1783
void drawdisk(PosType r_center[], PosType radius, PosType value, int Nstrip)
Draws a disk.
Definition pixelmap.cpp:1681
PixelMap(const PixelMap< T > &pmap, double res_ratio)
Creates a PixelMap at a different resolution. The new counts are calculated integrating over the inpu...
Definition pixelmap.cpp:320
void drawline(double x1[], double x2[], T value, bool add)
simple line
Definition pixelmap.cpp:1531
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:173
PixelMap interpolate(int n)
Makes a PixelMap with resolution 1/n of the original with the values linearly interpolated.
Definition pixelmap.cpp:398
void doubleFlip()
rotate the image by 180deg or equivalently reflect it through the origin
Definition pixelmap.h:414
PixelMap & operator*=(const PixelMap &rhs)
Multiply the values of another PixelMap by this one.
Definition pixelmap.cpp:589
void AddCurve(ImageInfo *curve, T value)
Draws a closed curve through the points in curve->imagekist.
Definition pixelmap.cpp:1869
void printASCIItoFile(std::string filename) const
Print an ASCII table of all the pixel values.
Definition pixelmap.cpp:1297
PixelMap< T > convolve(const PixelMap< T > &kernel)
convolve the image with a kernel.
Definition pixelmap.cpp:2642
void AddImages(ImageInfo *imageinfo, int Nimages, float rescale=1.)
Add an image to the map.
Definition pixelmap.cpp:641
void AssignValue(std::size_t i, T value)
Assigns a value to the i-th pixel.
Definition pixelmap.cpp:523
PosType ave() const
return average pixel value
Definition pixelmap.h:269
PixelMap operator*(const PixelMap &a) const
Multiply two PixelMaps.
Definition pixelmap.cpp:618
PixelMap operator-(const PixelMap &) const
Subtract two PixelMaps.
Definition pixelmap.cpp:578
void AddValue(std::size_t i, T value)
Adds a value to the i-th pixel.
Definition pixelmap.cpp:516
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:1150
void recenter(PosType newcenter[2])
recenter the map without changing anything else.
Definition pixelmap.cpp:2730
void find_islands_holes(T level, std::vector< std::vector< size_t > > &points) const
Definition pixelmap.cpp:877
size_t threshold(std::list< size_t > &pixel_index, PosType value)
get a list of pixels above value
Definition pixelmap.h:392
void printASCII() const
Print an ASCII table of all the pixel values.
Definition pixelmap.cpp:1286
void flipX()
reflects the image about the vertical mid-line
Definition pixelmap.h:406
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
PixelMap operator+(const PixelMap &) const
Add two PixelMaps.
Definition pixelmap.cpp:555
void PowerSpectrum(std::vector< PosType > &power_spectrum, std::vector< PosType > &lvec, bool overwrite=true)
Find the power spectrum of the map.
Definition pixelmap.cpp:2753
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:1815
PixelMap operator/(const PixelMap &a) const
Multiply two PixelMaps.
Definition pixelmap.cpp:627
void setRAandDec(double RAin, double DECin)
set the coordinates of center
Definition pixelmap.h:106
PosType sum() const
return sum of all pixel values
Definition pixelmap.h:271
void AddGridMapBrightness(const GridMap &grid)
Add an image from a the surface brightnesses of a GridMap to the PixelMap.
Definition pixelmap.cpp:720
void Renormalize(T factor)
Multiplies the whole map by a scalar factor.
Definition pixelmap.cpp:509
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:2227
void paste(const PixelMap &pmap)
Replace overlaping pixel values with those of the input map.
Definition pixelmap.cpp:2576
size_t size()
Total number of pixels.
Definition pixelmap.h:273
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:1936
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:2278
PixelMap< T > cutout(long xmin, long xmax, long ymin, long ymax)
cut out a part of the PixelMap
Definition pixelmap.cpp:2712
void smooth(double sigma)
Smoothes a map with a Gaussian kernel of width sigma (in arcseconds)
Definition pixelmap.cpp:1465
void drawcircle(PosType r_center[], PosType radius, PosType value)
Draws a circle.
Definition pixelmap.cpp:1657
T linear_interpolate(PosType x[])
interpolate to point x[]
Definition pixelmap.cpp:2340
bool agrees(const PixelMap &other) const
Check whether two PixelMaps agree in their physical dimensions.
Definition pixelmap.cpp:529
std::vector< size_t > maxima(T minlevel) const
find maxima that are above minlevel
Definition pixelmap.cpp:942
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:1318
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:984
void addheader(std::string label, long value, std::string comment)
add a heaader keyword that will appear in fits output
Definition pixelmap.h:447
void DrawLine(long x0, long x1, long y0, long y1, T value, bool add)
line by Bresenham's line algorithm
Definition pixelmap.cpp:1578
void drawgrid(int N, PosType value)
draw a grid on the image that divides the each demension into N cells
Definition pixelmap.cpp:1717
Base class for all sources.
Definition source.h:44
int GetNThreads()
returns the compiler variable N_THREADS that is maximum number of threads to be used.
Definition utilities.cpp:553
LensingVariable
output lensing variables
Definition standard.h:89
Structure to contain both source and image trees.
Definition grid_maintenance.h:24
A simplified version of the Grid structure for making non-adaptive maps of the lensing quantities (ka...
Definition gridmap.h:31
Structure for storing information about images or curves.
Definition image_info.h:20
Class for representing points or vectors in 2 dimensions. Not that the dereferencing operator is over...
Definition point.h:48