source: trunk/src/NROFiller.cpp @ 2289

Last change on this file since 2289 was 2289, checked in by ShinnosukeKawakami, 13 years ago

merged parallel branch to trunk

File size: 6.6 KB
Line 
1//
2// C++ Interface: NROFiller
3//
4// Description:
5// This class is a concrete class that derives from FillerBase class.
6// The class implements the following methods to be able to read NRO
7// data (45m and ASTE).
8//
9//    open()
10//    close()
11//    fill()
12//
13//
14// Author: Takeshi Nakazato <takeshi.nakazato@nao.ac.jp>, (C) 2010
15//
16// Copyright: See COPYING file that comes with this distribution
17//
18//
19
20#include "NROFiller.h"
21#include "STHeader.h"
22#include <casa/Containers/Record.h>
23#include <casa/Quanta/MVTime.h>
24#include <atnf/PKSIO/SrcType.h>
25
26using namespace casa;
27
28namespace asap
29{
30NROFiller::NROFiller(CountedPtr<Scantable> stable)
31  : FillerBase(stable)
32{
33}
34
35NROFiller::~NROFiller()
36{
37  close() ;
38}
39
40  bool NROFiller::open(const std::string& filename, const Record& rec)
41{
42  bool status = true ;
43
44  // get appropriate reader object
45  String format ;
46  reader_ = getNROReader( filename, format ) ;
47  if ( reader_.null() == True ) {
48    status = false ;
49    return status ;
50  } 
51
52  // get header information
53  STHeader hdr ;
54  if ( reader_->getHeaderInfo( hdr.nchan,
55                               hdr.npol,
56                               hdr.nif,
57                               hdr.nbeam,
58                               hdr.observer,
59                               hdr.project,
60                               hdr.obstype,
61                               hdr.antennaname,
62                               hdr.antennaposition,
63                               hdr.equinox,
64                               hdr.freqref,
65                               hdr.reffreq,
66                               hdr.bandwidth,
67                               hdr.utc,
68                               hdr.fluxunit,
69                               hdr.epoch,
70                               hdr.poltype ) ) {
71    status = false ;
72    return status ;
73  }
74
75  // 2010/07/30 TBD: Do we need to set frame here?
76  table_->frequencies().setFrame( hdr.freqref, true ) ;
77  table_->frequencies().setFrame( hdr.freqref, false ) ;
78
79  // set Header
80  setHeader( hdr ) ;
81
82  return status ;
83}
84
85void NROFiller::fill()
86{
87  // for each row
88  uInt nRow = reader_->getRowNum() ;
89  vector< vector<double > > freqs ;
90  uInt scanno ;
91  uInt cycleno ;
92  uInt ifno ;
93  uInt beamno ;
94  uInt polno ;
95  vector<double> fqs ;
96  Vector<Double> restfreq ;
97  uInt refbeamno ;
98  Double scantime ;
99  Double interval ;
100  String srcname ;
101  String fieldname ;
102  Vector<Float> spectra ;
103  Vector<uChar> flagtra ;
104  Vector<Float> tsys ;
105  Vector<Double> direction ;
106  Float azimuth ;
107  Float elevation ;
108  Float parangle = 0.0 ;
109  Float opacity ;
110  uInt tcalid ;
111  Int fitid ;
112  uInt focusid ;
113  Float temperature ;
114  Float pressure ;
115  Float humidity ;
116  Float windvel ;
117  Float winddir ;
118  Double srcvel ;
119  Vector<Double> propermotion( 2, 0.0 ) ;
120  Vector<Double> srcdir ;
121  Vector<Double> scanrate( 2, 0.0 ) ;
122  Int rowCount = 0 ;
123
124  STHeader header = table_->getHeader() ;
125  String obsType = header.obstype.substr( 0, 3 ) ;
126  Vector<Float> defaultTcal( 1, 1.0 ) ;
127  String tcalTime = MVTime( header.utc ).string( MVTime::YMD ) ;
128
129  // TCAL subtable rows
130  setTcal( tcalTime, defaultTcal ) ;
131
132  // FOCUS subtable rows
133  setFocus( parangle ) ;
134
135  for ( Int irow = 0 ; irow < (Int)nRow ; irow++ ) {
136    // check scan intent
137    string scanType = reader_->getScanType( irow ) ;
138    SrcType::type srcType = SrcType::NOTYPE ;
139
140    // skip "ZERO" scan
141    if ( scanType.compare( 0, 4, "ZERO" ) == 0 ) {
142      continue ;
143    }
144
145    // set srcType
146    if ( obsType == "POS" || obsType == "BEA" ) {
147      if ( scanType.compare( 0, 2, "ON" ) == 0 )
148        srcType = SrcType::PSON ;
149      else if ( scanType.compare( 0, 3, "OFF" ) == 0 )
150        srcType = SrcType::PSOFF ;
151    }
152    else if ( obsType == "FRE" ) {
153      if ( scanType.compare( 0, 2, "ON" ) == 0 )
154        srcType = SrcType::FSON ;
155      else if ( scanType.compare( 0, 3, "OFF" ) == 0 )
156        srcType = SrcType::FSOFF ;
157    }
158 
159    // get scan ifnromation
160    if ( reader_->getScanInfo( irow,
161                               scanno,
162                               cycleno,
163                               ifno,
164                               beamno,
165                               polno,
166                               fqs,
167                               restfreq,
168                               refbeamno,
169                               scantime,
170                               interval,
171                               srcname,
172                               fieldname,
173                               spectra,
174                               flagtra,
175                               tsys,
176                               direction,
177                               azimuth,
178                               elevation,
179                               parangle,
180                               opacity,
181                               tcalid,
182                               fitid,
183                               focusid,
184                               temperature,
185                               pressure,
186                               humidity,
187                               windvel,
188                               winddir,
189                               srcvel,
190                               propermotion,
191                               srcdir,
192                               scanrate ) ) {
193      throw AipsError( "Failed to read scan record" ) ;
194      return ;
195    }
196
197    // set IDs and subtable rows
198    // FREQUENCIES subtable row
199    setFrequency( (Double)fqs[0], (Double)fqs[1], (Double)fqs[2] ) ;
200
201    // MOLECULES subtable row
202    setMolecule( restfreq ) ;
203
204    // WEATHER subtable row
205    float p = 7.5 * temperature / ( 273.3 + temperature ) ;
206    float sh = 6.11 * powf( 10, p ) ;
207    temperature += 273.15 ; // C->K
208    winddir *= C::degree ; // deg->rad
209    humidity /= sh ; // P_H2O->relative humidity
210    setWeather2( temperature, pressure, humidity, windvel, winddir ) ;
211
212    // set row attributes
213    // SPECTRA, FLAGTRA, and TSYS
214    setSpectrum( spectra, flagtra, tsys ) ;
215
216    // SCANNO, CYCLENO, IFNO, POLNO, and BEAMNO
217    setIndex( scanno, cycleno, ifno, polno, beamno ) ;
218
219    // REFBEAMNO
220    setReferenceBeam( (Int)refbeamno ) ;
221
222    // DIRECTION
223    setDirection( direction, azimuth, elevation ) ;
224
225    // TIME and INTERVAL
226    setTime( scantime, interval ) ;
227
228    // SRCNAME, SRCTYPE, FIELDNAME, SRCDIRECTION, SRCPROPERMOTION, and SRCVELOCITY
229    setSource( srcname, srcType, fieldname, srcdir, propermotion, srcvel ) ;
230
231    // SCANRATE
232    setScanRate( scanrate ) ;
233
234    // OPACITY
235    setOpacity( opacity ) ;
236
237    // finally, commit row
238    commitRow() ;
239
240    // count up number of row committed
241    rowCount++ ;
242  }
243}
244
245void NROFiller::close()
246{
247  if (reader_.null() != False) {
248    reader_ = 0;
249  }
250  table_ = 0;
251}
252
253};
254
Note: See TracBrowser for help on using the repository browser.