source: trunk/src/STAttr.cpp@ 3060

Last change on this file since 3060 was 2658, checked in by Malte Marquarding, 12 years ago

Ticket #199: Excised Logger::pushLog; now everything is using LogIO

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.8 KB
Line 
1//#---------------------------------------------------------------------------
2//# STAttr.cc: A collection of attributes for different telescopes
3//#---------------------------------------------------------------------------
4//# Copyright (C) 2004
5//# ATNF
6//#
7//# This program is free software; you can redistribute it and/or modify it
8//# under the terms of the GNU General Public License as published by the Free
9//# Software Foundation; either version 2 of the License, or (at your option)
10//# any later version.
11//#
12//# This program is distributed in the hope that it will be useful, but
13//# WITHOUT ANY WARRANTY; without even the implied warranty of
14//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15//# Public License for more details.
16//#
17//# You should have received a copy of the GNU General Public License along
18//# with this program; if not, write to the Free Software Foundation, Inc.,
19//# 675 Massachusetts Ave, Cambridge, MA 02139, USA.
20//#
21//# Correspondence concerning this software should be addressed as follows:
22//# Internet email: Malte.Marquarding@csiro.au
23//# Postal address: Malte Marquarding,
24//# Australia Telescope National Facility,
25//# P.O. Box 76,
26//# Epping, NSW, 2121,
27//# AUSTRALIA
28//#
29//# $Id:
30//#---------------------------------------------------------------------------
31
32#include <casa/aips.h>
33#include <casa/Arrays/Vector.h>
34#include <casa/Arrays/ArrayMath.h>
35#include <casa/Exceptions.h>
36#include <casa/Quanta/QC.h>
37#include <casa/Quanta/Quantum.h>
38#include <casa/Quanta/MVTime.h>
39#include <casa/Logging/LogIO.h>
40
41#include <measures/Measures/MEpoch.h>
42
43#include <scimath/Mathematics/InterpolateArray1D.h>
44
45#include "STAttr.h"
46
47using namespace casa;
48using namespace asap;
49
50STAttr::STAttr()
51{
52 initData();
53}
54
55STAttr::STAttr(const STAttr& other)
56{
57 (void) other; //suppress unused warning
58 initData(); // state just private 'static' data
59}
60
61STAttr& STAttr::operator=(const STAttr& other)
62{
63 if (this != &other) {
64 ; // state just private 'static' data
65 }
66 return *this;
67}
68
69STAttr::~STAttr()
70{;}
71
72
73Float STAttr::diameter(Instrument inst) const
74{
75 Float D = 1.0;
76 switch (inst) {
77 case ALMA:
78 {
79 D = 12.0;
80 }
81 break;
82
83 case ATMOPRA:
84 {
85 D = 22.0;
86 }
87 break;
88 case ATPKSMB:
89 case ATPKSHOH:
90 {
91 D = 64.0;
92 }
93 break;
94 case TIDBINBILLA:
95 {
96 D = 70.0;
97 }
98 break;
99 case CEDUNA:
100 {
101 D = 30.0;
102 }
103 break;
104 case GBT:
105 {
106 D = 104.9;
107 }
108 break;
109 case HOBART:
110 {
111 D = 26.0;
112 }
113 break;
114 default:
115 {
116 throw(AipsError("Unknown instrument"));
117 }
118 }
119 return D;
120}
121
122Vector<Float> STAttr::beamEfficiency(Instrument inst, const MEpoch& dateObs,
123 const Vector<Float>& freqs) const
124{
125 casa::LogIO os( casa::LogOrigin( "STAttr", "beamEfficiency()" ) );
126 // Look at date where appropriate
127 MVTime t(dateObs.getValue());
128 uInt year = t.year();
129
130 Vector<Float> facs(freqs.nelements(),1.0);
131 switch (inst) {
132 case ATMOPRA:
133 {
134 if (year<2003) {
135 os << "There is no beam efficiency data from before 2003"
136 <<" - using 2003 data" << casa::LogIO::POST;
137 facs = interp(freqs/1.0e9f, MopEtaBeamX_, MopEtaBeam2003Y_);
138 } else if (year==2003) {
139 os << "Using beam efficiency data from 2003" << casa::LogIO::POST;
140 facs = interp(freqs/1.0e9f, MopEtaBeamX_, MopEtaBeam2003Y_);
141 } else {
142 os << "Using beam efficiency data from 2004" << casa::LogIO::POST;
143 facs = interp(freqs/1.0e9f, MopEtaBeamX_, MopEtaBeam2004Y_);
144 }
145 }
146 break;
147 default:
148 {
149 os << "No beam efficiency data for this instrument - assuming unity"
150 << casa::LogIO::POST;
151 }
152 }
153 return facs;
154}
155
156Vector<Float> STAttr::apertureEfficiency(Instrument inst,
157 const MEpoch& dateObs,
158 const Vector<Float>& freqs) const
159{
160 casa::LogIO os( casa::LogOrigin( "STAttr", "apertureEfficiency()" ) );
161 // Look at date where appropriate
162 MVTime t(dateObs.getValue());
163 uInt year = t.year();
164
165 Vector<Float> facs(freqs.nelements(),1.0);
166 switch (inst) {
167 case ATMOPRA:
168 {
169 if (year<2004) {
170 os << "There is no aperture efficiency data from before 2004"
171 << " - using 2004 data" << casa::LogIO::POST;
172 facs = interp(freqs/1.0e9f, MopEtaApX_, MopEtaAp2004Y_);
173 } else {
174 os << "Using aperture efficiency data from 2004" << casa::LogIO::POST;
175 facs = interp(freqs/1.0e9f, MopEtaApX_, MopEtaAp2004Y_);
176 }
177 }
178 break;
179 case TIDBINBILLA:
180 {
181 facs = interp(freqs/1.0e9f, TidEtaApX_, TidEtaApY_);
182 }
183 break;
184 default:
185 {
186 os << "No aperture efficiency data for this instrument"
187 << " - assuming unity" << casa::LogIO::POST;
188 }
189 }
190 return facs;
191}
192
193Vector<Float> STAttr::JyPerK(Instrument inst, const MEpoch& dateObs,
194 const Vector<Float>& freqs) const
195{
196
197 // Find what we need
198 Vector<Float> etaAp = apertureEfficiency(inst, dateObs, freqs);
199 Float D = diameter(inst);
200 // Compute it
201 Vector<Float> facs(freqs.nelements(),1.0);
202 for (uInt i=0; i<freqs.nelements(); i++) {
203 facs(i) = STAttr::findJyPerK(etaAp(i), D);
204 }
205 return facs;
206}
207
208
209Float STAttr::findJyPerK(Float etaAp, Float D)
210 //
211 // Converts K -> Jy
212 // D in m
213 //
214{
215 Double kb = QC::k.getValue(Unit(String("erg/K")));
216 Float gA = C::pi * D * D / 4.0;
217 return (2.0 * 1.0e19 * kb / etaAp / gA);
218}
219
220
221Vector<Float> STAttr::gainElevationPoly(Instrument inst) const
222{
223
224 // Look at date where appropriate
225 switch (inst) {
226 case TIDBINBILLA:
227 {
228 return TidGainElPoly_.copy();
229 }
230 break;
231 // assume HOH for K-band
232 case ATPKSHOH:
233 {
234 return ParkesGainElPoly_.copy();
235 }
236 break;
237 default:
238 {
239 Vector<Float> t;
240 return t.copy();
241 }
242 }
243}
244
245std::string STAttr::feedPolType(Instrument inst) const
246{
247 std::string type;
248 switch (inst) {
249 case ATMOPRA:
250 case ATPKSMB:
251 case ATPKSHOH:
252 {
253 type = "linear";
254 }
255 break;
256 case TIDBINBILLA:
257 {
258 type = "circular";
259 }
260 break;
261 default:
262 {
263 type = "linear";
264 }
265 }
266 return type;
267}
268
269
270// Private
271Vector<Float> STAttr::interp(const Vector<Float>& xOut,
272 const Vector<Float>& xIn,
273 const Vector<Float>& yIn) const
274{
275 Int method = 1; // Linear
276 Vector<Float> yOut;
277 Vector<Bool> mOut;
278
279 Vector<Bool> mIn(xIn.nelements(),True);
280
281 InterpolateArray1D<Float,Float>::interpolate(yOut, mOut, xOut,
282 xIn, yIn, mIn,
283 method, True, True);
284
285 return yOut;
286}
287
288void STAttr::initData()
289 //
290 // Mopra data from Mopra web page
291 // Tid data from Tid web page
292 // X in GHz
293 //
294{
295
296 // Beam efficiency
297 MopEtaBeamX_.resize(3);
298 MopEtaBeamX_(0) = 86.0;
299 MopEtaBeamX_(1) = 100.0;
300 MopEtaBeamX_(2) = 115.0;
301
302 MopEtaBeam2003Y_.resize(3);
303 MopEtaBeam2003Y_(0) = 0.39;
304 MopEtaBeam2003Y_(1) = 0.37;
305 MopEtaBeam2003Y_(2) = 0.37; // replicated from (1)
306
307 MopEtaBeam2004Y_.resize(3);
308 MopEtaBeam2004Y_(0) = 0.49;
309 MopEtaBeam2004Y_(1) = 0.44;
310 MopEtaBeam2004Y_(2) = 0.42;
311
312 // Aperture efficiency
313 MopEtaApX_.resize(2);
314 MopEtaApX_(0) = 86.0;
315 MopEtaApX_(1) = 115.0;
316
317 MopEtaAp2004Y_.resize(2);
318 MopEtaAp2004Y_(0) = 0.33;
319 MopEtaAp2004Y_(1) = 0.24;
320
321 TidEtaApX_.resize(2);
322 TidEtaApY_.resize(2);
323 TidEtaApX_(0) = 18.0;
324 TidEtaApX_(1) = 26.5;
325 TidEtaApY_(0) = 0.4848;
326 TidEtaApY_(1) = 0.4848;
327
328 // Gain elevation correction polynomial coefficients (for elevation
329 // in degrees)
330
331 TidGainElPoly_.resize(3);
332 TidGainElPoly_(0) = 3.58788e-1;
333 TidGainElPoly_(1) = 2.87243e-2;
334 TidGainElPoly_(2) = -3.219093e-4;
335
336 // 2009-09-15 - 13mm (22.2GHz) receiver
337 ParkesGainElPoly_.resize(3);
338 ParkesGainElPoly_(0) = -0.194031;
339 ParkesGainElPoly_(1) = 0.457724e-1;
340 ParkesGainElPoly_(2) = -0.438659e-3;
341}
342
343
344Instrument STAttr::convertInstrument(const String& instrument,
345 Bool throwIt)
346{
347 String t(instrument);
348 t.upcase();
349
350 // The strings are what STReader returns, after cunning
351 // interrogation of station names... :-(
352 Instrument inst = asap::UNKNOWNINST;
353 if (t==String("DSS-43")) {
354 inst = TIDBINBILLA;
355 } else if (t==String("ALMA")) {
356 inst = ALMA;
357 } else if (t==String("ATPKSMB")) {
358 inst = ATPKSMB;
359 } else if (t==String("ATPKSHOH")) {
360 inst = ATPKSHOH;
361 } else if (t==String("ATMOPRA")) {
362 inst = ATMOPRA;
363 } else if (t==String("CEDUNA")) {
364 inst = CEDUNA;
365 } else if (t==String("GBT")) {
366 inst = GBT;
367 } else if (t==String("HOBART")) {
368 inst = HOBART;
369 } else {
370 if (throwIt) {
371 throw AipsError("Unrecognized instrument"
372 " - use function scan.set_instrument to set");
373 }
374 }
375 return inst;
376}
Note: See TracBrowser for help on using the repository browser.