SimpleSimVi2.h

Go to the documentation of this file.
00001 //# SimpleSimVi2.h: Rudimentary data simulator
00002 //# Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003
00003 //# Associated Universities, Inc. Washington DC, USA.
00004 //#
00005 //# This library is free software; you can redistribute it and/or modify it
00006 //# under the terms of the GNU Library General Public License as published by
00007 //# the Free Software Foundation; either version 2 of the License, or (at your
00008 //# option) any later version.
00009 //#
00010 //# This library is distributed in the hope that it will be useful, but WITHOUT
00011 //# ANY WARRANTY; without even the Implied warranty of MERCHANTABILITY or
00012 //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
00013 //# License for more details.
00014 //#
00015 //# You should have received a copy of the GNU Library General Public License
00016 //# along with this library; if not, write to the Free Software Foundation,
00017 //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
00018 //#
00019 //# Correspondence concerning AIPS++ should be addressed as follows:
00020 //#        Internet email: aips2-request@nrao.edu.
00021 //#        Postal address: AIPS++ Project Office
00022 //#                        National Radio Astronomy Observatory
00023 //#                        520 Edgemont Road
00024 //#                        Charlottesville, VA 22903-2475 USA
00025 //#
00026 //# $Id: VisibilityIterator2.h,v 19.14 2006/02/28 04:48:58 mvoronko Exp $
00027 
00028 #if ! defined (MSVIS_SimplSimVi2_H)
00029 #define MSVIS_SimplSimVi2_H
00030 
00031 #include <casa/aips.h>
00032 #include <casa/BasicSL.h>
00033 #include <msvis/MSVis/VisBufferComponents2.h>
00034 #include <msvis/MSVis/ViImplementation2.h>
00035 #include <msvis/MSVis/ViiLayerFactory.h>
00036 #include <msvis/MSVis/VisBufferImpl2.h>
00037 #include <msvis/MSVis/VisibilityIterator2.h>
00038 #include <msvis/MSVis/VisBuffer2.h>
00039 #include <measures/Measures/MFrequency.h>
00040 #include <measures/Measures/Stokes.h>
00041 #include <casa/Arrays.h>
00042 
00043 #include <map>
00044 #include <vector>
00045 
00046 #define SSVi2NotPossible() ThrowCc("Not Possible in SimpleSimVi2"); 
00047 #define SSVi2NotYetImplemented() ThrowCc("Not yet implemented in SimpleSimVi2");
00048 
00049 namespace casa { //# NAMESPACE CASA - BEGIN
00050 
00051 class RecordInterface;
00052 class Slice;
00053 class String;
00054 template <typename T, Int n> class SquareMatrix;
00055 template <typename T> class Vector;
00056 class VisImagingWeight;
00057 
00058 namespace vi {
00059 
00060 
00061 //# forward decl
00062 
00063 class Subchunk;
00064 class VisBuffer2;
00065 
00066 
00067 class SimpleSimVi2Parameters {
00068 
00069 public:
00070 
00071   // Default ctor (sets default values, useful for self-testing)
00072   SimpleSimVi2Parameters();
00073 
00074   // Simple, shape-oriented ctor
00075   SimpleSimVi2Parameters(Int nField,Int nScan,Int nSpw,Int nAnt,Int nCorr,
00076                          const Vector<Int>& nTimePerField, const Vector<Int>& nChan,
00077                          Complex c0=Complex(0.0f));
00078 
00079   // Full control
00080   SimpleSimVi2Parameters(Int nField,Int nScan,Int nSpw,Int nAnt,Int nCorr,
00081                          const Vector<Int>& nTimePerField, const Vector<Int>& nChan,
00082                          String date0, Double dt, 
00083                          const Vector<Double>& refFreq, const Vector<Double>& df,
00084                          const Matrix<Float>& stokes, 
00085                          Bool doNoise,
00086                          const Matrix<Float>& gain, const Matrix<Float>& tsys, 
00087                          Bool doNorm=True,
00088                          String polBasis="circ", Bool doAC=False,
00089                          Complex c0=Complex(0.0f));
00090   
00091   SimpleSimVi2Parameters(const SimpleSimVi2Parameters& other);
00092   SimpleSimVi2Parameters& operator=(const SimpleSimVi2Parameters& other);
00093 
00094   ~SimpleSimVi2Parameters();
00095 
00096 
00097   void summary() const;
00098 
00099   Int nField_, nScan_, nSpw_, nAnt_, nCorr_;
00100   Vector<Int> nTimePerField_, nChan_;
00101   String date0_; 
00102   Double dt_;
00103   Vector<Double> refFreq_, df_;
00104   Bool doNoise_;
00105   Matrix<Float> stokes_, gain_, tsys_;
00106   Bool doNorm_;
00107   String polBasis_;
00108   Bool doAC_;
00109   Complex c0_;
00110 
00111   // Return frequencies for specified spw
00112   Vector<Double> freqs(Int spw) const;
00113 
00114 private:
00115   void initialize(const Vector<Int>& nTimePerField, const Vector<Int>& nChan,
00116                   const Vector<Double>& refFreq, const Vector<Double>& df,
00117                   const Matrix<Float>& stokes, 
00118                   const Matrix<Float>& gain, const Matrix<Float>& tsys);
00119 
00120 };
00121 
00122 class SimpleSimVi2 : public ViImplementation2 {
00123 
00124 public:
00125 
00126   SimpleSimVi2 (const SimpleSimVi2Parameters& pars);
00127 
00128   // make noncopyable...
00129   SimpleSimVi2( const SimpleSimVi2& ) = delete;
00130   SimpleSimVi2& operator=( const SimpleSimVi2& ) = delete;
00131 
00132   // Destructor
00133   virtual ~SimpleSimVi2 ();
00134 
00135   // Report the the ViImplementation type
00136   virtual String ViiType() const { return String("Simulated(*)"); };
00137 
00138   //   +==================================+
00139   //   |                                  |
00140   //   | Iteration Control and Monitoring |
00141   //   |                                  |
00142   //   +==================================+
00143   
00144 
00145   // Methods to control and monitor subchunk iteration
00146 
00147   virtual void origin ();
00148   virtual Bool more () const;
00149   virtual void next ();
00150   virtual Subchunk getSubchunkId () const;
00151   
00152   // Methods to control chunk iterator
00153 
00154   virtual void originChunks (Bool forceRewind = False);
00155   virtual Bool moreChunks () const;
00156   virtual void nextChunk ();
00157   
00158   virtual Bool isWritable () const { return False; };
00159 
00160   // Return the time interval (in seconds) used for iteration.
00161   // This is not the same as the INTERVAL column.  Setting the
00162   // the interval requires calling origin chunks before performing
00163   // further iterator.
00164   
00165   virtual Double getInterval() const {return 1.0e9; };
00166   virtual void setInterval (Double) { SSVi2NotPossible() };
00167 
00168   // Select the channels to be returned.  Requires calling originChunks before
00169   // performing additional iteration.
00170   
00171   virtual void setFrequencySelections (const FrequencySelections & selection);
00172 
00173   // Set the 'blocking' size for returning data.
00174   virtual void setRowBlocking (Int) { SSVi2NotPossible() };
00175   
00176   virtual Bool existsColumn (VisBufferComponent2 id) const;
00177   
00178   virtual const SortColumns & getSortColumns() const { SSVi2NotPossible() };
00179 
00180   virtual Bool isNewArrayId () const { return False; };
00181   virtual Bool isNewFieldId () const { return thisField_!=lastField_; };
00182   virtual Bool isNewMs () const  { return False; };
00183   virtual Bool isNewSpectralWindow () const { return thisSpw_!=lastSpw_; };
00184 
00185   // Return the number of rows in the current iteration
00186 
00187   virtual Int nRows () const { return nBsln_; };
00188   
00189   // Return the row ids as from the original root table. This is useful
00190   // to find correspondance between a given row in this iteration to the
00191   // original ms row
00192 
00193   virtual void getRowIds (Vector<uInt> & rowids) const;
00194 
00195   virtual VisBuffer2 * getVisBuffer (const VisibilityIterator2 *) { SSVi2NotPossible() };
00196   virtual VisBuffer2 * getVisBuffer ();
00197 
00198 
00199   //   +=========================+
00200   //   |                         |
00201   //   | Subchunk Data Accessors |
00202   //   |                         |
00203   //   +=========================+
00204   
00205   // Return info
00206   virtual void antenna1 (Vector<Int> & ant1) const;
00207   virtual void antenna2 (Vector<Int> & ant2) const;
00208   virtual void corrType (Vector<Int> & corrTypes) const;
00209   virtual Int  dataDescriptionId () const;
00210   virtual void dataDescriptionIds (Vector<Int> & ddis) const;
00211   virtual void exposure (Vector<Double> & expo) const;
00212   virtual void feed1 (Vector<Int> & fd1) const;
00213   virtual void feed2 (Vector<Int> & fd2) const;
00214   virtual void fieldIds (Vector<Int>&) const;
00215   virtual void arrayIds (Vector<Int>&) const;
00216   virtual String fieldName () const;
00217 
00218   virtual void flag (Cube<Bool> & flags) const;
00219   virtual void flag (Matrix<Bool> &) const { SSVi2NotPossible() };
00220   virtual Bool flagCategoryExists () const { return False; };
00221   virtual void flagCategory (Array<Bool> &) const { SSVi2NotPossible() };
00222   virtual void flagRow (Vector<Bool> & rowflags) const;
00223   virtual void observationId (Vector<Int> & obsids) const;
00224   virtual Int polarizationId () const;
00225   virtual void processorId (Vector<Int> & procids) const;
00226   virtual void scan (Vector<Int> & scans) const;
00227   virtual String sourceName () const;
00228   virtual void stateId (Vector<Int> & stateids) const;
00229   virtual void jonesC (Vector<SquareMatrix<Complex, 2> > &) const { SSVi2NotPossible() };
00230   virtual Int polFrame () const;
00231   virtual void sigma (Matrix<Float> & sigmat) const;
00232   virtual Int spectralWindow () const;
00233   virtual void spectralWindows (Vector<Int> & spws) const;
00234   virtual void time (Vector<Double> & t) const;
00235   virtual void timeCentroid (Vector<Double> & t) const;
00236   virtual void timeInterval (Vector<Double> & ti) const;
00237   virtual void uvw (Matrix<Double> & uvwmat) const;
00238 
00239   virtual void visibilityCorrected (Cube<Complex> & vis) const;
00240   virtual void visibilityModel (Cube<Complex> & vis) const;
00241   virtual void visibilityObserved (Cube<Complex> & vis) const;
00242   virtual void floatData (Cube<Float> & fcube) const;
00243 
00244   virtual IPosition visibilityShape () const;
00245 
00246   virtual void weight (Matrix<Float> & wtmat) const;
00247   virtual Bool weightSpectrumExists () const;
00248   virtual Bool sigmaSpectrumExists () const;
00249   virtual void weightSpectrum (Cube<Float> & wtsp) const;
00250   virtual void sigmaSpectrum (Cube<Float> & wtsp) const;
00251 
00252   virtual void setWeightScaling (CountedPtr<WeightScaling>) { SSVi2NotPossible() };
00253   virtual Bool hasWeightScaling () const { return False; };
00254   virtual CountedPtr<WeightScaling> getWeightScaling () const; //  { SSVi2NotPossible() };
00255 
00256   //   +------------------------+
00257   //   |                        |
00258   //   | Angular Data Providers |
00259   //   |                        |
00260   //   +------------------------+
00261 
00262   // No underlying geometry is available for these!
00263   virtual Bool allBeamOffsetsZero () const { SSVi2NotPossible() };
00264   virtual MDirection azel0 (Double) const { SSVi2NotPossible() };
00265   virtual const Vector<MDirection> & azel (Double) const { SSVi2NotPossible() };
00266   virtual const Vector<Float> & feed_pa (Double) const { SSVi2NotPossible() };
00267   virtual const Cube<RigidVector<Double, 2> > & getBeamOffsets () const { SSVi2NotPossible() };
00268   virtual Double hourang (Double) const { SSVi2NotPossible() };
00269   virtual const Float & parang0 (Double) const { SSVi2NotPossible() };
00270   virtual const Vector<Float> & parang (Double) const { SSVi2NotPossible() };
00271   virtual const MDirection & phaseCenter () const { return phaseCenter_; }; // trivial value (for now)
00272   virtual const Cube<Double> & receptorAngles () const { SSVi2NotPossible() };
00273 
00274   //   +=========================+
00275   //   |                         |
00276   //   | Chunk and MS Level Data |
00277   //   |                         |
00278   //   +=========================+
00279 
00280   virtual const Vector<String> & antennaMounts () const { SSVi2NotPossible() };
00281   virtual const VisImagingWeight & getImagingWeightGenerator () const { SSVi2NotPossible() };
00282   
00283   virtual MFrequency::Types getObservatoryFrequencyType () const { SSVi2NotPossible() };
00284   virtual MPosition getObservatoryPosition () const { SSVi2NotPossible() };
00285   virtual Vector<Float> getReceptor0Angle () { SSVi2NotPossible() };
00286  
00287   virtual Int getReportingFrameOfReference () const { return -2;  /*SSVi2NotPossible()*/ };
00288   virtual void setReportingFrameOfReference (Int) { SSVi2NotPossible() };
00289  
00290   virtual MEpoch getEpoch () const;
00291 
00292   virtual Vector<Int> getCorrelations () const;
00293 
00294   virtual Vector<Stokes::StokesTypes> getCorrelationTypesDefined () const { return corrdef_; /*SSVi2NotPossible()*/ };
00295   virtual Vector<Stokes::StokesTypes> getCorrelationTypesSelected () const { return corrdef_; /*SSVi2NotPossible()*/ };
00296 
00297   virtual Vector<Int> getChannels (Double time, Int frameOfReference, Int spectralWndow = -1,
00298                                    Int msId = -1) const;
00299   virtual Vector<Double> getFrequencies (Double time, Int frameOfReference, Int spectralWndow = -1,
00300                                          Int msId = -1) const;
00301 
00302   //reference to actual ms in interator  (TRIVIAL returns
00303   virtual Int msId () const { return -1; }; // zero-based index of current MS in set of MSs
00304   virtual const MeasurementSet & ms () const { SSVi2NotPossible() };
00305   virtual Int getNMs () const { return 0; };
00306 
00307   // Name of the MS in the interator
00308   virtual String msName() const { return String("<noms>"); };
00309 
00310   // Call to use the slurp i/o method for all scalar columns. 
00311   //  Not meaningful for non-I/O
00312   virtual void slurp () const { SSVi2NotPossible() };
00313 
00314   // Access the current ROMSColumns object in MSIter -- NOT POSSIBLE
00315   virtual const vi::SubtableColumns & subtableColumns () const { SSVi2NotPossible() };
00316 
00317 
00318   // get back the selected spectral windows and spectral channels for
00319   // current ms
00320 
00321   virtual const SpectralWindowChannels & getSpectralWindowChannels (Int msId, Int spectralWindowId) const;
00322 
00323   //assign a VisImagingWeight object to this iterator
00324   virtual void useImagingWeight (const VisImagingWeight & ) { SSVi2NotPossible() };
00325   
00326   // Return number of antennasm spws, polids, ddids
00327   
00328   virtual Int nAntennas () const;
00329   virtual Int nDataDescriptionIds () const;
00330   virtual Int nPolarizationIds () const;
00331   virtual Int nRowsInChunk () const; // number rows in current chunk
00332   virtual Int nRowsViWillSweep () const; // number of rows in all selected ms's
00333   virtual Int nSpectralWindows () const;
00334 
00335   // Writeback methods are Irrelevant for non-disk-reading VI2
00336   virtual void writeBackChanges (VisBuffer2* ) { SSVi2NotPossible() };
00337   virtual void writeFlag (const Cube<Bool> &) { SSVi2NotPossible() };
00338   virtual void writeFlagRow (const Vector<Bool> &) { SSVi2NotPossible() };
00339   virtual void writeFlagCategory(const Array<Bool>&) { SSVi2NotPossible() };
00340   virtual void writeVisCorrected (const Cube<Complex> &) { SSVi2NotPossible() };
00341   virtual void writeVisModel (const Cube<Complex> &) { SSVi2NotPossible() };
00342   virtual void writeVisObserved (const Cube<Complex> &) { SSVi2NotPossible() };
00343   virtual void writeWeight (const Matrix<Float> &) { SSVi2NotPossible() };
00344   virtual void writeWeightSpectrum (const Cube<Float> &) { SSVi2NotPossible() };
00345   virtual void initWeightSpectrum (const Cube<Float> &) { SSVi2NotPossible() };
00346   virtual void writeSigmaSpectrum (const Cube<Float> &) { SSVi2NotPossible() };
00347   virtual void writeSigma (const Matrix<Float> &) { SSVi2NotPossible() };
00348   virtual void writeModel(const RecordInterface&,Bool,Bool) { SSVi2NotPossible() };
00349 
00350 private:
00351 
00352   // Make default ctor invisible
00353   SimpleSimVi2 ();
00354 
00355   // Keep VB2 sync'd
00356   void configureNewSubchunk();
00357 
00358   // Generate noise on data
00359   void addNoise(Cube<Complex>& vis) const;
00360 
00361   // Input parameters
00362   const SimpleSimVi2Parameters pars_;
00363   /*
00364   Int nField_,nScan_,nSpw_,nAnt_,nCorr_;
00365   Vector<Int> nTimePerField_, nChan_;
00366   String date0_;
00367   Double dt_;
00368   Vector<Double> refFreq_, df_;
00369   Matrix<Float> stokes_, sefd_;
00370   String polBasis_;
00371   Bool doAC_;
00372   */
00373 
00374   // Derived parameters
00375   Int  nChunk_, nBsln_;
00376   Double t0_;
00377   Vector<Float> wt0_;
00378   Matrix<Complex> vis0_;
00379 
00380   // Counters
00381   Int iChunk_,iSubChunk_,iRow0_;
00382   Int iScan_;
00383   Double iChunkTime0_;
00384 
00385   // Meta-info
00386   Int thisScan_, thisField_, thisSpw_;
00387   Int lastScan_, lastField_, lastSpw_;
00388   Double thisTime_;
00389 
00390   // Correlation stuff
00391   Vector<Stokes::StokesTypes> corrdef_;
00392 
00393   // The associated VB
00394   VisBuffer2* vb_;
00395 
00396   // Trivial (for now) MDirection, so phaseCenter() has something to return
00397   MDirection phaseCenter_;
00398 
00399 };
00400 
00401 
00402 
00403 class SimpleSimVi2Factory : public ViFactory {
00404 
00405 public:
00406 
00407   SimpleSimVi2Factory(const SimpleSimVi2Parameters& pars);
00408   
00409   ~SimpleSimVi2Factory ();
00410 
00411 protected:
00412 
00413   virtual ViImplementation2 * createVi () const;
00414 
00415 private:
00416 
00417   const SimpleSimVi2Parameters& pars_;
00418 
00419 };
00420 
00421 
00422 class SimpleSimVi2LayerFactory : public ViiLayerFactory {
00423 
00424 public:
00425 
00426   SimpleSimVi2LayerFactory(const SimpleSimVi2Parameters& pars);
00427 
00428   virtual ~SimpleSimVi2LayerFactory () {}
00429 
00430 protected:
00431 
00432   // SimpleSimVi2-specific layer-creater
00433   //   
00434   virtual ViImplementation2 * createInstance (ViImplementation2* vii0) const;
00435 
00436 private:
00437 
00438   // Store a copy of the parameters
00439   const SimpleSimVi2Parameters pars_;
00440 
00441 
00442 };
00443 
00444 
00445 
00446 
00447 
00448 
00449 } // end namespace vi
00450 
00451 } //# NAMESPACE CASA - END
00452 
00453 #endif // ! defined (MSVIS_SimpleSimVi2_H)
00454 
00455 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on 31 Aug 2016 for casa by  doxygen 1.6.1