source: trunk/src/Cubes/momentMap.cc @ 1186

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

Fixes to get the plotting right. Ignoring zero/negative values when finding the z-range for the moment map plot. Getting the initial value of the max/min flux for the spectral plot right, in the case where the MW range is outside the requested subsection.

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          if(momentMap[i]>0){
66              float logmm = log10(momentMap[i]);
67              bool addPixel = detectedPixels[i];
68              if(addPixel){
69                  if(count==0) z1 = z2 = logmm;
70                  else{
71                      if(logmm < z1) z1 = logmm;
72                      if(logmm > z2) z2 = logmm;
73                  }
74                  count++;
75              }
76          }
77      }
78    }
79   
80    for(int i=0;i<xdim*ydim;i++) {
81      bool addPixel = detectedPixels[i];
82      addPixel = addPixel && (momentMap[i]>0.);
83      if(!addPixel) momentMap[i] = z1-1.;
84      else momentMap[i] = log10(momentMap[i]);
85    }
86
87  }
88
89  std::vector<bool> Cube::getMomentMap(float *momentMap)
90  {
91
92    /// @details This populates the moment-0 map (ie. the map of
93    /// integrated flux) for the cube. The momentMap array needs to be
94    /// allocated before calling this function - it should be of the
95    /// same spatial dimensions as the cube. The function returns
96    /// a map showing which spatial pixels are detected. This provides
97    /// a way of telling whether a given pixel is affected, as
98    /// although the momentMap is initialised to zero, it is
99    /// conceivable that a pixel with detections in its spectrum could
100    /// yield a value of zero. The detection map is stored as a
101    /// vector<bool> for compactness.
102    /// @param momentMap Pointer to the array holding the moment map values, which needs to be allocated beforehand.
103    /// @return detectedPixel The map showing which spatial pixels contain an object.
104
105    size_t xdim=this->axisDim[0];
106    size_t ydim=this->axisDim[1];
107    size_t zdim=this->axisDim[2];
108
109    // get the list of objects that should be plotted.
110    std::vector<bool> objectChoice = this->par.getObjectChoices(this->objectList->size());
111
112    bool *isObj = new bool[xdim*ydim*zdim];
113    for(size_t i=0;i<xdim*ydim*zdim;i++) isObj[i] = false;
114    for(size_t i=0;i<this->objectList->size();i++){
115      if(objectChoice[i]){
116        std::vector<Voxel> voxlist = this->objectList->at(i).getPixelSet();
117        std::vector<Voxel>::iterator vox;
118        for(vox=voxlist.begin();vox<voxlist.end();vox++){
119          size_t pixelpos = vox->getX() + xdim*vox->getY() + xdim*ydim*vox->getZ();
120          isObj[pixelpos] = true;
121        }
122      }
123    }
124
125    // Array containing the moment map, initialised to zero
126    for(size_t i=0;i<xdim*ydim;i++) momentMap[i] = 0.;
127
128    // Bool vector containing yes/no on whether a given spatial pixel has a detected object.
129    // Initialise this to false everywhere.
130    std::vector<bool> detectedPixels = std::vector<bool>(xdim*ydim,false);
131
132    // if we are looking for negative features, we need to invert the
133    //  detected pixels for the moment map
134    float sign = 1.;
135    if(this->pars().getFlagNegative()) sign = -1.;
136
137    float deltaVel;
138    double x,y;
139
140    double *zArray  = new double[zdim];
141    for(size_t z=0; z<zdim; z++) zArray[z] = double(z);
142   
143    for(size_t pix=0; pix<xdim*ydim; pix++){
144
145      x = double(pix%xdim);
146      y = double(pix/xdim);
147
148      if( this->detectMap[pix] > 0 ){  // and only where something was detected in the spectrum.
149
150        double * world = this->head.pixToVel(x,y,zArray,zdim);
151     
152        for(size_t z=0; z<zdim; z++){     
153          size_t pos =  z*xdim*ydim + pix;  // the voxel in the cube
154          if(isObj[pos]){ // if it's an object pixel...
155            // delta-vel is half the distance between adjacent channels.
156            // if at end, then just use 0-1 or (zdim-1)-(zdim-2) distance
157            if(z==0){
158              if(zdim==1) deltaVel=1.; // pathological case -- if 2D image.
159              else deltaVel = world[z+1] - world[z];
160            }
161            else if(z==(zdim-1)) deltaVel = world[z-1] - world[z];
162            else deltaVel = (world[z+1] - world[z-1]) / 2.;
163
164            momentMap[pix] += sign * this->array[pos] * fabs(deltaVel);
165            detectedPixels[pix] = true;
166
167          }
168        }
169        delete [] world;
170      }
171
172    }
173   
174    delete [] zArray;
175    delete [] isObj;
176
177    return detectedPixels;
178
179  }
180
181
182}
Note: See TracBrowser for help on using the repository browser.