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

Last change on this file since 1518 was 1518, checked in by Takeshi Nakazato, 15 years ago

New Development: No

JIRA Issue: Yes CAS-1043

Ready to Release: No

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: asap_init()

s=sd.scantable('NRO_DATA_FILE',False)

Put in Release Notes: No

Module(s): Module Names change impacts.

Description:

Changed to get header informations together using newly defined method
NROReader::getHeaderInfo().

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