source: trunk/src/CalibrationManager.cpp @ 2922

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

New Development: No

JIRA Issue: Yes CAS-6382

Ready for Test: Yes

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: test_tsdcal2

Put in Release Notes: Yes/No?

Module(s): Module Names change impacts.

Description: Describe your changes here...

Define new method, setTsysSpwWithRange, to support channel averaging of Tsys.
Implementation is not completed so that it only supports similar
behavior with previous one (which is using setTsysSpw).


File size: 10.7 KB
Line 
1//
2// C++ Implementation: CalibrationManager
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#include <assert.h>
13
14#include <casa/Arrays/Vector.h>
15#include <casa/Exceptions/Error.h>
16#include <casa/Utilities/Assert.h>
17#include <casa/Utilities/Regex.h>
18#include <casa/BasicSL/String.h>
19#include <tables/Tables/Table.h>
20#include <tables/Tables/ScalarColumn.h>
21#include <measures/TableMeasures/ScalarMeasColumn.h>
22
23
24#include "CalibrationManager.h"
25#include "Scantable.h"
26#include "STCalTsys.h"
27#include "STCalSkyPSAlma.h"
28#include "STCalSkyOtfAlma.h"
29
30using namespace casa;
31using namespace std;
32
33namespace asap {
34
35CalibrationManager::CalibrationManager()
36  : target_(0),
37    calmode_(""),
38    spwlist_(0),
39    spwlist_withrange_()
40{
41  applicator_ = new STApplyCal();
42}
43
44CalibrationManager::~CalibrationManager()
45{
46}
47
48void CalibrationManager::setScantable(ScantableWrapper &s)
49{
50  os_.origin(LogOrigin("CalibrationManager","setScantable",WHERE));
51  os_ << LogIO::DEBUGGING << "set scantable object." << LogIO::POST;
52  target_ = s.getCP();
53}
54
55void CalibrationManager::setScantableByName(const string &s)
56{
57  os_.origin(LogOrigin("CalibrationManager","setScantableAsName",WHERE));
58  os_ << LogIO::DEBUGGING << "set scantable " << s << "." << LogIO::POST;
59  // always plain table
60  target_ = new Scantable(s, Table::Plain);
61}
62
63void CalibrationManager::addApplyTable(const string &c)
64{
65  STCalEnum::CalType caltype = STApplyTable::getCalType(c);
66  if (caltype == STCalEnum::CalTsys) {
67    addTsysTable(c);
68  }
69  else if (caltype != STCalEnum::NoType) {
70    // should be sky table
71    addSkyTable(c);
72  }
73  else {
74    os_.origin(LogOrigin("CalibrationManager","addCalTable",WHERE));
75    os_ << LogIO::WARN << "Table " << c << " is not ApplyTable." << LogIO::POST ;
76  }
77}
78
79void CalibrationManager::addSkyTable(const string &c)
80{
81  os_.origin(LogOrigin("CalibrationManager","addSkyTable",WHERE));
82  os_ << LogIO::DEBUGGING << "add STCalSkyTable " << c << "." << LogIO::POST;
83  skytables_.push_back(new STCalSkyTable(c));
84}
85
86void CalibrationManager::addTsysTable(const string &c)
87{
88  os_.origin(LogOrigin("CalibrationManager","addTsysTable",WHERE));
89  os_ << LogIO::DEBUGGING << "add STCalTsysTable " << c << "." << LogIO::POST;
90  tsystables_.push_back(new STCalTsysTable(c));
91}
92
93void CalibrationManager::setMode(const string &mode)
94{
95  os_.origin(LogOrigin("CalibrationManager","setMode",WHERE));
96  os_ << LogIO::DEBUGGING << "set calibration mode to " << mode << "." << LogIO::POST;
97  calmode_ = mode;
98  calmode_.upcase();
99}
100
101void CalibrationManager::setTimeInterpolation(const string &interp, int order)
102{
103  os_.origin(LogOrigin("CalibrationManager","setTimeInterpolation",WHERE));
104  os_ << LogIO::DEBUGGING << "set interpolation method for time axis to " << interp << "." <<  LogIO::POST;
105  applicator_->setTimeInterpolation(stringToInterpolationEnum(interp),
106                                    order);
107}
108
109void CalibrationManager::setFrequencyInterpolation(const string &interp, int order)
110{
111  os_.origin(LogOrigin("CalibrationManager","setFrequencyInterpolation",WHERE));
112  os_ << LogIO::DEBUGGING << "set interpolation method for frequency axis to " << interp << "." << LogIO::POST;
113  applicator_->setFrequencyInterpolation(stringToInterpolationEnum(interp),
114                                         order);
115}
116
117void CalibrationManager::setTsysTransfer(unsigned int from,
118                                         const vector<unsigned int> &to)
119{
120  os_.origin(LogOrigin("CalibrationManager","setTsysTransfer",WHERE));
121  os_ << LogIO::DEBUGGING << "associate Tsys IFNO " << from << " with science IFNO [";
122  for (size_t i = 0; i < to.size() ; i++) {
123    os_ << to[i];
124    if (i == to.size() - 1)
125      os_ << "].";
126    else
127      os_ << ", ";
128  }
129  os_ << LogIO::POST;
130  Vector<uInt> v(to);
131  applicator_->setTsysTransfer(from, v);
132}
133
134void CalibrationManager::setTsysSpw(const vector<int> &spwlist)
135{
136  os_.origin(LogOrigin("CalibrationManager","setTsysSpw",WHERE));
137  os_ << LogIO::DEBUGGING << "set IFNO for Tsys calibration to [";
138  for (size_t i = 0; i < spwlist.size() ; i++) {
139    os_ << spwlist[i];
140    if (i == spwlist.size() - 1)
141      os_ << "].";
142    else
143      os_ << ", ";
144  }
145  os_ << LogIO::POST;
146  spwlist_ = spwlist;
147}
148
149void CalibrationManager::setTsysSpwWithRange(const Record &spwlist, bool average)
150{
151  os_.origin(LogOrigin("CalibrationManager","setTsysSpw",WHERE));
152  os_ << LogIO::DEBUGGING << "set IFNO for Tsys calibration to " << LogIO::POST;
153  spwlist.print(os_.output());
154  os_ << LogIO::DEBUGGING << LogIO::POST;
155  os_ << LogIO::DEBUGGING << ((average) ? "with averaging" : "without averaging") << LogIO::POST;
156  spwlist_withrange_ = spwlist;
157}
158
159void CalibrationManager::resetCalSetup()
160{
161  os_.origin(LogOrigin("CalibrationManager","resetCalSetup",WHERE));
162  os_ << LogIO::DEBUGGING << "reset all calibration settings except target data ." << LogIO::POST;
163  applicator_->reset();
164  calmode_ = "";
165  spwlist_.clear();
166  spwlist_withrange_ = Record();
167}
168
169void CalibrationManager::reset()
170{
171  os_.origin(LogOrigin("CalibrationManager","reset",WHERE));
172  os_ << LogIO::DEBUGGING << "reset all calibration settings." << LogIO::POST;
173  applicator_->completeReset();
174  calmode_ = "";
175  spwlist_.clear();
176  spwlist_withrange_ = Record();
177}
178
179void CalibrationManager::calibrate()
180{
181  os_.origin(LogOrigin("CalibrationManager","calibrate",WHERE));
182  os_ << LogIO::DEBUGGING << "start calibration with mode " << calmode_ << "." << LogIO::POST;
183  //assert(!target_.null());
184  assert_<AipsError>(!target_.null(), "You have to set target scantable first.");
185  if (calmode_ == "TSYS") {
186    //assert(spwlist_.size() > 0);
187    if (spwlist_withrange_.empty()) {
188      assert_<AipsError>(spwlist_.size() > 0, "You have to set list of IFNOs for ATM calibration.");
189      STCalTsys cal(target_, spwlist_);
190      cal.calibrate();
191      tsystables_.push_back(cal.applytable());
192    }
193    else {
194      uInt nfield = spwlist_withrange_.nfields();
195      vector<int> spwlist(nfield);
196      for (uInt i = 0; i < nfield; ++i) {
197        spwlist[i] = std::atoi(spwlist_withrange_.name(i).c_str());
198      }
199      STCalTsys cal(target_, spwlist);
200      cal.calibrate();
201      tsystables_.push_back(cal.applytable());
202    }     
203  }
204  else if (calmode_ == "PS") {
205//     // will match DV01-25, DA41-65, PM01-04, CM01-12
206//     Regex reant("^(DV(0[1-9]|1[0-9]|2[0-5])|DA(4[1-9]|5[0-9]|6[0-5])|PM0[1-4]|CM(0[1-9]|1[1,2]))$");
207//     const String antname = target_->getAntennaName();
208//     if (reant.match(antname.c_str(), antname.size()) != String::npos) {
209    if (isAlmaAntenna()) {
210      os_ << LogIO::DEBUGGING << "ALMA specific position-switch calibration." << LogIO::POST;
211      STCalSkyPSAlma cal(target_);
212      cal.calibrate();
213      skytables_.push_back(cal.applytable());
214    }
215    else {
216      String msg = "Calibration type " + calmode_ + " for non-ALMA antenna " + target_->getAntennaName() + " is not supported.";
217      os_.origin(LogOrigin("CalibrationManager","calibrate",WHERE));
218      os_ << LogIO::SEVERE << msg << LogIO::POST;
219      throw AipsError(msg);
220    }     
221  }
222  else if (calmode_ == "OTF" || calmode_ == "OTFRASTER") {
223    if (isAlmaAntenna()) {
224      os_ << LogIO::DEBUGGING << "ALMA specific position-switch calibration." << LogIO::POST;
225      STCalSkyOtfAlma cal(target_, (calmode_ == "OTFRASTER"));
226      if (!options_.empty())
227        cal.setOption(options_);
228      cal.calibrate();
229      skytables_.push_back(cal.applytable());
230    }
231    else {
232      String msg = "Calibration type " + calmode_ + " for non-ALMA antenna " + target_->getAntennaName() + " is not supported.";
233      os_.origin(LogOrigin("CalibrationManager","calibrate",WHERE));
234      os_ << LogIO::SEVERE << msg << LogIO::POST;
235      throw AipsError(msg);
236    }     
237  }
238  else {
239    String msg = "Calibration type " + calmode_ + " is not supported.";
240    os_.origin(LogOrigin("CalibrationManager","calibrate",WHERE));
241    os_ << LogIO::SEVERE << msg << LogIO::POST;
242    throw AipsError(msg);
243  }
244}
245
246void CalibrationManager::apply(bool insitu, bool filltsys)
247{
248  os_.origin(LogOrigin("CalibrationManager","apply",WHERE));
249  os_ << LogIO::DEBUGGING << "apply calibration to the data." << LogIO::POST;
250  applicator_->setTarget(target_);
251  for (size_t i = 0; i < tsystables_.size() ; i++)
252    applicator_->push(dynamic_cast<STCalTsysTable*>(&(*tsystables_[i])));
253  for (size_t i = 0; i < skytables_.size(); i++)
254    applicator_->push(dynamic_cast<STCalSkyTable*>(&(*skytables_[i])));
255  applicator_->apply(insitu, filltsys);
256}
257
258void CalibrationManager::saveCaltable(const string &name)
259{
260  os_.origin(LogOrigin("CalibrationManager","saveCaltable",WHERE));
261  if (calmode_ == "TSYS") {
262    //assert(tsystables_.size() > 0);
263    assert_<AipsError>(tsystables_.size() > 0, "Tsys table list is empty.");
264    os_ << LogIO::DEBUGGING << "save latest STCalTsysTable as " << name << "." << LogIO::POST;
265    tsystables_[tsystables_.size()-1]->save(name);
266  }
267  else {
268    //assert(skytables_.size() > 0);
269    assert_<AipsError>(skytables_.size() > 0, "Sky table list is empty.");
270    os_ << LogIO::DEBUGGING << "save latest STCalSkyTable as " << name << "." << LogIO::POST;
271    skytables_[skytables_.size()-1]->save(name);
272  }
273}
274
275void CalibrationManager::split(const string &name)
276{
277  os_.origin(LogOrigin("CalibrationManager","split",WHERE));
278  os_ << LogIO::DEBUGGING << "split science data and save them to " << name << "." << LogIO::POST;
279  applicator_->save(name);
280}
281
282STCalEnum::InterpolationType CalibrationManager::stringToInterpolationEnum(const string &s)
283{
284  String itype(s);
285  itype.upcase();
286  const Char *c = itype.c_str();
287  String::size_type len = itype.size();
288  Regex nearest("^NEAREST(NEIGHBOR)?$");
289  Regex linear("^LINEAR$");
290  Regex spline("^(C(UBIC)?)?SPLINE$");
291  Regex poly("^POLY(NOMIAL)?$");
292  if (nearest.match(c, len) != String::npos) {
293    return STCalEnum::NearestInterpolation;
294  }
295  else if (linear.match(c, len) != String::npos) {
296    return STCalEnum::LinearInterpolation;
297  }
298  else if (spline.match(c, len) != String::npos) {
299    return STCalEnum::CubicSplineInterpolation;
300  }
301  else if (poly.match(c, len) != String::npos) {
302    return STCalEnum::PolynomialInterpolation;
303  }
304
305  os_.origin(LogOrigin("CalibrationManager","stringToInterpolationEnum",WHERE));
306  os_ << LogIO::WARN << "Interpolation type " << s << " is not available. Use default interpolation method." << LogIO::POST;
307  return STCalEnum::DefaultInterpolation;
308}
309
310Bool CalibrationManager::isAlmaAntenna()
311{
312  assert_<AipsError>(!target_.null(), "You have to set target scantable first.");
313  // will match DV01-25, DA41-65, PM01-04, CM01-12
314  Regex reant("^(DV(0[1-9]|1[0-9]|2[0-5])|DA(4[1-9]|5[0-9]|6[0-5])|PM0[1-4]|CM(0[1-9]|1[1,2]))$");
315  const String antname = target_->getAntennaName();
316  return (reant.match(antname.c_str(), antname.size()) != String::npos);
317}
318
319}
Note: See TracBrowser for help on using the repository browser.