source: trunk/src/Cubes/CubicSearch.cc @ 1246

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

Ticket #193 - Removing all the MW-related code. Most of it was commented out, but Param now no longer has anything referring to MW. The flag array in ObjectGrower? has also changed to FLAG from MW.

File size: 8.0 KB
Line 
1// -----------------------------------------------------------------------
2// CubicSearch.cc: Searching a 3-dimensional 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 <fstream>
31#include <vector>
32#include <duchamp/param.hh>
33#include <duchamp/PixelMap/Object3D.hh>
34#include <duchamp/Cubes/cubes.hh>
35#include <duchamp/Utils/utils.hh>
36#include <duchamp/Utils/feedback.hh>
37#include <duchamp/Utils/Statistics.hh>
38
39using std::vector;
40using namespace PixelInfo;
41using namespace Statistics;
42
43namespace duchamp
44{
45
46void Cube::CubicSearch()
47{
48  /// @details
49  ///  A front end to the cubic searching routine that does not
50  ///  involve any wavelet reconstruction.
51  ///  The statistics of the cube are calculated first of all.
52  ///  If baseline-removal is required that is done prior to searching.
53  ///  Once searching is complete, the detection map is updated and
54  ///  the intermediate detections are logged in the log file.
55
56  if(this->par.isVerbose()) std::cout << "  ";
57
58  this->setCubeStats();
59   
60  if(this->par.isVerbose()) std::cout << "  Searching... " << std::flush;
61 
62  *this->objectList = search3DArray(this->axisDim,this->array,
63                                    this->par,this->Stats);
64
65  if(this->par.isVerbose()) std::cout << "  Updating detection map... "
66                                      << std::flush;
67  this->updateDetectMap();
68  if(this->par.isVerbose()) std::cout << "Done.\n";
69
70  if(this->par.getFlagLog()){
71    if(this->par.isVerbose())
72      std::cout << "  Logging intermediate detections... " << std::flush;
73    this->logDetectionList();
74    if(this->par.isVerbose()) std::cout << "Done.\n";
75  }
76
77}
78//---------------------------------------------------------------
79
80std::vector <Detection> search3DArray(size_t *dim, float *Array, Param &par,
81                                      StatsContainer<float> &stats)
82{
83
84  if(par.getSearchType()=="spectral")
85    return search3DArraySpectral(dim,Array,par,stats);
86  else if(par.getSearchType()=="spatial")
87    return search3DArraySpatial(dim,Array,par,stats);
88  else{
89    DUCHAMPERROR("search3DArray","Unknown search type : " << par.getSearchType());
90    return std::vector<Detection>(0);
91  }
92}
93//---------------------------------------------------------------
94
95
96std::vector <Detection> search3DArraySpectral(size_t *dim, float *Array, Param &par,
97                                              StatsContainer<float> &stats)
98{
99  /// @details
100  ///  Takes a dimension array and data array as input (and Parameter set)
101  ///  and searches for detections in just the 1D spectra.
102  ///  Returns a vector list of Detections.
103  ///  No reconstruction is assumed to have taken place, so statistics are
104  ///  calculated (using robust methods) from the data array itself.
105  /// \param dim Array of dimension sizes for the data array.
106  /// \param Array Array of data.
107  /// \param par Param set defining how to do detection, and what a
108  /// BLANK pixel is etc.
109  /// \param stats The statistics that define what a detection is.
110  /// \return Vector of detected objects.
111
112  std::vector <Detection> outputList;
113  size_t zdim = dim[2];
114  size_t xySize = dim[0] * dim[1];
115  int num = 0;
116
117  if(zdim>1){
118   
119    ProgressBar bar;
120    if(par.isVerbose()) bar.init(xySize);
121
122    bool *doPixel = new bool[xySize];
123//    std::vector<bool> flaggedChans=par.getChannelFlags(zdim);
124    for(size_t npix=0; npix<xySize; npix++){
125      doPixel[npix] = false;
126      for(size_t z=0;z<zdim;z++){
127        doPixel[npix] = doPixel[npix] ||
128//          (!par.isBlank(Array[npix+xySize*z]) && !flaggedChans[z]);
129            (!par.isBlank(Array[npix+xySize*z]) && !par.isFlaggedChannel(z));
130      }
131      // doPixel[i] is false only when there are no good pixels in spectrum
132      //  of pixel #i.
133    }
134
135    size_t *specdim = new size_t[2];
136    specdim[0] = zdim; specdim[1]=1;
137    Image *spectrum = new Image(specdim);
138    delete [] specdim;
139    spectrum->saveParam(par);
140    spectrum->saveStats(stats);
141    //    spectrum->setMinSize(par.getMinChannels());
142    spectrum->setMinSize(1);
143
144    for(size_t y=0; y<dim[1]; y++){
145      for(size_t x=0; x<dim[0]; x++){
146
147        size_t npix = y*dim[0] + x;
148        if( par.isVerbose() ) bar.update(npix+1);
149       
150        if(doPixel[npix]){
151          spectrum->extractSpectrum(Array,dim,npix);
152          spectrum->removeFlaggedChannels();
153          std::vector<Scan> objlist = spectrum->findSources1D();
154          std::vector<Scan>::iterator obj;
155          num += objlist.size();
156          for(obj=objlist.begin();obj<objlist.end();obj++){
157            Detection newObject;
158            // Fix up coordinates of each pixel to match original array
159            for(int z=obj->getX();z<=obj->getXmax();z++) {
160              newObject.addPixel(x,y,z);
161            }
162            newObject.setOffsets(par);
163            if(par.getFlagTwoStageMerging()) mergeIntoList(newObject,outputList,par);
164            else outputList.push_back(newObject);
165          }
166        }
167      }
168    }
169
170    delete spectrum;
171    delete [] doPixel;
172 
173
174    if(par.isVerbose()){
175      bar.remove();
176      std::cout << "Found " << num << ".\n";
177    }
178
179  }
180
181  return outputList;
182}
183//---------------------------------------------------------------
184
185std::vector <Detection> search3DArraySpatial(size_t *dim, float *Array,
186                                             Param &par,
187                                             StatsContainer<float> &stats)
188{
189  /// @details
190  ///  Takes a dimension array and data array as input (and Parameter
191  ///  set) and searches for detections just in the channel maps -- no
192  ///  1D searches are done. 
193  ///  Returns a vector list of Detections.
194  ///  No reconstruction is assumed to have taken place, so only the base
195  ///  data array is searched.
196  /// \param dim Array of dimension sizes for the data array.
197  /// \param Array Array of data.
198  /// \param par Param set defining how to do detection, and what a
199  ///              BLANK pixel is etc.
200  /// \param stats The statistics that define what a detection is.
201  /// \return A std::vector of detected objects.
202
203  std::vector <Detection> outputList;
204  size_t zdim = dim[2];
205  int num = 0;
206
207  ProgressBar bar;
208  bool useBar = (zdim>1);
209  if(useBar && par.isVerbose()) bar.init(zdim);
210 
211  size_t *imdim = new size_t[2];
212  imdim[0] = dim[0]; imdim[1] = dim[1];
213  Image *channelImage = new Image(imdim);
214  delete [] imdim;
215  channelImage->saveParam(par);
216  channelImage->saveStats(stats);
217  channelImage->setMinSize(1);
218
219//  std::vector<bool> flaggedChans=par.getChannelFlags(zdim);
220  for(size_t z=0; z<zdim; z++){
221
222    if( par.isVerbose() && useBar ) bar.update(z+1);
223
224//    if(!flaggedChans[z]){
225    if(!par.isFlaggedChannel(z)){
226
227      channelImage->extractImage(Array,dim,z);
228      std::vector<Object2D> objlist = channelImage->findSources2D();
229      std::vector<Object2D>::iterator obj;
230      num += objlist.size();
231      for(obj=objlist.begin();obj!=objlist.end();obj++){
232        Detection newObject;
233        newObject.addChannel(z,*obj);
234        newObject.setOffsets(par);
235        if(par.getFlagTwoStageMerging()) mergeIntoList(newObject,outputList,par);
236        else outputList.push_back(newObject);
237      }
238    }
239
240  }
241
242  delete channelImage;
243
244  if(par.isVerbose()){
245    if(useBar) bar.remove();
246    std::cout << "Found " << num << ".\n";
247  }
248
249  return outputList;
250}
251
252
253}
Note: See TracBrowser for help on using the repository browser.