source: trunk/external-alma/oldasdm2ASAP/OldASDMReader.h @ 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: 15.7 KB
Line 
1#ifndef ASAP_OLD_ASDM_READER_H
2#define ASAP_OLD_ASDM_READER_H
3
4#include <string>
5#include <map>
6
7#include <casa/Utilities/CountedPtr.h>
8#include <casa/Containers/Record.h>
9#include <casa/Logging/LogSinkInterface.h>
10#include <ASDMAll.h>
11#include <SDMBinData.h>
12
13class OldASDMReader
14{
15public:
16  /**
17   * constructor
18   **/
19  OldASDMReader() ;
20
21  /**
22   * destructor
23   **/
24  ~OldASDMReader() ;
25
26  /**
27   * open data
28   *
29   * @param filename input ASDM name
30   * @param processing options as casa record
31   * @return boolean status (true or false)
32   **/
33  bool open( const std::string &filename, const casa::Record &rec ) ;
34
35  /**
36   * fill data
37   **/
38//   void fill() ;
39
40  /**
41   * close data
42   **/
43  void close() ;
44 
45  /**
46   * get antenna id
47   **/
48  casa::Int getAntennaId() { return antennaId_ ; } ;
49
50  /**
51   * get antenna name
52   **/
53  casa::String getAntennaName() { return antennaName_ ; } ;
54
55  /**
56   * fill header
57   *
58   * @param nchan (maximum) number of channel
59   * @param npol (maximum) number of polarization
60   * @param nif number of IFs
61   * @param nbeam number of beam
62   * @param observer observer name
63   * @param project name
64   * @param obstype observation type
65   * @param antennaname antenna name
66   * @param antennaposition antenna position
67   * @param equinox equinox (numerical value)
68   * @param freqref frequency frame
69   * @param reffreq reference frequency
70   * @param bandwidth (maximum) bandwidth
71   * @param utc start time of observation
72   * @param fluxunit flux unit (K or Jy)
73   * @param epoch epoch (UTC)
74   * @param poltype polarization type
75   **/
76  void fillHeader( casa::Int &nchan,
77                   casa::Int &npol,
78                   casa::Int &nif,
79                   casa::Int &nbeam,
80                   casa::String &observer,
81                   casa::String &project,
82                   casa::String &obstype,
83                   casa::String &antennaname,
84                   casa::Vector<casa::Double> &antennaposition,
85                   casa::Float &equinox,
86                   casa::String &freqref,
87                   casa::Double &reffreq,
88                   casa::Double &bandwidth,
89                   casa::Double &utc,
90                   casa::String &fluxunit,
91                   casa::String &epoch,
92                   casa::String &poltype ) ; 
93
94  /**
95   * get list of valid configDescriptionId
96   *
97   * only return list of configDescriptionId with correlationMode of
98   * AUTO_ONLY or CROSS_AND_AUTO.
99   *
100   * @return list of valid configDescriptionId
101   **/
102  casa::Vector<casa::uInt> getConfigDescriptionIdList() { return configDescIdList_ ; } ;
103
104  /**
105   * get list of fieldId
106   *
107   * @return list of fieldId as casa::uInt
108   **/
109  casa::Vector<casa::uInt> getFieldIdList() ;
110
111  /**
112   * get number of rows in Main table
113   *
114   * @return number of rows in Main table
115   **/
116  casa::uInt getNumMainRow() ;
117
118  /**
119   * binary data selection
120   **/
121  void select() ;
122
123  /**
124   * set Main rows that matches given context (configDescId and fieldId)
125   * to mainRow_
126   *
127   * @param configDescId
128   * @param fieldId
129   **/
130  casa::Bool setMainRow( casa::uInt configDescId, casa::uInt fieldId ) ;
131
132  /**
133   * set Main row to SDMBinData object
134   *
135   * @param irow row index
136   * @return boolean indicating the row is valid or not
137   **/
138  casa::Bool setMainRow( casa::uInt irow ) ;
139
140  /**
141   * get scan number of current row
142   *
143   * @return scan number
144   **/
145  unsigned int getScanNo() { return (unsigned int)(mainRow_[row_]->getScanNumber()) ; } ;
146
147  /**
148   * get subscan number of current row
149   *
150   * @return subscan number
151   **/
152  unsigned int getSubscanNo() { return (unsigned int)(mainRow_[row_]->getSubscanNumber()) ; } ;
153
154  /**
155   * get subscan number for given index
156   *
157   * @param idx for vmsData_
158   * @return subscan number
159   **/
160  unsigned int getSubscanNo( unsigned int idx ) ;
161
162  /**
163   * get IF number for given index
164   *
165   * @param idx for vmsData_
166   * @return IF number
167   **/
168  casa::uInt getIFNo( unsigned int idx ) ;
169
170  /**
171   * get number of polarization for given index
172   *
173   * @param idx for vmsData_
174   * @return number of polarizations
175   **/
176  int getNumPol( unsigned int idx ) ;
177
178  /**
179   * get REFPIX, REFVAL, INCREMENT for given index
180   *
181   * @param idx for vmsData_
182   * @param refpix REFPIX
183   * @param refval REFVAL
184   * @param incr INCREMENT
185   * @param freqref frequency reference
186   **/
187  void getFrequency( unsigned int idx,
188                     double &refpix,
189                     double &refval,
190                     double &incr,
191                     std::string &freqref ) ;
192
193  /**
194   * get rest frequencies for given index
195   *
196   * @param idx for vmsData_
197   * @return rest frequencies
198   **/
199  vector<double> getRestFrequency( unsigned int idx ) ;
200
201  /**
202   * get MJD time in day for given index
203   *
204   * @param idx for vmsData_
205   * @return MJD time in day
206   **/
207  double getTime( unsigned int idx ) ;
208
209  /**
210   * get integration time in sec for given index
211   *
212   * @param idx for vmsData_
213   * @return integration time in sec
214   **/
215  double getInterval( unsigned int idx ) ;
216
217  /**
218   * get source name for given index
219   *
220   * @param idx for vmsData_
221   * @return source name
222   **/
223  string getSourceName( unsigned int idx ) ;
224
225  /**
226   * get field name for given index
227   * field name = fieldName + "__" + fieldId
228   *
229   * @param idx for vmsData_
230   * @return field name
231   **/
232  string getFieldName( unsigned int idx ) ;
233
234  /**
235   * get source direction for given index
236   *
237   * @param idx for vmsData_
238   * @return source direction as vector<double>
239   **/
240  std::vector<double> getSourceDirection( unsigned int idx ) ;
241  void getSourceDirection( unsigned int idx,
242                           std::vector<double> &dir,
243                           std::string &ref  ) ;
244
245  /**
246   * get source direction with reference
247   *
248   * @param dir source direction
249   * @param reference frame
250   * @param idx for Source table
251   **/
252  void getSourceDirection( std::vector<double> &dir, std::string &ref ) ;
253 
254  /**
255   * get source proper motion for given index
256   *
257   * @param idx for vmsData_
258   * @return source proper motion as vector<double>
259   **/
260  std::vector<double> getSourceProperMotion( unsigned int idx ) ;
261
262  /**
263   * get systemic velocity of the source for given index
264   * at the moment return 0-th element of sysVel vector
265   *
266   * @param idx for vmsData_
267   * @return systemic velocity of the source
268   **/
269  double getSysVel( unsigned int idx ) ;
270
271  /**
272   * get row-based flag for given index
273   *
274   * @param idx for vmsData_
275   * @return row-based flag
276   **/
277  unsigned int getFlagRow( unsigned int idx ) ;
278
279  /**
280   * get data shape (nPol, nChan, nApc=1) for given index
281   *
282   * @param idx for vmsData_
283   * @return data shape
284   **/
285  std::vector<unsigned int> getDataShape( unsigned int idx ) ;
286
287  /**
288   * get spectral data for given index
289   *
290   * @param idx for vmsData_
291   * @return spectral data
292   **/
293  float *getSpectrum( unsigned int idx ) ;
294
295  /**
296   * get channel flag data for given index
297   *
298   * @param idx for vmsData_
299   * @return channel flag
300   **/
301  //bool *getFlagChannel( unsigned int idx ) ;
302 
303  /**
304   * get Tsys for given index
305   *
306   * @param idx for vmsData_
307   * @return Tsys
308   **/
309  std::vector< std::vector<float> > getTsys( unsigned int idx ) ;
310 
311  /**
312   * get Tcal for given index
313   *
314   * @param idx for vmsData_
315   * @return Tcal
316   **/
317  std::vector< std::vector<float> > getTcal( unsigned int idx ) ;
318
319  /**
320   * get Tcal and Tsys for given index
321   *
322   * @param idx for vmsData_
323   * @param tcal Tcal
324   * @param tsys Tsys
325   **/
326  void getTcalAndTsys( unsigned int idx,
327                       std::vector< std::vector<float> > &tcal,
328                       std::vector< std::vector<float> > &tsys ) ;
329 
330  /**
331   * get opacity for given index
332   *
333   * @param idx for vmsData_
334   * @return opacity
335   **/
336  std::vector<float> getOpacity( unsigned int idx ) ;
337 
338  /**
339   * get weather information for given index
340   *
341   * @param idx for vmsData_
342   * @param temperature
343   * @param pressure
344   * @param humidity
345   * @param windspeed
346   * @param windaz
347   **/
348  void getWeatherInfo( unsigned int idx,
349                       float &temperature,
350                       float &pressure,
351                       float &humidity,
352                       float &windspeed,
353                       float &windaz ) ;
354
355  /**
356   * get pointing information for given index
357   *
358   * @param idx for vmsData_
359   * @param dir direction
360   * @param az azimuth
361   * @param el elevation
362   * @param srate scan rate
363   **/
364  void getPointingInfo( unsigned int idx,
365                        std::vector<double> &dir,
366                        double &az,
367                        double &el,
368                        std::vector<double> &srate ) ;
369
370  /**
371   * get source type enum (int) for given scan and subscan
372   *
373   * @param scan scan No.
374   * @param subscan subscan No.
375   * @return source type as int
376   **/
377  int getSrcType( unsigned int scan,
378                  unsigned int subscan ) ;
379
380  /**
381   * get list of dataDescId for given configDescId
382   *
383   * @param configDescId
384   * @return list of dataDescId
385   **/
386//   casa::Vector<casa::uInt> getDataDescIdList( casa::uInt cdid ) ;
387
388  /**
389   * get list of switchCycleId for given configDescId
390   *
391   * @param configDescId
392   * @return list of dataDescId
393   **/
394//   casa::Vector<casa::uInt> getSwitchCycleIdList( casa::uInt cdid ) ;
395
396  /**
397   * get list of feedId for given configDescId
398   *
399   * only return list of feedId that corresponds to specified antenna.
400   *
401   * @param configDescId
402   * @return list of valid feedId
403   **/
404//   casa::Vector<casa::uInt> getFeedIdList( casa::uInt cdid ) ;
405
406  /**
407   * set binary data to MSData object
408   *
409   * @return boolean status
410   **/
411  casa::Bool setData() ;
412
413  /**
414   * get number of data in the current row
415   *
416   * @return number of data
417   **/
418  unsigned int getNumData() { return numData_ ; } ;
419
420  /**
421   * get frequency frame
422   *
423   * @return string representating frequency frame
424   **/
425  std::string getFrame() ;
426
427  /**
428   * set Logger
429   *
430   * @param logger (LogSinkInterface)
431   **/
432  void setLogger( casa::CountedPtr<casa::LogSinkInterface> &logsink ) ;
433
434
435private:
436
437  /**
438   * pick up valid configDescriptionId
439   *
440   * only retrieve configDescriptionId with correlationMode of
441   * AUTO_ONLY or CROSS_AND_AUTO.
442   **/
443  void selectConfigDescription() ;
444
445  /**
446   * pick up valid feedId
447   *
448   * only retrieve feedId that has corresponding row for antennaId_
449   **/
450  void selectFeed() ;
451
452  /**
453   * clear mainRow_
454   **/
455  void clearMainRow() ;
456
457  /**
458   * determine IFNO for each SpectralWindow rows
459   *
460   * SpectralWindow row is identified as WVR when basebandName is "NOBB" and numChan is 4.
461   * All WVR SpectralWindow is merged into one IFNO.
462   **/
463  void setupIFNO() ;
464
465  /**
466   * check if given SpectralWindow is WVR or not
467   **/
468  bool isWVR( asdm::SpectralWindowRow *row ) ;
469 
470  /**
471   * process Station table
472   *
473   * classify station Ids by its type
474   **/
475  void processStation() ;
476
477  /**
478   * get the closest weather station for given antenna pad
479   *
480   * @return stationId for weather station
481   **/
482  int getClosestWeatherStation() ;
483
484  /**
485   * get mid-point of ArrayTimeInterval
486   *
487   * @param time interval as ArrayTimeInterval
488   * @return time of mid-point as ArrayTime
489   **/
490  asdm::ArrayTime getMidTime( const asdm::ArrayTimeInterval &t ) ;
491
492  /**
493   * get start-point of ArrayTimeInterval
494   *
495   * @param time interval as ArrayTimeInterval
496   * @return time of start-point as ArrayTime
497   **/
498  asdm::ArrayTime getStartTime( const asdm::ArrayTimeInterval &t ) ;
499
500  /**
501   * get end-point of ArrayTimeInterval
502   *
503   * @param time interval as ArrayTimeInterval
504   * @return time of end-point as ArrayTime
505   **/
506  asdm::ArrayTime getEndTime( const asdm::ArrayTimeInterval &t ) ;
507
508  /**
509   *  AZEL to J2000
510   *
511   * @param dir pointing direction
512   * @param az azimuth
513   * @param el elevation
514   * @param mjd reference time
515   * @param antpos antenna position vector
516   **/
517  void toJ2000( std::vector<double> &dir,
518                double az,
519                double el,
520                double mjd,
521                casa::Vector<casa::Double> antpos ) ;
522
523  /**
524  * to J2000
525  *
526  * @param dir pointing direction
527  * @param dirref direction reference
528  * @param mjd reference time
529  * @param antpos antenna position vector
530  * @return new direction
531  **/
532  std::vector<double> toJ2000( std::vector<double> dir,
533                               casa::String dirref,
534                               double mjd,
535                               casa::Vector<casa::Double> antpos ) ;
536  /**
537   * get nIF
538   *
539   * @return number of IFs
540   **/
541  int getNumIFs() ;
542
543  /**
544   * get appropriate row from SysCal table
545   *
546   * @param idx for vmsData_
547   * @return pointer to SysCalRow object (0 when no appropriate row)
548   **/
549  asdm::SysCalRow *getSysCalRow( unsigned int idx ) ;
550
551  /**
552   * limit angule in radian within [-pi,pi]
553   *
554   * @param any angule in radian
555   * @return equivalent angle that satisfies [-pi,pi]
556   **/
557  double limitedAngle( double angle ) ;
558
559  /**
560   * retrieve pointing direction from pointingDirection column
561   * or from target+offset
562   *
563   * @param row pointer to PointingRow object
564   * @return pointing direction vector (matrix)
565   **/
566  std::vector< std::vector<double> > pointingDir( asdm::PointingRow *row ) ;
567
568  asdm::ASDM *asdm_ ; // pointer to ASDM object
569  sdmbin::SDMBinData *sdmBin_ ; // pointer to ASDM binary data
570  /**
571   * vmsData_ is a pointer to binary data
572   *
573   * VMSData contents
574   *
575   * int processorId
576   * vector< double > v_time MJD time in sec
577   * vector< int > v_fieldId
578   * vector< double > v_interval interval in sec
579   * vector< AtmPhaseCorrection > v_atmPhaseCorrection
580   * int binNum
581   * vector< unsigned int > v_projectPath
582   * vector< int > v_antennaId1 antennaId in int
583   * vector< int > v_antennaId2 antennaId in int
584   * vector< int > v_feedId1 feedId in int
585   * vector< int > v_feedId2 feedId in int
586   * vector< int > v_dataDescId dataDescriptionId in int
587   * vector< double > v_timeCentroid
588   * vector< double > exposure
589   * vector< int > v_numData
590   * vector< vector< unsigned int > > vv_dataShape (nPol,nChan,nApc=1)
591   * vector< map< AtmPhaseCorrection, float *> > v_m_data actual data
592   * vector< vector< vector< Angle > > > v_pahseDir direction
593   * vector< int > v_stateId
594   * vector< MSState > v_msState
595   * vector< unsigned int > v_flag
596   **/
597  const sdmbin::VMSData *vmsData_ ;
598  casa::Int antennaId_ ; // antenna id
599  casa::String antennaName_ ; // antenna name
600  casa::Vector<asdm::MainRow *> mainRow_ ; // list of pointers to all Main rows
601  casa::Vector<casa::uInt> configDescIdList_ ; // list of valid configDescriptionId
602  casa::Vector<casa::uInt> feedIdList_ ; // list of valid feedId
603  casa::Vector<casa::uInt> fieldIdList_ ; // list of fieldId
604  casa::Int row_ ; // current row index
605  map<asdm::Tag,casa::uInt> ifno_ ; // list of IFNO for each SpectralWindow rows
606  unsigned int numData_ ; // number of valid data in vmsData_ where v_antennaId equals antennaId_
607  vector<unsigned int> dataIdList_ ; // list of valid data indexes in vmsData_ 
608  vector<asdm::Tag> antennaPad_ ; // list of Station Tags for ANTENNA_PAD
609  vector<asdm::Tag> weatherStation_ ; // list of Station Tags for WEATHER_STATION
610  int weatherStationId_ ; // closest weather station for antennaId_
611  AtmPhaseCorrectionMod::AtmPhaseCorrection apc_ ; // ATM phase correction
612  EnumSet<CorrelationModeMod::CorrelationMode> corrMode_ ; // input correlation mode
613  EnumSet<TimeSamplingMod::TimeSampling> timeSampling_ ; // time sampling
614  EnumSet<SpectralResolutionTypeMod::SpectralResolutionType> resolutionType_ ; // spectral resolution type
615  casa::CountedPtr<casa::LogSinkInterface> logsink_ ; // Logger
616  casa::String className_ ;
617} ;
618#endif // ASAP_OLD_ASDM_READER_H
Note: See TracBrowser for help on using the repository browser.