source: branches/alma/external/atnf/PKSIO/PKSSDwriter.cc@ 1705

Last change on this file since 1705 was 1453, checked in by TakTsutsumi, 16 years ago

New Development: No

JIRA Issue: No

Ready to Release: Yes

Interface Changes: Yes

What Interface Changed: many

Test Programs: sd.scantable(), sd.scantable.save()

Put in Release Notes: N/A

Description: copied from current casapy code tree


File size: 9.7 KB
Line 
1//#---------------------------------------------------------------------------
2//# PKSSDwriter.cc: Class to write Parkes multibeam data to an SDFITS file.
3//#---------------------------------------------------------------------------
4//# Copyright (C) 2000-2006
5//# Associated Universities, Inc. Washington DC, USA.
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
13//# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14//# or 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 AIPS++ should be addressed as follows:
22//# Internet email: aips2-request@nrao.edu.
23//# Postal address: AIPS++ Project Office
24//# National Radio Astronomy Observatory
25//# 520 Edgemont Road
26//# Charlottesville, VA 22903-2475 USA
27//#
28//# $Id$
29//#---------------------------------------------------------------------------
30
31#include <atnf/PKSIO/PKSMBrecord.h>
32#include <atnf/PKSIO/PKSSDwriter.h>
33
34#include <casa/Quanta/MVTime.h>
35
36
37//--------------------------------------------------- PKSSDwriter::PKSSDwriter
38
39// Default constructor.
40
41PKSSDwriter::PKSSDwriter()
42{
43}
44
45//-------------------------------------------------- PKSSDwriter::~PKSSDwriter
46
47// Destructor.
48
49PKSSDwriter::~PKSSDwriter()
50{
51 close();
52}
53
54//-------------------------------------------------------- PKSSDwriter::create
55
56// Create the SDFITS file and and write static data.
57
58Int PKSSDwriter::create(
59 const String sdName,
60 const String observer,
61 const String project,
62 const String antName,
63 const Vector<Double> antPosition,
64 const String obsMode,
65 const Float equinox,
66 const String dopplerFrame,
67 const Vector<uInt> nChan,
68 const Vector<uInt> nPol,
69 const Vector<Bool> haveXPol,
70 const Bool haveBase,
71 const String fluxUnit)
72{
73 double antPos[3];
74 antPos[0] = antPosition(0);
75 antPos[1] = antPosition(1);
76 antPos[2] = antPosition(2);
77
78 cNIF = nChan.nelements();
79 if (nPol.nelements() != cNIF || haveXPol.nelements() != cNIF) {
80 cerr << "PKSSDwriter::create: "
81 << "Inconsistent number of IFs for nChan, nPol, and/or haveXPol."
82 << endl;
83 return 1;
84 }
85
86 cNChan.assign(nChan);
87 cNPol.assign(nPol);
88
89 cHaveXPol.resize(cNIF);
90 for (uInt iIF = 0; iIF < cNIF; iIF++) {
91 // Convert Bool -> uInt.
92 cHaveXPol(iIF) = haveXPol(iIF) ? 1 : 0;
93 }
94
95 cHaveBase = haveBase;
96
97 // Storage in the trivial cNChan, cNPol, and cHaveXPol arrays should always
98 // be contiguous so the pointer returned by getStorage() shouldn't need to
99 // be deleted via freeStorage() (i.e. deleteIt always returned False). This
100 // storage will, of course, be deleted when the PKSwriter object is deleted.
101 Bool deleteIt;
102 Int status = cSDwriter.create((char *)sdName.chars(),
103 (char *)observer.chars(), (char *)project.chars(),
104 (char *)antName.chars(), antPos, (char *)obsMode.chars(), equinox,
105 (char *)dopplerFrame.chars(), cNIF,
106 (int *)cNChan.getStorage(deleteIt),
107 (int *)cNPol.getStorage(deleteIt),
108 (int *)cHaveXPol.getStorage(deleteIt), (int)cHaveBase, 1);
109 if (status) {
110 cSDwriter.reportError();
111 cSDwriter.deleteFile();
112 close();
113 }
114
115 return status;
116}
117
118//--------------------------------------------------------- PKSSDwriter::write
119
120// Write the next data record.
121
122Int PKSSDwriter::write(
123 const Int scanNo,
124 const Int cycleNo,
125 const Double mjd,
126 const Double interval,
127 const String fieldName,
128 const String srcName,
129 const Vector<Double> srcDir,
130 const Vector<Double> srcPM,
131 const Double srcVel,
132 const String obsMode,
133 const Int IFno,
134 const Double refFreq,
135 const Double bandwidth,
136 const Double freqInc,
137 //const Double restFreq,
138 const Vector<Double> restFreq,
139 const Vector<Float> tcal,
140 const String tcalTime,
141 const Float azimuth,
142 const Float elevation,
143 const Float parAngle,
144 const Float focusAxi,
145 const Float focusTan,
146 const Float focusRot,
147 const Float temperature,
148 const Float pressure,
149 const Float humidity,
150 const Float windSpeed,
151 const Float windAz,
152 const Int refBeam,
153 const Int beamNo,
154 const Vector<Double> direction,
155 const Vector<Double> scanRate,
156 const Vector<Float> tsys,
157 const Vector<Float> sigma,
158 const Vector<Float> calFctr,
159 const Matrix<Float> baseLin,
160 const Matrix<Float> baseSub,
161 const Matrix<Float> &spectra,
162 const Matrix<uChar> &flagged,
163 const Complex xCalFctr,
164 const Vector<Complex> &xPol)
165{
166 // Do basic checks.
167 uInt iIF = IFno - 1;
168 if (IFno < 1 || Int(cNIF) < IFno) {
169 cerr << "PKSDwriter::write: "
170 << "Invalid IF number " << IFno
171 << " (maximum " << cNIF << ")." << endl;
172 return 1;
173 }
174
175 uInt nChan = spectra.nrow();
176 if (nChan != cNChan(iIF)) {
177 cerr << "PKSDwriter::write: "
178 << "Wrong number of channels for IF " << IFno << "," << endl
179 << " "
180 << "got " << nChan << " should be " << cNChan(iIF) << "." << endl;
181 return 1;
182 }
183
184 uInt nPol = spectra.ncolumn();
185 if (nPol != cNPol(iIF)) {
186 cerr << "PKSDwriter::write: "
187 << "Wrong number of polarizations for IF " << IFno << "," << endl
188 << " "
189 << "got " << nPol << " should be " << cNPol(iIF) << "." << endl;
190 return 1;
191 }
192
193 // Extract calendar information from mjd.
194 MVTime time(mjd);
195 Int year = time.year();
196 Int month = time.month();
197 Int day = time.monthday();
198
199 // Transfer data to a single-IF PKSMBrecord.
200 PKSMBrecord mbrec(1);
201
202 // Start with basic beam- and IF-independent bookkeeping information.
203 mbrec.scanNo = scanNo;
204 mbrec.cycleNo = cycleNo;
205
206 sprintf(mbrec.datobs, "%4.4d-%2.2d-%2.2d", year, month, day);
207 mbrec.utc = fmod(mjd, 1.0) * 86400.0;
208 mbrec.exposure = float(interval);
209
210 strncpy(mbrec.srcName, (char *)srcName.chars(), 17);
211 mbrec.srcRA = srcDir(0);
212 mbrec.srcDec = srcDir(1);
213
214 //mbrec.restFreq = restFreq;
215 mbrec.restFreq = restFreq(0);
216
217 strncpy(mbrec.obsType, (char *)obsMode.chars(), 16);
218
219 // Now beam-dependent parameters.
220 mbrec.beamNo = beamNo;
221 mbrec.ra = direction(0);
222 mbrec.dec = direction(1);
223 mbrec.raRate = scanRate(0);
224 mbrec.decRate = scanRate(1);
225
226 // Now IF-dependent parameters.
227 mbrec.nIF = 1;
228 mbrec.IFno[0] = IFno;
229 mbrec.nChan[0] = nChan;
230 mbrec.nPol[0] = nPol;
231
232 mbrec.fqRefPix[0] = (nChan/2) + 1;
233 mbrec.fqRefVal[0] = refFreq;
234 mbrec.fqDelt[0] = freqInc;
235
236 // Now the data itself.
237 for (uInt i = 0; i < tsys.nelements(); i++) {
238 mbrec.tsys[0][i] = tsys(i);
239 }
240
241 for (uInt ipol = 0; ipol < nPol; ipol++) {
242 mbrec.calfctr[0][ipol] = calFctr(ipol);
243 }
244
245 if (cHaveXPol(iIF)) {
246 mbrec.xcalfctr[0][0] = xCalFctr.real();
247 mbrec.xcalfctr[0][1] = xCalFctr.imag();
248 } else {
249 mbrec.xcalfctr[0][0] = 0.0f;
250 mbrec.xcalfctr[0][1] = 0.0f;
251 }
252
253 if (cHaveBase) {
254 mbrec.haveBase = 1;
255
256 for (uInt ipol = 0; ipol < nPol; ipol++) {
257 mbrec.baseLin[0][ipol][0] = baseLin(0,ipol);
258 mbrec.baseLin[0][ipol][1] = baseLin(1,ipol);
259
260 for (uInt j = 0; j < baseSub.nrow(); j++) {
261 mbrec.baseSub[0][ipol][j] = baseSub(j,ipol);
262 }
263 for (uInt j = baseSub.nrow(); j < 9; j++) {
264 mbrec.baseSub[0][ipol][j] = 0.0f;
265 }
266 }
267
268 } else {
269 mbrec.haveBase = 0;
270 }
271
272 Bool delSpectra = False;
273 const Float *specstor = spectra.getStorage(delSpectra);
274 mbrec.spectra[0] = (float *)specstor;
275
276 Bool delFlagged = False;
277 const uChar *flagstor = flagged.getStorage(delFlagged);
278 mbrec.flagged[0] = (unsigned char *)flagstor;
279
280 Bool delXPol = False;
281 const Complex *xpolstor;
282 if (cHaveXPol(iIF)) {
283 xpolstor = xPol.getStorage(delXPol);
284 } else {
285 xpolstor = 0;
286 }
287 mbrec.xpol[0] = (float *)xpolstor;
288
289 // Finish off with system calibration parameters.
290 mbrec.extraSysCal = 1;
291 mbrec.refBeam = refBeam;
292 for (uInt i = 0; i < tcal.nelements(); i++) {
293 mbrec.tcal[0][i] = tcal(i);
294 }
295 strncpy(mbrec.tcalTime, (char *)tcalTime.chars(), 16);
296 mbrec.azimuth = azimuth;
297 mbrec.elevation = elevation;
298 mbrec.parAngle = parAngle;
299 mbrec.focusAxi = focusAxi;
300 mbrec.focusTan = focusTan;
301 mbrec.focusRot = focusRot;
302 mbrec.temp = temperature;
303 mbrec.pressure = pressure;
304 mbrec.humidity = humidity;
305 mbrec.windSpeed = windSpeed;
306 mbrec.windAz = windAz;
307
308 Int status = cSDwriter.write(mbrec);
309 if (status) {
310 cSDwriter.reportError();
311 status = 1;
312 }
313
314 spectra.freeStorage(specstor, delSpectra);
315 flagged.freeStorage(flagstor, delFlagged);
316 xPol.freeStorage(xpolstor, delXPol);
317
318 return status;
319}
320
321//--------------------------------------------------------- PKSSDwriter::close
322
323// Close the SDFITS file.
324
325void PKSSDwriter::close()
326{
327 cSDwriter.close();
328}
Note: See TracBrowser for help on using the repository browser.