//#--------------------------------------------------------------------------- //# MBFITSreader.h: ATNF single-dish RPFITS reader. //#--------------------------------------------------------------------------- //# livedata - processing pipeline for single-dish, multibeam spectral data. //# Copyright (C) 2000-2009, Australia Telescope National Facility, CSIRO //# //# This file is part of livedata. //# //# livedata is free software: you can redistribute it and/or modify it under //# the terms of the GNU General Public License as published by the Free //# Software Foundation, either version 3 of the License, or (at your option) //# any later version. //# //# livedata is distributed in the hope that it will be useful, but WITHOUT //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for //# more details. //# //# You should have received a copy of the GNU General Public License along //# with livedata. If not, see . //# //# Correspondence concerning livedata may be directed to: //# Internet email: mcalabre@atnf.csiro.au //# Postal address: Dr. Mark Calabretta //# Australia Telescope National Facility, CSIRO //# PO Box 76 //# Epping NSW 1710 //# AUSTRALIA //# //# http://www.atnf.csiro.au/computing/software/livedata.html //# $Id: MBFITSreader.h,v 19.23 2009-09-29 07:33:38 cal103 Exp $ //#--------------------------------------------------------------------------- //# The MBFITSreader class reads single dish RPFITS files (such as Parkes //# Multibeam MBFITS files). //# //# Original: 2000/07/28 Mark Calabretta //#--------------------------------------------------------------------------- #ifndef ATNF_MBFITSREADER_H #define ATNF_MBFITSREADER_H #include #include using namespace std; // // ATNF single-dish RPFITS reader. // class MBFITSreader : public FITSreader { public: // Default constructor; position interpolation codes are: // 0: no interpolation, // 1: correct interpolation, // 2: pksmbfits interpolation. MBFITSreader(const int retry = 0, const int interpolate = 1); // Destructor. virtual ~MBFITSreader(); // Open the RPFITS file for reading. virtual int open( char *rpname, int &nBeam, int* &beams, int &nIF, int* &IFs, int* &nChan, int* &nPol, int* &haveXPol, int &haveBase, int &haveSpectra, int &extraSysCal); // Get parameters describing the data. virtual int getHeader( char observer[32], char project[32], char telescope[32], double antPos[3], char obsType[32], char bunit[32], float &equinox, char radecsys[32], char dopplerFrame[32], char datobs[32], double &utc, double &refFreq, double &bandwidth); // Get frequency parameters for each IF. virtual int getFreqInfo( int &nIF, double* &startFreq, double* &endFreq); // Find the range of the data selected in time and position. virtual int findRange( int &nRow, int &nSel, char dateSpan[2][32], double utcSpan[2], double* &positions); // Read the next data record. virtual int read(MBrecord &record); // Close the RPFITS file. virtual void close(void); private: // RPFITSIN subroutine arguments. int cBaseline, cFlag, cBin, cIFno, cSrcNo; float cUTC, cU, cV, cW, *cVis, *cWgt; char cDateObs[12]; int *cBeamSel, *cChanOff, cFirst, *cIFSel, cInterp, cIntTime, cMBopen, cMopra, cNBeamSel, cNBin, cRetry, cSimulIF, cSUpos, *cXpolOff; // The data has to be bufferred to allow positions to be interpolated. int cEOF, cEOS, cFlushBin, cFlushIF, cFlushing; double *cPosUTC; MBrecord *cBuffer; // Scan and cycle number bookkeeping. int cCycleNo, cScanNo; double cPrevUTC; // Read the next data record from the RPFITS file. int rpget(int syscalonly, int &EOS); int rpfitsin(int &jstat); // Check and, if necessary, repair a position timestamp. int cCode5, cNRate; double cAvRate[2]; int fixw(const char *datobs, int cycleNo, int beamNo, double avRate[2], double thisRA, double thisDec, double thisUTC, double nextRA, double nextDec, float &nextUTC); // Subtract two UTCs (s). double utcDiff(double utc1, double utc2); // Compute and apply the scan rate corrected for grid convergence. double cRA0, cDec0; void scanRate(double ra0, double dec0, double ra1, double dec1, double ra2, double dec2, double dt, double &raRate, double &decRate); void applyRate(double ra0, double dec0, double ra1, double dec1, double raRate, double decRate, double dt, double &ra2, double &dec2); void eulerx(double lng0, double lat0, double phi0, double theta, double phi, double &lng1, double &lat1); }; #endif