casa  5.7.0-16
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MSUVWGenerator.h
Go to the documentation of this file.
1 //# MSUVWGenerator.h: Generate and insert the (u, v, w)s of a MS.
2 //# Copyright (C) 2008
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 addressed as follows:
20 //# Internet email: aips2-request@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 //# $Id$
27 //#
28 #ifndef MS_MSUVWGENERATOR_H
29 #define MS_MSUVWGENERATOR_H
30 
31 #include <casa/aips.h>
32 #include <casa/BasicSL/String.h>
36 
37 // FTMachine::rotateUVW(casacore::Matrix<casacore::Double>& uvw, casacore::Vector<casacore::Double>& dphase,
38 // const VisBuffer& vb)
39 
40 namespace casacore{
41 
42 class MeasurementSet;
43 class LogIO;
44 }
45 
46 namespace casa { //# NAMESPACE CASA - BEGIN
47 
48 
49 // <summary>Generates and inserts the (u, v, w)s of a casacore::MS that may or may not
50 // already have them. Includes antenna offsets when known.</summary>
51 // <use visibility=export>
52 //
53 // <reviewed reviewer="" date="yyyy/mm/dd" tests="" demos="">
54 // </reviewed>
55 //
56 // <prerequisite>
57 // <li> <linkto class=casacore::MeasurementSet>MeasurementSet</linkto>
58 // <li> <linkto class=casacore::Measure>Measure</linkto>
59 // </prerequisite>
60 //
61 // <etymology>
62 // It generates a UVW column for the casacore::MS, whether or not it already has one.
63 // It is an adaptation of alma/apps/asdm2MS/UvwCoords to work with MSes instead
64 // of ASDMs.
65 // </etymology>
66 //
67 // <synopsis>
68 // (u, v, w)s are needed for imaging, but some data sets may not come with them
69 // included, or the (u, v, w)s may need correction.
70 // </synopsis>
71 //
72 // <motivation>
73 // Currently (10/30/2008), ASDMs from either the ALMA Test Facility or the
74 // EVLA do not come with (u, v, w)s, and need to be processed with the UVFIX
75 // task in AIPS. It would be preferable to process them entirely inside CASA.
76 // </motivation>
77 //
78 // <todo asof="11/20/2008">
79 // It requires as input the casacore::MS timeCentroids item which is an output in the
80 // ASDM DAMs.
81 // - the use-case when the timeCentroid is baseline-based and or spectral
82 // window based.
83 // - correlationMode filter (hopefully handled by SDM -> casacore::MS import routines).
84 // direction item in the field table.
85 // @note The current limitations are set by the status of the ASDM
86 // - OTF not supported due to a limitation in the model of the phase
87 // </todo>
89 {
90 public:
91  // Constructor
92  // @param ms_ref Reference to the casacore::MS's columns.
93  // @post - The relative positions for all the antennas in the Antenna
94  // table are in bl_an_p.
95  // - timeRes_p has been conservatively calculated using rough
96  // estimates of the maximum baseline length and field of view.
98  const casacore::Muvw::Types uvwtype);
99 
100  // Destructor
101  ~MSUVWGenerator();
102 
103  // Determine the uvw for a single phaseDir and timeCentroid, and pair of
104  // feeds (which may be the same).
105  //
106  // @param ant1 Row number in the ANTENNA table of the 1st antenna.
107  // @param feed1 Row number in the FEED table of the 1st feed.
108  // @param ant1 Row number in the ANTENNA table of the 2nd antenna.
109  // @param feed2 Row number in the FEED table of the 2nd feed.
110  // @param uvw The returned UVW coordinates.
111  void uvw_bl(const casacore::uInt ant1, const casacore::uInt feed1,
112  const casacore::uInt ant2, const casacore::uInt feed2, casacore::Array<casacore::Double>& uvw);
113 
114  // Calculate the uvws for the field IDs in flds that are not -1, and set
115  // those phase directions according to phaseDirs.
116  // @param flds A map from row numbers in the FIELD table to
117  // indices in phaseDirs. For example, if the casacore::MS has
118  // 5 fields, and the user wants to (re)calculate the
119  // UVWs of only 0, 2, and 4, phaseDirs will have 3
120  // entries and flds will be [0, -1, 1, -1, 2].
122 private:
123  // Sets up the antenna positions as baselines (bl_an_p), the number of
124  // antennas (nant_p), and timeRes_p.
126 
127  // Determine antUVW_p for every member of the sequence of antennas
128  // defining a (sub)array.
129  // @param timeCentroid An epoch, the 'when' characterization.
130  // @param fldID The row number in the FIELD table which gives
131  // the phase tracking center.
132  // @param WSRTConvention If true (WSRT only?), the l in the ul + vm
133  // phase calculation decreases toward increasing
134  // RA. If false (VLA), it increases with
135  // increasing RA. See the code for more info.
136  // @note This function only calculates UVWs for a single time and a
137  // single phase center. Fields can potentially have multiple phase
138  // directions, so be prepared to call this function from within a loop
139  // that also takes care of setting timeCentroid and phaseDir.
140  // @warning timeCentroid can be initialized like
141  // casacore::MEpoch timeCentroid(casacore::Quantity(<double>, "s"), casacore::MEpoch::TAI);
142  // but the accuracy is limited since there is no extra precision
143  // attribute (see Main table of casacore::MS v2).
144  void uvw_an(const casacore::MEpoch& timeCentroid, const casacore::Int fldID,
145  const casacore::Bool WSRTConvention=false);
146 
147  // (Sub-)array parameters constraining order and size of the output vector
148  // of UVW coords triplets.
149  // struct ArrayParam{
150 // public:
151 // casacore::Int subarrayId; // (sub)array identifier
152 // vector<Tag> v_ant; //<! sequence of antennas
153 // unsigned int nrepeat; //<! number of casacore::MS main table rows
154 // // per antenna baseline
155 // Enum<CorrelationMode> e_correlationMode; //<! correlation mode (original
156 // // mode passed through the user
157 // // filter) (FOLLOWUP: is this needed?)
158 // string show(){
159 // ostringstream os;
160 // os << " nrepeat " << nrepeat;
161 // return os.str();
162 // }
163  //};
164 
165  //****************** Member variables ********************************
166 
167  //**************** Initialized by ctor, ******************************
168  //**************** so they should appear ******************************
169  //**************** here in the same order ******************************
170  //**************** as they do in the ctor. ******************************
171 
172  casacore::MSColumns& msc_p; // the columns of the measurement set.
173 
174  // casacore::Coordinate system selectors.
176 
178 
179  // The antenna positions of ms_p in ITRF. It cannot be const because of the
180  // need to update satellite positions.
181  // antPositions_p and antOffset_p are references and must therefore be
182  // initialized in the initialization list.
183  const casacore::ROScalarMeasColumn<casacore::MPosition>& antPositions_p;
184 
185  // The offsets between the phase reference point (see feed_offsets below for
186  // clarification) of each antenna and the closest point which is fixed
187  // relative to the antenna position (i.e. an axis). Since no one else has
188  // defined it yet, I am defining it as the offset when the antenna is
189  // pointing at zenith, oriented so that if it slewed down, it would move
190  // toward the north. (x, y, z) = (east, north, up).
191  //
192  // This appears to be a required column of the ANTENNA table in version 2.0
193  // of the casacore::MeasurementSet definition
194  // (http://aips2.nrao.edu/docs/notes/229/229.html), so it is assumed to be
195  // present. However, it is usually a set of zeroes, based on the common
196  // belief that it is only needed for heterogeneous arrays, since the
197  // receivers of homogeneous arrays move in concert. That is not true when
198  // there are independent pointing errors.
199  const casacore::ROScalarMeasColumn<casacore::MPosition>& antOffset_p;
200 
201  // The position of the first antenna.
203 
204  // Ditto for feed.
205  //const casacore::ROMSFeedColumns *feedColumns_;
206 
207  // The offset between the feed and the phase reference point of each antenna
208  // in the same frame as ant_offsets. Therefore the feed position is
209  // ant_positions_p(ant) + [rotation matrix](pointing) (ant_offsets_p[ant] +
210  // feed_offsets_p[ant])
211  const casacore::ROScalarMeasColumn<casacore::MPosition>& feedOffset_p;
212 
214 
215  // The antenna positions - refpos_p.getValue().
217 
218  casacore::uInt nant_p; // # of antennas
219 
220  // The minimum time difference for forcing an update of the UVWs. We're not
221  // trying to do time averaging here, so it should be small, but not so small
222  // that uvw_an() is called for every baseline, even when the times are
223  // practically the same.
225 
226  //************* Initialized later, if at all. ********************
227 
228  // Log functions and variables
231 
232  //map<Tag, ArrayParam> m_array_p; // FIX: Tag
233 
234  // The UVW "positions" of each antenna being used during a time bin,
235  // i.e. the (u, v, w) of the baseline between antennas m and n is
236  // antUVW_p[n] - antUVW_p[m].
237  // <todo asof="02/18/2009">
238  // Generalize to multifeed systems.
239  // </todo>
241 
242  // the 3 fundamental attributes of the state machine
244  //casacore::Int subarrayId_p;
245 
246  // The number of wavelengths by which a feed may move relative to the
247  // corresponding feed in another antenna of the array without requiring the
248  // offset to be included in uvw calculations. If < 0 the offset will always
249  // be included.
250  //
251  // Offsets include:
252  // ant_offset: OFFSET in the ANTENNA table of an MS.
253  // The separation between an antenna's "phase reference
254  // point" and its closest point (usu. an axis) fixed rel
255  // to its position.
256  //
257  // feed_offset: POSITION in the FEED table of an MS.
258  // The separation between a feed and ant_pos + ant_offset.
259  // Just another offset to add to ant_offset, but unlike
260  // ant_offset it is likely to change when the band is
261  // changed.
262  //
263  // rec_offset: Not found in MSes, acc. to vers. 2 of of the MeasurementSet
264  // definition (http://aips2.nrao.edu/docs/notes/229/229.html).
265  // The separation between a receptor and its feed.
266  // Only needed for feed arrays. The above URL defines a feed
267  // (incl. feed arrays) as a set of receptors that should be
268  // calibrated as a single entity. Predicting how observers
269  // will decide to calibrate feed arrays is difficult,
270  // especially since there are no interferometers with feed
271  // arrays yet, but it can be argued that rec_offset can be
272  // ignored in many cases. If a feed array's output is
273  // combined before leaving the feed (i.e. a beamforming
274  // array), it may as well be treated as a single feed. If the
275  // receptor outputs are kept separate longer, they likely need
276  // to be calibrated separately and get their own FEED tables.
277  //
278  // They affect how the baselines of heterogeneous arrays vary with phase
279  // tracking direction, and make the baselines of any array depend on pointing
280  // errors. The latter effect is often neglected, and the offsets are written
281  // as sets of zeroes, even though they really are not.
282  //
283 
284  //
285 };
286 
287 } //# NAMESPACE CASA - END
288 
289 #endif
A Measure: position on Earth.
Definition: MPosition.h:79
int Int
Definition: aipstype.h:50
casacore::Vector< casacore::MVBaseline > bl_an_p
The antenna positions - refpos_p.getValue().
casacore::MBaseline::Ref bl_csys_p
casacore::Coordinate system selectors.
casacore::LogIO sink_p
casacore::MSColumns & msc_p
(Sub-)array parameters constraining order and size of the output vector of UVW coords triplets...
Generates and inserts the (u, v, w)s of a casacore::MS that may or may not already have them...
const casacore::ROScalarMeasColumn< casacore::MPosition > & antPositions_p
The antenna positions of ms_p in ITRF.
ostream-like interface to creating log messages.
Definition: LogIO.h:167
casacore::LogIO & logSink()
const casacore::ROMSAntennaColumns & antColumns_p
Types
Types of known Muvws Warning: The order defines the order in the translation matrix FromTo in the ge...
Definition: Muvw.h:130
A Measure: instant in time.
Definition: MEpoch.h:104
casacore::uInt nant_p
MSUVWGenerator(casacore::MSColumns &ms_ref, const casacore::MBaseline::Types bltype, const casacore::Muvw::Types uvwtype)
Constructor.
const casacore::ROScalarMeasColumn< casacore::MPosition > & feedOffset_p
Ditto for feed.
void fill_bl_an(casacore::Vector< casacore::MVBaseline > &bl_an_p)
Sets up the antenna positions as baselines (bl_an_p), the number of antennas (nant_p), and timeRes_p.
const casacore::ROScalarMeasColumn< casacore::MPosition > & antOffset_p
The offsets between the phase reference point (see feed_offsets below for clarification) of each ante...
double Double
Definition: aipstype.h:55
bool Bool
Define the standard types used by Casacore.
Definition: aipstype.h:42
Types
Types of known MBaselines Warning: The order defines the order in the translation matrix FromTo in t...
Definition: MBaseline.h:100
~MSUVWGenerator()
Destructor.
casacore::Bool make_uvws(const casacore::Vector< casacore::Int > flds)
Calculate the uvws for the field IDs in flds that are not -1, and set those phase directions accordin...
void uvw_bl(const casacore::uInt ant1, const casacore::uInt feed1, const casacore::uInt ant2, const casacore::uInt feed2, casacore::Array< casacore::Double > &uvw)
Determine the uvw for a single phaseDir and timeCentroid, and pair of feeds (which may be the same)...
casacore::Vector< casacore::Vector< casacore::Double > > antUVW_p
map&lt;Tag, ArrayParam&gt; m_array_p; // FIX: Tag
casacore::Double timeRes_p
The minimum time difference for forcing an update of the UVWs.
void uvw_an(const casacore::MEpoch &timeCentroid, const casacore::Int fldID, const casacore::Bool WSRTConvention=false)
Determine antUVW_p for every member of the sequence of antennas defining a (sub)array.
A class to provide easy read-write access to MeasurementSet columns.
Definition: MSColumns.h:221
casacore::MBaseline::Types refposref_p
A class to provide easy read-only access to MSAntenna columns.
casacore::MPosition refpos_p
The position of the first antenna.
unsigned int uInt
Definition: aipstype.h:51
casacore::ArrayColumn< casacore::Double > phaseDir_p
the 3 fundamental attributes of the state machine
#define casacore
&lt;X11/Intrinsic.h&gt; #defines true, false, casacore::Bool, and String.
Definition: X11Intrinsic.h:42