source: trunk/src/STCalTsys.cpp @ 2955

Last change on this file since 2955 was 2955, checked in by Takeshi Nakazato, 10 years ago

New Development: No

JIRA Issue: Yes CAS-6585, CAS-6571

Ready for Test: Yes

Interface Changes: Yes/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...

Added FLAGTRA column to sky and Tsys caltable.
To support previous versions of caltabls that don't have FLAGTRA
column, the code automatically add FLAGTRA column and initialize
it with initial value (uChar)0 if no FLAGTRA exists.


File size: 3.5 KB
Line 
1//
2// C++ Implementation: STCalTsys
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
15#include <casa/Arrays/ArrayMath.h>
16#include <casa/Logging/LogIO.h>
17
18#include "STSelector.h"
19#include "STCalTsys.h"
20#include "STDefs.h"
21#include <atnf/PKSIO/SrcType.h>
22
23using namespace std;
24using namespace casa;
25
26namespace asap {
27STCalTsys::STCalTsys(CountedPtr<Scantable> &s, vector<int> &iflist)
28  : STCalibration(s, "TSYS"),
29    iflist_(iflist),
30    tsysspw_(),
31    do_average_(false)
32{
33  applytable_ = new STCalTsysTable(*s);
34}
35
36STCalTsys::STCalTsys(CountedPtr<Scantable> &s, Record &iflist, bool average)
37  : STCalibration(s, "TSYS"),
38    iflist_(),
39    tsysspw_(iflist),
40    do_average_(average)
41{
42  iflist_.resize(tsysspw_.nfields());
43  for (uInt i = 0; i < tsysspw_.nfields(); ++i) {
44    iflist_[i] = std::atoi(tsysspw_.name(i).c_str());
45  }
46  applytable_ = new STCalTsysTable(*s);
47}
48
49void STCalTsys::setupSelector(const STSelector &sel)
50{
51  sel_ = sel;
52  vector<int> ifnos = sel_.getIFs();
53  if (ifnos.size() > 0) {
54    int nif = 0;
55    int nifOrg = iflist_.size();
56    vector<int> iflistNew(iflist_);
57    for (int i = 0; i < nifOrg; i++) {
58      if (find(ifnos.begin(), ifnos.end(), iflist_[i]) != ifnos.end()) {
59        iflistNew[nif] = iflist_[i];
60        ++nif;
61      }
62    }
63    if (nif == 0) {
64      LogIO os(LogOrigin("STCalTsys", "setupSelector", WHERE));
65      os << LogIO::SEVERE << "Selection contains no data." << LogIO::EXCEPTION;
66    }
67    sel_.setIFs(iflistNew);
68  }
69  else {
70    sel_.setIFs(iflist_);
71  }
72}
73
74void STCalTsys::appenddata(uInt scanno, uInt cycleno,
75                           uInt beamno, uInt ifno, uInt polno,
76                           uInt freqid, Double time, Float elevation,
77                           const Vector<Float> &any_data,
78                           const Vector<uChar> &channel_flag)
79{
80  STCalTsysTable *p = dynamic_cast<STCalTsysTable *>(&(*applytable_));
81  if (do_average_ && tsysspw_.isDefined(String::toString(ifno))) {
82    LogIO os(LogOrigin("STCalTsys", "appenddata", WHERE));
83    Vector<Float> averaged_data(any_data.size());
84    Vector<uChar> averaged_flag(any_data.size(), 0);
85    Float averaged_value = 0.0;
86    size_t num_value = 0;
87    Vector<Double> channel_range = tsysspw_.asArrayDouble(String::toString(ifno));
88    os << LogIO::DEBUGGING << "do averaging: channel range for IFNO " << ifno << " is " << channel_range << LogIO::POST;
89    for (uInt i = 1; i < channel_range.size(); i += 2) {
90      size_t start = (size_t)channel_range[i-1];
91      size_t end = std::min((size_t)channel_range[i] + 1, averaged_data.size());
92      os << LogIO::DEBUGGING << "start=" << start << ", end=" << end << LogIO::POST;
93      //Vector<Float> segment = any_data(Slice(start, end - 1, 1, False));
94      //averaged_value += sum(segment);
95      //num_value += segment.size();
96      float sum_per_segment = 0.0;
97      for (size_t j = start; j < end; ++j) {
98        sum_per_segment += any_data[j];
99      }
100      averaged_value += sum_per_segment;
101      num_value += end - start;
102    }
103    averaged_value /= (Float)num_value;
104    averaged_data = averaged_value;
105    os << LogIO::DEBUGGING << "averaged_data = " << averaged_data << LogIO::POST;
106    os << LogIO::DEBUGGING << "any_data = " << any_data << LogIO::POST;
107    p->appenddata(scanno, cycleno, beamno, ifno, polno,
108                  freqid, time, elevation, averaged_data,
109                  averaged_flag);
110  }
111  else {
112    p->appenddata(scanno, cycleno, beamno, ifno, polno,
113                  freqid, time, elevation, any_data,
114                  channel_flag);
115  }
116}
117
118}
Note: See TracBrowser for help on using the repository browser.