source: trunk/external-alma/asdm2ASAP/ASDMReader.h @ 2254

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

Simplified ASDMReader::getPointingInfo() by introducing private method
ASDMReader::pointingDir().


File size: 15.6 KB
Line 
1#ifndef ASAP_ASDM_READER_H
2#define ASAP_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 ASDMReader
14{
15public:
16  /**
17   * constructor
18   **/
19  ASDMReader() ;
20
21  /**
22   * destructor
23   **/
24  ~ASDMReader() ;
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_ASDM_READER_H
Note: See TracBrowser for help on using the repository browser.