source: branches/alma/src/STAttr.cpp@ 1510

Last change on this file since 1510 was 1387, checked in by TakTsutsumi, 17 years ago

merged from NRAO version of ASAP 2.1 with ALMA specific modifications

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.4 KB
RevLine 
[353]1//#---------------------------------------------------------------------------
[878]2//# STAttr.cc: A collection of attributes for different telescopes
[353]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>
[394]38#include <casa/Quanta/MVTime.h>
[353]39
40#include <measures/Measures/MEpoch.h>
41
42#include <scimath/Mathematics/InterpolateArray1D.h>
43
[878]44#include "STAttr.h"
[717]45
[353]46using namespace casa;
47using namespace asap;
48
[878]49STAttr::STAttr()
[353]50{
[361]51 initData();
[353]52}
53
[878]54STAttr::STAttr(const STAttr& other)
[353]55{
[717]56 initData(); // state just private 'static' data
[353]57}
58
[1188]59STAttr& STAttr::operator=(const STAttr& other)
[353]60{
61 if (this != &other) {
[717]62 ; // state just private 'static' data
[353]63 }
64 return *this;
65}
66
[878]67STAttr::~STAttr()
[353]68{;}
69
70
[878]71Float STAttr::diameter(Instrument inst) const
[353]72{
73 Float D = 1.0;
[362]74 switch (inst) {
[1387]75 case ALMA:
76 {
77 D = 12.0;
78 }
79 break;
80
[362]81 case ATMOPRA:
82 {
83 D = 22.0;
84 }
85 break;
86 case ATPKSMB:
87 case ATPKSHOH:
88 {
89 D = 64.0;
90 }
91 break;
92 case TIDBINBILLA:
93 {
94 D = 70.0;
95 }
96 break;
97 case CEDUNA:
98 {
99 D = 30.0;
100 }
101 break;
[1387]102 case GBT:
103 {
104 D = 104.9;
105 }
106 break;
[362]107 case HOBART:
108 {
109 D = 26.0;
110 }
111 break;
112 default:
113 {
114 throw(AipsError("Unknown instrument"));
115 }
[353]116 }
117 return D;
118}
119
[1188]120Vector<Float> STAttr::beamEfficiency(Instrument inst, const MEpoch& dateObs,
[717]121 const Vector<Float>& freqs) const
[353]122{
123
[717]124 // Look at date where appropriate
[394]125 MVTime t(dateObs.getValue());
126 uInt year = t.year();
[717]127
[353]128 Vector<Float> facs(freqs.nelements(),1.0);
[362]129 switch (inst) {
[717]130 case ATMOPRA:
[362]131 {
[717]132 if (year<2003) {
133 pushLog("There is no beam efficiency data from before 2003"
134 " - using 2003 data");
[1188]135 facs = interp(freqs/1.0e9f, MopEtaBeamX_, MopEtaBeam2003Y_);
[717]136 } else if (year==2003) {
137 pushLog("Using beam efficiency data from 2003");
[1188]138 facs = interp(freqs/1.0e9f, MopEtaBeamX_, MopEtaBeam2003Y_);
[717]139 } else {
140 pushLog("Using beam efficiency data from 2004");
[1188]141 facs = interp(freqs/1.0e9f, MopEtaBeamX_, MopEtaBeam2004Y_);
[717]142 }
[362]143 }
144 break;
[717]145 default:
146 {
147 pushLog("No beam efficiency data for this instrument - assuming unity");
148 }
[353]149 }
150 return facs;
151}
152
[1188]153Vector<Float> STAttr::apertureEfficiency(Instrument inst,
154 const MEpoch& dateObs,
[717]155 const Vector<Float>& freqs) const
[353]156{
[1188]157
[717]158 // Look at date where appropriate
159 MVTime t(dateObs.getValue());
160 uInt year = t.year();
[1188]161
[717]162 Vector<Float> facs(freqs.nelements(),1.0);
163 switch (inst) {
164 case ATMOPRA:
165 {
166 if (year<2004) {
167 pushLog("There is no aperture efficiency data from before 2004"
168 " - using 2004 data");
169 facs = interp(freqs/1.0e9f, MopEtaApX_, MopEtaAp2004Y_);
170 } else {
171 pushLog("Using aperture efficiency data from 2004");
172 facs = interp(freqs/1.0e9f, MopEtaApX_, MopEtaAp2004Y_);
173 }
174 }
175 break;
176 case TIDBINBILLA:
177 {
178 facs = interp(freqs/1.0e9f, TidEtaApX_, TidEtaApY_);
179 }
180 break;
181 default:
182 {
183 pushLog("No aperture efficiency data for this instrument"
184 " - assuming unity");
185 }
186 }
187 return facs;
[353]188}
189
[878]190Vector<Float> STAttr::JyPerK(Instrument inst, const MEpoch& dateObs,
[717]191 const Vector<Float>& freqs) const
[353]192{
[1188]193
[717]194 // Find what we need
195 Vector<Float> etaAp = apertureEfficiency(inst, dateObs, freqs);
196 Float D = diameter(inst);
197 // Compute it
[353]198 Vector<Float> facs(freqs.nelements(),1.0);
199 for (uInt i=0; i<freqs.nelements(); i++) {
[878]200 facs(i) = STAttr::findJyPerK(etaAp(i), D);
[353]201 }
202 return facs;
203}
204
205
[878]206Float STAttr::findJyPerK(Float etaAp, Float D)
[717]207 //
208 // Converts K -> Jy
209 // D in m
210 //
[353]211{
[717]212 Double kb = QC::k.getValue(Unit(String("erg/K")));
213 Float gA = C::pi * D * D / 4.0;
214 return (2.0 * 1.0e19 * kb / etaAp / gA);
[353]215}
216
217
[878]218Vector<Float> STAttr::gainElevationPoly(Instrument inst) const
[362]219{
[353]220
[717]221 // Look at date where appropriate
222 switch (inst) {
223 case TIDBINBILLA:
224 {
225 return TidGainElPoly_.copy();
226 }
227 break;
[1345]228 // assume HOH for K-band
229 case ATPKSHOH:
230 {
231 return ParkesGainElPoly_.copy();
232 }
233 break;
[717]234 default:
235 {
236 Vector<Float> t;
237 return t.copy();
238 }
239 }
[362]240}
241
[1188]242std::string STAttr::feedPolType(Instrument inst) const
[507]243{
[1188]244 std::string type;
[717]245 switch (inst) {
246 case ATMOPRA:
247 case ATPKSMB:
248 case ATPKSHOH:
249 {
[1188]250 type = "linear";
[717]251 }
252 break;
253 case TIDBINBILLA:
254 {
[1188]255 type = "circular";
[717]256 }
257 break;
258 default:
259 {
[1188]260 type = "linear";
[717]261 }
262 }
263 return type;
[507]264}
[362]265
266
[353]267// Private
[878]268Vector<Float> STAttr::interp(const Vector<Float>& xOut,
[1188]269 const Vector<Float>& xIn,
[717]270 const Vector<Float>& yIn) const
271{
272 Int method = 1; // Linear
273 Vector<Float> yOut;
274 Vector<Bool> mOut;
[353]275
[717]276 Vector<Bool> mIn(xIn.nelements(),True);
[1188]277
[717]278 InterpolateArray1D<Float,Float>::interpolate(yOut, mOut, xOut,
279 xIn, yIn, mIn,
280 method, True, True);
[1188]281
[717]282 return yOut;
[353]283}
284
[1188]285void STAttr::initData()
[717]286 //
287 // Mopra data from Mopra web page
288 // Tid data from Tid web page
289 // X in GHz
290 //
[362]291{
292
[717]293 // Beam efficiency
[353]294 MopEtaBeamX_.resize(3);
295 MopEtaBeamX_(0) = 86.0;
296 MopEtaBeamX_(1) = 100.0;
297 MopEtaBeamX_(2) = 115.0;
[717]298
[353]299 MopEtaBeam2003Y_.resize(3);
300 MopEtaBeam2003Y_(0) = 0.39;
301 MopEtaBeam2003Y_(1) = 0.37;
[717]302 MopEtaBeam2003Y_(2) = 0.37; // replicated from (1)
[1188]303
[353]304 MopEtaBeam2004Y_.resize(3);
305 MopEtaBeam2004Y_(0) = 0.49;
306 MopEtaBeam2004Y_(1) = 0.44;
[361]307 MopEtaBeam2004Y_(2) = 0.42;
[362]308
[717]309 // Aperture efficiency
[353]310 MopEtaApX_.resize(2);
311 MopEtaApX_(0) = 86.0;
312 MopEtaApX_(1) = 115.0;
[717]313
[353]314 MopEtaAp2004Y_.resize(2);
315 MopEtaAp2004Y_(0) = 0.33;
316 MopEtaAp2004Y_(1) = 0.24;
[717]317
[467]318 TidEtaApX_.resize(2);
319 TidEtaApY_.resize(2);
320 TidEtaApX_(0) = 18.0;
321 TidEtaApX_(1) = 26.5;
322 TidEtaApY_(0) = 0.4848;
323 TidEtaApY_(1) = 0.4848;
[362]324
[717]325 // Gain elevation correction polynomial coefficients (for elevation
326 // in degrees)
[362]327
328 TidGainElPoly_.resize(3);
329 TidGainElPoly_(0) = 3.58788e-1;
330 TidGainElPoly_(1) = 2.87243e-2;
331 TidGainElPoly_(2) = -3.219093e-4;
[1345]332
333 ParkesGainElPoly_.resize(3);
334 ParkesGainElPoly_(0) = 0.296759e-1;
335 ParkesGainElPoly_(1) = -0.293124e-3;
336 ParkesGainElPoly_(2) = 0.264295e-6;
[353]337}
[475]338
339
[878]340Instrument STAttr::convertInstrument(const String& instrument,
[475]341 Bool throwIt)
342{
[717]343 String t(instrument);
344 t.upcase();
[1188]345
[878]346 // The strings are what STReader returns, after cunning
[717]347 // interrogation of station names... :-(
348 Instrument inst = asap::UNKNOWNINST;
349 if (t==String("DSS-43")) {
350 inst = TIDBINBILLA;
[1387]351 } else if (t==String("ALMA")) {
352 inst = ALMA;
[717]353 } else if (t==String("ATPKSMB")) {
354 inst = ATPKSMB;
355 } else if (t==String("ATPKSHOH")) {
356 inst = ATPKSHOH;
357 } else if (t==String("ATMOPRA")) {
358 inst = ATMOPRA;
359 } else if (t==String("CEDUNA")) {
360 inst = CEDUNA;
[1387]361 } else if (t==String("GBT")) {
362 inst = GBT;
[717]363 } else if (t==String("HOBART")) {
364 inst = HOBART;
365 } else {
366 if (throwIt) {
367 throw AipsError("Unrecognized instrument"
368 " - use function scan.set_instrument to set");
369 }
370 }
371 return inst;
[475]372}
Note: See TracBrowser for help on using the repository browser.