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

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

New Development: Yes

JIRA Issue: Yes CAS-1913

Ready for Test: No

Interface Changes: Yes/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...

Prototype program asdm2ASAP that converts ASDM into Scantable directory.
Since top-level CMakeLists.txt is not yet updated, those codes will not
be built at the moment.

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