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

Last change on this file since 971 was 971, checked in by MatthewWhiting, 12 years ago

A bunch of changes aimed at streamlining the FITS file access at the start, particularly for the case of large images where we access a subsection (this can be slow to access). We now only open the file once, and keep the fitsfile pointer in the FitsHeader? class. Once the image access is finished the file is closed.

File size: 28.1 KB
RevLine 
[299]1// -----------------------------------------------------------------------
2// cubes.hh: Definitions of the DataArray, Cube and Image classes.
3// -----------------------------------------------------------------------
4// Copyright (C) 2006, Matthew Whiting, ATNF
5//
6// This program is free software; you can redistribute it and/or modify it
7// under the terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2 of the License, or (at your
9// option) any later version.
10//
11// Duchamp is distributed in the hope that it will be useful, but WITHOUT
12// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14// for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with Duchamp; if not, write to the Free Software Foundation,
18// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
19//
20// Correspondence concerning Duchamp may be directed to:
21//    Internet email: Matthew.Whiting [at] atnf.csiro.au
22//    Postal address: Dr. Matthew Whiting
23//                    Australia Telescope National Facility, CSIRO
24//                    PO Box 76
25//                    Epping NSW 1710
26//                    AUSTRALIA
27// -----------------------------------------------------------------------
[3]28#ifndef CUBES_H
29#define CUBES_H
30
31#include <iostream>
32#include <string>
33#include <vector>
34
[459]35#include <duchamp/duchamp.hh>
[393]36#include <duchamp/param.hh>
37#include <duchamp/fitsHeader.hh>
38#include <duchamp/Detection/detection.hh>
39#include <duchamp/Detection/columns.hh>
40#include <duchamp/Cubes/plots.hh>
41#include <duchamp/Utils/Statistics.hh>
42#include <duchamp/PixelMap/Scan.hh>
43#include <duchamp/PixelMap/Object2D.hh>
[3]44
45
[378]46namespace duchamp
47{
[290]48
49
[528]50  /// @brief Search a reconstructed array for significant detections.
[884]51  std::vector <Detection> searchReconArray(size_t *dim, float *originalArray, float *reconArray,
[686]52                                           Param &par, Statistics::StatsContainer<float> &stats);
[884]53  std::vector <Detection> searchReconArraySpectral(size_t *dim, float *originalArray, float *reconArray,
[686]54                                                   Param &par, Statistics::StatsContainer<float> &stats);
[884]55  std::vector <Detection> searchReconArraySpatial(size_t *dim, float *originalArray, float *reconArray,
[686]56                                                  Param &par, Statistics::StatsContainer<float> &stats);
[3]57
[528]58  /// @brief Search a 3-dimensional array for significant detections.
[884]59  std::vector <Detection> search3DArray(size_t *dim, float *Array, Param &par,
[686]60                                        Statistics::StatsContainer<float> &stats);
[884]61  std::vector <Detection> search3DArraySpectral(size_t *dim, float *Array, Param &par,
[686]62                                                Statistics::StatsContainer<float> &stats);
[884]63  std::vector <Detection> search3DArraySpatial(size_t *dim, float *Array, Param &par,
[686]64                                               Statistics::StatsContainer<float> &stats);
[220]65
[528]66  //=========================================================================
[220]67
[899]68  /// An enumeration allowing us to refer to a particular array within functions
69  enum ARRAYREF {ARRAY=0, RECON, BASELINE};
70
71
[528]72  /// @brief Base class for the image container.
73  ///
74  /// @details Definition of an n-dimensional data array: array of
75  ///     pixel values, size & dimensions array of Detection objects
76
[378]77  class DataArray
78  {
79  public:
80    DataArray();  ///< Basic DataArray constructor
81    DataArray(short int nDim); ///< Basic nDim-dimensional DataArray constructor
[884]82    DataArray(short int nDim, size_t size);///< Basic nDim-dimensional DataArray constructor, specifying size.
83    DataArray(short int nDim, size_t *dimensions); ///< Basic nDim-dimensional DataArray constructor, specifying size of dimensions.
[378]84    virtual ~DataArray(); ///< Basic DataArray constructor
[736]85    DataArray(const DataArray &d);
86    DataArray& operator=(const DataArray &d);
[222]87
[378]88    //-----------------------------------------
89    // Obvious inline accessor functions.
90    //
[884]91    size_t             getDimX(){if(numDim>0) return axisDim[0];else return 0;};
92    size_t             getDimY(){if(numDim>1) return axisDim[1];else return 1;};
93    size_t             getDimZ(){if(numDim>2) return axisDim[2];else return 1;};
94    size_t             getSize(){ return numPixels; };
[378]95    short int          getNumDim(){ return numDim; };
[884]96    virtual float      getPixValue(size_t pos){ return array[pos]; };
97    virtual void       setPixValue(size_t pos, float f){array[pos] = f;};
98    Detection          getObject(size_t number){ return objectList->at(number); };
99    Detection *        pObject(size_t number){ return &(objectList->at(number));};
[378]100    std::vector <Detection> getObjectList(){ return *objectList; };
[387]101    std::vector <Detection> *pObjectList(){ return objectList; };
102    std::vector <Detection> &ObjectList(){ std::vector<Detection> &rlist = *objectList; return rlist; };
[884]103    size_t              getNumObj(){ return objectList->size(); };
[222]104
[528]105    /// @brief Delete all objects from the list of detections.
[378]106    void               clearDetectionList(){
107      //objectList->clear();
108      delete objectList;
109      objectList = new std::vector<Detection>;
110    };
[220]111
[528]112    /// @brief Read a parameter set from file.
[700]113    OUTCOME readParam(std::string paramfile){
[528]114      /// @brief
[531]115      ///  Uses Param::readParams() to read parameters from a file.
116      ///  \param paramfile The file to be read.
[528]117       
[378]118      return par.readParams(paramfile);
119    };
[222]120
[378]121    //-----------------------------------------
122    // Related to the various arrays
123    //
[528]124    /// @brief  Return first three dimensional axes.
[884]125    void               getDim(size_t &x, size_t &y, size_t &z);
[528]126    /// @brief Return array of dimensional sizes.
[884]127    void               getDimArray(size_t *output);
128    size_t *           getDimArray(){return axisDim;};
[222]129
[528]130    /// @brief Return pixel value array.
[378]131    void               getArray(float *output);
132    float *            getArray(){return array;};
[220]133
[528]134    /// @brief Save pixel value array.
[884]135    virtual void       saveArray(float *input, size_t size);
[258]136
[378]137    //-----------------------------------------
138    // Related to the object lists
139    //
[528]140    /// @brief Adds a single detection to the object list.
[378]141    void               addObject(Detection object);
[222]142
[528]143    /// @brief Adds all objects in a detection list to the object list.
[378]144    void               addObjectList(std::vector <Detection> newlist);   
[220]145
[528]146    /// @brief Add pixel offsets to object coordinates.
[378]147    void               addObjectOffsets();
[3]148
[378]149    //-----------------------------------------
150    // Parameter list related.
151    //
[528]152    /// @brief Output the Param set.
[378]153    void               showParam(std::ostream &stream){ stream << par; };
[528]154    /// @brief Return the Param set.
[378]155    Param              getParam(){ return par; };
[528]156    /// @brief Save a Param set to the Cube.
[378]157    void               saveParam(Param &newpar){par = newpar;};
[528]158    /// @brief Provides a reference to the Param set.
[378]159    Param&             pars(){ Param &rpar = par; return rpar; };
[528]160    /// @brief Is the voxel number given by vox a BLANK value?
[741]161    bool               isBlank(int vox){return par.isBlank(array[vox]);};
[378]162
163    // --------------------------------------------
164    // Statistics
165    //
[528]166    /// @brief  Returns the StatsContainer.
[378]167    Statistics::StatsContainer<float> getStats(){ return Stats; };
168
[528]169    /// @brief Provides a reference to the StatsContainer.
[378]170    Statistics::StatsContainer<float>& stats(){
171      Statistics::StatsContainer<float> &rstats = Stats;  return rstats;
172    };
[258]173 
[528]174    /// @brief Save a StatsContainer to the Cube.
[378]175    void saveStats(Statistics::StatsContainer<float> newStats){ Stats = newStats;};
[190]176
[528]177    /// @brief A detection test for value.
[378]178    bool isDetection(float value);
[222]179
[528]180    /// @brief  A detection test for pixel. 
[884]181    bool isDetection(size_t voxel);
[222]182
183
[528]184    /// @brief Output operator for DataArray.
[378]185    friend std::ostream& operator<< (std::ostream& theStream, DataArray &array);
[222]186 
[3]187
[378]188  protected:
189    short int                numDim;     ///< Number of dimensions.
[884]190    size_t                  *axisDim;    ///< Array of axis dimensions of cube
[443]191    bool                     axisDimAllocated; ///< has axisDim been allocated?
[884]192    size_t                   numPixels;  ///< Total number of pixels in cube.
[378]193    float                   *array;      ///< Array of data.
[444]194    bool                     arrayAllocated; ///< has the array been allocated?
[378]195    std::vector <Detection> *objectList; ///< The list of detected objects.
196    Param                    par;        ///< A parameter list.
197    Statistics::StatsContainer<float> Stats; ///< The statistics for the DataArray.
198  };
[3]199
[220]200
201
[378]202  //=========================================================================
[220]203
[528]204  /// @brief Definition of an data-cube object (3D):
205  ///     a DataArray object limited to dim=3
[3]206
[378]207  class Cube : public DataArray
208  {
209  public:
210    Cube();                 ///< Basic Cube constructor.
[884]211    Cube(size_t nPix);        ///< Alternative Cube constructor.
212    Cube(size_t *dimensions); ///< Alternative Cube constructor.
[378]213    virtual ~Cube();        ///< Basic Cube destructor.
[736]214    Cube(const Cube &c);    ///< Copy constructor
215    Cube& operator=(const Cube &c); ///< Copy operator
[3]216
[877]217    /// @brief Return a Cube holding only a subsection of the original
[878]218    Cube* slice(Section subsection);
[877]219   
220
221
[513]222    bool        is2D();
223    void        checkDim(){head.set2D(is2D());};
[758]224    void        reportMemorySize(std::ostream &theStream, bool allocateArrays);
[513]225
[378]226    // INLINE functions -- definitions included after class declaration.
[528]227    /// @brief Is the voxel number given by vox a BLANK value?
[884]228    bool        isBlank(size_t vox){ return par.isBlank(array[vox]); };
[3]229
[528]230    /// @brief Is the voxel at (x,y,z) a BLANK value?
[884]231    bool        isBlank(size_t x, size_t y, size_t z){
[378]232      return par.isBlank(array[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x]); };
[222]233
[528]234    /// @brief Return a bool array masking blank pixels: 1=good, 0=blank
[463]235    bool *      makeBlankMask(){return par.makeBlankMask(array, numPixels);};
236
[528]237    /// @brief Does the Cube::recon array exist?
[378]238    bool        isRecon(){ return reconExists; };
[222]239
[884]240    float       getPixValue(size_t pos){ return array[pos]; };
241    float       getPixValue(size_t x, size_t y, size_t z){
[378]242      return array[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x]; };
[884]243    short       getDetectMapValue(size_t pos){ return detectMap[pos]; };
244    short       getDetectMapValue(size_t x, size_t y){ return detectMap[y*axisDim[0]+x]; };
245    float       getReconValue(size_t pos){ return recon[pos]; };
246    float       getReconValue(size_t x, size_t y, size_t z){
[378]247      return recon[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x];};
[884]248    float       getBaselineValue(size_t pos){ return baseline[pos]; };
249    float       getBaselineValue(size_t x, size_t y, size_t z){
[378]250      return baseline[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x]; };
[884]251    void        setPixValue(size_t pos, float f){array[pos] = f;};
252    void        setPixValue(size_t x, size_t y, size_t z, float f){
[378]253      array[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x] = f;};
[884]254    void        setDetectMapValue(size_t pos, short f){ detectMap[pos] = f;};
255    void        setDetectMapValue(size_t x, size_t y, short f){ detectMap[y*axisDim[0] + x] = f;};
256    void        incrementDetectMap(size_t x, size_t y){detectMap[y*axisDim[0]+x]++;};
257    void        incrementDetectMap(size_t pos){detectMap[pos]++;};
258    void        setReconValue(size_t pos, float f){recon[pos] = f;};
259    void        setReconValue(size_t x, size_t y, size_t z, float f){
[378]260      recon[z*axisDim[0]*axisDim[1] + y*axisDim[0] + x] = f; };
261    void        setReconFlag(bool f){reconExists = f;};
[222]262
[378]263    std::vector<Column::Col> getLogCols(){return logCols;};
264    void        setLogCols(std::vector<Column::Col> C){logCols=C;};
265    std::vector<Column::Col> getFullCols(){return fullCols;};
266    void        setFullCols(std::vector<Column::Col> C){fullCols=C;};
[222]267
[378]268    // additional functions -- in Cubes/cubes.cc
[528]269    /// @brief Allocate memory correctly, with WCS defining the correct axes.
[884]270    OUTCOME     initialiseCube(size_t *dimensions, bool allocateArrays=true);
[679]271    OUTCOME     initialiseCube(long *dimensions, bool allocateArrays=true);
[222]272
[528]273    /// @brief Read in a FITS file, with subsection correction.
[698]274    OUTCOME     getCube();
[528]275    /// @brief Read in a FITS file, with subsection correction.
[698]276    OUTCOME     getMetadata();
[222]277
[528]278    /// @brief Read in command-line options.
[378]279    //   int         getopts(int argc, char ** argv);
[474]280    int         getopts(int argc, char ** argv, std::string progname="Duchamp"){return par.getopts(argc,argv,progname);};
[222]281
[528]282    /// @brief Read in reconstructed & smoothed arrays from FITS files on disk.
[378]283    void        readSavedArrays();
[222]284
[528]285    /// @brief Save an external array to the Cube's pixel array
[884]286    void        saveArray(float *input, size_t size);
[222]287
[528]288    /// @brief Save an external array to the Cube's pixel array
[491]289    void        saveArray(std::vector<float> &input);
290
[528]291    /// @brief Save an external array to the Cube's reconstructed array.
[884]292    void        saveRecon(float *input, size_t size);
[222]293
[528]294    /// @brief Save reconstructed array to an external array.
[378]295    void        getRecon(float *output);
[387]296    float *     getRecon(){return recon; };
[222]297
[528]298    /// @brief Set Milky Way channels to zero.
[378]299    void        removeMW();
[222]300
[378]301    //------------------------
302    // Statistics for cube
303    //
[222]304
[528]305    /// @brief Calculate the statistics for the Cube (older version).
[378]306    void        setCubeStatsOld();
[222]307
[528]308    /// @brief Calculate the statistics for the Cube.
[378]309    void        setCubeStats();
[222]310
[528]311    /// @brief Set up thresholds for the False Discovery Rate routine.
[378]312    void        setupFDR();
[531]313    /// @brief Set up thresholds for the False Discovery Rate routine using a particular array.
[378]314    void        setupFDR(float *input);
[222]315
[528]316    /// @brief A detection test for a given voxel.
[884]317    bool        isDetection(size_t x, size_t y, size_t z);
[222]318
[378]319    //-----------------------------
320    // Dealing with the detections
321    //
[659]322   
323    /// @brief Get the set of voxels pertaining to the detected objects.
324    std::vector< std::vector<PixelInfo::Voxel> > getObjVoxList();
[222]325
[528]326    /// @brief Calculate the object fluxes
[420]327    void        calcObjectFluxes();
328
[528]329    /// @brief Calculate the WCS parameters for each Cube Detection.
[378]330    void        calcObjectWCSparams();
[528]331    /// @brief Calculate the WCS parameters for each Cube Detection, using flux information in Voxels.
[418]332    void        calcObjectWCSparams(std::vector< std::vector<PixelInfo::Voxel> > bigVoxList);
[863]333    void        calcObjectWCSparams(std::map<PixelInfo::Voxel,float> &voxelMap);
334 
[528]335    /// @brief Sort the list of detections.
[378]336    void        sortDetections();
[222]337
[528]338    /// @brief Update the map of detected pixels.
[378]339    void        updateDetectMap();
[222]340
[528]341    /// @brief Update the map of detected pixels for a given Detection.
[378]342    void        updateDetectMap(Detection obj);
[222]343
[528]344    /// @brief Clear the map of detected pixels.
[378]345    void        clearDetectMap(){
[884]346      for(size_t i=0;i<axisDim[0]*axisDim[1];i++) detectMap[i]=0;
[378]347    };
[290]348
[528]349    /// @brief Find the flux enclosed by a Detection.
[378]350    float       enclosedFlux(Detection obj);
[222]351
[531]352    /// @brief Set up the output column definitions for the Cube and its Detection list.
[378]353    void        setupColumns();
[222]354
[528]355    /// @brief Is the object at the edge of the image?
[378]356    bool        objAtSpatialEdge(Detection obj);
[222]357
[528]358    /// @brief Is the object at an end of the spectrum?
[378]359    bool        objAtSpectralEdge(Detection obj);
[222]360
[960]361    /// @brief Is the object next to the MW range?
362    bool        objNextToMW(Detection obj);
363
[528]364    /// @brief Set warning flags for the detections.
[378]365    void        setObjectFlags();
[222]366
[378]367    // ----------------------------
368    // Dealing with the WCS
369    //
[528]370    /// @brief Return the FitsHeader object.
[378]371    FitsHeader  getHead(){ return head; };
[528]372    /// @brief Define the FitsHeader object.
[378]373    void        setHead(FitsHeader F){head = F;};
[528]374    /// @brief Provide a reference to the FitsHeader object.
[378]375    FitsHeader& header(){ FitsHeader &h = head; return h; };
[3]376
[378]377    //-------------------------------------------
378    // FITS-I/O related functions -- not in cubes.cc
379    //
[528]380    /// @brief Function to read in FITS file.
[698]381    OUTCOME     getMetadata(std::string fname);  // in Cubes/getImage.cc
382    OUTCOME     getCube(std::string fname);  // in Cubes/getImage.cc
[3]383
[528]384    /// @brief Convert the flux units to something user-specified.
[899]385    void        convertFluxUnits(std::string oldUnit, std::string newUnit, ARRAYREF whichArray=ARRAY); // in Cubes/getImage.cc
[434]386
[528]387    /// @brief Function to retrieve FITS data array
[698]388    OUTCOME         getFITSdata(std::string fname);   // in FitsIO/dataIO.cc
[971]389    OUTCOME         getFITSdata();   // in FitsIO/dataIO.cc
390    OUTCOME         getFITSdata(fitsfile *fptr);   // in FitsIO/dataIO.cc
[222]391
[902]392    OUTCOME         writeBasicHeader(fitsfile *fptr, int bitpix, bool is2D=false);
[900]393
[670]394    /// @brief Save the moment map to a FITS file
[695]395    OUTCOME        saveMomentMapImage();
[670]396
[528]397    /// @brief Save a mask array to disk.
[695]398    OUTCOME        saveMaskCube();       // in Cubes/saveImage.cc
[379]399
[528]400    /// @brief Save Smoothed array to disk.
[695]401    OUTCOME        saveSmoothedCube();       // in Cubes/saveImage.cc
[258]402
[528]403    /// @brief Save Reconstructed array to disk.
[695]404    OUTCOME        saveReconstructedCube();  // in Cubes/saveImage.cc
[222]405
[528]406    /// @brief Read in reconstructed array from FITS file.
[698]407    OUTCOME        readReconCube();  // in Cubes/readRecon.cc
[222]408 
[528]409    /// @brief Read in Hanning-smoothed array from FITS file.
[698]410    OUTCOME        readSmoothCube();     // in Cubes/readSmooth.cc 
[222]411
[378]412    //-------------------------------------
413    // Functions that act on the cube
414    //
[3]415
[528]416    /// @brief Remove excess BLANK pixels from spatial edge of cube.
[378]417    void        trimCube();         // in Cubes/trimImage.cc
[222]418
[528]419    /// @brief Replace BLANK pixels to spatial edge of cube.
[378]420    void        unTrimCube();       // in Cubes/trimImage.cc
[222]421
[528]422    /// @brief Removes the baselines from the spectra, and stores in Cube::baseline
[378]423    void        removeBaseline();   // in Cubes/baseline.cc
[222]424
[528]425    /// @brief Replace the baselines stored in Cube::baseline
[378]426    void        replaceBaseline();  // in Cubes/baseline.cc
[222]427
[528]428    /// @brief Multiply all pixel values by -1.
[378]429    void        invert();           // in Cubes/invertCube.cc
[222]430
[528]431    /// @brief Undo the inversion, and invert fluxes of all detected objects.
[378]432    void        reInvert();         // in Cubes/invertCube.cc
[222]433
[378]434    //-------------------------------------
435    // Reconstruction, Searching and Merging functions
436    //
[729]437    // in cubes.cc
438    /// @brief A front-end to all the searching functions
[834]439    void        Search();
[729]440
[378]441    // in ATrous/ReconSearch.cc
[528]442    /// @brief Front-end to reconstruction & searching functions.
[378]443    void        ReconSearch();
[528]444    /// @brief Switcher to reconstruction functions
[378]445    void        ReconCube();
[528]446    /// @brief Performs 1-dimensional a trous reconstruction on the Cube.
[378]447    void        ReconCube1D();
[528]448    /// @brief Performs 2-dimensional a trous reconstruction on the Cube.
[378]449    void        ReconCube2D();
[528]450    /// @brief Performs 3-dimensional a trous reconstruction on the Cube.
[378]451    void        ReconCube3D();
[222]452
[378]453    // in Cubes/CubicSearch.cc
[528]454    /// @brief Front-end to the cubic searching routine.
[378]455    void        CubicSearch();
[222]456
[378]457    // in Cubes/smoothCube.cc
[528]458    /// @brief Smooth the cube with the requested method.
[378]459    void        SmoothCube();
[528]460    /// @brief Front-end to the smoothing and searching functions.
[378]461    void        SmoothSearch();
[528]462    /// @brief A function to spatially smooth the cube and search the result.
[378]463    void        SpatialSmoothNSearch();
[528]464    /// @brief A function to Hanning-smooth the cube.
[378]465    void        SpectralSmooth();
[528]466    /// @brief A function to spatially-smooth the cube.
[378]467    void        SpatialSmooth();
[222]468
[378]469    void        Simple3DSearch(){
[528]470      /// @brief Basic front-end to the simple 3d searching function -- does
471      /// nothing more.
472      ///
473      /// @details This function just runs the search3DArraySimple function,
474      /// storing the results in the Cube::objectList vector. No stats
475      /// are calculated beforehand, and no logging or detection map
476      /// updating is done.
[686]477      *objectList = search3DArray(axisDim,array,par,Stats);
[378]478    };
[290]479
[378]480    void        Simple3DSearchRecon(){
[528]481      /// @brief Basic front-end to the 3d searching function used in the
482      /// reconstruction case -- does nothing more.
483      ///
484      /// @details This function just runs the searchReconArraySimple
485      /// function, storing the results in the Cube::objectList
486      /// vector. No stats are calculated beforehand, and no logging
487      /// or detection map updating is done. The recon array is
488      /// assumed to have been defined already.
489
[686]490      *objectList = searchReconArray(axisDim,array,recon,par,Stats);
[378]491    };
[290]492
[378]493    void        Simple3DSearchSmooth(){
[528]494      /// @brief Basic front-end to the simple 3d searching function
495      /// run on the smoothed array -- does nothing more.
496      ///
497      /// @details This function just runs the search3DArraySimple
498      /// function on the recon array (which contains the smoothed
499      /// array), storing the results in the Cube::objectList
500      /// vector. No stats are calculated beforehand, and no logging
501      /// or detection map updating is done. The recon array is
502      /// assumed to have been defined already.
503
[686]504      *objectList = search3DArray(axisDim,recon,par,Stats);
[378]505    };
[290]506
[378]507    // in Cubes/Merger.cc
[531]508    /// @brief Merge all objects in the detection list so that only distinct ones are left.
[378]509    void        ObjectMerger();
[103]510 
[475]511    // in Cubes/existingDetections.cc
[528]512    /// @brief Read a previously-created log file to get the detections without searching
[698]513    OUTCOME     getExistingDetections();
[475]514
[378]515    //-------------------------------------
516    // Text outputting of detected objects.
517    //   in Cubes/detectionIO.cc
518    //
[528]519    /// @brief Set up the output file with parameters and stats.
[378]520    void        prepareOutputFile();
[3]521
[528]522    /// @brief Write the statistical information to the output file.
[378]523    void        outputStats();
[222]524
[528]525    /// @brief Output detections to the output file and standard output.
[378]526    void        outputDetectionList();
[222]527
[528]528    /// @brief Prepare the log file for output.
[418]529    void        prepareLogFile(int argc, char *argv[]);
530
[528]531    /// @brief Output detections to the log file.
[659]532    void        logDetectionList(bool calcFluxes=true);
[222]533
[528]534    /// @brief Output a single detection to the log file.
[378]535    void        logDetection(Detection obj, int counter);
[222]536
[528]537    /// @brief Output detections to a Karma annotation file.
[378]538    void        outputDetectionsKarma(std::ostream &stream);
[222]539
[528]540    /// @brief Output detections to a VOTable.
[378]541    void        outputDetectionsVOTable(std::ostream &stream);
[275]542
[668]543
[378]544    // ----------------------------------
[668]545    // Calculation of overall moment maps
546
547    /// @brief Return a moment-0 map plus a map of where the object pixels are
[946]548    std::vector<bool> getMomentMap(float *momentMap);
[668]549    /// @brief Return a moment-0 map formatted for logarithmic greyscale plotting, with greyscale limits
[693]550    void       getMomentMapForPlot(float *momentMap, float &z1, float &z2);
[668]551
552    // ----------------------------------
[378]553    // Graphical plotting of the cube and the detections.
554    //
555    //  in Cubes/plotting.cc
[531]556    /// @brief Plot a spatial map of detections based on number of detected channels.
[378]557    void        plotDetectionMap(std::string pgDestination);
[3]558
[531]559    /// @brief Plot a spatial map of detections based on 0th moment map of each object.
[378]560    void        plotMomentMap(std::string pgDestination);
[222]561
[531]562    /// @brief Plot a spatial map of detections based on 0th moment map of each object to a number of PGPLOT devices.
[378]563    void        plotMomentMap(std::vector<std::string> pgDestination);
[222]564
[528]565    /// @brief Draw WCS axes over a PGPLOT map.
[581]566    void        plotWCSaxes(){duchamp::plotWCSaxes(head.getWCS(),axisDim);};
[222]567
[378]568    //  in Cubes/outputSpectra.cc
[528]569    /// @brief Print spectra of each detected object.
[378]570    void        outputSpectra();
[222]571
[528]572    /// @brief Write out text file of all spectra.
[424]573    void        writeSpectralData();
574
[528]575    /// @brief Print spectrum of a single object
[424]576    void        plotSpectrum(int objNum, Plot::SpectralPlot &plot);
[528]577    /// @brief Plot the image cutout for a single object
[378]578    void        plotSource(Detection obj, Plot::CutoutPlot &plot);
[222]579
[528]580    /// @brief Get the spectral arrays
[424]581    void        getSpectralArrays(int objNumber, float *specx, float *specy, float *specRecon, float *specBase);
582
[378]583    //  in Cubes/drawMomentCutout.cc
[528]584    /// @brief Draw the 0th moment map for a single object.
[378]585    void        drawMomentCutout(Detection &object);
[220]586
[528]587    /// @brief Draw a scale bar indicating angular size of the cutout.
[378]588    void        drawScale(float xstart,float ystart,float channel);
[222]589
[531]590    /// @brief Draw a yellow line around the edge of the spatial extent of pixels.
[378]591    void        drawFieldEdge();
[222]592
[378]593  private:
[528]594    float      *recon;            ///< reconstructed array - used when doing a trous reconstruction.
595    bool        reconExists;      ///< flag saying whether there is a reconstruction
596    short      *detectMap;        ///< "moment map" - x,y locations of detected pixels
597    float      *baseline;         ///< array of spectral baseline values.
[219]598                             
[528]599    bool        reconAllocated;   ///< have we allocated memory for the recon array?
600    bool        baselineAllocated;///< have we allocated memory for the baseline array?
601    FitsHeader  head;             ///< the WCS and other header information.
602    std::vector<Column::Col> fullCols;    ///< the list of all columns as printed in the results file
603    std::vector<Column::Col> logCols;     ///< the list of columns as printed in the log file
[205]604
[378]605  };
[103]606
[220]607
[378]608  //============================================================================
[220]609
[528]610  ///  @brief A DataArray object limited to two dimensions, and with some additional
611  ///   special functions.
612  ///
613  ///  @details It is used primarily for searching a 1- or 2-D array with
614  ///   lutz_detect() and spectrumDetect().
[219]615
[378]616  class Image : public DataArray
617  {
618  public:
[732]619    Image(){numPixels=0; numDim=2; minSize=2;};
[884]620    Image(size_t nPix);
621    Image(size_t *dimensions);
[378]622    virtual ~Image(){};
[736]623    Image(const Image &i);
624    Image& operator=(const Image &i);
[219]625
[378]626    //--------------------
627    // Defining the array
628    //
[528]629    /// @brief Save an external array to the Cube's pixel array
[884]630    void      saveArray(float *input, size_t size);
[222]631
[528]632    /// @brief Extract a spectrum from an array and save to the local pixel array.
[884]633    void      extractSpectrum(float *Array, size_t *dim, size_t pixel);
[222]634
[528]635    /// @brief Extract an image from an array and save to the local pixel array.
[884]636    void      extractImage(float *Array, size_t *dim, size_t channel);
[222]637
[528]638    /// @brief Extract a spectrum from a cube and save to the local pixel array.
[884]639    void      extractSpectrum(Cube &cube, size_t pixel);
[222]640
[528]641    /// @brief Extract an image from a cube and save to the local pixel array.
[884]642    void      extractImage(Cube &cube, size_t channel);
[222]643
[378]644    //--------------------
645    // Accessing the data.
646    //
[884]647    float     getPixValue(size_t pos){ return array[pos]; };
648    float     getPixValue(size_t x, size_t y){return array[y*axisDim[0] + x];};
[378]649    // the next few should have checks against array overflow...
[884]650    void      setPixValue(size_t pos, float f){array[pos] = f;};
651    void      setPixValue(size_t x, size_t y, float f){array[y*axisDim[0] + x] = f;};
[378]652    bool      isBlank(int vox){return par.isBlank(array[vox]);};
[884]653    bool      isBlank(size_t x,size_t y){return par.isBlank(array[y*axisDim[0]+x]);};
[219]654
[378]655    //-----------------------
656    // Detection-related
657    //
[528]658    /// @brief Detect objects in a 2-D image
[582]659    std::vector<PixelInfo::Object2D> findSources2D();
[222]660
[528]661    /// @brief Detect objects in a 1-D spectrum
[582]662    std::vector<PixelInfo::Scan> findSources1D();
[222]663
[577]664    unsigned int getMinSize(){return minSize;};
665    void         setMinSize(int i){minSize=i;};
[222]666
[528]667    /// @brief  A detection test for a pixel location. 
[884]668    bool      isDetection(size_t x, size_t y){
[528]669      /// @details Test whether a pixel (x,y) is a statistically
670      /// significant detection, according to the set of statistics in
671      /// the local StatsContainer object.
672
[884]673      size_t voxel = y*axisDim[0] + x;
[378]674      if(isBlank(x,y)) return false;
675      else return Stats.isDetection(array[voxel]);
676    }; 
[219]677
[528]678    /// @brief Blank out a set of channels marked as being Milky Way channels
[378]679    void      removeMW();
[258]680
[378]681  private:
[577]682    unsigned int minSize;    ///< the minimum number of pixels for a detection to be accepted.
[378]683  };
[3]684
[219]685
[378]686}
687
[3]688#endif
Note: See TracBrowser for help on using the repository browser.