source: branches/parallel/src/NROFiller.cpp @ 2262

Last change on this file since 2262 was 2262, checked in by Takeshi Nakazato, 13 years ago

New Development: No

JIRA Issue: No

Ready for Test: No

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...

Preparation for check in tuning on NRO filler.
Merge changes in trunk.

r2154
r2156
r2158
r2198-2203
r2212
r2261


File size: 6.7 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  Array<Float> spectra ;
103  Array<uChar> flagtra ;
104  Array<Float> tsys ;
105  Array<Double> direction ;
106  Float azimuth ;
107  Float elevation ;
108  Float parangle ;
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  Array<Double> propermotion ;
120  Vector<Double> srcdir ;
121  Array<Double> scanrate ;
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  for ( Int irow = 0 ; irow < (Int)nRow ; irow++ ) {
129    // check scan intent
130    string scanType = reader_->getScanType( irow ) ;
131    SrcType::type srcType = SrcType::NOTYPE ;
132
133    // skip "ZERO" scan
134    if ( scanType.compare( 0, 4, "ZERO" ) == 0 ) {
135      continue ;
136    }
137
138    // set srcType
139    if ( obsType == "POS" || obsType == "BEA" ) {
140      if ( scanType.compare( 0, 2, "ON" ) == 0 )
141        srcType = SrcType::PSON ;
142      else if ( scanType.compare( 0, 3, "OFF" ) == 0 )
143        srcType = SrcType::PSOFF ;
144    }
145    else if ( obsType == "FRE" ) {
146      if ( scanType.compare( 0, 2, "ON" ) == 0 )
147        srcType = SrcType::FSON ;
148      else if ( scanType.compare( 0, 3, "OFF" ) == 0 )
149        srcType = SrcType::FSOFF ;
150    }
151 
152    // get scan ifnromation
153    if ( reader_->getScanInfo( irow,
154                               scanno,
155                               cycleno,
156                               ifno,
157                               beamno,
158                               polno,
159                               fqs,
160                               restfreq,
161                               refbeamno,
162                               scantime,
163                               interval,
164                               srcname,
165                               fieldname,
166                               spectra,
167                               flagtra,
168                               tsys,
169                               direction,
170                               azimuth,
171                               elevation,
172                               parangle,
173                               opacity,
174                               tcalid,
175                               fitid,
176                               focusid,
177                               temperature,
178                               pressure,
179                               humidity,
180                               windvel,
181                               winddir,
182                               srcvel,
183                               propermotion,
184                               srcdir,
185                               scanrate ) ) {
186      throw AipsError( "Failed to read scan record" ) ;
187      return ;
188    }
189
190    // set IDs and subtable rows
191    // FREQUENCIES subtable row
192    setFrequency( (Double)fqs[0], (Double)fqs[1], (Double)fqs[2] ) ;
193
194    // MOLECULES subtable row
195    setMolecule( restfreq ) ;
196
197    // FOCUS subtable row
198    setFocus( parangle ) ;
199
200    // WEATHER subtable row
201    setWeather( temperature, pressure, humidity, windvel, winddir ) ;
202
203    // TCAL subtable row
204    // use default since NRO input is calibrated data
205    setTcal( tcalTime, defaultTcal ) ;
206   
207
208    // set row attributes
209    // SPECTRA, FLAGTRA, and TSYS
210    Vector<Float> spectrum( spectra );
211    Vector<uChar> flags( flagtra ) ;
212    Vector<Float> Tsys( tsys ) ;
213    setSpectrum( spectrum, flags, Tsys ) ;
214
215    // SCANNO, CYCLENO, IFNO, POLNO, and BEAMNO
216    //uInt ifno = table_->frequencies().addEntry( (Double)fqs[0], (Double)fqs[1], (Double)fqs[2] ) ;
217    setIndex( scanno, cycleno, ifno, polno, beamno ) ;
218
219    // REFBEAMNO
220    setReferenceBeam( (Int)refbeamno ) ;
221
222    // DIRECTION
223    Vector<Double> dir( direction ) ;
224    setDirection(dir, azimuth, elevation ) ;
225
226    // TIME and INTERVAL
227    setTime( scantime, interval ) ;
228
229    // SRCNAME, SRCTYPE, FIELDNAME, SRCDIRECTION, SRCPROPERMOTION, and SRCVELOCITY
230    Vector<Double> propermot( propermotion ) ;
231    setSource( srcname, srcType, fieldname, srcdir, propermot, srcvel ) ;
232
233    // SCANRATE
234    Vector<Double> srate( scanrate ) ;
235    setScanRate( srate ) ;
236
237    // OPACITY
238    setOpacity( opacity ) ;
239
240    // finally, commit row
241    commitRow() ;
242
243    // count up number of row committed
244    rowCount++ ;
245  }
246}
247
248void NROFiller::close()
249{
250  if (reader_.null() != False) {
251    reader_ = 0;
252  }
253  table_ = 0;
254}
255
256};
257
Note: See TracBrowser for help on using the repository browser.