source: trunk/external-alma/asdm2ASAP/ASDMFiller.cc @ 2710

Last change on this file since 2710 was 2710, checked in by Takeshi Nakazato, 11 years ago

New Development: No

JIRA Issue: No

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

Reference epoch for frequency frame conversion is taken from header
which is set as start time of the observation (OBSERVATION/TIME_RANGE[0]
for MS, ExecBlock?/startTime for ASDM).


File size: 23.8 KB
Line 
1#include<iostream>
2
3#include <STHeader.h>
4
5#include <measures/Measures/MEpoch.h>
6#include <measures/Measures/MPosition.h>
7#include <measures/Measures/MDirection.h>
8#include <measures/Measures/MCDirection.h>
9#include <measures/Measures/MFrequency.h>
10#include <measures/Measures/MCFrequency.h>
11#include <measures/Measures/MeasFrame.h>
12#include <measures/Measures/MeasConvert.h>
13#include <casa/Arrays/Vector.h>
14#include <casa/Arrays/Matrix.h>
15#include <casa/Quanta/MVTime.h>
16#include <casa/Logging/LogMessage.h>
17
18#include "ASDMFiller.h"
19
20using namespace std ;
21using namespace casa ;
22using namespace asap ;
23
24ASDMFiller::ASDMFiller( CountedPtr<Scantable> stable )
25  : FillerBase( stable ),
26    antennaId_( -1 ),
27    antennaName_( "" ),
28    className_("ASDMFiller")
29{
30  reader_ = new ASDMReader() ;
31}
32
33ASDMFiller::~ASDMFiller()
34{
35  // nothing to do?
36  logsink_ = 0 ;
37}
38
39void ASDMFiller::setLogger( CountedPtr<LogSinkInterface> &logsink )
40{
41  logsink_ = logsink ;
42  if ( !(reader_.null()) ) {
43    reader_->setLogger( logsink ) ;
44  }
45}
46
47bool ASDMFiller::open( const string &filename, const Record &rec )
48{
49  String funcName = "open" ;
50  bool status = reader_->open( filename, rec ) ;
51
52  antennaId_ = reader_->getAntennaId() ;
53  antennaName_ = reader_->getAntennaName() ;
54
55  //logsink_->postLocally( LogMessage("antennaId_ = "+String::toString(antennaId_),LogOrigin(className_,funcName,WHERE)) ) ;
56  //logsink_->postLocally( LogMessage("antennaName_ = "+antennaName_,LogOrigin(className_,funcName,WHERE)) ) ;
57
58  return status ;
59}
60
61void ASDMFiller::fill()
62{
63  String funcName = "fill" ;
64
65  // header
66  fillHeader() ;
67  const STHeader hdr = table_->getHeader();
68
69  // set Frame for FREQUENCIES table
70  string sFreqFrame = reader_->getFrame() ;
71  //MFrequency::Types freqFrame = toFrameType( sFreqFrame ) ;
72  MFrequency::Types freqFrame = MFrequency::LSRK ;
73  table_->frequencies().setFrame( freqFrame, false ) ;
74  table_->frequencies().setFrame( freqFrame, true ) ;
75  //logsink_->postLocally( LogMessage("sFreqFrame = "+sFreqFrame,LogOrigin(className_,funcName,WHERE)) ) ;
76 
77  Vector<casa::Double> antpos = table_->getHeader().antennaposition ;
78
79  // data selection
80  reader_->select() ;
81
82  // pick up valid configDescriptionId
83  Vector<uInt> configDescIdList = reader_->getConfigDescriptionIdList() ;
84  uInt numConfigDescId = configDescIdList.size() ;
85
86  //logsink_->postLocally( LogMessage("configDescIdList = "+String::toString(configDescIdList),LogOrigin(className_,funcName,WHERE)) ) ;
87
88  // get field list
89  Vector<uInt> fieldIdList = reader_->getFieldIdList() ;
90  uInt numFieldId = fieldIdList.size() ;
91
92  //logsink_->postLocally( LogMessage("fieldIdList = "+String::toString(fieldIdList),LogOrigin(className_,funcName,WHERE)) ) ;
93
94  // BEAMNO is always 0 since ALMA antenna is single beam
95  uInt beamno = 0 ;
96
97  // REFBEAMNO is -1
98  setReferenceBeam() ;
99
100  // fill FOCUS_ID and add FOCUS row if necessary
101  setFocus() ;
102
103  // CYCLENO
104  map< unsigned int, unsigned int > cycleno ;
105  map< unsigned int, unsigned int >::iterator citer ;
106
107  for ( unsigned int ifield = 0 ; ifield < numFieldId ; ifield++ ) {
108    for ( uInt icon = 0 ; icon < numConfigDescId ; icon++ ) {
109      //logsink_->postLocally( LogMessage("start configDescId "+String::toString(configDescIdList[icon])+" fieldId "+String::toString(fieldIdList[ifield]),LogOrigin(className_,funcName,WHERE)) ) ;
110
111      if ( !(reader_->setMainRow( configDescIdList[icon], fieldIdList[ifield] )) ) {
112        //logsink_->postLocally( LogMessage("skip configDescId "+String::toString(configDescIdList[icon])+" fieldId "+String::toString(fieldIdList[ifield]),LogOrigin(className_,funcName,WHERE)) ) ;
113        continue ;
114      }
115
116      // number of rows
117      uInt nrow = reader_->getNumMainRow() ;
118
119      //logsink_->postLocally( LogMessage("There are "+String::toString(nrow)+" rows in Main table corresponding to configDescId "+String::toString(configDescIdList[icon])+" fieldId "+String::toString(fieldIdList[ifield]),LogOrigin(className_,funcName,WHERE)) ) ;
120     
121      for ( uInt irow = 0 ; irow < nrow ; irow++ ) {
122
123        // set main row
124        if ( !(reader_->setMainRow( irow )) ) {
125          // skip row since the row doesn't have valid configDescId
126          //logsink_->postLocally( LogMessage("skip "+String::toString(irow)+" since ASDMReader::setMainrow() returns False",LogOrigin(className_,funcName,WHERE)) ) ;
127          continue ;
128        }
129
130        // scan and subscan
131        unsigned int scanno = reader_->getScanNoOfCurrentRow() ;
132        //logsink_->postLocally( LogMessage("scanno = "+String::toString(scanno),LogOrigin(className_,funcName,WHERE)) ) ;
133        citer = cycleno.find( scanno ) ;
134        if ( citer == cycleno.end() )
135          cycleno[scanno] = 0 ;
136
137        // set data
138        if ( !(reader_->setData()) ) {
139          // skip row since reader failed to retrieve data
140          //logsink_->postLocally( LogMessage("skip "+String::toString(irow)+" since ASDMReader::setData() returns False",LogOrigin(className_,funcName,WHERE)) ) ;
141          continue ;
142        }
143
144        unsigned int numData = reader_->getNumData() ;
145        double refpix = 0.0 ;
146        double refval = 0.0 ;
147        double incr = 0.0 ;
148        string freqref = "" ;
149
150        //logsink_->postLocally( LogMessage("numData = "+String::toString(numData),LogOrigin(className_,funcName,WHERE)) ) ;
151        for ( unsigned int idata = 0 ; idata < numData ; idata++ ) {
152          // prepare to extract binary data
153          //logsink_->postLocally( LogMessage("prepare data...",LogOrigin(className_,funcName,WHERE)) ) ;
154          reader_->prepareData( idata ) ;
155
156          // subscan number
157          unsigned int subscanno = reader_->getSubscanNo() ;
158          //logsink_->postLocally( LogMessage("subscanno = "+String::toString(subscanno),LogOrigin(className_,funcName,WHERE)) ) ;
159
160          // IFNO
161          uInt ifno = reader_->getIFNo() ;
162          //logsink_->postLocally( LogMessage("ifno = "+String::toString(ifno),LogOrigin(className_,funcName,WHERE)) ) ;
163          // source spec
164          int srctype = reader_->getSrcType( scanno, subscanno ) ;
165          //logsink_->postLocally( LogMessage("srctype = "+String::toString(srctype),LogOrigin(className_,funcName,WHERE)) ) ;
166          string srcname ;
167          string fieldname ;
168          vector<double> srcDirection ;
169          vector<double> srcProperMotion ;
170          double sysVel ;
171          vector<double> rf ;
172          reader_->getSourceProperty( srcname,
173                                      fieldname,
174                                      srcDirection,
175                                      srcProperMotion,
176                                      sysVel,
177                                      rf ) ;
178          //logsink_->postLocally( LogMessage("srcname = "+String::toString(srcname),LogOrigin(className_,funcName,WHERE)) ) ;         
179
180          // fill MOLECULE_ID and add MOLECULES row if necessary
181          Vector<casa::Double> restFreqs( rf.size() ) ;
182          for ( uInt i = 0 ; i < rf.size() ; i++ )
183            restFreqs[i] = (casa::Double)(rf[i]) ;
184          setMolecule( restFreqs ) ;
185         
186          // time and interval
187          casa::Double mjd = (casa::Double)(reader_->getTime()) ;
188          casa::Double interval = (casa::Double)(reader_->getInterval()) ;
189          //logsink_->postLocally( LogMessage("mjd = "+String::toString(mjd),LogOrigin(className_,funcName,WHERE)) ) ;
190
191          // fill TIME and INTERVAL
192          setTime( mjd, interval ) ;
193         
194          // fill SRCNAME, SRCTYPE, FIELDNAME, SRCDIRECTION, SRCPROPERMOTION, and SRCVELOCITY
195          Vector<casa::Double> srcDir( 2 ) ;
196          srcDir[0] = (casa::Double)(srcDirection[0]) ;
197          srcDir[1] = (casa::Double)(srcDirection[1]) ;
198          Vector<casa::Double> srcPM( 2 ) ;
199          srcPM[0] = (casa::Double)(srcProperMotion[0]) ;
200          srcPM[1] = (casa::Double)(srcProperMotion[1]) ;
201          setSource( srcname, srctype, fieldname, srcDir, srcPM, (casa::Double)sysVel ) ;
202
203          // fill FLAGROW
204          unsigned int flagrow = reader_->getFlagRow() ;
205          setFlagrow( (uInt)flagrow ) ;
206          //logsink_->postLocally( LogMessage("flagrow = "+String::toString(flagrow),LogOrigin(className_,funcName,WHERE)) ) ;
207          // fill WEATHER_ID and add WEATHER row if necessary
208          float temperature ;
209          float pressure ;
210          float humidity ;
211          float windspeed ;
212          float windaz ;
213          reader_->getWeatherInfo( temperature,
214                                   pressure,
215                                   humidity,
216                                   windspeed,
217                                   windaz ) ;
218          setWeather2( (casa::Float)temperature,
219                       (casa::Float)pressure,
220                       (casa::Float)humidity,
221                       (casa::Float)windspeed,
222                       (casa::Float)windaz ) ;
223          //logsink_->postLocally( LogMessage("temperature = "+String::toString(temperature),LogOrigin(className_,funcName,WHERE)) ) ;
224          // fill AZIMUTH, ELEVATION, DIRECTION and SCANRATE
225          vector<double> dir ;
226          double az ;
227          double el ;
228          vector<double> srate ;
229          reader_->getPointingInfo( dir,
230                                    az,
231                                    el,
232                                    srate ) ;
233          Vector<casa::Double> scanRate( 2, 0.0 ) ;
234          Vector<casa::Double> direction( 2, 0.0 ) ;
235          if ( srate.size() > 0 ) {
236            scanRate[0] = (casa::Double)(srate[0]) ;
237            scanRate[1] = (casa::Double)(srate[1]) ;
238          }
239          setScanRate( scanRate ) ;
240          if ( dir.size() > 0 ) {
241            direction[0] = (casa::Double)(dir[0]) ;
242            direction[1] = (casa::Double)(dir[1]) ;
243          }
244          else {
245            toJ2000( direction, az, el, mjd, antpos ) ;
246          }
247          //logsink_->postLocally( LogMessage("direction = "+String::toString(direction),LogOrigin(className_,funcName,WHERE)) ) ;
248          setDirection( direction, (casa::Float)az, (casa::Float)el ) ;
249
250           // REFPIX, REFVAL, INCREMENT
251          String ifkey = getIFKey( ifno ) ;
252          if ( ifrec_.isDefined( ifkey ) ) {
253            getFrequencyRec( ifkey, refpix, refval, incr ) ;
254          }
255          else {
256            reader_->getFrequency( refpix, refval, incr, freqref ) ;
257            refval = (double)toLSRK( casa::Double(refval),
258                                     String(freqref),
259                                     hdr.utc,
260                                     antpos,
261                                     //direction,
262                                     srcDir,
263                                     "J2000" ) ;
264            setFrequencyRec( ifkey, refpix, refval, incr ) ;
265          }
266
267          // fill FREQ_ID and add FREQUENCIES row if necessary
268          setFrequency( (casa::Double)refpix, (casa::Double)refval, (casa::Double)incr ) ;
269
270          // loop on polarization
271          vector<unsigned int> dataShape = reader_->getDataShape() ;
272//           ostringstream oss ;
273//           for ( unsigned int i = 0 ; i < dataShape.size() ; i++ ) {
274//             if ( i == 0 )
275//               oss << "dataShape=[" << dataShape[i] << ", " ;
276//             else if ( i == dataShape.size()-1 )
277//               oss << dataShape[i] << "]"  ;
278//             else
279//               oss << dataShape[i] << ", " ;
280//           }
281//           logsink_->postLocally( LogMessage(oss.str(),LogOrigin(className_,funcName,WHERE)) ) ;
282                                     
283          unsigned int numPol = dataShape[0] ;
284          unsigned int numChan = dataShape[1] ;
285
286          //logsink_->postLocally( LogMessage("numPol = "+String::toString(numPol),LogOrigin(className_,funcName,WHERE)) ) ;
287
288          // OPACITY
289          vector<float> tau = reader_->getOpacity() ;
290          Vector<casa::Float> opacity = toVector( tau, numPol ) ;
291
292          // SPECTRA, FLAGTRA, TSYS, TCAL
293          float *sp = reader_->getSpectrum() ;
294          //logsink_->postLocally( LogMessage("sp[0] = "+String::toString(sp[0]),LogOrigin(className_,funcName,WHERE)) ) ;
295          vector< vector<float> > ts ;
296          vector< vector<float> > tc ;
297          reader_->getTcalAndTsys( tc, ts ) ;
298          Matrix<casa::Float> spectra = toMatrix( sp, numPol, numChan ) ;
299          //logsink_->postLocally( LogMessage("spectra(0,0) = "+String::toString(spectra(0,0)),LogOrigin(className_,funcName,WHERE)) ) ;
300          Vector<uChar> flagtra( numChan, 0 ) ;
301          Matrix<casa::Float> tsys = toMatrix( ts, numPol, numChan ) ;
302          Matrix<casa::Float> tcal = toMatrix( tc, numPol, numChan ) ;
303          //logsink_->postLocally( LogMessage("tsys(0,0) = "+String::toString(tsys(0,0)),LogOrigin(className_,funcName,WHERE)) ) ;
304//           String caltime = "" ;
305//           if ( anyNE( tcal, (casa::Float)1.0 ) )
306//             caltime = toTcalTime( mjd ) ;
307          String caltime = toTcalTime( mjd ) ;
308
309          for ( unsigned int ipol = 0 ; ipol < numPol ; ipol++ ) {
310
311            // fill SCANNO, CYCLENO, IFNO, POLNO, and BEAMNO
312            setIndex( (uInt)scanno-1, (uInt)cycleno[scanno], ifno, ipol, beamno ) ;
313
314            // fill SPECTRA, FLAGTRA, TSYS
315            setSpectrum( spectra.row(ipol), flagtra, tsys.row(ipol) ) ;
316
317            // fill TCAL_ID and add TCAL row if necessary
318            setTcal2( caltime, tcal.row(ipol) ) ;
319
320            // fill OPACITY
321            setOpacity( opacity[ipol] ) ;
322           
323            // commit row
324            commitRow() ;
325          }
326
327          // increment CYCLENO
328          cycleno[scanno]++ ;
329        }
330      }
331    }
332  }
333
334  return ;
335}
336
337void ASDMFiller::close()
338{
339  reader_->close() ;
340  reader_ = 0 ;
341
342  return ;
343}
344
345void ASDMFiller::fillHeader()
346{
347  STHeader hdr ;
348
349  reader_->fillHeader( hdr.nchan,
350                       hdr.npol,
351                       hdr.nif,
352                       hdr.nbeam,
353                       hdr.observer,
354                       hdr.project,
355                       hdr.obstype,
356                       hdr.antennaname,
357                       hdr.antennaposition,
358                       hdr.equinox,
359                       hdr.freqref,
360                       hdr.reffreq,
361                       hdr.bandwidth,
362                       hdr.utc,
363                       hdr.fluxunit,
364                       hdr.epoch,
365                       hdr.poltype ) ;
366
367  if ( hdr.freqref != "LSRK" ) {
368//     String freqref ;
369//     if (hdr.freqref == "TOPOCENT") {
370//       freqref = "TOPO";
371//     } else if (hdr.freqref == "GEOCENTR") {
372//       freqref = "GEO";
373//     } else if (hdr.freqref == "BARYCENT") {
374//       freqref = "BARY";
375//     } else if (hdr.freqref == "GALACTOC") {
376//       freqref = "GALACTO";
377//     } else if (hdr.freqref == "LOCALGRP") {
378//       freqref = "LGROUP";
379//     } else if (hdr.freqref == "CMBDIPOL") {
380//       freqref = "CMB";
381//     } else if (hdr.freqref == "SOURCE") {
382//       freqref = "REST";
383//     }
384    vector<double> sdir ;
385    string ref ;
386    reader_->getSourceDirection( sdir, ref ) ;
387    Vector<casa::Double> sourceDir( sdir ) ;
388    hdr.reffreq = toLSRK( hdr.reffreq, hdr.freqref, hdr.utc, hdr.antennaposition, sdir, String(ref) ) ;
389    hdr.freqref = "LSRK" ;
390  }
391
392  setHeader( hdr ) ;
393}
394
395String ASDMFiller::getIFKey( uInt ifno )
396{
397  return "IFNO"+String::toString( ifno ) ;
398}
399
400void ASDMFiller::getFrequencyRec( String key,
401                                       double &refpix,
402                                       double &refval,
403                                       double &incr )
404{
405  Record frec = ifrec_.asRecord( key ) ;
406  refpix = frec.asdouble( "REFPIX" ) ;
407  refval = frec.asdouble( "REFVAL" ) ;
408  incr = frec.asdouble( "INCREMENT" ) ;
409}
410
411void ASDMFiller::setFrequencyRec( String key,
412                                       double refpix,
413                                       double refval,
414                                       double incr )
415{
416  Record frec ;
417  frec.define( "REFPIX", refpix ) ;
418  frec.define( "REFVAL", refval ) ;
419  frec.define( "INCREMENT", incr ) ;
420  ifrec_.defineRecord( key, frec ) ;
421}
422
423Matrix<casa::Float> ASDMFiller::toMatrix( float *sp,
424                                         unsigned int npol,
425                                         unsigned int nchan )
426{
427  Matrix<casa::Float> mSp( npol, nchan ) ;
428  if ( npol <= 2 ) {
429    // 1 or 2 polarization case
430    for ( unsigned int ich = 0 ; ich < nchan ; ich++ ) {
431      for ( unsigned int ipol = 0 ; ipol < npol ; ipol++ ) {
432        mSp(ipol,ich) = (casa::Float)(sp[npol*ich+ipol]) ;
433      }
434    }
435  }
436  else {
437    // 4 polarization case
438    for ( unsigned int ich = 0 ; ich < nchan ; ich++ ) {
439      mSp(0,ich) = (casa::Float)(sp[4*ich]) ;   // Re(XX)
440      mSp(1,ich) = (casa::Float)(sp[4*ich+4]) ; // Re(YY)
441      mSp(2,ich) = (casa::Float)(sp[4*ich+2]) ; // Re(XY)
442      mSp(3,ich) = (casa::Float)(sp[4*ich+3]) ; // Im(XY)
443    }
444  }
445  return mSp ;
446}
447
448Matrix<casa::Float> ASDMFiller::toMatrix( vector< vector<float> > &tsys,
449                                               unsigned int npol,
450                                               unsigned int nchan )
451{
452  unsigned int numRec = tsys.size() ;
453  unsigned int numChan = tsys[0].size() ;
454  Matrix<casa::Float> ret ;
455  if ( npol == numRec && nchan == numChan ) {
456    ret.resize( npol, nchan ) ;
457    for ( unsigned int ip = 0 ; ip < npol ; ip++ )
458      for ( unsigned int ic = 0 ; ic < nchan ; ic++ )
459        ret( ip, ic ) = (casa::Float)(tsys[ip][ic]) ;
460  }
461  else if ( npol == numRec && numChan == 1 ) {
462    ret.resize( npol, 1 ) ;
463    for ( unsigned int ip = 0 ; ip < npol ; ip++ )
464      ret( ip, 0 ) = (casa::Float)(tsys[0][0]) ;
465  }
466  else if ( numRec == 1 && nchan == numChan ) {
467    ret.resize( npol, nchan ) ;
468    for ( unsigned int ip = 0 ; ip < npol ; ip++ )
469      for ( unsigned int ic = 0 ; ic < nchan ; ic++ )
470        ret( ip, ic ) = (casa::Float)(tsys[0][ic]) ;
471  }
472  else if ( numRec == 1 && numChan == 1 ) {
473    ret.resize( npol, 1 ) ;
474    for ( unsigned int ip = 0 ; ip < npol ; ip++ )
475      ret( ip, 0 ) = (casa::Float)(tsys[0][0]) ;
476  }
477  else if ( numRec == 2 && npol == 4 && numChan == nchan ) {
478    // TODO: How to determine Tsys for XY?
479    //       at the moment Tsys[XY] = 0.5*(Tsys[X]+Tsys[Y])
480    ret.resize( npol, nchan ) ;
481    for ( unsigned int ic = 0 ; ic < nchan ; ic++ ) {
482      casa::Float tsysxy = (casa::Float)(0.5*(tsys[0][ic]+tsys[1][ic])) ;
483      ret( 0, ic ) = (casa::Float)(tsys[0][ic]) ;
484      ret( 1, ic ) = (casa::Float)(tsys[1][ic]) ;
485      ret( 2, ic ) = tsysxy ;
486      ret( 3, ic ) = tsysxy ;
487    }
488  }
489  else if ( numRec == 2 && npol == 4 && numChan == 1 ) {
490    // TODO: How to determine Tsys for XY?
491    //       at the moment Tsys[XY] = 0.5*(Tsys[X]+Tsys[Y])
492    ret.resize( npol, 1 ) ;
493    casa::Float tsysxy = (casa::Float)(0.5*(tsys[0][0]+tsys[1][0])) ;
494    ret( 0, 0 ) = (casa::Float)(tsys[0][0]) ;
495    ret( 1, 0 ) = (casa::Float)(tsys[1][0]) ;
496    ret( 2, 0 ) = tsysxy ;
497    ret( 3, 0 ) = tsysxy ;
498  }
499  else {
500    // I don't know how to handle ...
501    for ( unsigned int ip = 0 ; ip < npol ; ip++ )
502      for ( unsigned int ic = 0 ; ic < nchan ; ic++ )
503        ret( ip, ic ) = (casa::Float)(tsys[0][ic]) ;   
504  }
505  return ret ;
506}
507
508Vector<casa::Float> ASDMFiller::toVector( vector<float> &tau,
509                                               unsigned int npol )
510{
511  String funcName = "toVector" ;
512
513  Vector<casa::Float> ret( npol ) ;
514  //logsink_->postLocally( LogMessage("tau0="+String::toString(tau[0]),LogOrigin(className_,funcName,WHERE)) ) ;
515  if ( npol == 4 ) {
516    ret[0] = (casa::Float)tau[0] ;
517    ret[1] = (casa::Float)tau[1] ;
518    ret[2] = 0.5 * ( ret[0] + ret[1] ) ;
519    ret[3] = ret[2] ;
520  }
521  else if ( npol == tau.size() ) {
522    for ( unsigned int ipol = 0 ; ipol < npol ; ipol++ )
523      ret[ipol] = (casa::Float)tau[ipol] ;
524  }
525  else {
526    // I don't know how to handle...
527    for ( unsigned int ipol = 0 ; ipol < npol ; ipol++ )
528      ret[ipol] = (casa::Float)tau[0] ;
529  }
530  //logsink_->postLocally( LogMessage("tau="+String::toString(ret),LogOrigin(className_,funcName,WHERE)) ) ;
531  return ret ;
532}
533
534String ASDMFiller::toTcalTime( casa::Double mjd )
535{
536  return MVTime( mjd ).string( MVTime::YMD ) ;
537}
538
539void ASDMFiller::toJ2000( Vector<casa::Double> &dir,
540                               double az,
541                               double el,
542                               casa::Double mjd,
543                               Vector<casa::Double> antpos )
544{
545  String funcName = "toJ2000" ;
546
547  Vector<casa::Double> azel( 2 ) ;
548  azel[0] = az ;
549  azel[1] = el ;
550//   MEpoch me( Quantity( mjd, "d" ), MEpoch::UTC ) ;
551//   Vector<Quantity> qantpos( 3 ) ;
552//   qantpos[0] = Quantity( antpos[0], "m" ) ;
553//   qantpos[1] = Quantity( antpos[1], "m" ) ;
554//   qantpos[2] = Quantity( antpos[2], "m" ) ;
555//   MPosition mp( MVPosition( qantpos ),
556//                 MPosition::ITRF ) ;
557// //   mp.print( os_.output() ) ;
558//   MeasFrame mf( me, mp ) ;
559//   MDirection::Convert toj2000( MDirection::AZELGEO,
560//                                MDirection::Ref( MDirection::J2000, mf ) ) ;
561//   dir = toj2000( azel ).getAngle( "rad" ).getValue() ;
562  dir = toJ2000( azel, "AZELGEO", mjd, antpos ) ;
563  //logsink_->postLocally( LogMessage("dir = "+String::toString(dir),LogOrigin(className_,funcName,WHERE)) ) ;
564}
565
566Vector<casa::Double> ASDMFiller::toJ2000( Vector<casa::Double> dir,
567                                          String dirref,
568                                          casa::Double mjd,
569                                          Vector<casa::Double> antpos )
570{
571  Vector<casa::Double> newd( dir ) ;
572  if ( dirref != "J2000" ) {
573    MEpoch me( Quantity( mjd, "d" ), MEpoch::UTC ) ;
574    Vector<Quantity> qantpos( 3 ) ;
575    qantpos[0] = Quantity( antpos[0], "m" ) ;
576    qantpos[1] = Quantity( antpos[1], "m" ) ;
577    qantpos[2] = Quantity( antpos[2], "m" ) ;
578    MPosition mp( MVPosition( qantpos ),
579                  MPosition::ITRF ) ;
580    //   mp.print( os_.output() ) ;
581    MeasFrame mf( me, mp ) ;
582    MDirection::Types dirtype ;
583    Bool b = MDirection::getType( dirtype, dirref ) ;
584    if ( b ) {
585      MDirection::Convert toj2000( dirtype,
586                                   MDirection::Ref( MDirection::J2000, mf ) ) ;
587      newd = toj2000( dir ).getAngle( "rad" ).getValue() ;
588    }
589  }
590  return newd ;
591}
592
593MFrequency::Types ASDMFiller::toFrameType( string &s )
594{
595  MFrequency::Types ftype = MFrequency::DEFAULT ;
596  if ( s == "LABREST" )
597    ftype = MFrequency::REST ;
598  else {
599    Bool b = MFrequency::getType( ftype, String(s) ) ;
600    if (!b)
601      ftype = MFrequency::DEFAULT ;
602  }
603  return ftype ;
604}
605
606casa::Double ASDMFiller::toLSRK( casa::Double freq,
607                                 String freqref,
608                                 casa::Double utc,
609                                 Vector<casa::Double> antpos,
610                                 Vector<casa::Double> dir,
611                                 String dirref )
612{
613  String funcName = "toLSRK" ;
614
615  //logsink_->postLocally( LogMessage("freqref = "+freqref,LogOrigin(className_,funcName,WHERE)) ) ;
616  casa::Double newf = freq ;
617  if ( freqref != "LSRK" ) {
618    MEpoch me( Quantum<casa::Double>( utc, Unit("d") ), MEpoch::UTC ) ;
619    Vector< Quantum<casa::Double> > antposQ( 3 ) ;
620    for ( int i = 0 ; i < 3 ; i++ )
621      antposQ[i] = Quantum<casa::Double>( antpos[i], Unit("m") ) ;
622    MPosition mp( antposQ, MPosition::ITRF ) ;
623    MDirection::Types dirtype ;
624    Bool b = MDirection::getType( dirtype, dirref ) ;
625    if ( !b )
626      dirtype = MDirection::J2000 ;
627    MDirection md( Quantum<casa::Double>( dir[0], Unit("rad") ),
628                   Quantum<casa::Double>( dir[1], Unit("rad") ),
629                   dirtype ) ;
630    MeasFrame mf( me, mp, md ) ;
631    MFrequency::Types freqtype ;
632    b = MFrequency::getType( freqtype, freqref ) ;
633    if ( !b )
634      freqtype = MFrequency::TOPO ;
635    MFrequency::Convert tolsr( freqtype,
636                               MFrequency::Ref( MFrequency::LSRK, mf ) ) ;
637    newf = tolsr( Quantum<casa::Double>( freq, Unit("Hz") ) ).get( "Hz" ).getValue() ;
638    //logsink_->postLocally( LogMessage("freq = "+String::toString(freq)+", newf = "+String::toString(newf),LogOrigin(className_,funcName,WHERE)) ) ;
639  }
640  return newf ;
641}
Note: See TracBrowser for help on using the repository browser.