LCOV - code coverage report
Current view: top level - synthesis/CalTables - CLPatchPanel.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 14 0.0 %
Date: 2024-10-10 11:40:37 Functions: 0 17 0.0 %

          Line data    Source code
       1             : //# CLPatchPanel.h: Definition for Calibration patch panel
       2             : //# Copyright (C) 1996,1997,1998,1999,2000,2001,2002,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             : 
      28             : #ifndef CALTABLES_CLPATCHPANEL_H
      29             : #define CALTABLES_CLPATCHPANEL_H
      30             : 
      31             : #include <synthesis/CalTables/NewCalTable.h>
      32             : #include <synthesis/CalTables/CTColumns.h>
      33             : #include <synthesis/CalTables/CTTimeInterp1.h>
      34             : #include <synthesis/CalTables/RIorAParray.h>
      35             : #include <synthesis/CalTables/VisCalEnum.h>
      36             : #include <casacore/scimath/Mathematics/InterpolateArray1D.h>
      37             : #include <casacore/casa/Arrays/Array.h>
      38             : #include <casacore/casa/Arrays/Matrix.h>
      39             : #include <casacore/casa/Arrays/Cube.h>
      40             : #include <casacore/ms/MeasurementSets/MeasurementSet.h>
      41             : #include <casacore/ms/MeasurementSets/MSField.h>
      42             : #include <casacore/ms/MeasurementSets/MSColumns.h>
      43             : #include <casacore/casa/aips.h>
      44             : 
      45             : //#include <casa/BasicSL/Constants.h>
      46             : //#include <casa/OS/File.h>
      47             : //#include <casa/Logging/LogMessage.h>
      48             : //#include <casa/Logging/LogSink.h>
      49             : 
      50             : namespace casacore{
      51             : 
      52             : class MSSelectableTable;
      53             : }
      54             : 
      55             : namespace casa { //# NAMESPACE CASA - BEGIN
      56             : 
      57             : 
      58             : // A specialized key class for Calibration patch panel elements
      59             : class CalPatchKey
      60             : {
      61             : public:
      62             :   CalPatchKey(casacore::IPosition keyids);
      63           0 :   virtual ~CalPatchKey() {};
      64             :   virtual casacore::Bool operator<(const CalPatchKey& other) const;
      65             :   virtual casacore::String print() const =0;
      66             : private:
      67             :   casacore::Vector<casacore::Int> cpk_;
      68             : };
      69             : 
      70             : class MSCalPatchKey : virtual public CalPatchKey
      71             : {
      72             : public:
      73             :   MSCalPatchKey(casacore::Int obs,casacore::Int scan,casacore::Int fld,casacore::Int ent,casacore::Int spw,casacore::Int ant=-1);
      74           0 :   virtual ~MSCalPatchKey(){};
      75             :   virtual casacore::String print() const;
      76             : private:
      77             :   casacore::Int obs_,scan_,fld_,ent_,spw_,ant_;
      78             : };
      79             : 
      80             : 
      81             : class CTCalPatchKey : virtual public CalPatchKey
      82             : {
      83             : public:
      84             :   CTCalPatchKey(casacore::Int clsl,casacore::Int obs,casacore::Int scan,casacore::Int fld,casacore::Int spw,casacore::Int ant=-1);
      85           0 :   virtual ~CTCalPatchKey(){};
      86             :   virtual casacore::String print() const;
      87             : private:
      88             :   casacore::Int clsl_,obs_,scan_,fld_,spw_,ant_;
      89             : };
      90             : 
      91             : // A base class for calmaps
      92             : class CalMap
      93             : {
      94             : public:
      95             : 
      96             :   // Null ctor (defaults everything)
      97             :   CalMap();
      98             : 
      99             :   // Construct from a Vector
     100             :   CalMap(const casacore::Vector<casacore::Int>& calmap);  
     101             : 
     102             :   // Construct from a casacore::Record (int:int; TBD: need an casacore::MS to parse strings)
     103             :   //  CalMap(const casacore::Record calmap):
     104             : 
     105             :   // Construct from a casacore::String (an algorithm or selection)
     106             :   //CalMap(casacore::String calmaptype,const NewCalTable& ct, const casacore::MeasurementSet ms,
     107             :   //     casacore::Vector<casacore::Int> availids=casacore::Vector<casacore::Int>());
     108             :   // Construct from casacore::String and 2 Vectors (default, and explict to/from override)
     109             :   // TBD
     110             : 
     111             :   // Index method returns the ct id mapped to the specified msid
     112             :   casacore::Int operator()(casacore::Int msid) const; // ,const casacore::Vector<casacore::Int> availids=casacore::Vector<casacore::Int>()) const;
     113             : 
     114             :   // Return the ctids required for a set a msids (from among those available)
     115             :   //  TBD: what to do if nominally required ctid is UNavailable (return only the avail ones?)
     116             :   casacore::Vector<casacore::Int> ctids(const casacore::Vector<casacore::Int>& msids) const;//   const casacore::Vector<casacore::Int> availctids=casacore::Vector<casacore::Int>(0)) const;
     117             : 
     118             :   // Return the msids that will be satisfied by a specific ctid
     119             :   casacore::Vector<casacore::Int> msids(casacore::Int ctid,const casacore::Vector<casacore::Int>& superset=casacore::Vector<casacore::Int>()) const;
     120             : 
     121             :   // Return the verbatim (casacore::Vector) map
     122           0 :   casacore::Vector<casacore::Int> vmap() const { return vcalmap_; };
     123             : 
     124             : protected:
     125             :   casacore::Vector<casacore::Int> vcalmap_;  // simple
     126             :   //casacore::Matrix<casacore::Int> mcalmap_;  // per-id prioritized, e.g., 'nearest'
     127             : };
     128             : 
     129             : class FieldCalMap : public CalMap
     130             : {
     131             : public:
     132             : 
     133             :   // Null ctor
     134             :   FieldCalMap();
     135             : 
     136             :   // Construct from casacore::Vector<casacore::Int> (override CalMap)
     137             :   FieldCalMap(const casacore::Vector<casacore::Int>& calmap);
     138             : 
     139             :   // Algorithmic ctor that uses casacore::MS and CT meta info
     140             :   FieldCalMap(const casacore::String fieldcalmap, const casacore::MeasurementSet& ms, const NewCalTable& ct);
     141             :   FieldCalMap(const casacore::String fieldcalmap, 
     142             :               const casacore::MeasurementSet& ms, const NewCalTable& ct,
     143             :               casacore::String& extfldsel);
     144             : 
     145             : private:
     146             : 
     147             :   // Calculate the simple nearest field map
     148             :   void setNearestFieldMap(const casacore::MeasurementSet& ms, const NewCalTable& ct);
     149             :   void setNearestFieldMap(const NewCalTable& ctasms, const NewCalTable& ct);
     150             :   void setNearestFieldMap(const casacore::MSFieldColumns& msfc, const ROCTColumns& ctc);
     151             : 
     152             :   // Parse field selection map
     153             :   void setSelectedFieldMap(const casacore::String& fieldsel,
     154             :                            const casacore::MeasurementSet& ms,const NewCalTable& ct);
     155             :   void setSelectedFieldMap(const casacore::String& fieldsel,
     156             :                            const casacore::MeasurementSet& ms,const NewCalTable& ct,
     157             :                            casacore::String& extfldsel);
     158             : 
     159             :   // User's specification
     160             :   casacore::String fieldcalmap_;
     161             : 
     162             : 
     163             : };
     164             : 
     165             : class ObsCalMap : public CalMap
     166             : {
     167             : public:
     168             : 
     169             :   // Null ctor
     170             :   ObsCalMap();
     171             : 
     172             :   // Algorithmic ctor that uses casacore::MS meta info
     173             :   ObsCalMap(const casacore::String obscalmap,
     174             :             const casacore::MeasurementSet& ms);
     175             : 
     176             : };
     177             : 
     178             : class ScanCalMap : public CalMap
     179             : {
     180             : public:
     181             : 
     182             :   // Null ctor
     183             :   ScanCalMap();
     184             : 
     185             :   // Algorithmic ctor that uses casacore::MS meta info
     186             :   ScanCalMap(const casacore::String scancalmap,
     187             :              const casacore::MeasurementSet& ms);
     188             : 
     189             : };
     190             : 
     191             : 
     192             : // A class to parse the contents of a single CalLib slice 
     193             : //  i.e., for one caltable, one setup
     194             : class CalLibSlice
     195             : {
     196             : public:
     197             :   CalLibSlice(casacore::String obs, casacore::String scan, casacore::String fld, casacore::String ent, casacore::String spw,
     198             :               casacore::String tinterp,casacore::String finterp,
     199             :               casacore::Vector<casacore::Int> obsmap=casacore::Vector<casacore::Int>(1,-1), 
     200             :               casacore::Vector<casacore::Int> scanmap=casacore::Vector<casacore::Int>(1,-1), 
     201             :               casacore::Vector<casacore::Int> fldmap=casacore::Vector<casacore::Int>(1,-1), 
     202             :               casacore::Vector<casacore::Int> spwmap=casacore::Vector<casacore::Int>(1,-1), 
     203             :               casacore::Vector<casacore::Int> antmap=casacore::Vector<casacore::Int>(1,-1));
     204             :   CalLibSlice(const casacore::Record& clslice,
     205             :               const casacore::MeasurementSet& ms=casacore::MeasurementSet(),
     206             :               const NewCalTable& ct=NewCalTable());
     207             : 
     208             : 
     209             :   casacore::String obs,scan,fld,ent,spw;
     210             :   casacore::String tinterp,finterp;
     211             :   CalMap obsmap, scanmap, fldmap, spwmap, antmap;
     212             : 
     213             :   // validation
     214             :   static casacore::Bool validateCLS(const casacore::Record& clslice);
     215             : 
     216             :   // Extract as a record
     217             :   casacore::Record asRecord();
     218             : 
     219             :   // Report maps
     220             :   casacore::String state();
     221             : 
     222             :   // Support external field selection (for trimming in-focus caltable)
     223             :   casacore::String extfldsel;
     224             : 
     225             : };
     226             : 
     227             : 
     228             : class CLPPResult
     229             : {
     230             : public:
     231             : 
     232             :   CLPPResult();
     233             :   CLPPResult(const casacore::IPosition& shape);
     234             :   CLPPResult(casacore::uInt nPar,casacore::uInt nFPar,casacore::uInt nChan,casacore::uInt nelem);
     235             :   CLPPResult& operator=(const CLPPResult& other); // avoids deep casacore::Array copies
     236             : 
     237             :   void resize(casacore::uInt nPar,casacore::uInt nFPar,casacore::uInt nChan,casacore::uInt nelem);
     238             : 
     239             :   casacore::Matrix<casacore::Float> operator()(casacore::Int ielem) { return result_.xyPlane(ielem); };
     240           0 :   casacore::Matrix<casacore::Float> result(casacore::Int ielem) { return result_.xyPlane(ielem); };
     241           0 :   casacore::Matrix<casacore::Bool> resultFlag(casacore::Int ielem) { return resultFlag_.xyPlane(ielem); };
     242             : 
     243             :   casacore::Cube<casacore::Float> result_;
     244             :   casacore::Cube<casacore::Bool> resultFlag_;
     245             : 
     246             :   //private:
     247             : 
     248             : };
     249             : 
     250             : 
     251             : 
     252             : 
     253             : 
     254             : 
     255             : class CLPatchPanel
     256             : {
     257             : public:
     258             : 
     259             :   // From caltable name and casacore::MS shapes
     260             :   CLPatchPanel(const casacore::String& ctname,
     261             :                const casacore::Record& callib,
     262             :                VisCalEnum::MatrixType mtype,
     263             :                casacore::Int nPar,
     264             :                const CTTIFactoryPtr cttifactoryptr=&CTTimeInterp1::factory);
     265             : 
     266             :    // From caltable name and (selected) casacore::MS 
     267             :   CLPatchPanel(const casacore::String& ctname,
     268             :                const casacore::MeasurementSet& ms,
     269             :                const casacore::Record& callib,
     270             :                VisCalEnum::MatrixType mtype,
     271             :                casacore::Int nPar,
     272             :                const CTTIFactoryPtr cttifactoryptr=&CTTimeInterp1::factory);
     273             :   // Destructor
     274             :   virtual ~CLPatchPanel();
     275             : 
     276             :   // Is specific calibration explicitly available for a obs,fld,intent,spw,ant combination?
     277             :   casacore::Bool calAvailable(casacore::Int obs, casacore::Int scan,
     278             :                               casacore::Int fld, casacore::Int ent, 
     279             :                               casacore::Int spw, casacore::Int ant=-1);
     280             :   // Are specified indices OK for this CL (i.e., not explicitly marked as expected but absent)
     281             :   //  Will be calibrated if calAvailable=true, will be ignored if calAvailable()=false
     282             :   casacore::Bool MSIndicesOK(casacore::Int obs, casacore::Int scan,
     283             :                              casacore::Int fld, casacore::Int ent, 
     284             :                              casacore::Int spw, casacore::Int ant=-1);
     285             : 
     286             :   // Interpolate, given input obs, field, intent, spw, timestamp, & (optionally) freq 
     287             :   //    returns T if new result (anywhere,anyhow)
     288             :   //  For casacore::Complex params (calls casacore::Float version)
     289             :   casacore::Bool interpolate(casacore::Cube<casacore::Complex>& resultC, casacore::Cube<casacore::Bool>& resFlag,
     290             :                    casacore::Int obs, casacore::Int scan, casacore::Int fld, casacore::Int ent, casacore::Int spw, 
     291             :                    casacore::Double time, casacore::Double freq=-1.0);
     292             :   //  For casacore::Float params
     293             :   casacore::Bool interpolate(casacore::Cube<casacore::Float>& resultR, casacore::Cube<casacore::Bool>& resFlag,
     294             :                    casacore::Int obs, casacore::Int scan, casacore::Int fld, casacore::Int ent, casacore::Int spw, 
     295             :                    casacore::Double time, casacore::Double freq=-1.0);
     296             : 
     297             :   // Interpolate, given input obs, field, intent, spw, timestamp, & freq list
     298             :   //   This is for freqdep interpolation context
     299             :   //    returns T if new result (anywhere,anyhow)
     300             :   //  For casacore::Complex params (calls casacore::Float version)
     301             :   casacore::Bool interpolate(casacore::Cube<casacore::Complex>& resultC, casacore::Cube<casacore::Bool>& resFlag,
     302             :                    casacore::Int obs, casacore::Int scan, casacore::Int fld, casacore::Int ent, casacore::Int spw, 
     303             :                    casacore::Double time, const casacore::Vector<casacore::Double>& freq);
     304             :   //  For casacore::Float params
     305             :   casacore::Bool interpolate(casacore::Cube<casacore::Float>& resultR, casacore::Cube<casacore::Bool>& resFlag,
     306             :                    casacore::Int obs, casacore::Int scan, casacore::Int fld, casacore::Int ent, casacore::Int spw, 
     307             :                    casacore::Double time, const casacore::Vector<casacore::Double>& freq);
     308             : 
     309             :   // Const access to various state
     310             :   // TBD
     311             : 
     312             :   casacore::Bool getTresult(casacore::Cube<casacore::Float>& resultR, casacore::Cube<casacore::Bool>& resFlag,
     313             :                             casacore::Int obs, casacore::Int scan, casacore::Int fld,
     314             :                             casacore::Int ent, casacore::Int spw);
     315             : 
     316             :   // Access to CalTable's freq info
     317           0 :   casacore::Int nCTSpw() {return nCTSpw_;};
     318           0 :   const casacore::Vector<casacore::Double>& freqIn(casacore::Int spw)  {return freqIn_[spw]; }; // per spw
     319           0 :   const casacore::Vector<casacore::Double>& refFreqIn() { return refFreqIn_; };  // indexed by spw
     320             : 
     321             :   // Report state
     322             :   void listmappings();
     323             :   void state();
     324             : 
     325             :   // CASA version of the internal caltable
     326           0 :   casacore::String CTCASAvers() { return ct_.CASAvers(); };
     327             : 
     328             : private:
     329             : 
     330             :   // Null ctor does nothing
     331             :   CLPatchPanel() :mtype_(VisCalEnum::GLOBAL) {};
     332             : 
     333             : 
     334             : 
     335             :   // Methods to support layered selection
     336             :   void selectOnCTorMS(casacore::Table& ctout,casacore::MSSelectableTable& msst,
     337             :                       const casacore::String& obs, const casacore::String& scan,
     338             :                       const casacore::String& fld, const casacore::String& ent,
     339             :                       const casacore::String& spw, const casacore::String& ant,
     340             :                       const casacore::String& taql);
     341             :   void selectOnMS(casacore::MeasurementSet& msout,const casacore::MeasurementSet& msin,
     342             :                   const casacore::String& obs, const casacore::String& scan,
     343             :                   const casacore::String& fld, const casacore::String& ent,
     344             :                   const casacore::String& spw, const casacore::String& ant);
     345             :   void selectOnCT(NewCalTable& ctout,const NewCalTable& ctin,
     346             :                   const casacore::String& obs, const casacore::String& scan,
     347             :                   const casacore::String& fld, 
     348             :                   const casacore::String& spw, const casacore::String& ant1);
     349             : 
     350             :   // Extract unique indices from caltables
     351           0 :   casacore::Vector<casacore::Int> getCLuniqueObsIds(NewCalTable& ct) {return getCLuniqueIds(ct,"obs"); };
     352           0 :   casacore::Vector<casacore::Int> getCLuniqueScanIds(NewCalTable& ct) {return getCLuniqueIds(ct,"scan"); };
     353           0 :   casacore::Vector<casacore::Int> getCLuniqueFldIds(NewCalTable& ct) {return getCLuniqueIds(ct,"fld"); };
     354           0 :   casacore::Vector<casacore::Int> getCLuniqueSpwIds(NewCalTable& ct) {return getCLuniqueIds(ct,"spw"); };
     355             :   casacore::Vector<casacore::Int> getCLuniqueIds(NewCalTable& ct, casacore::String vcol);
     356             : 
     357             :   // Extract unique indices (net selected) from MS
     358             :   casacore::Vector<casacore::Int> getMSuniqueIds(casacore::MeasurementSet& ms, casacore::String vcol);
     359             :   
     360             :   // Set generic antenna/baseline map
     361             :   //  void setElemMap();
     362             : 
     363             :   // Resample in frequency
     364             :   void resampleInFreq(casacore::Matrix<casacore::Float>& fres,casacore::Matrix<casacore::Bool>& fflg,const casacore::Vector<casacore::Double>& fout,
     365             :                       casacore::Matrix<casacore::Float>& tres,casacore::Matrix<casacore::Bool>& tflg,const casacore::Vector<casacore::Double>& fin,
     366             :                       casacore::String finterp);
     367             :   void resampleFlagsInFreq(casacore::Vector<casacore::Bool>& flgout,const casacore::Vector<casacore::Double>& fout,
     368             :                            casacore::Vector<casacore::Bool>& flgin,const casacore::Vector<casacore::Double>& fin,
     369             :                            casacore::String finterp);
     370             : 
     371             :   // Baseline index from antenna indices: (assumes a1<=a2 !!)
     372             :   //  inline casacore::Int blnidx(const casacore::Int& a1, const casacore::Int& a2, const casacore::Int& nAnt) { return  a1*nAnt-a1*(a1+1)/2+a2; };
     373             : 
     374             :   // Translate freq axis interpolation string
     375             :   casacore::InterpolateArray1D<casacore::Double,casacore::Float>::InterpolationMethod ftype(casacore::String& strtype);
     376             : 
     377             : 
     378             :   void recordBadMSIndices(const casacore::Vector<casacore::Int>& obs, const casacore::Vector<casacore::Int>& scan,
     379             :                           const casacore::Vector<casacore::Int>& fld, const casacore::Vector<casacore::Int>& ent,
     380             :                           const casacore::Vector<casacore::Int>& spw);
     381             : 
     382             : 
     383             :   // PRIVATE DATA:
     384             :   
     385             :   // The Caltable
     386             :   NewCalTable ct_, ctasms_;
     387             : 
     388             :   // Associated (selected) MS
     389             :   casacore::MeasurementSet ms_;
     390             : 
     391             :   // casacore::Matrix type
     392             :   VisCalEnum::MatrixType mtype_;
     393             : 
     394             :   // Are parameters fundamentally complex?
     395             :   casacore::Bool isCmplx_;
     396             : 
     397             :   // The number of (casacore::Float) parameters (per-chan, per-element)
     398             :   casacore::Int nPar_, nFPar_;
     399             : 
     400             :   //  casacore::InterpolateArray1D<casacore::Double,casacore::Float>::InterpolationMethod ia1dmethod_;
     401             : 
     402             :   // CalTable freq axis info
     403             :   casacore::Vector<casacore::Int> nChanIn_;
     404             :   casacore::Vector<casacore::Vector<casacore::Double> > freqIn_;
     405             :   casacore::Vector<casacore::Double> refFreqIn_;
     406             : 
     407             :   // Obs, Field, Spw, Ant _output_ (casacore::MS) sizes 
     408             :   //   calibration required for up to this many
     409             :   casacore::Int nMSObs_, nMSFld_, nMSSpw_, nMSAnt_, nMSElem_;
     410             : 
     411             :   // Obs, Field, Spw, Ant _input_ (CalTable) sizes
     412             :   //  patch panels should not violate these (point to larger indices)
     413             :   casacore::Int nCTObs_, nCTFld_, nCTSpw_, nCTAnt_, nCTElem_;
     414             : 
     415             :   // Maps
     416             :   std::map<CTCalPatchKey,CLPPResult> clTres_;
     417             :   std::map<CTCalPatchKey,casacore::String> ciname_;
     418             :   std::map<CTCalPatchKey,CTTimeInterp1*> ci_;
     419             :   
     420             : 
     421             :   std::map<MSCalPatchKey,CLPPResult> msTres_,msFres_;
     422             :   std::map<MSCalPatchKey,casacore::String> msciname_;
     423             :   std::map<MSCalPatchKey,casacore::String> badmsciname_;
     424             :   std::map<MSCalPatchKey,casacore::Int> ctspw_;
     425             :   std::map<MSCalPatchKey,casacore::String> finterp_;
     426             :   std::map<MSCalPatchKey,CTTimeInterp1*> msci_;
     427             : 
     428             :   // Keep track of last cal result address (per spw)
     429             :   casacore::Vector<casacore::Float*> lastresadd_;  // [nMSspw_]
     430             : 
     431             :   // Control conjugation of baseline-based solutions when mapping requires
     432             :   //  casacore::Vector<casacore::Bool> conjTab_;
     433             : 
     434             : 
     435             :   casacore::Cube<casacore::Float> result_;
     436             :   casacore::Cube<casacore::Bool> resFlag_;
     437             : 
     438             :   casacore::LogIO logsink_;
     439             : 
     440             :   // The factory to use to create CTTimeInterp1s
     441             :   CTTIFactoryPtr cttifactoryptr_;
     442             : 
     443             : };
     444             : 
     445             : 
     446             : } //# NAMESPACE CASA - END
     447             : 
     448             : #endif

Generated by: LCOV version 1.16