source: trunk/src/SDReader.cc @ 125

Last change on this file since 125 was 125, checked in by mar637, 19 years ago

Moved to casa namespace.
Adjusted the copyright to be ATNF.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.9 KB
Line 
1//#---------------------------------------------------------------------------
2//# SDReader.cc: A class to read single dish spectra from SDFITS, RPFITS
3//#---------------------------------------------------------------------------
4//# Copyright (C) 2004
5//# 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 <casa/Exceptions.h>
32#include <atnf/PKSIO/PKSreader.h>
33
34#include "SDReader.h"
35
36using namespace casa;
37using namespace asap;
38
39SDReader::SDReader() :
40  reader_(0),
41  table_(new SDMemTable()) {
42  cursor_ = 0;
43}
44SDReader::SDReader(const std::string& filename) :
45  reader_(0),
46  table_(new SDMemTable()) {
47  cursor_ = 0;
48  open(filename);
49}
50
51SDReader::SDReader(CountedPtr<SDMemTable> tbl) :
52  reader_(0),
53  table_(tbl) {
54  cursor_ = 0;
55}
56
57SDReader::~SDReader() {
58  if (reader_) delete reader_; reader_ = 0;
59}
60
61void SDReader::reset() {
62  cursor_ = 0;
63  table_ = new SDMemTable();
64  if (reader_) delete reader_; reader_ = 0;
65  // re-create the reader
66  Bool   haveBase, haveSpectra, haveXPol;
67  String format;
68  Vector<Bool> beams;
69  if ((reader_ = getPKSreader(filename_, 0, False, format, beams, nIF_,
70                              nChan_, nPol_, haveBase, haveSpectra,
71                              haveXPol)) == 0)  {
72    throw(AipsError("PKSreader failed"));
73  }
74  // re-enter the header
75  table_->putSDHeader(header_);
76}
77
78void SDReader::close() {
79  cerr << "disabled" << endl;
80}
81
82void SDReader::open(const std::string& filename) {
83  if (reader_) delete reader_; reader_ = 0;
84  Bool   haveBase, haveSpectra, haveXPol;
85  String inName(filename);
86  filename_ = inName;
87  String format;
88  Vector<Bool> beams;
89  if ((reader_ = getPKSreader(inName, 0, False, format, beams, nIF_,
90                              nChan_, nPol_, haveBase, haveSpectra,
91                              haveXPol)) == 0)  {
92    throw(AipsError("PKSreader failed"));
93  }
94  if (!haveSpectra) {
95    delete reader_;
96    reader_ = 0;
97    throw(AipsError("No spectral data in file."));
98    return;
99  }
100  nBeam_ = beams.nelements();
101  // Get basic parameters.
102  if (haveXPol) {
103    cout << "Warning. Ignoring cross polarisation." << endl;
104    nPol_--;   
105  }
106  header_ = SDHeader();
107  header_.nchan = nChan_;
108  header_.npol = nPol_;
109  header_.nbeam = nBeam_;
110  Int status = reader_->getHeader(header_.observer, header_.project,
111                                  header_.antennaname, header_.antennaposition,
112                                  header_.obstype,header_.equinox,
113                                  header_.freqref,
114                                  header_.utc, header_.reffreq,
115                                  header_.bandwidth);
116  if (status) {
117    delete reader_;
118    reader_ = 0;
119    throw(AipsError("Failed to get header."));
120    return;
121  }
122  if ((header_.obstype).matches("*SW*")) {
123    // need robust way here - probably read ahead of next timestamp
124    cout << "Header indicates frequency switched observation.\n"
125      "setting # of IFs = 1 " << endl;
126    nIF_ = 1;
127  }
128  header_.nif = nIF_;
129  // Apply selection criteria.
130  Vector<Int> start(nIF_, 1);
131  Vector<Int> end(nIF_, 0);
132  Vector<Int> ref;
133  Vector<Bool> beamSel(nBeam_,True);
134  Vector<Bool> IFsel(nIF_,True);
135  reader_->select(beamSel, IFsel, start, end, ref, True, haveXPol);
136  table_->putSDHeader(header_);
137  frequencies_.setRefFrame(header_.freqref);
138  frequencies_.setEquinox(header_.equinox);
139}
140
141int SDReader::read(const std::vector<int>& seq) {
142  int status = 0;
143
144  Int    beamNo, IFno, refBeam, scanNo, cycleNo;
145  Float  azimuth, elevation, focusAxi, focusRot, focusTan,
146    humidity, parAngle, pressure, temperature, windAz, windSpeed;
147  Double bandwidth, freqInc, interval, mjd, refFreq, restFreq, srcVel;
148  String          fieldName, srcName, tcalTime;
149  Vector<Float>   calFctr, sigma, tcal, tsys;
150  Matrix<Float>   baseLin, baseSub;
151  Vector<Double>  direction(2), scanRate(2), srcDir(2), srcPM(2);
152  Matrix<Float>   spectra;
153  Matrix<uChar>   flagtra;
154  Complex         xCalFctr;
155  Vector<Complex> xPol;
156  uInt n = seq.size();
157
158  uInt stepsize = header_.nif*header_.nbeam;
159  //cerr << "SDReader stepsize = " << stepsize << endl;
160  uInt seqi = 0;
161  Bool getAll = False;
162  if (seq[n-1] == -1) getAll = True;
163  while ( (cursor_ <= seq[n-1]) || getAll) {
164    // only needs to be create if in seq
165    SDContainer sc(header_.nbeam,header_.nif,header_.npol,header_.nchan);
166
167    // iterate over one correlator integration cycle = nBeam*nIF
168    for (uInt row=0; row < stepsize; row++) {
169      // stepsize as well
170      // spectra(nChan,nPol)!!!
171      status = reader_->read(scanNo, cycleNo, mjd, interval, fieldName,
172                             srcName, srcDir, srcPM, srcVel, IFno, refFreq,
173                             bandwidth, freqInc, restFreq, tcal, tcalTime,
174                             azimuth, elevation, parAngle, focusAxi,
175                             focusTan, focusRot, temperature, pressure,
176                             humidity, windSpeed, windAz, refBeam,
177                             beamNo, direction, scanRate,
178                             tsys, sigma, calFctr, baseLin, baseSub,
179                             spectra, flagtra, xCalFctr, xPol);
180      if (status) {
181        if (status == -1) {
182          // EOF.
183          if (row < stepsize-1) cerr << "incomplete scan data.\n Probably means not all Beams/IFs/Pols within a scan a present." << endl;
184          //cerr << "EOF" << endl;
185          table_->putSDFreqTable(frequencies_);
186          return status;
187        }
188      }
189      // if in the given list
190      if (cursor_ == seq[seqi] || getAll) {
191        // add integration cycle
192        if (row==0) {
193          //add invariant info: scanNo, mjd, interval, fieldName,
194          //srcName, azimuth, elevation, parAngle, focusAxi, focusTan,
195          //focusRot, temperature, pressure, humidity, windSpeed,
196          //windAz  srcDir, srcPM, srcVel
197          sc.timestamp = mjd;
198          sc.interval = interval;
199          sc.sourcename = srcName;
200          sc.fieldname = fieldName;
201          sc.azimuth = azimuth;
202          sc.elevation = elevation;
203        }
204        // add specific info
205        // IFno beamNo are 1-relative
206        // refPix = nChan/2+1 in  Integer arith.!
207        Int refPix = header_.nchan/2+1;
208        Int frqslot = frequencies_.addFrequency(refPix, refFreq, freqInc);
209        sc.setFrequencyMap(frqslot,IFno-1);
210        sc.tcal[0] = tcal[0];sc.tcal[1] = tcal[1];
211        sc.tcaltime = tcalTime;
212        sc.parangle = parAngle;
213        sc.refbeam = refBeam;
214        sc.scanid = scanNo-1;//make it 0-based
215        sc.setSpectrum(spectra, beamNo-1, IFno-1);
216        sc.setFlags(flagtra,  beamNo-1, IFno-1);
217        sc.setTsys(tsys, beamNo-1, IFno-1);
218        sc.setDirection(direction, beamNo-1);
219      }
220    }
221    if (cursor_ == seq[seqi] || getAll) {
222      // insert container into table/list
223      table_->putSDContainer(sc);
224      seqi++;// next in list
225    }
226    cursor_++;// increment position in file
227  }
228  table_->putSDFreqTable(frequencies_);
229  return status;
230}
Note: See TracBrowser for help on using the repository browser.