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