source: trunk/external/atnf/PKSIO/MBrecord.cc @ 1635

Last change on this file since 1635 was 1635, checked in by Malte Marquarding, 15 years ago

Update from livedata CVS

File size: 10.8 KB
Line 
1//#---------------------------------------------------------------------------
2//# MBrecord.cc: Class to store an MBFITS single-dish data record.
3//#---------------------------------------------------------------------------
4//# Copyright (C) 2000-2009
5//# Mark Calabretta, ATNF
6//#
7//# This library is free software; you can redistribute it and/or modify it
8//# under the terms of the GNU Library General Public License as published by
9//# the Free Software Foundation; either version 2 of the License, or (at your
10//# option) any later version.
11//#
12//# This library is distributed in the hope that it will be useful, but WITHOUT
13//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14//# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
15//# License for more details.
16//#
17//# You should have received a copy of the GNU Library General Public License
18//# along with this library; if not, write to the Free Software Foundation,
19//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
20//#
21//# Correspondence concerning this software should be addressed as follows:
22//#        Internet email: mcalabre@atnf.csiro.au.
23//#        Postal address: Dr. Mark Calabretta,
24//#                        Australia Telescope National Facility,
25//#                        P.O. Box 76,
26//#                        Epping, NSW, 2121,
27//#                        AUSTRALIA
28//#
29//# $Id: MBrecord.cc,v 19.13 2009-03-24 06:15:33 cal103 Exp $
30//#---------------------------------------------------------------------------
31//# The MBrecord class stores an MBFITS single-dish data record.
32//#
33//# Original: 2000/08/01 Mark Calabretta, ATNF
34//#---------------------------------------------------------------------------
35
36#include <atnf/PKSIO/MBrecord.h>
37
38#include <string.h>
39
40//--------------------------------------------------------- MBrecord::MBrecord
41
42// Default constructor.
43
44MBrecord::MBrecord(int nif)
45{
46  // Construct arrays for the required number of IFs.
47  cNIF = 0;
48  setNIFs(nif);
49
50  scanNo  = 0;
51  cycleNo = 0;
52  beamNo  = 0;
53  pCode   = 0;
54  rateAge = 0.0f;
55  raRate  = 0.0f;
56  decRate = 0.0f;
57  nIF     = 0;
58}
59
60//-------------------------------------------------------- MBrecord::~MBrecord
61
62// Destructor.
63
64MBrecord::~MBrecord()
65{
66  free();
67}
68
69//---------------------------------------------------------- MBrecord::setNIFs
70
71// Expand arrays if necessary to accomodate the required number of IFs; never
72// contracts them.
73
74void MBrecord::setNIFs(int nif)
75{
76  if (nif < 1) return;
77
78  if (cNIF < nif) {
79    // Too few IFs, free everything.
80    if (cNIF) free();
81  }
82
83  if (cNIF == 0) {
84    IFno     = new short[nif];
85    nChan    = new int[nif];
86    nPol     = new int[nif];
87    fqRefPix = new float[nif];
88    fqRefVal = new double[nif];
89    fqDelt   = new double[nif];
90
91    tsys     = new float[nif][2];
92    calfctr  = new float[nif][2];
93    xcalfctr = new float[nif][2];
94    baseLin  = new float[nif][2][2];
95    baseSub  = new float[nif][2][24];
96    spectra  = new float*[nif];
97    flagged  = new unsigned char*[nif];
98    xpol     = new float*[nif];
99    tcal     = new float[nif][2];
100
101    cNProd   = new int[nif];
102    cNXPol   = new int[nif];
103
104    for (int iIF = 0; iIF < nif; iIF++) {
105      spectra[iIF] = 0x0;
106      flagged[iIF] = 0x0;
107      xpol[iIF]    = 0x0;
108
109      cNProd[iIF] = 0;
110      cNXPol[iIF] = 0;
111    }
112
113    // The number we can accomodate, may exceed the number we have.
114    cNIF = nif;
115  }
116}
117
118//--------------------------------------------------------- MBrecord::allocate
119
120// Ensure there is enough storage for the specified number of spectral
121// products (channels x polarizations) for IF with array index iIF (i.e.
122// the actual IF number is IFno[iIF]).  Expands arrays if necessary but
123// never contracts.
124
125void MBrecord::allocate(
126        int iIF,
127        int nprod,
128        int nxpol)
129{
130  // Don't mess with storage we didn't allocate.
131  if (cNProd[iIF] || spectra[iIF] == 0x0) {
132    if (cNProd[iIF] < nprod) {
133      if (cNProd[iIF]) {
134        // Free storage previously allocated.
135        delete [] spectra[iIF];
136        delete [] flagged[iIF];
137      }
138
139      // Reallocate data storage.
140      cNProd[iIF]  = nprod;
141      spectra[iIF] = new float[nprod];
142      flagged[iIF] = new unsigned char[nprod];
143    }
144  }
145
146  if (cNXPol[iIF] || xpol[iIF] == 0x0) {
147    if (cNXPol[iIF] < nxpol) {
148      if (cNXPol[iIF]) {
149        // Free storage previously allocated.
150        delete [] xpol[iIF];
151      }
152
153      // Reallocate xpol storage.
154      cNXPol[iIF] = nxpol;
155      xpol[iIF] = new float[nxpol];
156    }
157  }
158}
159
160//------------------------------------------------------------- MBrecord::free
161
162// Free all allocated storage.
163
164void MBrecord::free()
165{
166  if (cNIF) {
167    for (int iIF = 0; iIF < cNIF; iIF++) {
168      // Don't free storage we didn't allocate.
169      if (cNProd[iIF]) {
170        delete [] spectra[iIF];
171        delete [] flagged[iIF];
172      }
173
174      if (cNXPol[iIF]) {
175        delete [] xpol[iIF];
176      }
177    }
178
179    delete [] IFno;
180    delete [] nChan;
181    delete [] nPol;
182    delete [] fqRefPix;
183    delete [] fqRefVal;
184    delete [] fqDelt;
185
186    delete [] tsys;
187    delete [] calfctr;
188    delete [] xcalfctr;
189    delete [] baseLin;
190    delete [] baseSub;
191
192    delete [] spectra;
193    delete [] flagged;
194    delete [] xpol;
195
196    delete [] tcal;
197
198    delete [] cNProd;
199    delete [] cNXPol;
200
201    cNIF = 0;
202  }
203}
204
205//-------------------------------------------------------- MBrecord::operator=
206
207// Do a deep copy of one MBrecord to another.
208
209MBrecord &MBrecord::operator=(const MBrecord &other)
210{
211  if (this == &other) {
212    return *this;
213  }
214
215  setNIFs(other.nIF);
216
217  scanNo  = other.scanNo;
218  cycleNo = other.cycleNo;
219  strcpy(datobs, other.datobs);
220  utc = other.utc;
221
222  exposure = other.exposure;
223  strcpy(srcName, other.srcName);
224  srcRA  = other.srcRA;
225  srcDec = other.srcDec;
226  restFreq = other.restFreq;
227  strcpy(obsType, other.obsType);
228
229  // Beam-dependent parameters.
230  beamNo  = other.beamNo;
231  ra      = other.ra;
232  dec     = other.dec;
233  pCode   = other.pCode;
234  rateAge = other.rateAge;
235  raRate  = other.raRate;
236  decRate = other.decRate;
237
238  // IF-dependent parameters.
239  nIF = other.nIF;
240  for (int iIF = 0; iIF < nIF; iIF++) {
241    IFno[iIF]     = other.IFno[iIF];
242    nChan[iIF]    = other.nChan[iIF];
243    nPol[iIF]     = other.nPol[iIF];
244    fqRefPix[iIF] = other.fqRefPix[iIF];
245    fqRefVal[iIF] = other.fqRefVal[iIF];
246    fqDelt[iIF]   = other.fqDelt[iIF];
247
248    for (int j = 0; j < 2; j++) {
249      tsys[iIF][j] = other.tsys[iIF][j];
250    }
251
252    for (int j = 0; j < 2; j++) {
253      calfctr[iIF][j]  = other.calfctr[iIF][j];
254      xcalfctr[iIF][j] = other.xcalfctr[iIF][j];
255    }
256
257    haveBase = other.haveBase;
258    for (int ipol = 0; ipol < nPol[iIF]; ipol++) {
259      baseLin[iIF][ipol][0] = other.baseLin[iIF][ipol][0];
260      baseLin[iIF][ipol][1] = other.baseLin[iIF][ipol][1];
261
262      for (int j = 0; j < 24; j++) {
263        baseSub[iIF][ipol][j] = other.baseSub[iIF][ipol][j];
264      }
265    }
266
267    for (int j = 0; j < 2; j++) {
268      tcal[iIF][j] = other.tcal[iIF][j];
269    }
270  }
271
272  haveSpectra = other.haveSpectra;
273  if (haveSpectra) {
274    for (int iIF = 0; iIF < nIF; iIF++) {
275      int nprod = nChan[iIF] * nPol[iIF];
276      int nxpol = other.xpol[iIF] ? nChan[iIF] * 2 : 0;
277      allocate(iIF, nprod, nxpol);
278    }
279
280    // Copy data.
281    for (int iIF = 0; iIF < nIF; iIF++) {
282      float *specp  = spectra[iIF];
283      float *ospecp = other.spectra[iIF];
284      unsigned char *flagp  = flagged[iIF];
285      unsigned char *oflagp = other.flagged[iIF];
286      for (int j = 0; j < nChan[iIF]*nPol[iIF]; j++) {
287        *(specp++) = *(ospecp++);
288        *(flagp++) = *(oflagp++);
289      }
290
291      if (xpol[iIF]) {
292        float *xpolp  = xpol[iIF];
293        float *oxpolp = other.xpol[iIF];
294        for (int j = 0; j < 2*nChan[iIF]; j++) {
295          *(xpolp++) = *(oxpolp++);
296        }
297      }
298    }
299  }
300
301  extraSysCal = other.extraSysCal;
302
303  azimuth   = other.azimuth;
304  elevation = other.elevation;
305  parAngle  = other.parAngle;
306  paRate    = other.paRate;
307
308  focusAxi  = other.focusAxi;
309  focusTan  = other.focusTan;
310  focusRot  = other.focusRot;
311
312  temp      = other.temp;
313  pressure  = other.pressure;
314  humidity  = other.humidity;
315  windSpeed = other.windSpeed;
316  windAz    = other.windAz;
317
318  strcpy(tcalTime, other.tcalTime);
319
320  refBeam = other.refBeam;
321
322  return *this;
323}
324
325//---------------------------------------------------------- MBrecord::extract
326
327// Extract a selected IF from one MBrecord into another.
328
329int MBrecord::extract(const MBrecord &other, int iIF)
330{
331  if (this == &other) {
332    return 1;
333  }
334
335  setNIFs(1);
336
337  scanNo  = other.scanNo;
338  cycleNo = other.cycleNo;
339  strcpy(datobs, other.datobs);
340  utc = other.utc;
341
342  exposure = other.exposure;
343  strcpy(srcName, other.srcName);
344  srcRA  = other.srcRA;
345  srcDec = other.srcDec;
346  restFreq = other.restFreq;
347  strcpy(obsType, other.obsType);
348
349  // Beam-dependent parameters.
350  beamNo  = other.beamNo;
351  ra      = other.ra;
352  dec     = other.dec;
353  pCode   = other.pCode;
354  rateAge = other.rateAge;
355  raRate  = other.raRate;
356  decRate = other.decRate;
357  paRate  = other.paRate;
358
359  // IF-dependent parameters.
360  nIF = 1;
361  IFno[0]     = other.IFno[iIF];
362  nChan[0]    = other.nChan[iIF];
363  nPol[0]     = other.nPol[iIF];
364  fqRefPix[0] = other.fqRefPix[iIF];
365  fqRefVal[0] = other.fqRefVal[iIF];
366  fqDelt[0]   = other.fqDelt[iIF];
367
368  for (int j = 0; j < 2; j++) {
369    tsys[0][j] = other.tsys[iIF][j];
370  }
371
372  for (int j = 0; j < 2; j++) {
373    calfctr[0][j]  = other.calfctr[iIF][j];
374    xcalfctr[0][j] = other.xcalfctr[iIF][j];
375  }
376
377  haveBase = other.haveBase;
378  for (int ipol = 0; ipol < nPol[0]; ipol++) {
379    baseLin[0][ipol][0] = other.baseLin[iIF][ipol][0];
380    baseLin[0][ipol][1] = other.baseLin[iIF][ipol][1];
381
382    for (int j = 0; j < 24; j++) {
383      baseSub[0][ipol][j] = other.baseSub[iIF][ipol][j];
384    }
385  }
386
387  for (int j = 0; j < 2; j++) {
388    tcal[0][j] = other.tcal[iIF][j];
389  }
390
391  haveSpectra = other.haveSpectra;
392  if (haveSpectra) {
393    int nprod = nChan[0] * nPol[0];
394    int nxpol = other.xpol[iIF] ? nChan[0] * 2 : 0;
395    allocate(0, nprod, nxpol);
396
397    // Copy data.
398    float *specp  = spectra[0];
399    float *ospecp = other.spectra[iIF];
400    unsigned char *flagp  = flagged[0];
401    unsigned char *oflagp = other.flagged[iIF];
402    for (int j = 0; j < nChan[0]*nPol[0]; j++) {
403      *(specp++) = *(ospecp++);
404      *(flagp++) = *(oflagp++);
405    }
406
407    if (xpol[0]) {
408      float *xpolp  = xpol[0];
409      float *oxpolp = other.xpol[iIF];
410      for (int j = 0; j < 2*nChan[0]; j++) {
411        *(xpolp++) = *(oxpolp++);
412      }
413    }
414  }
415
416  extraSysCal = other.extraSysCal;
417
418  azimuth   = other.azimuth;
419  elevation = other.elevation;
420  parAngle  = other.parAngle;
421
422  focusAxi  = other.focusAxi;
423  focusTan  = other.focusTan;
424  focusRot  = other.focusRot;
425
426  temp      = other.temp;
427  pressure  = other.pressure;
428  humidity  = other.humidity;
429  windSpeed = other.windSpeed;
430  windAz    = other.windAz;
431
432  strcpy(tcalTime, other.tcalTime);
433
434  refBeam = other.refBeam;
435
436  return 0;
437}
Note: See TracBrowser for help on using the repository browser.