source: trunk/src/STCalSkyPSAlma.cpp @ 2749

Last change on this file since 2749 was 2749, checked in by Takeshi Nakazato, 11 years ago

New Development: No

JIRA Issue: Yes CAS-4770

Ready for Test: Yes

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: List test programs

Put in Release Notes: Yes/No?

Module(s): Module Names change impacts.

Description: Describe your changes here...

Bug fix for the case when only one row is selected in a certain iteration
loop.


File size: 4.0 KB
Line 
1//
2// C++ Implementation: STCalSkyPSAlma
3//
4// Description:
5//
6//
7// Author: Takeshi Nakazato <takeshi.nakazato@nao.ac.jp> (C) 2012
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12
13#include <vector>
14#include "STSelector.h"
15#include "STCalSkyPSAlma.h"
16#include "RowAccumulator.h"
17#include "STIdxIter.h"
18#include "STDefs.h"
19#include <atnf/PKSIO/SrcType.h>
20
21using namespace std;
22using namespace casa;
23
24namespace asap {
25STCalSkyPSAlma::STCalSkyPSAlma(CountedPtr<Scantable> &s)
26  : STCalibration(s)
27{
28  applytable_ = new STCalSkyTable(*s, "PSALMA");
29}
30
31void STCalSkyPSAlma::setupSelector()
32{
33  sel_.reset();
34  vector<int> types(1,SrcType::PSOFF);
35  sel_.setTypes(types);
36}
37
38void STCalSkyPSAlma::fillCalTable()
39{
40  RowAccumulator acc(W_TINT);
41 
42  vector<string> cols(3);
43  cols[0] = "IFNO";
44  cols[1] = "POLNO";
45  cols[2] = "BEAMNO";
46  STIdxIterAcc iter(scantable_, cols);
47
48  ROScalarColumn<Double> *tcol = new ROScalarColumn<Double>(scantable_->table(), "TIME");
49  Vector<Double> timeSec = tcol->getColumn() * 86400.0;
50  tcol->attach(scantable_->table(), "INTERVAL");
51  Vector<Double> intervalSec = tcol->getColumn();
52  delete tcol;
53  ROScalarColumn<Float> *ecol = new ROScalarColumn<Float>(scantable_->table(), "ELEVATION");
54  Vector<Float> elevation = ecol->getColumn();
55  delete ecol;
56
57  ROArrayColumn<Float> specCol(scantable_->table(), "SPECTRA");
58  ROArrayColumn<uChar> flagCol(scantable_->table(), "FLAGTRA");
59  ROScalarColumn<uInt> freqidCol(scantable_->table(), "FREQ_ID");
60
61  // dummy Tsys: the following process doesn't need Tsys but RowAccumulator
62  //             requires to set it with spectral data
63  Vector<Float> tsys(1, 1.0);
64
65  Double timeCen = 0.0;
66  Float elCen = 0.0;
67  uInt count = 0;
68
69  while(!iter.pastEnd()) {
70    Vector<uInt> rows = iter.getRows(SHARE);
71    Vector<uInt> current = iter.current();
72    uInt len = rows.nelements();
73    if (len == 0) {
74      iter.next();
75      continue;
76    }
77    else if (len == 1) {
78      STCalSkyTable *p = dynamic_cast<STCalSkyTable *>(&(*applytable_));
79      uInt irow = rows[0];
80      p->appenddata(0, 0, current[2], current[0], current[1],
81                    freqidCol(irow), timeSec[irow], elevation[irow], specCol(irow));
82      iter.next();
83      continue;
84    }
85   
86    uInt nchan = scantable_->nchan(scantable_->getIF(rows[0]));
87    Vector<uChar> flag(nchan);
88    Vector<Bool> bflag(nchan);
89    Vector<Float> spec(nchan);
90
91    Vector<Double> timeSep(len);
92    for (uInt i = 0; i < len-1; i++) {
93      timeSep[i] = timeSec[rows[i+1]] - timeSec[rows[i]] ;
94    }
95    Double tMedian = median(timeSep(IPosition(1,0), IPosition(1,len-2)));
96    timeSep[len-1] = tMedian * 10000.0 ; // any large value
97
98    uInt irow ;
99    uInt jrow ;
100    for (uInt i = 0; i < len; i++) {
101      irow = rows[i];
102      jrow = (i < len-1) ? rows[i+1] : rows[i];
103      // accumulate data
104      flagCol.get(irow, flag);
105      convertArray(bflag, flag);
106      specCol.get(irow, spec);
107      if ( !allEQ(bflag,True) )
108        acc.add( spec, !bflag, tsys, intervalSec[irow], timeSec[irow] ) ;
109      timeCen += timeSec[irow];
110      elCen += elevation[irow];
111      count++;
112
113      // check time gap
114      double gap = 2.0 * timeSep[i] / (intervalSec[jrow] + intervalSec[irow]);
115      if ( gap > 1.1 ) {
116        if ( acc.state() ) {
117          acc.replaceNaN() ;
118//           const Vector<Bool> &msk = acc.getMask();
119//           convertArray(flag, !msk);
120//           for (uInt k = 0; k < nchan; ++k) {
121//             uChar userFlag = 1 << 7;
122//             if (msk[k]==True) userFlag = 0 << 7;
123//             flag(k) = userFlag;
124//           }
125          timeCen /= (Double)count * 86400.0; // sec->day
126          elCen /= (Float)count;
127          STCalSkyTable *p = dynamic_cast<STCalSkyTable *>(&(*applytable_));
128          p->appenddata(0, 0, current[2], current[0], current[1],
129                        freqidCol(irow), timeCen, elCen, acc.getSpectrum());
130        }
131        acc.reset() ;
132        timeCen = 0.0;
133        elCen = 0.0;
134        count = 0;
135      }
136    }
137
138    iter.next() ;
139  }
140}
141
142}
Note: See TracBrowser for help on using the repository browser.