source: trunk/external-alma/atnf/PKSIO/NROFITSDataset.cc @ 3110

Last change on this file since 3110 was 3110, checked in by Kana Sugimoto, 7 years ago

New Development: No

JIRA Issue: No

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Put in Release Notes: No

Module(s): sdsaveold

Description: A trivial fix to the handling of numField_ in NRO filler.

File size: 66.6 KB
Line 
1//#---------------------------------------------------------------------------
2//# NROFITSDataset.cc: Class for NRO 45m FITS 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#include <atnf/PKSIO/NROFITSDataset.h>
34#include <scimath/Mathematics/InterpolateArray1D.h>
35
36#include <iostream>
37#include <fstream>
38#include <casa/math.h>
39#include <casa/iomanip.h>
40
41using namespace std ;
42
43//header size (8*2880bytes)
44#define FITS_HEADER_SIZE 23040
45
46// constructor
47NROFITSDataset::NROFITSDataset( string name )
48  : NRODataset( name )
49{}
50
51// destructor
52NROFITSDataset::~NROFITSDataset()
53{
54  // close file
55  close() ;
56}
57
58// data initialization
59void NROFITSDataset::initialize()
60{
61  LogIO os( LogOrigin( "NROFITSDataset", "initialize()", WHERE ) ) ;
62
63  // open file
64  if ( open() )
65    os << LogIO::SEVERE << "error while opening file " << filename_ << LogIO::EXCEPTION ;
66
67  // field names, units, and sizes
68  numField_ = 0;
69  readHeader( numField_, "TFIELDS" ) ;
70  getField() ;
71
72  // check endian
73  // FITS file is always BIG_ENDIAN, but it is not true for NRO data
74  vector<int> itmp( 6 ) ;
75  if ( readTable( itmp, "LAVST", true, 0 ) != 0 ) {
76    os << LogIO::WARN << "Error while checking endian." << LogIO::POST ;
77    return ;
78  }
79//   os << "itmp = " << itmp[0] << " "
80//      << itmp[1] << " " << itmp[2] << " "
81//      << itmp[3] << " " << itmp[4] << " "
82//      << itmp[5] << LogIO::POST ;
83  // check endian by looking month value in LAVST (start time)
84  if ( itmp[1] > 0 && itmp[1] < 13 ) {
85    same_ = 1 ;
86    os << LogIO::NORMAL << "same endian " << LogIO::POST ;
87  }
88  else {
89    same_ = 0 ;
90    os << LogIO::NORMAL << "different endian " << LogIO::POST ;
91  }
92
93  // initialization
94  int status = 0 ;
95  status = readHeader( ARYNM, "ARYNM" ) ;
96  if ( status != 0 )
97    ARYNM = 1 ;
98  readHeader( rowNum_, "NAXIS2" ) ;
99  readHeader( scanLen_, "NAXIS1" ) ;
100  status = 0 ;
101  scanNum_ = rowNum_ / ARYNM ;
102  int nchan = 0 ;
103  if ( readTable( nchan, "NCH", same_ ) != 0 ) {
104    os << LogIO::WARN << "Error while checking maximum channel number." << LogIO::POST ;
105    return ;
106  }
107  chmax_ = nchan ;
108  datasize_ = sizeof( int ) * chmax_ ;
109  //record_->JDATA.resize( chmax_ ) ;
110  JDATA.resize( chmax_ ) ;
111  // zero clear
112  for ( uInt i = 0 ; i < JDATA.size() ; i++ )
113    JDATA[i] = 0 ;
114
115  RX.resize( ARYNM ) ;
116  HPBW.resize( ARYNM ) ;
117  EFFA.resize( ARYNM ) ;
118  EFFB.resize( ARYNM ) ;
119  EFFL.resize( ARYNM ) ;
120  EFSS.resize( ARYNM ) ;
121  GAIN.resize( ARYNM ) ;
122  HORN.resize( ARYNM ) ;
123  POLTP.resize( ARYNM ) ;
124  POLDR.resize( ARYNM ) ;
125  POLAN.resize( ARYNM ) ;
126  DFRQ.resize( ARYNM ) ;
127  SIDBD.resize( ARYNM ) ;
128  REFN.resize( ARYNM ) ;
129  IPINT.resize( ARYNM ) ;
130  MULTN.resize( ARYNM ) ;
131  MLTSCF.resize( ARYNM ) ;
132  LAGWIND.resize( ARYNM ) ;
133  BEBW.resize( ARYNM ) ;
134  BERES.resize( ARYNM ) ;
135  CHWID.resize( ARYNM ) ;
136  ARRY.resize( NRO_FITS_ARYMAX ) ; 
137  NFCAL.resize( ARYNM ) ;
138  F0CAL.resize( ARYNM ) ;
139  FQCAL.resize( ARYNM ) ;
140  CHCAL.resize( ARYNM ) ;
141  CWCAL.resize( ARYNM ) ;
142  DSBFC.resize( ARYNM ) ;
143
144  ARYTP.resize( ARYNM ) ;
145  arrayid_.resize( ARYNM ) ;
146  for ( int i = 0 ; i < ARYNM ; i++ )
147    arrayid_[i] = -1 ;
148
149  for ( int i = 0 ; i < ARYNM ; i++ ) {
150    FQCAL[i].resize( 10 ) ;
151    CHCAL[i].resize( 10 ) ;
152    CWCAL[i].resize( 10 ) ;
153  }
154
155  datasize_ += sizeof( char ) * ARYNM * 16 // RX
156    + sizeof( double ) * ARYNM * 6         // HPBW, EFFA, EFFB, EFFL, EFSS GAIN
157    + sizeof( char ) * ARYNM * 4           // HORN
158    + sizeof( char ) * ARYNM * 4           // POLTP
159    + sizeof( double ) * ARYNM * 3         // POLDR, POLAN, DFRQ
160    + sizeof( char ) * ARYNM * 4           // SIDBID
161    + sizeof( int ) * ARYNM * 3            // REFN, IPINT, MULTN
162    + sizeof( double ) * ARYNM             // MLTSCF
163    + sizeof( char ) * ARYNM * 8           // LAGWIND
164    + sizeof( double ) * ARYNM * 3         // BEBW, BERES, CHWID
165    + sizeof( int ) * NRO_FITS_ARYMAX      // ARRY
166    + sizeof( int ) * ARYNM                // NFCAL
167    + sizeof( double ) * ARYNM             // F0CAL
168    + sizeof( double ) * ARYNM * 10 * 3    // FQCAL, CHCAL, CWCAL
169    + sizeof( char ) * 180 ;               // CDMY1
170
171  refFreq_.resize( ARYNM, 0.0 ) ;
172
173  // NRODataRecord
174  record_ = new NRODataRecord() ;
175  record_->LDATA = NULL ;
176}
177
178int NROFITSDataset::fillHeader( int sameEndian )
179{
180  LogIO os( LogOrigin( "NROFITSDataset", "fillHeader()", WHERE ) ) ;
181
182  // fill array type
183  fillARYTP() ;
184
185  // read data header
186  float ftmp = 0.0 ;
187  if ( readHeader( LOFIL, "LOFIL" ) != 0 ) {
188    os << LogIO::NORMAL << "LOFIL set to 'FITS'." << LogIO::POST ;
189    LOFIL = "FITS" ;
190  }
191  // DEBUG
192  //cout << "LOFIL = \'" << LOFIL << "\'" << endl ;
193  //
194  if ( readHeader( VER, "VER" ) != 0 ) {
195    if ( readHeader( VER, "HISTORY NEWSTAR VER" ) != 0 ) {
196      os << LogIO::NORMAL << "VER set to 'V000'." << LogIO::POST ;
197      VER = "V000" ;
198    }
199  }
200  // DEBUG
201  //cout << "VER = \'" << VER << "\'" << endl ;
202  //
203  if ( readHeader( GROUP, "GROUP" ) != 0 ) {
204    if ( readHeader( GROUP, "HISTORY NEWSTAR GROUP" ) != 0 ) {
205      os << LogIO::NORMAL << "GROUP set to 'GRP0'." << LogIO::POST ;
206      GROUP = "GROUP0" ;
207    }
208  }
209  // DEBUG
210  //cout << "GROUP = \'" << GROUP << "\'" << endl ;
211  //
212  if ( readHeader( PROJ, "PROJECT" ) != 0 ) {
213    if ( readHeader( PROJ, "HISTORY NEWSTAR PROJECT" ) != 0 ) {
214      os << LogIO::NORMAL << "PROJ set to 'PROJ0'." << LogIO::POST ;
215      PROJ = "PROJECT0" ;
216    }
217  }
218  // DEBUG
219  //cout << "PROJ = \'" << PROJ << "\'" << endl ;
220  //
221  if ( readHeader( SCHED, "SCHED" ) != 0 ) {
222    if ( readHeader( SCHED, "HISTORY NEWSTAR SCHED" ) != 0 ) {
223      os << LogIO::NORMAL << "SCHED set to 'SCHED0'." << LogIO::POST ;
224      SCHED = "SCHED0" ;
225    }
226  }
227  // DEBUG
228  //cout << "SCHED = \'" << SCHED << "\'" << endl ;
229  //
230  if ( readHeader( OBSVR, "OBSERVER" ) != 0 ) {
231    os << LogIO::NORMAL << "OBSVR set to 'SOMEONE'" << LogIO::POST ;
232    OBSVR = "SOMEONE" ;
233  }
234  // DEBUG
235  //cout << "OBSVR = \'" << OBSVR << "\'" << endl ;
236  //
237  if ( readHeader( LOSTM, "STRSC" ) != 0 ) {
238    os << LogIO::WARN << "Error while reading data LOSTM." << LogIO::POST ;
239    return -1 ;
240  }
241  if ( LOSTM[0] == '9' ) {
242    LOSTM = "19" + LOSTM ;
243  }
244  else if ( LOSTM[0] == '0') {
245    LOSTM = "20" + LOSTM ;
246  }
247  // DEBUG
248  //cout << "LOSTM = \'" << LOSTM << "\'" << endl ;
249  //
250  if ( readHeader( LOETM, "STPSC" ) != 0 ) {
251    os << LogIO::WARN << "Error while reading data LOETM." << LogIO::POST ;
252    return -1 ;
253  }
254  if ( LOETM[0] == '9' ) {
255    LOETM = "19" + LOETM ;
256  }
257  else if ( LOETM[0] == '0') {
258    LOETM = "20" + LOETM ;
259  }   
260  // DEBUG
261  //cout << "LOETM = \'" << LOETM << "\'" << endl ;
262  //
263  if ( readHeader( NSCAN, "NAXIS2" ) != 0 ) {
264    os << LogIO::WARN << "Error while reading data NSCAN." << LogIO::POST ;
265    return -1 ;
266  }
267  // DEBUG
268  //cout << "NSCAN = " << NSCAN << endl ;
269  //
270  string subt ;
271  if ( readHeader( TITLE, "TITLE" ) != 0 ) {
272    int stat1 = readHeader( TITLE, "HISTORY NEWSTAR TITLE1" ) ;
273    int stat2 = readHeader( subt, "HISTORY NEWSTAR TITLE2" ) ;
274    if ( stat1 != 0 && stat2 != 0 ) {
275      os << LogIO::NORMAL << "TITLE set to 'NOTITLE'." << LogIO::POST ;
276      TITLE = "NOTITLE" ;
277    }
278    else {
279      //cout << "TITLE = \'" << TITLE << "\'" << endl ;
280      //cout << "subt  = \'" << subt << "\'" << endl ;
281      TITLE = TITLE + subt ;
282    }
283  }
284  // DEBUG
285  //cout << "TITLE = \'" << TITLE << "\'" << endl ;
286  //
287  if ( readHeader( OBJ, "OBJECT" ) != 0 ) {
288    os << LogIO::NORMAL << "OBJ set to 'SOMEWHERE'." << LogIO::POST ;
289    OBJ = "NOOBJ" ;
290  }
291  // DEBUG
292  //cout << "OBJ = \'" << OBJ << "\'" << endl ;
293  //
294  if ( readHeader( ftmp, "EPOCH" ) != 0 ) {
295    os << LogIO::WARN << "Error while reading data EPOCH." << LogIO::POST ;
296    return -1 ;
297  }
298  if ( ftmp == 1950.0 )
299    EPOCH = "B1950" ;
300  else if ( ftmp == 2000.0 )
301    EPOCH = "J2000" ;
302  else {
303    os << LogIO::WARN << "Unidentified epoch. set to 'XXXXX'" << LogIO::POST ;
304    EPOCH = "XXXXX" ;
305  }
306  // DEBUG
307  //cout << "EPOCH = \'" << EPOCH << "\'" << endl ;
308  //
309  string stmp ;
310  if ( readHeader( stmp, "RA" ) != 0 ) {
311    os << LogIO::WARN << "Error while reading data RA0." << LogIO::POST ;
312    return -1 ;
313  }
314  RA0 = radRA( stmp.c_str() ) ;
315  // DEBUG
316  //cout << "RA0 = " << RA0 << endl ;
317  //
318  if ( readHeader( stmp, "DEC" ) != 0 ) {
319    os << LogIO::WARN << "Error while reading data DEC0." << LogIO::POST ;
320    return -1 ;
321  }
322  DEC0 = radDEC( stmp.c_str() ) ;
323  // DEBUG
324  //cout << "DEC0 = " << DEC0 << endl ;
325  //
326  if ( readHeader( GLNG0, "GL0" ) != 0 ) {
327    os << LogIO::WARN << "Error while reading data GLNG0." << LogIO::POST ;
328    return -1 ;
329  }
330  // DEBUG
331  //cout << "GLNG0 = " << GLNG0 << endl ;
332  //
333  if ( readHeader( GLAT0, "GB0" ) != 0 ) {
334    os << LogIO::WARN << "Error while reading data GLAT0." << LogIO::POST ;
335    return -1 ;
336  }
337  // DEBUG
338  //cout << "GLAT0 = " << GLAT0 << endl ;
339  //
340  if ( readHeader( NCALB, "NCALB" ) != 0 ) {
341    os << LogIO::WARN << "Error while reading data NCALB." << LogIO::POST ;
342    return -1 ;
343  }
344  // DEBUG
345  //cout << "NCALB = " << NCALB << endl ;
346  //
347  if ( readHeader( SCNCD, "SCNCD" ) != 0 ) {
348    os << LogIO::NORMAL << "SCNCD set to 0 (RADEC)." << LogIO::POST ;
349    SCNCD = 0 ;
350  }
351  // DEBUG
352  //cout << "SCNCD = " << SCNCD << endl ;
353  //
354  if ( readHeader( SCMOD, "SCMOD1" ) != 0 ) {
355    os << LogIO::WARN << "Error while reading data SCMOD." << LogIO::POST ;
356    return -1 ;
357  }
358  string::size_type pos = SCMOD.find( ' ' ) ;
359  if ( pos != string::npos ) {
360    SCMOD = SCMOD.substr( 0, pos ) ;
361    SCMOD = SCMOD + " " ;
362  }
363  //cout << "SDMOD1 = \'" << SCMOD << "\'" << endl ;
364  if ( readHeader( stmp, "SCMOD2" ) == 0 && stmp.compare( 0, 1, " " ) != 0 ) {
365    if ( ( pos = stmp.find( ' ' ) ) != string::npos )
366      stmp = stmp.substr( 0, pos ) ;
367    SCMOD = SCMOD + stmp + " " ;
368    //cout << "SCMOD2 = \'" << SCMOD << "\'" << endl ;
369  }
370  if ( readHeader( stmp, "SCMOD3" ) == 0 && stmp.compare( 0, 1, " " ) != 0 ) {
371    if ( ( pos = stmp.find( ' ' ) ) != string::npos )
372      stmp = stmp.substr( 0, pos ) ;
373    SCMOD = SCMOD + stmp + " " ;
374    //cout << "SCMOD3 = \'" << SCMOD << "\'" << endl ;
375  }
376  if ( readHeader( stmp, "SCMOD4" ) == 0 && stmp.compare( 0, 1, " " ) != 0 ) {
377    if ( ( pos = stmp.find( ' ' ) ) != string::npos )
378      stmp = stmp.substr( 0, pos ) ;
379    SCMOD = SCMOD + stmp + " " ;
380    //cout << "SCMOD4 = \'" << SCMOD << "\'" << endl ;
381  }
382  if ( readHeader( stmp, "SCMOD5" ) == 0 && stmp.compare( 0, 1, " " ) != 0 ) {
383    if ( ( pos = stmp.find( ' ' ) ) != string::npos )
384      stmp = stmp.substr( 0, pos ) ;
385    SCMOD = SCMOD + stmp + " " ;
386    //cout << "SCMOD5 = \'" << SCMOD << "\'" << endl ;
387  }
388  if ( readHeader( stmp, "SCMOD6" ) == 0 && stmp.compare( 0, 1, " " ) != 0 ) {
389    if ( ( pos = stmp.find( ' ' ) ) != string::npos )
390      stmp = stmp.substr( 0, pos ) ;
391    SCMOD = SCMOD + stmp + " " ;
392    //cout << "SCMOD6 = \'" << SCMOD << "\'" << endl ;
393  }
394  // DEBUG
395  //cout << "SCMOD = \'" << SCMOD << "\'" << endl ;
396  //
397  if ( readHeader( URVEL, "VEL" ) != 0 ) {
398    os << LogIO::WARN << "Error while reading data URVEL." << LogIO::POST ;
399    return -1 ;
400  }
401  // DEBUG
402  //cout << "URVEL = " << URVEL << endl ;
403  //
404  if ( readHeader( VREF, "VREF" ) != 0 ) {
405    os << LogIO::WARN << "Error while reading data VREF." << LogIO::POST ;
406    return -1 ;
407  }
408  // DEBUG
409  //cout << "VREF = \'" << VREF << "\'" << endl ;
410  //
411  if ( readHeader( VDEF, "VDEF" ) != 0 ) {
412    os << LogIO::WARN << "Error while reading data VDEF." << LogIO::POST ;
413    return -1 ;
414  }
415  // DEBUG
416  //cout << "VDEF = \'" << VDEF << "\'" << endl ;
417  //
418  if ( readHeader( SWMOD, "SWMOD" ) != 0 ) {
419    os << LogIO::WARN << "Error while reading data SWMOD." << LogIO::POST ;
420    return -1 ;
421  }
422  // DEBUG
423  //cout << "SWMOD = \'" << SWMOD << "\'" << endl ;
424  //
425  if ( readHeader( FRQSW, "FRQSW" ) != 0 ) {
426    os << LogIO::NORMAL << "FRQSW set to 0." << LogIO::POST ;
427    FRQSW = 0.0 ;
428  }
429  // DEBUG
430  //cout << "FRQSW = " << FRQSW << endl ;
431  //
432  if ( readHeader( DBEAM, "DBEAM" ) != 0 ) {
433    os << LogIO::WARN << "Error while reading data DBEAM." << LogIO::POST ;
434    return -1 ;
435  }
436  // DEBUG
437  //cout << "DBEAM = " << DBEAM << endl ;
438  //
439  if ( readHeader( MLTOF, "MLTOF" ) != 0 ) {
440    os << LogIO::NORMAL << "MLTOF set to 0." << LogIO::POST ;
441    MLTOF = 0.0 ;
442  }
443  // DEBUG
444  //cout << "MLTOF = " << MLTOF << endl ;
445  //
446  if ( readHeader( CMTQ, "CMTQ" ) != 0 ) {
447    os << LogIO::WARN << "Error while reading data CMTQ." << LogIO::POST ;
448    return -1 ;
449  }
450  // DEBUG
451  //cout << "CMTQ = " << CMTQ << endl ;
452  //
453  if ( readHeader( CMTE, "CMTE" ) != 0 ) {
454    os << LogIO::WARN << "Error while reading data CMTE." << LogIO::POST ;
455    return -1 ;
456  }
457  // DEBUG
458  //cout << "CMTE = " << CMTE << endl ;
459  //
460  if ( readHeader( CMTSOM, "CMTSOM" ) != 0 ) {
461    os << LogIO::WARN << "Error while reading data CMTSOM." << LogIO::POST ;
462    return -1 ;
463  }
464  // DEBUG
465  //cout << "CMTSOM = " << CMTSOM << endl ;
466  //
467  if ( readHeader( CMTNODE, "CMTNODE" ) != 0 ) {
468    os << LogIO::WARN << "Error while reading data CMTNODE." << LogIO::POST ;
469    return -1 ;
470  }
471  // DEBUG
472  //cout << "CMTNODE = " << CMTNODE << endl ;
473  //
474  if ( readHeader( CMTI, "CMTI" ) != 0 ) {
475    os << LogIO::WARN << "Error while reading data CMTI." << LogIO::POST ;
476    return -1 ;
477  }
478  // DEBUG
479  //cout << "CMTI = " << CMTI << endl ;
480  //
481  if ( readHeader( CMTTM, "CMTTM" ) != 0 ) {
482    os << LogIO::WARN << "Error while reading data CMTTM." << LogIO::POST ;
483    return -1 ;
484  }
485  // DEBUG
486  //cout << "CMTTM = \'" << CMTTM << "\'" << endl ;
487  //
488  if ( readHeader( SBDX, "SDBX" ) != 0 ) {
489    os << LogIO::WARN << "Error while reading data SBDX." << LogIO::POST ;
490    return -1 ;
491  }
492  // DEBUG
493  //cout << "SBDX = " << SBDX << endl ;
494  //
495  if ( readHeader( SBDY, "SDBY" ) != 0 ) {
496    os << LogIO::WARN << "Error while reading data SBDY." << LogIO::POST ;
497    return -1 ;
498  }
499  // DEBUG
500  //cout << "SBDY = " << SBDY << endl ;
501  //
502  if ( readHeader( SBDZ1, "SDBZ1" ) != 0 ) {
503    os << LogIO::WARN << "Error while reading data SBDZ1." << LogIO::POST ;
504    return -1 ;
505  }
506  // DEBUG
507  //cout << "SBDZ1 = " << SBDZ1 << endl ;
508  //
509  if ( readHeader( SBDZ2, "SDBZ2" ) != 0 ) {
510    os << LogIO::WARN << "Error while reading data SBDZ2." << LogIO::POST ;
511    return -1 ;
512  }
513  // DEBUG
514  //cout << "SBDZ2 = " << SBDZ2 << endl ;
515  //
516  if ( readHeader( DAZP, "DAZP" ) != 0 ) {
517    os << LogIO::NORMAL << "DAZP set to 0." << LogIO::POST ;
518    DAZP = 0.0 ;
519  }
520  // DEBUG
521  //cout << "DAZP = " << DAZP << endl ;
522  //
523  if ( readHeader( DELP, "DELP" ) != 0 ) {
524    os << LogIO::NORMAL << "DELP set to 0." << LogIO::POST ;
525    DELP = 0.0 ;
526  }
527  // DEBUG
528  //cout << "DELP = " << DELP << endl ;
529  //
530  if ( readHeader( CHBIND, "CHBIND" ) != 0 ) {
531    os << LogIO::NORMAL << "CHBIND set to 1." << LogIO::POST ;
532    CHBIND = 1 ;
533  }
534  // DEBUG
535  //cout << "CHBIND = " << CHBIND << endl ;
536  //
537  if ( readHeader( NUMCH, "NCH" ) != 0 ) {
538    if ( readTable( NUMCH, "NCH", sameEndian ) != 0 ) {
539      os << LogIO::NORMAL << "NUMCH set to " << chmax_ << "." << LogIO::POST ;
540      NUMCH = chmax_ ;
541    }
542  }
543  // DEBUG
544  //cout << "NUMCH = " << NUMCH << endl ;
545  //
546  if ( readHeader( CHMIN, "CHMIN" ) != 0 ) {
547    os << LogIO::NORMAL << "CHMIN set to 1." << LogIO::POST ;
548    CHMIN = 1 ;
549  }
550  // DEBUG
551  //cout << "CHMIN = " << CHMIN << endl ;
552  //
553  if ( readHeader( CHMAX, "CHMAX" ) != 0 ) {
554    os << LogIO::NORMAL << "CHMAX set to " << chmax_ << "." << LogIO::POST ;
555    CHMAX = chmax_ ;
556  }
557  // DEBUG
558  //cout << "CHMAX = " << CHMAX << endl ;
559  //
560  if ( readHeader( ALCTM, "ALCTM" ) != 0 ) {
561    if ( readTable( ALCTM, "ALCTM", sameEndian ) != 0 ) {
562      os << LogIO::WARN << "Error while reading data ALCTM." << LogIO::POST ;
563      return -1 ;
564    }
565  }
566  // DEBUG
567  //cout << "ALCTM = " << ALCTM << endl ;
568  //
569  int itmp ;
570  if ( readHeader( itmp, "INTEG" ) != 0 ) {
571    if ( readTable( itmp, "INTEG", sameEndian ) != 0 ) {
572      os << LogIO::WARN << "Error while reading data IPTIM." << LogIO::POST ;
573      return -1 ;
574    }
575  }
576  IPTIM = (double)itmp ;
577  // DEBUG
578  //cout << "IPTIM = " << IPTIM << endl ;
579  //
580  if ( readHeader( PA, "PA" ) != 0 ) {
581    if ( readTable( PA, "PA", sameEndian ) != 0 ) {
582      os << LogIO::WARN << "Error while reading data PA." << LogIO::POST ;
583      return -1 ;
584    }
585  }
586  // DEBUG
587  //cout << "PA = " << PA << endl ;
588  //
589
590  // find data index for each ARYTP
591  findData() ;
592  vector<char *> v( ARYNM ) ;
593  if ( readColumn( RX, "RX" ) != 0 ) {
594    os << LogIO::WARN << "Error while reading data RX." << LogIO::POST ;
595    return -1 ;
596  }
597  // DEBUG
598  //nro_debug_output( "RX", ARYNM, RX ) ;
599  //
600  if ( readColumn( HPBW, "HPBW", sameEndian ) != 0 ) {
601    os << LogIO::WARN << "Error while reading data HPBW." << LogIO::POST ;
602    return -1 ;
603  }
604  // DEBUG
605//   nro_debug_output( "HPBW", ARYNM, HPBW ) ;
606  //
607  if ( readColumn( EFFA, "EFFA", sameEndian ) != 0 ) {
608    os << LogIO::WARN << "Error while reading data EFFA." << LogIO::POST ;
609    return -1 ;
610  }
611  // DEBUG
612//   nro_debug_output( "EFFA", ARYNM, EFFA ) ;
613  //
614  if ( readColumn( EFFB, "EFFB", sameEndian ) != 0 ) {
615    os << LogIO::WARN << "Error while reading data EFFB." << LogIO::POST ;
616    return -1 ;
617  }
618  // DEBUG
619//   nro_debug_output( "EFFB", ARYNM, EFFB ) ;
620  //
621  if ( readColumn( EFFL, "EFFL", sameEndian ) != 0 ) {
622    os << LogIO::WARN << "Error while reading data EFFL." << LogIO::POST ;
623    return -1 ;
624  }
625  // DEBUG
626//   nro_debug_output( "EFFL", ARYNM, EFFL ) ;
627  //
628  if ( readColumn( EFSS, "EFSS", sameEndian ) != 0 ) {
629    os << LogIO::WARN << "Error while reading data EFSS." << LogIO::POST ;
630    return -1 ;
631  }
632  // DEBUG
633//   nro_debug_output( "EFSS", ARYNM, EFSS ) ;
634  //
635  if ( readColumn( GAIN, "GAIN", sameEndian ) != 0 ) {
636    os << LogIO::WARN << "Error while reading data GAIN." << LogIO::POST ;
637    return -1 ;
638  }
639  // DEBUG
640//   nro_debug_output( "GAIN", ARYNM, GAIN ) ;
641  //
642  if ( readColumn( HORN, "HORN" ) != 0 ) {
643    os << LogIO::WARN << "Error while reading data HORN." << LogIO::POST ;
644    return -1 ;
645  }
646  // DEBUG
647//   nro_debug_output( "HORN", ARYNM, HORN ) ;
648  //
649  if ( readColumn( POLTP, "POLTP" ) != 0 ) {
650    os << LogIO::WARN << "Error while reading data POLTP." << LogIO::POST ;
651    return -1 ;
652  }
653  // DEBUG
654//   nro_debug_output( "POLTP", ARYNM, POLTP ) ;
655  //
656  vector<int> ipoldr( ARYNM, 0 ) ;
657  if ( readColumn( ipoldr, "POLDR", sameEndian ) != 0 ) {
658    os << LogIO::WARN << "Error while reading data POLDR." << LogIO::POST ;
659    return -1 ;
660  }
661  for ( int i = 0 ; i < ARYNM ; i++ )
662    POLDR[i] = (double)ipoldr[i] ;
663  // DEBUG
664//   nro_debug_output( "POLDR", ARYNM, POLDR ) ;
665  //
666  if ( readColumn( POLAN, "POLAN", sameEndian ) != 0 ) {
667    os << LogIO::WARN << "Error while reading data POLAN." << LogIO::POST ;
668    return -1 ;
669  }
670  // DEBUG
671//   nro_debug_output( "POLAN", ARYNM, POLAN ) ;
672  //
673  if ( readColumn( DFRQ, "DFRQ", sameEndian ) != 0 ) {
674    os << LogIO::WARN << "Error while reading data DFRQ." << LogIO::POST ;
675    return -1 ;
676  }
677  // DEBUG
678//   nro_debug_output( "DFRQ", ARYNM, DFRQ ) ;
679  //
680  if ( readColumn( SIDBD, "SIDBD" ) != 0 ) {
681    os << LogIO::WARN << "Error while reading data SIDBD." << LogIO::POST ;
682    return -1 ;
683  }
684  // DEBUG
685//   nro_debug_output( "SIDBD", ARYNM, SIDBD ) ;
686  //
687  if ( readColumn( REFN, "REFN", sameEndian ) != 0 ) {
688    os << LogIO::WARN << "Error while reading data REFN." << LogIO::POST ;
689    return -1 ;
690  }
691  // DEBUG
692//   nro_debug_output( "REFN", ARYNM, REFN ) ;
693  //
694  if ( readColumn( IPINT, "IPINT", sameEndian ) != 0 ) {
695    os << LogIO::WARN << "Error while reading data IPINT." << LogIO::POST ;
696    return -1 ;
697  }
698  // DEBUG
699//   nro_debug_output( "IPINT", ARYNM, IPINT ) ;
700  //
701  if ( readColumn( MULTN, "MULTN", sameEndian ) != 0 ) {
702    os << LogIO::WARN << "Error while reading data MULTN." << LogIO::POST ;
703    return -1 ;
704  }
705  // DEBUG
706//   nro_debug_output( "MULTN", ARYNM, MULTN ) ;
707  //
708  if ( readColumn( MLTSCF, "MLTSCF", sameEndian ) != 0 ) {
709    os << LogIO::WARN << "Error while reading data MLTSCF." << LogIO::POST ;
710    return -1 ;
711  }
712  // DEBUG
713//   nro_debug_output( "MLTSCF", ARYNM, MLTSCF ) ;
714  //
715  if ( readColumn( LAGWIND, "LAGWIN" ) != 0 ) {
716    os << LogIO::WARN << "Error while reading data LAGWIND." << LogIO::POST ;
717    return -1 ;
718  }
719  // DEBUG
720//   nro_debug_output( "LAGWIND", ARYNM, LAGWIND ) ;
721  //
722  if ( readColumn( BEBW, "BEBW", sameEndian ) != 0 ) {
723    os << LogIO::WARN << "Error while reading data BEBW." << LogIO::POST ;
724    return -1 ;
725  }
726  // DEBUG
727//   nro_debug_output( "BEBW", ARYNM, BEBW ) ;
728  //
729  if ( readColumn( BERES, "BERES", sameEndian ) != 0 ) {
730    os << LogIO::WARN << "Error while reading data BERES." << LogIO::POST ;
731    return -1 ;
732  }
733  // DEBUG
734//   nro_debug_output( "BERES", ARYNM, BERES ) ;
735  //
736  if ( readColumn( CHWID, "CHWID", sameEndian ) != 0 ) {
737    os << LogIO::WARN << "Error while reading data CHWID." << LogIO::POST ;
738    return -1 ;
739  }
740  // DEBUG
741//   nro_debug_output( "CHWID", ARYNM, CHWID ) ;
742  //
743  if ( readARRY() != 0 ) {
744    os << LogIO::WARN << "Error while reading data ARRY." << LogIO::POST ;
745    return -1 ;
746  }
747  // DEBUG
748//   nro_debug_output( "ARRY", NRO_FITS_ARYMAX, ARRY ) ;
749  //
750  if ( readColumn( NFCAL, "NFCAL", sameEndian ) != 0 ) {
751    os << LogIO::WARN << "Error while reading data NFCAL." << LogIO::POST ;
752    return -1 ;
753  }
754  // DEBUG
755//   nro_debug_output( "NFCAL", ARYNM, NFCAL ) ;
756  //
757  if ( readColumn( F0CAL, "F0CAL", sameEndian ) != 0 ) {
758    os << LogIO::WARN << "Error while reading data F0CAL." << LogIO::POST ;
759    return -1 ;
760  }
761  // DEBUG
762//   nro_debug_output( "F0CAL", ARYNM, F0CAL ) ;
763  //
764  for ( int i= 0 ; i < 10 ; i++) {
765    vector<double> vv( ARYNM, 0 ) ;
766    if ( readColumn( vv, "FQCAL", sameEndian, i ) != 0 ) {
767      os << LogIO::WARN << "Error while reading data FQCAL." << LogIO::POST ;
768      return -1 ;
769    }
770    for ( int j = 0 ; j < ARYNM ; j++ ) {
771      FQCAL[j][i] = vv[j] ;
772    }
773  }
774  // DEBUG
775//   nro_debug_output( "FQCAL", ARYNM, 10, FQCAL ) ;
776  //
777  for ( int i= 0 ; i < 10 ; i++) {
778    vector<double> vv( ARYNM, 0 ) ;
779    if ( readColumn( vv, "CHCAL", sameEndian, i ) != 0 ) {
780      os << LogIO::WARN << "Error while reading data CHCAL." << LogIO::POST ;
781      return -1 ;
782    }
783    for ( int j = 0 ; j < ARYNM ; j++ ) {
784      CHCAL[j][i] = vv[j] ;
785    }
786  }
787  // DEBUG
788//   nro_debug_output( "CHCAL", ARYNM, 10, CHCAL ) ;
789  //
790  for ( int i= 0 ; i < 10 ; i++) {
791    vector<double> vv( ARYNM, 0 ) ;
792    if ( readColumn( vv, "CWCAL", sameEndian, i ) != 0 ) {
793      os << LogIO::WARN << "Error while reading data CWCAL." << LogIO::POST ;
794      return -1 ;
795    }
796    for ( int j = 0 ; j < ARYNM ; j++ ) {
797      CWCAL[j][i] = vv[j] ;
798    }
799  }
800  // DEBUG
801//   nro_debug_output( "CWCAL", ARYNM, 10, CWCAL ) ;
802  //
803  if ( readHeader( SCNLEN, "NAXIS1" ) != 0 ) {
804    os << LogIO::WARN << "Error while reading data SCNLEN." << LogIO::POST ;
805    return -1 ;
806  }
807  // DEBUG
808  //cout << "SCNLEN = " << SCNLEN << endl ;
809  //
810  if ( readHeader( SBIND, "SBIND" ) != 0 ) {
811    os << LogIO::NORMAL << "SBIND set to 0." << LogIO::POST ;
812    SBIND = 0 ;
813  }
814  // DEBUG
815  //cout << "SBIND = " << SBIND << endl ;
816  //
817  if ( readHeader( IBIT, "IBIT" ) != 0 ) {
818    os << LogIO::NORMAL << "IBIT set to 8." << LogIO::POST ;
819    IBIT = 8 ;  // 8 bit? 12 bit?
820  }
821  // DEBUG
822  //cout << "IBIT = " << IBIT << endl ;
823  //
824  if ( readHeader( SITE, "TELESCOP" ) != 0 ) {
825    os << LogIO::WARN << "Error while reading data SITE." << LogIO::POST ;
826    return -1 ;
827  }
828  // DEBUG
829  //cout << "SITE = \'" << SITE << "\'" << endl ;
830  //
831  if ( readColumn( DSBFC, "DSBFC", sameEndian ) != 0 ) {
832    os << LogIO::NORMAL << "All DSBFC elements set to 1." << LogIO::POST ;
833    for ( int i = 0 ; i < ARYNM ; i++ )
834      DSBFC[i] = 1.0 ;
835  }
836  // DEBUG
837//   nro_debug_output( "DSBFC", ARYNM, DSBFC ) ;
838  //
839
840  return 0 ;
841}
842
843int NROFITSDataset::fillRecord( int i )
844{
845  LogIO os( LogOrigin( "NROFITSDataset", "fillRecord()", WHERE ) ) ;
846
847  int status = 0 ;
848  string str4( 4, ' ' ) ;
849  string str8( 8, ' ' ) ;
850  string str24( 24, ' ' ) ;
851
852  for (unsigned int ii = 0u; ii < 4u; ++ii) {
853    record_->LSFIL[ii] = ' ';
854  }
855  status = readTable( record_->LSFIL, "LSFIL", 4, i ) ;
856  if ( status ) {
857    os << LogIO::WARN << "Error while reading LSFIL." << LogIO::POST ;
858    return status ;
859  }
860  // DEBUG
861  //cout << "LSFIL(" << i << ") = " << record_->LSFIL << endl ;
862  //
863  status = readTable( record_->ISCAN, "ISCN", same_, i ) ;
864  if ( status ) {
865    os << LogIO::WARN << "Error while reading ISCAN." << LogIO::POST ;
866    return status ;
867  }
868  // DEBUG
869  //cout << "ISCAN(" << i << ") = " << record_->ISCAN << endl ;
870  //
871  vector<int> itmp( 6, 0 ) ;
872  status = readTable( itmp, "LAVST", same_, i ) ;
873  if ( status ) {
874    os << LogIO::WARN << "Error while reading LAVST." << LogIO::POST ;
875    return status ;
876  }
877  else {
878    sprintf( record_->LAVST, "%4d%02d%02d%02d%02d%02d.000", itmp[0], itmp[1], itmp[2], itmp[3], itmp[4], itmp[5] ) ;
879  }
880  // DEBUG
881  //cout << "LAVST(" << i << ") = " << record_->LAVST << endl ;
882  //
883  for (unsigned int ii = 0u; ii < 8u; ++ii) {
884    record_->SCANTP[ii] = ' ';
885  }
886    status = readTable( record_->SCANTP, "SCNTP", strlen(record_->SCANTP), i ) ;
887  if ( status ) {
888    os << LogIO::WARN << "Error while reading SCANTP." << LogIO::POST ;
889    return status ;
890  }
891  // DEBUG
892  //cout << "SCANTP(" << i << ") = " << record_->SCANTP << endl ;
893  //
894  const char *name1 = "" ;
895  const char *name2 = "" ;
896  if ( SCNCD == 0 ) {
897    name1 = "DRA" ;
898    name2 = "DDEC" ;
899  }
900  else if ( SCNCD == 1 ) {
901    name1 = "DGL" ;
902    name2 = "DGB" ;
903  }
904  else {
905    name1 = "DAZ" ;
906    name2 = "DEL" ;
907  }
908  status = readTable( record_->DSCX, name1, same_, i ) ;
909  if ( status ) {
910    os << LogIO::WARN << "Error while reading DSCX." << LogIO::POST ;
911    return status ;
912  }
913  // DEBUG
914  //cout << "DSCX(" << i << ") = " << record_->DSCX << endl ;
915  //
916  status = readTable( record_->DSCY, name2, same_, i ) ;
917  if ( status ) {
918    os << LogIO::WARN << "Error while reading DSCY." << LogIO::POST ;
919    return status ;
920  }
921  // DEBUG
922  //cout << "DSCY(" << i << ") = " << record_->DSCY << endl ;
923  //
924  if ( SCNCD == 0 ) {
925    name1 = "RA" ;
926    name2 = "DEC" ;
927  }
928  else if ( SCNCD == 1 ) {
929    name1 = "GL" ;
930    name2 = "GB" ;
931  }
932  else {
933    name1 = "AZ" ;
934    name2 = "EL" ;
935  }
936  status = readTable( record_->SCX, name1, same_, i ) ;
937  if ( status ) {
938    os << LogIO::WARN << "Error while reading SCX." << LogIO::POST ;
939    return status ;
940  }
941  // DEBUG
942  //cout << "SCX(" << i << ") = " << record_->SCX << endl ;
943  //
944  status = readTable( record_->SCY, name2, same_, i ) ;
945  if ( status ) {
946    os << LogIO::WARN << "Error while reading SCY." << LogIO::POST ;
947    return status ;
948  }
949  // DEBUG
950  //cout << "SCY(" << i << ") = " << record_->SCY << endl ;
951  //
952  status = readTable( record_->PAZ, "PAZ", same_, i ) ;
953  if ( status ) {
954    os << LogIO::WARN << "Error while reading PAZ." << LogIO::POST ;
955    return status ;
956  }
957  // DEBUG
958  //cout << "PAZ(" << i << ") = " << record_->PAZ << endl ;
959  //
960  status = readTable( record_->PEL, "PEL", same_, i ) ;
961  if ( status ) {
962    os << LogIO::WARN << "Error while reading PEL." << LogIO::POST ;
963    return status ;
964  }
965  // DEBUG
966  //cout << "PEL(" << i << ") = " << record_->PEL << endl ;
967  //
968  status = readTable( record_->RAZ, "RAZ", same_, i ) ;
969  if ( status ) {
970    os << LogIO::WARN << "Error while reading RAZ." << LogIO::POST ;
971    return status ;
972  }
973  // DEBUG
974  //cout << "RAZ(" << i << ") = " << record_->RAZ << endl ;
975  //
976  status = readTable( record_->REL, "REL", same_, i ) ;
977  if ( status ) {
978    os << LogIO::WARN << "Error while reading REL." << LogIO::POST ;
979    return status ;
980  }
981  // DEBUG
982  //cout << "REL(" << i << ") = " << record_->REL << endl ;
983  //
984  status = readTable( record_->XX, "XX", same_, i ) ;
985  if ( status ) {
986    os << LogIO::WARN << "Error while reading XX." << LogIO::POST ;
987    return status ;
988  }
989  // DEBUG
990  //cout << "XX(" << i << ") = " << record_->XX << endl ;
991  //
992  status = readTable( record_->YY, "YY", same_, i ) ;
993  if ( status ) {
994    os << LogIO::WARN << "Error while reading YY." << LogIO::POST ;
995    return status ;
996  }
997  // DEBUG
998  //cout << "YY(" << i << ") = " << record_->YY << endl ;
999  //
1000  for (unsigned int ii = 0u; ii < 4u; ++ii) {
1001    record_->ARRYT[ii] = ' ';
1002  }
1003  status = readTable( record_->ARRYT, "ARRYT", 4, i ) ;
1004  for (int j = 3 ; j >= 0 ; j--) {
1005    if (record_->ARRYT[j] == ' ') record_->ARRYT[j] = '\0';
1006    else break;
1007  }
1008  if ( status ) {
1009    os << LogIO::WARN << "Error while reading ARRYT." << LogIO::POST ;
1010    return status ;
1011  }
1012  // DEBUG
1013  //cout << "ARRYT(" << i << ") = " << record_->ARRYT << endl ;
1014  //
1015  double dtmp ;
1016  status = readTable( dtmp, "TEMP", same_, i ) ;
1017  if ( status ) {
1018    os << LogIO::WARN << "Error while reading TEMP." << LogIO::POST ;
1019    return status ;
1020  }
1021  else {
1022    record_->TEMP = dtmp ;
1023  }
1024  // DEBUG
1025  //cout << "TEMP(" << i << ") = " << record_->TEMP << endl ;
1026  //
1027  status = readTable( dtmp, "PATM", same_, i ) ;
1028  if ( status ) {
1029    os << LogIO::WARN << "Error while reading PATM." << LogIO::POST ;
1030    return status ;
1031  }
1032  else {
1033    record_->PATM = dtmp ;
1034  }
1035  // DEBUG
1036  //cout << "PATM(" << i << ") = " << record_->PATM << endl ;
1037  //
1038  status = readTable( dtmp, "PH2O", same_, i ) ;
1039  if ( status ) {
1040    os << LogIO::WARN << "Error while reading PH2O." << LogIO::POST ;
1041    return status ;
1042  }
1043  else {
1044    record_->PH2O = dtmp ;
1045  }
1046  // DEBUG
1047  //cout << "PH2O(" << i << ") = " << record_->PH2O << endl ;
1048  //
1049  status = readTable( dtmp, "VWIND", same_, i ) ;
1050  if ( status ) {
1051    os << LogIO::WARN << "Error while reading VWIND." << LogIO::POST ;
1052    return status ;
1053  }
1054  else {
1055    record_->VWIND = dtmp ;
1056  }
1057  // DEBUG
1058  //cout << "VWIND(" << i << ") = " << record_->VWIND << endl ;
1059  //
1060  status = readTable( dtmp, "DWIND", same_, i ) ;
1061  if ( status ) {
1062    os << LogIO::WARN << "Error while reading DWIND." << LogIO::POST ;
1063    return status ;
1064  }
1065  else {
1066    record_->DWIND = dtmp ;
1067  }
1068  // DEBUG
1069  //cout << "DWIND(" << i << ") = " << record_->DWIND << endl ;
1070  //
1071  status = readTable( dtmp, "TAU", same_, i ) ;
1072  if ( status ) {
1073    os << LogIO::WARN << "Error while reading TAU." << LogIO::POST ;
1074    return status ;
1075  }
1076  else {
1077    record_->TAU = dtmp ;
1078  }
1079  // DEBUG
1080  //cout << "TAU(" << i << ") = " << record_->TAU << endl ;
1081  //
1082  status = readTable( dtmp, "TSYS", same_, i ) ;
1083  if ( status ) {
1084    os << LogIO::WARN << "Error while reading TSYS." << LogIO::POST ;
1085    return status ;
1086  }
1087  else {
1088    record_->TSYS = dtmp ;
1089  }
1090  // DEBUG
1091  //cout << "TSYS(" << i << ") = " << record_->TSYS << endl ;
1092  //
1093  status = readTable( dtmp, "BATM", same_, i ) ;
1094  if ( status ) {
1095    os << LogIO::WARN << "Error while reading BATM." << LogIO::POST ;
1096    return status ;
1097  }
1098  else {
1099    record_->BATM = dtmp ;
1100  }
1101  // DEBUG
1102  //cout << "BATM(" << i << ") = " << record_->BATM << endl ;
1103  //
1104  status = readTable( record_->VRAD, "VRAD", same_, i ) ;
1105  if ( status ) {
1106    os << LogIO::WARN << "Error while reading TEMP." << LogIO::POST ;
1107    return status ;
1108  }
1109  // DEBUG
1110  //cout << "VRAD(" << i << ") = " << record_->VRAD << endl ;
1111  //
1112  status = readTable( record_->FREQ0, "FRQ0", same_, i ) ;
1113  if ( status ) {
1114    os << LogIO::WARN << "Error while reading FREQ0." << LogIO::POST ;
1115    return status ;
1116  }
1117  // DEBUG
1118  //cout << "FREQ0(" << i << ") = " << record_->FREQ0 << endl ;
1119  //
1120  status = readTable( record_->FQTRK, "FQTRK", same_, i ) ;
1121  if ( status ) {
1122    os << LogIO::WARN << "Error while reading FQTRK." << LogIO::POST ;
1123    return status ;
1124  }
1125  // DEBUG
1126  //cout << "FQTRK(" << i << ") = " << record_->FQTRK << endl ;
1127  //
1128  status = readTable( record_->FQIF1, "FQIF1", same_, i ) ;
1129  if ( status ) {
1130    os << LogIO::WARN << "Error while reading FQIF1." << LogIO::POST ;
1131    return status ;
1132  }
1133  // DEBUG
1134  //cout << "FQIF1(" << i << ") = " << record_->FQIF1 << endl ;
1135  //
1136  status = readTable( record_->ALCV, "ALCV", same_, i ) ;
1137  if ( status ) {
1138    os << LogIO::WARN << "Error while reading ALCV." << LogIO::POST ;
1139    return status ;
1140  }
1141  // DEBUG
1142  //cout << "ALCV(" << i << ") = " << record_->ALCV << endl ;
1143  //
1144  record_->IDMY0 = 0 ;
1145  status = readTable( record_->DPFRQ, "DPFRQ", same_, i ) ;
1146  if ( status ) {
1147    //os << LogIO::WARN << "Error  DPFRQ set to 0." << LogIO::POST ;
1148    record_->DPFRQ = 0.0 ;
1149  }
1150  // DEBUG
1151  //cout << "DPFRQ(" << i << ") = " << record_->DPFRQ << endl ;
1152  //
1153  status = readTable( record_->SFCTR, "SFCTR", same_, i ) ;
1154  if ( status ) {
1155    os << LogIO::WARN << "Error while reading SFCTR." << LogIO::POST ;
1156    return status ;
1157  }
1158  // DEBUG
1159  //cout << "SFCTR(" << i << ") = " << record_->SFCTR << endl ;
1160  //
1161  status = readTable( record_->ADOFF, "ADOFF", same_, i ) ;
1162  if ( status ) {
1163    os << LogIO::WARN << "Error while reading ADOFF." << LogIO::POST ;
1164    return status ;
1165  }
1166  // DEBUG
1167  //cout << "ADOFF(" << i << ") = " << record_->ADOFF << endl ;
1168  //
1169  //status = readTable( record_->JDATA, "LDATA", same_, i ) ;
1170  status = readTable( JDATA, "LDATA", same_, i ) ;
1171  if ( status ) {
1172    os << LogIO::WARN << "Error while reading JDATA." << LogIO::POST ;
1173    return status ;
1174  }
1175  // DEBUG
1176//   for ( int i = 0 ; i < chmax_ ; i++ )
1177//     //cout << "JDATA[" << i << "] = " << JDATA[i] << " " ;
1178//   //cout << endl ;
1179  //
1180
1181
1182  // Update IPTIM since it depends on the row for NROFITS
1183  int integ ;
1184  status = readTable( integ, "INTEG", same_, i ) ;
1185  if ( !status ) {
1186    IPTIM = (double)integ ;
1187  }
1188
1189  return status ;
1190}
1191
1192vector< vector<double> > NROFITSDataset::getSpectrum()
1193{
1194  vector< vector<double> > spec;
1195
1196  for ( int i = 0 ; i < rowNum_ ; i++ ) {
1197    spec.push_back( getSpectrum( i ) ) ;
1198  }
1199
1200  return spec ;
1201}
1202
1203vector<double> NROFITSDataset::getSpectrum( int i )
1204{
1205  vector<double> spec( chmax_, 0.0 ) ;
1206  vector<double> specout( chmax_, 0.0 ) ;
1207  const NRODataRecord *record = getRecord( i ) ;
1208  double scale = record->SFCTR ;
1209  double offset = record->ADOFF ;
1210  double dscale = MLTSCF[getIndex( i )] ;
1211  //vector<int> ispec = record->JDATA ;
1212  vector<int> ispec = JDATA ;
1213  for ( int ii = 0 ; ii < chmax_ ; ii++ ) {
1214    spec[ii] = (double)( ispec[ii] * scale + offset ) * dscale ;
1215  }
1216
1217  // for AOS, re-gridding is needed
1218  if ( strncmp( record->ARRYT, "H", 1 ) == 0
1219       || strncmp( record->ARRYT, "W", 1 ) == 0
1220       || strncmp( record->ARRYT, "U", 1 ) == 0 ) {
1221
1222    string arryt = string( record->ARRYT ) ;
1223    uInt ib = getArrayId( arryt ) ;
1224    vector<double> fqcal = getFQCAL()[ib] ;
1225    vector<double> chcal = getCHCAL()[ib] ;
1226    int ncal = getNFCAL()[ib] ;
1227
1228//     //cout << "NRODataset::getFrequencies()  ncal = " << ncal << endl ;
1229    while ( ncal < (int)fqcal.size() ) {
1230      fqcal.pop_back() ;
1231      chcal.pop_back() ;
1232    }
1233    Vector<Double> xin( chcal ) ;
1234    Vector<Double> yin( fqcal ) ;
1235    int nchan = getNUMCH() ;
1236    Vector<Double> xout( nchan ) ;
1237    indgen( xout ) ;
1238    Vector<Double> yout ;
1239    InterpolateArray1D<Double, Double>::interpolate( yout, xout, xin, yin, InterpolateArray1D<Double,Double>::cubic ) ;
1240    // debug
1241    //cout << "i=" << i << endl ;
1242//     if ( i == 16 ) {
1243//       ofstream ofs0( "spgrid0.dat" ) ;
1244//       for ( int ii = 0 ; ii < getNUMCH() ; ii++ )
1245//         ofs0 << xout[ii] << "," ;
1246//       ofs0 << endl ;
1247//       for ( int ii = 0 ; ii < getNUMCH() ; ii++ )
1248//         ofs0 << setprecision(16) << record->FREQ0+yout[ii] << "," ;
1249//       ofs0 << endl ;
1250//       ofs0.close() ;
1251//     }
1252    //
1253    Vector<Double> z( nchan ) ;
1254    Double bw = abs( yout[nchan-1] - yout[0] ) ;
1255    bw += 0.5 * abs( yout[nchan-1] - yout[nchan-2] + yout[1] - yout[0] ) ;
1256    Double dz = bw / (Double)nchan ;
1257    if ( yout[0] > yout[nchan-1] )
1258      dz = - dz ;
1259    z[0] = yout[0] - 0.5 * ( yout[1] - yout[0] - dz ) ;
1260    for ( int ii = 1 ; ii < nchan ; ii++ )
1261      z[ii] = z[ii-1] + dz ;
1262    Vector<Double> zi( nchan+1 ) ;
1263    Vector<Double> yi( nchan+1 ) ;
1264    zi[0] = z[0] - 0.5 * dz ;
1265    zi[1] = z[0] + 0.5 * dz ;
1266    yi[0] = yout[0] - 0.5 * ( yout[1] - yout[0] ) ;
1267    yi[1] = yout[0] + 0.5 * ( yout[1] - yout[0] ) ;
1268    for ( int ii = 2 ; ii < nchan ; ii++ ) {
1269      zi[ii] = zi[ii-1] + dz ;
1270      yi[ii] = yi[ii-1] + 0.5 * ( yout[ii] - yout[ii-2] ) ;
1271    }
1272    zi[nchan] = z[nchan-1] + 0.5 * dz ;
1273    yi[nchan] = yout[nchan-1] + 0.5 * ( yout[nchan-1] - yout[nchan-2] ) ;
1274//     // debug
1275//     //cout << "nchan=" << nchan << ", bw=" << bw << ", dz=" << dz
1276//          << ", y[1]-y[0]=" << yout[1]-yout[0] << endl ;
1277//     //cout << "z: " << z[0] << " - " << z[nchan-1]
1278//          << ", zi: " << zi[0] << " - " << zi[nchan] << endl ;
1279//     //cout << "y: " << yout[0] << " - " << yout[nchan-1]
1280//          << ", yi: " << yi[0] << " - " << yi[nchan] << endl ;
1281//     ofstream ofs1( "spgrid1.dat", ios::out | ios::app ) ;
1282//     ofs1 << "spid=" << i << ", ARRYT=" << record->ARRYT << endl ;
1283//     ofs1 << "z[0]=" << z[0] << ", yout[0]=" << yout[0] << endl ;
1284//     for ( int ii = 1; ii < nchan ; ii++ ) {
1285//       ofs1 << "               dz=" << z[ii]-z[ii-1] << ", dy=" << yout[ii]-yout[ii-1] << endl ;
1286//       ofs1 << "z[" << ii << "]=" << z[ii] << ", yout[" << ii << "]=" << yout[ii] << endl ;
1287//     }
1288//     ofs1.close() ;
1289//     ofstream ofs2( "spgrid2.dat", ios::out | ios::app ) ;
1290//     ofs2 << "spid=" << i << ", ARRYT=" << record->ARRYT << endl ;
1291//     for ( int ii = 0 ; ii < nchan+1 ; ii++ )
1292//       ofs2 << "zi[" << ii << "]=" << zi[ii] << ", yi[" << ii << "]=" << yi[ii] << endl ;
1293//     ofs2.close() ;
1294//     //
1295    int ichan = 0 ;
1296    double wsum = 0.0 ;
1297    // debug
1298    //ofstream ofs3( "spgrid3.dat", ios::out | ios::app ) ;
1299    if ( dz > 0.0 ) {
1300      for ( int ii = 0 ; ii < nchan ; ii++ ) {
1301        double zl = zi[ii] ;
1302        double zr = zi[ii+1] ;
1303        for ( int j = ichan ; j < nchan ; j++ ) {
1304          double yl = yi[j] ;
1305          double yr = yi[j+1] ;
1306          if ( yl <= zl ) {
1307            if ( yr <= zl ) {
1308              continue ;
1309            }
1310            else if ( yr <= zr ) {
1311              specout[ii] += spec[j] * ( yr - zl ) ;
1312              wsum += ( yr - zl ) ;
1313            }
1314            else {
1315              specout[ii] += spec[j] * dz ;
1316              wsum += dz ;
1317              ichan = j ;
1318              break ;
1319            }
1320          }
1321          else if ( yl < zr ) {
1322            if ( yr <= zr ) {
1323              specout[ii] += spec[j] * ( yr - yl ) ;
1324              wsum += ( yr - yl ) ;
1325            }
1326            else {
1327              specout[ii] += spec[j] * ( zr - yl ) ;
1328              wsum += ( zr - yl ) ;
1329              ichan = j ;
1330              break ;
1331            }
1332          }
1333          else {
1334            ichan = j - 1 ;
1335            break ;
1336          }
1337        }
1338        specout[ii] /= wsum ;
1339        wsum = 0.0 ;
1340      }
1341    }
1342    else if ( dz < 0.0 ) {
1343      for ( int ii = 0 ; ii < nchan ; ii++ ) {
1344        double zl = zi[ii] ;
1345        double zr = zi[ii+1] ;
1346        for ( int j = ichan ; j < nchan ; j++ ) {
1347          double yl = yi[j] ;
1348          double yr = yi[j+1] ;
1349          if ( yl >= zl ) {
1350            if ( yr >= zl ) {
1351              continue ;
1352            }
1353            else if ( yr >= zr ) {
1354              specout[ii] += spec[j] * abs( yr - zl ) ;
1355              wsum += abs( yr - zl ) ;
1356            }
1357            else {
1358              specout[ii] += spec[j] * abs( dz ) ;
1359              wsum += abs( dz ) ;
1360              ichan = j ;
1361              break ;
1362            }
1363          }
1364          else if ( yl > zr ) {
1365            if ( yr >= zr ) {
1366              specout[ii] += spec[j] * abs( yr - yl ) ;
1367              wsum += abs( yr - yl ) ;
1368            }
1369            else {
1370              specout[ii] += spec[j] * abs( zr - yl ) ;
1371              wsum += abs( zr - yl ) ;
1372              ichan = j ;
1373              break ;
1374            }
1375          }
1376          else {
1377            ichan = j - 1 ;
1378            break ;
1379          }
1380        }
1381        specout[ii] /= wsum ;
1382        wsum = 0.0 ;
1383      }
1384    }
1385    //specout = spec ;
1386    //ofs3.close() ;
1387  }
1388  else {
1389    specout = spec ;
1390  }
1391
1392  return specout ;
1393}
1394
1395int NROFITSDataset::getIndex( int irow )
1396{
1397  const NRODataRecord *record = getRecord( irow ) ;
1398  string str = record->ARRYT ;
1399  string::size_type pos = str.find( " " ) ;
1400  if ( pos != string::npos )
1401    str = str.substr( 0, pos ) ;
1402  int index = -1 ;
1403  for ( int i = 0 ; i < ARYNM ; i++ ) {
1404    if ( str.compare( 0, 3, ARYTP[i] ) == 0 ) {
1405      index = i ;
1406      break ;
1407    }
1408  }
1409  return index ;
1410}
1411
1412double NROFITSDataset::radRA( string ra )
1413{
1414  int pos1 = ra.find( ':' ) ;
1415  int pos2 ;
1416  string ch = ra.substr( 0, pos1 ) ;
1417  //cout << "ch = \'" << ch << "\'" << endl ;
1418  pos2 = pos1 + 1 ;
1419  pos1 = ra.find( ':', pos2 ) ;
1420  string cm = ra.substr( pos2, pos1 - pos2 ) ;
1421  //cout << "cm = \'" << cm << "\'" << endl ;
1422  pos2 = pos1 + 1 ;
1423  pos1 = ra.size() ;
1424  string cs = ra.substr( pos2, pos1 - pos2 ) ;
1425  //cout << "cs = \'" << cs << "\'" << endl ;
1426  double h ;
1427  if ( ra[0] != '-' )
1428    h = atof( ch.c_str() ) + atof( cm.c_str() ) / 60.0 + atof( cs.c_str() ) / 3600.0 ;
1429  else
1430    h = atof( ch.c_str() ) - atof( cm.c_str() ) / 60.0 - atof( cs.c_str() ) / 3600.0 ;
1431  double rra = h * M_PI / 12.0 ;
1432  return rra ;
1433}
1434
1435double NROFITSDataset::radDEC( string dec )
1436{
1437  int pos1 = dec.find( ':' ) ;
1438  int pos2 ;
1439  string cd = dec.substr( 0, pos1 ) ;
1440  //cout << "cd = \'" << cd << "\'" << endl ;
1441  pos2 = pos1 + 1 ;
1442  pos1 = dec.find( ':', pos2 ) ;
1443  string cm = dec.substr( pos2, pos1 - pos2 ) ;
1444  //cout << "cm = \'" << cm << "\'" << endl ;
1445  pos2 = pos1 + 1 ;
1446  pos1 = dec.size() ;
1447  string cs = dec.substr( pos2, pos1 - pos2 ) ;
1448  //cout << "cs = \'" << cs << "\'" << endl ;
1449  double h ;
1450  if ( dec[0] != '-' )
1451    h = atof( cd.c_str() ) + atof( cm.c_str() ) / 60.0 + atof( cs.c_str() ) / 3600.0 ;
1452  else
1453    h = atof( cd.c_str() ) - atof( cm.c_str() ) / 60.0 - atof( cs.c_str() ) / 3600.0 ;
1454  double rdec = h * M_PI / 180.0 ;
1455  return rdec ;
1456}
1457
1458void NROFITSDataset::getField()
1459{
1460  long offset = 0;
1461  for ( int i = 0 ; i < numField_ ; i++ ) {
1462    char key1[9] ;
1463    char key2[9] ;
1464    char key3[9] ;
1465    if ( i < 9 ) {
1466      sprintf( key1, "TFORM%d  ", i+1 ) ;
1467      sprintf( key2, "TTYPE%d  ", i+1 ) ;
1468      sprintf( key3, "TUNIT%d  ", i+1 ) ;
1469      //cout << "key1 = " << key1 << ", key2 = " << key2 << ", key3 = " << key3 << endl ;
1470    }
1471    else if ( i < 99 ) {
1472      sprintf( key1, "TFORM%2d ", i+1 ) ;
1473      sprintf( key2, "TTYPE%2d ", i+1 ) ;
1474      sprintf( key3, "TUNIT%2d ", i+1 ) ;
1475      //cout << "key1 = " << key1 << ", key2 = " << key2 << ", key3 = " << key3 << endl ;
1476    }
1477    else {
1478      sprintf( key1, "TFORM%3d", i+1 ) ;
1479      sprintf( key2, "TTYPE%3d", i+1 ) ;
1480      sprintf( key3, "TUNIT%3d", i+1 ) ;
1481      //cout << "key1 = " << key1 << ", key2 = " << key2 << ", key3 = " << key3 << endl ;
1482    }
1483    //char tmp[9] ;
1484    string tmp ;
1485    //strcpy( tmp, "         " ) ;
1486    if ( readHeader( tmp, key1 ) != 0 ) {
1487      cerr << "Error while reading field keyword for scan header." << endl ;
1488      return ;
1489    }
1490    string form = tmp ;
1491    string::size_type spos = form.find( " " ) ;
1492    if ( spos != string::npos )
1493      form = form.substr( 0, spos ) ;
1494    //strcpy( tmp, "         " ) ;
1495    if ( readHeader( tmp, key2 ) != 0 ) {
1496      cerr << "Error while reading field type for scan header." << endl ;
1497      return ;
1498    }
1499    string name = tmp ;
1500    spos = tmp.find( " " ) ;
1501    if ( spos != string::npos )
1502      name = tmp.substr( 0, spos ) ;
1503    //strcpy( tmp, "         " ) ;
1504    if ( form.find( "A" ) != string::npos ) {
1505      //cout << "skip to get unit: name = " << form << endl ;
1506      //strcpy( tmp, "none    " ) ;
1507      tmp = "none" ;
1508    }
1509    else {
1510      //cout << "get unit: name = " << form << endl ;
1511      if ( readHeader( tmp, key3 ) != 0 ) {
1512        //strcpy( tmp, "none    " ) ;
1513        tmp = "none" ;
1514      }
1515    }
1516    //string unit = string( tmp ) ;
1517    //unit = tmp ;
1518    //spos = tmp.find( " " ) ;
1519    //if ( spos != string::npos )
1520    //  unit = unit.substr( 0, spos ) ;
1521    //cout << "i = " << i << ": name=" << form << " type=" << name << " unit=" << unit << endl ;
1522
1523    string substr1 = form.substr( 0, form.size()-1 ) ;
1524    string substr2 = form.substr( form.size()-1, 1 ) ;
1525    //cout << "substr1 = " << substr1 << ", substr2 = " << substr2 << endl ;
1526    int o1 = atoi( substr1.c_str() ) ;
1527    int o2 = 0 ;
1528    if ( substr2 == "A" )
1529      o2 = sizeof(char) ;
1530    else if ( substr2 == "J" )
1531      o2 = sizeof(int) ;
1532    else if ( substr2 == "F" )
1533      o2 = sizeof(float) ;
1534    else if ( substr2 == "D" )
1535      o2 = sizeof(double) ;
1536
1537    FieldProperty property;
1538    property.offset = offset;
1539    property.size = o1 * o2;
1540    properties_[name] = property;
1541
1542    offset += property.size ;
1543  } 
1544}
1545
1546void NROFITSDataset::fillARYTP()
1547{
1548  string arry ;
1549  int count = 0 ;
1550  string arry1 ;
1551  string arry2 ;
1552  string arry3 ;
1553  string arry4 ;
1554  char arytp[4];
1555  if ( readHeader( arry, "ARRY1" ) == 0 )
1556    arry1 = arry ;
1557  else
1558    arry1 = "00000000000000000000" ;
1559  for ( int i = 0 ; i < 20 ; i++ ) {
1560    if ( arry1[i] == '1' ) {
1561      for (int j = 0 ; j < 4 ; j++) arytp[j] = '\0';
1562      sprintf( arytp, "H%d", i+1 ) ;
1563      ARYTP[count++] = string( arytp ) ;
1564    }
1565  }
1566  if ( readHeader( arry, "ARRY2" ) == 0 )
1567    arry2 = arry ;
1568  else
1569    arry2 = "00000000000000000000" ;
1570  for ( int i = 0 ; i < 10 ; i++ ) {
1571    if ( arry2[i] == '1' ) {
1572      for (int j = 0 ; j < 4 ; j++) arytp[j] = '\0';
1573      sprintf( arytp, "W%d", i+1 ) ;
1574      ARYTP[count++] = string( arytp ) ;
1575    }
1576  }
1577  for ( int i = 10 ; i < 15 ; i++ ) {
1578    if ( arry2[i] == '1' ) {
1579      for (int j = 0 ; j < 4 ; j++) arytp[j] = '\0';
1580      sprintf( arytp, "U%d", i-9 ) ;
1581      ARYTP[count++] = string( arytp ) ;
1582    }
1583  }
1584  for ( int i = 15 ; i < 20 ; i++ ) {
1585    if ( arry2[i] == '1' ) {
1586      for (int j = 0 ; j < 4 ; j++) arytp[j] = '\0';
1587      sprintf( arytp, "X%d", i-14 ) ;
1588      ARYTP[count++] = string( arytp ) ;
1589    }
1590  }
1591  if ( readHeader( arry, "ARRY3" ) == 0 )
1592    arry3 = arry ;
1593  else
1594    arry3 = "00000000000000000000" ;
1595  for ( int i = 0 ; i < 20 ; i++ ) {
1596    if ( arry3[i] == '1' ) {
1597      for (int j = 0 ; j < 4 ; j++) arytp[j] = '\0';
1598      sprintf( arytp, "A%d", i+1 ) ;
1599      ARYTP[count++] = string( arytp ) ;
1600    }
1601  }
1602  if ( readHeader( arry, "ARRY4" ) == 0 )
1603    arry4 = arry ;
1604  else
1605    arry4 = "00000000000000000000" ;
1606  for ( int i = 0 ; i < 20 ; i++ ) {
1607    if ( arry4[i] == '1' ) {
1608      for (int j = 0 ; j < 4 ; j++) arytp[j] = '\0';
1609      sprintf( arytp, "A%d", i+21 ) ;
1610      ARYTP[count++] = string( arytp ) ;
1611    }
1612  }     
1613  //nro_debug_output("ARYTP", ARYTP.size(), ARYTP);
1614}
1615
1616int NROFITSDataset::readARRY()
1617{
1618  LogIO os( LogOrigin( "NROFITSDataset", "readARRY()", WHERE ) ) ;
1619
1620  string arry1 ;
1621  string arry2 ;
1622  string arry3 ;
1623  string arry4 ;
1624  int status = readHeader( arry1, "ARRY1" ) ;
1625  if ( status ) {
1626    os << LogIO::SEVERE << "Error while reading ARRY1" << LogIO::POST ;
1627    return status ;
1628  }
1629  status = readHeader( arry2, "ARRY2" ) ;
1630  if ( status ) {
1631    os << LogIO::SEVERE << "Error while reading ARRY2" << LogIO::POST ;
1632    return status ;
1633  }
1634  status = readHeader( arry3, "ARRY3" ) ;
1635  if ( status ) {
1636    os << LogIO::SEVERE << "Error while reading ARRY3" << LogIO::POST ;
1637    return status ;
1638  }
1639  status = readHeader( arry4, "ARRY4" ) ;
1640  if ( status ) {
1641    os << LogIO::SEVERE << "Error while reading ARRY4" << LogIO::POST ;
1642    return status ;
1643  }
1644  int index = 0 ;
1645  for ( int i = 0 ; i < 20 ; i++ ) {
1646    // AOSH
1647    if ( arry1[i] == '1' )
1648      ARRY[index] = 1 ;
1649    else
1650      ARRY[index] = 0 ;
1651    // AOSW, AOSU, FX
1652    if ( arry2[i] == '1' )
1653      ARRY[index+20] = 1 ;
1654    else
1655      ARRY[index+20] = 0 ;
1656    // AC45 (1-20)
1657    if ( arry3[i] == '1' )
1658      ARRY[index+40] = 1 ;
1659    else
1660      ARRY[index+40] = 0 ;
1661    // AC45 (21-35)
1662    if ( i < 15 ) {
1663      if ( arry4[i] == '1' )
1664        ARRY[index+60] = 1 ;
1665      else
1666        ARRY[index+60] = 0 ;
1667    }
1668    index++ ;
1669  }
1670  return status ;
1671}
1672
1673void NROFITSDataset::findData()
1674{
1675  LogIO os( LogOrigin( "NROFITSDataset", "findData()", WHERE ) ) ;
1676
1677  // skip header
1678  fseek( fp_, FITS_HEADER_SIZE, SEEK_SET ) ;
1679
1680  // get offset
1681  long offset = getOffset( "ARRYT" ) ;
1682  if ( offset == -1 ) {
1683    //cerr << "Error, ARRYT is not found in the name list." << endl ;
1684    return ;
1685  }
1686  //cout << "offset for ARRYT is " << offset << " bytes." << endl ;
1687  fseek( fp_, offset, SEEK_CUR ) ;
1688  int count = 0 ;
1689  int index = 0 ;
1690  while ( count < ARYNM && index < rowNum_ ) {
1691    char ctmp[5] ;
1692    std::size_t retval = fread( ctmp, 1, 4, fp_ ) ;
1693    if (retval < 4) {
1694      os << LogIO::SEVERE << "Failed to read array configuration." << LogIO::EXCEPTION;
1695    }
1696    ctmp[4] = '\0' ;
1697    //cout << "ctmp = " << ctmp << endl ;
1698    for ( int i = 0 ; i < ARYNM ; i++ ) {
1699      if ( arrayid_[i] != -1 )
1700        continue ;
1701      else if ( strncmp( ctmp, ARYTP[i].c_str(), ARYTP[i].size() ) == 0 ) {
1702        //cout << "matched: i = " << i << ", ARYTP = " << ARYTP[i] << ", ctmp = " << ctmp << endl ;
1703        arrayid_[i] = index ;
1704        count++ ;
1705      }
1706    }
1707    fseek( fp_, scanLen_-4, SEEK_CUR ) ;
1708    index++ ;
1709  }
1710
1711  if ( count != ARYNM ) {
1712    os << LogIO::WARN << "NROFITSDataset::findData()  failed to find rows for " ;
1713    for ( int i = 0 ; i < ARYNM ; i++ ) {
1714      if ( arrayid_[i] == -1 ) {
1715        os << LogIO::WARN << ARYTP[i] << " " ;
1716      }
1717    }
1718    os.post() ;
1719  }
1720
1721//   for ( int i = 0 ; i < ARYNM ; i++ )
1722//     //cout << "arrayid_[" << i << "] = " << arrayid_[i] << endl ;
1723  }
1724
1725long NROFITSDataset::getOffset( const char *name )
1726{
1727  map<string, FieldProperty>::iterator iter = properties_.find(string(name));
1728  long offset = (iter != properties_.end()) ? iter->second.offset : -1;
1729
1730  return offset ;
1731}
1732
1733int NROFITSDataset::getPolarizationNum()
1734{
1735  int npol = 0 ;
1736
1737  vector<char> type( 2 ) ;
1738  type[0] = 'C' ;
1739  type[1] = 'L' ;
1740  vector<double> crot ;
1741  vector<double> lagl ;
1742
1743  for ( int i = 0 ; i < ARYNM ; i++ ) {
1744    if ( POLTP[i][0] == type[0] ) {
1745      // circular polarization
1746      if( count( crot.begin(), crot.end(), POLDR[i] ) != 0 ) {
1747        crot.push_back( POLDR[i] ) ;
1748        npol++ ;
1749      }
1750    }
1751    else if ( POLTP[i][0] == type[1] ) {
1752      // linear polarization
1753      if ( count( lagl.begin(), lagl.end(), POLAN[i] ) != 0 ) {
1754        lagl.push_back( POLAN[i] ) ;
1755        npol++ ;
1756      }
1757    }
1758  }
1759
1760  if ( npol == 0 )
1761    npol = 1 ;
1762
1763
1764  return npol ;
1765}
1766
1767int NROFITSDataset::readHeader( string &v, const char *name )
1768{
1769  //
1770  // Read 'name' attribute defined as char from the FITS Header
1771  // 
1772  int status = 0 ;
1773 
1774  char buf[81] ;
1775  strcpy( buf, "     " ) ;
1776  fseek( fp_, 0, SEEK_SET ) ;
1777  int count = 0 ;
1778  while ( strncmp( buf, name, strlen(name) ) != 0 && strncmp( buf, "END", 3 ) != 0 ) {
1779    std::size_t retval = fread( buf, 1, 80, fp_ ) ;
1780    if (retval < 80) {
1781      LogIO os(LogOrigin("NROFITSDataset", "readHeader(string)", WHERE));
1782      os << LogIO::SEVERE << "Failed to read header" << LogIO::EXCEPTION;
1783    }
1784    buf[80] = '\0' ;
1785    count++ ;
1786  }
1787  if ( strncmp( buf, "END", 3 ) == 0 ) {
1788    //cerr << "NROFITSDataset::readHeader()  keyword " << name << " not found." << endl ;
1789    //cerr << "count = " << count << endl ;
1790    status = -1 ;
1791    return status ;
1792  }
1793  string str( buf ) ;
1794  int pos1 = str.find( '\'' ) + 1 ;
1795  int pos2 = str.find( '\'', pos1 ) ;
1796  unsigned int clen = pos2 - pos1 ;
1797  //cout << "string: " << str << endl ;
1798  //cout << "value:  " << str.substr( pos1, clen ).c_str() << endl ;
1799  //cout << "clen = " << clen << endl ;
1800  v = str.substr( pos1, clen ) ;
1801  //cout << "v = \'" << v << "\'" << endl ;
1802
1803  return status ;
1804}
1805
1806int NROFITSDataset::readHeader( int &v, const char *name )
1807{
1808  //
1809  // Read 'name' attribute defined as int from the FITS Header
1810  //
1811  int status = 0 ;
1812
1813  char buf[81] ;
1814  strcpy( buf, "     " ) ;
1815  fseek( fp_, 0, SEEK_SET ) ;
1816  while ( strncmp( buf, name, strlen(name) ) != 0 && strncmp( buf, "END", 3 ) != 0 ) {
1817    std::size_t retval = fread( buf, 1, 80, fp_ ) ;
1818    if (retval < 80) {
1819      LogIO os(LogOrigin("NROFITSDataset", "readHeader(int)", WHERE));
1820      os << LogIO::SEVERE << "Failed to read header" << LogIO::EXCEPTION;
1821    }
1822    buf[80] = '\0' ;
1823    //char bufo[9] ;
1824    //strncpy( bufo, buf, 8 ) ;
1825    //bufo[8] = '\0' ;
1826    //cout << "header: " << bufo << endl ;
1827  }
1828  if ( strncmp( buf, "END", 3 ) == 0 ) {
1829    //cerr << "NROFITSDataset::readHeader()  keyword " << name << " not found." << endl ;
1830    status = -1 ;
1831    return status ;
1832  }
1833  string str( buf ) ;
1834  int pos1 = str.find( '=' ) + 1 ;
1835  int pos2 = str.find( '/' ) ;
1836  //cout << "string: " << str << endl ;
1837  //cout << "value:  " << str.substr( pos1, pos2 - pos1 ).c_str() << endl ;
1838  v = atoi( str.substr( pos1, pos2 - pos1 ).c_str() ) ;
1839  //cout << "v = " << v << endl ;
1840
1841  //cout << "NROFITSDataset::readHeader() end to read" << endl ;
1842  return status ;
1843}
1844
1845
1846int NROFITSDataset::readHeader( float &v, const char *name )
1847{
1848  //
1849  // Read 'name' attribute defined as float from the FITS Header
1850  //
1851  int status = 0 ;
1852
1853  char buf[81] ;
1854  strcpy( buf, "     " ) ;
1855  fseek( fp_, 0, SEEK_SET ) ;
1856  while ( strncmp( buf, name, strlen(name) ) != 0 && strncmp( buf, "END", 3 ) != 0 ) {
1857    std::size_t retval = fread( buf, 1, 80, fp_ ) ;
1858    if (retval < 80) {
1859      LogIO os(LogOrigin("NROFITSDataset", "readHeader(float)", WHERE));
1860      os << LogIO::SEVERE << "Failed to read header" << LogIO::EXCEPTION;
1861    }
1862    buf[80] = '\0' ;
1863    //char bufo[9] ;
1864    //strncpy( bufo, buf, 8 ) ;
1865    //bufo[8] = '\0' ;
1866    //cout << "header: " << bufo << endl ;
1867  }
1868  if ( strncmp( buf, "END", 3 ) == 0 ) {
1869    //cerr << "NROFITSDataset::readHeader()  keyword " << name << " not found." << endl ;
1870    status = -1 ;
1871    return status ;
1872  }
1873  string str( buf ) ;
1874  int pos1 = str.find( '=' ) + 1 ;
1875  int pos2 = str.find( '/' ) ;
1876  //cout << "string: " << str << endl ;
1877  //cout << "value:  " << str.substr( pos1, pos2 - pos1 ).c_str() << endl ;
1878  v = atof( str.substr( pos1, pos2 - pos1 ).c_str() ) ;
1879  //cout << "v = " << v << endl ;
1880
1881  return status ;
1882}
1883
1884int NROFITSDataset::readHeader( double &v, const char *name )
1885{
1886  //
1887  // Read 'name' attribute defined as double from the FITS Header
1888  //
1889  int status = 0 ;
1890
1891  char buf[81] ;
1892  strcpy( buf, "     " ) ;
1893  fseek( fp_, 0, SEEK_SET ) ;
1894  while ( strncmp( buf, name, strlen(name) ) != 0 && strncmp( buf, "END", 3 ) != 0 ) {
1895    std::size_t retval = fread( buf, 1, 80, fp_ ) ;
1896    if (retval < 80) {
1897      LogIO os(LogOrigin("NROFITSDataset", "readHeader(double)", WHERE));
1898      os << LogIO::SEVERE << "Failed to read header" << LogIO::EXCEPTION;
1899    }
1900    buf[80] = '\0' ;
1901    char bufo[9] ;
1902    strncpy( bufo, buf, 8 ) ;
1903    bufo[8] = '\0' ;
1904    //cout << "header: \'" << bufo << "\' bufo = \'" << bufo << "\' ";
1905    //cout << strncmp( buf, name, strlen(name) ) << endl ;
1906  }
1907  if ( strncmp( buf, "END", 3 ) == 0 ) {
1908    //cerr << "NROFITSDataset::readHeader()  keyword " << name << " not found." << endl ;
1909    status = -1 ;
1910    return status ;
1911  }
1912  string str( buf ) ;
1913  int pos1 = str.find( '=' ) + 1 ;
1914  int pos2 = str.find( '/' ) ;
1915  //cout << "string: " << str << endl ;
1916  //cout << "value:  " << str.substr( pos1, pos2 - pos1 ).c_str() << endl ;
1917  v = atof( str.substr( pos1, pos2 - pos1 ).c_str() ) ;
1918  //cout << "v = " << v << endl ;
1919
1920  return status ;
1921}
1922
1923int NROFITSDataset::readTable( char *v, const char *name, size_t clen, int idx )
1924{
1925  //
1926  // Read 'name' attribute defined as char from the idx-th row
1927  // of the FITS Scan Record
1928  //
1929  int status = movePointer( name, idx ) ;
1930  if ( status < 0 )
1931    return status ;
1932
1933  map<string, FieldProperty>::iterator iter = properties_.find(string(name));
1934  if (iter == properties_.end())
1935    return -1;
1936
1937  size_t xsize = iter->second.size;
1938
1939  // read data
1940  if ( xsize < clen ) {
1941    std::size_t retval = fread( v, 1, xsize, fp_ ) ;
1942    if (retval < xsize) {
1943      LogIO os(LogOrigin("NROFITSDataset", "readTable(char *)", WHERE));
1944      os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
1945    }
1946    //v[xsize] = '\0' ;
1947  }
1948  else if (clen > 0) {
1949    std::size_t retval = fread( v, 1, clen - 1, fp_ ) ;
1950    if (retval < clen - 1) {
1951      LogIO os(LogOrigin("NROFITSDataset", "readTable(char *)", WHERE));
1952      os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
1953    }
1954    //v[clen-1] = '\0' ;
1955  }
1956  else {
1957    status = -1;
1958  }
1959
1960  return status ;
1961}
1962
1963int NROFITSDataset::readTable( int &v, const char *name, int b, int idx )
1964{
1965  //
1966  // Read 'name' attribute defined as int from the idx-th row
1967  // of the FITS Scan Record
1968  //
1969  int status = movePointer( name, idx ) ;
1970  if ( status < 0 )
1971    return status ;
1972
1973  // read data
1974  std::size_t retval = fread( &v, sizeof(int), 1, fp_ ) ;
1975  if (retval < 1) {
1976    LogIO os(LogOrigin("NROFITSDataset", "readTable(int)", WHERE));
1977    os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
1978  }
1979  if ( b == 0 )
1980    convertEndian( v ) ;
1981 
1982  return status ;
1983}
1984
1985int NROFITSDataset::readTable( float &v, const char *name, int b, int idx )
1986{
1987  //
1988  // Read 'name' attribute defined as float from the idx-th row
1989  // of the FITS Scan Record
1990  //
1991  int status = movePointer( name, idx ) ;
1992  if ( status < 0 )
1993    return status ;
1994
1995  // read data
1996  std::size_t retval = fread( &v, sizeof(float), 1, fp_ ) ;
1997  if (retval < 1) {
1998    LogIO os(LogOrigin("NROFITSDataset", "readTable(float)", WHERE));
1999    os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2000  }
2001  if ( b == 0 )
2002    convertEndian( v ) ;
2003
2004  return status ;
2005}
2006
2007int NROFITSDataset::readTable( double &v, const char *name, int b, int idx )
2008{
2009  //
2010  // Read 'name' attribute defined as double from the idx-th row
2011  // of the FITS Scan Record
2012  //
2013  int status = movePointer( name, idx ) ;
2014  if ( status < 0 )
2015    return status ;
2016
2017  // read data
2018  std::size_t retval = fread( &v, sizeof(double), 1, fp_ ) ;
2019  if (retval < 1) {
2020    LogIO os(LogOrigin("NROFITSDataset", "readTable(double)", WHERE));
2021    os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2022  }
2023  if ( b == 0 )
2024    convertEndian( v ) ; 
2025
2026  return status ;
2027}
2028
2029int NROFITSDataset::readTable( vector<char *> &v, const char *name, int idx )
2030{
2031  //
2032  // Read 'name' attribute defined as char array from the FITS Scan Record
2033  //
2034  int status = movePointer( name, idx ) ;
2035  if ( status < 0 )
2036    return status ;
2037
2038  map<string, FieldProperty>::iterator iter = properties_.find(string(name));
2039  if (iter == properties_.end())
2040    return -1;
2041
2042  size_t xsize = iter->second.size;
2043
2044  for ( unsigned int i = 0 ; i < v.size() ; i++ ) {
2045    size_t clen = strlen( v[i] ) ;
2046    if ( clen > xsize ) {
2047      std::size_t retval = fread( v[i], 1, xsize, fp_ ) ;
2048      if (retval < xsize) {
2049        LogIO os(LogOrigin("NROFITSDataset", "readTable(vector<char *>)", WHERE));
2050        os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2051      }
2052      //v[i][xsize] = '\0' ;
2053    }
2054    else {
2055      std::size_t retval = fread( v[i], 1, clen, fp_ ) ;
2056      if (retval < clen) {
2057        LogIO os(LogOrigin("NROFITSDataset", "readTable(vector<char *>)", WHERE));
2058        os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2059      }
2060      //v[i][clen-1] = '\0' ;
2061    }
2062    //cout << "v[" << i << "] = " << v[i] << endl ;
2063  }
2064
2065  return status ;
2066}
2067
2068int NROFITSDataset::readTable( vector<int> &v, const char *name, int b, int idx )
2069{
2070  //
2071  // Read 'name' attribute defined as int array from the FITS Scan Record
2072  //
2073  int status = movePointer( name, idx ) ;
2074  if ( status < 0 )
2075    return status ;
2076
2077  for ( unsigned int i = 0 ; i < v.size() ; i++ ) {
2078    std::size_t retval = fread( &v[i], sizeof(int), 1, fp_ ) ;
2079    if (retval < 1) {
2080      LogIO os(LogOrigin("NROFITSDataset", "readTable(vector<int>)", WHERE));
2081      os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2082    }
2083    if ( b == 0 )
2084      convertEndian( v[i] ) ;
2085    //cout << "v[" << i << "] = " << v[i] << endl ;
2086  }
2087
2088  return status ;
2089}
2090
2091int NROFITSDataset::readTable( vector<float> &v, const char *name, int b, int idx )
2092{
2093  //
2094  // Read 'name' attribute defined as float array from the FITS Scan Record
2095  //
2096  int status = movePointer( name, idx ) ;
2097  if ( status < 0 )
2098    return status ;
2099
2100  for ( unsigned int i = 0 ; i < v.size() ; i++ ) {
2101    std::size_t retval = fread( &v[i], sizeof(float), 1, fp_ ) ;
2102    if (retval < 1) {
2103      LogIO os(LogOrigin("NROFITSDataset", "readTable(vector<float>)", WHERE));
2104      os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2105    }
2106    if ( b == 0 )
2107      convertEndian( v[i] ) ;
2108    //cout << "v[" << i << "] = " << v[i] << endl ;
2109  }
2110
2111  return status ;
2112}
2113
2114int NROFITSDataset::readTable( vector<double> &v, const char *name, int b, int idx )
2115{
2116  //
2117  // Read 'name' attribute defined as double array from the FITS Scan Record
2118  //
2119  int status = movePointer( name, idx ) ;
2120  if ( status < 0 )
2121    return status ;
2122
2123  for ( unsigned int i = 0 ; i < v.size() ; i++ ) {
2124    std::size_t retval = fread( &v[i], sizeof(double), 1, fp_ ) ;
2125    if (retval < 1) {
2126      LogIO os(LogOrigin("NROFITSDataset", "readTable(vector<double>)", WHERE));
2127      os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2128    }
2129    if ( b == 0 )
2130      convertEndian( v[i] ) ;
2131    //cout << "v[" << i << "] = " << v[i] << endl ;
2132  }
2133
2134  return status ;
2135}
2136
2137int NROFITSDataset::readColumn( vector<string> &v, const char *name, int idx )
2138{
2139  //
2140  // Read idx-th column of ARRYTP-dependent 'name' attributes
2141  // defined as char array from the FITS Scan Record
2142  //
2143  int status = movePointer( name ) ;
2144  if ( status < 0 )
2145    return status ;
2146
2147  map<string, FieldProperty>::iterator iter = properties_.find(string(name));
2148  if (iter == properties_.end())
2149    return -1;
2150
2151  size_t xsize = iter->second.size;
2152
2153  for ( unsigned int i = 0 ; i < v.size() ; i++ ) {
2154    int offset = scanLen_ * arrayid_[i] + xsize * idx ;
2155    fseek( fp_, offset, SEEK_CUR ) ;
2156//     int clen = (int)strlen( v[i] ) ;
2157//     if ( clen > xsize ) {
2158//       std::size_t retval = fread( v[i], 1, xsize, fp_ ) ;
2159//       //v[i][xsize] = '\0' ;
2160//     }
2161//     else {
2162//       std::size_t retval = fread( v[i], 1, clen-1, fp_ ) ;
2163//       //v[i][clen-1] = '\0' ;
2164//     }
2165    char c[xsize+1] ;
2166    std::size_t retval = fread( c, 1, xsize, fp_ ) ;
2167    if (retval < xsize) {
2168      LogIO os(LogOrigin("NROFITSDataset", "readColumn(string)", WHERE));
2169      os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2170    }
2171    c[xsize] = '\0' ;
2172    v[i] = string( c ) ;
2173    //cout << "v[" << i << "] = \'" << v[i] << "\'" << endl ;
2174    fseek( fp_, -xsize-offset, SEEK_CUR ) ;
2175  }
2176
2177  return status ;
2178}
2179
2180int NROFITSDataset::readColumn( vector<int> &v, const char *name, int b, int idx )
2181{
2182  //
2183  // Read idx-th column of ARRYTP-dependent 'name' attributes
2184  // defined as int array from the FITS Scan Record
2185  //
2186  int status = movePointer( name ) ;
2187  if ( status < 0 )
2188    return status ;
2189
2190  for ( unsigned int i = 0 ; i < v.size() ; i++ ) {
2191    int offset = scanLen_ * arrayid_[i] + sizeof(int) * idx ;
2192    fseek( fp_, offset, SEEK_CUR ) ;
2193    std::size_t retval = fread( &v[i], sizeof(int), 1, fp_ ) ;
2194    if (retval < 1) {
2195      LogIO os(LogOrigin("NROFITSDataset", "readColumn(int)", WHERE));
2196      os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2197    }
2198    if ( b == 0 )
2199      convertEndian( v[i] ) ;
2200    //cout << "v[" << i << "] = " << v[i] << endl ;
2201    fseek( fp_, -sizeof(int)-offset, SEEK_CUR ) ;
2202  }
2203
2204  return status ;
2205}
2206
2207int NROFITSDataset::readColumn( vector<float> &v, const char *name, int b, int idx )
2208{
2209  //
2210  // Read idx-th column of ARRYTP-dependent 'name' attributes
2211  // defined as float array from the FITS Scan Record
2212  //
2213  int status = movePointer( name ) ;
2214  if ( status < 0 )
2215    return status ;
2216
2217  for ( unsigned int i = 0 ; i < v.size() ; i++ ) {
2218    int offset = scanLen_ * arrayid_[i] + sizeof(float) * idx ;
2219    fseek( fp_, offset, SEEK_CUR ) ;
2220    std::size_t retval = fread( &v[i], 1, sizeof(float), fp_ ) ;
2221    if (retval < 1) {
2222      LogIO os(LogOrigin("NROFITSDataset", "readColumn(float)", WHERE));
2223      os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2224    }
2225    if ( b == 0 )
2226      convertEndian( v[i] ) ;
2227    //cout << "v[" << i << "] = " << v[i] << endl ;
2228    fseek( fp_, -sizeof(float)-offset, SEEK_CUR ) ;
2229  }
2230
2231  return status ;
2232}
2233
2234int NROFITSDataset::readColumn( vector<double> &v, const char *name, int b, int idx )
2235{
2236  //
2237  // Read idx-th column of ARRYTP-dependent 'name' attributes
2238  // defined as double array from the FITS Scan Record
2239  //
2240  int status = movePointer( name ) ;
2241  if ( status < 0 )
2242    return status ;
2243
2244  for ( unsigned int i = 0 ; i < v.size() ; i++ ) {
2245    int offset = scanLen_ * arrayid_[i] + sizeof(double) * idx ;
2246    fseek( fp_, offset, SEEK_CUR ) ;
2247    std::size_t retval = fread( &v[i], 1, sizeof(double), fp_ ) ;
2248    if (retval < 1) {
2249      LogIO os(LogOrigin("NROFITSDataset", "readColumn(double)", WHERE));
2250      os << LogIO::SEVERE << "Failed to read binary table" << LogIO::EXCEPTION;
2251    }
2252    if ( b == 0 )
2253      convertEndian( v[i] ) ;
2254    //cout << "offset = " << offset << ", v[" << i << "] = " << v[i] << endl ;
2255    fseek( fp_, -sizeof(double)-offset, SEEK_CUR ) ;
2256  }
2257
2258//   //cout << "v: " << endl ;
2259//   for ( vector<double>::iterator i = v.begin() ; i != v.end() ; i++ )
2260//     //cout << *i << " " ;
2261//   //cout << endl ;
2262 
2263  return status ;
2264}
2265
2266uInt NROFITSDataset::getArrayId( string type )
2267{
2268  uInt ib = 99;
2269  uInt len0 = type.size();
2270  for (uInt i = 0 ; i < arrayid_.size() ; i++) {
2271    uInt len = ARYTP[i].size();
2272    if ( len0 == len && type.compare( 0, len, ARYTP[i], 0, len ) == 0 ) {
2273      ib = i ;
2274      break ;
2275    }
2276  }
2277  return ib ;
2278}
2279
2280double NROFITSDataset::getStartIntTime( int i )
2281{
2282  double v ;
2283  readTable( v, "MJDST", same_, i ) ;
2284  return v/86400.0 ;
2285}
2286
2287double NROFITSDataset::getScanTime( int i )
2288{
2289  double startTime = getStartIntTime( i ) ;
2290  double interval = getIPTIM() ;
2291  interval /= 86400.0 ;
2292  return startTime+0.5*interval ;
2293}
2294
2295uInt NROFITSDataset::getPolNo( int irow )
2296{
2297  char rx[9] ;
2298  readTable( rx, "RX", 8, irow ) ;
2299  rx[8] = '\0' ;
2300  //cout << rx << endl ;
2301  return polNoFromRX( rx ) ;
2302}
2303
2304int NROFITSDataset::movePointer( const char *name, int idx )
2305{
2306  // find offset
2307  long offset = getOffset( name ) ;
2308  if ( offset == -1 ) {
2309    //cerr << "Error, " << name << " is not found in the name list." << endl ;
2310    return -1 ;
2311  }
2312
2313  offset += (long)(idx * scanLen_) ;
2314
2315  //cout << "offset for " << name << " is " << offset << " bytes." << endl ;
2316  fseek( fp_, FITS_HEADER_SIZE+offset, SEEK_SET ) ;
2317
2318  return 0 ;
2319}
Note: See TracBrowser for help on using the repository browser.