source: trunk/src/Detection/detection.hh @ 1293

Last change on this file since 1293 was 1293, checked in by MatthewWhiting, 11 years ago

Ticket #200 - Largely resolved. The getVertexSet function now resides in Object3D, and returns a set of Voxel vectors, that describe the bounding vertices of the object (in 2D projection). Changes also made to the functions that call this, and to the verification outputs that are affected (notably the .ann and .reg files).

File size: 16.9 KB
Line 
1// -----------------------------------------------------------------------
2// detection.hh: Definition of the Detection class.
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// -----------------------------------------------------------------------
28#ifndef DETECTION_H
29#define DETECTION_H
30
31#include <iostream>
32#include <string>
33#include <vector>
34#include <duchamp/param.hh>
35#include <duchamp/PixelMap/Voxel.hh>
36#include <duchamp/PixelMap/Object3D.hh>
37#include <duchamp/Outputs/columns.hh>
38#include <duchamp/Outputs/CatalogueSpecification.hh>
39
40using namespace PixelInfo;
41
42namespace duchamp
43{
44
45
46  /// Class to represent a contiguous set of detected voxels.
47  ///  This is a detected object, which features:
48  ///   a vector of voxels, average and centroid positions, total & peak fluxes,
49  ///   the possibility of WCS-calculated parameters (RA, Dec, velocity,
50  ///     related widths).
51  ///  Also many functions with which to manipulate the Detections.
52
53  class Detection : public Object3D
54  {
55  public:
56    Detection();
57    Detection(const Object3D& o);
58    Detection(const Detection& d);
59    Detection& operator= (const Detection& d);
60    virtual ~Detection(){};
61    void defaultDetection();
62    //------------------------------
63    // These are functions in detection.cc.
64    //
65
66    friend Detection operator+ (Detection &lhs, Detection &rhs);
67    void addDetection(Detection &other);
68
69    bool canMerge(Detection &other, Param &par);
70    bool isNear(Detection &other, Param &par);
71    bool isClose(Detection &other, Param &par);
72
73    /// @brief Test whether voxel lists match
74    bool voxelListsMatch(std::vector<PixelInfo::Voxel> voxelList);
75
76    /// @brief Test whether a voxel list contains all detected voxels
77    bool voxelListCovered(std::vector<PixelInfo::Voxel> voxelList);
78
79    /// @brief Calculate flux-related parameters of the Detection.
80    void   calcFluxes(float *fluxArray, size_t *dim);
81    /// @brief Calculate flux-related parameters of the Detection.
82    void   calcFluxes(std::vector<PixelInfo::Voxel> voxelList);
83    void   calcFluxes(std::map<Voxel,float> &voxelMap);
84
85      /// @brief Invert the source's flux values
86      void invert();
87
88    /// @brief Calculate parameters related to the World Coordinate System.
89    //    void   calcWCSparams(float *fluxArray, long *dim, FitsHeader &head);
90    void   calcWCSparams(FitsHeader &head);
91
92    /// @brief Calculate the integrated flux over the entire Detection.
93    void   calcIntegFlux(float *fluxArray, size_t *dim, FitsHeader &head, Param &par);
94    /// @brief Calculate the integrated flux over the entire Detection.
95    void   calcIntegFlux(size_t zdim, std::vector<PixelInfo::Voxel> voxelList, FitsHeader &head);
96    void   calcIntegFlux(size_t zdim, std::map<Voxel,float> voxelMap, FitsHeader &head);
97
98    /// @brief Calculate the 20%-/50%-peak-flux widths in a general fashion
99    void calcVelWidths(size_t zdim, float *intSpec, FitsHeader &head);
100    /// @brief Calculate the 20%/50% peak flux widths
101    void calcVelWidths(float *fluxArray, size_t *dim, FitsHeader &head, Param &par);
102    /// @brief Calculate the 20%/50% peak flux widths
103    void calcVelWidths(size_t zdim, std::vector<PixelInfo::Voxel> voxelList, FitsHeader &head);
104    void calcVelWidths(size_t zdim, std::map<Voxel,float> voxelMap, FitsHeader &head);
105
106    /// @brief Calculate the spatial (moment-0) shape
107    void findShape(const float *momentMap, const size_t *dim, FitsHeader &head);
108
109    /// @brief Set the values of the axis offsets from the cube.
110    void   setOffsets(Param &par);
111
112    /// @brief Add the offset values to the pixel locations
113   void   addOffsets(size_t xoff, size_t yoff, size_t zoff){
114       Object3D::addOffsets(xoff,yoff,zoff);
115       xpeak+=xoff; ypeak+=yoff; zpeak+=zoff;
116       xCentroid+=xoff; yCentroid+=yoff; zCentroid+=zoff;
117    };
118
119      void   addOffsets(){ addOffsets(xSubOffset, ySubOffset, zSubOffset);};
120      void   removeOffsets(size_t xoff, size_t yoff, size_t zoff){ addOffsets(-xoff, -yoff, -zoff);};
121      void   removeOffsets(){ addOffsets(-xSubOffset, -ySubOffset, -zSubOffset);};
122      void   addOffsets(Param &par){setOffsets(par); addOffsets();};
123
124    //
125    //---------------------------------
126    // Text Output -- all in Detection/outputDetection.cc
127    //
128    /// @brief The spectral output label that contains info on the WCS position & velocity.
129    std::string outputLabelWCS(); 
130
131    /// @brief The spectral output label that contains info on the pixel location.
132    std::string outputLabelPix();
133
134    /// @brief The spectral output label that contains info on fluxes of the Detection.
135    std::string outputLabelFluxes();
136
137    /// @brief The spectral output label that contains info on widths of the Detection.
138    std::string outputLabelWidths(FitsHeader &head);
139
140    /// @brief Print all required values for the Detection to a table.
141    void printTableRow(std::ostream &stream, Catalogues::CatalogueSpecification columns, Catalogues::DESTINATION tableType);
142
143    /// @brief Print a particular value for the Detection to a table.
144    void printTableEntry(std::ostream &stream, Catalogues::Column column);
145
146    //----------------------------------
147    // For plotting routines... in Cubes/drawMomentCutout.cc
148    //
149    /// @brief Draw spatial borders for a particular Detection.
150    void   drawBorders(int xoffset, int yoffset);
151    //
152   
153    //
154    //----------------------------------
155    // Basic functions
156    //
157
158    /// @brief Add a single voxel to the pixel list.
159    void   addPixel(long x, long y, long z){Object3D::addPixel(x,y,z);};
160   
161    /// @brief Add a single voxel to the pixel list.
162    void   addPixel(PixelInfo::Voxel point){
163      /// @brief This one adds the pixel to the pixelArray, and updates the fluxes according to the Voxel's flux information
164      Object3D::addPixel(point.getX(),point.getY(),point.getZ());
165      totalFlux += point.getF();
166      if(point.getF()>peakFlux){
167        peakFlux = point.getF();
168        xpeak = point.getX(); ypeak = point.getY(); zpeak = point.getZ();
169      }
170    };
171
172    /// @brief How many channels does the Detection have?
173    size_t   getNumChannels(){return Object3D::getNumDistinctZ();};
174
175    /// @brief Is there at least the acceptable minimum number of channels in the Detection? 
176    bool   hasEnoughChannels(int minNumber);
177 
178    //-----------------------------------
179    // Basic accessor functions for private members follow...
180    //
181    long        getXOffset(){return xSubOffset;};
182    void        setXOffset(long o){xSubOffset = o;};
183    long        getYOffset(){return ySubOffset;};
184    void        setYOffset(long o){ySubOffset = o;};
185    long        getZOffset(){return zSubOffset;};
186    void        setZOffset(long o){zSubOffset = o;};
187    //       
188    bool        hasParams(){return haveParams;};
189    //
190    float       getXcentre();
191    float       getYcentre();
192    float       getZcentre();
193    float       getTotalFlux(){return totalFlux;};
194    void        setTotalFlux(float f){totalFlux=f;};
195    float       getTotalFluxError(){return eTotalFlux;};
196    void        setTotalFluxError(float f){eTotalFlux=f;};
197    double      getIntegFlux(){return intFlux;};
198    void        setIntegFlux(double f){intFlux=f;};
199    double      getIntegFluxError(){return eIntFlux;};
200    void        setIntegFluxError(double d){eIntFlux=d;};
201    float       getPeakFlux(){return peakFlux;};
202    void        setPeakFlux(float f){peakFlux=f;};
203    long        getXPeak(){return xpeak;};
204    long        getYPeak(){return ypeak;};
205    long        getZPeak(){return zpeak;};
206    float       getPeakSNR(){return peakSNR;};
207    void        setPeakSNR(float f){peakSNR = f;};
208    float       getXCentroid(){return xCentroid;};
209    float       getYCentroid(){return yCentroid;};
210    float       getZCentroid(){return zCentroid;};
211    std::string getCentreType(){return centreType;};
212    void        setCentreType(std::string s){centreType=s;};
213    bool        isNegative(){return negSource;};
214    void        setNegative(bool f){negSource = f;};
215    std::string getFlagText(){return flagText;};
216    void        setFlagText(std::string s){flagText = s;};
217    void        addToFlagText(std::string s){flagText += s;};
218    //       
219    /// @brief Is the WCS good enough to be used?
220    /// \return Detection::flagWCS =  True/False
221    bool        isWCS(){return flagWCS;};
222    bool        isSpecOK(){return specOK;};
223    void        setSpecOK(bool b){specOK=b;};
224    std::string getName(){return name;};
225    void        setName(std::string s){name=s;};
226    std::string getRAs(){return raS;};
227    std::string getDecs(){return decS;};
228    double      getRA(){return ra;};
229    double      getDec(){return dec;};
230    double      getRAWidth(){return raWidth;};
231    double      getDecWidth(){return decWidth;};
232    double      getMajorAxis(){return majorAxis;};
233    double      getMinorAxis(){return minorAxis;};
234    double      getPositionAngle(){return posang;};
235    double      getVel(){return vel;};
236    double      getVelWidth(){return velWidth;};
237    double      getVelMin(){return velMin;};
238    double      getVelMax(){return velMax;};
239    double      getW20(){return w20;};
240    double      getV20Min(){return v20min;};
241    double      getV20Max(){return v20max;};
242    double      getW50(){return w50;};
243    double      getV50Min(){return v50min;};
244    double      getV50Max(){return v50max;};
245    int         getID(){return id;};
246    void        setID(int i){id = i;};
247    //
248    int         getPosPrec(){return posPrec;};
249    void        setPosPrec(int i){posPrec=i;};
250    int         getXYZPrec(){return xyzPrec;};
251    void        setXYZPrec(int i){xyzPrec=i;};
252    int         getFintPrec(){return fintPrec;};
253    void        setFintPrec(int i){fintPrec=i;};
254    int         getFpeakPrec(){return fpeakPrec;};
255    void        setFpeakPrec(int i){fpeakPrec=i;};
256    int         getVelPrec(){return velPrec;};
257    void        setVelPrec(int i){velPrec=i;};
258    int         getSNRPrec(){return snrPrec;};
259    void        setSNRPrec(int i){snrPrec=i;};
260    //
261  protected:
262    // Subsection offsets
263    long           xSubOffset;     ///< The x-offset, from subsectioned cube
264    long           ySubOffset;     ///< The y-offset, from subsectioned cube
265    long           zSubOffset;     ///< The z-offset, from subsectioned cube
266    bool           haveParams;     ///< Have the parameters been calculated?
267    // Flux related
268    float          totalFlux;      ///< sum of the fluxes of all the pixels
269    float          eTotalFlux;     ///< error on the total flux
270    double         intFlux;        ///< integrated flux : involves integration over velocity.
271    double         eIntFlux;       ///< error on the integrated flux
272    float          peakFlux;       ///< maximum flux over all the pixels
273    long           xpeak;          ///< x-pixel location of peak flux
274    long           ypeak;          ///< y-pixel location of peak flux
275    long           zpeak;          ///< z-pixel location of peak flux
276    float          peakSNR;        ///< signal-to-noise ratio at peak
277    float          xCentroid;      ///< x-pixel location of centroid
278    float          yCentroid;      ///< y-pixel location of centroid
279    float          zCentroid;      ///< z-pixel location of centroid
280    std::string    centreType;     ///< which type of pixel centre to report: "average", "centroid", or "peak" (flux)
281    bool           negSource;      ///< is the source a negative feature?
282    std::string    flagText;       ///< any warning flags about the quality of the detection.
283    // WCS related
284    int            id;             ///< ID -- generally number in list
285    std::string    name;           ///< IAU-style name (based on position)
286    bool           flagWCS;        ///< A flag indicating whether the WCS parameters have been set.
287    std::string    raS;            ///< Right Ascension (or Longitude) of pixel centre in form 12:34:23
288    std::string    decS;           ///< Declination (or Latitude) of pixel centre, in form -12:23:34
289    double         ra;             ///< Central Right Ascension in degrees
290    double         dec;            ///< Central Declination in degrees
291    double         raWidth;        ///< Width of detection in RA direction in arcmin
292    double         decWidth;       ///< Width of detection in Dec direction in arcmin
293    double         majorAxis;      ///< Major axis length in arcmin
294    double         minorAxis;      ///< Minor axis length in arcmin
295    double         posang;         ///< Position angle of the major axis, in degrees
296    bool           specOK;         ///< Is the spectral dimension valid?
297    std::string    specUnits;      ///< Units of the spectral dimension
298    std::string    specType;       ///< WCS ctype code for the spectral dimension
299    std::string    fluxUnits;      ///< Units of flux
300    std::string    intFluxUnits;   ///< Units of integrated flux
301    std::string    lngtype;        ///< Type of longitude axis (RA/GLON)
302    std::string    lattype;        ///< Type of latitude axis (DEC/GLAT)
303    double         vel;            ///< Central velocity (from zCentre)
304    double         velWidth;       ///< Full velocity width
305    double         velMin;         ///< Minimum velocity
306    double         velMax;         ///< Maximum velocity
307    double         v20min;         ///< Minimum velocity at 20% of peak flux
308    double         v20max;         ///< Maximum velocity at 20% of peak flux
309    double         w20;            ///< Velocity width at 20% of peak flux 
310    double         v50min;         ///< Minimum velocity at 50% of peak flux
311    double         v50max;         ///< Maximum velocity at 50% of peak flux
312    double         w50;            ///< Velocity width at 50% of peak flux 
313    /// @brief  The next six are the precision of values printed in the headers of the spectral plots
314    /// @name
315    /// @{
316    int            posPrec;        ///< Precision of WCS positional values
317    int            xyzPrec;        ///< Precision of pixel positional values
318    int            fintPrec;       ///< Precision of F_int/F_tot values
319    int            fpeakPrec;      ///< Precision of F_peak values
320    int            velPrec;        ///< Precision of velocity values.
321    int            snrPrec;        ///< Precision of S/N_max values.
322    /// @}
323  };
324
325  //==========================================================================
326
327  //////////////////////////////////////////////////////
328  // Prototypes for functions that use above classes
329  //////////////////////////////////////////////////////
330
331  //----------------
332  // These are in sorting.cc
333  //
334  /// @brief Sort a list of Detections by Z-pixel value.
335  void SortByZ(std::vector <Detection> &inputList);
336
337  /// @brief Sort a list of Detections by Velocity.
338  void SortByVel(std::vector <Detection> &inputList);
339
340  /// @brief Sort a list of Detections by a nominated parameter
341  void SortDetections(std::vector <Detection> &inputList, std::string parameter);
342
343  //----------------
344  // This is in areClose.cc
345  //
346  // /// @brief Determine whether two objects are close according to set parameters.
347  // bool areClose(Detection &object1, Detection &object2, Param &par);
348
349  //----------------
350  // This is in mergeIntoList.cc
351  //
352  /// @brief Add an object into a list, combining with adjacent objects if need be.
353  void mergeIntoList(Detection &object, std::vector <Detection> &objList,
354                     Param &par);
355
356  //----------------
357  // These are in Cubes/Merger.cc
358  //
359  /// @brief Merge a list of Detections so that all adjacent voxels are in the same Detection.
360  void mergeList(std::vector<Detection> &objList, Param &par);   
361  /// @brief Culls a list of Detections that do not meet minimum requirements.
362  void finaliseList(std::vector<Detection> &objList, Param &par);
363  /// @brief Manage both the merging and the cleaning up of the list.
364  void ObjectMerger(std::vector<Detection> &objList, Param &par);
365
366  // /// @brief Print the header information to a particular table
367  // void outputTableHeader(std::ostream &stream, Catalogues::CatalogueSpecification &columns, Catalogues::DESTINATION tableType, bool flagWCS);
368
369}
370
371#endif
Note: See TracBrowser for help on using the repository browser.