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 :
|