Line data Source code
1 : //# BeamSquint.cc: Implementation for BeamSquint 2 : //# Copyright (C) 1996,1997,1998,1999,2000,2003 3 : //# Associated Universities, Inc. Washington DC, USA. 4 : //# 5 : //# This library is free software; you can redistribute it and/or modify it 6 : //# under the terms of the GNU Library General Public License as published by 7 : //# the Free Software Foundation; either version 2 of the License, or (at your 8 : //# option) any later version. 9 : //# 10 : //# This library is distributed in the hope that it will be useful, but WITHOUT 11 : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 : //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public 13 : //# License for more details. 14 : //# 15 : //# You should have received a copy of the GNU Library General Public License 16 : //# along with this library; if not, write to the Free Software Foundation, 17 : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. 18 : //# 19 : //# Correspondence concerning AIPS++ should be adressed as follows: 20 : //# Internet email: casa-feedback@nrao.edu. 21 : //# Postal address: AIPS++ Project Office 22 : //# National Radio Astronomy Observatory 23 : //# 520 Edgemont Road 24 : //# Charlottesville, VA 22903-2475 USA 25 : //# 26 : //# 27 : //# $Id$ 28 : 29 : #include <casacore/casa/aips.h> 30 : #include <casacore/casa/Logging/LogIO.h> 31 : #include <synthesis/TransformMachines/BeamSquint.h> 32 : 33 : 34 : 35 : using namespace casacore; 36 : namespace casa { //# NAMESPACE CASA - BEGIN 37 : 38 572 : BeamSquint::BeamSquint() 39 : { 40 1144 : squint_p = MDirection( Quantity(0.0, "deg"), Quantity(0.0, "deg"), 41 1716 : MDirection::Ref(MDirection::AZEL)); 42 572 : refFreq_p = 0.0; 43 572 : }; 44 : 45 : 46 2675 : BeamSquint::BeamSquint(const MDirection& squint, const Quantity& refFreq) : 47 2675 : squint_p(squint), 48 2675 : refFreq_p(refFreq) 49 : { 50 2675 : }; 51 : 52 8793 : BeamSquint::BeamSquint(const BeamSquint& other) 53 : { 54 8793 : squint_p = other.squint_p; 55 8793 : refFreq_p = other.refFreq_p; 56 8793 : }; 57 : 58 : 59 1912 : BeamSquint& BeamSquint::operator=(const BeamSquint& other) 60 : { 61 1912 : if (this == &other) 62 0 : return *this; 63 : 64 1912 : squint_p = other.squint_p; 65 1912 : refFreq_p = other.refFreq_p; 66 1912 : return *this; 67 : }; 68 : 69 12018 : BeamSquint::~BeamSquint() 70 : { 71 12018 : }; 72 : 73 3 : void BeamSquint::show() 74 : { 75 6 : LogIO os(LogOrigin("BeamSquint", "show")); 76 : os << "Beam Squint in arcmin (AZ-EL): " 77 3 : << squint_p.getAngle().getValue("'") << LogIO::POST; 78 : os << "Beam Squint ref freq, GHz : " 79 3 : << refFreq_p.getValue("GHz") << LogIO::POST; 80 3 : }; 81 : 82 17 : Bool BeamSquint::isNonNull() 83 : { 84 17 : Double x = 0.0; x = squint_p.getAngle().getValue("'")(0); 85 17 : Double y = 0.0; y = squint_p.getAngle().getValue("'")(1); 86 17 : if (abs(x) > 1e-9 || abs(y) > 1e-9) { 87 3 : return true; 88 : } else { 89 14 : return false; 90 : } 91 : }; 92 : 93 0 : MDirection& BeamSquint::scale(const Quantity& newFreq) 94 : { 95 0 : Float fScale = 1.0; 96 0 : fScale = refFreq_p.getValue("GHz") / newFreq.getValue("GHz"); 97 0 : Quantity q0 = Quantity(fScale*(squint_p.getAngle().getValue("'")(0)), "'"); 98 0 : Quantity q1 = Quantity(fScale*(squint_p.getAngle().getValue("'")(1)), "'"); 99 : MDirection * mdp = new MDirection( q0, q1, 100 0 : MDirection::Ref(MDirection::AZEL)); 101 0 : return *mdp; 102 0 : }; 103 : 104 : 105 : void 106 5258 : BeamSquint::getPointingDirection (const MDirection& pointDir, 107 : const Quantity parAngle, 108 : const Quantity obsFreq, 109 : const SquintType doSquint, 110 : MDirection& newPointing) 111 : { 112 : // If there is a problem with the squint, look here first! 113 : // Our convention: for a source which transits south of zenith, 114 : // PA = 0 at its transit, and increases with time. We need to 115 : // rotate the beam by -PA on the sky 116 : 117 : 118 5258 : newPointing = MDirection(pointDir); 119 : 120 : // cout << "BS1: pre-original pointing: " << pointDir.getAngle().getValue("'") << endl; 121 : 122 5258 : if (doSquint != NONE) { 123 : 124 : // The sign convention here was incorrect, as determined on 125 : // VLA L-band observations of IC2233. I flipped it to obtain 126 : // the best V image after correction. - TJC 2003/06/18 127 5258 : Float fScale = -refFreq_p.getValue("GHz") / obsFreq.getValue("GHz"); 128 : 129 5258 : Double sx = fScale*(squint_p.getAngle().getValue()(0)); 130 5258 : Double sy = fScale*(squint_p.getAngle().getValue()(1)); 131 : 132 5258 : String RRorLL = "RR"; 133 : 134 5258 : if (doSquint == LL) { 135 2622 : RRorLL = "LL"; 136 2622 : sx = -sx; 137 2622 : sy = -sy; 138 : } 139 : 140 : // rotate by -ParAngle 141 5258 : Double pa = parAngle.getValue("rad"); 142 : 143 5258 : Double dx = sx * cos(-pa) + sy * sin(-pa); 144 5258 : Double dy = -sx * sin(-pa) + sy * cos(-pa); 145 : // but this is in an AZ-EL type frame; flip it for combining with RA/DEC 146 5258 : dx = -dx; 147 : 148 5258 : newPointing.shift(dx, dy, true); 149 : // cout << "BeamSquint: " << RRorLL << " sx: " << sx << " sy: " << sy 150 : // << " pa: " << pa << " dx: " << dx << " dy: " << dy << endl; 151 5258 : } 152 : 153 : 154 : // cout << "BS2: new pointing: " << newPointing.getAngle().getValue("'") << endl; 155 : // cout << "BS3: post-original pointing: " << pointDir.getAngle().getValue("'") << endl; 156 : 157 : 158 5258 : }; 159 : 160 : } //# NAMESPACE CASA - END 161 :