source: tags/release-1.3/src/PixelMap/Object2D.hh @ 1391

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

Ticket #132 - New code to fit the ellipse to the moment-0 map thresholded at half its peak - this then provides FWHM esimates for major/minor axes. Also have adaptive units for these axes, scaling to get the numbers not too small and adjusting the units accordingly. 2D images also have the shape calculated too now.

File size: 6.3 KB
Line 
1// -----------------------------------------------------------------------
2// Object2D.hh: Definition of Object2D, a class to hold pixel
3//              information for a 2-dimensional object.
4// -----------------------------------------------------------------------
5// Copyright (C) 2006, Matthew Whiting, ATNF
6//
7// This program is free software; you can redistribute it and/or modify it
8// under the terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2 of the License, or (at your
10// option) any later version.
11//
12// Duchamp is distributed in the hope that it will be useful, but WITHOUT
13// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15// for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with Duchamp; if not, write to the Free Software Foundation,
19// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
20//
21// Correspondence concerning Duchamp may be directed to:
22//    Internet email: Matthew.Whiting [at] atnf.csiro.au
23//    Postal address: Dr. Matthew Whiting
24//                    Australia Telescope National Facility, CSIRO
25//                    PO Box 76
26//                    Epping NSW 1710
27//                    AUSTRALIA
28// -----------------------------------------------------------------------
29#ifndef OBJECT2D_H
30#define OBJECT2D_H
31
32#include <iostream>
33#include <algorithm>
34#include <vector>
35#include <list>
36#include <duchamp/PixelMap/Scan.hh>
37#include <duchamp/PixelMap/Voxel.hh>
38
39namespace PixelInfo
40{
41
42  /// @brief A class to store the pixel information for an object
43  /// defined in a 2-dimensional plane.
44  ///
45  /// @details The object consists of a set of Scans (stored as a
46  /// std::vector), together with basic information on the maximum,
47  /// minimum, and average values (actually stored as xSum, ySum) for
48  /// the x and y pixel values.
49
50  class Object2D
51  {
52  public:
53    Object2D();
54    Object2D(const Object2D& o);
55    Object2D& operator= (const Object2D& o); 
56    virtual ~Object2D(){};
57 
58    /// @brief Clear the Object and set the number of pixels to zero.
59    void  clear(){scanlist.clear(); numPix=0;};
60
61    /// @brief Make sure there are no overlapping or adjacent scans in the Scan list.
62    void  cleanup();
63
64    /// @brief Add a pixel to the Object, making sure no scans overlap afterwards.
65    void  addPixel(long x, long y);
66    // /// @brief Add the (x,y) part of a Voxel to the Object, using addPixel(long,long)
67    // void  addPixel(Voxel &v){this->addPixel(v.getX(),v.getY());};
68    // /// @brief Add a Pixel to the Object, using addPixel(long,long)
69    // void  addPixel(Pixel &p){this->addPixel(p.getX(),p.getY());};
70
71    /// @brief Add a full Scan to the Object, making sure there are no overlapping scans afterwards.
72    void  addScan(Scan &scan);
73
74    /// @brief Test whether a pixel (x,y) is in the Object.
75    bool  isInObject(long x, long y);
76    /// @brief Test whether the (x,y) part of a Voxel is in the Object.
77    bool  isInObject(Voxel v){return this->isInObject(v.getX(),v.getY());};
78    /// @brief Test whether a Pixel is in the Object.
79    bool  isInObject(Pixel p){return this->isInObject(p.getX(),p.getY());};
80
81    /// @brief Test whether a given Scan overlaps with any pixels in the Object.
82    bool  scanOverlaps(Scan &scan);
83
84    bool canMerge(Object2D &other, float threshS, bool flagAdj);
85    bool isNear(Object2D &other, long gap);
86    bool isClose(Object2D &other, float threshS, bool flagAdj);   
87
88    /// @brief Return the number of pixels in the Object.
89    unsigned long  getSize(){return numPix;};
90
91    /// @brief Return the number of Scans in the Object.
92    long  getNumScan(){return scanlist.size();};
93
94    /// @brief Get the i-th Scan in the Scan list.
95    // Scan  getScan(int i){return scanlist[i];};
96
97    /// @brief Order the Scans in the list, using the < operator for Scans.
98     void  order(){std::stable_sort(scanlist.begin(),scanlist.end());};
99    //void order(){scanlist.sort();};
100
101    /// @brief Add values to the x- and y-axes, making sure to add the offsets to the sums and min/max values.
102    void  addOffsets(long xoff, long yoff);
103
104    /// @brief Calculate the sums, mins, maxs for x&y -- should not be necessary as these are done when pixels & Scans are added.
105    void  calcParams();
106
107    /// @brief Return the average x-value.
108    float getXaverage(){return xSum/float(numPix);};
109
110    /// @brief Return the average y-value.
111    float getYaverage(){return ySum/float(numPix);};
112
113    long  getXmin(){return xmin;};
114    long  getYmin(){return ymin;};
115    long  getXmax(){return xmax;};
116    long  getYmax(){return ymax;};
117
118    /// @brief Return the number of distinct y-values.
119    long  getNumDistinctY();
120    /// @brief Return the number of distinct x-values.
121    long  getNumDistinctX();
122 
123    /// @brief Return a measurement of the primary position angle
124    double getPositionAngle();
125    /// @brief Return the lengths of the principal axes.
126    std::pair<double,double> getPrincipleAxes();
127    /// @brief Find the best fitting ellipse weighted by some flux array
128    bool findEllipse(bool weightByFlux, float *array, size_t xdim, size_t ydim, int xzero, int yzero, float x0, float y0);
129
130    double major(){return majorAxis;};
131    double minor(){return minorAxis;};
132    double posAng(){return posAngle;};
133
134    /// @brief A stream output operator.
135    friend std::ostream& operator<< ( std::ostream& theStream, Object2D& obj);
136
137    /// @brief Adding two Objects together.
138    friend Object2D operator+ (Object2D lhs, Object2D rhs);
139
140    friend class ChanMap;
141    friend class Object3D;
142    friend class Detection;
143
144  protected:
145    std::vector<Scan>   scanlist;       ///< The list of Scans
146    unsigned long     numPix;         ///< Number of pixels in the Object
147    float             xSum;           ///< Sum of x values
148    float             ySum;           ///< Sum of y values
149    long              xmin,xmax;      ///< min and max x-values of object
150    long              ymin,ymax;      ///< min and max y-values of object
151    double            majorAxis;      ///< fitted major principle axis
152    double            minorAxis;      ///< fitted minor principle axis
153    double            posAngle;       ///< fitted position angle of principle axis
154  };
155
156}
157
158#endif //OBJECT2D_H
Note: See TracBrowser for help on using the repository browser.