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

Last change on this file since 2285 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.