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

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

Changed the way the FITS file is read in, so that it can deal with
naxis>4 files, where the order of the dimensions is not necessarily
lng,lat,spec,...

Summary of changes:

*Cubes/getImage.cc:

*Removed most of the code that goes in new functions.
*Changed order of tasks, so that the WCS is derived first, then the data array, and then the remaining header information.
*Also reports both the FITS dimensions and the data array dimensions.

*FitsIO/headerIO.cc:

*Moved defineWCS to wcsIO.cc.
*Made array declarations more robust (use CFITSIO constants for lengths).
*Changed type of BLANK keyword to TINT.

*FitsIO/dataIO.cc:

*New function, designed to read in data from FITS file.
*Reads in subset of just the spatial and spectral axes.
*Also takes care of setting blank pixels to appropriate value.

*FitsIO/wcsIO.cc:

*New file, contains the function FitsHeader::defineWCS

  • Utils/wcsFunctions.cc:

*Generalised the wcs functions, so that they make no

assumptions about the location of the spatial and spectral axes.

*Cubes/cubes.cc:

*Improved Cube::initialiseCube so that it gets the dimensions correct.
*Enabled Cube::getopts to deal with non-existant param file.
*Improved error reporting in saveArray functions.

*Cubes/cubes.hh:

*Changed prototypes for readParam. Added one for getFITSdata

*Cubes/ReadAndSearch?.cc :

*Minor comment added.

*param.cc:

*Generalised way fixUnits works, to cope with new axis concept.
*Made readParams return int, so it can indicate whether reading failed.

*ATrous/ReconSearch.cc:

*Improved way the goodness of the pixels and channels was determined.

*src/param.hh

*New prototype for Param::readParams

*Guide:

*Changed text about dimensionality of FITS files.
*Changed location of images.
*Minor changes to improve readability.

File size: 14.5 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; // flagWCS=false;
184  };
185  Cube(long nPix);
186  Cube(long *dimensions);
187  virtual ~Cube();            // destructor
188
189  // additional accessor functions
190  //       -- in Cubes/cubes.cc unless otherwise specified.
191
192  int     getCube(string fname);
193  int     getCube(){ 
194    // a front-end to the getCube function, that does subsection checks
195    // assumes the Param is setup properly
196    string fname = par.getImageFile();
197    if(par.getFlagSubsection()){
198      par.parseSubsection();
199      fname+=par.getSubsection();
200    }
201    return getCube(fname);
202  };
203  int     getFITSdata(string fname);         // in FitsIO/dataIO.cc
204  void    initialiseCube(long *dimensions);  // in cubes.cc
205  int     getopts(int argc, char ** argv);   // in cubes.cc
206  void    saveReconstructedCube();
207  int     readReconCube();
208
209  bool    isBlank(int vox){return par.isBlank(array[vox]);};
210  bool    isBlank(long x, long y, long z){
211    return par.isBlank(array[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x]);};
212  float   getPixValue(long pos){return array[pos];};
213  float   getPixValue(long x, long y, long z){
214    return array[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x];};
215  short   getDetectMapValue(long pos){return detectMap[pos];};
216  short   getDetectMapValue(long x, long y){return detectMap[y*axisDim[0]+x];};
217  bool    isRecon(){return reconExists;};
218  float   getReconValue(long pos){return recon[pos];};
219  float   getReconValue(long x, long y, long z){
220    return recon[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x];};
221  float   getBaselineValue(long pos){return baseline[pos];};
222  float   getBaselineValue(long x, long y, long z){
223    return baseline[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x];};
224  // these should have checks against array overflow...
225  void    setPixValue(long pos, float f){array[pos] = f;};
226  void    setPixValue(long x, long y, long z, float f){
227    array[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x] = f;};
228  void    setDetectMapValue(long pos, short f){detectMap[pos] = f;};
229  void    setDetectMapValue(long x, long y, short f){
230    detectMap[y*axisDim[0] + x] = f;};
231  void    setReconValue(long pos, float f){recon[pos] = f;};
232  void    setReconValue(long x, long y, long z, float f){
233    recon[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x] = f;};
234  void    setReconFlag(bool f){reconExists = f;};
235  void    saveArray(float *input, long size);
236  void    saveRecon(float *input, long size);
237  void    getRecon(float *output);
238
239  vector<Col>  getLogCols(){return logCols;};
240  void         setLogCols(vector<Col> C){logCols=C;};
241  vector<Col>  getFullCols(){return fullCols;};
242  void         setFullCols(vector<Col> C){fullCols=C;};
243
244
245  // Statistics for cube
246  float   getSpecMean(int pixel){return specMean[pixel];};
247  float   getSpecSigma(int pixel){return specSigma[pixel];};
248  float   getChanMean(int channel){return chanMean[channel];};
249  float   getChanSigma(int channel){return chanSigma[channel];};
250  void    setCubeStats();    // in Cubes/cubes.cc
251
252  // Functions that act on the cube
253  void    removeMW();        // in Cubes/cubes.cc
254  void    trimCube();        // in Cubes/trimImage.cc
255  void    unTrimCube();      // in Cubes/trimImage.cc
256  void    removeBaseline();  // in ATrous/baselineSubtract.cc
257  void    replaceBaseline(); // in ATrous/baselineSubtract.cc
258  void    invert();          // in Cubes/invertCube.cc
259  void    reInvert();        // in Cubes/invertCube.cc
260
261  // Reconstruction and Searching functions
262  void    ReconSearch();     // in ATrous/ReconSearch.cc
263  void    ReconSearch1D();   // in ATrous/ReconSearch.cc
264  void    ReconSearch2D();   // in ATrous/ReconSearch.cc
265  void    ReconSearch3D();   // in ATrous/ReconSearch.cc
266  void    CubicSearch();     // in Cubes/CubicSearch.cc
267
268  // Dealing with the WCS
269  FitsHeader getHead(){return head;};
270  void       setHead(FitsHeader F){head=F;};
271  FitsHeader& header(){FitsHeader &h = head; return h;};
272  int        wcsToPix(const double *world, double *pix){
273    return this->head.wcsToPix(world,pix);}
274  int        wcsToPix(const double *world, double *pix, const int npts){
275    return this->head.wcsToPix(world,pix,npts);}
276  int        pixToWCS(const double *pix, double *world){
277    return this->head.pixToWCS(pix,world);}
278  int        pixToWCS(const double *pix, double *world, const int npts){
279    return this->head.pixToWCS(pix,world,npts);}
280 
281  // Dealing with the detections
282  void    ObjectMerger();          // in Cubes/Merger.cc
283  void    calcObjectWCSparams();
284  void    sortDetections();
285  void    updateDetectMap();
286  void    updateDetectMap(Detection obj);
287  void    setObjectFlags();
288  float   enclosedFlux(Detection obj);
289  bool    objAtEdge(Detection obj);
290 
291  // Text outputting of detected objects.
292  //    the next five in Cubes/detectionIO.cc
293  void    outputDetectionsKarma(std::ostream &stream);     
294  void    outputDetectionsVOTable(std::ostream &stream);   
295  void    outputDetectionList();                           
296  void    logDetectionList();                             
297  void    logDetection(Detection obj, int counter);       
298  void    setupColumns(); // in Cubes/cubes.cc
299
300  // Graphical plotting of the cube and the detections.
301  void    plotBlankEdges();  // in Cubes/cubes.cc
302  //    the next three in Cubes/plotting.cc
303  void    plotDetectionMap(string pgDestination);         
304  void    plotMomentMap(string pgDestination);             
305  void    plotWCSaxes();                                   
306  //    the next two in Cubes/outputSpectra.cc
307  void    outputSpectra();
308  void    plotSpectrum(Detection obj,Plot::SpectralPlot &plot);
309  //    the next three in Cubes/drawMomentCutout.cc
310  void    drawMomentCutout(Detection &object);
311  void    drawScale(float xstart,float ystart,float channel);
312  void    drawFieldEdge();
313
314private:
315  float  *recon;           // reconstructed array -- used when doing a trous
316                           //   reconstruction.
317  bool    reconExists;     // flag saying whether there is a reconstruction
318  short  *detectMap;       // "moment map" -- x,y locations of detected pixels
319  float  *baseline;        // array of spectral baseline values.
320                       
321  float  *specMean;        // array of means  for each spectrum in cube
322  float  *specSigma;       // array of sigmas for each spectrum in cube
323  float  *chanMean;        // array of means  for each channel map in cube
324  float  *chanSigma;       // array of sigmas for each channel map in cube
325       
326  FitsHeader head;         // the WCS and other header information.
327  vector<Col> fullCols;    // the list of all columns as printed in the
328                           //  results file
329  vector<Col> logCols;     // the list of columns as printed in the log file
330
331};
332
333/****************************************************************/
334//////////////////////////////////////////////////////
335// Prototypes for functions that use above classes
336//////////////////////////////////////////////////////
337
338DataArray getImage(string fname, short int maxdim);
339Image getImage(string fname);
340
341void findSources(Image &image);
342void findSources(Image &image, float mean, float sigma);
343
344vector <Detection> searchReconArray(long *dim,float *originalArray,
345                                    float *reconArray, Param &par);
346vector <Detection> search3DArray(long *dim, float *Array, Param &par);
347
348void growObject(Detection &object, Image &image);
349void growObject(Detection &object, Cube &cube);
350
351#endif
Note: See TracBrowser for help on using the repository browser.