source: branches/alma/src/STFiller.cpp@ 1462

Last change on this file since 1462 was 1458, checked in by Takeshi Nakazato, 16 years ago

New Development: No

JIRA Issue: Yes CAS-1043

Ready to Release: Yes

Interface Changes: Yes/No

What Interface Changed: Please list interface changes

Test Programs: Execute following commands:


asap_init()
s=sd.scantable(filename,average=False)

where filename should be NRO data.

Put in Release Notes: Yes/No

Description: Modified STFiller class is able to import

NRO OTF raw data. STFiller automatically
identifies if a type of input file is NRO
raw data or not.


  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.3 KB
RevLine 
[805]1//
2// C++ Implementation: STFiller
3//
4// Description:
5//
6//
7// Author: Malte Marquarding <asap@atnf.csiro.au>, (C) 2006
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
[404]12#include <casa/iostream.h>
13#include <casa/iomanip.h>
14
[125]15#include <casa/Exceptions.h>
[284]16#include <casa/OS/Path.h>
[290]17#include <casa/OS/File.h>
[338]18#include <casa/Quanta/Unit.h>
[805]19#include <casa/Arrays/ArrayMath.h>
[1060]20#include <casa/Arrays/ArrayLogical.h>
[805]21#include <casa/Utilities/Regex.h>
22
23#include <casa/Containers/RecordField.h>
24
25#include <tables/Tables/TableRow.h>
26
[1458]27#include <measures/Measures/MDirection.h>
28#include <measures/Measures/MeasConvert.h>
29
[2]30#include <atnf/PKSIO/PKSreader.h>
[1387]31#include <casa/System/ProgressMeter.h>
[1458]32#include <atnf/PKSIO/NROReader.h>
[125]33
[1458]34#include <time.h>
[1387]35
[835]36#include "STDefs.h"
[878]37#include "STAttr.h"
[2]38
[805]39#include "STFiller.h"
[901]40#include "STHeader.h"
[805]41
[125]42using namespace casa;
[2]43
[805]44namespace asap {
45
46STFiller::STFiller() :
[2]47 reader_(0),
[405]48 header_(0),
[1458]49 table_(0),
50 nreader_(0)
[420]51{
[2]52}
[805]53
54STFiller::STFiller( CountedPtr< Scantable > stbl ) :
[46]55 reader_(0),
[405]56 header_(0),
[1458]57 table_(stbl),
58 nreader_(0)
[420]59{
[46]60}
[2]61
[855]62STFiller::STFiller(const std::string& filename, int whichIF, int whichBeam ) :
[2]63 reader_(0),
[405]64 header_(0),
[1458]65 table_(0),
66 nreader_(0)
[420]67{
[805]68 open(filename, whichIF, whichBeam);
[2]69}
70
[805]71STFiller::~STFiller()
72{
73 close();
[2]74}
75
[855]76void STFiller::open( const std::string& filename, int whichIF, int whichBeam )
[805]77{
[846]78 if (table_.null()) {
79 table_ = new Scantable();
80 }
[805]81 if (reader_) { delete reader_; reader_ = 0; }
82 Bool haveBase, haveSpectra;
[2]83
84 String inName(filename);
[284]85 Path path(inName);
86 inName = path.expandedName();
[405]87
[290]88 File file(inName);
[805]89 if ( !file.exists() ) {
[290]90 throw(AipsError("File does not exist"));
91 }
[87]92 filename_ = inName;
[332]93
[405]94 // Create reader and fill in values for arguments
[2]95 String format;
[1060]96 Vector<Bool> beams, ifs;
97 Vector<uInt> nchans,npols;
[1458]98
99 //
100 // if isNRO_ is true, try NROReader
101 //
102 // 2008/11/11 Takeshi Nakazato
103 isNRO_ = fileCheck() ;
104 if ( isNRO_ ) {
105 if ( (nreader_ = getNROReader( inName, format )) == 0 ) {
106 throw(AipsError("Creation of NROReader failed")) ;
107 }
108 else {
109 openNRO( whichIF, whichBeam ) ;
110 return ;
111 }
112 }
113 //
114
[1060]115 if ( (reader_ = getPKSreader(inName, 0, 0, format, beams, ifs,
116 nchans, npols, haveXPol_,haveBase, haveSpectra
117 )) == 0 ) {
[405]118 throw(AipsError("Creation of PKSreader failed"));
[2]119 }
120 if (!haveSpectra) {
121 delete reader_;
122 reader_ = 0;
[87]123 throw(AipsError("No spectral data in file."));
[2]124 return;
125 }
126 nBeam_ = beams.nelements();
[1060]127 nIF_ = ifs.nelements();
[2]128 // Get basic parameters.
[1060]129 if ( anyEQ(haveXPol_, True) ) {
[717]130 pushLog("Cross polarization present");
[1060]131 for (uInt i=0; i< npols.nelements();++i) {
132 if (npols[i] < 3) npols[i] += 2;// Convert Complex -> 2 Floats
133 }
[110]134 }
[405]135 if (header_) delete header_;
[901]136 header_ = new STHeader();
[1060]137 header_->nchan = max(nchans);
138 header_->npol = max(npols);
[405]139 header_->nbeam = nBeam_;
140
141 Int status = reader_->getHeader(header_->observer, header_->project,
142 header_->antennaname, header_->antennaposition,
143 header_->obstype,header_->equinox,
144 header_->freqref,
145 header_->utc, header_->reffreq,
[1387]146 header_->bandwidth,
147 header_->fluxunit);
[405]148
[2]149 if (status) {
150 delete reader_;
151 reader_ = 0;
[805]152 delete header_;
153 header_ = 0;
[87]154 throw(AipsError("Failed to get header."));
[2]155 }
[405]156 if ((header_->obstype).matches("*SW*")) {
[2]157 // need robust way here - probably read ahead of next timestamp
[717]158 pushLog("Header indicates frequency switched observation.\n"
[754]159 "setting # of IFs = 1 ");
[2]160 nIF_ = 1;
[805]161 header_->obstype = String("fswitch");
[2]162 }
[405]163 // Determine Telescope and set brightness unit
[342]164
[1387]165
[342]166 Bool throwIt = False;
[878]167 Instrument inst = STAttr::convertInstrument(header_->antennaname, throwIt);
[1387]168 //header_->fluxunit = "Jy";
[342]169 if (inst==ATMOPRA || inst==TIDBINBILLA) {
[405]170 header_->fluxunit = "K";
[342]171 }
[1188]172 STAttr stattr;
173 header_->poltype = stattr.feedPolType(inst);
[405]174 header_->nif = nIF_;
175 header_->epoch = "UTC";
[805]176 // *** header_->frequnit = "Hz"
[2]177 // Apply selection criteria.
178 Vector<Int> ref;
[332]179 ifOffset_ = 0;
180 if (whichIF>=0) {
181 if (whichIF>=0 && whichIF<nIF_) {
[1060]182 ifs = False;
183 ifs(whichIF) = True;
[805]184 header_->nif = 1;
185 nIF_ = 1;
186 ifOffset_ = whichIF;
[332]187 } else {
[805]188 delete reader_;
189 reader_ = 0;
190 delete header_;
191 header_ = 0;
192 throw(AipsError("Illegal IF selection"));
[332]193 }
194 }
195 beamOffset_ = 0;
196 if (whichBeam>=0) {
[805]197 if (whichBeam>=0 && whichBeam<nBeam_) {
[1060]198 beams = False;
199 beams(whichBeam) = True;
[805]200 header_->nbeam = 1;
201 nBeam_ = 1;
202 beamOffset_ = whichBeam;
203 } else {
204 delete reader_;
205 reader_ = 0;
206 delete header_;
207 header_ = 0;
208 throw(AipsError("Illegal Beam selection"));
209 }
[332]210 }
211 Vector<Int> start(nIF_, 1);
212 Vector<Int> end(nIF_, 0);
[1060]213 reader_->select(beams, ifs, start, end, ref, True, haveXPol_[0], False);
[846]214 table_->setHeader(*header_);
[1387]215 //For MS, add the location of POINTING of the input MS so one get
216 //pointing data from there, if necessary.
217 //Also find nrow in MS
218 nInDataRow = 0;
219 if (format == "MS2") {
220 Path datapath(inName);
221 String ptTabPath = datapath.absoluteName();
222 Table inMS(ptTabPath);
223 nInDataRow = inMS.nrow();
224 ptTabPath.append("/POINTING");
225 table_->table().rwKeywordSet().define("POINTING", ptTabPath);
226 if ((header_->antennaname).matches("GBT")) {
227 String GOTabPath = datapath.absoluteName();
228 GOTabPath.append("/GBT_GO");
229 table_->table().rwKeywordSet().define("GBT_GO", GOTabPath);
230 }
231 }
[1446]232 String freqFrame = header_->freqref;
233 //translate frequency reference frame back to
234 //MS style (as PKSMS2reader converts the original frame
235 //in FITS standard style)
236 if (freqFrame == "TOPOCENT") {
237 freqFrame = "TOPO";
238 } else if (freqFrame == "GEOCENER") {
239 freqFrame = "GEO";
240 } else if (freqFrame == "BARYCENT") {
241 freqFrame = "BARY";
242 } else if (freqFrame == "GALACTOC") {
243 freqFrame = "GALACTO";
244 } else if (freqFrame == "LOCALGRP") {
245 freqFrame = "LGROUP";
246 } else if (freqFrame == "CMBDIPOL") {
247 freqFrame = "CMB";
248 } else if (freqFrame == "SOURCE") {
249 freqFrame = "REST";
250 }
251 table_->frequencies().setFrame(freqFrame);
[1387]252
[805]253}
[405]254
[805]255void STFiller::close( )
256{
257 delete reader_;reader_=0;
[1458]258 delete nreader_;nreader_=0;
[805]259 delete header_;header_=0;
260 table_ = 0;
[2]261}
262
[805]263int asap::STFiller::read( )
264{
[87]265 int status = 0;
266
[1458]267 //
268 // for NRO data
269 //
270 // 2008/11/12 Takeshi Nakazato
271 if ( isNRO_ ) {
272 status = readNRO() ;
273 return status ;
274 }
275 //
276
[17]277 Int beamNo, IFno, refBeam, scanNo, cycleNo;
[87]278 Float azimuth, elevation, focusAxi, focusRot, focusTan,
[2]279 humidity, parAngle, pressure, temperature, windAz, windSpeed;
[1446]280 Double bandwidth, freqInc, interval, mjd, refFreq, srcVel;
[1072]281 String fieldName, srcName, tcalTime, obsType;
[2]282 Vector<Float> calFctr, sigma, tcal, tsys;
283 Matrix<Float> baseLin, baseSub;
[1446]284 Vector<Double> direction(2), scanRate(2), srcDir(2), srcPM(2), restFreq;
[2]285 Matrix<Float> spectra;
286 Matrix<uChar> flagtra;
287 Complex xCalFctr;
288 Vector<Complex> xPol;
[1387]289 Double min = 0.0;
290 Double max = nInDataRow;
291 ProgressMeter fillpm(min, max, "Data importing progress");
292 int n = 0;
[805]293 while ( status == 0 ) {
294 status = reader_->read(scanNo, cycleNo, mjd, interval, fieldName,
[1072]295 srcName, srcDir, srcPM, srcVel, obsType, IFno,
296 refFreq, bandwidth, freqInc, restFreq, tcal, tcalTime,
[805]297 azimuth, elevation, parAngle, focusAxi,
298 focusTan, focusRot, temperature, pressure,
299 humidity, windSpeed, windAz, refBeam,
300 beamNo, direction, scanRate,
301 tsys, sigma, calFctr, baseLin, baseSub,
302 spectra, flagtra, xCalFctr, xPol);
303 if ( status != 0 ) break;
[1387]304 n += 1;
305
[1081]306 Regex filterrx(".*[SL|PA]$");
[1110]307 Regex obsrx("^AT.+");
308 if ( header_->antennaname.matches(obsrx) && obsType.matches(filterrx)) {
309 //cerr << "ignoring paddle scan" << endl;
[1081]310 continue;
311 }
[805]312 TableRow row(table_->table());
313 TableRecord& rec = row.record();
[999]314 // fields that don't get used and are just passed through asap
315 RecordFieldPtr<Array<Double> > srateCol(rec, "SCANRATE");
316 *srateCol = scanRate;
317 RecordFieldPtr<Array<Double> > spmCol(rec, "SRCPROPERMOTION");
318 *spmCol = srcPM;
319 RecordFieldPtr<Array<Double> > sdirCol(rec, "SRCDIRECTION");
320 *sdirCol = srcDir;
321 RecordFieldPtr<Double> svelCol(rec, "SRCVELOCITY");
322 *svelCol = srcVel;
323 // the real stuff
[972]324 RecordFieldPtr<Int> fitCol(rec, "FIT_ID");
325 *fitCol = -1;
[805]326 RecordFieldPtr<uInt> scanoCol(rec, "SCANNO");
327 *scanoCol = scanNo-1;
328 RecordFieldPtr<uInt> cyclenoCol(rec, "CYCLENO");
329 *cyclenoCol = cycleNo-1;
330 RecordFieldPtr<Double> mjdCol(rec, "TIME");
331 *mjdCol = mjd;
332 RecordFieldPtr<Double> intCol(rec, "INTERVAL");
333 *intCol = interval;
334 RecordFieldPtr<String> srcnCol(rec, "SRCNAME");
335 RecordFieldPtr<Int> srctCol(rec, "SRCTYPE");
[1387]336 RecordFieldPtr<String> fieldnCol(rec, "FIELDNAME");
337 *fieldnCol = fieldName;
[805]338 // try to auto-identify if it is on or off.
[922]339 Regex rx(".*[e|w|_R]$");
[942]340 Regex rx2("_S$");
[805]341 Int match = srcName.matches(rx);
342 if (match) {
343 *srcnCol = srcName;
344 } else {
345 *srcnCol = srcName.before(rx2);
346 }
347 //*srcnCol = srcName;//.before(rx2);
348 *srctCol = match;
349 RecordFieldPtr<uInt> beamCol(rec, "BEAMNO");
350 *beamCol = beamNo-beamOffset_-1;
351 RecordFieldPtr<Int> rbCol(rec, "REFBEAMNO");
352 Int rb = -1;
353 if (nBeam_ > 1 ) rb = refBeam-1;
354 *rbCol = rb;
355 RecordFieldPtr<uInt> ifCol(rec, "IFNO");
356 *ifCol = IFno-ifOffset_- 1;
357 uInt id;
358 /// @todo this has to change when nchan isn't global anymore
359 id = table_->frequencies().addEntry(Double(header_->nchan/2),
360 refFreq, freqInc);
361 RecordFieldPtr<uInt> mfreqidCol(rec, "FREQ_ID");
362 *mfreqidCol = id;
[25]363
[805]364 id = table_->molecules().addEntry(restFreq);
365 RecordFieldPtr<uInt> molidCol(rec, "MOLECULE_ID");
366 *molidCol = id;
[414]367
[805]368 id = table_->tcal().addEntry(tcalTime, tcal);
369 RecordFieldPtr<uInt> mcalidCol(rec, "TCAL_ID");
370 *mcalidCol = id;
371 id = table_->weather().addEntry(temperature, pressure, humidity,
372 windSpeed, windAz);
373 RecordFieldPtr<uInt> mweatheridCol(rec, "WEATHER_ID");
374 *mweatheridCol = id;
375 RecordFieldPtr<uInt> mfocusidCol(rec, "FOCUS_ID");
376 id = table_->focus().addEntry(focusAxi, focusTan, focusRot);
377 *mfocusidCol = id;
378 RecordFieldPtr<Array<Double> > dirCol(rec, "DIRECTION");
379 *dirCol = direction;
[922]380 RecordFieldPtr<Float> azCol(rec, "AZIMUTH");
[805]381 *azCol = azimuth;
[922]382 RecordFieldPtr<Float> elCol(rec, "ELEVATION");
[805]383 *elCol = elevation;
[405]384
[805]385 RecordFieldPtr<Float> parCol(rec, "PARANGLE");
386 *parCol = parAngle;
[332]387
[805]388 RecordFieldPtr< Array<Float> > specCol(rec, "SPECTRA");
389 RecordFieldPtr< Array<uChar> > flagCol(rec, "FLAGTRA");
390 RecordFieldPtr< uInt > polnoCol(rec, "POLNO");
[405]391
[805]392 RecordFieldPtr< Array<Float> > tsysCol(rec, "TSYS");
393 // Turn the (nchan,npol) matrix and possible complex xPol vector
394 // into 2-4 rows in the scantable
395 Vector<Float> tsysvec(1);
396 // Why is spectra.ncolumn() == 3 for haveXPol_ == True
397 uInt npol = (spectra.ncolumn()==1 ? 1: 2);
398 for ( uInt i=0; i< npol; ++i ) {
399 tsysvec = tsys(i);
400 *tsysCol = tsysvec;
401 *polnoCol = i;
[405]402
[805]403 *specCol = spectra.column(i);
404 *flagCol = flagtra.column(i);
405 table_->table().addRow();
406 row.put(table_->table().nrow()-1, rec);
[2]407 }
[1060]408 if ( haveXPol_[0] ) {
[805]409 // no tsys given for xpol, so emulate it
410 tsysvec = sqrt(tsys[0]*tsys[1]);
411 *tsysCol = tsysvec;
412 // add real part of cross pol
413 *polnoCol = 2;
414 Vector<Float> r(real(xPol));
415 *specCol = r;
416 // make up flags from linears
417 /// @fixme this has to be a bitwise or of both pols
418 *flagCol = flagtra.column(0);// | flagtra.column(1);
419 table_->table().addRow();
420 row.put(table_->table().nrow()-1, rec);
421 // ad imaginary part of cross pol
422 *polnoCol = 3;
423 Vector<Float> im(imag(xPol));
424 *specCol = im;
425 table_->table().addRow();
426 row.put(table_->table().nrow()-1, rec);
[2]427 }
[1387]428 fillpm._update(n);
[805]429 }
430 if (status > 0) {
431 close();
432 throw(AipsError("Reading error occured, data possibly corrupted."));
433 }
[1387]434 fillpm.done();
[2]435 return status;
436}
[805]437
[1458]438/**
439 * For NRO data
440 *
441 * 2008/11/11 Takeshi Nakazato
442 **/
443void STFiller::openNRO( int whichIF, int whichBeam )
444{
445 // open file
446 // DEBUG
447 time_t t0 ;
448 time( &t0 ) ;
449 tm *ttm = localtime( &t0 ) ;
450
451 cout << "STFiller::openNRO() Start time = " << t0
452 << " ("
453 << ttm->tm_year + 1900 << "/" << ttm->tm_mon + 1 << "/" << ttm->tm_mday
454 << " "
455 << ttm->tm_hour << ":" << ttm->tm_min << ":" << ttm->tm_sec
456 << ")" << endl ;
457 //
458 if ( nreader_->open() != 0 ) {
459 throw( AipsError( "Error while opening file "+filename_ ) ) ;
460 }
461
462 isNRO_ = true ;
463
464 // store data into NROHeader and NRODataset
465 if ( nreader_->readHeader() != 0 ) {
466 throw( AipsError( "Error while reading file "+filename_ ) ) ;
467 }
468
469 // get header data
470 NROHeader *nheader = nreader_->getHeader() ;
471
472 // fill STHeader
473 header_ = new STHeader() ;
474
475 header_->nchan = nreader_->getSpectrum( 0 ).size() ;
476 header_->npol = nreader_->getPolarizationNum() ;
477 header_->observer = nheader->getOBSVR() ;
478 header_->project = nheader->getPROJ() ;
479 header_->obstype = nheader->getSWMOD() ;
480 header_->antennaname = nheader->getSITE() ;
481 // TODO: should be investigated antenna position since there are
482 // no corresponding information in the header
483 // 2008/11/13 Takeshi Nakazato
484 //
485 // INFO: tentative antenna posiiton is obtained for NRO 45m from ITRF website
486 // 2008/11/26 Takeshi Nakazato
487 vector<double> pos = nreader_->getAntennaPosition() ;
488 header_->antennaposition = pos ;
489 char *eq = nheader->getEPOCH() ;
490 if ( strncmp( eq, "B1950", 5 ) == 0 )
491 header_->equinox = 1950.0 ;
492 else if ( strncmp( eq, "J2000", 5 ) == 0 )
493 header_->equinox = 2000.0 ;
494 header_->freqref = nheader->getVREF() ;
495 header_->reffreq = nheader->getF0CAL()[0] ;
496 header_->bandwidth = nheader->getBEBW()[0] ;
497 header_->utc = nreader_->getStartTime() ;
498 header_->fluxunit = "K" ;
499 header_->epoch = "UTC" ;
500 char *poltp = nheader->getPOLTP()[0] ;
501 if ( strcmp( poltp, "" ) == 0 )
502 poltp = "None" ;
503 header_->poltype = poltp ;
504 // DEBUG
505 cout << "STFiller::openNRO() poltype = " << header_->poltype << endl ;
506 //
507
508 vector<Bool> ifs = nreader_->getIFs() ;
509 ifOffset_ = 0;
510 nIF_ = ifs.size() ;
511 if ( whichIF >= 0 ) {
512 if ( whichIF >= 0 && whichIF < nIF_ ) {
513 for ( int i = 0 ; i < nIF_ ; i++ )
514 ifs[i] = False ;
515 ifs[whichIF] = True ;
516 header_->nif = 1;
517 nIF_ = 1;
518 ifOffset_ = whichIF;
519 } else {
520 delete reader_;
521 reader_ = 0;
522 delete header_;
523 header_ = 0;
524 throw(AipsError("Illegal IF selection"));
525 }
526 }
527
528 beamOffset_ = 0;
529 vector<Bool> beams = nreader_->getBeams() ;
530 nBeam_ = beams.size() ;
531 if (whichBeam>=0) {
532 if (whichBeam>=0 && whichBeam<nBeam_) {
533 for ( int i = 0 ; i < nBeam_ ; i++ )
534 beams[i] = False ;
535 beams[whichBeam] = True;
536 header_->nbeam = 1;
537 nBeam_ = 1;
538 beamOffset_ = whichBeam;
539 } else {
540 delete reader_;
541 reader_ = 0;
542 delete header_;
543 header_ = 0;
544 throw(AipsError("Illegal Beam selection"));
545 }
546 }
547 header_->nbeam = nBeam_ ;
548 header_->nif = nIF_ ;
549
550 // set header
551 table_->setHeader( *header_ ) ;
552
553 // DEBUG
554 time_t t1 ;
555 time( &t1 ) ;
556 ttm = localtime( &t1 ) ;
557 cout << "STFiller::openNRO() End time = " << t1
558 << " ("
559 << ttm->tm_year + 1900 << "/" << ttm->tm_mon + 1 << "/" << ttm->tm_mday
560 << " "
561 << ttm->tm_hour << ":" << ttm->tm_min << ":" << ttm->tm_sec
562 << ")" << endl ;
563 cout << "STFiller::openNRO() Elapsed time = " << t1 - t0 << " sec" << endl ;
564 //
565
566 return ;
567}
568
569int STFiller::readNRO()
570{
571 //return 0 ;
572
573 // DEBUG
574 time_t t0 ;
575 time( &t0 ) ;
576 tm *ttm = localtime( &t0 ) ;
577 cout << "STFiller::readNRO() Start time = " << t0
578 << " ("
579 << ttm->tm_year + 1900 << "/" << ttm->tm_mon + 1 << "/" << ttm->tm_mday
580 << " "
581 << ttm->tm_hour << ":" << ttm->tm_min << ":" << ttm->tm_sec
582 << ")" << endl ;
583 //
584
585 // get header
586 //vector<NRODataset *> data = nreader_->getData() ;
587 NROHeader *h = nreader_->getHeader() ;
588
589 // fill row
590 uInt id ;
591 uInt imax = nreader_->getRowNum() ;
592 //uInt imax = 30 ;
593 uInt i = 0 ;
594 int count = 0 ;
595 for ( i = 0 ; i < imax ; i++ ) {
596 NRODataset *d = nreader_->getData( i ) ;
597
598 //char *scanType = d->getSCANTP() ;
599 char *scanType = d->SCANTP ;
600 Int srcType = -1 ;
601 if ( strncmp( scanType, "ON", 2 ) == 0 ) {
602 srcType = 0 ;
603 }
604 else if ( strncmp( scanType, "OFF", 3 ) == 0 ) {
605 //cout << "OFF srcType: " << i << endl ;
606 srcType = 1 ;
607 }
608 else if ( strncmp( scanType, "ZERO", 4 ) == 0 ) {
609 //cout << "ZERO srcType: " << i << endl ;
610 srcType = 2 ;
611 }
612 else {
613 //cout << "Undefined srcType: " << i << endl ;
614 srcType = 3 ;
615 }
616
617 // if srcType is 2 (ZERO scan), ignore scan
618 if ( srcType != 2 && srcType != -1 && srcType != 3 ) {
619 TableRow row( table_->table() ) ;
620 TableRecord& rec = row.record();
621
622 RecordFieldPtr<Int> srctCol(rec, "SRCTYPE") ;
623 *srctCol = srcType ;
624 RecordFieldPtr<Array<Double> > srateCol(rec, "SCANRATE");
625 Array<Double> srcarr( IPosition( 1, 2 ) ) ;
626 srcarr = 0.0 ;
627 *srateCol = srcarr ;
628 RecordFieldPtr<Array<Double> > spmCol(rec, "SRCPROPERMOTION") ;
629 *spmCol = srcarr ;
630 RecordFieldPtr<Array<Double> > sdirCol(rec, "SRCDIRECTION") ;
631 *sdirCol = nreader_->getSourceDirection() ;
632 RecordFieldPtr<Double> svelCol(rec, "SRCVELOCITY") ;
633 *svelCol = h->getURVEL() ; // [m/s]
634 RecordFieldPtr<Int> fitCol(rec, "FIT_ID") ;
635 *fitCol = -1 ;
636 RecordFieldPtr<uInt> scannoCol( rec, "SCANNO" ) ;
637 //*scannoCol = (uInt)(d->getISCAN()) ;
638 *scannoCol = (uInt)(d->ISCAN) ;
639 RecordFieldPtr<uInt> cyclenoCol(rec, "CYCLENO");
640 RecordFieldPtr<Double> mjdCol( rec, "TIME" ) ;
641 *mjdCol = Double( nreader_->getStartIntTime( i ) ) ;
642 RecordFieldPtr<Double> intervalCol( rec, "INTERVAL" ) ;
643 *intervalCol = Double( h->getIPTIM() ) ;
644 RecordFieldPtr<String> srcnCol(rec, "SRCNAME") ;
645 *srcnCol = String( h->getOBJ() ) ;
646 RecordFieldPtr<String> fieldnCol(rec, "FIELDNAME");
647 *fieldnCol = String( h->getOBJ() ) ;
648 // BEAMNO is 0-base
649 RecordFieldPtr<uInt> beamCol(rec, "BEAMNO") ;
650 string arryt = string( d->ARRYT ) ;
651 string sbeamno = arryt.substr( 1, arryt.size()-1 ) ;
652 uInt ibeamno = atoi( sbeamno.c_str() ) ;
653 *beamCol = ibeamno - 1 ;
654 RecordFieldPtr<Int> rbCol(rec, "REFBEAMNO") ;
655 RecordFieldPtr<uInt> ifCol(rec, "IFNO") ;
656 RecordFieldPtr<uInt> mfreqidCol(rec, "FREQ_ID") ;
657 vector<double> fqs = nreader_->getFrequencies( i ) ;
658 id = table_->frequencies().addEntry( Double( fqs[0] ),
659 Double( fqs[1] ),
660 Double( fqs[2] ) ) ;
661 *mfreqidCol = id ;
662 *ifCol = id ;
663 RecordFieldPtr<uInt> molidCol(rec, "MOLECULE_ID") ;
664 Vector<Double> restfreq( IPosition( 1, 1 ) ) ;
665 restfreq( 0 ) = d->FREQ0 ;
666 id = table_->molecules().addEntry( restfreq ) ;
667 *molidCol = id ;
668 RecordFieldPtr<uInt> mcalidCol(rec, "TCAL_ID") ;
669 //
670 // No Tcal information in the data
671 //
672 // 2008/11/20 Takeshi Nakazato
673 //
674 *mcalidCol = 0 ;
675 RecordFieldPtr<uInt> mweatheridCol(rec, "WEATHER_ID") ;
676
677 id = table_->weather().addEntry( Float( d->TEMP ),
678 Float( d->PATM ),
679 Float( d->PH2O ),
680 Float( d->VWIND ),
681 Float( d->DWIND ) ) ;
682
683 *mweatheridCol = id ;
684 RecordFieldPtr<uInt> mfocusidCol(rec, "FOCUS_ID") ;
685 RecordFieldPtr< Array<Double> > dirCol(rec, "DIRECTION") ;
686 *dirCol = nreader_->getDirection( i ) ;
687 RecordFieldPtr<Float> azCol(rec, "AZIMUTH") ;
688 *azCol = d->RAZ ;
689 RecordFieldPtr<Float> elCol(rec, "ELEVATION") ;
690 *elCol = d->REL ;
691 RecordFieldPtr<Float> parCol(rec, "PARANGLE") ;
692 RecordFieldPtr< Array<Float> > specCol(rec, "SPECTRA") ;
693 vector<double> spec = nreader_->getSpectrum( i ) ;
694 Array<Float> sp( IPosition( 1, spec.size() ) ) ;
695 int index = 0 ;
696 for ( Array<Float>::iterator itr = sp.begin() ; itr != sp.end() ; itr++ ) {
697 *itr = spec[index++] ;
698 }
699 *specCol = sp ;
700 RecordFieldPtr< Array<uChar> > flagCol(rec, "FLAGTRA") ;
701 Array<uChar> flag( sp.shape() ) ;
702 flag.set( 0 ) ;
703 *flagCol = flag ;
704 RecordFieldPtr< uInt > polnoCol(rec, "POLNO") ;
705 *polnoCol = 0 ;
706 RecordFieldPtr< Array<Float> > tsysCol(rec, "TSYS") ;
707 Array<Float> tsys( IPosition( 1, 1 ), d->TSYS ) ;
708 *tsysCol = tsys ;
709
710 table_->table().addRow() ;
711 row.put(table_->table().nrow()-1, rec) ;
712 }
713 else {
714 count++ ;
715 }
716 }
717
718 // DEBUG
719 time_t t1 ;
720 time( &t1 ) ;
721 ttm = localtime( &t1 ) ;
722 cout << "STFiller::readNRO() Processed " << i << " rows" << endl ;
723 cout << "STFiller::readNRO() Added " << i - count << " rows (ignored "
724 << count << " \"ZERO\" scans)" << endl ;
725 cout << "STFiller::readNRO() End time = " << t1
726 << " ("
727 << ttm->tm_year + 1900 << "/" << ttm->tm_mon + 1 << "/" << ttm->tm_mday
728 << " "
729 << ttm->tm_hour << ":" << ttm->tm_min << ":" << ttm->tm_sec
730 << ")" << endl ;
731 cout << "STFiller::readNRO() Elapsed time = " << t1 - t0 << " sec" << endl ;
732 //
733
734 return 0 ;
735}
736
737Bool STFiller::fileCheck()
738{
739 // if filename_ is directory, return false
740 File inFile( filename_ ) ;
741 if ( inFile.isDirectory() )
742 return false ;
743
744 // if beginning of header data is "RW", return true
745 // otherwise, return false ;
746 FILE *fp = fopen( filename_.c_str(), "r" ) ;
747 char buf[9] ;
748 fread( buf, 4, 1, fp ) ;
749 buf[4] = '\0' ;
750 if ( ( strncmp( buf, "RW", 2 ) == 0 ) )
751 return true ;
752
753 return false ;
754}
755
[805]756}//namespace asap
Note: See TracBrowser for help on using the repository browser.