source: trunk/external/atnf/PKSIO/PKSMBrecord.cc @ 1427

Last change on this file since 1427 was 1427, checked in by Malte Marquarding, 16 years ago

sync with livedata/implement/atnf

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