source: trunk/external-alma/oldasdm2ASAP/OldASDMReader.h @ 2301

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

Test Programs: test_importasdm_sd

Put in Release Notes: Yes/No?

Module(s): Module Names change impacts.

Description: Describe your changes here...

Refactoring the code.


File size: 16.3 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 getScanNoOfCurrentRow() { return (unsigned int)(mainRow_[row_]->getScanNumber()) ; } ;
146
147  /**
148   * get subscan number of current row
149   *
150   * @return subscan number
151   **/
152  unsigned int getSubscanNoOfCurrentRow() { return (unsigned int)(mainRow_[row_]->getSubscanNumber()) ; } ;
153
154  /**
155   * set data index
156   *
157   * @param idx for vmsData_
158   **/
159  void prepareData( unsigned int idx ) ;
160
161  /**
162   * get subscan number for given index
163   *
164   * @param idx for vmsData_
165   * @return subscan number
166   **/
167  unsigned int getSubscanNo( unsigned int idx ) ;
168  unsigned int getSubscanNo() ;
169
170  /**
171   * get IF number for given index
172   *
173   * @param idx for vmsData_
174   * @return IF number
175   **/
176  casa::uInt getIFNo( unsigned int idx ) ;
177  casa::uInt getIFNo() ;
178
179  /**
180   * get number of polarization for given index
181   *
182   * @param idx for vmsData_
183   * @return number of polarizations
184   **/
185  int getNumPol( unsigned int idx ) ;
186  int getNumPol() ;
187
188  /**
189   * get REFPIX, REFVAL, INCREMENT for given index
190   *
191   * @param idx for vmsData_
192   * @param refpix REFPIX
193   * @param refval REFVAL
194   * @param incr INCREMENT
195   * @param freqref frequency reference
196   **/
197  void getFrequency( unsigned int idx,
198                     double &refpix,
199                     double &refval,
200                     double &incr,
201                     std::string &freqref ) ;
202  void getFrequency( double &refpix,
203                     double &refval,
204                     double &incr,
205                     std::string &freqref ) ;
206
207  /**
208   * get MJD time in day for given index
209   *
210   * @param idx for vmsData_
211   * @return MJD time in day
212   **/
213  double getTime( unsigned int idx ) ;
214  double getTime() ;
215
216  /**
217   * get integration time in sec for given index
218   *
219   * @param idx for vmsData_
220   * @return integration time in sec
221   **/
222  double getInterval( unsigned int idx ) ;
223  double getInterval() ;
224
225  /**
226   * get source direction with reference
227   *
228   * @param dir source direction
229   * @param reference frame
230   * @param idx for Source table
231   **/
232  void getSourceDirection( std::vector<double> &dir, std::string &ref ) ;
233 
234  /**
235   * get row-based flag for given index
236   *
237   * @param idx for vmsData_
238   * @return row-based flag
239   **/
240  unsigned int getFlagRow( unsigned int idx ) ;
241  unsigned int getFlagRow() ;
242
243  /**
244   * get data shape (nPol, nChan, nApc=1) for given index
245   *
246   * @param idx for vmsData_
247   * @return data shape
248   **/
249  std::vector<unsigned int> getDataShape( unsigned int idx ) ;
250  std::vector<unsigned int> getDataShape() ;
251
252  /**
253   * get spectral data for given index
254   *
255   * @param idx for vmsData_
256   * @return spectral data
257   **/
258  float *getSpectrum( unsigned int idx ) ;
259  float *getSpectrum() ;
260
261  /**
262   * get Tsys for given index
263   *
264   * @param idx for vmsData_
265   * @return Tsys
266   **/
267  std::vector< std::vector<float> > getTsys( unsigned int idx ) ;
268  std::vector< std::vector<float> > getTsys() ;
269 
270  /**
271   * get Tcal for given index
272   *
273   * @param idx for vmsData_
274   * @return Tcal
275   **/
276  std::vector< std::vector<float> > getTcal( unsigned int idx ) ;
277  std::vector< std::vector<float> > getTcal() ;
278
279  /**
280   * get Tcal and Tsys for given index
281   *
282   * @param idx for vmsData_
283   * @param tcal Tcal
284   * @param tsys Tsys
285   **/
286  void getTcalAndTsys( unsigned int idx,
287                       std::vector< std::vector<float> > &tcal,
288                       std::vector< std::vector<float> > &tsys ) ;
289  void getTcalAndTsys( std::vector< std::vector<float> > &tcal,
290                       std::vector< std::vector<float> > &tsys ) ;
291 
292  /**
293   * get opacity for given index
294   *
295   * @param idx for vmsData_
296   * @return opacity
297   **/
298  std::vector<float> getOpacity( unsigned int idx ) ;
299  std::vector<float> getOpacity() ;
300 
301  /**
302   * get weather information for given index
303   *
304   * @param idx for vmsData_
305   * @param temperature
306   * @param pressure
307   * @param humidity
308   * @param windspeed
309   * @param windaz
310   **/
311  void getWeatherInfo( unsigned int idx,
312                       float &temperature,
313                       float &pressure,
314                       float &humidity,
315                       float &windspeed,
316                       float &windaz ) ;
317  void getWeatherInfo( float &temperature,
318                       float &pressure,
319                       float &humidity,
320                       float &windspeed,
321                       float &windaz ) ;
322
323  /**
324   * get pointing information for given index
325   *
326   * @param idx for vmsData_
327   * @param dir direction
328   * @param az azimuth
329   * @param el elevation
330   * @param srate scan rate
331   **/
332  void getPointingInfo( unsigned int idx,
333                        std::vector<double> &dir,
334                        double &az,
335                        double &el,
336                        std::vector<double> &srate ) ;
337  void getPointingInfo( std::vector<double> &dir,
338                        double &az,
339                        double &el,
340                        std::vector<double> &srate ) ;
341
342  /**
343   * get source type enum (int) for given scan and subscan
344   *
345   * @param scan scan No.
346   * @param subscan subscan No.
347   * @return source type as int
348   **/
349  int getSrcType( unsigned int scan,
350                  unsigned int subscan ) ;
351
352  /**
353   * get source properties
354   *
355   * @param idx for vmsData_
356   * @param srcname source name
357   * @param fieldname field name
358   * @param srcdir source direction
359   * @param srcpm source proper motion
360   * @param sysvel systemic velocity of the source
361   * @param restfreq rest frequency
362   **/
363  void getSourceProperty( unsigned int idx,
364                          std::string &srcname,
365                          std::string &fieldname,
366                          std::vector<double> &srcdir,
367                          std::vector<double> &srcpm,
368                          double &sysvel,
369                          std::vector<double> &restfreq ) ;
370  void getSourceProperty( std::string &srcname,
371                          std::string &fieldname,
372                          std::vector<double> &srcdir,
373                          std::vector<double> &srcpm,
374                          double &sysvel,
375                          std::vector<double> &restfreq ) ;
376
377  /**
378   * set binary data to MSData object
379   *
380   * @return boolean status
381   **/
382  casa::Bool setData() ;
383
384  /**
385   * get number of data in the current row
386   *
387   * @return number of data
388   **/
389  unsigned int getNumData() { return numData_ ; } ;
390
391  /**
392   * get frequency frame
393   *
394   * @return string representating frequency frame
395   **/
396  std::string getFrame() ;
397
398  /**
399   * set Logger
400   *
401   * @param logger (LogSinkInterface)
402   **/
403  void setLogger( casa::CountedPtr<casa::LogSinkInterface> &logsink ) ;
404
405
406private:
407
408  /**
409   * pick up valid configDescriptionId
410   *
411   * only retrieve configDescriptionId with correlationMode of
412   * AUTO_ONLY or CROSS_AND_AUTO.
413   **/
414  void selectConfigDescription() ;
415
416  /**
417   * pick up valid feedId
418   *
419   * only retrieve feedId that has corresponding row for antennaId_
420   **/
421  void selectFeed() ;
422
423  /**
424   * clear mainRow_
425   **/
426  void clearMainRow() ;
427
428  /**
429   * determine IFNO for each SpectralWindow rows
430   *
431   * SpectralWindow row is identified as WVR when basebandName is "NOBB" and numChan is 4.
432   * All WVR SpectralWindow is merged into one IFNO.
433   **/
434  void setupIFNO() ;
435
436  /**
437   * check if given SpectralWindow is WVR or not
438   **/
439  bool isWVR( asdm::SpectralWindowRow *row ) ;
440 
441  /**
442   * process Station table
443   *
444   * classify station Ids by its type
445   **/
446  void processStation() ;
447
448  /**
449   * get the closest weather station for given antenna pad
450   *
451   * @return stationId for weather station
452   **/
453  int getClosestWeatherStation() ;
454
455  /**
456   * get mid-point of ArrayTimeInterval
457   *
458   * @param time interval as ArrayTimeInterval
459   * @return time of mid-point as ArrayTime
460   **/
461  asdm::ArrayTime getMidTime( const asdm::ArrayTimeInterval &t ) ;
462
463  /**
464   * get start-point of ArrayTimeInterval
465   *
466   * @param time interval as ArrayTimeInterval
467   * @return time of start-point as ArrayTime
468   **/
469  asdm::ArrayTime getStartTime( const asdm::ArrayTimeInterval &t ) ;
470
471  /**
472   * get end-point of ArrayTimeInterval
473   *
474   * @param time interval as ArrayTimeInterval
475   * @return time of end-point as ArrayTime
476   **/
477  asdm::ArrayTime getEndTime( const asdm::ArrayTimeInterval &t ) ;
478
479  /**
480   *  AZEL to J2000
481   *
482   * @param dir pointing direction
483   * @param az azimuth
484   * @param el elevation
485   * @param mjd reference time
486   * @param antpos antenna position vector
487   **/
488  void toJ2000( std::vector<double> &dir,
489                double &az,
490                double &el,
491                double &mjd,
492                casa::Vector<casa::Quantity> &antpos ) ;
493
494  /**
495  * to J2000
496  *
497  * @param dir pointing direction
498  * @param dirref direction reference
499  * @param mjd reference time
500  * @param antpos antenna position vector
501  * @return new direction
502  **/
503  std::vector<double> toJ2000( std::vector<double> &dir,
504                               casa::String &dirref,
505                               double &mjd,
506                               casa::Vector<casa::Quantity> &antpos ) ;
507  /**
508   * get nIF
509   *
510   * @return number of IFs
511   **/
512  int getNumIFs() ;
513
514  /**
515   * get appropriate row from SysCal table
516   *
517   * @param idx for vmsData_
518   * @return pointer to SysCalRow object (0 when no appropriate row)
519   **/
520  asdm::SysCalRow *getSysCalRow( unsigned int idx ) ;
521  asdm::SysCalRow *getSysCalRow() ;
522
523  /**
524   * limit angule in radian within [-pi,pi]
525   *
526   * @param any angule in radian
527   * @return equivalent angle that satisfies [-pi,pi]
528   **/
529  double limitedAngle( double angle ) ;
530
531  /**
532   * retrieve pointing direction from pointingDirection column
533   * or from target+offset
534   *
535   * @param row pointer to PointingRow object
536   * @return pointing direction vector (matrix)
537   **/
538  std::vector< std::vector<double> > pointingDir( asdm::PointingRow *row ) ;
539
540  asdm::ASDM *asdm_ ; // pointer to ASDM object
541  sdmbin::SDMBinData *sdmBin_ ; // pointer to ASDM binary data
542  /**
543   * vmsData_ is a pointer to binary data
544   *
545   * VMSData contents
546   *
547   * int processorId
548   * vector< double > v_time MJD time in sec
549   * vector< int > v_fieldId
550   * vector< double > v_interval interval in sec
551   * vector< AtmPhaseCorrection > v_atmPhaseCorrection
552   * int binNum
553   * vector< unsigned int > v_projectPath
554   * vector< int > v_antennaId1 antennaId in int
555   * vector< int > v_antennaId2 antennaId in int
556   * vector< int > v_feedId1 feedId in int
557   * vector< int > v_feedId2 feedId in int
558   * vector< int > v_dataDescId dataDescriptionId in int
559   * vector< double > v_timeCentroid
560   * vector< double > exposure
561   * vector< int > v_numData
562   * vector< vector< unsigned int > > vv_dataShape (nPol,nChan,nApc=1)
563   * vector< map< AtmPhaseCorrection, float *> > v_m_data actual data
564   * vector< vector< vector< Angle > > > v_pahseDir direction
565   * vector< int > v_stateId
566   * vector< MSState > v_msState
567   * vector< unsigned int > v_flag
568   **/
569  const sdmbin::VMSData *vmsData_ ;
570 
571  casa::Int antennaId_ ; // antenna id
572  casa::String antennaName_ ; // antenna name
573  casa::String stationName_ ; // station name
574  casa::Vector<casa::Quantity> antennaPosition_ ; // antenna position
575  casa::Vector<casa::uInt> configDescIdList_ ; // list of valid configDescriptionId
576  casa::Vector<casa::uInt> feedIdList_ ; // list of valid feedId
577  casa::Vector<casa::uInt> fieldIdList_ ; // list of fieldId
578  casa::Int row_ ; // current row index
579  map<asdm::Tag,casa::uInt> ifno_ ; // list of IFNO for each SpectralWindow rows
580  unsigned int numData_ ; // number of valid data in vmsData_ where v_antennaId equals antennaId_
581  vector<unsigned int> dataIdList_ ; // list of valid data indexes in vmsData_ 
582  vector<asdm::Tag> antennaPad_ ; // list of Station Tags for ANTENNA_PAD
583  vector<asdm::Tag> weatherStation_ ; // list of Station Tags for WEATHER_STATION
584  int weatherStationId_ ; // closest weather station for antennaId_
585  AtmPhaseCorrectionMod::AtmPhaseCorrection apc_ ; // ATM phase correction
586  EnumSet<CorrelationModeMod::CorrelationMode> corrMode_ ; // input correlation mode
587  EnumSet<TimeSamplingMod::TimeSampling> timeSampling_ ; // time sampling
588  EnumSet<SpectralResolutionTypeMod::SpectralResolutionType> resolutionType_ ; // spectral resolution type
589  casa::CountedPtr<casa::LogSinkInterface> logsink_ ; // Logger
590  casa::String className_ ;
591  unsigned int dataIndex_ ;
592
593  // Tables/Rows for ASDM
594  casa::Vector<asdm::MainRow *> mainRow_ ; // list of pointers to all Main rows
595  //asdm::AntennaRow *antennaRow_p ; // pointer to target Antenna row
596  //asdm::StationRow *stationRow_p ; // pointer to target Station row that target antenna is located
597  asdm::SpectralWindowRow *specWinRow_p ; // pointer to SpectralWindow row
598  asdm::PolarizationRow *polarizationRow_p ; // pointer to Polarization row
599  asdm::FieldRow *fieldRow_p ; // pointer to Field row
600
601  // Tags
602  asdm::Tag antennaTag_ ;
603  asdm::Tag specWinTag_ ;
604  asdm::Tag execBlockTag_ ;
605
606  // time
607  asdm::ArrayTimeInterval timeInterval_ ;
608} ;
609#endif // ASAP_OLD_ASDM_READER_H
Note: See TracBrowser for help on using the repository browser.