source: tags/release-1.1.7/src/PixelMap/Object3D.hh @ 1455

Last change on this file since 1455 was 528, checked in by MatthewWhiting, 15 years ago

Changing the documentation comments to match the askapsoft style. Also have split ChanMap? and Object3D into separate files.

File size: 6.0 KB
Line 
1// -----------------------------------------------------------------------
2// Object3D.hh: Definition of Object3D and ChanMap, classes that hold
3//              pixel information for a three-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 OBJECT3D_H
30#define OBJECT3D_H
31
32#include <duchamp/PixelMap/Voxel.hh>
33#include <duchamp/PixelMap/Scan.hh>
34#include <duchamp/PixelMap/Object2D.hh>
35#include <duchamp/PixelMap/ChanMap.hh>
36#include <vector>
37#include <algorithm>
38#include <iostream>
39
40namespace PixelInfo
41{
42
43  /// @brief A set of pixels in 3D. 
44  ///
45  /// @details This stores the pixels in a list of ChanMap objects --
46  /// ie. a set of Object2Ds, each with a different channel number.
47  /// Also recorded are the average x-, y- and z-values (via their
48  /// sums), as well as their extrema.
49
50  class Object3D
51  {
52  public:
53    Object3D();
54    Object3D(const Object3D& o);
55    Object3D& operator= (const Object3D& o); 
56    virtual ~Object3D(){};
57
58    /// @brief Is a 3-D voxel in the Object?
59    bool     isInObject(long x, long y, long z);
60    /// @brief Is a 3-D voxel in the Object?
61    bool     isInObject(Voxel v){return this->isInObject(v.getX(),v.getY(),v.getZ());};
62 
63    /// @brief Add a single 3-D voxel to the Object.
64    void     addPixel(long x, long y, long z);
65    /// @brief Add a single 3-D voxel to the Object.
66    void     addPixel(Voxel v){this->addPixel(v.getX(),v.getY(),v.getZ());};
67    /// @brief Add a scan to the object
68    void     addScan(Scan s, long z);
69    /// @brief Add a full channel map to the Object.
70    void     addChannel(ChanMap channel);
71    /// @brief Add a full channel map to the Object.
72    void     addChannel(long z, Object2D obj){
73      ChanMap channel(z,obj);
74      this->addChannel(channel);
75    }
76
77    /// @brief Sort the list of channel maps by their channel number.
78    void     order();
79
80    /// @brief Calculate the averages and extrema of the three coordinates.
81    void     calcParams();
82    /// @brief Return the average x-value.
83    float    getXcentre(){return xSum/float(numVox);};
84    /// @brief Return the average y-value.
85    float    getYcentre(){return ySum/float(numVox);};
86    /// @brief Return the average z-value.
87    float    getZcentre(){return zSum/float(numVox);};
88    /// @brief Return the minimum x-value.
89    long     getXmin(){return xmin;};
90    /// @brief Return the minimum y-value.
91    long     getYmin(){return ymin;};
92    /// @brief Return the minimum z-value.
93    long     getZmin(){return zmin;};
94    /// @brief Return the maximum x-value.
95    long     getXmax(){return xmax;};
96    /// @brief Return the maximum y-value.
97    long     getYmax(){return ymax;};
98    /// @brief Return the maximum z-value.
99    long     getZmax(){return zmax;};
100
101    /// @brief Return the number of distinct voxels in the Object.
102    long     getSize(){return numVox;};
103
104    /// @brief Return the number of distinct channels in the Object.
105    long     getNumDistinctZ();
106
107    /// @brief Return the number of channels in the Object.
108    long     getNumChanMap(){return this->maplist.size();};
109
110    /// @brief Return the number of spatial pixels -- ie. the number of distinct (x,y) sets in the Object.
111    long     getSpatialSize();
112 
113    /// @brief Get the pixNum-th voxel
114    Voxel    getPixel(int pixNum);
115
116    /// @brief Return a vector set of all voxels in the Object.
117    std::vector<Voxel> getPixelSet();
118
119    /// @brief Get the i-th channel map.
120    ChanMap  getChanMap(int i){return this->maplist[i];};
121
122    /// @brief Get the channel number of the i-th channel map.
123    long     getZ(int i){return this->maplist[i].itsZ;};
124
125    /// @brief Return an Object2D showing the spatial (x,y) distribution of voxels in the Object
126    Object2D getSpatialMap();
127
128    /// @brief Add constant offsets to each of the dimensions, changing the parameters at the same time.
129    void     addOffsets(long xoff, long yoff, long zoff);
130
131    /// @brief Output operator for the Object3D.
132    friend std::ostream& operator<< ( std::ostream& theStream, Object3D& obj);
133
134    /// @brief Add two Object3Ds. Overlapping channels are combined using addChannel().
135    friend Object3D operator+ (Object3D lhs, Object3D rhs){
136      Object3D output = lhs;
137      for(unsigned int m=0;m<rhs.maplist.size();m++) output.addChannel(rhs.maplist[m]);
138      return output;
139    }
140
141  private:
142    std::vector<ChanMap> maplist;   ///< The list of channel maps
143    long                 numVox;    ///< How many voxels in the Object?
144    float                xSum;      ///< Sum of the x-values
145    float                ySum;      ///< Sum of the y-values
146    float                zSum;      ///< Sum of the z-values
147    long                 xmin,xmax; ///< min and max x-values of object
148    long                 ymin,ymax; ///< min and max y-values of object
149    long                 zmin,zmax; ///< min and max z-values of object
150  };
151
152}
153
154#endif //OBJECT3D_H
Note: See TracBrowser for help on using the repository browser.