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

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

A couple of int --> size_t conversions.

File size: 3.7 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 getBaseline routine, specialised for the
42    ///  Cube data structure. Calls getBaseline 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    ProgressBar bar;
53    if(this->par.isVerbose()) bar.init(numSpec);
54    for(size_t pix=0; pix<numSpec; pix++){ // for each spatial pixel...
55
56      if(this->par.isVerbose() ) bar.update(pix+1);
57
58      for(size_t z=0; z<this->axisDim[2]; z++) 
59        spec[z] = this->array[z*numSpec + pix];
60
61      getBaseline(this->axisDim[2], spec, thisBaseline, this->par);
62
63      for(size_t z=0; z<this->axisDim[2]; z++) {
64        this->baseline[z*numSpec+pix] = thisBaseline[z];
65        if(!par.isBlank(this->array[z*numSpec+pix])){
66          this->array[z*numSpec+pix] -= thisBaseline[z];
67          if(this->reconExists) this->recon[z*numSpec+pix] -= thisBaseline[z];
68        }     
69      }
70
71    } 
72
73    delete [] spec;
74    delete [] thisBaseline;
75 
76    if(this->par.isVerbose()) bar.remove();
77  }
78
79
80
81  void Cube::replaceBaseline()
82  {
83    /// @details
84    ///  A routine to replace the baseline flux on the reconstructed array
85    ///   (if it exists) and the fluxes of each of the detected objects (if any).
86
87    if(this->par.getFlagBaseline()){
88
89      for(size_t i=0;i<this->numPixels;i++){
90        if(!(this->par.isBlank(this->array[i])))
91          this->array[i] += this->baseline[i];
92      }
93
94      if(this->reconExists){
95        // if we made a reconstruction, we need to add the baseline back in
96        //   for plotting purposes
97        for(size_t i=0;i<this->numPixels;i++){
98          if(!(this->par.isBlank(this->array[i])))
99            this->recon[i] += this->baseline[i];
100        }
101      }
102 
103      std::vector<Detection>::iterator obj;
104      for(obj=this->objectList->begin();obj<this->objectList->end();obj++){
105        // for each detection, correct the flux calculations.
106        obj->calcFluxes(this->array, this->axisDim);
107      }
108   
109    }
110
111  }
112
113}
Note: See TracBrowser for help on using the repository browser.