source: trunk/external-alma/atnf/PKSIO/NRODataset.h@ 2760

Last change on this file since 2760 was 2748, checked in by Takeshi Nakazato, 12 years ago

New Development: No

JIRA Issue: No

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...

POLNO is properly set according to RX name. When RX name ends with 'V'
or is 'H20ch2', POLNO will be set to 1. Otherwise, POLNO is 0.


File size: 14.9 KB
Line 
1//#---------------------------------------------------------------------------
2//# NRODataset.h: Base class for NRO dataset.
3//#---------------------------------------------------------------------------
4//# Copyright (C) 2000-2006
5//# Associated Universities, Inc. Washington DC, USA.
6//#
7//# This library is free software; you can redistribute it and/or modify it
8//# under the terms of the GNU Library General Public License as published by
9//# the Free Software Foundation; either version 2 of the License, or (at your
10//# option) any later version.
11//#
12//# This library is distributed in the hope that it will be useful, but WITHOUT
13//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
15//# License for more details.
16//#
17//# You should have received a copy of the GNU Library General Public License
18//# along with this library; if not, write to the Free Software Foundation,
19//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
20//#
21//# Correspondence concerning AIPS++ should be addressed as follows:
22//# Internet email: aips2-request@nrao.edu.
23//# Postal address: AIPS++ Project Office
24//# National Radio Astronomy Observatory
25//# 520 Edgemont Road
26//# Charlottesville, VA 22903-2475 USA
27//#
28//# $Id$
29//#---------------------------------------------------------------------------
30//# Original: 2009/02/27, Takeshi Nakazato, NAOJ
31//#---------------------------------------------------------------------------
32
33#ifndef NRO_DATASET_H
34#define NRO_DATASET_H
35
36#include <string>
37#include <stdio.h>
38#include <vector>
39#include <iostream>
40
41//#include <casa/aips.h>
42#include <casa/Logging/LogIO.h>
43#include <casa/Containers/Record.h>
44#include <atnf/PKSIO/NRODataRecord.h>
45#include <casa/namespace.h>
46#include <casa/iomanip.h>
47
48#define SCAN_HEADER_SIZE 424
49
50// <summary>
51// Base class for NRO accessor classes.
52// </summary>
53//
54// <prerequisite>
55// <li> <linkto class=NROReader>NROReader</linkto>
56// <li> <linkto class=NRODataRecord>NRODataRecord</linkto>
57// </prerequisite>
58//
59// <reviewed reviewer="" date="" tests="" demos="">
60// </reviewed>
61//
62// <etymology>
63// This class is a base class for classes that actually access data from NRO telescopes.
64// Concrete classes are defiened for each data type (OTF format or NRO FITS) and/or
65// telescopes (45m or ASTE).
66// The class have two filler method: fillHeader and fillRecord. The former reads header
67// information from the data. Since header data depends on the telescope and its configuration,
68// it is an abstract in this class and is defined in each concrete class.
69// On the other hand, the later reads each scan record (set of meta data
70// and spectral data). The method uses <linkto class=NRODataRecord>NRODataRecord</linkto>
71// to access scan record. It is implemented here since contents of scan record is
72// quite similar for several types of data.
73// </etymology>
74//
75// <synopsis>
76// Abstract class that is designed as a base class for all accessor classes.
77// </synopsis>
78//
79
80class NRODataset
81{
82 public:
83 // Constructor
84 NRODataset( std::string name ) ;
85
86 // Destructor
87 virtual ~NRODataset() ;
88
89 // Data initialization
90 virtual void initialize() ;
91
92 // open file
93 virtual int open() ;
94
95 // close file
96 virtual void close() ;
97
98 // Fill data header from file
99 virtual int fillHeader() = 0 ;
100
101 // Fill data record
102 virtual int fillRecord( int i ) ;
103
104 // simple getter
105 std::string getLOFIL() { return LOFIL ; } ;
106 std::string getVER() { return VER ; } ;
107 std::string getGROUP() { return GROUP ; } ;
108 std::string getPROJ() { return PROJ ; } ;
109 std::string getSCHED() { return SCHED ; } ;
110 std::string getOBSVR() { return OBSVR ; } ;
111 std::string getLOSTM() { return LOSTM ; } ;
112 std::string getLOETM() { return LOETM ; } ;
113 int getARYNM() { return ARYNM ; } ;
114 int getNSCAN() { return NSCAN ; } ;
115 std::string getTITLE() { return TITLE ; } ;
116 std::string getOBJ() { return OBJ ; } ;
117 std::string getEPOCH() { return EPOCH ; } ;
118 double getRA0() { return RA0 ; } ;
119 double getDEC0() { return DEC0 ; } ;
120 double getGLNG0() { return GLNG0 ; } ;
121 double getGLAT0() { return GLAT0 ; } ;
122 int getNCALB() { return NCALB ; } ;
123 int getSCNCD() { return SCNCD ; } ;
124 std::string getSCMOD() { return SCMOD ; } ;
125 double getURVEL() { return URVEL ; } ;
126 std::string getVREF() { return VREF ; } ;
127 std::string getVDEF() { return VDEF ; } ;
128 std::string getSWMOD() { return SWMOD ; } ;
129 double getFRQSW() { return FRQSW ; } ;
130 double getDBEAM() { return DBEAM ; } ;
131 double getMLTOF() { return MLTOF ; } ;
132 double getCMTQ() { return CMTQ ; } ;
133 double getCMTE() { return CMTE ; } ;
134 double getCMTSOM() { return CMTSOM ; } ;
135 double getCMTNODE() { return CMTNODE ; } ;
136 double getCMTI() { return CMTI ; } ;
137 std::string getCMTTM() { return CMTTM ; } ;
138 double getSBDX() { return SBDX ; } ;
139 double getSBDY() { return SBDY ; } ;
140 double getSBDZ1() { return SBDZ1 ; } ;
141 double getSBDZ2() { return SBDZ2 ; } ;
142 double getDAZP() { return DAZP ; } ;
143 double getDELP() { return DELP ; } ;
144 int getCHBIND() { return CHBIND ; } ;
145 int getNUMCH() { return NUMCH ; } ;
146 int getCHMIN() { return CHMIN ; } ;
147 int getCHMAX() { return CHMAX ; } ;
148 double getALCTM() { return ALCTM ; } ;
149 double getIPTIM() { return IPTIM ; } ;
150 double getPA() { return PA ; } ;
151 int getSCNLEN() { return SCNLEN ; } ;
152 int getSBIND() { return SBIND ; } ;
153 int getIBIT() { return IBIT ; } ;
154 std::string getSITE() { return SITE ; } ;
155 std::vector<std::string> getRX() { return RX ; } ;
156 std::vector<double> getHPBW() { return HPBW ; } ;
157 std::vector<double> getEFFA() { return EFFA ; } ;
158 std::vector<double> getEFFB() { return EFFB ; } ;
159 std::vector<double> getEFFL() { return EFFL ; } ;
160 std::vector<double> getEFSS() { return EFSS ; } ;
161 std::vector<double> getGAIN() { return GAIN ; } ;
162 std::vector<std::string> getHORN() { return HORN ; } ;
163 std::vector<std::string> getPOLTP() { return POLTP ; } ;
164 std::vector<double> getPOLDR() { return POLDR ; } ;
165 std::vector<double> getPOLAN() { return POLAN ; } ;
166 std::vector<double> getDFRQ() { return DFRQ ; } ;
167 std::vector<std::string> getSIDBD() { return SIDBD ; } ;
168 std::vector<int> getREFN() { return REFN ; } ;
169 std::vector<int> getIPINT() { return IPINT ; } ;
170 std::vector<int> getMULTN() { return MULTN ; } ;
171 std::vector<double> getMLTSCF() { return MLTSCF ; } ;
172 std::vector<std::string> getLAGWIND() { return LAGWIND ; } ;
173 std::vector<double> getBEBW() { return BEBW ; } ;
174 std::vector<double> getBERES() { return BERES ; } ;
175 std::vector<double> getCHWID() { return CHWID ; } ;
176 std::vector<int> getARRY() { return ARRY ; } ;
177 std::vector<int> getNFCAL() { return NFCAL ; } ;
178 std::vector<double> getF0CAL() { return F0CAL ; } ;
179 std::vector< std::vector<double> > getFQCAL() { return FQCAL ; } ;
180 std::vector< std::vector<double> > getCHCAL() { return CHCAL ; } ;
181 std::vector< std::vector<double> > getCWCAL() { return CWCAL ; } ;
182 std::string getCDMY1() { return CDMY1 ; } ;
183 std::vector<double> getDSBFC() { return DSBFC ;} ;
184 int getDataSize() { return datasize_ ; } ;
185 int getRowNum() { return rowNum_ ; } ;
186
187 // get various parameters
188 NRODataRecord *getRecord( int i ) ;
189 virtual std::vector< std::vector<double> > getSpectrum() ;
190 virtual std::vector<double> getSpectrum( int i ) ;
191 virtual int getIndex( int irow ) ;
192 virtual int getPolarizationNum() ;
193 virtual std::vector<double> getStartIntTime() ;
194 virtual double getStartIntTime( int i ) ;
195 virtual double getScanTime( int i ) ;
196 virtual double getMJD( char *time ) ;
197 virtual std::vector<bool> getIFs() ;
198 virtual std::vector<double> getFrequencies( int i ) ;
199 virtual uInt getArrayId( std::string type ) ;
200 virtual uInt getPolNo( int irow ) ;
201
202 protected:
203 // fill header information
204 virtual int fillHeader( int sameEndian ) = 0 ;
205
206 // Endian conversion for int variable
207 void convertEndian( int &value ) ;
208
209 // Endian convertion for float variable
210 void convertEndian( float &value ) ;
211
212 // Endian conversion for double variable
213 void convertEndian( double &value ) ;
214
215 // Endian conversion for NRODataRecord
216 void convertEndian( NRODataRecord *r ) ;
217
218 // Read char data
219 int readHeader( char *v, int size ) ;
220
221 // Read int data
222 int readHeader( int &v, int b ) ;
223
224 // Read float data
225 int readHeader( float &v, int b ) ;
226
227 // Read double data
228 int readHeader( double &v, int b ) ;
229
230 // Release DataRecord
231 void releaseRecord() ;
232
233 // show primary information
234 void show() ;
235
236 // convert frequency frame
237 virtual double toLSR( double v, double t, double x, double y ) ;
238
239 // POLNO from RX
240 //uInt polNoFromRX( const char *rx ) ;
241 uInt polNoFromRX( const std::string &rx ) ;
242
243 // Type of file record
244 std::string LOFIL ;
245
246 // Version
247 std::string VER ;
248
249 // Group name
250 std::string GROUP ;
251
252 // Project name
253 std::string PROJ ;
254
255 // Name of observation scheduling file
256 std::string SCHED ;
257
258 // Name of observer
259 std::string OBSVR ;
260
261 // Observation start time with format of "YYYYMMDDHHMMSS" (UTC)
262 std::string LOSTM ;
263
264 // observation end time with format of "YYYYMMDDHHMMSS" (UTC)
265 std::string LOETM ;
266
267 // Number of arrays (beams and IFs)
268 int ARYNM ;
269
270 // Number of scans
271 int NSCAN ;
272
273 // Title of observation
274 std::string TITLE ;
275
276 // Name of target object
277 std::string OBJ ;
278
279 // Equinox (B1950 or J2000)
280 std::string EPOCH ;
281
282 // Right ascension [rad]
283 double RA0 ;
284
285 // Declination [rad]
286 double DEC0 ;
287
288 // Galactic longitude [rad]
289 double GLNG0 ;
290
291 // Galactic latitude [rad]
292 double GLAT0 ;
293
294 // Calibration interval
295 int NCALB ;
296
297 // Scan coordinate (0: RADEC 1: LB 2: AZEL)
298 int SCNCD ;
299
300 // Scan sequence pattern
301 std::string SCMOD ;
302
303 // User-defined recessional velocity [m/s]
304 double URVEL ;
305
306 // Reference frame for recessional velocity (LSR or HEL or GAL)
307 std::string VREF ;
308
309 // Definition of recessional velocity (RAD or OPT)
310 std::string VDEF ;
311
312 // Switching mode (POS or BEAM or FREQ)
313 std::string SWMOD ;
314
315 // Switching frequency [Hz]
316 double FRQSW ;
317
318 // Off-beam angle of beam switching [rad]
319 double DBEAM ;
320
321 // Initial inclination angle of multi-beam array
322 double MLTOF ;
323
324 // Comet: Perihelion distance
325 double CMTQ ;
326
327 // Comet: Eccentricity
328 double CMTE ;
329
330 // Comet: Argument of perihelion
331 double CMTSOM ;
332
333 // Comet: Longitude of the ascending node
334 double CMTNODE ;
335
336 // Comet: Orbital inclination angle
337 double CMTI ;
338
339 // Comet: Time of the perihelion passage
340 std::string CMTTM ;
341
342 // Correction for position of subreflector DX [mm]
343 double SBDX ;
344
345 // Correction for position of subreflector DY [mm]
346 double SBDY ;
347
348 // Correction for position of subreflector DZ1 [mm]
349 double SBDZ1 ;
350
351 // Correction for position of subreflector DZ2 [mm]
352 double SBDZ2 ;
353
354 // Correction for pointing on azimuth [rad]
355 double DAZP ;
356
357 // Correction for pointing on elevation [rad]
358 double DELP ;
359
360 // Number of channel binding
361 int CHBIND ;
362
363 // Number of channel after binding
364 int NUMCH ;
365
366 // Channel range (minimum)
367 int CHMIN ;
368
369 // Channel range (maximum)
370 int CHMAX ;
371
372 // ALC time constant
373 double ALCTM ;
374
375 // Interval to get data from spectrometer
376 double IPTIM ;
377
378 // Position angle of the map
379 double PA ;
380
381 // Length of scan record [bytes]
382 int SCNLEN ;
383
384 // Range of space binding
385 int SBIND ;
386
387 // Quantization bit number (fixed to 12)
388 int IBIT ;
389
390 // Site (antenna) name (45m or ASTE)
391 std::string SITE ;
392
393 // Dummy data
394 std::string CDMY1 ;
395
396 // Type of detector frontend
397 std::vector<std::string> RX ;
398
399 // HPBW [rad]
400 std::vector<double> HPBW ;
401
402 // Aperture efficiencies
403 std::vector<double> EFFA ;
404
405 // Beam efficiencies
406 std::vector<double> EFFB ;
407
408 // Antenna efficiencies
409 std::vector<double> EFFL ;
410
411 // FSS efficiencies
412 std::vector<double> EFSS ;
413
414 // Antenna gain
415 std::vector<double> GAIN ;
416
417 // Type of polarization at feed horn (R or L or H or V)
418 std::vector<std::string> HORN ;
419
420 // Type of polarization (CIRC or LINR)
421 std::vector<std::string> POLTP ;
422
423 // Rotation direction of circular polarization
424 std::vector<double> POLDR ;
425
426 // Polarization angle of linear polarization
427 std::vector<double> POLAN ;
428
429 // Switching frequency of frequcency switching [Hz]
430 std::vector<double> DFRQ ;
431
432 // Type of sideband (LSB or USB or DSB)
433 std::vector<std::string> SIDBD ;
434
435 // Identifier of reference synthesizer
436 std::vector<int> REFN ;
437
438 // Temperature of calibrator
439 std::vector<int> IPINT ;
440
441 // Beam id of the multi-beam detector
442 std::vector<int> MULTN ;
443
444 // Scaling factor of the multi-beam detector
445 std::vector<double> MLTSCF ;
446
447 // Type of LAG window (NONE or HANN or HAMM or BLCK)
448 std::vector<std::string> LAGWIND ;
449
450 // Bandwidth at backend
451 std::vector<double> BEBW ;
452
453 // Spectral resolution at backend
454 std::vector<double> BERES ;
455
456 // Channel width at backend
457 std::vector<double> CHWID ;
458
459 // Array usage (1: used 0: not used)
460 std::vector<int> ARRY ;
461
462 // Frequency calibration: Number of measurement (max 10)
463 std::vector<int> NFCAL ;
464
465 // Frequency calibration: Central frequency [Hz]
466 std::vector<double> F0CAL ;
467
468 // Frequency calibration: Measured central frequency [Hz]
469 std::vector< std::vector<double> > FQCAL ;
470
471 // Frequency calibration: Measured channel number
472 std::vector< std::vector<double> > CHCAL ;
473
474 // Frequency calibration: Measured channel width [Hz]
475 std::vector< std::vector<double> > CWCAL ;
476
477 // DSB scaling factor
478 std::vector<double> DSBFC ;
479
480 // number of scan
481 int scanNum_ ;
482
483 // number of row
484 int rowNum_ ;
485
486 // length of scan (byte)
487 int scanLen_ ;
488
489 // length of spectral data (byte)
490 int dataLen_ ;
491
492 // Data size of the header [bytes]
493 int datasize_ ;
494
495 // maximum channel number
496 int chmax_ ;
497
498 // Current data id
499 int dataid_ ;
500
501 // Data record
502 NRODataRecord *record_ ;
503
504 // input filename
505 std::string filename_ ;
506
507 // file pointer
508 FILE *fp_ ;
509
510 // OS endian
511 int same_ ;
512
513 // Logger
514 //LogIO os ;
515
516 // reference frequency for each array
517 std::vector<double> refFreq_ ;
518
519 // record to store REFPIX, REFVAL, INCREMENT pair for each array
520 Record frec_ ;
521} ;
522
523// debug message output
524template<class T> inline void nro_debug_output( char *name, int len, std::vector<T> &val )
525{
526 for ( int i = 0 ; i < len ; i++ ) {
527 if ( i == 0 ) {
528 cout << setw(8) << left << name ;
529 }
530 else if ( ( i % 5 ) == 0 ) {
531 cout << endl << " " ;
532 }
533 cout << "\'" << val[i] << "\' " ;
534 }
535 cout << endl ;
536}
537
538template<class T> inline void nro_debug_output( char *name, int len1, int len2, std::vector< std::vector<T> > &val )
539{
540 for ( int i = 0 ; i < len1 ; i++ ) {
541 for ( int j = 0 ; j < len2 ; j++ ) {
542 if ( j == 0 ) {
543 if ( i < 10 )
544 cout << name << "0" << i << " " ;
545 else
546 cout << name << i << " " ;
547 }
548 else if ( ( j % 5 ) == 0 ) {
549 cout << endl << " " ;
550 }
551 cout << "\'" << val[i][j] << "\' " ;
552 }
553 cout << endl ;
554 }
555}
556
557
558#endif /* NRO_HEADER_H */
Note: See TracBrowser for help on using the repository browser.