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

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

New Development: No

JIRA Issue: No

Ready for Test: Yes

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: test_importasdm_sd

Put in Release Notes: es/No

Module(s): Module Names change impacts.

Description: Describe your changes here...

Bug fix on asdm2ASAP that causes segmentation fault.


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