1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
|
//# NewMSSimulator.h: this defines the MeasurementSet Simulator
//# Copyright (C) 1995-2009
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//# Internet email: casa-feedback@nrao.edu.
//# Postal address: AIPS++ Project Office
//# National Radio Astronomy Observatory
//# 520 Edgemont Road
//# Charlottesville, VA 22903-2475 USA
#ifndef MS_NEWMSSIMULATOR_H
#define MS_NEWMSSIMULATOR_H
//# Includes
#include <memory>
#include <casacore/casa/aips.h>
#include <casacore/casa/BasicSL/String.h>
#include <casacore/casa/Arrays/Vector.h>
#include <casacore/casa/Arrays/Matrix.h>
#include <casacore/casa/Arrays/Cube.h>
#include <casacore/casa/BasicSL/Complex.h>
#include <casacore/casa/Quanta/Quantum.h>
#include <casacore/measures/Measures/MPosition.h>
#include <casacore/measures/Measures/MEpoch.h>
#include <casacore/measures/Measures/MFrequency.h>
#include <casacore/measures/Measures/MDirection.h>
#include <casacore/tables/DataMan/TiledDataStManAccessor.h>
namespace casacore { //# NAMESPACE CASACORE - BEGIN
//# Forward Declarations
class MeasurementSet;
// <category lib=aips module="ModuleName">
// <summary> Create an empty MeasurementSet from observation and telescope descriptions. </summary>
// <reviewed reviewer="" date="" tests="">
//
// <prerequisite>
//# Classes you should understand before using this one.
// <li> MeasurementSet
// </prerequisite>
//
// <etymology>
// MS is from MeasurementSet, Simulator refers to the generation of
// 'fake' data from a set of parameters for instrument and sources.
// </etymology>
//
// <synopsis>
// This class creates a MeasurementSet from a set of parameters for instrument
// and sources. It does not simulate the data, only the coordinates of a
// measurement. The application "simulator" uses this class to create a true
// simulated MS with perfect or corrupted data.
// </synopsis>
//
// <motivation>
// To test calibration and imaging programs it is necessary to have flawless
// data and data with errors that are known exactly. This class generates
// empty MeasurementSets (only coordinates filled in) that can be filled
// with predicted data.
// </motivation>
//
// <todo asof="$DATE:$">
//# A List of bugs, limitations, extensions or planned refinements.
// <li> The amount of information to be specified by the user
// could be much larger. For the moment it has been restricted to
// what is needed for testing the synthesis imaging code. Already
// it is possible to create MeasurementSets that cannot be processed
// yet.
// </todo>
class NewMSSimulator
{
public:
// Constructor from name only
NewMSSimulator(const String&);
// Constructor from existing MS
NewMSSimulator(MeasurementSet&);
// Copy constructor - for completeness only
NewMSSimulator(const NewMSSimulator & mss);
//# Destructor
~NewMSSimulator();
//# Operators
// Assignment
NewMSSimulator & operator=(const NewMSSimulator &);
// Set maximum amount of data (bytes) to be written into any one
// scratch column hypercube
void setMaxData(const Double maxData=2e9) {maxData_p=maxData;}
// set the antenna and array data. These are written immediately to the
// existing MS. The same model is used for the other init infor.
void initAnt(const String& telname,
const Vector<Double>& x,
const Vector<Double>& y,
const Vector<Double>& z,
const Vector<Double>& dishDiameter,
const Vector<Double>& offset,
const Vector<String>& mount,
const Vector<String>& name,
const Vector<String>& padname,
const String& coordsystem,
const MPosition& mRefLocation);
// get the info back
bool getAnt(String& telescope, Int& nAnt, Matrix<Double>* antXYZ,
Vector<Double>& antDiam, Vector<Double>& offset,
Vector<String>& mount, Vector<String>& name, Vector<String>& padname,
String& coordsystem, MPosition& mRefLocation );
// set the observed fields
void initFields(const String& sourceName,
const MDirection& sourceDirection,
const String& calCode);
bool getFields(Int& nField,
Vector<String>& sourceName,
Vector<MDirection>& sourceDirection,
Vector<String>& calCode);
// set the Feeds; brain dead version
void initFeeds(const String& mode);
bool getFeedMode(String& mode);
// set the Feeds; Smart version
void initFeeds(const String& mode,
const Vector<Double>& x,
const Vector<Double>& y,
const Vector<String>& pol);
// set the spectral windows information
void initSpWindows(const String& spWindowName,
const Int& nChan,
const Quantity& startFreq,
const Quantity& freqInc,
const Quantity& freqRes,
const MFrequency::Types& freqType,
const String& stokesString);
bool getSpWindows(Int& nSpw,
Vector<String>& spWindowName,
Vector<Int>& nChan,
Vector<Quantity>& startFreq,
Vector<Quantity>& freqInc,
Vector<String>& stokesString);
void setFractionBlockageLimit(const Double fraclimit)
{ fractionBlockageLimit_p = fraclimit; }
void setElevationLimit(const Quantity& ellimit)
{ elevationLimit_p = ellimit; }
void setAutoCorrelationWt(const Float autocorrwt)
{ autoCorrelationWt_p = autocorrwt; }
void settimes(const Quantity& qIntegrationTime,
const Bool useHourAngles,
const MEpoch& mRefTime);
void observe(const String& sourceName,
const String& spWindowName,
const Quantity& qStartTime,
const Quantity& qStopTime,
const Bool add_observation=True,
//# from int ASDM2MSFiller::addUniqueState(
//# defaults for ALMA as known on 20100831
const Bool state_sig=True,
const Bool state_ref=True,
const double& state_cal=0.,
const double& state_load=0.,
const unsigned int state_sub_scan=1,
const String& state_obs_mode="OBSERVE_TARGET.ON_SOURCE",
const String& observername="CASA simulator",
const String& projectname="CASA simulation");
void observe(const Vector<String>& sourceNames,
const String& spWindowName,
const Vector<Quantity>& qStartTimes,
const Vector<Quantity>& qStopTimes,
const Vector<MDirection>& directions,
const Bool add_observation=True,
//# from int ASDM2MSFiller::addUniqueState(
//# defaults for ALMA as known on 20100831
const Bool state_sig=True,
const Bool state_ref=True,
const double& state_cal=0.,
const double& state_load=0.,
const unsigned int state_sub_scan=1,
const String& state_obs_mode="OBSERVE_TARGET.ON_SOURCE",
const String& observername="CASA simulator",
const String& projectname="CASA simulation");
std::shared_ptr<MeasurementSet> getMs () const;
private:
// Prevent use of default constructor
NewMSSimulator() {}
//# Data Members
Double fractionBlockageLimit_p;
Quantity elevationLimit_p;
Float autoCorrelationWt_p;
String telescope_p;
Quantity qIntegrationTime_p;
Bool useHourAngle_p;
Bool hourAngleDefined_p;
MEpoch mRefTime_p;
Double t_offset_p;
Double dataWritten_p;
Int hyperCubeID_p;
Bool hasHyperCubes_p;
Int lastSpWID_p;
Int lastNchan_p;
std::shared_ptr<MeasurementSet> ms_p;
TiledDataStManAccessor dataAcc_p, scratchDataAcc_p, sigmaAcc_p, flagAcc_p;
Double maxData_p;
void local2global(Vector<Double>& xReturned,
Vector<Double>& yReturned,
Vector<Double>& zReturned,
const MPosition& mRefLocation,
const Vector<Double>& xIn,
const Vector<Double>& yIn,
const Vector<Double>& zIn);
void longlat2global(Vector<Double>& xReturned,
Vector<Double>& yReturned,
Vector<Double>& zReturned,
const MPosition& mRefLocation,
const Vector<Double>& xIn,
const Vector<Double>& yIn,
const Vector<Double>& zIn);
// Returns the fractional blockage of one antenna by another
// We will want to put this somewhere else eventually, but I don't yet know where!
// Till then.
// fraction1: fraction of antenna 1 that is blocked by 2
// fraction2: fraction of antenna 2 that is blocked by 1
// hint: at least one of the two will be 0.0
void blockage(Double &fraction1, Double &fraction2,
const Vector<Double>& uvw, // uvw in same units as diam!
const Double diam1, const Double diam2);
String formatDirection(const MDirection&);
String formatTime(const Double);
void addHyperCubes(const Int id, const Int nBase, const Int nChan, const Int nCorr);
void defaults();
Bool calcAntUVW(MEpoch& epoch, MDirection& refdir,
Matrix<Double>& uvwAnt);
};
} //# NAMESPACE CASACORE - END
#endif
|