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

Last change on this file since 1510 was 1495, checked in by TakTsutsumi, 16 years ago

New Development: No

JIRA Issue: No

Ready to Release: Yes

Interface Changes: Yes

What Interface Changed: a new parameter in open method

Test Programs: List test programs

Put in Release Notes: No

Module(s): Module Names change impacts.

Description: Added a boolean, getPt in open()

to accommodate change in PKSIO


  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 23.7 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
[1495]76void STFiller::open( const std::string& filename, int whichIF, int whichBeam, casa::Bool getPt )
[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);
[1495]213 reader_->select(beams, ifs, start, end, ref, True, haveXPol_[0], False, getPt);
[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;
[1480]284 Vector<Double> direction(2), scanRate(2), srcDir(2), srcPM(2), restFreq(1);
[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 //
[1490]458// if ( nreader_->open() != 0 ) {
459// throw( AipsError( "Error while opening file "+filename_ ) ) ;
460// }
[1458]461
462 isNRO_ = true ;
463
464 // store data into NROHeader and NRODataset
[1482]465 //if ( nreader_->readHeader() != 0 ) {
466 //throw( AipsError( "Error while reading file "+filename_ ) ) ;
467 //}
[1458]468
469 // get header data
470 NROHeader *nheader = nreader_->getHeader() ;
471
472 // fill STHeader
473 header_ = new STHeader() ;
474
[1482]475 header_->nchan = nheader->getNUMCH() ;
[1458]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 ;
[1493]494// char *vref = nheader->getVREF() ;
[1492]495// if ( strncmp( vref, "LSR", 3 ) == 0 ) {
496// strcat( vref, "K" ) ;
497// }
[1493]498// header_->freqref = vref ;
[1492]499 nreader_->getData( 0 ) ;
500 header_->reffreq = nreader_->getData()->FREQ0 ;
[1458]501 header_->bandwidth = nheader->getBEBW()[0] ;
502 header_->utc = nreader_->getStartTime() ;
503 header_->fluxunit = "K" ;
504 header_->epoch = "UTC" ;
505 char *poltp = nheader->getPOLTP()[0] ;
506 if ( strcmp( poltp, "" ) == 0 )
507 poltp = "None" ;
508 header_->poltype = poltp ;
509 // DEBUG
510 cout << "STFiller::openNRO() poltype = " << header_->poltype << endl ;
511 //
512
513 vector<Bool> ifs = nreader_->getIFs() ;
514 ifOffset_ = 0;
515 nIF_ = ifs.size() ;
516 if ( whichIF >= 0 ) {
517 if ( whichIF >= 0 && whichIF < nIF_ ) {
518 for ( int i = 0 ; i < nIF_ ; i++ )
519 ifs[i] = False ;
520 ifs[whichIF] = True ;
521 header_->nif = 1;
522 nIF_ = 1;
523 ifOffset_ = whichIF;
524 } else {
525 delete reader_;
526 reader_ = 0;
527 delete header_;
528 header_ = 0;
529 throw(AipsError("Illegal IF selection"));
530 }
531 }
532
533 beamOffset_ = 0;
534 vector<Bool> beams = nreader_->getBeams() ;
535 nBeam_ = beams.size() ;
536 if (whichBeam>=0) {
537 if (whichBeam>=0 && whichBeam<nBeam_) {
538 for ( int i = 0 ; i < nBeam_ ; i++ )
539 beams[i] = False ;
540 beams[whichBeam] = True;
541 header_->nbeam = 1;
542 nBeam_ = 1;
543 beamOffset_ = whichBeam;
544 } else {
545 delete reader_;
546 reader_ = 0;
547 delete header_;
548 header_ = 0;
549 throw(AipsError("Illegal Beam selection"));
550 }
551 }
552 header_->nbeam = nBeam_ ;
553 header_->nif = nIF_ ;
554
555 // set header
556 table_->setHeader( *header_ ) ;
557
558 // DEBUG
[1489]559 //cout << "STFiller::openNRO() Velocity Definition = " << nheader->getVDEF() << endl ;
560
561 // DEBUG
[1458]562 time_t t1 ;
563 time( &t1 ) ;
564 ttm = localtime( &t1 ) ;
565 cout << "STFiller::openNRO() End time = " << t1
566 << " ("
567 << ttm->tm_year + 1900 << "/" << ttm->tm_mon + 1 << "/" << ttm->tm_mday
568 << " "
569 << ttm->tm_hour << ":" << ttm->tm_min << ":" << ttm->tm_sec
570 << ")" << endl ;
571 cout << "STFiller::openNRO() Elapsed time = " << t1 - t0 << " sec" << endl ;
572 //
573
574 return ;
575}
576
577int STFiller::readNRO()
578{
579 // DEBUG
580 time_t t0 ;
581 time( &t0 ) ;
582 tm *ttm = localtime( &t0 ) ;
583 cout << "STFiller::readNRO() Start time = " << t0
584 << " ("
585 << ttm->tm_year + 1900 << "/" << ttm->tm_mon + 1 << "/" << ttm->tm_mday
586 << " "
587 << ttm->tm_hour << ":" << ttm->tm_min << ":" << ttm->tm_sec
588 << ")" << endl ;
589 //
590
591 // get header
592 NROHeader *h = nreader_->getHeader() ;
593
594 // fill row
595 uInt id ;
596 uInt imax = nreader_->getRowNum() ;
[1490]597 vector< vector<double > > freqs ;
[1458]598 uInt i = 0 ;
599 int count = 0 ;
600 for ( i = 0 ; i < imax ; i++ ) {
[1489]601 if( nreader_->getData( i ) != 0 ) {
602 cerr << "STFiller::readNRO() error while reading row " << i << endl ;
603 return -1 ;
604 }
605 NRODataset *d = nreader_->getData() ;
[1458]606
607 char *scanType = d->SCANTP ;
608 Int srcType = -1 ;
609 if ( strncmp( scanType, "ON", 2 ) == 0 ) {
610 srcType = 0 ;
611 }
612 else if ( strncmp( scanType, "OFF", 3 ) == 0 ) {
613 //cout << "OFF srcType: " << i << endl ;
614 srcType = 1 ;
615 }
616 else if ( strncmp( scanType, "ZERO", 4 ) == 0 ) {
617 //cout << "ZERO srcType: " << i << endl ;
618 srcType = 2 ;
619 }
620 else {
621 //cout << "Undefined srcType: " << i << endl ;
622 srcType = 3 ;
623 }
624
625 // if srcType is 2 (ZERO scan), ignore scan
626 if ( srcType != 2 && srcType != -1 && srcType != 3 ) {
627 TableRow row( table_->table() ) ;
628 TableRecord& rec = row.record();
629
630 RecordFieldPtr<Int> srctCol(rec, "SRCTYPE") ;
631 *srctCol = srcType ;
632 RecordFieldPtr<Array<Double> > srateCol(rec, "SCANRATE");
633 Array<Double> srcarr( IPosition( 1, 2 ) ) ;
634 srcarr = 0.0 ;
635 *srateCol = srcarr ;
636 RecordFieldPtr<Array<Double> > spmCol(rec, "SRCPROPERMOTION") ;
637 *spmCol = srcarr ;
638 RecordFieldPtr<Array<Double> > sdirCol(rec, "SRCDIRECTION") ;
639 *sdirCol = nreader_->getSourceDirection() ;
640 RecordFieldPtr<Double> svelCol(rec, "SRCVELOCITY") ;
[1491]641 *svelCol = h->getURVEL() ; // [m/s]
[1458]642 RecordFieldPtr<Int> fitCol(rec, "FIT_ID") ;
643 *fitCol = -1 ;
644 RecordFieldPtr<uInt> scannoCol( rec, "SCANNO" ) ;
645 //*scannoCol = (uInt)(d->getISCAN()) ;
646 *scannoCol = (uInt)(d->ISCAN) ;
647 RecordFieldPtr<uInt> cyclenoCol(rec, "CYCLENO");
648 RecordFieldPtr<Double> mjdCol( rec, "TIME" ) ;
649 *mjdCol = Double( nreader_->getStartIntTime( i ) ) ;
650 RecordFieldPtr<Double> intervalCol( rec, "INTERVAL" ) ;
651 *intervalCol = Double( h->getIPTIM() ) ;
652 RecordFieldPtr<String> srcnCol(rec, "SRCNAME") ;
653 *srcnCol = String( h->getOBJ() ) ;
654 RecordFieldPtr<String> fieldnCol(rec, "FIELDNAME");
655 *fieldnCol = String( h->getOBJ() ) ;
656 // BEAMNO is 0-base
657 RecordFieldPtr<uInt> beamCol(rec, "BEAMNO") ;
658 string arryt = string( d->ARRYT ) ;
659 string sbeamno = arryt.substr( 1, arryt.size()-1 ) ;
660 uInt ibeamno = atoi( sbeamno.c_str() ) ;
661 *beamCol = ibeamno - 1 ;
662 RecordFieldPtr<Int> rbCol(rec, "REFBEAMNO") ;
663 RecordFieldPtr<uInt> ifCol(rec, "IFNO") ;
664 RecordFieldPtr<uInt> mfreqidCol(rec, "FREQ_ID") ;
665 vector<double> fqs = nreader_->getFrequencies( i ) ;
[1490]666 //cout << "STFiller::readNRO() fqs[1] = " << fqs[1] << endl ;
667 if ( freqs.size() == 0 ) {
668 id = table_->frequencies().addEntry( Double( fqs[0] ),
669 Double( fqs[1] ),
670 Double( fqs[2] ) ) ;
671 *mfreqidCol = id ;
672 *ifCol = id ;
673 freqs.push_back( fqs ) ;
674 }
675 else {
676 int iadd = -1 ;
677 for ( uInt iif = 0 ; iif < freqs.size() ; iif++ ) {
678 //cout << "STFiller::readNRO() freqs[" << iif << "][1] = " << freqs[iif][1] << endl ;
679 double fdiff = abs( freqs[iif][1] - fqs[1] ) / freqs[iif][1] ;
680 //cout << "STFiller::readNRO() fdiff = " << fdiff << endl ;
681 if ( fdiff < 1.0e-8 ) {
682 iadd = iif ;
683 break ;
684 }
685 }
686 if ( iadd == -1 ) {
687 id = table_->frequencies().addEntry( Double( fqs[0] ),
688 Double( fqs[1] ),
689 Double( fqs[2] ) ) ;
690 *mfreqidCol = id ;
691 *ifCol = id ;
692 freqs.push_back( fqs ) ;
693 }
694 else {
695 *mfreqidCol = iadd ;
696 *ifCol = iadd ;
697 }
698 }
[1458]699 RecordFieldPtr<uInt> molidCol(rec, "MOLECULE_ID") ;
700 Vector<Double> restfreq( IPosition( 1, 1 ) ) ;
701 restfreq( 0 ) = d->FREQ0 ;
702 id = table_->molecules().addEntry( restfreq ) ;
703 *molidCol = id ;
704 RecordFieldPtr<uInt> mcalidCol(rec, "TCAL_ID") ;
705 //
706 // No Tcal information in the data
707 //
708 // 2008/11/20 Takeshi Nakazato
709 //
710 *mcalidCol = 0 ;
711 RecordFieldPtr<uInt> mweatheridCol(rec, "WEATHER_ID") ;
712
713 id = table_->weather().addEntry( Float( d->TEMP ),
714 Float( d->PATM ),
715 Float( d->PH2O ),
716 Float( d->VWIND ),
717 Float( d->DWIND ) ) ;
718
719 *mweatheridCol = id ;
720 RecordFieldPtr<uInt> mfocusidCol(rec, "FOCUS_ID") ;
721 RecordFieldPtr< Array<Double> > dirCol(rec, "DIRECTION") ;
722 *dirCol = nreader_->getDirection( i ) ;
723 RecordFieldPtr<Float> azCol(rec, "AZIMUTH") ;
724 *azCol = d->RAZ ;
725 RecordFieldPtr<Float> elCol(rec, "ELEVATION") ;
726 *elCol = d->REL ;
727 RecordFieldPtr<Float> parCol(rec, "PARANGLE") ;
728 RecordFieldPtr< Array<Float> > specCol(rec, "SPECTRA") ;
729 vector<double> spec = nreader_->getSpectrum( i ) ;
730 Array<Float> sp( IPosition( 1, spec.size() ) ) ;
731 int index = 0 ;
732 for ( Array<Float>::iterator itr = sp.begin() ; itr != sp.end() ; itr++ ) {
733 *itr = spec[index++] ;
734 }
735 *specCol = sp ;
736 RecordFieldPtr< Array<uChar> > flagCol(rec, "FLAGTRA") ;
737 Array<uChar> flag( sp.shape() ) ;
738 flag.set( 0 ) ;
739 *flagCol = flag ;
740 RecordFieldPtr< uInt > polnoCol(rec, "POLNO") ;
741 *polnoCol = 0 ;
742 RecordFieldPtr< Array<Float> > tsysCol(rec, "TSYS") ;
743 Array<Float> tsys( IPosition( 1, 1 ), d->TSYS ) ;
744 *tsysCol = tsys ;
745
746 table_->table().addRow() ;
747 row.put(table_->table().nrow()-1, rec) ;
748 }
749 else {
750 count++ ;
751 }
[1489]752 // DEBUG
753 //int rownum = nreader_->getRowNum() ;
754 //cout << "STFiller::readNRO() Finished row " << i << "/" << rownum << endl ;
755 //
[1458]756 }
757
758 // DEBUG
759 time_t t1 ;
760 time( &t1 ) ;
761 ttm = localtime( &t1 ) ;
762 cout << "STFiller::readNRO() Processed " << i << " rows" << endl ;
763 cout << "STFiller::readNRO() Added " << i - count << " rows (ignored "
764 << count << " \"ZERO\" scans)" << endl ;
765 cout << "STFiller::readNRO() End time = " << t1
766 << " ("
767 << ttm->tm_year + 1900 << "/" << ttm->tm_mon + 1 << "/" << ttm->tm_mday
768 << " "
769 << ttm->tm_hour << ":" << ttm->tm_min << ":" << ttm->tm_sec
770 << ")" << endl ;
771 cout << "STFiller::readNRO() Elapsed time = " << t1 - t0 << " sec" << endl ;
772 //
773
774 return 0 ;
775}
776
777Bool STFiller::fileCheck()
778{
779 // if filename_ is directory, return false
780 File inFile( filename_ ) ;
781 if ( inFile.isDirectory() )
782 return false ;
783
784 // if beginning of header data is "RW", return true
785 // otherwise, return false ;
786 FILE *fp = fopen( filename_.c_str(), "r" ) ;
787 char buf[9] ;
788 fread( buf, 4, 1, fp ) ;
789 buf[4] = '\0' ;
790 if ( ( strncmp( buf, "RW", 2 ) == 0 ) )
791 return true ;
792
793 return false ;
794}
795
[805]796}//namespace asap
Note: See TracBrowser for help on using the repository browser.