source: trunk/external-alma/oldasdm2ASAP/OldASDMReader.cc @ 2299

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

New Development: No

JIRA Issue: Yes CAS-1913

Ready for Test: Yes

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

Do not access Subscan/SubscanMode? if it doesn't exist.


File size: 68.6 KB
Line 
1#include <iostream>
2#include <sstream>
3
4#include <measures/Measures/MEpoch.h>
5#include <measures/Measures/MPosition.h>
6#include <measures/Measures/MDirection.h>
7#include <measures/Measures/MCDirection.h>
8#include <measures/Measures/MeasFrame.h>
9#include <measures/Measures/MeasConvert.h>
10#include <casa/Logging/LogMessage.h>
11#include <casa/BasicSL/Constants.h>
12
13#include "OldASDMReader.h"
14#include <atnf/PKSIO/SrcType.h>
15
16using namespace std ;
17//using namespace casa ;
18using namespace asdm ;
19using namespace sdmbin ;
20
21// sec to day
22double s2d = 1.0 / 86400.0 ;
23
24OldASDMReader::OldASDMReader()
25  : asdm_(0),
26    sdmBin_(0),
27    vmsData_(0),
28    antennaId_( -1 ),
29    antennaName_( "" ),
30    row_(-1),
31    apc_(AP_CORRECTED),
32    className_("OldASDMReader")
33{
34  configDescIdList_.resize(0) ;
35  feedIdList_.resize(0) ;
36  fieldIdList_.resize(0) ;
37  mainRow_.resize(0) ;
38  ifno_.clear() ;
39  corrMode_.reset() ;
40  timeSampling_.reset() ;
41}
42
43OldASDMReader::~OldASDMReader()
44{
45  close() ;
46  logsink_ = 0 ;
47}
48
49bool OldASDMReader::open( const string &filename, const casa::Record &rec )
50{
51  casa::String funcName = "open" ;
52
53  // return value
54  bool status = true ;
55
56  // set default
57  timeSampling_.reset() ;
58  corrMode_.reset() ;
59  resolutionType_.reset() ;
60  apc_ = AP_CORRECTED ;
61
62  // parsing ASDM options
63  if ( rec.isDefined( "asdm" ) ) {
64    casa::Record asdmrec = rec.asRecord( "asdm" ) ;
65
66    // antenna
67    if ( asdmrec.isDefined( "antenna" ) ) {
68      if ( asdmrec.type( asdmrec.fieldNumber( "antenna" ) ) == casa::TpInt ) {
69        antennaId_ = asdmrec.asInt( "antenna" ) ;
70      }
71      else {
72        antennaName_ = asdmrec.asString( "antenna" ) ;
73      }
74    }
75    else {
76      antennaId_ = 0 ;
77    }
78
79    // ATM phase correction
80    if ( asdmrec.isDefined( "apc" ) ) {
81      if ( asdmrec.asBool( "apc" ) )
82        apc_ = AP_CORRECTED ;
83      else
84        apc_ = AP_UNCORRECTED ;
85    }
86
87    // time sampling
88    String timeSampling = "all" ; // take all time sampling by default
89    if ( asdmrec.isDefined( "sampling" ) ) {
90      timeSampling = asdmrec.asString( "sampling" ) ;
91    }
92    if ( timeSampling == "all" ) {
93      timeSampling_.set( INTEGRATION ) ;
94      timeSampling_.set( SUBINTEGRATION ) ;
95    }
96    else if ( timeSampling == "integration" ) {
97      timeSampling_.set( INTEGRATION ) ;
98    }
99    else if ( timeSampling == "subintegration" ) {
100      timeSampling_.set( SUBINTEGRATION ) ;
101    }
102    else {
103      //throw AipsError( "Unrecognized option for sampling" ) ;
104      logsink_->postLocally( LogMessage( "Unrecognized option for time sampling: "+String::toString(timeSampling), LogOrigin(className_,funcName,WHERE), LogMessage::WARN ) ) ;
105      status = false ;
106    }     
107
108    // spectral resolution type
109    string resolutionType = "all" ;
110    if ( asdmrec.isDefined( "srt" ) ) {
111      resolutionType = string( asdmrec.asString( "srt" ) ) ;
112    }
113    string resolutionTypes[3] ;
114    Int numType = split( resolutionType, resolutionTypes, 3, "," ) ;
115    for ( Int it = 0 ; it < numType ; it++ ) {
116      if ( resolutionTypes[it] == "all" ) {
117        resolutionType_.reset() ;
118        resolutionType_.set( FULL_RESOLUTION ) ;
119        resolutionType_.set( BASEBAND_WIDE ) ;
120        resolutionType_.set( CHANNEL_AVERAGE ) ;
121        break ;
122      }
123      else if ( resolutionTypes[it] == "fr" ) {
124        resolutionType_.set( FULL_RESOLUTION ) ;
125      }
126      else if ( resolutionTypes[it] == "bw" ) {
127        resolutionType_.set( BASEBAND_WIDE ) ;
128      }
129      else if ( resolutionTypes[it] == "ca" ) {
130        resolutionType_.set( CHANNEL_AVERAGE ) ;
131      }
132    }
133    if ( resolutionType_.size() == 0 ) {
134      logsink_->postLocally( LogMessage( "Unrecognized option for spectral resolution type: "+String::toString(resolutionType), LogOrigin(className_,funcName,WHERE), LogMessage::WARN ) ) ;
135      status = false ;
136    }
137   
138    // input correlation mode
139    string corrMode = "ao,ca" ;
140    if ( asdmrec.isDefined( "corr" ) ) {
141      corrMode = string( asdmrec.asString( "corr" ) ) ;
142      //logsink_->postLocally( LogMessage("corrMode = "+String(corrMode),LogOrigin(className_,funcName,WHERE)) ) ;
143    }
144    string corrModes[3] ;
145    Int numCorr = split( corrMode, corrModes, 3, "," ) ;
146    for ( Int ic = 0 ; ic < numCorr ; ic++ ) {
147      if ( corrModes[ic] == "ao" ) {
148        corrMode_.set( AUTO_ONLY ) ;
149      }
150      else if ( corrModes[ic] == "ca" ) {
151        corrMode_.set( CROSS_AND_AUTO ) ;
152      }
153    }
154    if ( corrMode_.size() == 0 ) {
155      logsink_->postLocally( LogMessage( "Invalid option for correlation mode: "+String::toString(corrMode), LogOrigin(className_,funcName,WHERE), LogMessage::WARN ) ) ;
156      status = false ;
157    }
158
159//     logsink_->postLocally( LogMessage( "### asdmrec summary ###", LogOrigin(className_,funcName,WHERE) ) ) ;
160//     ostringstream oss ;
161//     asdmrec.print( oss ) ;
162//     logsink_->postLocally( LogMessage( oss.str(), LogOrigin(className_,funcName,WHERE) ) ) ;
163//     logsink_->postLocally( LogMessage( "#######################", LogOrigin(className_,funcName,WHERE) ) ) ;
164  }
165
166  // create ASDM object
167  asdm_ = new ASDM() ;
168  asdm_->setFromFile( filename ) ;
169
170  if ( antennaId_ == -1 ) {
171    AntennaTable &atab = asdm_->getAntenna() ;
172    vector<AntennaRow *> rows = atab.get() ;
173    int idx = -1 ;
174    for ( casa::uInt irow = 0 ; irow < rows.size() ; irow++ ) {
175      if ( casa::String(rows[irow]->getName()) == antennaName_ ) {
176        idx = rows[irow]->getAntennaId().getTagValue() ;
177        break ;
178      }
179    }
180    if ( idx == -1 ) {
181      close() ;
182      throw (casa::AipsError( antennaName_ + " not found." )) ;
183    }
184    else {
185      antennaId_ = idx ;
186    }
187  }
188
189  // set antenna name
190  if ( antennaName_.size() == 0 ) {
191    AntennaTable &atab = asdm_->getAntenna() ;
192    Tag tag( antennaId_, TagType::Antenna ) ;
193    AntennaRow *arow = atab.getRowByKey( tag ) ;
194    if ( arow == 0 ) {
195      close() ;
196      throw (casa::AipsError( tag.toString() + " not found." )) ;
197    }
198    else {
199      antennaName_ = casa::String( arow->getName() ) ;
200    }
201  }
202
203  // create SDMBinData object
204  sdmBin_ = new SDMBinData( asdm_, filename ) ;
205
206  // get Main rows
207  //mainRow_ = casa::Vector<MainRow *>(asdm_->getMain().get()) ;
208
209  // set up IFNO
210  setupIFNO() ;
211
212  // process Station table
213  processStation() ;
214
215  logsink_->postLocally( LogMessage(  "antennaId_ = "+String::toString(antennaId_), LogOrigin(className_,funcName,WHERE) ) ) ;
216  logsink_->postLocally( LogMessage(  "antennaName_ = "+antennaName_, LogOrigin(className_,funcName,WHERE) ) ) ;
217
218  return true ;
219}
220
221// void OldASDMReader::fill()
222// {
223// }
224
225void OldASDMReader::close()
226{
227  clearMainRow() ;
228
229  if ( sdmBin_ )
230    delete sdmBin_ ;
231  sdmBin_ = 0 ;
232
233  if ( asdm_ )
234    delete asdm_ ;
235  asdm_ = 0 ;
236
237  return ;
238}
239
240void OldASDMReader::fillHeader( casa::Int &nchan,
241                             casa::Int &npol,
242                             casa::Int &nif,
243                             casa::Int &nbeam,
244                             casa::String &observer,
245                             casa::String &project,
246                             casa::String &obstype,
247                             casa::String &antennaname,
248                             casa::Vector<casa::Double> &antennaposition,
249                             casa::Float &equinox,
250                             casa::String &freqref,
251                             casa::Double &reffreq,
252                             casa::Double &bandwidth,
253                             casa::Double &utc,
254                             casa::String &fluxunit,
255                             casa::String &epoch,
256                             casa::String &poltype )
257{
258  casa::String funcName = "fillHeader" ;
259
260  ExecBlockTable &ebtab = asdm_->getExecBlock() ;
261  // at the moment take first row of ExecBlock table
262  ExecBlockRow *ebrow = ebtab.get()[0] ;
263  casa::String telescopeName( ebrow->getTelescopeName() ) ;
264  AntennaTable &atab = asdm_->getAntenna() ;
265  AntennaRow *arow = atab.getRowByKey( Tag( antennaId_, TagType::Antenna ) ) ;
266  //StationTable &stab = asdm_->getStation() ;
267  //StationRow *srow = stab.getRowByKey( arow->getStationId() ) ;
268  StationRow *srow = arow->getStationUsingStationId() ;
269  casa::String stationName( srow->getName() ) ;
270
271  // antennaname
272  // <telescopeName>//<antennaName>@stationName
273  antennaname = telescopeName + "//" + antennaName_ + "@" + stationName ;
274  //logsink_->postLocally( LogMessage("antennaName = "+antennaname,LogOrigin(className_,funcName,WHERE)) ) ;
275
276  // antennaposition
277  //vector<Length> antpos = arow->getPosition() ;
278  vector<Length> antpos = srow->getPosition() ;
279  antennaposition.resize( 3 ) ;
280  for ( casa::uInt i = 0 ; i < 3 ; i++ )
281    antennaposition[i] = casa::Double( antpos[i].get() ) ;
282
283  // observer
284  observer = ebrow->getObserverName() ;
285
286  // project
287  // T.B.D. (project UID?)
288  project = "T.B.D. (" + ebrow->getProjectId().toString() + ")" ;
289
290  // utc
291  // start time of the project
292  utc = casa::Double( ebrow->getStartTime().getMJD() ) ;
293 
294
295  SpectralWindowTable &spwtab = asdm_->getSpectralWindow() ;
296  vector<SpectralWindowRow *> spwrows = spwtab.get() ;
297  int nspwrow = spwrows.size() ;
298
299  // nif
300  //nif = spwrows.size() ;
301  nif = getNumIFs() ;
302
303  // nchan
304  int refidx = -1 ;
305  vector<int> nchans ;
306  for ( int irow = 0 ; irow < nspwrow ; irow++ ) {
307    nchans.push_back( spwrows[irow]->getNumChan() ) ;
308    if ( refidx == -1 && nchans[irow] != 1 && nchans[irow] != 4 )
309      refidx = irow ;
310  }
311  nchan = casa::Int( *max_element( nchans.begin(), nchans.end() ) ) ;
312
313  //logsink_->postLocally( LogMessage("refidx = "+String::toString(refidx),LogOrigin(className_,funcName,WHERE)) ) ;
314
315  // bandwidth
316  vector<double> bws ;
317  for ( int irow = 0 ; irow < nspwrow ; irow++ ) {
318    if ( nchans[irow] != 4 ) { // exclude WVR data
319      bws.push_back( spwrows[irow]->getTotBandwidth().get() ) ;
320    }
321  }
322  bandwidth = casa::Double( *max_element( bws.begin(), bws.end() ) ) ;
323
324  // reffreq
325  reffreq = casa::Double( spwrows[refidx]->getRefFreq().get() ) ;
326
327  // freqref
328  if ( spwrows[refidx]->isMeasFreqRefExists() ) {
329    string mfr = CFrequencyReferenceCode::name( spwrows[refidx]->getMeasFreqRef() ) ;
330//     if (mfr == "TOPO") {
331//       freqref = "TOPOCENT";
332//     } else if (mfr == "GEO") {
333//       freqref = "GEOCENTR";
334//     } else if (mfr == "BARY") {
335//       freqref = "BARYCENT";
336//     } else if (mfr == "GALACTO") {
337//       freqref = "GALACTOC";
338//     } else if (mfr == "LGROUP") {
339//       freqref = "LOCALGRP";
340//     } else if (mfr == "CMB") {
341//       freqref = "CMBDIPOL";
342//     } else if (mfr == "REST") {
343//       freqref = "SOURCE";
344//     }
345    freqref = String( mfr ) ;
346  }
347  else {
348    // frequency reference is TOPOCENT by default
349    //freqref = "TOPOCENT" ;
350    freqref = "TOPO" ;
351  }
352
353
354  PolarizationTable &ptab = asdm_->getPolarization() ;
355  vector<PolarizationRow *> prows = ptab.get() ;
356  vector<int> npols ;
357  refidx = -1 ;
358  for ( unsigned int irow = 0 ; irow < prows.size() ; irow++ ) {
359    npols.push_back( prows[irow]->getNumCorr() ) ;
360    if ( refidx == -1 && npols[irow] != 1 )
361      refidx = irow ;
362  }
363  if ( refidx == -1 )
364    refidx = 0 ;
365
366  // npol
367  npol = casa::Int( *max_element( npols.begin(), npols.end() ) ) ;
368
369  // poltype
370  vector<StokesParameter> corrType = prows[refidx]->getCorrType() ;
371  if ( corrType[0] == I ||
372       corrType[0] == Q ||
373       corrType[0] == U ||
374       corrType[0] == V )
375    poltype = "stokes" ;
376  else if ( corrType[0] == RR ||
377            corrType[0] == RL ||
378            corrType[0] == LR ||
379            corrType[0] == LL )
380    poltype = "circular" ;
381  else if ( corrType[0] == XX ||
382            corrType[0] == XY ||
383            corrType[0] == YX ||
384            corrType[0] == YY )
385    poltype = "linear" ;
386  else if ( corrType[0] == PLINEAR ||
387            corrType[0] == PANGLE ) {
388    poltype = "linpol" ;
389  }
390  else {
391    poltype = "notype" ;
392  }
393
394
395  FeedTable &ftab = asdm_->getFeed() ;
396  vector<FeedRow *> frows = ftab.get() ;
397  vector<int> nbeams ;
398  for ( unsigned int irow = 0 ; irow < frows.size() ; irow++ ) {
399    if ( frows[irow]->isFeedNumExists() )
400      nbeams.push_back( frows[irow]->getFeedNum() ) ;
401    else
402      nbeams.push_back( 1 ) ;
403  }
404
405  // nbeam
406  nbeam = casa::Int( *max_element( nbeams.begin(), nbeams.end() ) ) ;
407
408  // fluxunit
409  // tentatively set 'K'? or empty?
410  fluxunit = "K" ;
411
412  // equinox
413  // tentatively set 2000.0
414  equinox = 2000.0 ;
415
416  // epoch
417  // tentatively set "UTC"
418  epoch = "UTC" ;
419
420  // obstype
421  // at the moment take observingMode attribute in SBSummary table
422  SBSummaryRow *sbrow = ebrow->getSBSummaryUsingSBSummaryId() ;
423  vector<string> obsmode = sbrow->getObservingMode() ;
424  obstype = "" ;
425  for ( unsigned int imode = 0 ; imode < obsmode.size() ; imode++ ) {
426    obstype += casa::String(obsmode[imode]) ;
427    if ( imode != obsmode.size()-1 )
428      obstype += "#" ;
429  }
430}
431
432void OldASDMReader::selectConfigDescription()
433{
434  casa::String funcName = "selectConfigDescription" ;
435
436  vector<ConfigDescriptionRow *> cdrows = asdm_->getConfigDescription().get() ;
437  vector<Tag> cdidTags ;
438  for ( unsigned int irow = 0 ; irow < cdrows.size() ; irow++ ) {
439    //logsink_->postLocally( LogMessage("correlationMode["+String::toString(irow)+"] = "+String::toString(cdrows[irow]->getCorrelationMode()),LogOrigin(className_,funcName,WHERE)) ) ;
440    if ( cdrows[irow]->getCorrelationMode() != CROSS_ONLY ) {
441      cdidTags.push_back( cdrows[irow]->getConfigDescriptionId() ) ;
442    }
443  }
444
445  configDescIdList_.resize( cdidTags.size() ) ;
446  for ( unsigned int i = 0 ; i < cdidTags.size() ; i++ ) {
447    configDescIdList_[i] = casa::uInt( cdidTags[i].getTagValue() ) ;
448  }
449}
450
451void OldASDMReader::selectFeed()
452{
453  feedIdList_.resize(0) ;
454  vector<FeedRow *> frows = asdm_->getFeed().get() ;
455  Tag atag( antennaId_, TagType::Antenna ) ;
456  for ( unsigned int irow = 0 ; irow < frows.size() ; irow++ ) {
457    casa::uInt feedId = (casa::uInt)(frows[irow]->getFeedId() ) ;
458    if ( casa::anyEQ( feedIdList_, feedId ) )
459      continue ;
460    if ( frows[irow]->getAntennaId() == atag ) {
461      unsigned int oldsize = feedIdList_.size() ;
462      feedIdList_.resize( oldsize+1, true ) ;
463      feedIdList_[oldsize] = feedId ;
464    }
465  }
466}
467
468casa::Vector<casa::uInt> OldASDMReader::getFieldIdList()
469{
470  casa::String funcName = "getFieldIdList" ;
471
472  vector<FieldRow *> frows = asdm_->getField().get() ;
473  fieldIdList_.resize( frows.size() ) ;
474  for ( unsigned int irow = 0 ; irow < frows.size() ; irow++ ) {
475    //logsink_->postLocally( LogMessage("fieldId["+String::toString(irow)+"]="+String(frows[irow]->getFieldId().toString()),LogOrigin(className_,funcName,WHERE)) ) ;
476    fieldIdList_[irow] = frows[irow]->getFieldId().getTagValue() ;
477  }
478
479  return fieldIdList_ ;
480}
481
482casa::uInt OldASDMReader::getNumMainRow()
483{
484  casa::uInt nrow = casa::uInt( mainRow_.size() ) ;
485
486  return nrow ;
487}
488
489void OldASDMReader::select()
490{
491  // selection by input CorrelationMode
492  EnumSet<CorrelationMode> esCorrs ;
493  sdmBin_->select( corrMode_ ) ;
494
495  // selection by TimeSampling
496  sdmBin_->select( timeSampling_ ) ;
497
498  // selection by SpectralResolutionType
499  sdmBin_->select( resolutionType_ ) ;
500
501  // selection by AtmPhaseCorrection and output CorrelationMode
502  EnumSet<AtmPhaseCorrection> esApcs ;
503  esApcs.set( apc_ ) ;
504  // always take only autocorrelation data
505  Enum<CorrelationMode> esCorr = AUTO_ONLY ;
506  sdmBin_->selectDataSubset( esCorr, esApcs ) ;
507
508  // select valid configDescriptionId
509  selectConfigDescription() ;
510
511  // select valid feedId
512  selectFeed() ;
513}
514
515casa::Bool OldASDMReader::setMainRow( casa::uInt irow )
516{
517  casa::Bool status = true ;
518  row_ = irow ;
519
520  unsigned int cdid = mainRow_[row_]->getConfigDescriptionId().getTagValue() ;
521  if ( (int)count(configDescIdList_.begin(),configDescIdList_.end(),cdid) == 0 )
522    status = false ;
523  else {
524    status = (casa::Bool)(sdmBin_->acceptMainRow( mainRow_[row_] )) ;
525  }
526  return status ;
527}
528
529casa::Bool OldASDMReader::setMainRow( casa::uInt configDescId, casa::uInt fieldId )
530{
531  clearMainRow() ;
532
533  Tag configDescTag( (unsigned int)configDescId, TagType::ConfigDescription ) ;
534  Tag fieldTag( (unsigned int)fieldId, TagType::Field ) ;
535  mainRow_ = casa::Vector<MainRow *>( *(asdm_->getMain().getByContext( configDescTag, fieldTag ) ) ) ;
536 
537  return true ;
538}
539
540void OldASDMReader::clearMainRow()
541{
542  mainRow_.resize(0) ;
543}
544
545void OldASDMReader::setupIFNO()
546{
547  casa::String funcName = "setupIFNO" ;
548
549  vector<SpectralWindowRow *> spwrows = asdm_->getSpectralWindow().get() ;
550  unsigned int nrow = spwrows.size() ;
551  ifno_.clear() ;
552  casa::uInt idx = 0 ;
553  casa::uInt wvridx = 0 ;
554  for ( unsigned int irow = 0 ; irow < nrow ; irow++ ) {
555    casa::uInt index ;
556    if ( isWVR( spwrows[irow] ) ) {
557      //logsink_->postLocally( LogMessage(spwrows[irow]->getSpectralWindowId().toString()+" is WVR",LogOrigin(className_,funcName,WHERE)) ) ;
558      index = wvridx ;
559    }
560    else {
561      index = ++idx ;
562    }
563    ifno_.insert( pair<Tag,casa::uInt>(spwrows[irow]->getSpectralWindowId(),index) ) ;
564    //logsink_->postLocally( LogMessage(spwrows[irow]->getSpectralWindowId().toString()+": IFNO="+String::toString(index),LogOrigin(className_,funcName,WHERE)) ) ;
565  }
566}
567
568bool OldASDMReader::isWVR( SpectralWindowRow *row )
569{
570  BasebandName bbname = row->getBasebandName() ;
571  int nchan = row->getNumChan() ;
572  if ( bbname == NOBB && nchan == 4 )
573    return true ;
574  else
575    return false ;
576}
577
578// casa::Vector<casa::uInt> OldASDMReader::getDataDescIdList( casa::uInt cdid )
579// {
580//   Tag cdTag( (unsigned int)cdid, TagType::ConfigDescription ) ;
581//   ConfigDescriptionRow *cdrow = asdm_->getConfigDescription().getRowByKey( cdTag ) ;
582//   vector<Tag> ddTags = cdrow->getDataDescriptionId() ;
583//   casa::Vector<casa::uInt> ddidList( ddTags.size() ) ;
584//   for ( unsigned int idd = 0 ; idd < ddTags.size() ; idd++ ) {
585//     ddidList[idd] = ddTags[idd].getTagValue() ;
586//   }
587//   return ddidList ;
588// }
589
590// casa::Vector<casa::uInt> OldASDMReader::getSwitchCycleIdList( casa::uInt cdid )
591// {
592//   Tag cdTag( (unsigned int)cdid, TagType::ConfigDescription ) ;
593//   ConfigDescriptionRow *cdrow = asdm_->getConfigDescription().getRowByKey( cdTag ) ;
594//   vector<Tag> scTags = cdrow->getSwitchCycleId() ;
595//   casa::Vector<casa::uInt> scidList( scTags.size() ) ;
596//   for ( unsigned int idd = 0 ; idd < scTags.size() ; idd++ ) {
597//     scidList[idd] = scTags[idd].getTagValue() ;
598//   }
599//   return scidList ;
600// }
601
602// casa::Vector<casa::uInt> OldASDMReader::getFeedIdList( casa::uInt cdid )
603// {
604//   casa::String funcName = "getFeedIdList" ;
605//   
606//   Tag cdTag( (unsigned int)cdid, TagType::ConfigDescription ) ;
607//   ConfigDescriptionRow *cdrow = asdm_->getConfigDescription().getRowByKey( cdTag ) ;
608//   casa::Vector<casa::uInt> feedIdList ;
609//   vector<int> feedIds = cdrow->getFeedId() ;
610//   for ( unsigned int ife = 0 ; ife < feedIds.size() ; ife++ ) {
611//     logsink_->postLocally( LogMessage("feedIds["+String::toString(ife)+"]="+String::toString(feedIds[ife]),LogOrigin(className_,funcName,WHERE)) ) ;
612//     if ( casa::anyEQ( feedIdList, casa::uInt( feedIds[ife] ) ) )
613//       continue ;
614//     if ( casa::anyEQ( feedIdList_, casa::uInt( feedIds[ife] ) ) ) {
615//       casa::uInt oldsize = feedIdList.size() ;
616//       feedIdList.resize( oldsize+1, true ) ;
617//       feedIdList[oldsize] = casa::uInt( feedIds[ife] ) ;
618//     }
619//   }
620//   logsink_->postLocally( LogMessage("feedIdList.size() = "+String::toString(feedIdList.size()),LogOrigin(className_,funcName,WHERE)) ) ;
621//   return feedIdList ;
622// }
623
624casa::Bool OldASDMReader::setData()
625{
626  casa::String funcName = "setData" ;
627
628  //logsink_->postLocally( LogMessage("try to retrieve binary data",LogOrigin(className_,funcName,WHERE)) ) ;
629 
630//   EnumSet<AtmPhaseCorrection> esApcs ;
631//   esApcs.set( apc_ ) ;
632//   // always take only autocorrelation data
633//   Enum<CorrelationMode> esCorr = AUTO_ONLY ;
634//   vmsData_ = sdmBin_->getDataCols( esCorr, esApcs ) ;
635
636  // 2011/07/06 TN
637  // Workaround to avoid unwanted message from SDMBinData::getDataCols()
638  ostringstream oss ;
639  streambuf *buforg = cout.rdbuf(oss.rdbuf()) ;
640  vmsData_ = sdmBin_->getDataCols() ;
641  cout.rdbuf(buforg) ;
642
643//   logsink_->postLocally( LogMessage("oss.str() = "+oss.str(),LogOrigin(className_,funcName,WHERE)) ) ;
644//   cout << "This is test: oss.str()=" << oss.str() << endl ;
645
646
647  //logsink_->postLocally( LogMessage("processorId = "+String::toString(vmsData_->processorId),LogOrigin(className_,funcName,WHERE)) ) ;
648  //logsink_->postLocally( LogMessage("v_time.size() = "+String::toString(vmsData_->v_time.size()),LogOrigin(className_,funcName,WHERE)) ) ;
649  //logsink_->postLocally( LogMessage("   v_time[0] = "+String::toString(vmsData_->v_time[0]),LogOrigin(className_,funcName,WHERE)) ) ;
650  //logsink_->postLocally( LogMessage("v_interval.size() = "+String::toString(vmsData_->v_interval.size()),LogOrigin(className_,funcName,WHERE)) ) ;
651  //logsink_->postLocally( LogMessage("   v_interval[0] = "+String::toString(vmsData_->v_interval[0]),LogOrigin(className_,funcName,WHERE)) ) ;
652  //logsink_->postLocally( LogMessage("v_atmPhaseCorrection.size() = "+String::toString(vmsData_->v_atmPhaseCorrection.size()),LogOrigin(className_,funcName,WHERE)) ) ;
653  //logsink_->postLocally( LogMessage("binNum = "+String::toString(vmsData_->binNum),LogOrigin(className_,funcName,WHERE)) ) ;
654  //logsink_->postLocally( LogMessage("v_projectPath.size() = "+String::toString(vmsData_->v_projectPath.size()),LogOrigin(className_,funcName,WHERE)) ) ;
655  //logsink_->postLocally( LogMessage("v_antennaId1.size() = "+String::toString(vmsData_->v_antennaId1.size()),LogOrigin(className_,funcName,WHERE)) ) ;
656  //logsink_->postLocally( LogMessage("v_antennaId2.size() = "+String::toString(vmsData_->v_antennaId2.size()),LogOrigin(className_,funcName,WHERE)) ) ;
657  //logsink_->postLocally( LogMessage("v_feedId1.size() = "+String::toString(vmsData_->v_feedId1.size()),LogOrigin(className_,funcName,WHERE)) ) ;
658  //logsink_->postLocally( LogMessage("v_feedId2.size() = "+String::toString(vmsData_->v_feedId2.size()),LogOrigin(className_,funcName,WHERE)) ) ;
659  //logsink_->postLocally( LogMessage("v_dataDescId.size() = "+String::toString(vmsData_->v_dataDescId.size()),LogOrigin(className_,funcName,WHERE)) ) ;
660  //logsink_->postLocally( LogMessage("v_timeCentroid.size() = "+String::toString(vmsData_->v_timeCentroid.size()),LogOrigin(className_,funcName,WHERE)) ) ;
661  //logsink_->postLocally( LogMessage("v_exposure.size() = "+String::toString(vmsData_->v_exposure.size()),LogOrigin(className_,funcName,WHERE)) ) ;
662  //logsink_->postLocally( LogMessage("v_numData.size() = "+String::toString(vmsData_->v_numData.size()),LogOrigin(className_,funcName,WHERE)) ) ;
663  //logsink_->postLocally( LogMessage("vv_dataShape.size() = "+String::toString(vmsData_->vv_dataShape.size()),LogOrigin(className_,funcName,WHERE)) ) ;
664  //logsink_->postLocally( LogMessage("v_m_data.size() = "+String::toString(vmsData_->v_m_data.size()),LogOrigin(className_,funcName,WHERE)) ) ;
665  //logsink_->postLocally( LogMessage("v_phaseDir.size() = "+String::toString(vmsData_->v_phaseDir.size()),LogOrigin(className_,funcName,WHERE)) ) ;
666  //logsink_->postLocally( LogMessage("v_stateId.size() = "+String::toString(vmsData_->v_stateId.size()),LogOrigin(className_,funcName,WHERE)) ) ;
667  //logsink_->postLocally( LogMessage("v_msState.size() = "+String::toString(vmsData_->v_msState.size()),LogOrigin(className_,funcName,WHERE)) ) ;
668  //logsink_->postLocally( LogMessage("v_flag.size() = "+String::toString(vmsData_->v_flag.size()),LogOrigin(className_,funcName,WHERE)) ) ;
669
670  dataIdList_.clear() ;
671  unsigned int numTotalData = vmsData_->v_m_data.size() ;
672  for ( unsigned int idata = 0 ; idata < numTotalData ; idata++ ) {
673    if ( vmsData_->v_antennaId1[idata] == (int)antennaId_
674         && vmsData_->v_antennaId2[idata] == (int)antennaId_ )
675      dataIdList_.push_back( idata ) ;
676  }
677  numData_ = dataIdList_.size() ;
678  //logsink_->postLocally( LogMessage("numData_ = "+String::toString(numData_),LogOrigin(className_,funcName,WHERE)) ) ;
679  //logsink_->postLocally( LogMessage("dataSize = "+String::toString(mainRow_[row_]->getDataSize()),LogOrigin(className_,funcName,WHERE)) ) ;
680
681  return true ;
682}
683
684casa::uInt OldASDMReader::getIFNo( unsigned int idx )
685{
686  Tag ddTag( vmsData_->v_dataDescId[dataIdList_[idx]], TagType::DataDescription ) ;
687  DataDescriptionRow *ddrow = asdm_->getDataDescription().getRowByKey( ddTag ) ;
688  Tag spwid = ddrow->getSpectralWindowId() ;
689  map<Tag,casa::uInt>::iterator iter = ifno_.find( spwid ) ;
690  if ( iter != ifno_.end() )
691    return iter->second ;
692  else {
693    return 0 ;
694  }
695}
696
697int OldASDMReader::getNumPol( unsigned int idx )
698{
699  Tag ddTag( vmsData_->v_dataDescId[dataIdList_[idx]], TagType::DataDescription ) ;
700  DataDescriptionRow *ddrow = asdm_->getDataDescription().getRowByKey( ddTag ) ;
701  PolarizationRow *polrow = ddrow->getPolarizationUsingPolOrHoloId() ;
702  return polrow->getNumCorr() ;
703}
704
705void OldASDMReader::getFrequency( unsigned int idx,
706                               double &refpix,
707                               double &refval,
708                               double &incr,
709                               string &freqref )
710{
711  casa::String funcName = "getFrequency" ;
712
713  Tag ddTag( vmsData_->v_dataDescId[dataIdList_[idx]], TagType::DataDescription ) ;
714  DataDescriptionRow *ddrow = asdm_->getDataDescription().getRowByKey( ddTag ) ;
715  //Tag spwid = ddrow->getSpectralWindowId() ;
716  SpectralWindowRow *spwrow = ddrow->getSpectralWindowUsingSpectralWindowId() ;
717  int nchan = spwrow->getNumChan() ;
718  freqref = "TOPO" ;
719  if ( spwrow->isMeasFreqRefExists() )
720    freqref = CFrequencyReferenceCode::toString( spwrow->getMeasFreqRef() ) ;
721  if ( nchan == 1 ) {
722    //logsink_->postLocally( LogMessage("channel averaged data",LogOrigin(className_,funcName,WHERE)) ) ;
723    refpix = 0.0 ;
724    incr = spwrow->getTotBandwidth().get() ;
725    if ( spwrow->isChanFreqStartExists() ) {
726      refval = spwrow->getChanFreqStart().get() ;
727    }
728    else if ( spwrow->isChanFreqArrayExists() ) {
729      refval = spwrow->getChanFreqArray()[0].get() ;
730    }
731    else {
732      throw (casa::AipsError( "Either chanFreqArray or chanFreqStart must exist." )) ;
733    }     
734  }
735  else if ( nchan % 2 ) {
736    // odd
737    //logsink_->postLocally( LogMessage("odd case",LogOrigin(className_,funcName,WHERE)) ) ;
738    refpix = 0.5 * ( (double)nchan - 1.0 ) ;
739    int ic = ( nchan - 1 ) / 2 ;
740    if ( spwrow->isChanWidthExists() ) {
741      incr = spwrow->getChanWidth().get() ;
742    }
743    else if ( spwrow->isChanWidthArrayExists() ) {
744      incr = spwrow->getChanWidthArray()[0].get() ;
745    }
746    else {
747      throw (casa::AipsError( "Either chanWidthArray or chanWidth must exist." )) ;
748    }     
749    if ( spwrow->isChanFreqStepExists() ) {
750      if ( spwrow->getChanFreqStep().get() < 0.0 )
751        incr *= -1.0 ;
752    }
753    else if ( spwrow->isChanFreqArrayExists() ) {
754      vector<Frequency> chanFreqArr = spwrow->getChanFreqArray() ;
755      if ( chanFreqArr[0].get() > chanFreqArr[1].get() )
756        incr *= -1.0 ;
757    }
758    else {
759      throw (casa::AipsError( "Either chanFreqArray or chanFreqStep must exist." )) ;
760    }         
761    if ( spwrow->isChanFreqStartExists() ) {
762      refval = spwrow->getChanFreqStart().get() + refpix * incr ;
763    }
764    else if ( spwrow->isChanFreqArrayExists() ) {
765      refval = spwrow->getChanFreqArray()[ic].get() ;
766    }
767    else {
768      throw (casa::AipsError( "Either chanFreqArray or chanFreqStart must exist." )) ;
769    }     
770  }
771  else {
772    // even
773    //logsink_->postLocally( LogMessage("even case",LogOrigin(className_,funcName,WHERE)) ) ;
774    refpix = 0.5 * ( (double)nchan - 1.0 ) ;
775    int ic = nchan / 2 ;
776    if ( spwrow->isChanWidthExists() ) {
777      incr = spwrow->getChanWidth().get() ;
778    }
779    else if ( spwrow->isChanWidthArrayExists() ) {
780      incr = spwrow->getChanWidthArray()[0].get() ;
781    }
782    else {
783      throw (casa::AipsError( "Either chanWidthArray or chanWidth must exist." )) ;
784    }
785    if ( spwrow->isChanFreqStepExists() ) {
786      if ( spwrow->getChanFreqStep().get() < 0.0 )
787        incr *= -1.0 ;
788    }
789    else if ( spwrow->isChanFreqArrayExists() ) {
790      vector<Frequency> chanFreqArr = spwrow->getChanFreqArray() ;
791      if ( chanFreqArr[0].get() > chanFreqArr[1].get() )
792        incr *= -1.0 ;
793    }
794    else {
795      throw (casa::AipsError( "Either chanFreqArray or chanFreqStep must exist." )) ;
796    }         
797    if ( spwrow->isChanFreqStartExists() ) {
798      refval = spwrow->getChanFreqStart().get() + refpix * incr ;
799    }
800    else if ( spwrow->isChanFreqArrayExists() ) {
801      vector<Frequency> freqs = spwrow->getChanFreqArray() ;
802      refval = 0.5 * ( freqs[ic-1].get() + freqs[ic].get() ) ;     
803    }
804    else {
805      throw (casa::AipsError( "Either chanFreqArray or chanFreqStart must exist." )) ;
806    }     
807  }
808}
809
810vector<double> OldASDMReader::getRestFrequency( unsigned int idx )
811{
812  vector<double> rf( 0 ) ;
813  unsigned int index = dataIdList_[idx] ;
814  //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
815  double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
816  ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
817  Tag ddtag( vmsData_->v_dataDescId[index], TagType::DataDescription ) ;
818  Tag spwtag = asdm_->getDataDescription().getRowByKey(ddtag)->getSpectralWindowId() ;
819  Tag ftag( vmsData_->v_fieldId[index], TagType::Field ) ;
820  FieldRow *frow = asdm_->getField().getRowByKey( ftag ) ;
821  if ( frow->isSourceIdExists() ) {
822    //logsink_->postLocally( LogMessage("sourceId exists",LogOrigin(className_,funcName,WHERE)) ) ;
823    int sid = frow->getSourceId() ;
824    SourceRow *srow = asdm_->getSource().getRowByKey( sid, tint, spwtag ) ;
825    if ( srow->isRestFrequencyExists() ) {
826      //logsink_->postLocally( LogMessage("restFrequency exists",LogOrigin(className_,funcName,WHERE)) ) ;
827      vector<Frequency> restfreq = srow->getRestFrequency() ;
828      rf.resize( restfreq.size() ) ;
829      for ( unsigned int i = 0 ; i < restfreq.size() ; i++ )
830        rf[i] = restfreq[i].get() ;
831    }
832  }
833  return rf ;
834}
835
836double OldASDMReader::getTime( unsigned int idx )
837{
838  double tsec = vmsData_->v_time[dataIdList_[idx]] ;
839  return tsec * s2d ;
840}
841
842double OldASDMReader::getInterval( unsigned int idx )
843{
844  return vmsData_->v_interval[dataIdList_[idx]] ;
845}
846
847string OldASDMReader::getSourceName( unsigned int idx )
848{
849  unsigned int index = dataIdList_[idx] ;
850  //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
851  double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
852  ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
853  Tag ddtag( vmsData_->v_dataDescId[index], TagType::DataDescription ) ;
854  Tag spwtag = asdm_->getDataDescription().getRowByKey(ddtag)->getSpectralWindowId() ;
855  Tag ftag( vmsData_->v_fieldId[index], TagType::Field ) ;
856  FieldRow *frow = asdm_->getField().getRowByKey( ftag ) ;
857  string srcname ;
858  if ( frow->isSourceIdExists() ) {
859    //logsink_->postLocally( LogMessage("sourceId exists",LogOrigin(className_,funcName,WHERE)) ) ;
860    int sid = frow->getSourceId() ;
861    SourceRow *srow = asdm_->getSource().getRowByKey( sid, tint, spwtag ) ;
862    srcname = srow->getSourceName() ;
863  }
864  else {
865    srcname = frow->getFieldName() ;
866  }
867  return srcname ;
868}
869
870string OldASDMReader::getFieldName( unsigned int idx )
871{
872  int fid = vmsData_->v_fieldId[dataIdList_[idx]] ;
873  Tag ftag( fid, TagType::Field ) ;
874  FieldRow *frow = asdm_->getField().getRowByKey( ftag ) ;
875  ostringstream oss ;
876  oss << frow->getFieldName() << "__" << fid ;
877  return oss.str() ;
878}
879
880int OldASDMReader::getSrcType( unsigned int scan,
881                            unsigned int subscan )
882{
883  int srctype = SrcType::NOTYPE ;
884  Tag ebtag = mainRow_[row_]->getExecBlockId() ;
885  ScanRow *scanrow = asdm_->getScan().getRowByKey( ebtag, (int)scan ) ;
886  ScanIntent scanIntent = scanrow->getScanIntent()[0] ;
887  SubscanRow *subrow = asdm_->getSubscan().getRowByKey( ebtag, (int)scan, (int)subscan ) ;
888  SubscanIntent subIntent = subrow->getSubscanIntent() ;
889  SwitchingMode swmode = NO_SWITCHING ;
890  if ( subrow->isSubscanModeExists() )
891    swmode = subrow->getSubscanMode() ;
892  if ( scanIntent == OBSERVE_TARGET ) {
893    // on sky scan
894    if ( swmode == NO_SWITCHING || swmode == POSITION_SWITCHING ) {
895      // position switching
896      // tentatively set NO_SWITCHING = POSITION_SWITCHING
897      if ( subIntent == ON_SOURCE ) {
898        srctype = SrcType::PSON ;
899      }
900      else if ( subIntent == OFF_SOURCE ) {
901        srctype = SrcType::PSOFF ;
902      }
903    }
904    else if ( swmode == FREQUENCY_SWITCHING ) {
905      // frequency switching
906      if ( subIntent == ON_SOURCE ) {
907        srctype = SrcType::FSON ;
908      }
909      else if ( subIntent == OFF_SOURCE ) {
910        srctype = SrcType::FSOFF ;
911      }
912    }
913    else if ( swmode == NUTATOR_SWITCHING ) {
914      // nutator switching
915      if ( subIntent == ON_SOURCE ) {
916        srctype = SrcType::PSON ;
917      }
918      else if ( subIntent == OFF_SOURCE ) {
919        srctype = SrcType::PSOFF ;
920      }
921    }
922    else {
923      // other switching mode
924      if ( subIntent == ON_SOURCE ) {
925        srctype = SrcType::SIG ;
926      }
927      else if ( subIntent == OFF_SOURCE ) {
928        srctype = SrcType::REF ;
929      }
930    }
931  }
932  else if ( scanIntent == CALIBRATE_ATMOSPHERE ) {
933    if ( swmode == NO_SWITCHING || swmode == POSITION_SWITCHING ) {
934      // position switching
935      // tentatively set NO_SWITCHING = POSITION_SWITCHING
936      if ( subIntent == ON_SOURCE ) {
937        srctype = SrcType::PONCAL ;
938      }
939      else if ( subIntent == OFF_SOURCE ) {
940        srctype = SrcType::POFFCAL ;
941      }
942    }
943    else if ( swmode == FREQUENCY_SWITCHING ) {
944      // frequency switching
945      if ( subIntent == ON_SOURCE ) {
946        srctype = SrcType::FONCAL ;
947      }
948      else if ( subIntent == OFF_SOURCE ) {
949        srctype = SrcType::FOFFCAL ;
950      }
951    }
952    else if ( swmode == NUTATOR_SWITCHING ) {
953      // nutator switching
954      if ( subIntent == ON_SOURCE ) {
955        srctype = SrcType::PONCAL ;
956      }
957      else if ( subIntent == OFF_SOURCE ) {
958        srctype = SrcType::POFFCAL ;
959      }
960    }
961    else {
962      // other switching mode
963      if ( subIntent == ON_SOURCE ) {
964        srctype = SrcType::CAL ;
965      }
966      else if ( subIntent == OFF_SOURCE ) {
967        srctype = SrcType::CAL ;
968      }
969    }
970  }
971  else {
972    // off sky (e.g. calibrator device) scan
973    if ( subIntent == ON_SOURCE ) {
974      srctype = SrcType::SIG ;
975    }
976    else if ( subIntent == OFF_SOURCE ) {
977      srctype = SrcType::REF ;
978    }
979    else if ( subIntent == HOT ) {
980      srctype = SrcType::HOT ;
981    }
982    else if ( subIntent == AMBIENT ) {
983      srctype = SrcType::SKY ;
984    }
985    else {
986      srctype = SrcType::CAL ;
987    }
988  }
989
990  return srctype ;
991}
992
993unsigned int OldASDMReader::getSubscanNo( unsigned int idx )
994{
995  //logsink_->postLocally( LogMessage("subscan"+String::toString(vmsData_->v_msState[dataIdList_[idx]].subscanNum)+": obsmode="+String::toString(vmsData_->v_msState[dataIdList_[idx]].obsMode),LogOrigin(className_,funcName,WHERE)) ) ;
996  return vmsData_->v_msState[dataIdList_[idx]].subscanNum ;
997}
998
999vector<double> OldASDMReader::getSourceDirection( unsigned int idx )
1000{
1001  vector<double> dir( 2, 0.0 ) ;
1002  unsigned int index = dataIdList_[idx] ;
1003  //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
1004  double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
1005  ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
1006  Tag ddtag( vmsData_->v_dataDescId[index], TagType::DataDescription ) ;
1007  Tag spwtag = asdm_->getDataDescription().getRowByKey(ddtag)->getSpectralWindowId() ;
1008  Tag ftag( vmsData_->v_fieldId[index], TagType::Field ) ;
1009  FieldRow *frow = asdm_->getField().getRowByKey( ftag ) ;
1010  string srcname ;
1011  if ( frow->isSourceIdExists() ) {
1012    //logsink_->postLocally( LogMessage("sourceId exists",LogOrigin(className_,funcName,WHERE)) ) ;
1013    int sid = frow->getSourceId() ;
1014    SourceRow *srow = asdm_->getSource().getRowByKey( sid, tint, spwtag ) ;
1015    vector<Angle> srcdir = srow->getDirection() ;
1016    dir[0] = limitedAngle( srcdir[0].get() ) ;
1017    dir[1] = limitedAngle( srcdir[1].get() ) ;
1018    if ( srow->isDirectionCodeExists() ) {
1019      DirectionReferenceCode dircode = srow->getDirectionCode() ;
1020      //logsink_->postLocally( LogMessage("dircode="+CDirectionReferenceCode::toString(dircode),LogOrigin(className_,funcName,WHERE)) ) ;
1021      if ( dircode != J2000 ) {
1022        // if not J2000, need direction conversion
1023        string ref = CDirectionReferenceCode::toString( dircode ) ;
1024        double mjd = vmsData_->v_time[index] * s2d ;
1025        Tag atag( antennaId_, TagType::Antenna ) ;
1026        AntennaRow *arow = asdm_->getAntenna().getRowByKey( atag ) ;
1027        StationRow *srow = arow->getStationUsingStationId() ;
1028        vector<Length> antposL = srow->getPosition() ;
1029        casa::Vector<casa::Double> antpos( 3 ) ;
1030        for ( int i = 0 ; i < 3 ; i++ )
1031          antpos[i] = antposL[i].get() ;
1032        dir = toJ2000( dir, ref, mjd, antpos ) ;
1033      }
1034    }
1035  }
1036  return dir ;
1037}
1038
1039void OldASDMReader::getSourceDirection( unsigned int idx,
1040                                     vector<double> &dir,
1041                                     string &ref )
1042{
1043  dir.resize( 2 ) ;
1044  dir[0] = 0.0 ;
1045  dir[1] = 0.0 ;
1046  ref = "J2000" ;
1047  unsigned int index = dataIdList_[idx] ;
1048  //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
1049  double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
1050  ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
1051  Tag ddtag( vmsData_->v_dataDescId[index], TagType::DataDescription ) ;
1052  Tag spwtag = asdm_->getDataDescription().getRowByKey(ddtag)->getSpectralWindowId() ;
1053  Tag ftag( vmsData_->v_fieldId[index], TagType::Field ) ;
1054  FieldRow *frow = asdm_->getField().getRowByKey( ftag ) ;
1055  string srcname ;
1056  if ( frow->isSourceIdExists() ) {
1057    //logsink_->postLocally( LogMessage("sourceId exists",LogOrigin(className_,funcName,WHERE)) ) ;
1058    int sid = frow->getSourceId() ;
1059    SourceRow *srow = asdm_->getSource().getRowByKey( sid, tint, spwtag ) ;
1060    vector<Angle> srcdir = srow->getDirection() ;
1061    if ( srow->isDirectionCodeExists() ) {
1062      ref = CDirectionReferenceCode::toString( srow->getDirectionCode() ) ;
1063    }
1064    dir[0] = limitedAngle( srcdir[0].get() ) ;
1065    dir[1] = limitedAngle( srcdir[1].get() ) ;
1066  }
1067}
1068
1069void OldASDMReader::getSourceDirection( vector<double> &dir, string &ref )
1070{
1071  dir.resize( 2 ) ;
1072  ref = "J2000" ; // default is J2000
1073  SourceTable &tab = asdm_->getSource() ;
1074  SourceRow *row = tab.get()[0] ;
1075  vector<Angle> dirA = row->getDirection() ;
1076  dir[0] = dirA[0].get() ;
1077  dir[1] = dirA[1].get() ;
1078  if ( row->isDirectionCodeExists() ) {
1079    ref = CDirectionReferenceCode::toString( row->getDirectionCode() ) ;
1080  }
1081}
1082
1083vector<double> OldASDMReader::getSourceProperMotion( unsigned int idx )
1084{
1085  vector<double> pm( 2, 0.0 ) ;
1086  unsigned int index = dataIdList_[idx] ;
1087  //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
1088  double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
1089  ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
1090  Tag ddtag( vmsData_->v_dataDescId[index], TagType::DataDescription ) ;
1091  Tag spwtag = asdm_->getDataDescription().getRowByKey(ddtag)->getSpectralWindowId() ;
1092  Tag ftag( vmsData_->v_fieldId[index], TagType::Field ) ;
1093  FieldRow *frow = asdm_->getField().getRowByKey( ftag ) ;
1094  string srcname ;
1095  if ( frow->isSourceIdExists() ) {
1096    //logsink_->postLocally( LogMessage("sourceId exists",LogOrigin(className_,funcName,WHERE)) ) ;
1097    int sid = frow->getSourceId() ;
1098    SourceRow *srow = asdm_->getSource().getRowByKey( sid, tint, spwtag ) ;
1099    vector<AngularRate> srcpm = srow->getProperMotion() ;
1100    pm[0] = srcpm[0].get() ;
1101    pm[1] = srcpm[1].get() ;
1102  }
1103  return pm ;
1104}
1105
1106double OldASDMReader::getSysVel( unsigned int idx )
1107{
1108  double sysvel = 0.0 ;
1109  unsigned int index = dataIdList_[idx] ;
1110  //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
1111  double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
1112  ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
1113  Tag ddtag( vmsData_->v_dataDescId[index], TagType::DataDescription ) ;
1114  Tag spwtag = asdm_->getDataDescription().getRowByKey(ddtag)->getSpectralWindowId() ;
1115  Tag ftag( vmsData_->v_fieldId[index], TagType::Field ) ;
1116  FieldRow *frow = asdm_->getField().getRowByKey( ftag ) ;
1117  string srcname ;
1118  if ( frow->isSourceIdExists() ) {
1119    //logsink_->postLocally( LogMessage("sourceId exists",LogOrigin(className_,funcName,WHERE)) ) ;
1120    int sid = frow->getSourceId() ;
1121    SourceRow *srow = asdm_->getSource().getRowByKey( sid, tint, spwtag ) ;
1122    if ( srow->isSysVelExists() ) {
1123      vector<Speed> sysvelV = srow->getSysVel() ;
1124      if ( sysvelV.size() > 0 )
1125        sysvel = sysvelV[0].get() ;
1126    }
1127  }
1128  return sysvel ;
1129}
1130
1131unsigned int OldASDMReader::getFlagRow( unsigned int idx )
1132{
1133  return vmsData_->v_flag[dataIdList_[idx]] ;
1134}
1135
1136vector<unsigned int> OldASDMReader::getDataShape( unsigned int idx )
1137{
1138  return vmsData_->vv_dataShape[dataIdList_[idx]] ;
1139}
1140
1141float * OldASDMReader::getSpectrum( unsigned int idx )
1142{
1143  map<AtmPhaseCorrection, float*> data = vmsData_->v_m_data[dataIdList_[idx]] ;
1144  //map<AtmPhaseCorrection, float*>::iterator iter = data.find(AP_UNCORRECTED) ;
1145  map<AtmPhaseCorrection, float*>::iterator iter = data.find(apc_) ;
1146  float *autoCorr = iter->second ;
1147  return autoCorr ;
1148}
1149
1150// bool * OldASDMReader::getFlagChannel( unsigned int idx )
1151// {
1152//   return 0 ;
1153// }
1154
1155vector< vector<float> > OldASDMReader::getTsys( unsigned int idx )
1156{
1157  vector< vector<float> > defaultTsys( 1, vector<float>( 1, 1.0 ) ) ;
1158  SysCalRow *scrow = getSysCalRow( idx ) ;
1159  if ( scrow != 0 && scrow->isTsysSpectrumExists() ) {
1160    vector< vector<Temperature> > tsysSpec = scrow->getTsysSpectrum() ;
1161    unsigned int numReceptor = tsysSpec.size() ;
1162    unsigned int numChan = tsysSpec[0].size() ;
1163    vector< vector<float> > tsys( numReceptor, vector<float>( numChan, 1.0 ) ) ;
1164    for ( unsigned int ir = 0 ; ir < numReceptor ; ir++ ) {
1165      for ( unsigned int ic = 0 ; ic < numChan ; ic++ ) {
1166        tsys[ir][ic] = tsysSpec[ir][ic].get() ;
1167      }
1168    }
1169    return tsys ;
1170  }
1171//   else if ( scrow->isTsysExists() ) {
1172//     vector<Temperature> tsysScalar = scrow->getTsys() ;
1173//     unsigned int numReceptor = tsysScalar.size() ;
1174//     vector< vector<float> > tsys( numReceptor ) ;
1175//     for ( unsigned int ir = 0 ; ir < numReceptor ; ir++ )
1176//       tsys[ir] = vector<float>( 1, tsysScalar[ir].get() ) ;
1177//     return tsys ;
1178//   }
1179  else {
1180    return defaultTsys ;
1181  }
1182}
1183
1184vector< vector<float> > OldASDMReader::getTcal( unsigned int idx )
1185{
1186  vector< vector<float> > defaultTcal( 1, vector<float>( 1, 1.0 ) ) ;
1187  SysCalRow *scrow = getSysCalRow( idx ) ;
1188  if ( scrow != 0 && scrow->isTcalSpectrumExists() ) {
1189    vector< vector<Temperature> > tcalSpec = scrow->getTcalSpectrum() ;
1190    unsigned int numReceptor = tcalSpec.size() ;
1191    unsigned int numChan = tcalSpec[0].size() ;
1192    vector< vector<float> > tcal( numReceptor, vector<float>( numChan, 1.0 ) ) ;
1193    for ( unsigned int ir = 0 ; ir < numReceptor ; ir++ ) {
1194      for ( unsigned int ic = 0 ; ic < numChan ; ic++ ) {
1195        tcal[ir][ic] = tcalSpec[ir][ic].get() ;
1196      }
1197    }
1198    return tcal ;
1199  }
1200//   else if ( scrow->isTcalExists() ) {
1201//     vector<Temperature> tcalScalar = scrow->getTcal() ;
1202//     unsigned int numReceptor = tcalScalar.size() ;
1203//     vector< vector<float> > tcal( numReceptor, vector<float>( 1, 1.0 ) ) ;
1204//     for ( unsigned int ir = 0 ; ir < numReceptor ; ir++ )
1205//       tcal[ir][0] = tcalScalar[ir][0].get() ;
1206//     return tcal ;
1207//   }
1208  else {
1209    return defaultTcal ;
1210  }
1211}
1212
1213void OldASDMReader::getTcalAndTsys( unsigned int idx,
1214                                 vector< vector<float> > &tcal,
1215                                 vector< vector<float> > &tsys )
1216{
1217  String funcName = "getTcalAndTsys" ;
1218
1219  vector< vector<float> > defaultT( 1, vector<float>( 1, 1.0 ) ) ;
1220  SysCalRow *scrow = getSysCalRow( idx ) ;
1221  if ( scrow == 0 ) {
1222    tcal = defaultT ;
1223    tsys = defaultT ;
1224  }
1225  else {
1226    if ( scrow->isTsysSpectrumExists() ) {
1227      vector< vector<Temperature> > tsysSpec = scrow->getTsysSpectrum() ;
1228      unsigned int numReceptor = tsysSpec.size() ;
1229      unsigned int numChan = tsysSpec[0].size() ;
1230      tsys.resize( numReceptor ) ;
1231      for ( unsigned int ir = 0 ; ir < numReceptor ; ir++ ) {
1232        tsys[ir].resize( numChan ) ;
1233        for ( unsigned int ic = 0 ; ic < numChan ; ic++ ) {
1234          tsys[ir][ic] = tsysSpec[ir][ic].get() ;
1235        }
1236      }
1237    }
1238    else {
1239      tsys = defaultT ;
1240    }
1241    if ( scrow->isTcalSpectrumExists() ) {
1242      vector< vector<Temperature> > tcalSpec = scrow->getTcalSpectrum() ;
1243      unsigned int numReceptor = tcalSpec.size() ;
1244      unsigned int numChan = tcalSpec[0].size() ;
1245      tcal.resize( numReceptor ) ;
1246      for ( unsigned int ir = 0 ; ir < numReceptor ; ir++ ) {
1247        tcal[ir].resize( numReceptor ) ;
1248        for ( unsigned int ic = 0 ; ic < numChan ; ic++ ) {
1249          tcal[ir][ic] = tcalSpec[ir][ic].get() ;
1250        }
1251      }
1252    }
1253    else {
1254      tcal = defaultT ;
1255    }
1256  }
1257}
1258
1259vector<float> OldASDMReader::getOpacity( unsigned int idx )
1260{
1261  vector<float> tau(0) ;
1262  CalAtmosphereTable &atmtab = asdm_->getCalAtmosphere() ;
1263  unsigned int nrow = atmtab.size() ;
1264  if ( nrow > 0 ) {
1265    unsigned int index = dataIdList_[idx] ;
1266    //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
1267    double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
1268    ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
1269    //int feedid = vmsData_->v_feedId1[index] ;
1270    //Tag atag( antennaId_, TagType::Antenna ) ;
1271    //Tag ddtag( vmsData_->v_dataDescId[index], TagType::DataDescription ) ;
1272    //DataDescriptionRow *ddrow = asdm_->getDataDescription().getRowByKey(ddtag) ;
1273    //Tag spwtag = ddrow->getSpectralWindowId() ;
1274    //SpectralWindowRow *spwrow = ddrow->getSpectralWindowUsingSpectralWindowId() ;
1275    //BasebandName bbname = spwrow->getBasebandName() ;
1276    //FeedRow *frow = asdm_->getFeed().getRowByKey( atag, spwtag, tint, feedid ) ;
1277    //int nfeed = frow->getNumReceptor() ;
1278    //vector<ReceiverRow *> rrows = frow->getReceivers() ;
1279    vector<CalAtmosphereRow *> atmrows = atmtab.get() ;
1280    //ReceiverBand rb = rrows[0]->getFrequencyBand() ;
1281    int row0 = -1 ;
1282    double eps = tint.getStart().getMJD() ;
1283    for ( unsigned int irow = 0 ; irow < nrow ; irow++ ) {
1284      CalAtmosphereRow *atmrow = atmrows[irow] ;
1285      if ( casa::String(atmrow->getAntennaName()) != antennaName_
1286           //|| atmrow->getReceiverBand() != rb
1287           //|| atmrow->getBasebandName() != bbname
1288           || atmrow->getCalDataUsingCalDataId()->getCalType() != CAL_ATMOSPHERE )
1289        continue ;
1290      else {
1291        double dt = tint.getStart().getMJD() - atmrow->getEndValidTime().getMJD() ;
1292        if ( dt >= 0 && dt < eps ) {
1293          eps = dt ;
1294          row0 = (int)irow ;
1295        }
1296      }
1297    }
1298    if ( row0 != -1 ) {
1299      CalAtmosphereRow *atmrow = atmrows[row0] ;
1300      tau = atmrow->getTau() ;
1301    }
1302  }
1303  else {
1304    tau.resize( 1 ) ;
1305    tau[0] = 0.0 ;
1306  }
1307  return tau ;
1308}
1309
1310void OldASDMReader::getWeatherInfo( unsigned int idx,
1311                                 float &temperature,
1312                                 float &pressure,
1313                                 float &humidity,
1314                                 float &windspeed,
1315                                 float &windaz )
1316{
1317  casa::String funcName = "getWeatherInfo" ;
1318
1319  temperature = 0.0 ;
1320  pressure = 0.0 ;
1321  humidity = 0.0 ;
1322  windspeed = 0.0 ;
1323  windaz = 0.0 ;
1324
1325  //logsink_->postLocally( LogMessage("weatherStationId_ = "+String::toString(weatherStationId_),LogOrigin(className_,funcName,WHERE)) ) ;
1326
1327  WeatherTable &wtab = asdm_->getWeather() ;
1328  if ( wtab.size() == 0 || weatherStationId_ == -1 )
1329    return ;
1330
1331  unsigned int index = dataIdList_[idx] ;
1332  //Tag anttag( antennaId_, TagType::Antenna ) ;
1333  //Tag sttag = (asdm_->getAntenna().getRowByKey( anttag ))->getStationId() ;
1334  Tag sttag( (unsigned int)weatherStationId_, TagType::Station ) ;
1335  //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
1336  double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
1337  ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
1338  //WeatherRow *wrow = wtab.getRowByKey( sttag, tint ) ;
1339  vector<WeatherRow *> *wrows = wtab.getByContext( sttag ) ;
1340  WeatherRow *wrow = (*wrows)[0] ;
1341  unsigned int nrow = wrows->size() ;
1342  //logsink_->postLocally( LogMessage("There are "+String::toString(nrow)+" rows for given context: stationId "+String::toString(weatherStationId_),LogOrigin(className_,funcName,WHERE)) ) ;
1343  ArrayTime startTime = getMidTime( tint ) ;
1344  if ( startTime < (*wrows)[0]->getTimeInterval().getStart() ) {
1345    temperature = (*wrows)[0]->getTemperature().get() ;
1346    pressure = (*wrows)[0]->getPressure().get() ;
1347    humidity = (*wrows)[0]->getRelHumidity().get() ;
1348    windspeed = (*wrows)[0]->getWindSpeed().get() ;
1349    windaz = (*wrows)[0]->getWindDirection().get() ;
1350  }
1351  else if ( startTime > getEndTime( (*wrows)[nrow-1]->getTimeInterval() ) ) {
1352    temperature = (*wrows)[nrow-1]->getTemperature().get() ;
1353    pressure = (*wrows)[nrow-1]->getPressure().get() ;
1354    humidity = (*wrows)[nrow-1]->getRelHumidity().get() ;
1355    windspeed = (*wrows)[nrow-1]->getWindSpeed().get() ;
1356    windaz = (*wrows)[nrow-1]->getWindDirection().get() ;
1357  }
1358  else {
1359    for ( unsigned int irow = 1 ; irow < wrows->size() ; irow++ ) {
1360      wrow = (*wrows)[irow-1] ;
1361      ArrayTime tStart = wrow->getTimeInterval().getStart() ;
1362      ArrayTime tEnd = (*wrows)[irow]->getTimeInterval().getStart() ;
1363      if ( startTime >= tStart && startTime <= tEnd ) {
1364        temperature = wrow->getTemperature().get() ;
1365        pressure = wrow->getPressure().get() ;
1366        humidity = wrow->getRelHumidity().get() ;
1367        windspeed = wrow->getWindSpeed().get() ;
1368        windaz = wrow->getWindDirection().get() ;
1369        break ;
1370      }
1371    }
1372  }
1373
1374  // Pa -> hPa
1375  pressure /= 100.0 ;
1376
1377  return ;
1378}
1379
1380void OldASDMReader::processStation()
1381{
1382  antennaPad_.resize(0) ;
1383  weatherStation_.resize(0) ;
1384  StationTable &stab = asdm_->getStation() ;
1385  vector<StationRow *> srows = stab.get() ;
1386  for ( unsigned int irow = 0 ; irow < srows.size() ; irow++ ) {
1387    StationType stype = srows[irow]->getType() ;
1388    Tag stag = srows[irow]->getStationId() ;
1389    if ( stype == ANTENNA_PAD )
1390      antennaPad_.push_back( stag ) ;
1391    else if ( stype == WEATHER_STATION )
1392      weatherStation_.push_back( stag ) ;
1393  }
1394
1395   weatherStationId_ = getClosestWeatherStation() ;
1396}
1397
1398int OldASDMReader::getClosestWeatherStation()
1399{
1400  if ( weatherStation_.size() == 0 )
1401    return -1 ;
1402
1403  Tag atag( antennaId_, TagType::Antenna ) ;
1404  Tag stag = (asdm_->getAntenna().getRowByKey( atag ))->getStationId() ;
1405  vector<double> apos( 3 ) ;
1406  StationTable &stab = asdm_->getStation() ;
1407  StationRow *srow = stab.getRowByKey( stag ) ;
1408  vector<Length> pos = srow->getPosition() ;
1409  apos[0] = pos[0].get() ;
1410  apos[1] = pos[1].get() ;
1411  apos[2] = pos[2].get() ;
1412 
1413  double eps = 1.0e20 ;
1414  int retval = -1 ;
1415  for ( unsigned int ir = 0 ; ir < weatherStation_.size() ; ir++ ) {
1416    srow = stab.getRowByKey( weatherStation_[ir] ) ;
1417    vector<Length> wpos = srow->getPosition() ;
1418    double dist = (apos[0]-wpos[0].get())*(apos[0]-wpos[0].get())
1419      + (apos[1]-wpos[1].get())*(apos[1]-wpos[1].get())
1420      + (apos[2]-wpos[2].get())*(apos[2]-wpos[2].get()) ;
1421    if ( dist < eps ) {
1422      retval = (int)(weatherStation_[ir].getTagValue()) ;
1423    }
1424  }
1425
1426  return retval ;
1427}
1428
1429void OldASDMReader::getPointingInfo( unsigned int idx,
1430                                  vector<double> &dir,
1431                                  double &az,
1432                                  double &el,
1433                                  vector<double> &srate )
1434{
1435  String funcName = "getPointingInfo" ;
1436
1437  dir.resize(0) ;
1438  az = -1.0 ;
1439  el = -1.0 ;
1440  srate.resize(0) ;
1441
1442  Tag atag( antennaId_, TagType::Antenna ) ;
1443  unsigned int index = dataIdList_[idx] ;
1444  vector<PointingRow *> *prows = asdm_->getPointing().getByContext( atag ) ;
1445
1446  if ( prows == 0 )
1447    return ;
1448
1449  PointingRow *prow ;
1450  PointingRow *qrow ;
1451  //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
1452  double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
1453  ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
1454
1455  unsigned int nrow = prows->size() ;
1456  //logsink_->postLocally( LogMessage("There are " << nrow << " rows for given context: antennaId "+String::toString(antennaId_),LogOrigin(className_,funcName,WHERE)) ) ;
1457
1458//   for ( unsigned int irow = 0 ; irow < nrow ; irow++ ) {
1459//     prow = (*prows)[irow] ;
1460//     ArrayTimeInterval ati = prow->getTimeInterval() ;
1461//     ArrayTime pst = ati.getStart() ;
1462//     ArrayTime pet( ati.getStartInMJD()+ati.getDurationInDays() ) ;
1463//     logsink_->postLocally( LogMessage("start: "+pst.toFITS(),LogOrigin(className_,funcName,WHERE)) ) ;
1464//     logsink_->postLocally( LogMessage("end: "+pet.toFITS(),LogOrigin(className_,funcName,WHERE)) ) ;
1465//   }
1466 
1467  srate.resize(2) ;
1468  srate[0] = 0.0 ;
1469  srate[1] = 0.0 ;
1470  az = 0.0 ;
1471  el = 0.0 ;
1472  //double tcen = 0.0 ;
1473  double tcen = getMidTime( tint ).getMJD() ;
1474
1475  //
1476  // shape of pointingDirection is (numSample,2) if usePolynomial = False, while it is
1477  // (numTerm,2) if usePolynomial = True.
1478  //
1479  // In the former case, typical sampled time interval is 48msec, which is very small
1480  // compared with typical integration time (~a few sec).
1481  // Scan rate for this case is always [0,0] (or get slope?).
1482  //
1483  // In the later case, scan rate is (pointingDirection[1][0],pointingDirection[1][1])
1484  //
1485  // PointingDirection seems to store AZEL
1486  //
1487  ArrayTimeInterval pTime0 = (*prows)[0]->getTimeInterval() ;
1488  ArrayTimeInterval pTime1 = (*prows)[nrow-1]->getTimeInterval() ;
1489  //if ( tint.getStartInMJD()+tint.getDurationInDays() < pTime0.getStartInMJD() ) {
1490  if ( getEndTime( tint ) < getStartTime( pTime0 ) ) {
1491    logsink_->postLocally( LogMessage( "ArrayTimeInterval out of bounds: no data for given position (tint < ptime)", LogOrigin(className_,funcName,WHERE), LogMessage::WARN ) ) ;
1492    prow = (*prows)[0] ;
1493    vector< vector<double> > dirA = pointingDir( prow ) ;
1494    az = dirA[0][0] ;
1495    el = dirA[0][1] ;
1496    if ( prow->getUsePolynomials() && prow->getNumTerm() > 1 ) {
1497      srate[0] = dirA[1][0] ;
1498      srate[1] = dirA[1][1] ;
1499    }     
1500  }
1501  //else if ( tint.getStartInMJD() > pTime1.getStartInMJD()+pTime1.getDurationInDays() ) {
1502  else if ( getStartTime( tint ) > getEndTime( pTime1 ) ) {
1503    logsink_->postLocally( LogMessage( "ArrayTimeInterval out of bounds: no data for given position (tint > ptime)", LogOrigin(className_,funcName,WHERE), LogMessage::WARN ) ) ;
1504    prow = (*prows)[nrow-1] ;
1505    int numSample = prow->getNumSample() ;
1506    vector< vector<double> > dirA = pointingDir( prow ) ;
1507    if ( prow->getUsePolynomials() ) {
1508      az = dirA[0][0] ;
1509      el = dirA[0][1] ;
1510      if ( prow->getNumTerm() > 1 ) {
1511        srate[0] = dirA[1][0] ;
1512        srate[1] = dirA[1][1] ;
1513      }
1514    }
1515    else {
1516      az = dirA[numSample-1][0] ;
1517      el = dirA[numSample-1][1] ;
1518    }
1519  }
1520  else {
1521    ArrayTime startTime = tint.getStart() ;
1522    ArrayTime endTime = getEndTime( tint ) ;
1523    int row0 = -1 ;
1524    int row1 = -1 ;
1525    int row2 = -1 ;
1526    double dt0 = getMidTime( tint ).getMJD() ;
1527    for ( unsigned int irow = 0 ; irow < nrow ; irow++ ) {
1528      prow = (*prows)[irow] ;
1529      double dt = getMidTime( tint ).getMJD() - getMidTime( prow->getTimeInterval() ).getMJD() ;
1530      if ( dt > 0 && dt < dt0 ) {
1531        dt0 = dt ;
1532        row2 = irow ;
1533      }
1534      if ( prow->getTimeInterval().contains( startTime ) )
1535        row0 = irow ;
1536      else if ( prow->getTimeInterval().contains( endTime ) )
1537        row1 = irow ;
1538      if ( row0 != -1 && row1 != -1 )
1539        break ;
1540    }
1541    //logsink_->postLocally( LogMessage("row0 = "+String::toString(row0)+", row1 = "+String::toString(row1)+", row2 = "+String::toString(row2),LogOrigin(className_,funcName,WHERE)) ) ;
1542    if ( row0 == -1 && row1 == -1 ) {
1543      prow = (*prows)[row2] ;
1544      qrow = (*prows)[row2+1] ;
1545      double t0 = getEndTime( prow->getTimeInterval() ).getMJD() ;
1546      double t1 = qrow->getTimeInterval().getStartInMJD() ;
1547      vector< vector<double> > dirA = pointingDir( prow ) ;
1548      vector< vector<double> > dirB = pointingDir( qrow ) ;
1549      double da0 = dirA[0][0] ;
1550      double db0 = dirB[0][0] ;
1551      double da1 = dirA[0][1] ;
1552      double db1 = dirB[0][1] ;
1553      if ( prow->getUsePolynomials() && qrow->getUsePolynomials() ) {
1554        double dt = ( tcen - t0 ) / ( t1 - t0 ) ;
1555        az = da0 + ( db0 - da0 ) * dt ;
1556        el = da1 + ( db1 - da1 ) * dt ;
1557        if ( prow->getNumTerm() > 0 && qrow->getNumTerm() > 1 ) {
1558          double ra0 = dirA[1][0] ;
1559          double rb0 = dirB[1][0] ;
1560          double ra1 = dirA[1][1] ;
1561          double rb1 = dirB[1][1] ;
1562          srate[0] = ra0 + ( rb0 - ra0 ) * dt ;
1563          srate[1] = ra1 + ( rb1 - ra1 ) * dt ;
1564        }
1565      }
1566      else if ( !(qrow->getUsePolynomials()) ) {
1567        double dt = ( tcen - t0 ) / ( t1 - t0 ) ;
1568        az = da0 + ( db0 - da0 ) * dt ;
1569        el = da1 + ( db1 - da1 ) * dt ;
1570      }
1571      //else {
1572      // nothing to do
1573      //}
1574    }
1575    else {
1576      int ndir = 0 ;
1577      if ( row0 == -1 ) {
1578        row0 = row1 ;
1579      }
1580      else if ( row1 == -1 ) {
1581        row1 = row0 ;
1582      }
1583      prow = (*prows)[row0] ;
1584      qrow = (*prows)[row1] ;
1585      if ( prow->getUsePolynomials() && qrow->getUsePolynomials() ) {
1586        //logsink_->postLocally( LogMessage("usePolynomial = True",LogOrigin(className_,funcName,WHERE)) ) ;
1587        if ( row0 == row1 ) {
1588          prow = (*prows)[row0] ;
1589          vector< vector<double> > dirA = pointingDir( prow ) ;
1590          az = dirA[0][0] ;
1591          el = dirA[0][1] ;
1592          if ( prow->getNumTerm() > 1 ) {
1593            srate[0] = dirA[1][0] ;
1594            srate[1] = dirA[1][1] ;
1595          }
1596        }
1597        else {
1598          prow = (*prows)[row0] ;
1599          qrow = (*prows)[row1] ;
1600          vector< vector<double> > dirA = pointingDir( prow ) ;
1601          vector< vector<double> > dirB = pointingDir( qrow ) ;
1602          double t0 = getMidTime( prow->getTimeInterval() ).getMJD() ;
1603          double t1 = getMidTime( qrow->getTimeInterval() ).getMJD() ;
1604          double dt = ( tcen - t0 ) / ( t1 - t0 ) ;
1605          double da0 = dirA[0][0] ;
1606          double db0 = dirB[0][0] ;
1607          double da1 = dirA[0][1] ;
1608          double db1 = dirB[0][1] ;
1609          az = da0 + ( db0 - da0 ) * dt ;
1610          el = da1 + ( db1 - db0 ) * dt ;
1611          if ( prow->getNumTerm() > 0 && qrow->getNumTerm() > 1 ) {
1612            double ra0 = dirA[1][0] ;
1613            double rb0 = dirB[1][0] ;
1614            double ra1 = dirA[1][1] ;
1615            double rb1 = dirB[1][1] ;
1616            srate[0] = ra0 + ( rb0 - ra0 ) * dt ;
1617            srate[1] = ra1 + ( rb1 - ra1 ) * dt ;
1618          }
1619        }
1620      }
1621      else if ( prow->getUsePolynomials() == qrow->getUsePolynomials() ) {
1622        //logsink_->postLocally( LogMessage("numSample == numTerm",LogOrigin(className_,funcName,WHERE)) ) ;
1623        tcen = 0.0 ;
1624        for ( int irow = row0 ; irow <= row1 ; irow++ ) {
1625          prow = (*prows)[irow] ;
1626          int numSample = prow->getNumSample() ;
1627          //logsink_->postLocally( LogMessage("numSample = "+String::toString(numSample),LogOrigin(className_,funcName,WHERE)) ) ;
1628          vector< vector<double> > dirA = pointingDir( prow ) ;
1629          if ( prow->isSampledTimeIntervalExists() ) {
1630            //logsink_->postLocally( LogMessage("sampledTimeIntervalExists",LogOrigin(className_,funcName,WHERE)) ) ;
1631            vector<ArrayTimeInterval> stime = prow->getSampledTimeInterval() ;
1632            for ( int isam = 0 ; isam < numSample ; isam++ ) {
1633              //if ( tint.overlaps( stime[isam] ) ) {
1634              if ( tint.contains( stime[isam] ) ) {
1635                az += dirA[isam][0] ;
1636                el += dirA[isam][1] ;
1637                tcen += getMidTime( stime[isam] ).getMJD() ;
1638                ndir++ ;
1639              }
1640            }
1641          }
1642          else {
1643            double sampleStart = prow->getTimeInterval().getStartInMJD() ;
1644            double sampleInterval = prow->getTimeInterval().getDurationInDays() / (double)numSample ;
1645            //logsink_->postLocally( LogMessage("sampleStart = "+String::toString(sampleStart),LogOrigin(className_,funcName,WHERE)) )
1646            //logsink_->postLocally( LogMessage("sampleInterval = "+String::toString(sampleInterval),LogOrigin(className_,funcName,WHERE)) ) ;
1647            //logsink_->postLocally( LogMessage("tint = "+tint.toString(),LogOrigin(className_,funcName,WHERE)) ) ;
1648            for ( int isam = 0 ; isam < numSample ; isam++ ) {
1649              ArrayTimeInterval stime( sampleStart+isam*sampleInterval, sampleInterval ) ;
1650              //if ( tint.overlaps( stime ) ) {
1651              if ( tint.contains( stime ) ) {
1652                az += dirA[isam][0] ;
1653                el += dirA[isam][1] ;
1654                tcen += getMidTime( stime ).getMJD() ;
1655                ndir++ ;
1656              }
1657            }
1658          }
1659        }
1660        if ( ndir > 1 ) {
1661          az /= (double)ndir ;
1662          el /= (double)ndir ;
1663          tcen /= (double)ndir ;
1664        }
1665      }
1666      //else {
1667      // nothing to do
1668      //}
1669    }
1670   
1671    AntennaRow *arow = asdm_->getAntenna().getRowByKey( Tag( antennaId_, TagType::Antenna ) ) ;
1672    StationRow *srow = arow->getStationUsingStationId() ;
1673    vector<Length> antposL = srow->getPosition() ;
1674    casa::Vector<casa::Double> antpos( 3 ) ;
1675    for ( int i = 0 ; i < 3 ; i++ )
1676      antpos[i] = antposL[i].get() ;
1677    //logsink_->postLocally( LogMessage("tcen = "+String::toString(tcen),LogOrigin(className_,funcName,WHERE)) ) ;
1678    //logsink_->postLocally( LogMessage("antpos = "+String::toString(antpos),LogOrigin(className_,funcName,WHERE)) ) ;
1679    toJ2000( dir, az, el, tcen, antpos ) ;
1680
1681  }
1682
1683  return ;
1684}
1685
1686ArrayTime OldASDMReader::getMidTime( const ArrayTimeInterval &t )
1687{
1688  return ArrayTime( t.getStartInMJD() + 0.5 * t.getDurationInDays() ) ;
1689}
1690
1691ArrayTime OldASDMReader::getEndTime( const ArrayTimeInterval &t )
1692{
1693  return ArrayTime( t.getStartInMJD() + t.getDurationInDays() ) ;
1694}
1695
1696ArrayTime OldASDMReader::getStartTime( const ArrayTimeInterval &t )
1697{
1698  return ArrayTime( t.getStartInMJD() ) ;
1699}
1700
1701void OldASDMReader::toJ2000( vector<double> &dir,
1702                          double az,
1703                          double el,
1704                          double mjd,
1705                          casa::Vector<casa::Double> antpos )
1706{
1707  String funcName = "toJ2000" ;
1708
1709  vector<double> azel( 2 ) ;
1710  azel[0] = az ;
1711  azel[1] = el ;
1712  dir = toJ2000( azel, "AZELGEO", mjd, antpos ) ;
1713}
1714
1715vector<double> OldASDMReader::toJ2000( vector<double> dir,
1716                                    casa::String dirref,
1717                                    double mjd,
1718                                    casa::Vector<casa::Double> antpos )
1719{
1720  casa::String funcName = "toJ2000" ;
1721
1722  vector<double> newd( dir ) ;
1723  if ( dirref != "J2000" ) {
1724    casa::MEpoch me( casa::Quantity( (casa::Double)mjd, "d" ), casa::MEpoch::UTC ) ;
1725    casa::Vector<casa::Quantity> qantpos( 3 ) ;
1726    qantpos[0] = casa::Quantity( antpos[0], "m" ) ;
1727    qantpos[1] = casa::Quantity( antpos[1], "m" ) ;
1728    qantpos[2] = casa::Quantity( antpos[2], "m" ) ;
1729    casa::MPosition mp( casa::MVPosition( qantpos ),
1730                        casa::MPosition::ITRF ) ;
1731    //ostringstream oss ;
1732    //mp.print( oss ) ;
1733    //logsink_->postLocally( LogMessage(oss.str(),LogOrigin(className_,funcName,WHERE)) ) ;
1734   
1735    casa::MeasFrame mf( me, mp ) ;
1736    casa::MDirection::Types dirtype ;
1737    casa::Bool b = casa::MDirection::getType( dirtype, dirref ) ;
1738    if ( b ) {
1739      casa::MDirection::Convert toj2000( dirtype,
1740                                         casa::MDirection::Ref( casa::MDirection::J2000, mf ) ) ;
1741      casa::Vector<casa::Double> cdir = toj2000( dir ).getAngle( "rad" ).getValue() ;
1742      //logsink_->postLocally( LogMessage("cdir = "+String::toString(cdir),LogOrigin(className_,funcName,WHERE)) ) ;
1743      newd[0] = (double)(cdir[0]) ;
1744      newd[1] = (double)(cdir[1]) ;
1745    }
1746  }
1747  return newd ;
1748}
1749
1750void OldASDMReader::setLogger( CountedPtr<LogSinkInterface> &logsink )
1751{
1752  logsink_ = logsink ;
1753}
1754
1755string OldASDMReader::getFrame()
1756{
1757  casa::String funcName = "getFrame" ;
1758 
1759  // default is TOPO
1760  string frame = "TOPO" ;
1761
1762  SpectralWindowTable &spwtab = asdm_->getSpectralWindow() ;
1763  vector<SpectralWindowRow *> rows = spwtab.get() ;
1764  vector<FrequencyReferenceCode> measFreqRef( rows.size() ) ;
1765  int nref = 0 ;
1766  for ( unsigned int irow = 0 ; irow < rows.size() ; irow++ ) {
1767    int nchan = rows[irow]->getNumChan() ;
1768    if ( nchan != 4 ) {
1769      if ( rows[irow]->isMeasFreqRefExists() ) {
1770        measFreqRef[nref] = rows[irow]->getMeasFreqRef() ;
1771        nref++ ;
1772      }
1773    }
1774  }
1775  if ( nref != 0 ) {
1776    frame = CFrequencyReferenceCode::toString( measFreqRef[0] ) ;
1777  }
1778 
1779  //logsink_->postLocally( LogMessage("frame = "+String::toString(frame),LogOrigin(className_,funcName,WHERE)) ) ;
1780
1781  return frame ;
1782}
1783
1784int OldASDMReader::getNumIFs()
1785{
1786  casa::String funcName = "getNumIFs" ;
1787
1788  int nif = 0 ;
1789  vector<SpectralWindowRow *> rows = asdm_->getSpectralWindow().get() ;
1790  unsigned int nrow = rows.size() ;
1791  // check if all rows have freqGroup attribute
1792  bool freqGroupExists = true ;
1793  bool countedWvr = false ;
1794  for ( unsigned int irow = 0 ; irow < nrow ; irow++ ) {
1795    freqGroupExists &= rows[irow]->isFreqGroupExists() ;
1796    if ( rows[irow]->getNumChan() == 4 ) {
1797      if ( !countedWvr ) {
1798        countedWvr = true ;
1799        nif++ ;
1800      }
1801    }
1802    else {
1803      nif++ ;
1804    }
1805  }
1806 
1807  if ( freqGroupExists ) {
1808    vector<int> freqGroup(0) ;
1809    for ( unsigned int irow = 0 ; irow < nrow ; irow++ ) {
1810      int fg = rows[irow]->getFreqGroup() ;
1811      if ( (int)count( freqGroup.begin(), freqGroup.end(), fg ) == 0 ) {
1812        freqGroup.push_back( fg ) ;
1813      }
1814    }
1815    nif = freqGroup.size() ;
1816  }
1817
1818  //logsink_->postLocally( LogMessage("nif = "+String::toString(nif),LogOrigin(className_,funcName,WHERE)) ) ;
1819
1820  return nif ;
1821}
1822
1823SysCalRow *OldASDMReader::getSysCalRow( unsigned int idx )
1824{
1825  String funcName = "getSysCalRow" ;
1826
1827  SysCalRow *row = 0 ;
1828  unsigned int index = dataIdList_[idx] ;
1829  Tag anttag( antennaId_, TagType::Antenna ) ;
1830  int feedid = vmsData_->v_feedId1[index] ;
1831  //ArrayTimeInterval tint( vmsData_->v_time[index]*s2d, vmsData_->v_interval[index]*s2d ) ;
1832  double startSec = vmsData_->v_time[index] - 0.5 * vmsData_->v_interval[index] ;
1833  ArrayTimeInterval tint( startSec*s2d, vmsData_->v_interval[index]*s2d ) ;
1834  Tag ddtag( vmsData_->v_dataDescId[index], TagType::DataDescription ) ;
1835  Tag spwtag = asdm_->getDataDescription().getRowByKey(ddtag)->getSpectralWindowId() ;
1836  //int nchan = asdm_->getSpectralWindow().getRowByKey(spwtag)->getNumChan() ;
1837  vector< vector<float> > defaultTsys( 1, vector<float>( 1, 1.0 ) ) ;
1838  SysCalTable &sctab = asdm_->getSysCal() ;
1839  //vector<SysCalRow *> rows = sctab.get() ;
1840  vector<SysCalRow *> *rows = sctab.getByContext( anttag, spwtag, feedid ) ;
1841  //if ( nrow == 0 ) {
1842  if ( rows == 0 ) {
1843    //logsink_->postLocally( LogMessage("no rows in SysCal table",LogOrigin(className_,funcName,WHERE)) ) ;
1844    row = 0 ;
1845  }
1846  else {
1847    unsigned int nrow = rows->size() ;
1848    //logsink_->postLocally( LogMessage("nrow = "+String::toString(nrow),LogOrigin(className_,funcName,WHERE)) ) ;
1849    int scindex = -1 ;
1850    if ( nrow == 1 ) {
1851      scindex = 0 ;
1852    }
1853    else if ( getEndTime( tint ) <= getStartTime( (*rows)[0]->getTimeInterval() ) )
1854      scindex = 0 ;
1855    else {
1856      for ( unsigned int irow = 0 ; irow < nrow-1 ; irow++ ) {
1857        ArrayTime t = getMidTime( tint ) ;
1858        if ( t > getStartTime( (*rows)[irow]->getTimeInterval() )
1859             && t <= getStartTime( (*rows)[irow+1]->getTimeInterval() ) ) {
1860          scindex = irow ;
1861          break ;
1862        }
1863      }
1864      if ( scindex == -1 )
1865        scindex = nrow-1 ;
1866    }
1867    //logsink_->postLocally( LogMessage("irow = "+String::toString(scindex),LogOrigin(className_,funcName,WHERE)) ) ;
1868    row = (*rows)[scindex] ;
1869  }
1870  return row ;
1871}
1872
1873double OldASDMReader::limitedAngle( double angle )
1874{
1875  if ( angle > C::pi )
1876    while ( angle > C::pi ) angle -= C::_2pi ;
1877  else if ( angle < -C::pi )
1878    while ( angle < -C::pi ) angle += C::_2pi ;
1879  return angle ;
1880}
1881
1882vector< vector<double> > OldASDMReader::pointingDir( PointingRow *row )
1883{
1884  vector< vector<Angle> > aTar = row->getTarget() ;
1885  vector< vector<Angle> > aOff = row->getOffset() ;
1886  vector< vector<Angle> > aDir = row->getPointingDirection() ;
1887  vector< vector<Angle> > aEnc = row->getEncoder() ;
1888  unsigned int n = aTar.size() ;
1889  vector< vector<double> > dir( n ) ;
1890  double factor = 1.0 / cos( aTar[0][1].get() ) ;
1891  for ( unsigned int i = 0 ; i < n ; i++ ) {
1892    dir[i].resize( 2 ) ;
1893    /**
1894     * This is approximate way to add offset taking tracking error
1895     * into account
1896     *
1897     * az = dir[0][0] = target[0][0] + offset[0][0] / cos(el)
1898     *                 + encorder[0][0] - direction[0][0]
1899     * el = dir[0][1] = target[0][1] + offset[0][1]
1900     *                 + encorder[0][1] - direction[0][1]
1901     **/
1902    dir[i][0] = aTar[i][0].get() + factor * aOff[i][0].get()
1903               + aEnc[i][0].get() - aDir[i][0].get() ;
1904    dir[i][1] = aTar[i][1].get() + aOff[i][1].get()
1905               + aEnc[i][1].get() - aDir[i][1].get() ;
1906  }
1907  return dir ;
1908}
Note: See TracBrowser for help on using the repository browser.