LCOV - code coverage report
Current view: top level - air_casawvr/casawvr - msgaintable.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 45 55 81.8 %
Date: 2024-12-11 20:54:31 Functions: 1 2 50.0 %

          Line data    Source code
       1             : /**
       2             :    Bojan Nikolic <b.nikolic@mrao.cam.ac.uk>, <bojan@bnikolic.co.uk>
       3             :    Initial version January 2010.
       4             :    Maintained by ESO since 2013. 
       5             :    
       6             :    This file is part of LibAIR and is licensed under GNU Public
       7             :    License Version 2
       8             :    
       9             :    \file msgaintable.cpp
      10             :    Renamed msgaintable.cc 2023
      11             : 
      12             :    
      13             : */
      14             : 
      15             : #include "msgaintable.h"
      16             : #include "msspec.h"
      17             : 
      18             : #include <synthesis/CalTables/NewCalTable.h>
      19             : #include <synthesis/CalTables/CalTable.h>
      20             : #include <synthesis/CalTables/SolvableVJTable.h>
      21             : #include <synthesis/CalTables/CalSet.h>
      22             : #include <synthesis/CalTables/CalHistRecord.h>
      23             : 
      24             : #include "../src/libair_main.h"
      25             : #include "../src/apps/arraygains.h"
      26             : #include "../src/dispersion.h"
      27             : 
      28             : // These are used to turn the directory where the data files live into
      29             : // a string
      30             : #define bnstringer1(x) #x
      31             : #define bnstringer2(x) bnstringer1(x)
      32             : 
      33             : using namespace casacore;
      34             : 
      35             : namespace LibAIR2 {
      36             : 
      37             :   // Write a NewCalTable
      38          25 :   void writeNewGainTbl(const ArrayGains &g,
      39             :                        const char *fnameout,
      40             :                        const MSSpec &s,
      41             :                        const std::set<size_t> &reverse,
      42             :                        bool disperse,
      43             :                        const std::string &msname,
      44             :                        const std::string &invocation,
      45             :                        const LibAIR2::AntSet &interpImpossibleAnts)
      46             :   {
      47             : 
      48             :     using namespace casa;
      49             : 
      50          25 :     const size_t nAnt=g.nAnt;
      51          25 :     const size_t ntimes=g.g_time().size();
      52          25 :     const size_t nspw=s.spws.size();
      53             :     
      54          25 :     Vector<Int> nChan(nspw, 1);
      55          25 :     Vector<Int> nTime(nspw, ntimes);
      56             : 
      57          25 :     const double deltat=g.g_time()[1]-g.g_time()[0];
      58             : 
      59          25 :     DispersionTab dispt;
      60          25 :     if (disperse)
      61             :     {
      62             :       // Only bother loading the table if dispersion is going to be
      63             :       // applied
      64           1 :       std::string dispname;
      65           1 :       const char *dispdir=getenv("WVRGCAL_DISPDIR");
      66           1 :       if (dispdir)
      67             :       {
      68           1 :         dispname=std::string(dispdir)+"/libair-ddefault.csv"; 
      69             :       }
      70             :       else
      71             :       {
      72           0 :         dispname=std::string(bnstringer2(DISPTABLEDIR))+"/libair/libair-ddefault.csv";
      73             :       }
      74           1 :       loadCSV(dispname.c_str(), 
      75             :               dispt);
      76           1 :     }
      77             : 
      78             :     // Make the empty NewCaltable
      79             :     NewCalTable ct("wvrgcal",            // temporary name for mem table
      80             :                    VisCalEnum::COMPLEX,
      81             :                    "T Jones",
      82             :                    msname,
      83          50 :                    True);                // enforce single-chan
      84             : 
      85             :     // Workspace
      86          25 :     Cube<Complex> cpar(1,1,nAnt);                   // filled below
      87          25 :     Cube<Bool>    flag(1,1,nAnt);                   // filled below
      88          25 :     Cube<Float>   err(1,1,nAnt);  err.set(0.0);     // All zero
      89          25 :     Cube<Float>   snr(1,1,nAnt);  snr.set(3.0);     // All 3
      90             : 
      91         949 :     for(size_t i=0; i<ntimes; ++i)
      92             :     {
      93       19800 :       for(size_t ispw=0; ispw<nspw; ++ispw)
      94             :       {
      95       18876 :         const size_t nch=s.spws[ispw].chf.size();
      96       18876 :         const size_t spwid=s.spws[ispw].spwid;
      97             : 
      98             :         // The minus sign here is required to match ALMA convention
      99       18876 :         double path_to_phase = -2 * M_PI * s.spws[ispw].chf[nch/2] / 3e8;
     100       18876 :         if (reverse.count(spwid)==1){
     101          34 :           path_to_phase *= -1;
     102             :         }
     103       18876 :         if (disperse){
     104         918 :           const double dispf=(1+dispt(s.spws[ispw].chf[nch/2]));
     105         918 :           path_to_phase *= dispf;
     106             :         }
     107             :         
     108             :         
     109             :         // Generate antenna-based complex factors
     110       18876 :         cpar.set(Complex(0.0));
     111       18876 :         flag.set(False); // i.e. all unflagged
     112      366796 :         for (size_t j=0; j<nAnt; ++j)
     113             :         {
     114             : 
     115      347920 :           if(interpImpossibleAnts.count(j)==0 && g.g_path()(i,j)!=0)
     116             :           {
     117      336863 :             const double phase=g.g_path()(i,j)*path_to_phase;
     118      336863 :             cpar(0,0,j)=std::complex<float>(cos(phase),sin(phase));
     119             :           }
     120             :           else // there is no useful WVR data for this antenna
     121             :           {
     122       11057 :             cpar(0,0,j)=std::complex<float>(1.,0.);
     123       11057 :             flag(0,0,j)=True; 
     124             :           }
     125             : 
     126             :         }
     127             : 
     128             :         // fill this time/spw into the table
     129       18876 :         ct.fillAntBasedMainRows(nAnt,           // the number of rows added this call
     130       18876 :                                 g.g_time()[i],  // timestamp
     131             :                                 deltat,         // interval
     132       18876 :                                 g.g_field()[i], // field id
     133             :                                 spwid,          // spw id
     134             :                                 -1,             // scan number (non-specific)
     135       37752 :                                 Vector<Int>(),  // antenna1 will be auto-generated: [0,1,2,...]
     136             :                                 -1,             // refant (non-specific)
     137             :                                 cpar,           // the complex gain parameters
     138             :                                 flag,           // flag
     139             :                                 err,            // err
     140             :                                 snr);           // snr
     141             : 
     142             :       }
     143             :     }
     144             : 
     145             : 
     146             :     // Add history info (before flushing to disk)
     147          25 :     ct.addHistoryMessage(std::string("Produced with libAIR version: ") + LibAIR2::version(),
     148             :                          invocation);
     149             : 
     150             :     // Flush to disk
     151          25 :     ct.writeToDisk(fnameout);
     152             :     
     153          25 :   }
     154             : 
     155           0 :   void addCalHistory(const char *fnameout,
     156             :                      const std::string &invocation)
     157             : 
     158             :   {
     159           0 :     casa::CalHistoryRecord h;
     160           0 :     h.defineCalNotes(std::string("Produced with libAIR version: ") + LibAIR2::version());
     161           0 :     h.defineCalParms(invocation);
     162             : 
     163             :     casa::CalTable c(fnameout,
     164           0 :                      casacore::Table::Update);
     165           0 :     size_t j= c.nRowHistory() +1;
     166           0 :     c.addRowHistory();
     167           0 :     c.putRowHistory(j, h);
     168           0 :   }
     169             : 
     170             : }
     171             : 
     172             : 

Generated by: LCOV version 1.16