source: tags/release-1.2.2/src/Cubes/momentMap.cc

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

Fixing #165 - was ignoring spatial pixels that were blank in the first channel, but this omitted the bright source I was looking at. Removed this criterion (we select only pixels that are detected anyway, so don't need this step).

File size: 6.1 KB
Line 
1// -----------------------------------------------------------------------
2// momentMap.cc : functions to calculate the momment-0 map of the cube
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#include <iostream>
29#include <iomanip>
30#include <sstream>
31#include <math.h>
32#include <string.h>
33#include <duchamp/duchamp.hh>
34#include <duchamp/param.hh>
35#include <duchamp/fitsHeader.hh>
36#include <duchamp/Detection/detection.hh>
37#include <duchamp/PixelMap/Object3D.hh>
38#include <duchamp/Cubes/cubes.hh>
39#include <duchamp/Utils/utils.hh>
40
41using namespace PixelInfo;
42
43namespace duchamp
44{
45
46  void Cube::getMomentMapForPlot(float *momentMap, float &z1, float &z2)
47  {
48   
49    /// @details This returns the moment-0 map in a form suitable for
50    /// plotting via pgplot. The map is transformed to log space, and
51    /// the minimum & maximum values are also returned.
52    /// @param momentMap The values of log10(momentMap). This array needs to be declared beforehand.
53    /// @param z1 The minimum value of momentMap
54    /// @param z2 The maximum value of momentMap
55
56
57    long xdim=this->axisDim[0];
58    long ydim=this->axisDim[1];
59
60    std::vector<bool> detectedPixels = this->getMomentMap(momentMap);
61
62    int count=0;
63    for(int i=0;i<xdim*ydim;i++) {
64      if(this->detectMap[i]>0){
65        float logmm = log10(momentMap[i]);
66        bool addPixel = detectedPixels[i];
67        if(addPixel){
68          if(count==0) z1 = z2 = logmm;
69          else{
70            if(logmm < z1) z1 = logmm;
71            if(logmm > z2) z2 = logmm;
72          }
73          count++;
74        }
75      }
76    }
77   
78    for(int i=0;i<xdim*ydim;i++) {
79      bool addPixel = detectedPixels[i];
80      addPixel = addPixel && (momentMap[i]>0.);
81      if(!addPixel) momentMap[i] = z1-1.;
82      else momentMap[i] = log10(momentMap[i]);
83    }
84
85  }
86
87  std::vector<bool> Cube::getMomentMap(float *momentMap)
88  {
89
90    /// @details This populates the moment-0 map (ie. the map of
91    /// integrated flux) for the cube. The momentMap array needs to be
92    /// allocated before calling this function - it should be of the
93    /// same spatial dimensions as the cube. The function returns
94    /// a map showing which spatial pixels are detected. This provides
95    /// a way of telling whether a given pixel is affected, as
96    /// although the momentMap is initialised to zero, it is
97    /// conceivable that a pixel with detections in its spectrum could
98    /// yield a value of zero. The detection map is stored as a
99    /// vector<bool> for compactness.
100    /// @param momentMap Pointer to the array holding the moment map values, which needs to be allocated beforehand.
101    /// @return detectedPixel The map showing which spatial pixels contain an object.
102
103    size_t xdim=this->axisDim[0];
104    size_t ydim=this->axisDim[1];
105    size_t zdim=this->axisDim[2];
106
107    // get the list of objects that should be plotted.
108    std::vector<bool> objectChoice = this->par.getObjectChoices(this->objectList->size());
109
110    bool *isObj = new bool[xdim*ydim*zdim];
111    for(size_t i=0;i<xdim*ydim*zdim;i++) isObj[i] = false;
112    for(size_t i=0;i<this->objectList->size();i++){
113      if(objectChoice[i]){
114        std::vector<Voxel> voxlist = this->objectList->at(i).getPixelSet();
115        std::vector<Voxel>::iterator vox;
116        for(vox=voxlist.begin();vox<voxlist.end();vox++){
117          size_t pixelpos = vox->getX() + xdim*vox->getY() + xdim*ydim*vox->getZ();
118          isObj[pixelpos] = true;
119        }
120      }
121    }
122
123    // Array containing the moment map, initialised to zero
124    for(size_t i=0;i<xdim*ydim;i++) momentMap[i] = 0.;
125
126    // Bool vector containing yes/no on whether a given spatial pixel has a detected object.
127    // Initialise this to false everywhere.
128    std::vector<bool> detectedPixels = std::vector<bool>(xdim*ydim,false);
129
130    // if we are looking for negative features, we need to invert the
131    //  detected pixels for the moment map
132    float sign = 1.;
133    if(this->pars().getFlagNegative()) sign = -1.;
134
135    float deltaVel;
136    double x,y;
137
138    double *zArray  = new double[zdim];
139    for(size_t z=0; z<zdim; z++) zArray[z] = double(z);
140   
141    for(size_t pix=0; pix<xdim*ydim; pix++){
142
143      x = double(pix%xdim);
144      y = double(pix/xdim);
145
146      if( this->detectMap[pix] > 0 ){  // and only where something was detected in the spectrum.
147
148        double * world = this->head.pixToVel(x,y,zArray,zdim);
149     
150        for(size_t z=0; z<zdim; z++){     
151          size_t pos =  z*xdim*ydim + pix;  // the voxel in the cube
152          if(isObj[pos]){ // if it's an object pixel...
153            // delta-vel is half the distance between adjacent channels.
154            // if at end, then just use 0-1 or (zdim-1)-(zdim-2) distance
155            if(z==0){
156              if(zdim==1) deltaVel=1.; // pathological case -- if 2D image.
157              else deltaVel = world[z+1] - world[z];
158            }
159            else if(z==(zdim-1)) deltaVel = world[z-1] - world[z];
160            else deltaVel = (world[z+1] - world[z-1]) / 2.;
161
162            momentMap[pix] += sign * this->array[pos] * fabs(deltaVel);
163            detectedPixels[pix] = true;
164
165          }
166        }
167        delete [] world;
168      }
169
170    }
171   
172    delete [] zArray;
173    delete [] isObj;
174
175    return detectedPixels;
176
177  }
178
179
180}
Note: See TracBrowser for help on using the repository browser.