source: trunk/external-alma/oldasdm2ASAP/OldASDMFiller.cc @ 2273

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

Support latest ASDM definition in asdm2ASAP.
Now asdm2ASAP is linked to libalma_v3.so to be able to read latest ASDM.

The importasdm task invokes asdm2ASAP when singledish is True.

Older version of asdm2ASAP is renamec as oldasdm2ASAP.
The oldasdm2ASAP and related classes are built by linking to libalma.so.
It is installed but not used by any tasks.


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