source: trunk/src/SDReader.cc @ 16

Last change on this file since 16 was 16, checked in by mmarquar, 20 years ago

Updated data container. Changed the axis order in the spectrum/flag arrays to [nBeam,nIF,nPol,nChan]

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.6 KB
Line 
1//#---------------------------------------------------------------------------
2//# SDReader.cc: A class to read single dish spectra from SDFITS, RPFITS
3//#---------------------------------------------------------------------------
4//# Copyright (C) 2004
5//# Malte Marquarding, ATNF
6//#
7//# This program is free software; you can redistribute it and/or modify it
8//# under the terms of the GNU General Public License as published by the Free
9//# Software Foundation; either version 2 of the License, or (at your option)
10//# any later version.
11//#
12//# This program is distributed in the hope that it will be useful, but
13//# WITHOUT ANY WARRANTY; without even the implied warranty of
14//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
15//# Public License for more details.
16//#
17//# You should have received a copy of the GNU General Public License along
18//# with this program; if not, write to the Free Software Foundation, Inc.,
19//# 675 Massachusetts Ave, Cambridge, MA 02139, USA.
20//#
21//# Correspondence concerning this software should be addressed as follows:
22//#        Internet email: Malte.Marquarding@csiro.au
23//#        Postal address: Malte Marquarding,
24//#                        Australia Telescope National Facility,
25//#                        P.O. Box 76,
26//#                        Epping, NSW, 2121,
27//#                        AUSTRALIA
28//#
29//# $Id:
30//#---------------------------------------------------------------------------
31#include <atnf/PKSIO/PKSreader.h>
32#include <aips/Quanta/MVTime.h>
33#include "SDContainer.h"
34#include "SDReader.h"
35
36using namespace atnf_sd;
37
38void SDHeader::print() const {
39  MVTime mvt(this->utc);
40
41  cout << "Observer: " << this->observer << endl
42       << "Project: " << this->project << endl
43       << "Obstype: " << this->obstype << endl
44       << "Antenna: " << this->antennaname << endl
45       << "Ant. Position: " << this->antennaposition << endl
46       << "Equinox: " << this->equinox << endl
47       << "Freq. ref.: " << this->freqref << endl
48       << "Ref. frequency: " << this->reffreq << endl
49       << "Bandwidth: "  << this->bandwidth << endl
50       << "Time (utc): "
51       << mvt.string()
52       << endl;
53  //setprecision(10) << this->utc << endl;
54}
55
56
57SDReader::SDReader() :
58  reader_(0),
59  table_(new SDMemTable()) {
60  cursor_ = 0;
61  timestamp_ = 0;
62}
63
64SDReader::SDReader(CountedPtr<SDMemTable> tbl) :
65  reader_(0),
66  table_(tbl) {
67  cursor_ = 0;
68  timestamp_ = 0;
69}
70
71SDReader::~SDReader() {
72  delete reader_;reader_ =0;
73}
74
75void SDReader::reset() {
76  cursor_ = 0;
77  timestamp_ = 0;
78  open(filename_);
79}
80
81void SDReader::open(const std::string& filename) {
82  if (reader_) delete reader_; reader_ = 0;
83  Bool   haveBase, haveSpectra, haveXPol;
84  //Int    nChan, nIF, nPol;
85  String inName(filename);
86  String format;
87  Vector<Bool> beams;
88  if ((reader_ = getPKSreader(inName, 0, False, format, beams, nIF_,
89                              nChan_, nPol_, haveBase, haveSpectra,
90                              haveXPol)) == 0)  {
91    cerr << "PKSreader failed" << endl;
92  }
93  if (!haveSpectra) {
94    delete reader_;
95    reader_ = 0;
96    cerr << "Spectral data absent." << endl;
97    return;
98  }
99  nBeam_ = beams.nelements();
100  cout << "Reading " + format + " format from " + inName << endl;
101  cout << "nChannels = " << nChan_ << ", " << "nPol = " << nPol_ << endl
102       << "nIF = " << nIF_ << endl
103       << "nBeams = " << nBeam_ << endl;
104 
105  // Get basic parameters.
106  header_ = SDHeader();
107  header_.nchan = nChan_;
108  header_.npol = nPol_;
109  header_.nbeam = nBeam_;
110
111  //cerr << " getting header ..." << endl;
112  Int status = reader_->getHeader(header_.observer, header_.project,
113                                  header_.antennaname, header_.antennaposition,
114                                  header_.obstype,header_.equinox,
115                                  header_.freqref,
116                                  header_.utc, header_.reffreq,
117                                  header_.bandwidth);
118  if (status) {
119    delete reader_;
120    reader_ = 0;
121    cerr << "Failed to get data description." << endl;
122    return;
123  }
124  header_.print(); 
125  if ((header_.obstype).matches("*SW*")) {
126    // need robust way here - probably read ahead of next timestamp
127    cout << "Header indicates frequency switched observation.\n"
128      "setting # of IFs = 1 " << endl;
129    nIF_ = 1;
130  }
131  header_.nif = nIF_;
132  // Apply selection criteria.
133  cerr << "applying selection criteria..." << endl;
134  Vector<Int> start(nIF_, 1);
135  Vector<Int> end(nIF_, 0);
136  Vector<Int> ref;
137  Vector<Bool> beamSel(nBeam_,True);
138  Vector<Bool> IFsel(nIF_,True);
139  reader_->select(beamSel, IFsel, start, end, ref, True, haveXPol);
140  cerr << "open finished" << endl;
141}
142
143int SDReader::read(const std::vector<int>& seq) {
144  cerr << "SDReader::read" << endl;
145  int status = 0; 
146 
147  Int    beamNo, IFno, refBeam, scanNo;
148  Float  azimuth, elevation, focusAxi, focusRot, focusTan,
149    humidity, parAngle, pressure, temperature, windAz, windSpeed;
150  Double bandwidth, freqInc, interval, mjd, refFreq, srcVel;
151  String          fieldName, srcName, tcalTime;
152  Vector<Float>   calFctr, sigma, tcal, tsys;
153  Matrix<Float>   baseLin, baseSub;
154  Vector<Double>  direction(2), scanRate(2), srcDir(2), srcPM(2);
155  Matrix<Float>   spectra;
156  Matrix<uChar>   flagtra;
157  Complex         xCalFctr;
158  Vector<Complex> xPol;
159  mjd = 0;
160  uInt n = seq.size();
161  cerr <<  header_.nif << ", " << header_.nbeam << endl;
162  uInt stepsize = header_.nif*header_.nbeam;
163  cerr << "SDReader stepsize = " << stepsize << endl;
164  uInt scanid = 0;
165  String prevName = "_noname_";// temporary until scanid is present
166  uInt seqi = 0;
167  //SDFrequencyTable sdft();
168  Bool getAll = False;
169  if (seq[n-1] == -1) getAll = True;
170  while ( (cursor_ <= seq[n-1]) || getAll) {
171    // only needs to be create if in seq
172    SDContainer sc(header_.nbeam,header_.nif,header_.npol,header_.nchan);
173
174    // iterate over one correlator integration cycle = nBeam*nIF
175    for (uInt row=0; row < stepsize; row++) {
176      // add scanid from GROUP field -- this will remove the need for
177      // stepsize as well
178      // spectra(nChan,nPol)!!!
179      status = reader_->read(scanNo, mjd, interval, fieldName, srcName,
180                             srcDir, srcPM, srcVel, IFno, refFreq,
181                             bandwidth, freqInc, tcal, tcalTime,
182                             azimuth, elevation, parAngle, focusAxi,
183                             focusTan, focusRot, temperature, pressure,
184                             humidity, windSpeed, windAz, refBeam,
185                             beamNo, direction, scanRate,
186                             tsys, sigma, calFctr, baseLin, baseSub,
187                             spectra, flagtra, xCalFctr, xPol);         
188      if (status) {
189        if (status == -1) {
190          // EOF.
191          if (row < stepsize-1) cerr << "incomplete integration data." << endl;
192          cerr << "EOF" << endl;
193          return status;
194        }
195      }     
196      // if in the given list
197      if (cursor_ == seq[seqi]) {
198        // add integration cycle
199        if (row==0) {
200          //add invariant info: scanNo, mjd, interval, fieldName,
201          //srcName, azimuth, elevation, parAngle, focusAxi, focusTan,
202          //focusRot, temperature, pressure, humidity, windSpeed,
203          //windAz  srcDir, srcPM, srcVel
204          sc.timestamp = mjd;
205          sc.interval = interval;         
206          sc.sourcename = srcName;
207        }
208        // add specific info
209        // IFno beamNo are 1-relative
210        // refPix = nChan/2+1 in  Integer arith.!       
211        //uInt refPix = header_.nchan/2+1;
212        //uInt frqslot = sdft.addFrequency(refPix, refFreq, freqInc);
213
214        if ( srcName != prevName ) {//temp
215          scanid++;//temp
216          prevName = srcName;//temp
217        }//temp
218        sc.scanid = scanid;
219        //sc.setFrequencyMap(frqslot,IFno-1);
220        sc.setSpectrum(spectra, beamNo-1, IFno-1);
221        sc.setFlags(flagtra,  beamNo-1, IFno-1);
222        sc.setTsys(tsys, beamNo-1, IFno-1);
223        //sc.addPointing(direction, beamNo-1);
224      }
225    }
226    if (cursor_ == seq[seqi]) {
227      // insert container into table/list
228      table_->putSDContainer(sc);
229      seqi++;// next in list
230    }
231    cursor_++;// increment position in file
232  }
233  return status;
234}
Note: See TracBrowser for help on using the repository browser.