Line data Source code
1 : /*
2 : * VisBufferImpl.cc
3 : *
4 : * Created on: Jul 3, 2012
5 : * Author: jjacobs
6 : */
7 :
8 :
9 : //#include <casa/Arrays/ArrayLogical.h>
10 : //#include <casa/Arrays/ArrayMath.h>
11 : //#include <casa/Arrays/ArrayUtil.h>
12 : //#include <casa/Arrays/MaskArrMath.h>
13 : //#include <casa/Arrays/MaskedArray.h>
14 : #include <casacore/casa/OS/Path.h>
15 : #include <casacore/casa/OS/Timer.h>
16 : #include <casacore/casa/Utilities.h>
17 : #include <casacore/casa/aipstype.h>
18 : #include <typeinfo>
19 : #include <components/ComponentModels/ComponentList.h>
20 : #include <casacore/ms/MeasurementSets/MSColumns.h>
21 : #include <stdcasa/UtilJ.h>
22 : #include <msvis/MSVis/VisBufferAsyncWrapper2.h>
23 : #include <msvis/MSVis/VisBufferComponents2.h>
24 : #include <msvis/MSVis/VisBufferComponents2.h>
25 : #include <msvis/MSVis/VisBufferImpl2.h>
26 : #include <msvis/MSVis/VisBuffer2Adapter.h>
27 : #include <msvis/MSVis/VisibilityIterator2.h>
28 : #include <msvis/MSVis/Vbi2MsRow.h>
29 : #include <msvis/MSVis/VisModelDataI.h>
30 : #include <msvis/MSVis/VisBufferImpl2Internal.h>
31 :
32 :
33 : #define CheckVisIter() checkVisIter (__func__, __FILE__, __LINE__)
34 : #define CheckVisIter1(s) checkVisIter (__func__, __FILE__, __LINE__,s)
35 : #define CheckVisIterBase() checkVisIterBase (__func__, __FILE__, __LINE__)
36 :
37 : #include <functional>
38 :
39 : using namespace std;
40 :
41 : using namespace casacore;
42 : namespace casa {
43 :
44 : using namespace casacore;
45 : using namespace casa::ms;
46 :
47 : namespace vi {
48 :
49 :
50 :
51 894 : VisBufferCache::VisBufferCache (VisBufferImpl2 * vb)
52 894 : : imagingWeight_p (true)
53 : {
54 894 : ThrowIf (vb == NULL, "VisBufferCacheImpl not connected to VisBufferImpl2");
55 894 : }
56 :
57 : void
58 894 : VisBufferCache::initialize (VisBufferImpl2 * vb)
59 : {
60 :
61 : // Initialize the cache items. This will also register them
62 : // with the vb object to allow it to iterate over the cached
63 : // values.
64 :
65 894 : antenna1_p.initialize (this, vb, & VisBufferImpl2::fillAntenna1,
66 : VisBufferComponent2::Antenna1, Nr, true);
67 894 : antenna2_p.initialize (this, vb, &VisBufferImpl2::fillAntenna2,
68 : VisBufferComponent2::Antenna2, Nr, true);
69 894 : arrayId_p.initialize (this, vb, &VisBufferImpl2::fillArrayId,
70 : VisBufferComponent2::ArrayId, Nr, true);
71 894 : cjones_p.initialize (this, vb, &VisBufferImpl2::fillJonesC,
72 : VisBufferComponent2::JonesC, NoCheck, false);
73 894 : correctedVisCube_p.initialize (this, vb, &VisBufferImpl2::fillCubeCorrected,
74 : VisBufferComponent2::VisibilityCubeCorrected,
75 : NcNfNr, false);
76 894 : correctedVisCubes_p.initialize (this, vb, &VisBufferImpl2::fillCubesCorrected,
77 : VisBufferComponent2::VisibilityCubesCorrected,
78 : NsNcNfNr, false);
79 894 : corrType_p.initialize (this, vb, &VisBufferImpl2::fillCorrType,
80 : VisBufferComponent2::CorrType, NoCheck, false);
81 894 : dataDescriptionIds_p.initialize (this, vb, &VisBufferImpl2::fillDataDescriptionIds,
82 : VisBufferComponent2::DataDescriptionIds, Nr, true);
83 894 : direction1_p.initialize (this, vb, &VisBufferImpl2::fillDirection1,
84 : VisBufferComponent2::Direction1, NoCheck, false);
85 894 : direction2_p.initialize (this, vb, &VisBufferImpl2::fillDirection2,
86 : VisBufferComponent2::Direction2, NoCheck, false);
87 894 : exposure_p.initialize (this, vb, &VisBufferImpl2::fillExposure,
88 : VisBufferComponent2::Exposure, Nr, false);
89 894 : feed1_p.initialize (this, vb, &VisBufferImpl2::fillFeed1,
90 : VisBufferComponent2::Feed1, Nr, false);
91 894 : feed1Pa_p.initialize (this, vb, &VisBufferImpl2::fillFeedPa1,
92 : VisBufferComponent2::FeedPa1, NoCheck, false);
93 894 : feed2_p.initialize (this, vb, &VisBufferImpl2::fillFeed2,
94 : VisBufferComponent2::Feed2, Nr, false);
95 894 : feed2Pa_p.initialize (this, vb, &VisBufferImpl2::fillFeedPa2,
96 : VisBufferComponent2::FeedPa2, NoCheck, false);
97 894 : fieldId_p.initialize (this, vb, &VisBufferImpl2::fillFieldId,
98 : VisBufferComponent2::FieldId, Nr, true);
99 894 : flagCategory_p.initialize (this, vb, &VisBufferImpl2::fillFlagCategory,
100 : VisBufferComponent2::FlagCategory, NoCheck, false);
101 : // required column but not used in casa, make it a nocheck for shape validation
102 894 : flagCube_p.initialize (this, vb, &VisBufferImpl2::fillFlagCube,
103 : VisBufferComponent2::FlagCube, NcNfNr, false);
104 894 : flagCubes_p.initialize (this, vb, &VisBufferImpl2::fillFlagCubes,
105 : VisBufferComponent2::FlagCubes, NsNcNfNr, false);
106 894 : flagRow_p.initialize (this, vb, &VisBufferImpl2::fillFlagRow,
107 : VisBufferComponent2::FlagRow, Nr, false);
108 894 : floatDataCube_p.initialize (this, vb, &VisBufferImpl2::fillFloatData,
109 : VisBufferComponent2::VisibilityCubeFloat, NcNfNr, false);
110 894 : floatDataCubes_p.initialize (this, vb, &VisBufferImpl2::fillFloatCubes,
111 : VisBufferComponent2::VisibilityCubesFloat, NsNcNfNr, false);
112 894 : imagingWeight_p.initialize (this, vb, &VisBufferImpl2::fillImagingWeight,
113 : VisBufferComponent2::ImagingWeight, NoCheck, false);
114 894 : modelVisCube_p.initialize (this, vb, &VisBufferImpl2::fillCubeModel,
115 : VisBufferComponent2::VisibilityCubeModel, NcNfNr, false);
116 894 : modelVisCubes_p.initialize (this, vb, &VisBufferImpl2::fillCubesModel,
117 : VisBufferComponent2::VisibilityCubesModel, NsNcNfNr, false);
118 894 : nAntennas_p.initialize (this, vb, &VisBufferImpl2::fillNAntennas,
119 : VisBufferComponent2::NAntennas, false);
120 894 : nChannels_p.initialize (this, vb, &VisBufferImpl2::fillNChannel,
121 : VisBufferComponent2::NChannels, false);
122 894 : nCorrelations_p.initialize (this, vb, &VisBufferImpl2::fillNCorr,
123 : VisBufferComponent2::NCorrelations);
124 894 : nRows_p.initialize (this, vb, &VisBufferImpl2::fillNRow,
125 : VisBufferComponent2::NRows, false);
126 894 : nShapes_p.initialize (this, vb, &VisBufferImpl2::fillNShapes,
127 : VisBufferComponent2::NShapes, false);
128 894 : nRowsPerShape_p.initialize (this, vb, &VisBufferImpl2::fillNRowPerShape,
129 : VisBufferComponent2::NRowsPerShape, Ns, false);
130 894 : nChannelsPerShape_p.initialize (this, vb, &VisBufferImpl2::fillNChannelPerShape,
131 : VisBufferComponent2::NChannelsPerShape, Ns, false);
132 894 : nCorrelationsPerShape_p.initialize (this, vb, &VisBufferImpl2::fillNCorrPerShape,
133 : VisBufferComponent2::NCorrelationsPerShape, Ns, false);
134 894 : observationId_p.initialize (this, vb, &VisBufferImpl2::fillObservationId,
135 : VisBufferComponent2::ObservationId, Nr, true);
136 894 : phaseCenter_p.initialize (this, vb, &VisBufferImpl2::fillPhaseCenter,
137 : VisBufferComponent2::PhaseCenter, false);
138 894 : polFrame_p.initialize (this, vb, &VisBufferImpl2::fillPolFrame,
139 : VisBufferComponent2::PolFrame, false);
140 894 : polarizationId_p.initialize (this, vb, &VisBufferImpl2::fillPolarizationId,
141 : VisBufferComponent2::PolarizationId, false);
142 894 : processorId_p.initialize (this, vb, &VisBufferImpl2::fillProcessorId,
143 : VisBufferComponent2::ProcessorId, Nr, true);
144 894 : rowIds_p.initialize (this, vb, &VisBufferImpl2::fillRowIds,
145 : VisBufferComponent2::RowIds, Nr, false);
146 894 : scan_p.initialize (this, vb, &VisBufferImpl2::fillScan,
147 : VisBufferComponent2::Scan, Nr, true);
148 894 : sigma_p.initialize (this, vb, &VisBufferImpl2::fillSigma,
149 : VisBufferComponent2::Sigma, NcNr, false);
150 894 : sigmas_p.initialize (this, vb, &VisBufferImpl2::fillSigmas,
151 : VisBufferComponent2::Sigma, NsNcNr, false);
152 894 : spectralWindows_p.initialize (this, vb, &VisBufferImpl2::fillSpectralWindows,
153 : VisBufferComponent2::SpectralWindows, Nr, false);
154 894 : stateId_p.initialize (this, vb, &VisBufferImpl2::fillStateId,
155 : VisBufferComponent2::StateId, Nr, true);
156 894 : time_p.initialize (this, vb, &VisBufferImpl2::fillTime,
157 : VisBufferComponent2::Time, Nr, true);
158 894 : timeCentroid_p.initialize (this, vb, &VisBufferImpl2::fillTimeCentroid,
159 : VisBufferComponent2::TimeCentroid, Nr, false);
160 894 : timeInterval_p.initialize (this, vb, &VisBufferImpl2::fillTimeInterval,
161 : VisBufferComponent2::TimeInterval, Nr, false);
162 894 : uvw_p.initialize (this, vb, &VisBufferImpl2::fillUvw,
163 : VisBufferComponent2::Uvw, I3Nr, false);
164 894 : visCube_p.initialize (this, vb, &VisBufferImpl2::fillCubeObserved,
165 : VisBufferComponent2::VisibilityCubeObserved, NcNfNr, false);
166 894 : visCubes_p.initialize (this, vb, &VisBufferImpl2::fillCubesObserved,
167 : VisBufferComponent2::VisibilityCubesObserved, NsNcNfNr, false);
168 894 : weight_p.initialize (this, vb, &VisBufferImpl2::fillWeight,
169 : VisBufferComponent2::Weight, NcNr, false);
170 894 : weights_p.initialize (this, vb, &VisBufferImpl2::fillWeights,
171 : VisBufferComponent2::Weights, NsNcNr, false);
172 894 : weightSpectrum_p.initialize (this, vb, &VisBufferImpl2::fillWeightSpectrum,
173 : VisBufferComponent2::WeightSpectrum,
174 : NcNfNr, false);
175 894 : weightSpectra_p.initialize (this, vb, &VisBufferImpl2::fillWeightSpectra,
176 : VisBufferComponent2::WeightSpectra,
177 : NsNcNfNr, false);
178 894 : sigmaSpectrum_p.initialize (this, vb, &VisBufferImpl2::fillSigmaSpectrum,
179 : VisBufferComponent2::SigmaSpectrum,
180 : NcNfNr, false);
181 894 : sigmaSpectra_p.initialize (this, vb, &VisBufferImpl2::fillSigmaSpectra,
182 : VisBufferComponent2::SigmaSpectra,
183 : NsNcNfNr, false);
184 894 : }
185 :
186 : void
187 50064 : VisBufferCache::registerItem (VbCacheItemBase * item)
188 : {
189 50064 : registry_p.push_back (item);
190 50064 : }
191 :
192 : void
193 50064 : VbCacheItemBase::initialize (VisBufferCache * cache, VisBufferImpl2 * vb, VisBufferComponent2 component, Bool isKey)
194 : {
195 50064 : vbComponent_p = component;
196 50064 : vb_p = vb;
197 50064 : cache->registerItem (this);
198 50064 : setIsKey (isKey);
199 50064 : }
200 :
201 :
202 : using namespace vi;
203 :
204 : ////////////////////////////////////////////////////////////
205 : //
206 : // Basic VisBufferImpl2 Methods
207 : // ========================
208 : //
209 : // Other sections contain the accessor and filler methods
210 :
211 0 : VisBufferImpl2::VisBufferImpl2 (VisBufferOptions options)
212 0 : : cache_p (0), msRow_p (0), state_p (0)
213 : {
214 0 : construct (0, options);
215 0 : }
216 :
217 894 : VisBufferImpl2::VisBufferImpl2(ViImplementation2 * vii, VisBufferOptions options)
218 894 : : cache_p (0),
219 894 : msRow_p (0),
220 894 : state_p (0)
221 : {
222 894 : construct (vii, options);
223 894 : }
224 :
225 1752 : VisBufferImpl2::~VisBufferImpl2 ()
226 : {
227 894 : delete cache_p;
228 894 : delete msRow_p;
229 894 : delete state_p;
230 1752 : }
231 :
232 : void
233 10184 : VisBufferImpl2::appendRow (Vbi2MsRow * rowSrc,
234 : Int initialCapacity,
235 : const VisBufferComponents2 & optionalComponentsToCopy,
236 : bool doCopy)
237 : {
238 : // First check to see if the buffer needs to be reconfigured before another
239 : // row can be appended.
240 :
241 : // if (state_p->appendSize_p == 0 ||
242 : // state_p->appendSize_p == state_p->appendCapacity_p){
243 : //
244 : // if (msRow_p == 0){
245 : // msRow_p = new Vbi2MsRow (0, this);
246 : // }
247 : //
248 : // // The buffer is either empty or completely full; resize it so
249 : // // that there is room to add more rows.
250 : //
251 : // Int nRowsToAdd;
252 : //
253 : // if (state_p->appendSize_p == 0){
254 : //
255 : // // If appendSize is zero then the buffer is completely empty.
256 : // // If capacity is nonzero then reuse that capacity.
257 : //
258 : // nRowsToAdd = state_p->appendCapacity_p; // nonzero if buffer is being reused
259 : //
260 : // if (nRowsToAdd == 0){
261 : // nRowsToAdd = initialCapacity; // new buffer: use provided initial capacity
262 : // }
263 : //
264 : // state_p->appendCapacity_p = nRowsToAdd;
265 : // }
266 : // else{
267 : //
268 : // // All rows in use so add 40% more rows
269 : //
270 : // nRowsToAdd = (state_p->appendCapacity_p * 4) / 10;
271 : // state_p->appendCapacity_p += nRowsToAdd;
272 : // }
273 : //
274 : // for (CacheRegistry::iterator i = cache_p->registry_p.begin();
275 : // i != cache_p->registry_p.end();
276 : // i++){
277 : //
278 : // // Resize the various arrays so that they have the appropriate
279 : // // row dimension.
280 : //
281 : // (*i)->appendRows (state_p->appendCapacity_p);
282 : // }
283 : // }
284 :
285 : // Now append the row.
286 :
287 : // Assert (state_p->appendSize_p <= cache_p->time_p.getItem().shape()(0));
288 :
289 10184 : if (msRow_p == 0){
290 36 : msRow_p = new Vbi2MsRow (0, this);
291 : }
292 :
293 :
294 10184 : state_p->appendSize_p ++;
295 :
296 10184 : if (state_p->appendSize_p >= cache_p->time_p.getItem().shape().last()){
297 :
298 9062 : Int desiredNRows = max (state_p->appendSize_p, initialCapacity);
299 :
300 9062 : for (CacheRegistry::iterator i = cache_p->registry_p.begin();
301 516534 : i != cache_p->registry_p.end();
302 507472 : i++){
303 :
304 : // Resize the various arrays so that they have the appropriate
305 : // row dimension.
306 :
307 507472 : (*i)->appendRows (desiredNRows);
308 : }
309 : }
310 :
311 : // Now copy the provided row into the next one in this buffer.
312 :
313 10184 : if (doCopy){
314 :
315 10184 : msRow_p->changeRow (state_p->appendSize_p - 1);
316 :
317 10184 : msRow_p->copy (rowSrc, optionalComponentsToCopy);
318 : }
319 10184 : }
320 :
321 : void
322 409 : VisBufferImpl2::appendRowsComplete ()
323 : {
324 : // Close out the append operation by trimming off the
325 : // excess baselines in the buffer.
326 :
327 409 : for (CacheRegistry::iterator i = cache_p->registry_p.begin();
328 23313 : i != cache_p->registry_p.end();
329 22904 : i++){
330 :
331 22904 : (*i)->appendRows (state_p->appendSize_p, true);
332 : }
333 :
334 409 : cache_p->nRows_p.setSpecial (state_p->appendSize_p);
335 : //Assume that the append happens on the first shape only
336 409 : Vector<rownr_t> nRowsPerShape = cache_p->nRowsPerShape_p.get();
337 409 : nRowsPerShape[0] = state_p->appendSize_p;
338 409 : cache_p->nRowsPerShape_p.setSpecial (nRowsPerShape);
339 :
340 409 : state_p->appendSize_p = 0; //
341 409 : }
342 :
343 : Int
344 2005 : VisBufferImpl2::appendSize () const
345 : {
346 2005 : return state_p->appendSize_p;
347 : }
348 :
349 :
350 :
351 : Bool
352 0 : VisBufferImpl2::areCorrelationsInCanonicalOrder () const
353 : {
354 0 : Vector<Int> corrs(correlationTypes());
355 :
356 : // Only a meaningful question is all 4 corrs present
357 :
358 0 : Bool result = corrs.nelements () == 4 &&
359 0 : (corrs (1) == Stokes::LL || corrs (1) == Stokes::YY);
360 :
361 0 : return result;
362 0 : }
363 :
364 : Bool
365 0 : VisBufferImpl2::areCorrelationsSorted() const
366 : {
367 0 : return state_p->areCorrelationsSorted_p = false;
368 : }
369 :
370 : void
371 3029453 : VisBufferImpl2::checkVisIter (const char * func, const char * file, int line, const char * extra) const
372 : {
373 3029453 : checkVisIterBase (func, file, line, extra);
374 3029453 : }
375 :
376 : void
377 3029453 : VisBufferImpl2::checkVisIterBase (const char * func, const char * file, int line, const char * extra) const
378 : {
379 3029453 : if (! state_p->isAttached_p) {
380 0 : throw AipsError (String ("VisBuffer not attached to a ViImplementation2 while filling this field in (") +
381 0 : func + extra + ")", file, line);
382 : }
383 :
384 3029453 : if (getViiP() == NULL){
385 0 : throw AipsError (String ("VisBuffer's ViImplementation2 is NULL while filling this field in (") +
386 0 : func + extra + ")", file, line);
387 : }
388 3029453 : }
389 :
390 : void
391 365302 : VisBufferImpl2::cacheClear (Bool markAsCached)
392 : {
393 365302 : for (CacheRegistry::iterator i = cache_p->registry_p.begin();
394 20822214 : i != cache_p->registry_p.end();
395 20456912 : i++){
396 :
397 20456912 : (*i)->clear (false);
398 :
399 20456912 : if (markAsCached){
400 0 : (*i)->setAsPresent ();
401 : }
402 : }
403 365302 : }
404 :
405 : void
406 83 : VisBufferImpl2::cacheResizeAndZero (const VisBufferComponents2 & components)
407 : {
408 83 : Bool doAll = components.empty();
409 :
410 83 : for (CacheRegistry::iterator i = cache_p->registry_p.begin();
411 4731 : i != cache_p->registry_p.end();
412 4648 : i++){
413 :
414 4648 : if (! doAll && ! components.contains((*i)->getComponent())){
415 2306 : continue; // this one is excluded
416 : }
417 :
418 2342 : (*i)->resize (false);
419 :
420 2342 : (*i)->setAsPresent();
421 : }
422 83 : }
423 :
424 :
425 :
426 : void
427 894 : VisBufferImpl2::construct (ViImplementation2 * vi, VisBufferOptions options)
428 : {
429 894 : state_p = new VisBufferState ();
430 :
431 : // Initialize all non-object member variables
432 :
433 894 : state_p->areCorrelationsSorted_p = false; // Have correlations been sorted by sortCorr?
434 :
435 894 : state_p->isAttached_p = vi != 0;
436 894 : state_p->pointingTableLastRow_p = -1;
437 894 : state_p->newMs_p = true;
438 894 : state_p->vi_p = vi;
439 :
440 : // Handle the options
441 :
442 894 : state_p->isWritable_p = false;
443 894 : state_p->isRekeyable_p = false;
444 :
445 894 : if (options & VbRekeyable){
446 :
447 57 : state_p->isWritable_p = true; // rekeyable implies writable
448 57 : state_p->isRekeyable_p = true;
449 : }
450 837 : else if (options & VbWritable){
451 769 : state_p->isWritable_p = true;
452 : }
453 :
454 894 : cache_p = new VisBufferCache (this);
455 894 : cache_p->initialize (this);
456 894 : }
457 :
458 : void
459 0 : VisBufferImpl2::copy (const VisBuffer2 & otherRaw, Bool fetchIfNeeded)
460 : {
461 0 : copyComponents (otherRaw, VisBufferComponents2::exceptThese({VisBufferComponent2::FlagCategory}),
462 : true, fetchIfNeeded);
463 0 : }
464 :
465 : void
466 0 : VisBufferImpl2::copyComponents (const VisBuffer2 & otherRaw,
467 : const VisBufferComponents2 & components,
468 : Bool allowShapeChange,
469 : Bool fetchIfNeeded)
470 : {
471 0 : const VisBufferImpl2 * other = dynamic_cast<const VisBufferImpl2 *> (& otherRaw);
472 :
473 0 : ThrowIf (other == 0,
474 : String::format ("Copy between %s and VisBufferImpl2 not implemented.",
475 : typeid (otherRaw).name()));
476 :
477 0 : if (! hasShape()){
478 :
479 : // If this VB is shapeless, then assume the shape of the source VB.
480 :
481 0 : setShape (otherRaw.nCorrelations(), otherRaw.nChannels(), otherRaw.nRows(), true);
482 : }
483 0 : else if (allowShapeChange && getShape() != otherRaw.getShape()){
484 :
485 0 : setShape (otherRaw.nCorrelations(), otherRaw.nChannels(), otherRaw.nRows(), true);
486 : }
487 :
488 0 : setIterationInfo (other->msId(),
489 0 : other->msName (),
490 0 : other->isNewMs (),
491 0 : other->isNewArrayId (),
492 0 : other->isNewFieldId (),
493 0 : other->isNewSpectralWindow (),
494 0 : other->getSubchunk (),
495 0 : other->getCorrelationTypes(),
496 0 : other->getCorrelationTypesDefined(),
497 0 : other->getCorrelationTypesSelected(),
498 0 : other->getWeightScaling());
499 :
500 0 : Bool wasFillable = isFillable();
501 0 : setFillable (true);
502 :
503 0 : for (CacheRegistry::iterator dst = cache_p->registry_p.begin(),
504 0 : src = other->cache_p->registry_p.begin();
505 0 : dst != cache_p->registry_p.end();
506 0 : dst ++, src ++){
507 :
508 0 : if (components.contains ((* src)->getComponent())){
509 :
510 : try {
511 :
512 0 : (* dst)->copy (* src, fetchIfNeeded);
513 : }
514 0 : catch (AipsError & e){
515 :
516 : String m = String::format ("While copying %s",
517 0 : VisBufferComponents2::name ((* src)->getComponent()).c_str());
518 0 : Rethrow (e, m);
519 0 : }
520 : }
521 : }
522 :
523 0 : setFillable (wasFillable);
524 0 : }
525 :
526 : void
527 0 : VisBufferImpl2::copyCoordinateInfo (const VisBuffer2 * vb, Bool dirDependent,
528 : Bool allowShapeChange, Bool fetchIfNeeded)
529 : {
530 :
531 : VisBufferComponents2 components =
532 : VisBufferComponents2::these ({VisBufferComponent2::Antenna1,
533 : VisBufferComponent2::Antenna2,
534 : VisBufferComponent2::ArrayId,
535 : VisBufferComponent2::DataDescriptionIds,
536 : VisBufferComponent2::FieldId,
537 : VisBufferComponent2::SpectralWindows,
538 : VisBufferComponent2::Time,
539 : VisBufferComponent2::NRows,
540 : VisBufferComponent2::Feed1,
541 0 : VisBufferComponent2::Feed2});
542 :
543 0 : copyComponents (* vb, components, allowShapeChange, fetchIfNeeded);
544 :
545 0 : if(dirDependent){
546 :
547 : VisBufferComponents2 components =
548 : VisBufferComponents2::these ({VisBufferComponent2::Direction1,
549 : VisBufferComponent2::Direction2,
550 : VisBufferComponent2::FeedPa1,
551 0 : VisBufferComponent2::FeedPa2});
552 :
553 0 : copyComponents (* vb, components, allowShapeChange, fetchIfNeeded);
554 0 : }
555 0 : }
556 :
557 : void
558 0 : VisBufferImpl2::copyRow (Int sourceRow, Int destinationRow)
559 : {
560 0 : for (CacheRegistry::iterator i = cache_p->registry_p.begin();
561 0 : i != cache_p->registry_p.end();
562 0 : i++){
563 :
564 0 : if (! (* i)->isPresent()){
565 0 : continue;
566 : }
567 :
568 0 : (* i)->copyRowElement (sourceRow, destinationRow);
569 :
570 : }
571 :
572 0 : }
573 :
574 : void
575 0 : VisBufferImpl2::dirtyComponentsAdd (const VisBufferComponents2 & additionalDirtyComponents)
576 : {
577 : // Loop through all of the cached VB components and mark them dirty if
578 : // they're in the set <of addition dirty components
579 :
580 0 : for (CacheRegistry::iterator i = cache_p->registry_p.begin();
581 0 : i != cache_p->registry_p.end();
582 0 : i++){
583 :
584 0 : if (additionalDirtyComponents.contains ((* i)->getComponent())){
585 :
586 0 : (* i)->setDirty ();
587 : }
588 : }
589 0 : }
590 :
591 : void
592 0 : VisBufferImpl2::dirtyComponentsAdd (VisBufferComponent2 component)
593 : {
594 0 : dirtyComponentsAdd (VisBufferComponents2::singleton (component));
595 0 : }
596 :
597 :
598 : void
599 0 : VisBufferImpl2::dirtyComponentsClear ()
600 : {
601 0 : for (CacheRegistry::iterator i = cache_p->registry_p.begin();
602 0 : i != cache_p->registry_p.end();
603 0 : i++){
604 :
605 0 : (* i)->clearDirty ();
606 : }
607 0 : }
608 :
609 : VisBufferComponents2
610 0 : VisBufferImpl2::dirtyComponentsGet () const
611 : {
612 0 : VisBufferComponents2 dirtyComponents;
613 :
614 0 : for (CacheRegistry::iterator i = cache_p->registry_p.begin();
615 0 : i != cache_p->registry_p.end();
616 0 : i++){
617 :
618 0 : if ((*i)->isDirty ()){
619 :
620 0 : VisBufferComponent2 component = (* i)->getComponent ();
621 :
622 0 : if (component != VisBufferComponent2::Unknown){
623 0 : dirtyComponents = dirtyComponents +
624 0 : VisBufferComponents2::singleton (component);
625 : }
626 : }
627 : }
628 :
629 0 : return dirtyComponents;
630 0 : }
631 :
632 : void
633 0 : VisBufferImpl2::dirtyComponentsSet (const VisBufferComponents2 & dirtyComponents)
634 : {
635 : // Clear the dirty state for the cache
636 :
637 0 : cacheClear ();
638 :
639 : // Add in the specified components to the newly cleared cache.
640 :
641 0 : dirtyComponentsAdd (dirtyComponents);
642 0 : }
643 :
644 : void
645 0 : VisBufferImpl2::dirtyComponentsSet (VisBufferComponent2 component)
646 : {
647 0 : dirtyComponentsSet (VisBufferComponents2::singleton (component));
648 0 : }
649 :
650 :
651 : Bool
652 3030068 : VisBufferImpl2::isAttached () const
653 : {
654 3030068 : return state_p->isAttached_p;
655 : }
656 :
657 : Bool
658 3030053 : VisBufferImpl2::isFillable () const
659 : {
660 3030053 : return state_p->isFillable_p;
661 : }
662 :
663 :
664 : Int
665 15867 : VisBufferImpl2::msId () const
666 : {
667 15867 : return state_p->msId_p;
668 : }
669 :
670 : String
671 319 : VisBufferImpl2::msName (Bool stripPath) const
672 : {
673 319 : String result;
674 :
675 319 : if(stripPath){
676 :
677 0 : Path path(state_p->msName_p);
678 0 : result = path.baseName();
679 0 : }
680 : else{
681 319 : result = state_p->msName_p;
682 : }
683 :
684 319 : return result;
685 0 : }
686 :
687 : Double
688 1 : VisBufferImpl2::getFrequency (Int rowInBuffer, Int frequencyIndex, Int frame) const
689 : {
690 1 : if (frame == FrameNotSpecified){
691 1 : frame = getViiP()->getReportingFrameOfReference();
692 : }
693 :
694 1 : state_p->frequencies_p.updateCacheIfNeeded (getViiP(), rowInBuffer, frame, this);
695 :
696 1 : return state_p->frequencies_p.values_p (frequencyIndex);
697 : }
698 :
699 : const Vector<Double> &
700 9291 : VisBufferImpl2::getFrequencies (Int rowInBuffer, Int frame) const
701 : {
702 9291 : if (frame == FrameNotSpecified){
703 6058 : frame = getViiP()->getReportingFrameOfReference();
704 : }
705 :
706 9291 : state_p->frequencies_p.updateCacheIfNeeded (getViiP(), rowInBuffer, frame, this);
707 :
708 9291 : return state_p->frequencies_p.values_p;
709 : }
710 :
711 : Int
712 0 : VisBufferImpl2::getChannelNumber (Int rowInBuffer, Int frequencyIndex) const
713 : {
714 0 : state_p->channelNumbers_p.updateCacheIfNeeded (getViiP(), rowInBuffer, 0, this);
715 :
716 0 : return state_p->channelNumbers_p.values_p (frequencyIndex);
717 : }
718 :
719 : const Vector<Int> &
720 0 : VisBufferImpl2::getChannelNumbers (Int rowInBuffer) const
721 : {
722 0 : state_p->channelNumbers_p.updateCacheIfNeeded (getViiP(), rowInBuffer, 0, this);
723 :
724 0 : return state_p->channelNumbers_p.values_p;
725 : }
726 :
727 0 : Vector<Int> VisBufferImpl2::getChannelNumbersSelected (Int outputChannelIndex) const
728 : {
729 0 : return Vector<Int>(1,outputChannelIndex);
730 : }
731 :
732 : Vector<Stokes::StokesTypes>
733 319 : VisBufferImpl2::getCorrelationTypesDefined () const
734 : {
735 638 : return state_p->correlationsDefined_p.copy();
736 : }
737 :
738 : Vector<Stokes::StokesTypes>
739 2949 : VisBufferImpl2::getCorrelationTypesSelected () const
740 : {
741 5898 : return state_p->correlationsSelected_p.copy();
742 : }
743 :
744 :
745 : Vector<Int>
746 319 : VisBufferImpl2::getCorrelationTypes () const
747 : {
748 638 : return state_p->correlations_p.copy();
749 : }
750 :
751 :
752 : String
753 0 : VisBufferImpl2::getFillErrorMessage () const
754 : {
755 0 : return "VisBuffer not positioned to a subchunk";
756 : }
757 :
758 :
759 : Subchunk
760 0 : VisBufferImpl2::getSubchunk () const
761 : {
762 0 : return state_p->subchunk_p;
763 : }
764 :
765 : IPosition
766 257541 : VisBufferImpl2::getValidShape (Int i) const
767 : {
768 257541 : ThrowIf (i < 0 || i >= (int) state_p->validShapes_p.nelements(),
769 : String::format ("Invalid shape requested: %d", i));
770 :
771 257541 : return state_p->validShapes_p (i);
772 : }
773 :
774 : Vector<IPosition>
775 83 : VisBufferImpl2::getValidVectorShapes (Int i) const
776 : {
777 83 : ThrowIf (i < 0 || i >= (int) state_p->validVectorShapes_p.nelements(),
778 : String::format ("Invalid shape requested: %d", i));
779 :
780 83 : return state_p->validVectorShapes_p (i);
781 : }
782 :
783 : ViImplementation2 *
784 6238327 : VisBufferImpl2::getViiP () const
785 : {
786 6238327 : ThrowIf (state_p->vi_p == nullptr, "Null pointer dereference!");
787 :
788 6238327 : return state_p->vi_p;
789 : }
790 :
791 : VisModelDataI *
792 0 : VisBufferImpl2::getVisModelData () const
793 : {
794 0 : return state_p->visModelData_p;
795 : }
796 :
797 : IPosition
798 975 : VisBufferImpl2::getShape () const
799 : {
800 975 : IPosition shape;
801 :
802 975 : if (hasShape()){
803 1950 : shape = IPosition (3, cache_p->nCorrelations_p.get(), cache_p->nChannels_p.get(),
804 1950 : cache_p->nRows_p.get());
805 : }
806 : else{
807 0 : shape = IPosition ();
808 : }
809 :
810 975 : return shape;
811 0 : }
812 :
813 :
814 : Bool
815 1460 : VisBufferImpl2::hasShape () const
816 : {
817 1460 : Bool hasShape = cache_p->nCorrelations_p.isPresent() && cache_p->nCorrelations_p.get() > 0;
818 1460 : hasShape = hasShape && cache_p->nChannels_p.isPresent() && cache_p->nChannels_p.get() > 0;
819 1460 : hasShape = hasShape && cache_p->nRows_p.isPresent() && cache_p->nRows_p.get() > 0;
820 :
821 1460 : return hasShape;
822 : }
823 :
824 : void
825 5796 : VisBufferImpl2::invalidate ()
826 : {
827 5796 : cacheClear (false); // empty cached values
828 5796 : setFillable (false); // buffer is in limbo
829 5796 : }
830 :
831 : Bool
832 319 : VisBufferImpl2::isNewArrayId () const
833 : {
834 319 : return state_p->isNewArrayId_p;
835 : }
836 :
837 : Bool
838 319 : VisBufferImpl2::isNewFieldId () const
839 : {
840 319 : return state_p->isNewFieldId_p;
841 : }
842 :
843 : Bool
844 319 : VisBufferImpl2::isNewMs() const
845 : {
846 319 : return state_p->isNewMs_p;
847 : }
848 :
849 : Bool
850 319 : VisBufferImpl2::isNewSpectralWindow () const
851 : {
852 319 : return state_p->isNewSpectralWindow_p;
853 : }
854 :
855 : Bool
856 366 : VisBufferImpl2::isRekeyable () const
857 : {
858 366 : return state_p->isRekeyable_p;
859 : }
860 :
861 :
862 : Bool
863 1712 : VisBufferImpl2::isWritable () const
864 : {
865 1712 : return state_p->isWritable_p;
866 : }
867 :
868 : void
869 0 : VisBufferImpl2::normalize()
870 : {
871 : // NB: Handles pol-dep weights in chan-indep way
872 :
873 : // Check for missing data
874 :
875 0 : ThrowIf (! cache_p->visCube_p.isPresent(),
876 : "Cannot normalize; visCube is missing.");
877 0 : ThrowIf (! cache_p->modelVisCube_p.isPresent (),
878 : "Cannot normalize; modelVisCube is missing.");
879 0 : ThrowIf (! cache_p->weight_p.isPresent(),
880 : "Cannot normalize; weightMap is missing.");
881 :
882 : // Get references to the cached values to be used in the
883 : // normalization.
884 :
885 0 : Int nCorrelations = this->nCorrelations ();
886 :
887 0 : const Vector<Bool> & rowFlagged = cache_p->flagRow_p.get ();
888 0 : const Cube<Bool> & flagged = cache_p->flagCube_p.get ();
889 :
890 0 : Cube<Complex> & visCube = cache_p->visCube_p.getRef();
891 0 : Cube<Complex> & modelCube = cache_p->modelVisCube_p.getRef();
892 0 : Matrix<Float> & weight = cache_p->weight_p.getRef();
893 :
894 : // Normalize each row.
895 :
896 0 : for (rownr_t row = 0; row < nRows (); row++) {
897 :
898 0 : if (rowFlagged (row)){
899 :
900 0 : weight.column(row) = 0.0f; // Zero weight on this flagged row
901 0 : continue;
902 : }
903 :
904 0 : normalizeRow (row, nCorrelations, flagged, visCube,
905 : modelCube, weight);
906 :
907 : }
908 0 : }
909 :
910 : // Rotate visibility phase for given vector (dim = nrow of vb) of phases (metres)
911 : void
912 0 : VisBufferImpl2::phaseCenterShift(const Vector<Double>& phase)
913 : {
914 : // Use the frequencies corresponding to the SPW of the first row in the buffer
915 0 : Vector<Double> freq(getFrequencies(0));
916 :
917 : // Set vis cube references
918 0 : Cube<Complex> visCubeRef;
919 0 : Cube<Complex> visCubeModelRef;
920 0 : Cube<Complex> visCubeCorrectedRef;
921 0 : if (cache_p->visCube_p.isPresent())
922 : {
923 0 : visCubeRef.reference(visCube());
924 : }
925 0 : if (cache_p->modelVisCube_p.isPresent())
926 : {
927 0 : visCubeModelRef.reference(visCubeModel());
928 : }
929 0 : if (cache_p->correctedVisCube_p.isPresent())
930 : {
931 0 : visCubeCorrectedRef.reference(visCubeCorrected());
932 : }
933 :
934 :
935 0 : Complex cph;
936 : Double ph, udx;
937 0 : for (rownr_t row_idx = 0; row_idx < nRows(); ++row_idx)
938 : {
939 0 : udx = phase(row_idx) * -2.0 * C::pi / C::c; // in radian/Hz
940 :
941 0 : for (Int chan_idx = 0; chan_idx < nChannels(); ++chan_idx)
942 : {
943 : // Calculate the Complex factor for this row and channel
944 0 : ph = udx * freq(chan_idx);
945 :
946 0 : if (ph != 0.)
947 : {
948 0 : cph = Complex(cos(ph), sin(ph));
949 :
950 : // Shift each correlation:
951 0 : for (Int corr_idx = 0; corr_idx < nCorrelations(); ++corr_idx)
952 : {
953 0 : if (cache_p->visCube_p.isPresent())
954 : {
955 0 : visCubeRef(corr_idx, chan_idx, row_idx) *= cph;
956 : }
957 :
958 0 : if (cache_p->modelVisCube_p.isPresent())
959 : {
960 0 : visCubeModelRef(corr_idx, chan_idx, row_idx) *= cph;
961 : }
962 :
963 0 : if (cache_p->correctedVisCube_p.isPresent())
964 : {
965 0 : visCubeCorrectedRef(corr_idx, chan_idx, row_idx) *= cph;
966 : }
967 : }
968 : }
969 : }
970 : }
971 0 : }
972 :
973 : // Rotate visibility phase for phase center offsets
974 : void
975 0 : VisBufferImpl2::phaseCenterShift(Double dx, Double dy)
976 : {
977 : // Offsets in radians (input is arcsec)
978 0 : dx *= (C::pi / 180.0 / 3600.0);
979 0 : dy *= (C::pi / 180.0 / 3600.0);
980 :
981 : // Extra path as fraction of U and V
982 0 : Vector<Double> udx;
983 0 : udx = uvw().row(0);
984 0 : Vector<Double> vdy;
985 0 : vdy = uvw().row(1);
986 0 : udx *= dx; // in m
987 0 : vdy *= dy;
988 :
989 : // Combine axes
990 0 : udx += vdy;
991 :
992 0 : phaseCenterShift(udx);
993 0 : }
994 :
995 : void
996 0 : VisBufferImpl2::normalizeRow (Int row, Int nCorrelations, const Cube<Bool> & flagged,
997 : Cube<Complex> & visCube, Cube<Complex> & modelCube,
998 : Matrix<Float> & weightMat)
999 : {
1000 0 : Vector<Float> amplitudeSum = Vector<Float> (nCorrelations, 0.0f);
1001 0 : Vector<Int> count = Vector<Int> (nCorrelations, 0);
1002 :
1003 0 : for (Int channel = 0; channel < nChannels (); channel ++) {
1004 :
1005 0 : for (Int correlation = 0; correlation < nCorrelations; correlation ++) {
1006 :
1007 0 : if (flagged (correlation, channel, row)){
1008 0 : continue; // data is flagged so skip over it
1009 : }
1010 :
1011 : // If the model amplitude is zero, zero out the observed value.
1012 : // Otherwise divide the observed value by the model value and
1013 : // set the model value to 1.0.
1014 :
1015 0 : Float amplitude = abs (modelCube(correlation, channel, row));
1016 :
1017 0 : if (amplitude <= 0.0f) { // zero data if model is zero
1018 :
1019 0 : visCube (correlation, channel, row) = 0.0;
1020 0 : continue;
1021 : }
1022 :
1023 : // Normalize visibility datum by corresponding model data point.
1024 :
1025 0 : DComplex vis = visCube(correlation, channel, row);
1026 0 : DComplex mod = modelCube(correlation, channel, row);
1027 :
1028 0 : visCube (correlation, channel, row) = Complex (vis / mod);
1029 0 : modelCube (correlation, channel, row) = Complex(1.0);
1030 :
1031 : // Count and sum up the nonzero model amplitudes for this correlation.
1032 :
1033 0 : amplitudeSum (correlation) += amplitude;
1034 0 : count (correlation) ++;
1035 : }
1036 : }
1037 :
1038 : // Adjust the weight matrix entries for this row appropriately
1039 :
1040 0 : for (Int correlation = 0; correlation < nCorrelations; correlation++) {
1041 :
1042 0 : if (count (correlation) > 0) {
1043 :
1044 0 : weightMat (correlation, row) *= square (amplitudeSum (correlation) /
1045 0 : count (correlation));
1046 : }
1047 : else {
1048 :
1049 0 : weightMat (correlation, row) = 0.0f;
1050 : }
1051 : }
1052 0 : }
1053 :
1054 : void
1055 0 : VisBufferImpl2::registerCacheItem (VbCacheItemBase * item)
1056 : {
1057 0 : cache_p->registry_p.push_back (item);
1058 0 : }
1059 :
1060 : void
1061 0 : VisBufferImpl2::resetWeightsUsingSigma ()
1062 : {
1063 :
1064 0 : if (getViiP()->weightSpectrumExists()) { // Exists and contains actual values
1065 : // We are doing spectral weights
1066 :
1067 0 : if (getViiP()->sigmaSpectrumExists()) {
1068 : // Init WS from SS for calibration
1069 0 : Cube<Float> wtsp(nCorrelations(),nChannels(),nRows(),0.0);
1070 0 : const Cube <Float> & sigmaSpec = this->sigmaSpectrum ();
1071 :
1072 0 : for (rownr_t irow=0;irow<nRows();++irow) {
1073 0 : for (Int ichan=0;ichan<nChannels();++ichan) {
1074 0 : for (Int icorr=0;icorr<nCorrelations();++icorr) {
1075 0 : const Float &s=sigmaSpec(icorr,ichan,irow);
1076 0 : wtsp(icorr,ichan,irow) = (s>0.0 ? 1.0f/square(s) : 0.0);
1077 : }
1078 : }
1079 : }
1080 : // Set it in the VB
1081 0 : setWeightSpectrum(wtsp);
1082 :
1083 0 : }
1084 : else {
1085 : // Init WS from S, broadcast on chan axis
1086 0 : Cube<Float> wtsp(nCorrelations(),nChannels(),nRows(),0.0);
1087 0 : const Matrix <Float> & sigma = this->sigma ();
1088 :
1089 0 : for (rownr_t irow=0;irow<nRows();++irow) {
1090 0 : for (Int icorr=0;icorr<nCorrelations();++icorr) {
1091 0 : const Float &s=sigma(icorr,irow);
1092 0 : wtsp(Slice(icorr,1,1),Slice(),Slice(irow,1,1)) =
1093 0 : (s>0.0 ? 1.0f/square(s) : 0.0);
1094 : }
1095 : }
1096 : // Set it in the VB
1097 0 : setWeightSpectrum(wtsp);
1098 0 : }
1099 : }
1100 : else {
1101 : // Not using WS, fill W from S
1102 0 : Matrix<Float> wtm(nCorrelations(),nRows(),0.0);
1103 0 : const Matrix <Float> & sigma = this->sigma ();
1104 :
1105 0 : for (rownr_t irow=0;irow<nRows();++irow) {
1106 0 : for (Int icorr=0;icorr<nCorrelations();++icorr) {
1107 0 : const Float &s=sigma(icorr,irow);
1108 0 : wtm(icorr,irow) = (s>0.0 ? 1.0f/square(s) : 0.0);
1109 : }
1110 : }
1111 : // Set it in the VB
1112 0 : setWeight(wtm);
1113 0 : }
1114 :
1115 0 : }
1116 :
1117 : void
1118 359659 : VisBufferImpl2::setIterationInfo (Int msId,
1119 : const String & msName,
1120 : Bool isNewMs,
1121 : Bool isNewArrayId,
1122 : Bool isNewFieldId,
1123 : Bool isNewSpectralWindow,
1124 : const Subchunk & subchunk,
1125 : const Vector<Int> & correlations,
1126 : const Vector<Stokes::StokesTypes> & correlationsDefined,
1127 : const Vector<Stokes::StokesTypes> & correlationsSelected,
1128 : CountedPtr <WeightScaling> weightScaling)
1129 : {
1130 : // Set the iteration attributes into this VisBuffer
1131 :
1132 359659 : state_p->msId_p = msId;
1133 359659 : state_p->msName_p = msName;
1134 359659 : state_p->isNewMs_p = isNewMs;
1135 359659 : state_p->isNewMs_p = isNewMs;
1136 359659 : state_p->isNewArrayId_p = isNewArrayId;
1137 359659 : state_p->isNewFieldId_p = isNewFieldId;
1138 359659 : state_p->isNewSpectralWindow_p = isNewSpectralWindow;
1139 359659 : state_p->subchunk_p = subchunk;
1140 359659 : state_p->correlations_p.assign (correlations);
1141 359659 : state_p->correlationsDefined_p.assign (correlationsDefined);
1142 359659 : state_p->correlationsSelected_p.assign (correlationsSelected);
1143 359659 : state_p->weightScaling_p = weightScaling;
1144 359659 : }
1145 :
1146 : void
1147 365545 : VisBufferImpl2::setFillable (Bool isFillable)
1148 : {
1149 365545 : state_p->isFillable_p = isFillable;
1150 365545 : }
1151 :
1152 :
1153 :
1154 : void
1155 359340 : VisBufferImpl2::configureNewSubchunk (Int msId,
1156 : const String & msName,
1157 : Bool isNewMs,
1158 : Bool isNewArrayId,
1159 : Bool isNewFieldId,
1160 : Bool isNewSpectralWindow,
1161 : const Subchunk & subchunk,
1162 : const casacore::Vector<casacore::rownr_t>& nRowsPerShape,
1163 : const casacore::Vector<casacore::Int>& nChannelsPerShape,
1164 : const casacore::Vector<casacore::Int>& nCorrelationsPerShape,
1165 : const Vector<Int> & correlations,
1166 : const Vector<Stokes::StokesTypes> & correlationsDefined,
1167 : const Vector<Stokes::StokesTypes> & correlationsSelected,
1168 : CountedPtr<WeightScaling> weightScaling)
1169 : {
1170 : // Prepare this VisBuffer for the new subchunk
1171 :
1172 359340 : cacheClear();
1173 :
1174 359340 : setIterationInfo (msId, msName, isNewMs, isNewArrayId, isNewFieldId,
1175 : isNewSpectralWindow, subchunk, correlations,
1176 : correlationsDefined, correlationsSelected, weightScaling);
1177 :
1178 359340 : setFillable (true); // New subchunk, so it's fillable
1179 :
1180 359340 : state_p->frequencies_p.flush();
1181 359340 : state_p->channelNumbers_p.flush();
1182 :
1183 : // Initialize the API methods that do not support several shapes with the first shape
1184 : // Clients which use this "old" API should work as expected as long as there is one
1185 : // single shape in the VisBuffer.
1186 359340 : cache_p->nRows_p.setSpecial (std::accumulate(nRowsPerShape.begin(), nRowsPerShape.end(), 0));
1187 359340 : cache_p->nChannels_p.setSpecial (nChannelsPerShape[0]);
1188 359340 : cache_p->nCorrelations_p.setSpecial (nCorrelationsPerShape[0]);
1189 :
1190 359340 : cache_p->nShapes_p.setSpecial (nRowsPerShape.size());
1191 359340 : cache_p->nRowsPerShape_p.setSpecial (nRowsPerShape);
1192 359340 : cache_p->nChannelsPerShape_p.setSpecial (nChannelsPerShape);
1193 359340 : cache_p->nCorrelationsPerShape_p.setSpecial (nCorrelationsPerShape);
1194 :
1195 359340 : setupValidShapes ();
1196 359340 : }
1197 :
1198 : void
1199 319 : VisBufferImpl2::setRekeyable (Bool isRekeyable)
1200 : {
1201 319 : state_p->isRekeyable_p = isRekeyable;
1202 319 : }
1203 :
1204 : void
1205 485 : VisBufferImpl2::setShape (Int nCorrelations, Int nChannels, rownr_t nRows,
1206 : Bool clearTheCache)
1207 : {
1208 485 : ThrowIf (hasShape() && ! isRekeyable(),
1209 : "Operation setShape is illegal on nonrekeyable VisBuffer");
1210 :
1211 485 : if (clearTheCache){
1212 166 : cacheClear (false); // leave values alone so that array could be reused
1213 : }
1214 :
1215 485 : cache_p->nCorrelations_p.setSpecial(nCorrelations);
1216 485 : cache_p->nChannels_p.setSpecial(nChannels);
1217 485 : cache_p->nRows_p.setSpecial(nRows);
1218 :
1219 485 : Vector<rownr_t> nRowsPerShape(1);
1220 485 : Vector<Int> nChannelsPerShape(1);
1221 485 : Vector<Int> nCorrelationsPerShape(1);
1222 485 : nRowsPerShape[0] = nRows;
1223 485 : nChannelsPerShape[0] = nChannels;
1224 485 : nCorrelationsPerShape[0] = nCorrelations;
1225 :
1226 485 : cache_p->nShapes_p.setSpecial (1);
1227 485 : cache_p->nRowsPerShape_p.setSpecial (nRowsPerShape);
1228 485 : cache_p->nChannelsPerShape_p.setSpecial (nChannelsPerShape);
1229 485 : cache_p->nCorrelationsPerShape_p.setSpecial (nCorrelationsPerShape);
1230 :
1231 485 : setupValidShapes ();
1232 485 : }
1233 :
1234 : void
1235 359825 : VisBufferImpl2::setupValidShapes ()
1236 : {
1237 359825 : state_p->validShapes_p [Nr] = IPosition (1, nRows());
1238 359825 : state_p->validShapes_p [NfNr] = IPosition (2, nChannels(), nRows());
1239 359825 : state_p->validShapes_p [NcNr] = IPosition (2, nCorrelations(), nRows());
1240 359825 : state_p->validShapes_p [NcNfNr] = IPosition (3, nCorrelations(), nChannels(), nRows());
1241 359825 : state_p->validShapes_p [I3Nr] = IPosition (2, 3, nRows());
1242 : //state_p->validShapes [NcNfNcatNr] = IPosition (4, nCorrelations(), nChannels(), nCategories(), nRows());
1243 : // flag_category is not used in CASA, so no need to implement checking.
1244 :
1245 359825 : state_p->validVectorShapes_p [Ns] = IPosition (1, nShapes());
1246 359825 : state_p->validVectorShapes_p [NsNcNr].resize(nShapes());
1247 359825 : state_p->validVectorShapes_p [NsNcNfNr].resize(nShapes());
1248 719650 : for(size_t iShape = 0; iShape < nShapes(); iShape++)
1249 : {
1250 359825 : state_p->validVectorShapes_p [NsNcNr][iShape] = IPosition (2, nCorrelationsPerShape()[iShape], nRowsPerShape()[iShape]);
1251 359825 : state_p->validVectorShapes_p [NsNcNfNr][iShape] = IPosition (3, nCorrelationsPerShape()[iShape], nChannelsPerShape()[iShape], nRowsPerShape()[iShape]);
1252 : }
1253 359825 : }
1254 :
1255 : bool
1256 368 : VisBufferImpl2::setWritability (Bool newWritability)
1257 : {
1258 368 : bool oldWritability = state_p->isWritable_p;
1259 368 : state_p->isWritable_p = newWritability;
1260 368 : return oldWritability;
1261 : }
1262 :
1263 :
1264 :
1265 : // Sort correlations: (PP,QQ,PQ,QP) -> (PP,PQ,QP,QQ)
1266 : void
1267 0 : VisBufferImpl2::sortCorrelationsAux (bool makeSorted)
1268 : {
1269 :
1270 : // This method is for temporarily sorting the correlations
1271 : // into canonical order if the MS data is out-of-order
1272 : // NB: Always sorts the weightMat()
1273 : // NB: Only works on the visCube-style data
1274 : // NB: It only sorts the data columns which are already present
1275 : // (so make sure the ones you need are already read!)
1276 : // NB: It is the user's responsibility to run unSortCorr
1277 : // after using the sorted data to put it back in order
1278 : // NB: corrType_p is NOT changed to match the sorted
1279 : // correlations (it is expected that this sort is
1280 : // temporary, and that we will run unSortCorr
1281 : // NB: This method does nothing if no sort required
1282 :
1283 : // Sort if nominal order is non-canonical (only for nCorr=4).
1284 : // Also do not sort or unsort if that is the current sort state.
1285 :
1286 0 : if (! areCorrelationsInCanonicalOrder() &&
1287 0 : (state_p->areCorrelationsSorted_p != makeSorted)) {
1288 :
1289 : // First sort the weights
1290 :
1291 0 : weight(); // (ensures it is filled)
1292 :
1293 0 : Vector<Float> wtmp(nRows ());
1294 0 : Vector<Float> w1, w2, w3;
1295 0 : IPosition wblc (1, 0, 0);
1296 0 : IPosition wtrc (2, 0, nRows () - 1);
1297 0 : IPosition vec (1, nRows ());
1298 :
1299 0 : VisBufferCache::sortCorrelationItem (cache_p->weight_p, wblc, wtrc, vec, wtmp, makeSorted);
1300 :
1301 : // Now sort the complex data cubes
1302 :
1303 0 : Matrix<Complex> tmp(nChannels (), nRows ());
1304 0 : Matrix<Complex> p1, p2, p3;
1305 0 : IPosition blc(3, 0, 0, 0);
1306 0 : IPosition trc(3, 0, nChannels () - 1, nRows () - 1);
1307 0 : IPosition mat(2, nChannels (), nRows ());
1308 :
1309 : // Sort the various visCubes, if present
1310 :
1311 0 : VisBufferCache::sortCorrelationItem (cache_p->visCube_p, blc, trc, mat, tmp, makeSorted);
1312 :
1313 0 : VisBufferCache::sortCorrelationItem (cache_p->modelVisCube_p, blc, trc, mat, tmp, makeSorted);
1314 :
1315 0 : VisBufferCache::sortCorrelationItem (cache_p->correctedVisCube_p, blc, trc, mat, tmp, makeSorted);
1316 :
1317 : // Finally sort the float data cube
1318 :
1319 0 : Matrix<Float> tmp2 (nChannels (), nRows ());
1320 :
1321 0 : VisBufferCache::sortCorrelationItem (cache_p->floatDataCube_p, blc, trc, mat, tmp2, makeSorted);
1322 :
1323 : // Record the sort state
1324 :
1325 0 : state_p->areCorrelationsSorted_p = makeSorted;
1326 0 : }
1327 :
1328 0 : }
1329 :
1330 : // Sort correlations: (PP,QQ,PQ,QP) -> (PP,PQ,QP,QQ)
1331 : void
1332 0 : VisBufferImpl2::sortCorr()
1333 : {
1334 0 : sortCorrelationsAux (true);
1335 0 : }
1336 :
1337 :
1338 : void
1339 0 : VisBufferImpl2::stateCopy (const VisBufferImpl2 & other)
1340 : {
1341 : // Copy state from the other buffer
1342 :
1343 0 : state_p->areCorrelationsSorted_p = other.areCorrelationsSorted ();
1344 0 : state_p->dirtyComponents_p = other.dirtyComponentsGet ();
1345 0 : state_p->isAttached_p = false; // attachment isn't copyabled
1346 0 : state_p->isNewArrayId_p = other.isNewArrayId ();
1347 0 : state_p->isNewFieldId_p = other.isNewFieldId ();
1348 0 : state_p->isNewMs_p = other.isNewMs ();
1349 0 : state_p->isNewSpectralWindow_p = other.isNewSpectralWindow ();
1350 0 : state_p->pointingTableLastRow_p = -1; // This will slow pointing table lookup
1351 : // but probably not important in cases
1352 : // where a vb is being copied (?).
1353 0 : state_p->newMs_p = other.isNewMs ();
1354 0 : state_p->vi_p = 0; // just to be safe
1355 0 : state_p->visModelData_p = other.getVisModelData ()->clone();
1356 0 : }
1357 :
1358 :
1359 : // Unsort correlations: (PP,PQ,QP,QQ) -> (PP,QQ,PQ,QP)
1360 : void
1361 0 : VisBufferImpl2::unSortCorr()
1362 : {
1363 0 : sortCorrelationsAux (false);
1364 0 : }
1365 :
1366 : void
1367 0 : VisBufferImpl2::validate ()
1368 : {
1369 0 : cacheClear (true); // empty values but mark as cached.
1370 0 : }
1371 :
1372 : void
1373 0 : VisBufferImpl2::validateShapes () const
1374 : {
1375 : // Check that all of the modified array columns have the proper shape.
1376 : // Throw an exception if any columns have improper shape. This is
1377 : // intended to be a last chance sanity-check before the data is written to disk
1378 : // or made available for use.
1379 :
1380 0 : String message;
1381 :
1382 0 : for (CacheRegistry::iterator i = cache_p->registry_p.begin();
1383 0 : i != cache_p->registry_p.end();
1384 0 : i++){
1385 :
1386 0 : if ((*i)->isDirty() && ! (*i)->isShapeOk ()){
1387 :
1388 0 : message += (*i)->shapeErrorMessage () + "\n";
1389 : }
1390 : }
1391 :
1392 0 : ThrowIf (! message.empty(), message);
1393 0 : }
1394 :
1395 : void
1396 0 : VisBufferImpl2::writeChangesBack ()
1397 : {
1398 0 : ThrowIf (! state_p->isAttached_p,
1399 : "Call to writeChangesBack on unattached VisBuffer.");
1400 :
1401 0 : ViImplementation2 * rwvi = dynamic_cast <ViImplementation2 *> (getViiP());
1402 :
1403 0 : ThrowIf (rwvi == 0, "Can't write to a read-only VisibilityIterator.");
1404 :
1405 0 : if (isRekeyable()){
1406 :
1407 0 : validateShapes ();
1408 : }
1409 :
1410 0 : rwvi->writeBackChanges (this);
1411 0 : }
1412 :
1413 : void
1414 0 : VisBufferImpl2::initWeightSpectrum(const Cube<Float>& wtspec)
1415 : {
1416 0 : ThrowIf (! state_p->isAttached_p,
1417 : "Call to writeChangesBack on unattached VisBuffer.");
1418 :
1419 0 : ViImplementation2 * rwvi = dynamic_cast <ViImplementation2 *> (getViiP());
1420 :
1421 0 : ThrowIf (rwvi == 0, "Can't write to a read-only VisibilityIterator.");
1422 :
1423 : // TBD: Should verify that shape is correct!
1424 :
1425 0 : rwvi->initWeightSpectrum(wtspec);
1426 0 : }
1427 :
1428 : void
1429 0 : VisBufferImpl2::initSigmaSpectrum(const Cube<Float>& wtspec)
1430 : {
1431 0 : ThrowIf (! state_p->isAttached_p,
1432 : "Call to writeChangesBack on unattached VisBuffer.");
1433 :
1434 0 : ViImplementation2 * rwvi = dynamic_cast <ViImplementation2 *> (getViiP());
1435 :
1436 0 : ThrowIf (rwvi == 0, "Can't write to a read-only VisibilityIterator.");
1437 :
1438 : // TBD: Should verify that shape is correct!
1439 :
1440 0 : rwvi->initSigmaSpectrum(wtspec);
1441 0 : }
1442 :
1443 :
1444 : const casacore::MeasurementSet&
1445 674 : VisBufferImpl2::ms() const {
1446 674 : return getViiP()->ms();
1447 : }
1448 :
1449 : const vi::SubtableColumns&
1450 3600 : VisBufferImpl2::subtableColumns () const {
1451 3600 : return getViiP()->subtableColumns();
1452 : }
1453 :
1454 : casacore::Bool
1455 0 : VisBufferImpl2::existsColumn(VisBufferComponent2 id) const {
1456 0 : return getViiP()->existsColumn(id);
1457 : }
1458 :
1459 : // +---------------+
1460 : // | |
1461 : // | Calculators |
1462 : // | |
1463 : // +---------------+
1464 :
1465 :
1466 : MDirection
1467 0 : VisBufferImpl2::azel0(Double time) const
1468 : {
1469 0 : return getViiP()->azel0(time);
1470 : }
1471 :
1472 : const Vector<MDirection> &
1473 158571 : VisBufferImpl2::azel(Double time) const
1474 : {
1475 158571 : return getViiP()->azel(time);
1476 : }
1477 :
1478 : const Vector<Float> &
1479 0 : VisBufferImpl2::feedPa(Double time) const
1480 : {
1481 0 : return getViiP()->feed_pa(time);
1482 : }
1483 :
1484 : Double
1485 0 : VisBufferImpl2::hourang(Double time) const
1486 : {
1487 0 : return getViiP()->hourang(time);
1488 : }
1489 :
1490 : Float
1491 0 : VisBufferImpl2::parang0(Double time) const
1492 : {
1493 0 : return getViiP()->parang0(time);
1494 : }
1495 :
1496 : const Vector<Float> &
1497 0 : VisBufferImpl2::parang(Double time) const
1498 : {
1499 0 : return getViiP()->parang(time);
1500 : }
1501 :
1502 : // +-------------+
1503 : // | |
1504 : // | Accessors |
1505 : // | |
1506 : // +-------------+
1507 :
1508 : const Vector<Int> &
1509 4210820 : VisBufferImpl2::antenna1 () const
1510 : {
1511 4210820 : return cache_p->antenna1_p.get ();
1512 : }
1513 :
1514 : void
1515 0 : VisBufferImpl2::setAntenna1 (const Vector<Int> & value)
1516 : {
1517 0 : cache_p->antenna1_p.set (value);
1518 0 : }
1519 :
1520 : const Vector<Int> &
1521 4210820 : VisBufferImpl2::antenna2 () const
1522 : {
1523 4210820 : return cache_p->antenna2_p.get ();
1524 : }
1525 :
1526 : void
1527 0 : VisBufferImpl2::setAntenna2 (const Vector<Int> & value)
1528 : {
1529 0 : cache_p->antenna2_p.set (value);
1530 0 : }
1531 :
1532 : const Vector<Int> &
1533 442335 : VisBufferImpl2::arrayId () const
1534 : {
1535 442335 : return cache_p->arrayId_p.get ();
1536 : }
1537 :
1538 : void
1539 0 : VisBufferImpl2::setArrayId (const Vector<Int> &value)
1540 : {
1541 0 : cache_p->arrayId_p.set (value);
1542 0 : }
1543 :
1544 : const Vector<SquareMatrix<Complex, 2> > &
1545 0 : VisBufferImpl2::cjones () const
1546 : {
1547 0 : return cache_p->cjones_p.get ();
1548 : }
1549 :
1550 : const Vector<Int> &
1551 451460 : VisBufferImpl2::correlationTypes () const
1552 : {
1553 451460 : return cache_p->corrType_p.get ();
1554 : }
1555 :
1556 : //Int
1557 : //VisBufferImpl2::dataDescriptionId () const
1558 : //{
1559 : // return cache_p->dataDescriptionId_p.get ();
1560 : //}
1561 :
1562 : const Vector<Int> &
1563 41764 : VisBufferImpl2::dataDescriptionIds () const
1564 : {
1565 41764 : return cache_p->dataDescriptionIds_p.get ();
1566 : }
1567 :
1568 : //void
1569 : //VisBufferImpl2::setDataDescriptionId (Int value)
1570 : //{
1571 : // cache_p->dataDescriptionId_p.set (value);
1572 : //}
1573 :
1574 : void
1575 0 : VisBufferImpl2::setDataDescriptionIds (const Vector<Int> & value)
1576 : {
1577 0 : cache_p->dataDescriptionIds_p.set (value);
1578 0 : }
1579 :
1580 :
1581 : const Vector<MDirection> &
1582 0 : VisBufferImpl2::direction1 () const
1583 : {
1584 0 : return cache_p->direction1_p.get ();
1585 : }
1586 :
1587 : const Vector<MDirection> &
1588 0 : VisBufferImpl2::direction2 () const
1589 : {
1590 0 : return cache_p->direction2_p.get ();
1591 : }
1592 :
1593 : const Vector<Double> &
1594 61495 : VisBufferImpl2::exposure () const
1595 : {
1596 61495 : return cache_p->exposure_p.get ();
1597 : }
1598 :
1599 : void
1600 0 : VisBufferImpl2::setExposure (const Vector<Double> & value)
1601 : {
1602 0 : cache_p->exposure_p.set (value);
1603 0 : }
1604 :
1605 : const Vector<Int> &
1606 21059 : VisBufferImpl2::feed1 () const
1607 : {
1608 21059 : return cache_p->feed1_p.get ();
1609 : }
1610 :
1611 : void
1612 0 : VisBufferImpl2::setFeed1 (const Vector<Int> & value)
1613 : {
1614 0 : cache_p->feed1_p.set (value);
1615 0 : }
1616 :
1617 : const Vector<Float> &
1618 0 : VisBufferImpl2::feedPa1 () const
1619 : {
1620 0 : return cache_p->feed1Pa_p.get ();
1621 : }
1622 :
1623 : const Vector<Int> &
1624 21059 : VisBufferImpl2::feed2 () const
1625 : {
1626 21059 : return cache_p->feed2_p.get ();
1627 : }
1628 :
1629 : void
1630 0 : VisBufferImpl2::setFeed2 (const Vector<Int> & value)
1631 : {
1632 0 : cache_p->feed2_p.set (value);
1633 0 : }
1634 :
1635 : const Vector<Float> &
1636 0 : VisBufferImpl2::feedPa2 () const
1637 : {
1638 0 : return cache_p->feed2Pa_p.get ();
1639 : }
1640 :
1641 : const Vector<Int> &
1642 466500 : VisBufferImpl2::fieldId () const
1643 : {
1644 466500 : return cache_p->fieldId_p.get ();
1645 : }
1646 :
1647 : void
1648 0 : VisBufferImpl2::setFieldId (const Vector<Int> & value)
1649 : {
1650 0 : cache_p->fieldId_p.set (value);
1651 0 : }
1652 :
1653 : //const Matrix<Bool> &
1654 : //VisBufferImpl2::flag () const
1655 : //{
1656 : // return cache_p->flag_p.get ();
1657 : //}
1658 :
1659 : //void
1660 : //VisBufferImpl2::setFlag (const Matrix<Bool>& value)
1661 : //{
1662 : // cache_p->flag_p.set (value);
1663 : //}
1664 :
1665 : const Array<Bool> &
1666 0 : VisBufferImpl2::flagCategory () const
1667 : {
1668 0 : return cache_p->flagCategory_p.get();
1669 : }
1670 :
1671 : void
1672 0 : VisBufferImpl2::setFlagCategory (const Array<Bool>& value)
1673 : {
1674 0 : cache_p->flagCategory_p.set (value);
1675 0 : }
1676 :
1677 : const casacore::Vector<casacore::Array<casacore::Bool>> &
1678 0 : VisBufferImpl2::flagCategories () const
1679 : {
1680 0 : return cache_p->flagCategories_p.get();
1681 : }
1682 :
1683 : void
1684 0 : VisBufferImpl2::setFlagCategories (const casacore::Vector<casacore::Array<casacore::Bool>>& value)
1685 : {
1686 0 : cache_p->flagCategories_p.set (value);
1687 0 : }
1688 :
1689 : const Cube<Bool> &
1690 414259 : VisBufferImpl2::flagCube () const
1691 : {
1692 414259 : return cache_p->flagCube_p.get ();
1693 : }
1694 :
1695 : const Vector<Cube<Bool>> &
1696 0 : VisBufferImpl2::flagCubes () const
1697 : {
1698 0 : return cache_p->flagCubes_p.get ();
1699 : }
1700 :
1701 : Cube<Bool> &
1702 0 : VisBufferImpl2::flagCubeRef ()
1703 : {
1704 0 : return cache_p->flagCube_p.getRef ();
1705 : }
1706 :
1707 : Vector<Cube<Bool>> &
1708 0 : VisBufferImpl2::flagCubesRef ()
1709 : {
1710 0 : return cache_p->flagCubes_p.getRef ();
1711 : }
1712 :
1713 : void
1714 0 : VisBufferImpl2::setFlagCube (const Cube<Bool>& value)
1715 : {
1716 0 : cache_p->flagCube_p.set (value);
1717 0 : }
1718 :
1719 : void
1720 0 : VisBufferImpl2::setFlagCubes (const Vector<Cube<Bool>>& value)
1721 : {
1722 0 : cache_p->flagCubes_p.set (value);
1723 0 : }
1724 :
1725 : const Vector<Bool> &
1726 379756 : VisBufferImpl2::flagRow () const
1727 : {
1728 379756 : return cache_p->flagRow_p.get ();
1729 : }
1730 :
1731 : Vector<Bool> &
1732 0 : VisBufferImpl2::flagRowRef ()
1733 : {
1734 0 : return cache_p->flagRow_p.getRef ();
1735 : }
1736 :
1737 : void
1738 0 : VisBufferImpl2::setFlagRow (const Vector<Bool>& value)
1739 : {
1740 0 : cache_p->flagRow_p.set (value);
1741 0 : }
1742 :
1743 : const Matrix<Float> &
1744 600 : VisBufferImpl2::imagingWeight () const
1745 : {
1746 600 : return cache_p->imagingWeight_p.get ();
1747 : }
1748 :
1749 : void
1750 0 : VisBufferImpl2::setImagingWeight (const Matrix<Float> & newImagingWeight)
1751 : {
1752 0 : cache_p->imagingWeight_p.set (newImagingWeight);
1753 0 : }
1754 :
1755 :
1756 : //const Vector<Double> &
1757 : //VisBufferImpl2::lsrFrequency () const
1758 : //{
1759 : // return cache_p->lsrFrequency_p.get ();
1760 : //}
1761 :
1762 : Int
1763 1687 : VisBufferImpl2::nAntennas () const
1764 : {
1765 1687 : return cache_p->nAntennas_p.get ();
1766 : }
1767 :
1768 : Int
1769 1129123 : VisBufferImpl2::nChannels () const
1770 : {
1771 1129123 : return cache_p->nChannels_p.get ();
1772 : }
1773 :
1774 : Int
1775 1292939 : VisBufferImpl2::nCorrelations () const
1776 : {
1777 1292939 : return cache_p->nCorrelations_p.get();
1778 : }
1779 :
1780 : rownr_t
1781 2747397 : VisBufferImpl2::nRows () const
1782 : {
1783 2747397 : return cache_p->nRows_p.get ();
1784 : }
1785 :
1786 : rownr_t
1787 1799125 : VisBufferImpl2::nShapes () const
1788 : {
1789 1799125 : return cache_p->nShapes_p.get ();
1790 : }
1791 :
1792 : const Vector<rownr_t>&
1793 719650 : VisBufferImpl2::nRowsPerShape () const
1794 : {
1795 719650 : return cache_p->nRowsPerShape_p.get ();
1796 : }
1797 :
1798 : const Vector<Int> &
1799 359825 : VisBufferImpl2::nChannelsPerShape () const
1800 : {
1801 359825 : return cache_p->nChannelsPerShape_p.get ();
1802 : }
1803 :
1804 : const Vector<Int> &
1805 719650 : VisBufferImpl2::nCorrelationsPerShape () const
1806 : {
1807 719650 : return cache_p->nCorrelationsPerShape_p.get ();
1808 : }
1809 :
1810 : const Vector<Int> &
1811 442335 : VisBufferImpl2::observationId () const
1812 : {
1813 442335 : return cache_p->observationId_p.get ();
1814 : }
1815 :
1816 : void
1817 0 : VisBufferImpl2::setObservationId (const Vector<Int> & value)
1818 : {
1819 0 : cache_p->observationId_p.set (value);
1820 0 : }
1821 :
1822 : const MDirection&
1823 2396 : VisBufferImpl2::phaseCenter () const
1824 : {
1825 2396 : return cache_p->phaseCenter_p.get ();
1826 : }
1827 :
1828 : Int
1829 965 : VisBufferImpl2::polarizationFrame () const
1830 : {
1831 965 : return cache_p->polFrame_p.get ();
1832 : }
1833 :
1834 : Int
1835 4932 : VisBufferImpl2::polarizationId () const
1836 : {
1837 4932 : return cache_p->polarizationId_p.get ();
1838 : }
1839 :
1840 : const Vector<Int> &
1841 24293 : VisBufferImpl2::processorId () const
1842 : {
1843 24293 : return cache_p->processorId_p.get ();
1844 : }
1845 :
1846 : void
1847 0 : VisBufferImpl2::setProcessorId (const Vector<Int> & value)
1848 : {
1849 0 : cache_p->processorId_p.set (value);
1850 0 : }
1851 :
1852 : const Vector<rownr_t> &
1853 10184 : VisBufferImpl2::rowIds () const
1854 : {
1855 10184 : return cache_p->rowIds_p.get ();
1856 : }
1857 :
1858 : const Vector<Int> &
1859 3754688 : VisBufferImpl2::scan () const
1860 : {
1861 3754688 : return cache_p->scan_p.get ();
1862 : }
1863 :
1864 : void
1865 0 : VisBufferImpl2::setScan (const Vector<Int> & value)
1866 : {
1867 0 : cache_p->scan_p.set (value);
1868 0 : }
1869 :
1870 : const Matrix<Float> &
1871 138546 : VisBufferImpl2::sigma () const
1872 : {
1873 138546 : return cache_p->sigma_p.get ();
1874 : }
1875 :
1876 : const Vector<Matrix<Float>> &
1877 0 : VisBufferImpl2::sigmas () const
1878 : {
1879 0 : return cache_p->sigmas_p.get ();
1880 : }
1881 :
1882 : void
1883 0 : VisBufferImpl2::setSigma (const Matrix<Float> & sigmas)
1884 : {
1885 0 : cache_p->sigma_p.set (sigmas);
1886 0 : }
1887 :
1888 : void
1889 0 : VisBufferImpl2::setSigmas (const Vector<Matrix<Float>> & sigmas)
1890 : {
1891 0 : cache_p->sigmas_p.set (sigmas);
1892 0 : }
1893 :
1894 : //const Matrix<Float> &
1895 : //VisBufferImpl2::sigmaMat () const
1896 : //{
1897 : // return cache_p->sigmaMat_p.get ();
1898 : //}
1899 :
1900 : const Vector<Int> &
1901 603278 : VisBufferImpl2::spectralWindows () const
1902 : {
1903 603278 : return cache_p->spectralWindows_p.get ();
1904 : }
1905 :
1906 : void
1907 0 : VisBufferImpl2::setSpectralWindows (const Vector<Int> & spectralWindows)
1908 : {
1909 0 : cache_p->spectralWindows_p.set (spectralWindows);
1910 0 : }
1911 :
1912 :
1913 : const Vector<Int> &
1914 23138 : VisBufferImpl2::stateId () const
1915 : {
1916 23138 : return cache_p->stateId_p.get ();
1917 : }
1918 :
1919 : void
1920 0 : VisBufferImpl2::setStateId (const Vector<Int> & value)
1921 : {
1922 0 : cache_p->stateId_p.set (value);
1923 0 : }
1924 :
1925 : const Vector<Double> &
1926 386106 : VisBufferImpl2::time () const
1927 : {
1928 386106 : return cache_p->time_p.get ();
1929 : }
1930 :
1931 : void
1932 0 : VisBufferImpl2::setTime (const Vector<Double> & value)
1933 : {
1934 0 : cache_p->time_p.set (value);
1935 0 : }
1936 :
1937 : const Vector<Double> &
1938 303069 : VisBufferImpl2::timeCentroid () const
1939 : {
1940 303069 : return cache_p->timeCentroid_p.get ();
1941 : }
1942 :
1943 : void
1944 0 : VisBufferImpl2::setTimeCentroid (const Vector<Double> & value)
1945 : {
1946 0 : cache_p->timeCentroid_p.set (value);
1947 0 : }
1948 :
1949 : const Vector<Double> &
1950 56412 : VisBufferImpl2::timeInterval () const
1951 : {
1952 56412 : return cache_p->timeInterval_p.get ();
1953 : }
1954 :
1955 : void
1956 0 : VisBufferImpl2::setTimeInterval (const Vector<Double> & value)
1957 : {
1958 0 : cache_p->timeInterval_p.set (value);
1959 0 : }
1960 :
1961 : const Matrix<Double> &
1962 2390490 : VisBufferImpl2::uvw () const
1963 : {
1964 2390490 : return cache_p->uvw_p.get ();
1965 : }
1966 :
1967 : void
1968 0 : VisBufferImpl2::setUvw (const Matrix<Double> & value)
1969 : {
1970 0 : cache_p->uvw_p.set (value);
1971 0 : }
1972 :
1973 : const Cube<Complex> &
1974 26153 : VisBufferImpl2::visCubeCorrected () const
1975 : {
1976 26153 : return cache_p->correctedVisCube_p.get ();
1977 : }
1978 :
1979 : Cube<Complex> &
1980 0 : VisBufferImpl2::visCubeCorrectedRef ()
1981 : {
1982 0 : return cache_p->correctedVisCube_p.getRef ();
1983 : }
1984 :
1985 : void
1986 0 : VisBufferImpl2::setVisCubeCorrected (const Cube<Complex> & value)
1987 : {
1988 0 : cache_p->correctedVisCube_p.set (value);
1989 0 : }
1990 :
1991 : const Vector<Cube<Complex>> &
1992 0 : VisBufferImpl2::visCubesCorrected () const
1993 : {
1994 0 : return cache_p->correctedVisCubes_p.get ();
1995 : }
1996 :
1997 : Vector<Cube<Complex>> &
1998 0 : VisBufferImpl2::visCubesCorrectedRef ()
1999 : {
2000 0 : return cache_p->correctedVisCubes_p.getRef ();
2001 : }
2002 :
2003 : void
2004 0 : VisBufferImpl2::setVisCubesCorrected (const Vector<Cube<Complex>> & value)
2005 : {
2006 0 : cache_p->correctedVisCubes_p.set (value);
2007 0 : }
2008 :
2009 : //const Matrix<CStokesVector> &
2010 : //VisBufferImpl2::visCorrected () const
2011 : //{
2012 : // return cache_p->correctedVisibility_p.get ();
2013 : //}
2014 :
2015 : //void
2016 : //VisBufferImpl2::setVisCorrected (const Matrix<CStokesVector> & value)
2017 : //{
2018 : // cache_p->correctedVisibility_p.set (value);
2019 : //}
2020 :
2021 : const Cube<Float> &
2022 0 : VisBufferImpl2::visCubeFloat () const
2023 : {
2024 0 : return cache_p->floatDataCube_p.get ();
2025 : }
2026 :
2027 : void
2028 0 : VisBufferImpl2::setVisCubeFloat (const Cube<Float> & value)
2029 : {
2030 0 : cache_p->floatDataCube_p.set (value);
2031 0 : }
2032 :
2033 : const Vector<Cube<Float>> &
2034 0 : VisBufferImpl2::visCubesFloat () const
2035 : {
2036 0 : return cache_p->floatDataCubes_p.get ();
2037 : }
2038 :
2039 : void
2040 0 : VisBufferImpl2::setVisCubesFloat (const Vector<Cube<Float>> & value)
2041 : {
2042 0 : cache_p->floatDataCubes_p.set (value);
2043 0 : }
2044 :
2045 : const Cube<Complex> &
2046 24497 : VisBufferImpl2::visCubeModel () const
2047 : {
2048 24497 : return cache_p->modelVisCube_p.get ();
2049 : }
2050 :
2051 : Cube<Complex> &
2052 0 : VisBufferImpl2::visCubeModelRef ()
2053 : {
2054 0 : return cache_p->modelVisCube_p.getRef ();
2055 : }
2056 :
2057 : void
2058 144 : VisBufferImpl2::setVisCubeModel (const Complex & value)
2059 : {
2060 144 : cache_p->modelVisCube_p.set (value);
2061 144 : }
2062 :
2063 : void
2064 184 : VisBufferImpl2::setVisCubeModel (const Cube<Complex> & value)
2065 : {
2066 184 : cache_p->modelVisCube_p.set (value);
2067 184 : }
2068 :
2069 : const Vector<Cube<Complex>> &
2070 0 : VisBufferImpl2::visCubesModel () const
2071 : {
2072 0 : return cache_p->modelVisCubes_p.get ();
2073 : }
2074 :
2075 : Vector<Cube<Complex>> &
2076 0 : VisBufferImpl2::visCubesModelRef ()
2077 : {
2078 0 : return cache_p->modelVisCubes_p.getRef ();
2079 : }
2080 :
2081 : void
2082 0 : VisBufferImpl2::setVisCubesModel (const Vector<Cube<Complex>> & value)
2083 : {
2084 0 : cache_p->modelVisCubes_p.set (value);
2085 0 : }
2086 :
2087 : //void
2088 : //VisBufferImpl2::setVisCubesModel (const Complex & value)
2089 : //{
2090 : // cache_p->modelVisCubes_p.set (value);
2091 : //}
2092 :
2093 : ms::MsRow *
2094 1148 : VisBufferImpl2::getRow (Int row) const
2095 : {
2096 1148 : ms::MsRow * msRow = new ms::Vbi2MsRow (row, this);
2097 :
2098 1148 : return msRow;
2099 : }
2100 :
2101 : ms::MsRow *
2102 0 : VisBufferImpl2::getRowMutable (Int row)
2103 : {
2104 0 : ms::MsRow * msRow = new ms::Vbi2MsRow (row, this);
2105 :
2106 0 : return msRow;
2107 : }
2108 :
2109 :
2110 : //const Matrix<CStokesVector> &
2111 : //VisBufferImpl2::visModel () const
2112 : //{
2113 : // return cache_p->modelVisibility_p.get ();
2114 : //}
2115 :
2116 : //void
2117 : //VisBufferImpl2::setVisModel (Matrix<CStokesVector> & value)
2118 : //{
2119 : // cache_p->modelVisibility_p.set (value);
2120 : //}
2121 :
2122 : void
2123 0 : VisBufferImpl2::setVisCubeModel(const Vector<Float>& stokesIn)
2124 : {
2125 :
2126 : enum {I, Q, U, V};
2127 :
2128 0 : Vector<Float> stokes (4, 0.0);
2129 :
2130 0 : stokes [I] = 1.0; // Stokes parameters, nominally unpolarized, unit I
2131 :
2132 0 : for (uInt i = 0; i < stokesIn.nelements(); ++i){
2133 0 : stokes [i] = stokesIn [i];
2134 : }
2135 :
2136 : // Convert to correlations, according to basis
2137 0 : Vector<Complex> stokesFinal (4, Complex(0.0)); // initially all zero
2138 :
2139 0 : if (polarizationFrame() == MSIter::Circular){
2140 0 : stokesFinal(0) = Complex(stokes [I] + stokes [V]);
2141 0 : stokesFinal(1) = Complex(stokes [Q], stokes [U]);
2142 0 : stokesFinal(2) = Complex(stokes [Q], -stokes [U]);
2143 0 : stokesFinal(3) = Complex(stokes [I] - stokes [V]);
2144 : }
2145 0 : else if (polarizationFrame() == MSIter::Linear) {
2146 0 : stokesFinal(0) = Complex(stokes [I] + stokes [Q]);
2147 0 : stokesFinal(1) = Complex(stokes [U], stokes [V]);
2148 0 : stokesFinal(2) = Complex(stokes [U], -stokes [V]);
2149 0 : stokesFinal(3) = Complex(stokes [I] - stokes [Q]);
2150 : }
2151 : else {
2152 0 : throw(AipsError("Model-setting only works for CIRCULAR and LINEAR bases, for now."));
2153 : }
2154 :
2155 : // A map onto the actual correlations in the VisBuffer (which may be a subset)
2156 0 : Vector<Int> corrmap;
2157 0 : corrmap.assign(correlationTypes()); // actual copy, to avoid changing correlationTypes()!
2158 0 : corrmap -= corrmap(0);
2159 :
2160 0 : ThrowIf (max(corrmap) >= 4, "HELP! The correlations in the data are not normal!");
2161 :
2162 : // Set the modelVisCube accordingly
2163 0 : Cube<Complex> visCube (getViiP()->visibilityShape(), 0.0);
2164 :
2165 0 : for (Int icorr = 0; icorr < nCorrelations (); ++icorr){
2166 0 : if (abs(stokesFinal(corrmap(icorr))) > 0.0) {
2167 0 : visCube (Slice (icorr, 1, 1), Slice(), Slice()).set(stokesFinal (corrmap (icorr)));
2168 : }
2169 : }
2170 :
2171 0 : cache_p->modelVisCube_p.set (visCube);
2172 :
2173 0 : }
2174 :
2175 :
2176 : const Cube<Complex> &
2177 113963 : VisBufferImpl2::visCube () const
2178 : {
2179 113963 : return cache_p->visCube_p.get ();
2180 : }
2181 :
2182 : Cube<Complex> &
2183 0 : VisBufferImpl2::visCubeRef ()
2184 : {
2185 0 : return cache_p->visCube_p.getRef ();
2186 : }
2187 :
2188 : void
2189 0 : VisBufferImpl2::setVisCube (const Complex & value)
2190 : {
2191 0 : cache_p->visCube_p.set (value);
2192 0 : }
2193 :
2194 : void
2195 600 : VisBufferImpl2::setVisCube (const Cube<Complex> & value)
2196 : {
2197 600 : cache_p->visCube_p.set (value);
2198 600 : }
2199 :
2200 : const Vector<Cube<Complex>> &
2201 0 : VisBufferImpl2::visCubes () const
2202 : {
2203 0 : return cache_p->visCubes_p.get ();
2204 : }
2205 :
2206 : Vector<Cube<Complex>> &
2207 0 : VisBufferImpl2::visCubesRef ()
2208 : {
2209 0 : return cache_p->visCubes_p.getRef ();
2210 : }
2211 :
2212 : //void
2213 : //VisBufferImpl2::setVisCubes (const Complex & value)
2214 : //{
2215 : // cache_p->visCube_p.set (value);
2216 : //}
2217 :
2218 : void
2219 0 : VisBufferImpl2::setVisCubes (const Vector<Cube<Complex>> & value)
2220 : {
2221 0 : cache_p->visCubes_p.set (value);
2222 0 : }
2223 :
2224 : //const Matrix<CStokesVector> &
2225 : //VisBufferImpl2::vis () const
2226 : //{
2227 : // return cache_p->visibility_p.get ();
2228 : //}
2229 :
2230 : //void
2231 : //VisBufferImpl2::setVis (Matrix<CStokesVector> & value)
2232 : //{
2233 : // cache_p->visibility_p.set (value);
2234 : //}
2235 :
2236 : const Matrix<Float> &
2237 88703 : VisBufferImpl2::weight () const
2238 : {
2239 88703 : return cache_p->weight_p.get ();
2240 : }
2241 :
2242 : void
2243 0 : VisBufferImpl2::setWeight (const Matrix<Float>& value)
2244 : {
2245 0 : cache_p->weight_p.set (value);
2246 0 : }
2247 :
2248 : const Vector<Matrix<Float>> &
2249 0 : VisBufferImpl2::weights () const
2250 : {
2251 0 : return cache_p->weights_p.get ();
2252 : }
2253 :
2254 : void
2255 0 : VisBufferImpl2::setWeights (const Vector<Matrix<Float>>& value)
2256 : {
2257 0 : cache_p->weights_p.set (value);
2258 0 : }
2259 :
2260 : //const Matrix<Float> &
2261 : //VisBufferImpl2::weightMat () const
2262 : //{
2263 : // return cache_p->weightMat_p.get ();
2264 : //}
2265 :
2266 : //void
2267 : //VisBufferImpl2::setWeightMat (const Matrix<Float>& value)
2268 : //{
2269 : // cache_p->weightMat_p.set (value);
2270 : //}
2271 :
2272 : const Cube<Float> &
2273 42943 : VisBufferImpl2::weightSpectrum () const
2274 : {
2275 42943 : return cache_p->weightSpectrum_p.get ();
2276 : }
2277 :
2278 : Cube<Float> &
2279 0 : VisBufferImpl2::weightSpectrumRef ()
2280 : {
2281 0 : return cache_p->weightSpectrum_p.getRef();
2282 : }
2283 :
2284 :
2285 : void
2286 0 : VisBufferImpl2::setWeightSpectrum (const Cube<Float>& value)
2287 : {
2288 0 : cache_p->weightSpectrum_p.set (value);
2289 0 : }
2290 :
2291 : const Vector<Cube<Float>> &
2292 0 : VisBufferImpl2::weightSpectra () const
2293 : {
2294 0 : return cache_p->weightSpectra_p.get ();
2295 : }
2296 :
2297 : Vector<Cube<Float>> &
2298 0 : VisBufferImpl2::weightSpectraRef ()
2299 : {
2300 0 : return cache_p->weightSpectra_p.getRef();
2301 : }
2302 :
2303 : void
2304 0 : VisBufferImpl2::setWeightSpectra (const Vector<Cube<Float>>& value)
2305 : {
2306 0 : cache_p->weightSpectra_p.set (value);
2307 0 : }
2308 :
2309 : const Cube<Float> &
2310 58842 : VisBufferImpl2::sigmaSpectrum () const
2311 : {
2312 58842 : return cache_p->sigmaSpectrum_p.get ();
2313 : }
2314 :
2315 : Cube<Float> &
2316 0 : VisBufferImpl2::sigmaSpectrumRef ()
2317 : {
2318 0 : return cache_p->sigmaSpectrum_p.getRef();
2319 : }
2320 :
2321 : void
2322 0 : VisBufferImpl2::setSigmaSpectrum (const Cube<Float>& value)
2323 : {
2324 0 : cache_p->sigmaSpectrum_p.set (value);
2325 0 : }
2326 :
2327 : const Vector<Cube<Float>> &
2328 0 : VisBufferImpl2::sigmaSpectra () const
2329 : {
2330 0 : return cache_p->sigmaSpectra_p.get ();
2331 : }
2332 :
2333 : Vector<Cube<Float>> &
2334 0 : VisBufferImpl2::sigmaSpectraRef ()
2335 : {
2336 0 : return cache_p->sigmaSpectra_p.getRef();
2337 : }
2338 :
2339 : void
2340 0 : VisBufferImpl2::setSigmaSpectra (const Vector<Cube<Float>>& value)
2341 : {
2342 0 : cache_p->sigmaSpectra_p.set (value);
2343 0 : }
2344 :
2345 :
2346 :
2347 : // +-----------+
2348 : // | |
2349 : // | Fillers |
2350 : // | |
2351 : // +-----------+
2352 :
2353 :
2354 : void
2355 86493 : VisBufferImpl2::fillAntenna1 (Vector<Int>& value) const
2356 : {
2357 86493 : CheckVisIter ();
2358 :
2359 86493 : getViiP()->antenna1 (value);
2360 86493 : }
2361 :
2362 :
2363 : void
2364 86493 : VisBufferImpl2::fillAntenna2 (Vector<Int>& value) const
2365 : {
2366 86493 : CheckVisIter ();
2367 :
2368 86493 : getViiP()->antenna2 (value);
2369 86493 : }
2370 :
2371 : void
2372 343098 : VisBufferImpl2::fillArrayId (Vector<Int>& value) const
2373 : {
2374 343098 : CheckVisIter ();
2375 :
2376 343098 : getViiP()->arrayIds (value);
2377 343098 : }
2378 :
2379 : void
2380 342231 : VisBufferImpl2::fillCorrType (Vector<Int>& value) const
2381 : {
2382 342231 : CheckVisIter ();
2383 :
2384 342231 : getViiP()->corrType (value);
2385 342231 : }
2386 :
2387 : void
2388 6844 : VisBufferImpl2::fillCubeCorrected (Cube <Complex> & value) const
2389 : {
2390 6844 : CheckVisIter ();
2391 :
2392 6844 : getViiP()->visibilityCorrected (value);
2393 6844 : }
2394 :
2395 : void
2396 0 : VisBufferImpl2::fillCubesCorrected (Vector<Cube<Complex>> & value) const
2397 : {
2398 0 : CheckVisIter ();
2399 :
2400 0 : getViiP()->visibilityCorrected (value);
2401 0 : }
2402 :
2403 : void
2404 5488 : VisBufferImpl2::fillCubeModel (Cube <Complex> & value) const
2405 : {
2406 5488 : CheckVisIter ();
2407 :
2408 5488 : getViiP()->visibilityModel(value);
2409 5488 : }
2410 :
2411 : void
2412 0 : VisBufferImpl2::fillCubesModel (Vector<Cube <Complex>> & value) const
2413 : {
2414 0 : CheckVisIter ();
2415 :
2416 0 : getViiP()->visibilityModel(value);
2417 0 : }
2418 :
2419 : void
2420 31899 : VisBufferImpl2::fillCubeObserved (Cube <Complex> & value) const
2421 : {
2422 31899 : CheckVisIter ();
2423 :
2424 31899 : getViiP()->visibilityObserved (value);
2425 31899 : }
2426 :
2427 : void
2428 0 : VisBufferImpl2::fillCubesObserved (Vector<Cube <Complex>> & value) const
2429 : {
2430 0 : CheckVisIter ();
2431 :
2432 0 : getViiP()->visibilityObserved (value);
2433 0 : }
2434 :
2435 : void
2436 0 : VisBufferImpl2::fillDataDescriptionId (Int& value) const
2437 : {
2438 0 : CheckVisIter ();
2439 :
2440 0 : value = getViiP()->dataDescriptionId ();
2441 0 : }
2442 :
2443 : void
2444 909 : VisBufferImpl2::fillDataDescriptionIds (Vector<Int>& value) const
2445 : {
2446 909 : CheckVisIter ();
2447 :
2448 909 : getViiP()->dataDescriptionIds (value);
2449 909 : }
2450 :
2451 :
2452 : void
2453 0 : VisBufferImpl2::fillDirection1 (Vector<MDirection>& value) const
2454 : {
2455 0 : CheckVisIterBase ();
2456 : // fill state_p->feed1_pa cache, antenna, feed and time will be filled automatically
2457 :
2458 0 : feedPa1 ();
2459 :
2460 0 : fillDirectionAux (value, antenna1 (), feed1 (), feedPa1 ());
2461 :
2462 0 : value.resize(nRows());
2463 0 : }
2464 :
2465 : void
2466 0 : VisBufferImpl2::fillDirection2 (Vector<MDirection>& value) const
2467 : {
2468 0 : CheckVisIterBase ();
2469 : // fill state_p->feed1_pa cache, antenna, feed and time will be filled automatically
2470 :
2471 0 : feedPa2 ();
2472 :
2473 0 : fillDirectionAux (value, antenna2 (), feed2 (), feedPa2 ());
2474 :
2475 0 : value.resize(nRows());
2476 0 : }
2477 :
2478 : void
2479 0 : VisBufferImpl2::fillDirectionAux (Vector<MDirection>& value,
2480 : const Vector<Int> & antenna,
2481 : const Vector<Int> &feed,
2482 : const Vector<Float> & feedPa) const
2483 : {
2484 0 : value.resize (nRows());
2485 :
2486 : // const MSPointingColumns & mspc = getViiP()->subtableColumns ().pointing();
2487 : // state_p->pointingTableLastRow_p = mspc.pointingIndex (antenna (0),
2488 : // time()(0), state_p->pointingTableLastRow_p);
2489 :
2490 0 : if (getViiP()->allBeamOffsetsZero() && state_p->pointingTableLastRow_p < 0) {
2491 :
2492 : // No true pointing information found; use phase center from the field table
2493 :
2494 0 : value.set(phaseCenter());
2495 0 : state_p->pointingTableLastRow_p = 0;
2496 0 : return;
2497 : }
2498 :
2499 :
2500 0 : for (uInt row = 0; row < antenna.nelements(); ++row) {
2501 :
2502 0 : DebugAssert(antenna (row) >= 0 && feed (row) >= 0, AipsError);
2503 :
2504 : bool ok;
2505 0 : std::tie (ok, value (row)) = getViiP()->getPointingAngle (antenna (row), time() (row));
2506 :
2507 0 : if (! ok) {
2508 :
2509 0 : value(row) = phaseCenter(); // nothing found, use phase center
2510 : }
2511 :
2512 0 : if (!getViiP()->allBeamOffsetsZero()) {
2513 :
2514 0 : RigidVector<Double, 2> beamOffset = getViiP()->getBeamOffsets()(0, antenna (row),
2515 0 : feed (row));
2516 :
2517 0 : if (downcase (getViiP()->antennaMounts()(antenna (row))) == "alt-az") {
2518 :
2519 0 : SquareMatrix<Double, 2> xform(SquareMatrix<Double, 2>::General);
2520 :
2521 0 : Double cpa = cos(feedPa(row));
2522 0 : Double spa = sin(feedPa(row));
2523 :
2524 0 : xform(0, 0) = cpa;
2525 0 : xform(1, 1) = cpa;
2526 0 : xform(0, 1) = -spa;
2527 0 : xform(1, 0) = spa;
2528 :
2529 0 : beamOffset *= xform; // parallactic angle rotation
2530 0 : }
2531 :
2532 0 : value(row).shift(-beamOffset(0), beamOffset(1), true);
2533 : // x direction is flipped to convert az-el type frame to ra-dec
2534 : }
2535 : }
2536 : }
2537 :
2538 : void
2539 1731 : VisBufferImpl2::fillExposure (Vector<Double>& value) const
2540 : {
2541 1731 : CheckVisIter ();
2542 :
2543 1731 : getViiP()->exposure (value);
2544 1731 : }
2545 :
2546 : void
2547 909 : VisBufferImpl2::fillFeed1 (Vector<Int>& value) const
2548 : {
2549 909 : CheckVisIter ();
2550 :
2551 909 : getViiP()->feed1 (value);
2552 909 : }
2553 :
2554 : void
2555 909 : VisBufferImpl2::fillFeed2 (Vector<Int>& value) const
2556 : {
2557 909 : CheckVisIter ();
2558 :
2559 909 : getViiP()->feed2 (value);
2560 909 : }
2561 :
2562 : void
2563 0 : VisBufferImpl2::fillFeedPa1 (Vector <Float> & feedPa) const
2564 : {
2565 0 : CheckVisIterBase ();
2566 :
2567 : // fill feed, antenna and time caches, if not filled before
2568 :
2569 0 : feed1 ();
2570 0 : antenna1 ();
2571 0 : time ();
2572 :
2573 0 : feedPa.resize(nRows());
2574 :
2575 0 : fillFeedPaAux (feedPa, antenna1 (), feed1 ());
2576 0 : }
2577 :
2578 :
2579 : void
2580 0 : VisBufferImpl2::fillFeedPa2 (Vector <Float> & feedPa) const
2581 : {
2582 0 : CheckVisIterBase ();
2583 :
2584 : // Fill feed, antenna and time caches, if not filled before.
2585 :
2586 0 : feed2();
2587 0 : antenna2();
2588 0 : time();
2589 :
2590 0 : feedPa.resize(nRows());
2591 :
2592 0 : fillFeedPaAux (feedPa, antenna2(), feed2 ());
2593 0 : }
2594 :
2595 : void
2596 0 : VisBufferImpl2::fillFeedPaAux (Vector <Float> & feedPa,
2597 : const Vector <Int> & antenna,
2598 : const Vector <Int> & feed) const
2599 : {
2600 0 : for (uInt row = 0; row < feedPa.nelements(); ++row) {
2601 :
2602 0 : const Vector<Float>& antennaPointingAngle = this->feedPa (time ()(row));
2603 :
2604 0 : Assert(antenna (row) >= 0 && antenna (row) < (int) antennaPointingAngle.nelements());
2605 :
2606 0 : feedPa (row) = antennaPointingAngle (antenna (row));
2607 :
2608 0 : if (feed (row) != 0){ // Skip when feed(row) is zero
2609 :
2610 : // feedPa returns only the first feed position angle so
2611 : // we need to add an offset if this row correspods to a
2612 : // different feed
2613 :
2614 0 : float feedsAngle = getViiP()->receptorAngles()(0, antenna (row), feed (row));
2615 0 : float feed0Angle = getViiP()->receptorAngles()(0, antenna (row), 0);
2616 :
2617 0 : feedPa (row) += feedsAngle - feed0Angle;
2618 : }
2619 : }
2620 0 : }
2621 :
2622 : void
2623 344775 : VisBufferImpl2::fillFieldId (Vector<Int>& value) const
2624 : {
2625 344775 : CheckVisIter ();
2626 :
2627 344775 : getViiP()->fieldIds (value);
2628 344775 : }
2629 :
2630 : void
2631 0 : VisBufferImpl2::fillFlag (Matrix<Bool>& value) const
2632 : {
2633 0 : CheckVisIter ();
2634 :
2635 0 : getViiP()->flag (value);
2636 0 : }
2637 :
2638 : void
2639 0 : VisBufferImpl2::fillFlagCategory (Array<Bool>& value) const
2640 : {
2641 0 : CheckVisIter();
2642 :
2643 0 : getViiP()->flagCategory (value);
2644 0 : }
2645 :
2646 : void
2647 346105 : VisBufferImpl2::fillFlagCube (Cube<Bool>& value) const
2648 : {
2649 346105 : CheckVisIter ();
2650 :
2651 346105 : getViiP()->flag (value);
2652 346105 : }
2653 :
2654 : void
2655 0 : VisBufferImpl2::fillFlagCubes (Vector<Cube<Bool>>& value) const
2656 : {
2657 0 : CheckVisIter ();
2658 :
2659 0 : getViiP()->flag (value);
2660 0 : }
2661 :
2662 : void
2663 343972 : VisBufferImpl2::fillFlagRow (Vector<Bool>& value) const
2664 : {
2665 343972 : CheckVisIter ();
2666 :
2667 343972 : getViiP()->flagRow (value);
2668 343972 : }
2669 :
2670 : void
2671 0 : VisBufferImpl2::fillFloatData (Cube<Float>& value) const
2672 : {
2673 0 : CheckVisIter ();
2674 :
2675 0 : getViiP()->floatData (value);
2676 0 : }
2677 :
2678 : void
2679 0 : VisBufferImpl2::fillFloatCubes (Vector<Cube<Float>>& value) const
2680 : {
2681 0 : CheckVisIter ();
2682 :
2683 0 : getViiP()->floatData (value);
2684 0 : }
2685 :
2686 : void
2687 600 : VisBufferImpl2::fillImagingWeight (Matrix<Float> & value) const
2688 : {
2689 600 : const VisImagingWeight & weightGenerator = getViiP()->getImagingWeightGenerator ();
2690 :
2691 600 : ThrowIf (weightGenerator.getType () == "none",
2692 : "Bug check: Imaging weight generator not set");
2693 :
2694 : //#warning "Rework logic so that called code is not expecting a flag matrix."
2695 :
2696 600 : value.resize (IPosition (2, nChannels(), nRows()));
2697 :
2698 600 : Matrix<Bool> flagMat;
2699 600 : flagMat.assign(flagCube().yzPlane(0));
2700 : std::logical_and<Bool> andOp;
2701 :
2702 : /*
2703 : Vector<Float> wts (nRows (), 0);
2704 : wts = weight().row(0);
2705 : wts += weight().row(nCorrelations() - 1);
2706 : wts *= 0.5f;
2707 : */
2708 :
2709 : // Extract weights correctly
2710 600 : Matrix<Float> wtm; // [nchan,nrow]
2711 600 : Cube<Float> wtc; // [ncorr,nchan,nrow]
2712 600 : if (getViiP()->weightSpectrumExists())
2713 0 : wtc.reference(weightSpectrum());
2714 : else
2715 600 : wtc.reference(weight().reform(IPosition(3,nCorrelations(),1,nRows())));
2716 :
2717 : // Collapse on correlation axis
2718 600 : weightGenerator.unPolChanWeight(wtm,wtc);
2719 :
2720 :
2721 2400 : for (Int i = 1; i < nCorrelations(); ++ i){
2722 :
2723 1800 : Matrix<Bool> flagPlane = flagCube().yzPlane(i);
2724 1800 : arrayTransform<Bool,Bool,Bool,std::logical_and<Bool> > (flagMat, flagPlane, flagMat, andOp);
2725 1800 : }
2726 :
2727 600 : if (weightGenerator.getType () == "uniform") {
2728 :
2729 0 : weightGenerator.weightUniform (value, flagMat, uvw (), getFrequencies (0), wtm, msId (), fieldId ()(0));
2730 :
2731 600 : } else if (weightGenerator.getType () == "radial") {
2732 :
2733 0 : weightGenerator.weightRadial (value, flagMat, uvw (), getFrequencies (0), wtm);
2734 :
2735 : } else {
2736 :
2737 600 : weightGenerator.weightNatural (value, flagMat, wtm);
2738 : }
2739 :
2740 600 : if (weightGenerator.doFilter ()) {
2741 :
2742 0 : weightGenerator.filter (value, flagMat, uvw (), getFrequencies (0), wtm);
2743 : }
2744 600 : }
2745 :
2746 : void
2747 0 : VisBufferImpl2::fillJonesC (Vector<SquareMatrix<Complex, 2> >& value) const
2748 : {
2749 0 : CheckVisIter ();
2750 :
2751 0 : getViiP()->jonesC (value);
2752 0 : }
2753 :
2754 : void
2755 1404 : VisBufferImpl2::fillNAntennas (Int & value) const
2756 : {
2757 1404 : CheckVisIter ();
2758 :
2759 1404 : value = getViiP()->nAntennas();
2760 1404 : }
2761 :
2762 : void
2763 0 : VisBufferImpl2::fillNChannel (Int &) const
2764 : {
2765 0 : CheckVisIter ();
2766 :
2767 : // This value enters the VB from a route that doesn't involve
2768 : // filling; however the framework requires that this method exist
2769 : // so it's implemented as a no-op.
2770 0 : }
2771 :
2772 : void
2773 0 : VisBufferImpl2::fillNCorr (Int &) const
2774 : {
2775 0 : CheckVisIter ();
2776 :
2777 : // This value enters the VB from a route that doesn't involve
2778 : // filling; however the framework requires that this method exist
2779 : // so it's implemented as a no-op.
2780 0 : }
2781 :
2782 : void
2783 0 : VisBufferImpl2::fillNRow (Int&) const
2784 : {
2785 0 : CheckVisIter ();
2786 :
2787 : // This value enters the VB from a route that doesn't involve
2788 : // filling; however the framework requires that this method exist
2789 : // so it's implemented as a no-op.
2790 0 : }
2791 :
2792 : void
2793 0 : VisBufferImpl2::fillNShapes (Int&) const
2794 : {
2795 0 : CheckVisIter ();
2796 :
2797 : // This value enters the VB from a route that doesn't involve
2798 : // filling; however the framework requires that this method exist
2799 : // so it's implemented as a no-op.
2800 0 : }
2801 :
2802 : void
2803 0 : VisBufferImpl2::fillNRowPerShape (Vector<rownr_t> &) const
2804 : {
2805 0 : CheckVisIter ();
2806 :
2807 : // This value enters the VB from a route that doesn't involve
2808 : // filling; however the framework requires that this method exist
2809 : // so it's implemented as a no-op.
2810 0 : }
2811 :
2812 : void
2813 0 : VisBufferImpl2::fillNChannelPerShape (Vector<Int> &) const
2814 : {
2815 0 : CheckVisIter ();
2816 :
2817 : // This value enters the VB from a route that doesn't involve
2818 : // filling; however the framework requires that this method exist
2819 : // so it's implemented as a no-op.
2820 0 : }
2821 :
2822 : void
2823 0 : VisBufferImpl2::fillNCorrPerShape (Vector<Int> &) const
2824 : {
2825 0 : CheckVisIter ();
2826 :
2827 : // This value enters the VB from a route that doesn't involve
2828 : // filling; however the framework requires that this method exist
2829 : // so it's implemented as a no-op.
2830 0 : }
2831 :
2832 : void
2833 343098 : VisBufferImpl2::fillObservationId (Vector<Int>& value) const
2834 : {
2835 343098 : CheckVisIter();
2836 :
2837 343098 : getViiP()->observationId (value);
2838 343098 : }
2839 :
2840 : void
2841 1149 : VisBufferImpl2::fillPhaseCenter (MDirection& value) const
2842 : {
2843 1149 : CheckVisIter ();
2844 :
2845 1149 : value = getViiP()->phaseCenter ();
2846 1149 : }
2847 :
2848 : void
2849 682 : VisBufferImpl2::fillPolFrame (Int& value) const
2850 : {
2851 682 : CheckVisIter ();
2852 :
2853 682 : value = getViiP()->polFrame ();
2854 682 : }
2855 :
2856 : void
2857 4649 : VisBufferImpl2::fillPolarizationId (Int& value) const
2858 : {
2859 4649 : CheckVisIter ();
2860 :
2861 4649 : value = getViiP()->polarizationId ();
2862 4649 : }
2863 :
2864 : void
2865 1186 : VisBufferImpl2::fillProcessorId (Vector<Int>& value) const
2866 : {
2867 1186 : CheckVisIter();
2868 :
2869 1186 : getViiP()->processorId (value);
2870 1186 : }
2871 :
2872 : void
2873 0 : VisBufferImpl2::fillRowIds (Vector<rownr_t>& value) const
2874 : {
2875 0 : CheckVisIter ();
2876 :
2877 0 : getViiP()->getRowIds(value);
2878 0 : }
2879 :
2880 :
2881 : void
2882 349498 : VisBufferImpl2::fillScan (Vector<Int>& value) const
2883 : {
2884 349498 : CheckVisIter ();
2885 :
2886 349498 : getViiP()->scan (value);
2887 349498 : }
2888 :
2889 : void
2890 1873 : VisBufferImpl2::fillSigma (Matrix<Float>& value) const
2891 : {
2892 1873 : CheckVisIter ();
2893 1873 : getViiP()->sigma (value);
2894 1873 : }
2895 :
2896 : void
2897 0 : VisBufferImpl2::fillSigmas (Vector<Matrix<Float>>& value) const
2898 : {
2899 0 : CheckVisIter ();
2900 :
2901 0 : getViiP()->sigma (value);
2902 0 : }
2903 :
2904 : //void
2905 : //VisBufferImpl2::fillSigmaMat (Matrix<Float>& value) const
2906 : //{
2907 : // CheckVisIter ();
2908 : //
2909 : // getViiP()->sigmaMat (value);
2910 : //}
2911 :
2912 : void
2913 345381 : VisBufferImpl2::fillSpectralWindows (Vector<Int>& value) const
2914 : {
2915 345381 : CheckVisIter ();
2916 :
2917 345381 : getViiP()->spectralWindows (value);
2918 345381 : }
2919 :
2920 : void
2921 1164 : VisBufferImpl2::fillStateId (Vector<Int>& value) const
2922 : {
2923 1164 : CheckVisIter();
2924 :
2925 1164 : getViiP()->stateId (value);
2926 1164 : }
2927 :
2928 :
2929 : void
2930 21907 : VisBufferImpl2::fillTime (Vector<Double>& value) const
2931 : {
2932 21907 : CheckVisIter ();
2933 :
2934 21907 : getViiP()->time (value);
2935 21907 : }
2936 :
2937 : void
2938 2201 : VisBufferImpl2::fillTimeCentroid (Vector<Double>& value) const
2939 : {
2940 2201 : CheckVisIter ();
2941 :
2942 2201 : getViiP()->timeCentroid (value);
2943 2201 : }
2944 :
2945 : void
2946 1731 : VisBufferImpl2::fillTimeInterval (Vector<Double>& value) const
2947 : {
2948 1731 : CheckVisIter ();
2949 :
2950 1731 : getViiP()->timeInterval (value);
2951 1731 : }
2952 :
2953 : void
2954 6305 : VisBufferImpl2::fillUvw (Matrix<Double>& value) const
2955 : {
2956 6305 : CheckVisIter ();
2957 :
2958 6305 : getViiP()->uvw (value);
2959 6305 : }
2960 :
2961 : //void
2962 : //VisBufferImpl2::fillVisibilityCorrected (Matrix<CStokesVector>& value) const
2963 : //{
2964 : // CheckVisIter ();
2965 : //
2966 : // getViiP()->visibilityCorrected (value);
2967 : //}
2968 :
2969 : //void
2970 : //VisBufferImpl2::fillVisibilityModel (Matrix<CStokesVector>& value) const
2971 : //{
2972 : // CheckVisIter ();
2973 : //
2974 : // getViiP()->visibilityModel (value);
2975 : //}
2976 :
2977 : //void
2978 : //VisBufferImpl2::fillVisibilityObserved (Matrix<CStokesVector>& value) const
2979 : //{
2980 : // CheckVisIter ();
2981 : //
2982 : // getViiP()->visibilityObserved (value);
2983 : //}
2984 :
2985 :
2986 : void
2987 2343 : VisBufferImpl2::fillWeight (Matrix<Float>& value) const
2988 : {
2989 2343 : CheckVisIter ();
2990 :
2991 2343 : getViiP()->weight (value);
2992 2343 : }
2993 :
2994 : void
2995 0 : VisBufferImpl2::fillWeights (Vector<Matrix<Float>>& value) const
2996 : {
2997 0 : CheckVisIter ();
2998 :
2999 0 : getViiP()->weight (value);
3000 0 : }
3001 :
3002 : void
3003 1163 : VisBufferImpl2::fillWeightSpectrum (Cube<Float>& value) const
3004 : {
3005 1163 : CheckVisIter ();
3006 :
3007 1163 : if (getViiP()->weightSpectrumExists()){
3008 :
3009 25 : getViiP()->weightSpectrum (value);
3010 : }
3011 : else{
3012 :
3013 : // Weight spectrum doesn't exist so create on using the weight column.
3014 :
3015 1138 : Matrix<Float> theWeights;
3016 1138 : theWeights = weight(); // need a mutable copy so ensure no sharing.
3017 :
3018 : // The weight is the sum of the weight across all channels
3019 : // so divide it evenly between the channels.
3020 :
3021 : // jagonzal (new WEIGHT/SIGMA convention in CASA 4.2.2)
3022 : // theWeights = theWeights / nChannels();
3023 :
3024 1138 : value.resize (IPosition (3, nCorrelations (), nChannels (), nRows()));
3025 :
3026 : // Copy the apportioned weight value into the weight spectrum
3027 :
3028 : // jagonzal (TODO): Review this filling code (it should be row/channel/correlation)
3029 : // Or even better direct array assignment
3030 14078 : for (rownr_t row = 0; row < nRows(); row ++){
3031 :
3032 64664 : for (Int correlation = 0; correlation < nCorrelations (); correlation ++){
3033 :
3034 51724 : Int nChan = nChannels();
3035 51724 : float theWeight = theWeights (correlation, row);
3036 :
3037 3361664 : for (Int channel = 0; channel < nChan; channel ++){
3038 :
3039 3309940 : value (correlation, channel, row) = theWeight;
3040 : }
3041 :
3042 : }
3043 : }
3044 1138 : }
3045 1163 : }
3046 :
3047 : void
3048 0 : VisBufferImpl2::fillWeightSpectra (Vector<Cube<Float>>& value) const
3049 : {
3050 0 : CheckVisIter ();
3051 :
3052 0 : if (getViiP()->weightSpectrumExists()){
3053 :
3054 0 : getViiP()->weightSpectrum (value);
3055 : }
3056 : else{
3057 0 : value.resize(this->nShapes());
3058 :
3059 0 : auto nRowsPerShape = this->nRowsPerShape();
3060 0 : auto nCorrelationsPerShape = this->nCorrelationsPerShape();
3061 0 : auto nChannelsPerShape = this->nChannelsPerShape();
3062 :
3063 : // Weight spectrum doesn't exist so create on using the weight column.
3064 0 : auto theWeights = weights();
3065 :
3066 0 : for (rownr_t ishape = 0; ishape < nShapes(); ishape ++){
3067 :
3068 0 : auto nRows = nRowsPerShape[ishape];
3069 0 : auto nCorrelations = nCorrelationsPerShape[ishape];
3070 0 : auto nChannels = nChannelsPerShape[ishape];
3071 :
3072 0 : value[ishape].resize (IPosition (3, nCorrelations, nChannels, nRows));
3073 :
3074 0 : for (rownr_t row = 0; row < nRows; row ++){
3075 :
3076 0 : for (Int correlation = 0; correlation < nCorrelations; correlation ++){
3077 :
3078 0 : float theWeight = theWeights[ishape] (correlation, row);
3079 :
3080 0 : for (Int channel = 0; channel < nChannels; channel ++){
3081 :
3082 0 : value[ishape] (correlation, channel, row) = theWeight;
3083 : }
3084 :
3085 : }
3086 : }
3087 : }
3088 0 : }
3089 0 : }
3090 :
3091 : void
3092 1863 : VisBufferImpl2::fillSigmaSpectrum (Cube<Float>& value) const
3093 : {
3094 1863 : CheckVisIter ();
3095 :
3096 1863 : if (getViiP()->sigmaSpectrumExists()){
3097 :
3098 0 : getViiP()->sigmaSpectrum (value);
3099 : }
3100 : else{
3101 :
3102 1863 : auto nRows = this->nRows();
3103 1863 : auto nCorrelations = this->nCorrelations ();
3104 1863 : auto nChannels = this->nChannels();
3105 :
3106 : // Sigma spectrum doesn't exist so create on using the sigma column.
3107 :
3108 1863 : const Matrix<Float> & theSigmas = sigma();
3109 : /////theSigmas = sigma(); // need a mutable copy so ensure no sharing.
3110 :
3111 1863 : value.resize (IPosition (3, nCorrelations, nChannels, nRows));
3112 :
3113 : // Copy the apportioned weight value into the sigma spectrum
3114 :
3115 : // jagonzal (TODO): Review this filling code (it should be row/channel/correlation)
3116 : // Or even better direct array assignment
3117 :
3118 72561 : for (rownr_t row = 0; row < nRows; row ++){
3119 :
3120 262872 : for (Int correlation = 0; correlation < nCorrelations; correlation ++){
3121 :
3122 192174 : float theSigma = theSigmas (correlation, row);
3123 :
3124 10044720 : for (Int channel = 0; channel < nChannels; channel ++){
3125 :
3126 9852546 : value (correlation, channel, row) = theSigma;
3127 : }
3128 :
3129 : }
3130 : }
3131 : }
3132 1863 : }
3133 :
3134 : void
3135 0 : VisBufferImpl2::fillSigmaSpectra (Vector<Cube<Float>>& value) const
3136 : {
3137 0 : CheckVisIter ();
3138 :
3139 0 : if (getViiP()->sigmaSpectrumExists()){
3140 :
3141 0 : getViiP()->sigmaSpectrum (value);
3142 : }
3143 : else{
3144 0 : value.resize(this->nShapes());
3145 :
3146 0 : auto nRowsPerShape = this->nRowsPerShape();
3147 0 : auto nCorrelationsPerShape = this->nCorrelationsPerShape();
3148 0 : auto nChannelsPerShape = this->nChannelsPerShape();
3149 :
3150 : // Sigma spectrum doesn't exist so create on using the sigma column.
3151 0 : auto theSigmas = sigmas();
3152 :
3153 0 : for (rownr_t ishape = 0; ishape < nShapes(); ishape ++){
3154 :
3155 0 : auto nRows = nRowsPerShape[ishape];
3156 0 : auto nCorrelations = nCorrelationsPerShape[ishape];
3157 0 : auto nChannels = nChannelsPerShape[ishape];
3158 :
3159 0 : value[ishape].resize (IPosition (3, nCorrelations, nChannels, nRows));
3160 :
3161 0 : for (rownr_t row = 0; row < nRows; row ++){
3162 :
3163 0 : for (Int correlation = 0; correlation < nCorrelations; correlation ++){
3164 :
3165 0 : float theSigma = theSigmas[ishape] (correlation, row);
3166 :
3167 0 : for (Int channel = 0; channel < nChannels; channel ++){
3168 :
3169 0 : value[ishape] (correlation, channel, row) = theSigma;
3170 : }
3171 :
3172 : }
3173 : }
3174 : }
3175 0 : }
3176 0 : }
3177 :
3178 : Float
3179 0 : VisBufferImpl2::getWeightScaled (Int row) const
3180 : {
3181 0 : Float sum = 0;
3182 0 : Int n = nCorrelations();
3183 :
3184 0 : for (Int correlation = 0; correlation < n; ++ correlation){
3185 :
3186 0 : sum += getWeightScaled (correlation, row);
3187 : }
3188 :
3189 0 : return sum / n;
3190 : }
3191 :
3192 : Float
3193 0 : VisBufferImpl2::getWeightScaled (Int correlation, Int row) const
3194 : {
3195 0 : if (flagRow () (row)){
3196 0 : return 0;
3197 : }
3198 :
3199 0 : if (weightSpectrumPresent()){
3200 :
3201 0 : Float sum = 0;
3202 0 : Int n = nChannels ();
3203 :
3204 0 : for (Int channel = 0; channel < n; ++ channel){
3205 :
3206 0 : sum += getWeightScaled (correlation, channel, row);
3207 :
3208 : }
3209 :
3210 0 : return sum / n;
3211 : }
3212 : else {
3213 :
3214 0 : Float theWeight = weight () (correlation, row);
3215 :
3216 0 : if (! state_p->weightScaling_p.null()){
3217 0 : theWeight = (* state_p->weightScaling_p) (theWeight);
3218 : }
3219 :
3220 0 : return theWeight;
3221 : }
3222 : }
3223 :
3224 : Float
3225 0 : VisBufferImpl2::getWeightScaled (Int correlation, Int channel, Int row) const
3226 : {
3227 : // Get the weight from the weightSpectrum if it is present (either it was
3228 : // read from the MS or it was set by the user); otherwise get the weight
3229 : // from the weight column.
3230 :
3231 0 : Float theWeight = 0;
3232 :
3233 0 : if (weightSpectrumPresent ()){
3234 :
3235 0 : theWeight = weightSpectrum () (correlation, channel, row);
3236 : }
3237 : else{
3238 0 : theWeight = weight () (correlation, row);
3239 : }
3240 :
3241 : // If there is a scaling function, the apply that to the weight
3242 :
3243 0 : if (! state_p->weightScaling_p.null()){
3244 0 : theWeight = (* state_p->weightScaling_p) (theWeight);
3245 : }
3246 :
3247 0 : return theWeight;
3248 : }
3249 :
3250 : Float
3251 0 : VisBufferImpl2::getSigmaScaled (Int row) const
3252 : {
3253 0 : Float sum = 0;
3254 0 : Int n = nCorrelations();
3255 :
3256 0 : for (Int correlation = 0; correlation < n; ++ correlation){
3257 :
3258 0 : sum += getWeightScaled (correlation, row);
3259 : }
3260 :
3261 0 : return sum / n;
3262 : }
3263 :
3264 : Float
3265 0 : VisBufferImpl2::getSigmaScaled (Int correlation, Int row) const
3266 : {
3267 0 : if (flagRow () (row)){
3268 0 : return 0;
3269 : }
3270 :
3271 0 : if (weightSpectrumPresent()){
3272 :
3273 0 : Float sum = 0;
3274 0 : Int n = nChannels ();
3275 :
3276 0 : for (Int channel = 0; channel < n; ++ channel){
3277 :
3278 0 : sum += getWeightScaled (correlation, channel, row);
3279 :
3280 : }
3281 :
3282 0 : return sum / n;
3283 : }
3284 : else {
3285 :
3286 0 : Float theWeight = weight () (correlation, row);
3287 :
3288 0 : if (! state_p->weightScaling_p.null()){
3289 0 : theWeight = (* state_p->weightScaling_p) (theWeight);
3290 : }
3291 :
3292 0 : return theWeight;
3293 : }
3294 : }
3295 :
3296 : Float
3297 0 : VisBufferImpl2::getSigmaScaled (Int correlation, Int channel, Int row) const
3298 : {
3299 : // Get the weight from the weightSpectrum if it is present (either it was
3300 : // read from the MS or it was set by the user); otherwise get the weight
3301 : // from the weight column.
3302 :
3303 0 : Float theWeight = 0;
3304 :
3305 0 : if (weightSpectrumPresent ()){
3306 :
3307 0 : theWeight = weightSpectrum () (correlation, channel, row);
3308 : }
3309 : else{
3310 0 : theWeight = weight () (correlation, row);
3311 : }
3312 :
3313 : // If there is a scaling function, the apply that to the weight
3314 :
3315 0 : if (! state_p->weightScaling_p.null()){
3316 0 : theWeight = (* state_p->weightScaling_p) (theWeight);
3317 : }
3318 :
3319 0 : return theWeight;
3320 : }
3321 :
3322 : CountedPtr<WeightScaling>
3323 0 : VisBufferImpl2::getWeightScaling () const
3324 : {
3325 0 : return state_p->weightScaling_p;
3326 : }
3327 :
3328 : Bool
3329 0 : VisBufferImpl2::weightSpectrumPresent () const
3330 : {
3331 0 : Bool present = cache_p->weightSpectrum_p.isPresent() ||
3332 0 : (isAttached() && getViiP()->weightSpectrumExists());
3333 :
3334 0 : return present;
3335 : }
3336 :
3337 : Bool
3338 0 : VisBufferImpl2::sigmaSpectrumPresent () const
3339 : {
3340 0 : Bool present = cache_p->sigmaSpectrum_p.isPresent() ||
3341 0 : (isAttached() && getViiP()->sigmaSpectrumExists());
3342 :
3343 0 : return present;
3344 : }
3345 :
3346 :
3347 : } // end namespace vi
3348 :
3349 : using namespace casacore;
3350 : } // end namespace casa
|