source: tags/release-1.1.11/src/Cubes/momentMap.cc @ 1441

Last change on this file since 1441 was 706, checked in by MatthewWhiting, 14 years ago

Had a rogue cpgplot include left in this file.

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