source: trunk/src/RowAccumulator.cpp @ 2141

Last change on this file since 2141 was 2141, checked in by WataruKawasaki, 13 years ago

New Development: No

JIRA Issue: No

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs:

Put in Release Notes: No

Module(s):

Description: bugfix in RowAccumulator::add()


File size: 5.5 KB
RevLine 
[814]1//
2// C++ Implementation: RowAccumulator
3//
4// Description:
5//
6//
7// Author: Malte Marquarding <Malte.Marquarding@csiro.au>, (C) 2005
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
[2125]12
[814]13#include <casa/iomanip.h>
14#include <casa/Arrays/MaskArrMath.h>
[1314]15#include <casa/Arrays/MaskArrLogi.h>
[814]16#include <casa/Arrays/ArrayMath.h>
[1314]17#include <casa/Arrays/ArrayLogical.h>
[814]18#include "RowAccumulator.h"
19
20using namespace casa;
21using namespace asap;
22
[2125]23RowAccumulator::RowAccumulator(WeightType wt) : weightType_(wt), initialized_(False)
[814]24{
25  reset();
26}
27
28RowAccumulator::~RowAccumulator()
29{
30}
31
32
[2125]33void RowAccumulator::reset(const uInt size, const uInt tsysSize)
[814]34{
[2125]35  Vector<Bool> m(size, True);
36
37  spectrum_.setData(Vector<Float>(size, 0.0), Vector<Bool>(size, True));
38  spectrumNoMask_.setData(Vector<Float>(size, 0.0), Vector<Bool>(size, True));
39
40  n_.setData(Vector<uInt>(size, 0), Vector<Bool>(size, True));
41  nNoMask_.setData(Vector<uInt>(size, 0), Vector<Bool>(size, True));
42
43  weightSum_.setData(Vector<Float>(size, 0.0), Vector<Bool>(size, True));
44  weightSumNoMask_.setData(Vector<Float>(size, 0.0), Vector<Bool>(size, True));
45
46  tsysSum_.resize(tsysSize); tsysSum_=0.0;
47  tsysSumNoMask_.resize(tsysSize); tsysSumNoMask_=0.0;
48
49  intervalSum_ = 0.0;
50  intervalSumNoMask_ = 0.0;
51
52  timeSum_ = 0.0;
53  timeSumNoMask_ = 0.0;
[2135]54
55  initialized_ = False;
[2125]56}
57
58void RowAccumulator::initialize(const uInt size, const uInt tsysSize)
59{
[2135]60  reset(size, tsysSize);
61  initialized_ = True;
[2125]62}
63
64void RowAccumulator::add(const Vector<Float>& v,
65                         const Vector<Bool>& m,
66                         const Vector<Float>& tsys,
67                         const Double interval,
68                         const Double time)
69{
70  uInt size = v.nelements();
71  //if (size != m.nelements()) raiseError;
72  if (!initialized_) initialize(size, tsys.nelements());
73
74  addSpectrum(v, m, tsys, interval, time);
75}
76
77void RowAccumulator::addSpectrum(const Vector<Float>& v,
78                                 const Vector<Bool>& m,
79                                 const Vector<Float>& tsys,
80                                 const Double interval,
81                                 const Double time)
82{
83  doAddSpectrum(v, m, tsys, interval, time, False);
84  doAddSpectrum(v, m, tsys, interval, time, True);  // CAS-2776
85}
86
87void RowAccumulator::doAddSpectrum(const Vector<Float>& v,
88                                   const Vector<Bool>& m,
89                                   const Vector<Float>& tsys,
90                                   const Double interval,
91                                   const Double time,
[2141]92                                   const Bool inverseMask)
[2125]93{
94  Vector<Float> vUse = v.copy();
95  Vector<Bool> mUse = m.copy();
[2141]96  if (inverseMask) mUse = !mUse;
[2125]97  MaskedArray<Float> vadd(vUse, mUse);
[2141]98  Float totalWeight = getTotalWeight(vadd, tsys, interval, time, inverseMask);
[2125]99  vadd *= totalWeight;
100  MaskedArray<Float> wadd(Vector<Float>(mUse.nelements(), totalWeight), mUse);
101  MaskedArray<uInt> inc(Vector<uInt>(mUse.nelements(), 1), mUse);
102
[2141]103  if (inverseMask) {
[2125]104    spectrumNoMask_ += vadd;
105    weightSumNoMask_ += wadd;
106    nNoMask_ += inc;
107  } else {
108    spectrum_ += vadd;
109    weightSum_ += wadd;
110    n_ += inc;
[814]111  }
112}
113
[2125]114Float RowAccumulator::getTotalWeight(const MaskedArray<Float>& data,
115                                     const Vector<Float>& tsys,
116                                     const Double interval,
117                                     const Double time,
[2141]118                                     const Bool inverseMask)
[814]119{
[2125]120  Float totalWeight = 1.0;
121  Vector<Bool> m = data.getMask();
122  if (!allEQ(m, False)) {  // only add these if not everything masked
[2141]123    totalWeight *= addTsys(tsys, inverseMask);
124    totalWeight *= addInterval(interval, inverseMask);
125    addTime(time, inverseMask);
[2125]126
[2141]127    if (weightType_ == W_VAR) {
128      Float fac = 1.0/variance(data);
129      if (!inverseMask && (m.nelements() == userMask_.nelements()))
130        fac = 1.0/variance(data(userMask_));
[2125]131
[2141]132      totalWeight *= fac;
133    }
[2125]134  }
135
136  return totalWeight;
[814]137}
138
[2141]139Float RowAccumulator::addTsys(const Vector<Float>& v, Bool inverseMask)
[814]140{
141  // @fixme this assume tsys is the same for all channels
142
143  Float w = 1.0;
[2141]144  if (inverseMask) {
[2125]145    tsysSumNoMask_ += v[0];
146  } else {
147    tsysSum_ += v[0];
148  }
149  if ( weightType_ == W_TSYS  || weightType_ == W_TINTSYS ) {
[814]150    w /= (v[0]*v[0]);
151  }
152  return w;
153}
154
[2141]155void RowAccumulator::addTime(Double t, Bool inverseMask)
[814]156{
[2141]157  if (inverseMask) {
[2125]158    timeSumNoMask_ += t;
159  } else {
160    timeSum_ += t;
161  }
[814]162}
163
[2141]164Float RowAccumulator::addInterval(Double inter, Bool inverseMask)
[814]165{
166  Float w = 1.0;
[2141]167  if (inverseMask) {
[2125]168    intervalSumNoMask_ += inter;
169  } else {
170    intervalSum_ += inter;
171  }
172  if (weightType_ == W_TINT || weightType_ == W_TINTSYS) {
[814]173    w /= Float(inter);
174  }
175  return w;
176}
177
[2125]178Vector<Float> RowAccumulator::getSpectrum() const
[814]179{
180  return (spectrum_/weightSum_).getArray();
181}
182
[2125]183Double RowAccumulator::getTime() const
[814]184{
[2125]185  return timeSum_/Float(max(n_));
[814]186}
187
[2125]188Double RowAccumulator::getInterval() const
[814]189{
190  return intervalSum_;
191}
192
[2125]193Vector<Bool> RowAccumulator::getMask() const
[814]194{
[1352]195  // Return the "total" mask - False where no points have been accumulated.
[1398]196  return (n_.getArray() > uInt(0));
[814]197}
198
[2125]199Vector<Float> RowAccumulator::getTsys() const
[814]200{
[1314]201  // @fixme this assumes tsys.nelements() == 1
[1398]202  return tsysSum_/Float(max(n_));
[814]203}
204
[2125]205void RowAccumulator::setUserMask(const Vector<Bool>& m)
[814]206{
207  userMask_.resize();
208  userMask_ = m;
209}
[1819]210
211// Added by TT  check the state of RowAccumulator
[2125]212Bool RowAccumulator::state() const
[1819]213{
214  return initialized_;
215}
216
[2125]217void RowAccumulator::replaceNaN()
218{
219  Vector<Float> v = spectrum_.getArray();
220  Vector<Float> w = weightSum_.getArray();
221  Vector<Float> vRef = spectrumNoMask_.getArray();
222  Vector<Float> wRef = weightSumNoMask_.getArray();
223
224  for (uInt i = 0; i < v.size(); ++i) {
225    if (w[i] == 0.0) {
226      v[i] = vRef[i];
227      w[i] = wRef[i];
228    }
229  }
230
231  spectrum_.setData(v, Vector<Bool>(v.nelements(), True));
232  weightSum_.setData(w, Vector<Bool>(w.nelements(), True));
233}
Note: See TracBrowser for help on using the repository browser.