source: trunk/src/Cubes/baseline.cc @ 1276

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

Ticket #107 - Recording the new baseline-related parameters in the various forms of parameter-output. Removing a diagnostic message.

File size: 4.1 KB
Line 
1// -----------------------------------------------------------------------
2// baseline.cc: Removing and replacing the spectral baseline of a 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 <duchamp/param.hh>
31#include <duchamp/ATrous/atrous.hh>
32#include <duchamp/Cubes/cubes.hh>
33#include <duchamp/Utils/feedback.hh>
34
35namespace duchamp
36{
37
38  void Cube::removeBaseline()
39  {
40    /// @details
41    ///  A front-end to the findAtrousBaseline routine, specialised for the
42    ///  Cube data structure. Calls findAtrousBaseline on each spectrum individually.
43    ///  Upon exit, the original array minus its spectral baseline is stored
44    ///   in this->array and the baseline is in this->baseline.
45    ///  If the reconstructed array exists, the baseline is subtracted from
46    ///   it as well.
47
48    float *spec     = new float[this->axisDim[2]];
49    float *thisBaseline = new float[this->axisDim[2]];
50    size_t numSpec = this->axisDim[0]*this->axisDim[1];
51
52    // if(this->par.getBaselineType()=="median")
53    //  std::cout << "Finding median baseline with box width " << this->par.getBaselineBoxWidth() <<"\n";
54
55    ProgressBar bar;
56    if(this->par.isVerbose()) bar.init(numSpec);
57    for(size_t pix=0; pix<numSpec; pix++){ // for each spatial pixel...
58
59      if(this->par.isVerbose() ) bar.update(pix+1);
60
61      for(size_t z=0; z<this->axisDim[2]; z++) 
62        spec[z] = this->array[z*numSpec + pix];
63
64      if(this->par.getBaselineType()=="atrous")
65          findAtrousBaseline(this->axisDim[2], spec, thisBaseline, this->par);
66      else
67          findMedianBaseline(this->axisDim[2], spec, this->par.getBaselineBoxWidth(), thisBaseline);
68
69      for(size_t z=0; z<this->axisDim[2]; z++) {
70        this->baseline[z*numSpec+pix] = thisBaseline[z];
71        if(!par.isBlank(this->array[z*numSpec+pix])){
72          this->array[z*numSpec+pix] -= thisBaseline[z];
73          if(this->reconExists) this->recon[z*numSpec+pix] -= thisBaseline[z];
74        }     
75      }
76
77    } 
78
79    delete [] spec;
80    delete [] thisBaseline;
81 
82    if(this->par.isVerbose()) bar.remove();
83  }
84
85
86
87  void Cube::replaceBaseline()
88  {
89    /// @details
90    ///  A routine to replace the baseline flux on the reconstructed array
91    ///   (if it exists) and the fluxes of each of the detected objects (if any).
92
93    if(this->par.getFlagBaseline()){
94
95      for(size_t i=0;i<this->numPixels;i++){
96        if(!(this->par.isBlank(this->array[i])))
97          this->array[i] += this->baseline[i];
98      }
99
100      if(this->reconExists){
101        // if we made a reconstruction, we need to add the baseline back in
102        //   for plotting purposes
103        for(size_t i=0;i<this->numPixels;i++){
104          if(!(this->par.isBlank(this->array[i])))
105            this->recon[i] += this->baseline[i];
106        }
107      }
108 
109      std::vector<Detection>::iterator obj;
110      for(obj=this->objectList->begin();obj<this->objectList->end();obj++){
111        // for each detection, correct the flux calculations.
112        obj->calcFluxes(this->array, this->axisDim);
113      }
114   
115    }
116
117  }
118
119}
Note: See TracBrowser for help on using the repository browser.