source: trunk/src/Cubes/cubes.hh @ 187

Last change on this file since 187 was 187, checked in by Matthew Whiting, 18 years ago

Large suite of edits, mostly due to testing with valgrind, which clear up bad memory allocations and so on.
Improved the printing of progress bars in some routines by introducing a new ProgressBar? class, with associated functions to do the printing (now much cleaner).

File size: 14.4 KB
Line 
1#ifndef CUBES_H
2#define CUBES_H
3
4#include <iostream>
5#include <string>
6#include <vector>
7
8#ifndef PARAM_H
9#include <param.hh>
10#endif
11#ifndef DETECTION_H
12#include <Detection/detection.hh>
13#endif
14#ifndef COLUMNS_H
15#include <Detection/columns.hh>
16#endif
17#ifndef PLOTS_H
18#include <Cubes/plots.hh>
19#endif
20
21using std::string;
22using std::vector;
23using namespace Column;
24
25/****************************************************************/
26/////////////////////////////////////////////////////////////
27//// Definition of an n-dimensional data array:
28////     array of pixel values, size & dimensions
29////     array of Detection objects
30/////////////////////////////////////////////////////////////
31
32
33class DataArray
34{
35public:
36  DataArray(){numDim=0; numPixels=0;};
37  DataArray(short int nDim){numDim=nDim; numPixels=0;};
38  DataArray(short int nDim, long size);
39  DataArray(short int nDim, long *dimensions);
40  virtual ~DataArray();
41  // Size and Dimension related
42  long                 getDimX(){if(numDim>0) return axisDim[0];else return 0;};
43  long                 getDimY(){if(numDim>1) return axisDim[1];else return 1;};
44  long                 getDimZ(){if(numDim>2) return axisDim[2];else return 1;};
45  void                 getDim(long &x, long &y, long &z);
46  long                 getSize(){return numPixels;};
47  short int            getNumDim(){return numDim;};
48  // Related to the various arrays
49  void                 getDimArray(long *output);
50  void                 getArray(float *output);
51  virtual void         saveArray(float *input, long size);
52  float                getPixValue(long pos){return array[pos];};
53  void                 setPixValue(long pos, float f){array[pos] = f;};
54  // Related to the object lists
55  Detection            getObject(long number){return objectList[number];};
56  void                 addObject(Detection object);   
57                  // adds a single detection to the object list
58  vector <Detection>   getObjectList(){return objectList;};
59  void                 addObjectList(vector <Detection> newlist); 
60                  // adds all objects in a detection list to the object list
61  void                 addObjectOffsets();
62  long                 getNumObj(){return objectList.size();};
63  void                 clearDetectionList(){this->objectList.clear();};
64  // Parameter list related.
65  int                  readParam(string paramfile){
66    return par.readParams(paramfile);};
67  void                 showParam(std::ostream &stream){stream << par;};
68  Param                getParam(){return par;};
69  void                 saveParam(Param newpar){par = newpar;};
70  Param&               pars(){Param &rpar = par; return rpar;};
71  bool                 isBlank(int vox){return par.isBlank(array[vox]);};
72
73  friend std::ostream& operator<< ( std::ostream& theStream, DataArray &array);
74
75
76protected:
77  short int            numDim;     // number of dimensions.
78  long                *axisDim;    // array of dimensions of cube
79                                   //     (ie. how large in each direction).
80  long                 numPixels;  // total number of pixels in cube
81  float               *array;      // array of data
82  vector <Detection>   objectList; // the list of detected objects in the image
83  Param                par;        // a parameter list.
84};
85
86
87/****************************************************************/
88/////////////////////////////////////////////////////////////
89//// Definition of an image object (2D):
90////     a DataArray object
91////     arrays for: probability values (for FDR)
92////                 mask image to indicate location of objects
93////                 detected objects
94////     statistics information
95/////////////////////////////////////////////////////////////
96
97class Cube;
98class Image : public DataArray
99{
100public:
101  Image(){
102    numPixels=0;
103    numDim=2;};
104  Image(long nPix);
105  Image(long *dimensions);
106  virtual ~Image();
107
108  // Defining the array
109  void      saveArray(float *input, long size);
110  void      extractSpectrum(float *Array, long *dim, long pixel);
111  void      extractImage(float *Array, long *dim, long channel);
112  void      extractSpectrum(Cube &cube, long pixel);
113  void      extractImage(Cube &cube, long channel);
114  // Accessing the data.
115  float     getPixValue(long x, long y){return array[y*axisDim[0] + x];};
116  float     getPixValue(long pos){return array[pos];};
117  float     getPValue(long pos){return pValue[pos];};
118  float     getPValue(long x, long y){return pValue[y*axisDim[0] + x];};
119  short int getMaskValue(long pos){return mask[pos];};
120  short int getMaskValue(long x, long y){return mask[y*axisDim[0] + x];};
121  // the next few should have checks against array overflow...
122  void      setPixValue(long x, long y, float f){array[y*axisDim[0] + x] = f;};
123  void      setPixValue(long pos, float f){array[pos] = f;};
124  void      setPValue(long pos, float p){pValue[pos] = p;};
125  void      setPValue(long x, long y, float p){pValue[y*axisDim[0] + x] = p;};
126  void      setMaskValue(long pos, short int m){mask[pos] = m;};
127  void      setMaskValue(long x, long y, short int m){mask[y*axisDim[0]+x]=m;};
128  bool      isBlank(int vox){return par.isBlank(array[vox]);};
129  bool      isBlank(long x,long y){return par.isBlank(array[y*axisDim[0]+x]);};
130  // Stats-related
131  void      setStats(float m, float s, float c){mean=m; sigma=s; cutLevel=c;};
132  void      findStats(int code);
133  float     getMean(){return mean;};
134  void      setMean(float m){mean=m;};
135  float     getSigma(){return sigma;};
136  void      setSigma(float s){sigma=s;};
137  float     getCut(){return cutLevel;};
138  void      setCut(float c){cutLevel=c;};
139  float     getPCut(){return pCutLevel;};
140  void      setPCut(float p){pCutLevel = p;};
141  float     getAlpha(){return alpha;};
142  void      setAlpha(float a){alpha = a;};
143  int       getMinSize(){return minSize;};
144  void      setMinSize(int s){minSize = s;};
145
146  void      maskObject(Detection &object);
147
148  // Detection-related
149  void      lutz_detect();            // in Detection/lutz_detect.cc
150  void      spectrumDetect();         // in Detection/spectrumDetect.cc
151  // the rest are in Detection/thresholding_functions.cc
152  int       setupFDR();
153  bool      isDetection(float value);
154  bool      isDetection(long x, long y);
155  bool      isDetectionFDR(float pvalue);
156
157  void      removeMW();
158 
159private:
160  float     *pValue;     // the array of p-values for each pixel
161                         //                  --> used by FDR method
162  short int *mask;       // a mask image indicating where objects are
163                         
164  float      mean;       // the mean background level of the image
165  float      sigma;      // the standard deviation of the image's background
166  float      cutLevel;   // the limiting value (in sigmas above the mean) for
167                         //     a pixel to be called a detection.
168  float      alpha;      // used by FDR routine -- significance level
169  float      pCutLevel;  // the limiting P-value for the FDR analysis
170  int        minSize;    // the minimum number of pixels for a detection
171                         //  to be accepted.
172};
173
174/****************************************************************/
175/////////////////////////////////////////////////////////////
176//// Definition of an data-cube object (3D):
177////     a DataArray object limited to dim=3
178/////////////////////////////////////////////////////////////
179
180class Cube : public DataArray
181{
182public:
183  Cube(){numPixels=0; numDim=3; reconExists = false;};
184  Cube(long nPix);
185  Cube(long *dimensions);
186  virtual ~Cube();
187
188  // additional accessor functions
189  //       -- in Cubes/cubes.cc unless otherwise specified.
190
191  int     getCube(string fname);
192  int     getCube(){ 
193    // a front-end to the getCube function, that does subsection checks
194    // assumes the Param is setup properly
195    string fname = par.getImageFile();
196    if(par.getFlagSubsection()) fname+=par.getSubsection();
197    return getCube(fname);
198  };
199  int     getFITSdata(string fname);         // in FitsIO/dataIO.cc
200  void    initialiseCube(long *dimensions);  // in cubes.cc
201  int     getopts(int argc, char ** argv);   // in cubes.cc
202  void    saveReconstructedCube();
203  int     readReconCube();
204
205  bool    isBlank(int vox){return par.isBlank(array[vox]);};
206  bool    isBlank(long x, long y, long z){
207    return par.isBlank(array[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x]);};
208  float   getPixValue(long pos){return array[pos];};
209  float   getPixValue(long x, long y, long z){
210    return array[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x];};
211  short   getDetectMapValue(long pos){return detectMap[pos];};
212  short   getDetectMapValue(long x, long y){return detectMap[y*axisDim[0]+x];};
213  bool    isRecon(){return reconExists;};
214  float   getReconValue(long pos){return recon[pos];};
215  float   getReconValue(long x, long y, long z){
216    return recon[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x];};
217  float   getBaselineValue(long pos){return baseline[pos];};
218  float   getBaselineValue(long x, long y, long z){
219    return baseline[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x];};
220  // these should have checks against array overflow...
221  void    setPixValue(long pos, float f){array[pos] = f;};
222  void    setPixValue(long x, long y, long z, float f){
223    array[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x] = f;};
224  void    setDetectMapValue(long pos, short f){detectMap[pos] = f;};
225  void    setDetectMapValue(long x, long y, short f){
226    detectMap[y*axisDim[0] + x] = f;};
227  void    setReconValue(long pos, float f){recon[pos] = f;};
228  void    setReconValue(long x, long y, long z, float f){
229    recon[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x] = f;};
230  void    setReconFlag(bool f){reconExists = f;};
231  void    saveArray(float *input, long size);
232  void    saveRecon(float *input, long size);
233  void    getRecon(float *output);
234
235  vector<Col>  getLogCols(){return logCols;};
236  void         setLogCols(vector<Col> C){logCols=C;};
237  vector<Col>  getFullCols(){return fullCols;};
238  void         setFullCols(vector<Col> C){fullCols=C;};
239
240
241  // Statistics for cube
242  float   getSpecMean(int pixel){return specMean[pixel];};
243  float   getSpecSigma(int pixel){return specSigma[pixel];};
244  float   getChanMean(int channel){return chanMean[channel];};
245  float   getChanSigma(int channel){return chanSigma[channel];};
246  void    setCubeStats();    // in Cubes/cubes.cc
247
248  // Functions that act on the cube
249  void    removeMW();        // in Cubes/cubes.cc
250  void    trimCube();        // in Cubes/trimImage.cc
251  void    unTrimCube();      // in Cubes/trimImage.cc
252  void    removeBaseline();  // in ATrous/baselineSubtract.cc
253  void    replaceBaseline(); // in ATrous/baselineSubtract.cc
254  void    invert();          // in Cubes/invertCube.cc
255  void    reInvert();        // in Cubes/invertCube.cc
256
257  // Reconstruction and Searching functions
258  void    ReconSearch();     // in ATrous/ReconSearch.cc
259  void    ReconSearch1D();   // in ATrous/ReconSearch.cc
260  void    ReconSearch2D();   // in ATrous/ReconSearch.cc
261  void    ReconSearch3D();   // in ATrous/ReconSearch.cc
262  void    CubicSearch();     // in Cubes/CubicSearch.cc
263
264  // Dealing with the WCS
265  FitsHeader getHead(){return head;};
266  void       setHead(FitsHeader F){head=F;};
267  FitsHeader& header(){FitsHeader &h = head; return h;};
268  int        wcsToPix(const double *world, double *pix){
269    return this->head.wcsToPix(world,pix);}
270  int        wcsToPix(const double *world, double *pix, const int npts){
271    return this->head.wcsToPix(world,pix,npts);}
272  int        pixToWCS(const double *pix, double *world){
273    return this->head.pixToWCS(pix,world);}
274  int        pixToWCS(const double *pix, double *world, const int npts){
275    return this->head.pixToWCS(pix,world,npts);}
276 
277  // Dealing with the detections
278  void    ObjectMerger();          // in Cubes/Merger.cc
279  void    calcObjectWCSparams();
280  void    sortDetections();
281  void    updateDetectMap();
282  void    updateDetectMap(Detection obj);
283  void    setObjectFlags();
284  float   enclosedFlux(Detection obj);
285  bool    objAtEdge(Detection obj);
286 
287  // Text outputting of detected objects.
288  //    the next five in Cubes/detectionIO.cc
289  void    outputDetectionsKarma(std::ostream &stream);     
290  void    outputDetectionsVOTable(std::ostream &stream);   
291  void    outputDetectionList();                           
292  void    logDetectionList();                             
293  void    logDetection(Detection obj, int counter);       
294  void    setupColumns(); // in Cubes/cubes.cc
295
296  // Graphical plotting of the cube and the detections.
297  void    plotBlankEdges();  // in Cubes/cubes.cc
298  //    the next three in Cubes/plotting.cc
299  void    plotDetectionMap(string pgDestination);         
300  void    plotMomentMap(string pgDestination);             
301  void    plotWCSaxes();                                   
302  //    the next two in Cubes/outputSpectra.cc
303  void    outputSpectra();
304  void    plotSpectrum(Detection obj,Plot::SpectralPlot &plot);
305  //    the next three in Cubes/drawMomentCutout.cc
306  void    drawMomentCutout(Detection &object);
307  void    drawScale(float xstart,float ystart,float channel);
308  void    drawFieldEdge();
309
310private:
311  float  *recon;           // reconstructed array -- used when doing a trous
312                           //   reconstruction.
313  bool    reconExists;     // flag saying whether there is a reconstruction
314  short  *detectMap;       // "moment map" -- x,y locations of detected pixels
315  float  *baseline;        // array of spectral baseline values.
316                       
317  float  *specMean;        // array of means  for each spectrum in cube
318  float  *specSigma;       // array of sigmas for each spectrum in cube
319  float  *chanMean;        // array of means  for each channel map in cube
320  float  *chanSigma;       // array of sigmas for each channel map in cube
321       
322  FitsHeader head;         // the WCS and other header information.
323  vector<Col> fullCols;    // the list of all columns as printed in the
324                           //  results file
325  vector<Col> logCols;     // the list of columns as printed in the log file
326
327};
328
329/****************************************************************/
330//////////////////////////////////////////////////////
331// Prototypes for functions that use above classes
332//////////////////////////////////////////////////////
333
334DataArray getImage(string fname, short int maxdim);
335Image getImage(string fname);
336
337void findSources(Image &image);
338void findSources(Image &image, float mean, float sigma);
339
340vector <Detection> searchReconArray(long *dim,float *originalArray,
341                                    float *reconArray, Param &par);
342vector <Detection> search3DArray(long *dim, float *Array, Param &par);
343
344void growObject(Detection &object, Image &image);
345void growObject(Detection &object, Cube &cube);
346
347#endif
Note: See TracBrowser for help on using the repository browser.