source: trunk/external-alma/asdm2ASAP/ASDMReader.cc @ 2225

Last change on this file since 2225 was 2225, 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...

Frequency is stored as LSRK value although raw frequency value is
in arbitrary frequency frame.
Also, direction is stored as J2000 value independently of original
direction reference code.


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