| 1 | //#--------------------------------------------------------------------------- | 
|---|
| 2 | //# MBFITSreader.h: ATNF single-dish RPFITS reader. | 
|---|
| 3 | //#--------------------------------------------------------------------------- | 
|---|
| 4 | //# livedata - processing pipeline for single-dish, multibeam spectral data. | 
|---|
| 5 | //# Copyright (C) 2000-2009, Australia Telescope National Facility, CSIRO | 
|---|
| 6 | //# | 
|---|
| 7 | //# This file is part of livedata. | 
|---|
| 8 | //# | 
|---|
| 9 | //# livedata is free software: you can redistribute it and/or modify it under | 
|---|
| 10 | //# the terms of the GNU General Public License as published by the Free | 
|---|
| 11 | //# Software Foundation, either version 3 of the License, or (at your option) | 
|---|
| 12 | //# any later version. | 
|---|
| 13 | //# | 
|---|
| 14 | //# livedata is distributed in the hope that it will be useful, but WITHOUT | 
|---|
| 15 | //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|---|
| 16 | //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | 
|---|
| 17 | //# more details. | 
|---|
| 18 | //# | 
|---|
| 19 | //# You should have received a copy of the GNU General Public License along | 
|---|
| 20 | //# with livedata.  If not, see <http://www.gnu.org/licenses/>. | 
|---|
| 21 | //# | 
|---|
| 22 | //# Correspondence concerning livedata may be directed to: | 
|---|
| 23 | //#        Internet email: mcalabre@atnf.csiro.au | 
|---|
| 24 | //#        Postal address: Dr. Mark Calabretta | 
|---|
| 25 | //#                        Australia Telescope National Facility, CSIRO | 
|---|
| 26 | //#                        PO Box 76 | 
|---|
| 27 | //#                        Epping NSW 1710 | 
|---|
| 28 | //#                        AUSTRALIA | 
|---|
| 29 | //# | 
|---|
| 30 | //# http://www.atnf.csiro.au/computing/software/livedata.html | 
|---|
| 31 | //# $Id: MBFITSreader.h,v 19.23 2009-09-29 07:33:38 cal103 Exp $ | 
|---|
| 32 | //#--------------------------------------------------------------------------- | 
|---|
| 33 | //# The MBFITSreader class reads single dish RPFITS files (such as Parkes | 
|---|
| 34 | //# Multibeam MBFITS files). | 
|---|
| 35 | //# | 
|---|
| 36 | //# Original: 2000/07/28 Mark Calabretta | 
|---|
| 37 | //#--------------------------------------------------------------------------- | 
|---|
| 38 |  | 
|---|
| 39 | #ifndef ATNF_MBFITSREADER_H | 
|---|
| 40 | #define ATNF_MBFITSREADER_H | 
|---|
| 41 |  | 
|---|
| 42 | #include <atnf/PKSIO/FITSreader.h> | 
|---|
| 43 | #include <atnf/PKSIO/MBrecord.h> | 
|---|
| 44 |  | 
|---|
| 45 | using namespace std; | 
|---|
| 46 |  | 
|---|
| 47 | // <summary> | 
|---|
| 48 | // ATNF single-dish RPFITS reader. | 
|---|
| 49 | // </summary> | 
|---|
| 50 |  | 
|---|
| 51 | class MBFITSreader : public FITSreader | 
|---|
| 52 | { | 
|---|
| 53 | public: | 
|---|
| 54 | // Default constructor; position interpolation codes are: | 
|---|
| 55 | //   0: no interpolation, | 
|---|
| 56 | //   1: correct interpolation, | 
|---|
| 57 | //   2: pksmbfits interpolation. | 
|---|
| 58 | MBFITSreader(const int retry = 0, const int interpolate = 1); | 
|---|
| 59 |  | 
|---|
| 60 | // Destructor. | 
|---|
| 61 | virtual ~MBFITSreader(); | 
|---|
| 62 |  | 
|---|
| 63 | // Open the RPFITS file for reading. | 
|---|
| 64 | virtual int open( | 
|---|
| 65 | char   *rpname, | 
|---|
| 66 | int    &nBeam, | 
|---|
| 67 | int*   &beams, | 
|---|
| 68 | int    &nIF, | 
|---|
| 69 | int*   &IFs, | 
|---|
| 70 | int*   &nChan, | 
|---|
| 71 | int*   &nPol, | 
|---|
| 72 | int*   &haveXPol, | 
|---|
| 73 | int    &haveBase, | 
|---|
| 74 | int    &haveSpectra, | 
|---|
| 75 | int    &extraSysCal); | 
|---|
| 76 |  | 
|---|
| 77 | // Get parameters describing the data. | 
|---|
| 78 | virtual int getHeader( | 
|---|
| 79 | char   observer[32], | 
|---|
| 80 | char   project[32], | 
|---|
| 81 | char   telescope[32], | 
|---|
| 82 | double antPos[3], | 
|---|
| 83 | char   obsType[32], | 
|---|
| 84 | char   bunit[32], | 
|---|
| 85 | float  &equinox, | 
|---|
| 86 | char   radecsys[32], | 
|---|
| 87 | char   dopplerFrame[32], | 
|---|
| 88 | char   datobs[32], | 
|---|
| 89 | double &utc, | 
|---|
| 90 | double &refFreq, | 
|---|
| 91 | double &bandwidth); | 
|---|
| 92 |  | 
|---|
| 93 | // Get frequency parameters for each IF. | 
|---|
| 94 | virtual int getFreqInfo( | 
|---|
| 95 | int     &nIF, | 
|---|
| 96 | double* &startFreq, | 
|---|
| 97 | double* &endFreq); | 
|---|
| 98 |  | 
|---|
| 99 | // Find the range of the data selected in time and position. | 
|---|
| 100 | virtual int findRange( | 
|---|
| 101 | int    &nRow, | 
|---|
| 102 | int    &nSel, | 
|---|
| 103 | char   dateSpan[2][32], | 
|---|
| 104 | double utcSpan[2], | 
|---|
| 105 | double* &positions); | 
|---|
| 106 |  | 
|---|
| 107 | // Read the next data record. | 
|---|
| 108 | virtual int read(MBrecord &record); | 
|---|
| 109 |  | 
|---|
| 110 | // Close the RPFITS file. | 
|---|
| 111 | virtual void close(void); | 
|---|
| 112 |  | 
|---|
| 113 | private: | 
|---|
| 114 | // RPFITSIN subroutine arguments. | 
|---|
| 115 | int   cBaseline, cFlag, cBin, cIFno, cSrcNo; | 
|---|
| 116 | float cUTC, cU, cV, cW, *cVis, *cWgt; | 
|---|
| 117 |  | 
|---|
| 118 | char   cDateObs[12]; | 
|---|
| 119 | int    *cBeamSel, *cChanOff, cFirst, *cIFSel, cInterp, cIntTime, cMBopen, | 
|---|
| 120 | cMopra, cNBeamSel, cNBin, cRetry, cSimulIF, cSUpos, *cXpolOff; | 
|---|
| 121 |  | 
|---|
| 122 | // The data has to be bufferred to allow positions to be interpolated. | 
|---|
| 123 | int    cEOF, cEOS, cFlushBin, cFlushIF, cFlushing; | 
|---|
| 124 | double *cPosUTC; | 
|---|
| 125 | MBrecord *cBuffer; | 
|---|
| 126 |  | 
|---|
| 127 | // Scan and cycle number bookkeeping. | 
|---|
| 128 | int    cCycleNo, cScanNo; | 
|---|
| 129 | double cPrevUTC; | 
|---|
| 130 |  | 
|---|
| 131 | // Read the next data record from the RPFITS file. | 
|---|
| 132 | int rpget(int syscalonly, int &EOS); | 
|---|
| 133 | int rpfitsin(int &jstat); | 
|---|
| 134 |  | 
|---|
| 135 | // Check and, if necessary, repair a position timestamp. | 
|---|
| 136 | int    cCode5, cNRate; | 
|---|
| 137 | double cAvRate[2]; | 
|---|
| 138 | int fixw(const char *datobs, int cycleNo, int beamNo, double avRate[2], | 
|---|
| 139 | double thisRA, double thisDec, double thisUTC, | 
|---|
| 140 | double nextRA, double nextDec, float &nextUTC); | 
|---|
| 141 |  | 
|---|
| 142 | // Subtract two UTCs (s). | 
|---|
| 143 | double utcDiff(double utc1, double utc2); | 
|---|
| 144 |  | 
|---|
| 145 | // Compute and apply the scan rate corrected for grid convergence. | 
|---|
| 146 | double cRA0, cDec0; | 
|---|
| 147 | void  scanRate(double ra0, double dec0, | 
|---|
| 148 | double ra1, double dec1, | 
|---|
| 149 | double ra2, double dec2, double dt, | 
|---|
| 150 | double &raRate, double &decRate); | 
|---|
| 151 | void applyRate(double ra0, double dec0, | 
|---|
| 152 | double ra1, double dec1, | 
|---|
| 153 | double raRate, double decRate, double dt, | 
|---|
| 154 | double &ra2, double &dec2); | 
|---|
| 155 | void eulerx(double lng0, double lat0, double phi0, double theta, | 
|---|
| 156 | double phi, double &lng1, double &lat1); | 
|---|
| 157 | }; | 
|---|
| 158 |  | 
|---|
| 159 | #endif | 
|---|