source: trunk/src/SDReader.cc @ 79

Last change on this file since 79 was 79, checked in by mar637, 20 years ago

Added support of source direction.

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