Line data Source code
1 : // -*- C++ -*-
2 : //# VLAIlluminationConvFunc.cc: Implementation for VLAIlluminationConvFunc
3 : //# Copyright (C) 1996,1997,1998,1999,2000,2002
4 : //# Associated Universities, Inc. Washington DC, USA.
5 : //#
6 : //# This library is free software; you can redistribute it and/or modify it
7 : //# under the terms of the GNU Library General Public License as published by
8 : //# the Free Software Foundation; either version 2 of the License, or (at your
9 : //# option) any later version.
10 : //#
11 : //# This library is distributed in the hope that it will be useful, but WITHOUT
12 : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
14 : //# License for more details.
15 : //#
16 : //# You should have received a copy of the GNU Library General Public License
17 : //# along with this library; if not, write to the Free Software Foundation,
18 : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
19 : //#
20 : //# Correspondence concerning AIPS++ should be adressed as follows:
21 : //# Internet email: casa-feedback@nrao.edu.
22 : //# Postal address: AIPS++ Project Office
23 : //# National Radio Astronomy Observatory
24 : //# 520 Edgemont Road
25 : //# Charlottesville, VA 22903-2475 USA
26 : //#
27 : //#
28 : //# $Id$
29 :
30 : #define USETABLES 1
31 : #include <synthesis/TransformMachines2/VLACalcIlluminationConvFunc.h>
32 : #include <casacore/coordinates/Coordinates/DirectionCoordinate.h>
33 : #include <casacore/coordinates/Coordinates/SpectralCoordinate.h>
34 : #include <casacore/coordinates/Coordinates/LinearCoordinate.h>
35 : #include <casacore/coordinates/Coordinates/StokesCoordinate.h>
36 : #include <synthesis/TransformMachines2/Utils.h>
37 : #include <synthesis/TransformMachines/SynthesisError.h>
38 : #include <casacore/ms/MeasurementSets/MSColumns.h>
39 : #include <casacore/lattices/LEL/LatticeExpr.h>
40 : #include <casacore/lattices/LatticeMath/LatticeFFT.h>
41 : #include <casacore/images/Images/ImageRegrid.h>
42 : #include <casacore/images/Images/PagedImage.h>
43 : #include <casacore/casa/Arrays/ArrayMath.h>
44 : #include <casacore/casa/Utilities/Assert.h>
45 : #include <casacore/casa/OS/File.h>
46 : #include <fstream>
47 : #include <sstream>
48 : #include <casacore/casa/OS/Timer.h>
49 : #include <msvis/MSVis/VisibilityIterator2.h>
50 : using namespace casacore;
51 : namespace casa{
52 : namespace refim{
53 : //
54 : //------------------------------------------------------------------------
55 : //
56 148 : VLACalcIlluminationConvFunc::VLACalcIlluminationConvFunc():
57 148 : IlluminationConvFunc(),convFunc_p(),resolution(),pbRead_p(false),freq_p(0),lastPA(0),ap()
58 : {
59 :
60 296 : LogIO logIO(LogOrigin("VLACalcIlluminationConvFunc","ctor"));
61 148 : ap.oversamp = 3;
62 148 : ap.x0=-13.0; ap.y0=-13.0;
63 148 : ap.dx=0.5; ap.dy=0.5;
64 :
65 148 : ap.nx=ap.ny=104;
66 148 : ap.pa=lastPA=18000000;
67 148 : ap.freq=1.4;
68 148 : ap.band = BeamCalc_VLA_L;
69 : // IPosition shape(4,ap.nx,ap.ny,4,1);
70 148 : IPosition shape(4,ap.nx,ap.ny,1,1);//Set poln. axis to be
71 : //degenerate (len=1). This is
72 : //set to 2 if cross-hand
73 : //functions are requested.
74 148 : ap.aperture = new TempImage<Complex> ();
75 :
76 148 : if (maximumCacheSize() > 0) ap.aperture->setMaximumCacheSize(maximumCacheSize());
77 148 : ap.aperture->resize(shape);
78 :
79 148 : }
80 :
81 :
82 148 : CoordinateSystem VLACalcIlluminationConvFunc::makeUVCoords(const CoordinateSystem& imageCoordSys,
83 : const IPosition& shape,
84 : Double /*refFreq*/)
85 : {
86 148 : CoordinateSystem FTCoords = imageCoordSys;
87 148 : Int dirIndex=FTCoords.findCoordinate(Coordinate::LINEAR);
88 :
89 : // If LINEAR axis is found, assume that the coordsys is alread in FT domain
90 148 : if (dirIndex >= 0) return FTCoords;
91 :
92 64 : dirIndex=FTCoords.findCoordinate(Coordinate::DIRECTION);
93 : //cerr << "DIRIndex " << dirIndex << " shape " << shape << endl;
94 64 : DirectionCoordinate dc=imageCoordSys.directionCoordinate(dirIndex);
95 64 : Vector<Bool> axes(2); axes=true;
96 64 : Vector<Int> dirShape(2); dirShape(0)=shape(0);dirShape(1)=shape(1);
97 64 : Coordinate* FTdc=dc.makeFourierCoordinate(axes,dirShape);
98 : // if (refFreq > 0)
99 : // {
100 : // Int index1 = FTCoords.findCoordinate(Coordinate::SPECTRAL);
101 : // SpectralCoordinate SpC = FTCoords.spectralCoordinate(index1);
102 : // Vector<Double> refVal = SpC.referenceValue();
103 : // refVal = refFreq;
104 : // SpC.setReferenceValue(refVal);
105 : // }
106 :
107 64 : FTCoords.replaceCoordinate(*FTdc,dirIndex);
108 64 : delete FTdc;
109 :
110 64 : return FTCoords;
111 64 : }
112 :
113 : // CoordinateSystem VLACalcIlluminationConvFunc::makeJonesCoords(CoordinateSystem& imageCoordsys)
114 : //
115 : //
116 : //----------------------------------------------------------------------
117 : // Write PB to the pbImage
118 : //
119 0 : void VLACalcIlluminationConvFunc::applyPB(ImageInterface<Float>& /*pbImage*/,
120 : //const VisBuffer2& vb,
121 : Double& /*pa*/,
122 : const Vector<Float>& /*paList*/,
123 : Int /*bandID*/, Bool /*doSquint*/)
124 : {
125 0 : throw(AipsError("applyPB(paList) called!"));
126 : // CoordinateSystem skyCS(pbImage.coordinates());
127 : // IPosition skyShape(pbImage.shape());
128 : // TempImage<Complex> uvGrid;
129 : // if (maximumCacheSize() > 0) uvGrid.setMaximumCacheSize(maximumCacheSize());
130 : // // regridAperture(skyCS, skyShape, uvGrid, vb, paList, false, bandID);
131 : // regridAperture(skyCS, skyShape, uvGrid, pa, paList, doSquint, bandID);
132 :
133 : // fillPB(*(ap.aperture),pbImage);
134 : }
135 0 : void VLACalcIlluminationConvFunc::applyPB(ImageInterface<Float>& pbImage,
136 : //const VisBuffer2& vb,
137 : Double& pa,
138 : Int bandID,
139 : Bool doSquint, Double freqVal)
140 : {
141 0 : CoordinateSystem skyCS(pbImage.coordinates());
142 0 : IPosition skyShape(pbImage.shape());
143 :
144 0 : TempImage<Complex> uvGrid;
145 0 : if (maximumCacheSize() > 0) uvGrid.setMaximumCacheSize(maximumCacheSize());
146 : // regridAperture(skyCS, skyShape, uvGrid, vb,false, bandID);
147 0 : regridAperture(skyCS, skyShape, uvGrid, pa, doSquint, bandID, 0, freqVal);
148 0 : fillPB(*(ap.aperture),pbImage);
149 0 : }
150 148 : void VLACalcIlluminationConvFunc::applyPB(ImageInterface<Complex>& pbImage,
151 : //const VisBuffer2& vb,
152 : Double& pa,
153 : Bool doSquint, Int bandID,Int muellerTerm, Double freqVal)
154 : {
155 148 : CoordinateSystem skyCS(pbImage.coordinates());
156 148 : IPosition skyShape(pbImage.shape());
157 : // cout<<"M = "<<muellerTerm<<"\n";
158 : // cout<<"bandID = "<<bandID<<"\n";
159 : // cout<<"doSquint = "<<doSquint<<"\n";
160 148 : TempImage<Complex> uvGrid;
161 :
162 148 : if (maximumCacheSize() > 0) uvGrid.setMaximumCacheSize(maximumCacheSize());
163 : // regridAperture(skyCS, skyShape, uvGrid, vb, true, bandID);
164 148 : Int index= skyCS.findCoordinate(Coordinate::SPECTRAL);
165 148 : SpectralCoordinate spCS = skyCS.spectralCoordinate(index);
166 : // cout<<"Ref Freq for sky jones is :"<<spCS.referenceValue()(0);
167 : // index=skyCS.findCoordinate(Coordinate::DIRECTION);
168 : // AlwaysAssert(index>=0, AipsError);
169 :
170 148 : regridAperture(skyCS, skyShape, uvGrid, pa, doSquint, bandID, muellerTerm,freqVal);
171 :
172 148 : pbImage.setCoordinateInfo(skyCS);
173 : // {
174 : // string name("aperture.im");
175 : // storeImg(name,*(ap.aperture));
176 : // }
177 148 : fillPB(*(ap.aperture),pbImage);
178 : //{
179 : // string name("apb.im");
180 : // storeImg(name,pbImage);
181 : //}
182 148 : }
183 : //--------------------------------------------------------------------------
184 : // Write PB^2 to the pbImage
185 : //
186 0 : void VLACalcIlluminationConvFunc::applyPBSq(ImageInterface<Float>& /*pbImage*/,
187 : //const VisBuffer2& vb,
188 : Double& /*pa*/,
189 : const Vector<Float>& /*paList*/,
190 : Int /*bandID*/,
191 : Bool /*doSquint*/)
192 : {
193 0 : throw(AipsError("applyPBSq(paList) called!"));
194 : // CoordinateSystem skyCS(pbImage.coordinates());
195 : // IPosition skyShape(pbImage.shape());
196 : // TempImage<Complex> uvGrid;
197 : // if (maximumCacheSize() > 0) uvGrid.setMaximumCacheSize(maximumCacheSize());
198 : // // regridAperture(skyCS, skyShape, uvGrid, vb, paList, false, bandID);
199 : // regridAperture(skyCS, skyShape, uvGrid, pa, paList, doSquint, bandID);
200 :
201 : // fillPB(*(ap.aperture),pbImage, true);
202 : }
203 0 : void VLACalcIlluminationConvFunc::applyPBSq(ImageInterface<Float>& pbImage,
204 : //const VisBuffer2& vb,
205 : Double& pa,
206 : Int bandID,
207 : Bool doSquint)
208 : {
209 0 : CoordinateSystem skyCS(pbImage.coordinates());
210 0 : IPosition skyShape(pbImage.shape());
211 :
212 0 : TempImage<Complex> uvGrid;
213 0 : if (maximumCacheSize() > 0) uvGrid.setMaximumCacheSize(maximumCacheSize());
214 : // regridAperture(skyCS, skyShape, uvGrid, vb,false, bandID);
215 0 : regridAperture(skyCS, skyShape, uvGrid, pa, doSquint, bandID);
216 0 : fillPB(*(ap.aperture),pbImage,true);
217 0 : }
218 0 : void VLACalcIlluminationConvFunc::applyPBSq(ImageInterface<Complex>& pbImage,
219 : //const VisBuffer2& vb,
220 : Double& pa,
221 : Int bandID,
222 : Bool doSquint)
223 : {
224 0 : CoordinateSystem skyCS(pbImage.coordinates());
225 0 : IPosition skyShape(pbImage.shape());
226 :
227 0 : TempImage<Complex> uvGrid;
228 0 : if (maximumCacheSize() > 0) uvGrid.setMaximumCacheSize(maximumCacheSize());
229 : // regridAperture(skyCS, skyShape, uvGrid, vb, true, bandID);
230 0 : regridAperture(skyCS, skyShape, uvGrid, pa, doSquint, bandID);
231 0 : fillPB(*(ap.aperture),pbImage, true);
232 0 : }
233 : //
234 : //--------------------------------------------------------------------------
235 : //
236 148 : void VLACalcIlluminationConvFunc::setApertureParams(ApertureCalcParams& ap,
237 : const Float& Freq, const Float& pa,
238 : const Int& bandID,
239 : const IPosition& skyShape,
240 : const Vector<Double>& uvIncr)
241 : {
242 148 : Double Lambda = C::c/Freq;
243 :
244 148 : ap.pa=pa;
245 148 : ap.band = bandID;
246 148 : ap.freq = Freq/1E9;
247 148 : ap.nx = skyShape(0); ap.ny = skyShape(1);
248 148 : ap.dx = abs(uvIncr(0)*Lambda); ap.dy = abs(uvIncr(1)*Lambda);
249 148 : ap.x0 = -(ap.nx/2)*ap.dx; ap.y0 = -(ap.ny/2)*ap.dy;
250 : //cerr << "pa= " << ap.pa << " band " << ap.band << " freq " << ap.freq << " nx ny " << ap.nx << " " << ap.ny << " dx dy " << ap.dx << " " << ap.dy << endl;
251 : //
252 : // If cross-hand pols. are requested, we need to compute both
253 : // the parallel-hand aperture illuminations.
254 : //
255 : //if ((inStokes == Stokes::RL) || (inStokes == Stokes::LR))
256 : {
257 148 : IPosition apShape(ap.aperture->shape());
258 : //cerr << "APshape " << apShape << endl;
259 148 : apShape(3)=4;
260 148 : ap.aperture->resize(apShape);
261 148 : }
262 148 : }
263 : //
264 : //--------------------------------------------------------------------------
265 : //
266 148 : void VLACalcIlluminationConvFunc::regridApertureEngine(ApertureCalcParams& ap,
267 : const Int& /*inStokes*/)
268 : {
269 148 : IPosition apertureShape(ap.aperture->shape());
270 148 : apertureShape(0) = ap.nx; apertureShape(1) = ap.ny;
271 : //cerr << "new aperture shape " << apertureShape << " old " << (ap.aperture->shape())<< endl;
272 148 : ap.aperture->resize(apertureShape);
273 148 : ap.aperture->set(0.0);
274 : //BeamCalc::Instance()->calculateAperture(&ap,inStokes);
275 : //cerr << ap.aperture->shape() << " " << inStokes << endl;
276 :
277 : // If full-pol. imaging, compute all 4 pols., else only the one given by inStokes.
278 148 : BeamCalc::Instance()->calculateAperture(&ap);// The call in the absence of instokes allows the computation of all
279 : //cerr << "Min max of Aperture " << min(ap.aperture->get()) << " " << max(ap.aperture->get()) << endl;
280 : //BeamCalc::Instance()->calculateAperture(&ap,inStokes);// The call in the absence of instokes allows the computation of all
281 : // the four jones parameters at one time.
282 148 : }
283 : //
284 : //--------------------------------------------------------------------------
285 : //
286 148 : void VLACalcIlluminationConvFunc::regridAperture(CoordinateSystem& skyCS,
287 : IPosition& skyShape,
288 : TempImage<Complex>& /*uvGrid*/,
289 : //const VisBuffer2& vb,
290 : Double& pa,
291 : Bool doSquint, Int bandID,Int muellerTerm ,Double freqVal)
292 : {
293 296 : LogIO logIO(LogOrigin("VLACalcIlluminationConvFunc","regrid"));
294 148 : CoordinateSystem skyCoords(skyCS);
295 :
296 : Int index;
297 : //UNUSED: Double timeValue = getCurrentTimeStamp(vb);
298 148 : AlwaysAssert(bandID>=-1, AipsError);
299 148 : if (bandID != -1) ap.band = bandID;
300 : //Float pa = getPA(vb);
301 : Float Freq, freqHi;
302 :
303 148 : if (lastPA == pa)
304 : {
305 : // LogIO logIO;
306 : logIO << "Your CPU is being used to do computations for the same PA as for the previous call. Report this!"
307 0 : << LogIO::NORMAL1;
308 : }
309 :
310 :
311 148 : if (freqVal > 0)
312 : {
313 148 : Freq=freqHi=freqVal;
314 148 : ap.freq=freqHi/1E09;
315 : }
316 : else
317 : {
318 : //throw(AipsError("Freq. < 0 in VLACICF::regrid"));
319 :
320 : // Vector<Double> chanFreq = vb.frequency();
321 0 : index = skyCS.findCoordinate(Coordinate::SPECTRAL);
322 0 : SpectralCoordinate SpC = skyCS.spectralCoordinate(index);
323 0 : Vector<Double> refVal = SpC.referenceValue();
324 :
325 : // freqHi = max(chanFreq);
326 0 : freqHi = refVal[0];
327 : // freqLo = min(chanFreq);
328 0 : Freq = freqHi ;
329 0 : ap.freq = Freq/1E9;
330 0 : }
331 :
332 148 : IPosition imsize(skyShape);
333 148 : CoordinateSystem uvCoords = makeUVCoords(skyCoords,imsize,freqHi);
334 :
335 148 : index = uvCoords.findCoordinate(Coordinate::LINEAR);
336 148 : LinearCoordinate lc=uvCoords.linearCoordinate(index);
337 148 : Vector<Double> uvIncr = lc.increment();
338 : //Double Lambda = C::c/freqHi;
339 :
340 148 : index = uvCoords.findCoordinate(Coordinate::STOKES);
341 : //cerr << "STOKES index " << index << endl;
342 148 : Int inStokes = uvCoords.stokesCoordinate(index).stokes()(0);
343 :
344 : //Vector<Int> intSkyShape=skyShape.asVector();
345 148 : setApertureParams(ap, Freq, pa, bandID,
346 : skyShape, uvIncr);
347 148 : (ap.aperture)->setCoordinateInfo(uvCoords);
348 148 : regridApertureEngine(ap, inStokes);
349 148 : IPosition apertureShape(ap.aperture->shape());
350 :
351 : // ap.freq = Freq/1E9;
352 : // ap.nx = skyShape(0); ap.ny = skyShape(1);
353 : // ap.dx = abs(uvIncr(0)*Lambda); ap.dy = abs(uvIncr(1)*Lambda);
354 : // ap.x0 = -(ap.nx/2)*ap.dx;
355 : // ap.y0 = -(ap.ny/2)*ap.dy;
356 : // ap.pa=pa;
357 : // if ((inStokes == Stokes::RL) || (inStokes == Stokes::LR))
358 : // ap.aperture->shape()(3)=2;
359 :
360 : // apertureShape(0) = ap.nx; apertureShape(1) = ap.ny;
361 : // ap.aperture->resize(apertureShape);
362 : // ap.aperture->set(0.0);
363 :
364 : // BeamCalc::Instance()->calculateAperture(&ap,inStokes);
365 :
366 148 : if (!doSquint)
367 : {
368 0 : IPosition PolnRIndex(4,0,0,0,0), PolnLIndex(4,0,0,3,0);
369 0 : IPosition tndx(4,0,0,0,0);
370 0 : for(tndx(3)=0;tndx(3)<apertureShape(3);tndx(3)++) // The freq. axis
371 0 : for(tndx(2)=0;tndx(2)<apertureShape(2);tndx(2)++) // The Poln. axis
372 0 : for(tndx(1)=0;tndx(1)<apertureShape(1);tndx(1)++) // The spatial
373 0 : for(tndx(0)=0;tndx(0)<apertureShape(0);tndx(0)++) // axis.
374 : {
375 0 : PolnRIndex(0)=PolnLIndex(0)=tndx(0);
376 0 : PolnRIndex(1)=PolnLIndex(1)=tndx(1);
377 0 : Complex val, Rval;
378 : Float phase;
379 0 : val = ap.aperture->getAt(tndx);
380 0 : Rval = ap.aperture->getAt(PolnRIndex);
381 : //Lval = ap.aperture->getAt(PolnLIndex);
382 0 : phase = arg(Rval); Rval=Complex(cos(phase),sin(phase)); // Isn't this garbage ?
383 : //So when tndx(3)=0 and tndx(2)=0 polnRindex and tndx are the same ...thus then
384 : // first plane is Ae^(-i\Rval)*e^(iRval) which is just A of each pixel
385 : // when tndx(3) and (2) moves to 1 ...now Rval is 0
386 : //After the first plane phase is zeroed i.e done modular...then the next planes are being multiplied by conj (0)
387 : //phase = arg(Lval); Lval=Complex(cos(phase),sin(phase));
388 :
389 : // if (tndx(2)==0) ap.aperture->putAt(val*conj(Rval),tndx);
390 : // else if (tndx(2)==1) ap.aperture->putAt(val*conj(Lval),tndx);
391 : // else if (tndx(2)==2) ap.aperture->putAt(val*conj(Rval),tndx);
392 : // else if (tndx(2)==3) ap.aperture->putAt(val*conj(Lval),tndx);
393 0 : ap.aperture->putAt(val*conj(Rval),tndx);
394 : //cerr << "no squint " << val << " " << Rval << endl;
395 : }
396 0 : }
397 : // cout<<"Completed the regrid Aperture step";
398 : // Vector<Int> poln(4);
399 : // poln(0) = Stokes::RR;
400 : // poln(1) = Stokes::RL;
401 : // poln(2) = Stokes::LR;
402 : // poln(3) = Stokes::LL;
403 148 : Vector<Int> poln(1); poln(0)=inStokes;
404 148 : StokesCoordinate polnCoord(poln);
405 148 : SpectralCoordinate spectralCoord(MFrequency::TOPO,Freq,1.0,0.0);
406 : // uvCoords.addCoordinate(dirCoord);
407 148 : index = uvCoords.findCoordinate(Coordinate::STOKES);
408 148 : uvCoords.replaceCoordinate(polnCoord,index);
409 148 : index = uvCoords.findCoordinate(Coordinate::SPECTRAL);
410 148 : uvCoords.replaceCoordinate(spectralCoord,index);
411 : //logIO << "The Stokes coordinate is", poln(0)<< LogIO::POST;
412 148 : ap.aperture->setCoordinateInfo(uvCoords);
413 148 : if (doSquint==true)
414 : {
415 : // String name("aperture.im");
416 : // storeImg(name,*(ap.aperture));
417 : }
418 :
419 : //
420 : // Now FT the re-gridded Fourier plane to get the primary beam.
421 : //
422 148 : ftAperture(*(ap.aperture),muellerTerm);
423 148 : if (doSquint==true)
424 : {
425 : // String name("ftaperture.im");
426 : // storeImg(name,*(ap.aperture));
427 : }
428 :
429 148 : }
430 0 : void VLACalcIlluminationConvFunc::regridAperture(CoordinateSystem& skyCS,
431 : IPosition& skyShape,
432 : TempImage<Complex>& uvGrid,
433 : const VisBuffer2 &vb,
434 : const Vector<Float>& paList,
435 : Bool doSquint, Int bandID)
436 : {
437 0 : CoordinateSystem skyCoords(skyCS);
438 :
439 : Float pa, Freq;
440 0 : if (bandID != -1) ap.band = bandID;
441 0 : AlwaysAssert(ap.band>=-1, AipsError);
442 0 : Vector<Double> chanFreq = vb.getFrequencies(0);
443 :
444 : const MSSpWindowColumns& spwCol =
445 0 : vb.subtableColumns().spectralWindow();
446 0 : ArrayColumn<Double> chanfreq = spwCol.chanFreq();
447 0 : ScalarColumn<Double> reffreq = spwCol.refFrequency();
448 : // Freq = sum(chanFreq)/chanFreq.nelements();
449 :
450 0 : Freq = max(chanfreq.getColumn());
451 0 : IPosition imsize(skyShape);
452 0 : CoordinateSystem uvCoords = makeUVCoords(skyCoords,imsize,Freq);
453 0 : uvGrid.setCoordinateInfo(uvCoords);
454 :
455 0 : Int index = uvCoords.findCoordinate(Coordinate::LINEAR);
456 0 : LinearCoordinate lc=uvCoords.linearCoordinate(index);
457 0 : Vector<Double> incr = lc.increment();
458 0 : Double Lambda = C::c/Freq;
459 0 : ap.freq = Freq/1E9;
460 :
461 0 : ap.nx = skyShape(0); ap.ny = skyShape(1);
462 0 : IPosition apertureShape(ap.aperture->shape());
463 0 : apertureShape(0) = ap.nx; apertureShape(1) = ap.ny;
464 0 : ap.aperture->resize(apertureShape);
465 :
466 0 : TempImage<Complex> tmpAperture;tmpAperture.resize(apertureShape);
467 0 : if (maximumCacheSize() > 0) tmpAperture.setMaximumCacheSize(maximumCacheSize());
468 0 : tmpAperture.set(0.0);
469 0 : ap.dx = abs(incr(0)*Lambda); ap.dy = abs(incr(1)*Lambda);
470 : // cout << ap.dx << " " << incr(0) << endl;
471 : // ap.x0 = -(25.0/(2*ap.dx)+1)*ap.dx; ap.y0 = -(25.0/(2*ap.dy)+1)*ap.dy;
472 : // Following 3 lines go with the ANT tag in BeamCalc.cc
473 : // Double antRadius=BeamCalcGeometryDefaults[ap.band].Rant;
474 : // ap.x0 = -(antRadius/(ap.dx)+1)*ap.dx;
475 : // ap.y0 = -(antRadius/(ap.dy)+1)*ap.dy;
476 : // Following 2 lines go with the PIX tag in BeamCalc.cc
477 0 : ap.x0 = -(ap.nx/2)*ap.dx;
478 0 : ap.y0 = -(ap.ny/2)*ap.dy;
479 :
480 : //
481 : // Accumulate apertures for a list of PA
482 : //
483 0 : for(uInt ipa=0;ipa<paList.nelements();ipa++)
484 : {
485 0 : pa = paList[ipa];
486 :
487 0 : ap.pa=pa;
488 0 : ap.aperture->set(0.0);
489 0 : BeamCalc::Instance()->calculateAperture(&ap);
490 : //
491 : // Set the phase of the aperture function to zero if doSquint==F
492 : // Poln. axis indices
493 : // 0: RR, 1:RL, 2:LR, 3:LL
494 : // This is electic field. 0=> Poln R,
495 : // 1=> Leakage of R->L
496 : // 2=> Leakage of L->R
497 : // 3=> Poln L
498 : //
499 : // The squint is removed in the following code using
500 : // honest-to-god pixel indexing. If this is not the most
501 : // efficient method of doing this in AIPS++ (i.e. instead use
502 : // slices etc.), then this cost will show up in making the
503 : // average PB. Since this goes over each pixel of a full
504 : // stokes (poln. really) complex image, look here (also) for
505 : // optimization (if required).
506 : //
507 0 : if (!doSquint)
508 : {
509 0 : IPosition PolnRIndex(4,0,0,0,0), PolnLIndex(4,0,0,3,0);
510 0 : IPosition tndx(4,0,0,0,0);
511 0 : for(tndx(3)=0;tndx(3)<apertureShape(3);tndx(3)++) // The freq. axis
512 0 : for(tndx(2)=0;tndx(2)<apertureShape(2);tndx(2)++) // The Poln. axis
513 0 : for(tndx(1)=0;tndx(1)<apertureShape(1);tndx(1)++) // The spatial
514 0 : for(tndx(0)=0;tndx(0)<apertureShape(0);tndx(0)++) // axis.
515 : {
516 0 : PolnRIndex(0)=PolnLIndex(0)=tndx(0);
517 0 : PolnRIndex(1)=PolnLIndex(1)=tndx(1);
518 0 : Complex val, Rval, Lval;
519 : Float phase;
520 0 : val = ap.aperture->getAt(tndx);
521 0 : Rval = ap.aperture->getAt(PolnRIndex);
522 0 : Lval = ap.aperture->getAt(PolnLIndex);
523 0 : phase = arg(Rval); Rval=Complex(cos(phase),sin(phase));
524 0 : phase = arg(Lval); Lval=Complex(cos(phase),sin(phase));
525 :
526 0 : if (tndx(2)==0) ap.aperture->putAt(val*conj(Rval),tndx);
527 0 : else if (tndx(2)==1) ap.aperture->putAt(val*conj(Lval),tndx);
528 0 : else if (tndx(2)==2) ap.aperture->putAt(val*conj(Rval),tndx);
529 0 : else if (tndx(2)==3) ap.aperture->putAt(val*conj(Lval),tndx);
530 : }
531 0 : }
532 0 : tmpAperture += *(ap.aperture);
533 : }
534 0 : (ap.aperture)->copyData(tmpAperture);
535 0 : tmpAperture.resize(IPosition(1,1));//Release temp. store.
536 0 : Vector<Int> poln(4);
537 0 : poln(0) = Stokes::RR;
538 0 : poln(1) = Stokes::RL;
539 0 : poln(2) = Stokes::LR;
540 0 : poln(3) = Stokes::LL;
541 0 : StokesCoordinate polnCoord(poln);
542 0 : SpectralCoordinate spectralCoord(MFrequency::TOPO,Freq,1.0,0.0);
543 : // uvCoords.addCoordinate(dirCoord);
544 0 : index = uvCoords.findCoordinate(Coordinate::STOKES);
545 : //cerr << "STOKES index " << index << endl;
546 0 : uvCoords.replaceCoordinate(polnCoord,index);
547 0 : index = uvCoords.findCoordinate(Coordinate::SPECTRAL);
548 : //cerr << "Spectral index " << index << endl;
549 0 : uvCoords.replaceCoordinate(spectralCoord,index);
550 :
551 0 : ap.aperture->setCoordinateInfo(uvCoords);
552 : //if (doSquint==false)
553 : //{
554 : // String name("aperture.im");
555 : // storeImg(name,*(ap.aperture));
556 : //logIO << "The aperture has been written to aperture.im"<< LogIO::POST;
557 : //}
558 :
559 0 : ftAperture(*(ap.aperture));
560 : //String name("aperture.im");
561 : //storeImg(name,*(ap.aperture));
562 : //logIO << "The fourier transform of the aperture has been written to ftaperture.im"<< LogIO::POST;
563 0 : }
564 :
565 :
566 :
567 148 : void VLACalcIlluminationConvFunc::fillPB(ImageInterface<Complex>& inImg,
568 : ImageInterface<Complex>& outImg,
569 : Bool Square)
570 : {
571 148 : IPosition imsize(outImg.shape());
572 148 : IPosition ndx(outImg.shape());
573 148 : IPosition inShape(inImg.shape()),inNdx;
574 148 : Vector<Int> inStokes,outStokes;
575 : Int index,s,index1;
576 : //cerr << "Complex IMAGENAME " << outImg.name() << " " << max(inImg.get()) << " " << min(inImg.get()) << endl;
577 : // Timer tim;
578 : // tim.mark();
579 148 : index = inImg.coordinates().findCoordinate(Coordinate::STOKES);
580 148 : inStokes = inImg.coordinates().stokesCoordinate(index).stokes();
581 148 : index = outImg.coordinates().findCoordinate(Coordinate::STOKES);
582 148 : outStokes = outImg.coordinates().stokesCoordinate(index).stokes();
583 148 : index = outImg.coordinates().findCoordinate(Coordinate::SPECTRAL);
584 148 : index1 = inImg.coordinates().findCoordinate(Coordinate::SPECTRAL);
585 148 : SpectralCoordinate inSpectralCoords = inImg.coordinates().spectralCoordinate(index1);
586 148 : CoordinateSystem outCS = outImg.coordinates();
587 148 : outCS.replaceCoordinate(inSpectralCoords,index);
588 148 : outImg.setCoordinateInfo(outCS);
589 : //tim.show("fillPB::CSStuff:");
590 148 : ndx(3)=0;
591 : // #ifdef HAS_OMP
592 : // Int Nth=max(omp_get_max_threads()-2,1);
593 : // #endif
594 : //tim.mark();
595 296 : for(ndx(2)=0;ndx(2)<imsize(2);ndx(2)++) // The poln axes
596 : {
597 148 : for(s=0;s<inShape(2);s++) if (inStokes(s) == outStokes(ndx(2))) break;
598 :
599 174228 : for(ndx(0)=0;ndx(0)<imsize(0);ndx(0)++)
600 : //#pragma omp parallel default(none) firstprivate(s,iy) shared(twoPiW,convSize) num_threads(Nth)
601 : {
602 : //#pragma omp for
603 290629632 : for(ndx(1)=0;ndx(1)<imsize(1);ndx(1)++)
604 : {
605 290455552 : Complex cval;
606 290455552 : inNdx = ndx; inNdx(2)=s;
607 290455552 : cval = inImg.getAt(inNdx);
608 290455552 : if (Square) cval = cval*conj(cval);
609 : // cerr << "Complex " << ndx << " val " << cval << endl;
610 290455552 : outImg.putAt(cval*outImg.getAt(ndx),ndx);
611 : }
612 : }
613 : }
614 : //tim.show("fillPB: ");
615 148 : }
616 :
617 0 : void VLACalcIlluminationConvFunc::fillPB(ImageInterface<Complex>& inImg,
618 : ImageInterface<Float>& outImg,
619 : Bool Square)
620 : {
621 :
622 : //cerr << "REAL IMAGENAME " << outImg.name() << " " << max(inImg.get()) << " " << min(inImg.get()) << endl;
623 0 : IPosition imsize(outImg.shape());
624 0 : IPosition ndx(outImg.shape());
625 0 : IPosition inShape(inImg.shape()),inNdx;
626 :
627 0 : Vector<Int> inStokes,outStokes;
628 : Int index,s;
629 :
630 : // Timer tim;
631 : // tim.mark();
632 0 : index = inImg.coordinates().findCoordinate(Coordinate::STOKES);
633 0 : inStokes = inImg.coordinates().stokesCoordinate(index).stokes();
634 0 : index = outImg.coordinates().findCoordinate(Coordinate::STOKES);
635 0 : outStokes = outImg.coordinates().stokesCoordinate(index).stokes();
636 0 : ndx(3)=0;
637 : //tim.show("fillPB::CSStuff2:");
638 :
639 : //tim.mark();
640 0 : for(ndx(2)=0;ndx(2)<imsize(2);ndx(2)++) // The poln axes
641 : {
642 0 : if (outStokes(ndx(2)) == Stokes::I)
643 : {
644 : //
645 : // Fill the outImg wiht (inImg(RR)+inImage(LL))/2
646 : //
647 0 : for(ndx(0)=0;ndx(0)<imsize(0);ndx(0)++)
648 0 : for(ndx(1)=0;ndx(1)<imsize(1);ndx(1)++)
649 : {
650 0 : Complex cval;
651 0 : inNdx = ndx;
652 0 : inNdx(2)=0; cval = inImg.getAt(inNdx);
653 0 : inNdx(2)=3; cval += inImg.getAt(inNdx);
654 0 : cval/2;
655 :
656 0 : if (Square) cval = cval*conj(cval);
657 : //cerr << "I " << ndx << " val " << cval << endl;
658 0 : outImg.putAt(abs(cval*outImg.getAt(ndx)),ndx);
659 : }
660 : }
661 0 : else if ((outStokes(ndx(2)) == Stokes::RR) ||
662 0 : (outStokes(ndx(2)) == Stokes::RL) ||
663 0 : (outStokes(ndx(2)) == Stokes::LR) ||
664 0 : (outStokes(ndx(2)) == Stokes::LL))
665 : {
666 0 : for(s=0;s<inShape(2);s++) if (inStokes(s) == outStokes(ndx(2))) break;
667 :
668 0 : for(ndx(0)=0;ndx(0)<imsize(0);ndx(0)++)
669 0 : for(ndx(1)=0;ndx(1)<imsize(1);ndx(1)++)
670 : {
671 0 : Complex cval;
672 0 : inNdx = ndx; inNdx(2)=s;
673 0 : cval = inImg.getAt(inNdx);
674 0 : if (Square) cval = cval*conj(cval);
675 0 : cerr << "Corr "<< ndx << " val" << cval << endl;
676 0 : outImg.putAt(abs(cval*outImg.getAt(ndx)),ndx);
677 : }
678 : }
679 0 : else throw(AipsError("Unsupported Stokes found in VLACalcIlluminationConvFunc::fillPB."));
680 : }
681 : //tim.show("fillPB2:");
682 0 : }
683 :
684 : /*
685 : void VLACalcIlluminationConvFunc::fillPB(ImageInterface<Complex>& inImg,
686 : ImageInterface<Float>& outImg)
687 : {
688 : IPosition imsize(outImg.shape());
689 : IPosition ndx(outImg.shape());
690 : IPosition inShape(inImg.shape()), inNdx;
691 : Vector<Int> inStokes,outStokes;
692 : Int index;
693 : index = inImg.coordinates().findCoordinate(Coordinate::STOKES);
694 : inStokes = inImg.coordinates().stokesCoordinate(index).stokes();
695 : index = outImg.coordinates().findCoordinate(Coordinate::STOKES);
696 : outStokes = outImg.coordinates().stokesCoordinate(index).stokes();
697 :
698 : ndx(3)=0;
699 : for(ndx(0)=0;ndx(0)<imsize(0);ndx(0)++)
700 : {
701 :
702 : for(ndx(1)=0;ndx(1)<imsize(1);ndx(1)++)
703 : {
704 : //
705 : // Average along the polarization axes and fillin the
706 : // amp. of the average in the output image.
707 : //
708 : Complex cval=0.0;
709 :
710 : ndx(2)=0;cval = inImg.getAt(ndx);
711 : for(ndx(2)=0;ndx(2)<imsize(2);ndx(2)++) // The poln axes
712 : outImg.putAt(abs(cval*outImg.getAt(ndx)),ndx);
713 : }
714 : }
715 : }
716 :
717 : */
718 :
719 : // void VLACalcIlluminationConvFunc::ftAperture(TempImage<Complex>& uvgrid, Bool makeMueller)
720 148 : void VLACalcIlluminationConvFunc::ftAperture(ImageInterface<Complex>& uvgrid, Int muellerTerm)
721 : {
722 : //
723 : // Make SkyJones
724 : //
725 : // {
726 : //String name("uvgrid.im");
727 : //storeImg(name,uvgrid);
728 : // }
729 148 : LatticeFFT::cfft2d(uvgrid);
730 : //cerr <<"FTap mueller = " << muellerTerm << " " << max(uvgrid.get()) << " " << min(uvgrid.get()) << " shape " << uvgrid.shape() << endl;
731 : // {
732 : // Int index = uvgrid.coordinates().findCoordinate(Coordinate::STOKES);
733 : // Int inStokes = uvgrid.coordinates().stokesCoordinate(index).stokes()(0);
734 : // IPosition shape = uvgrid.shape();
735 : //ostringstream tt;
736 : //String name("ftuvgrid.im");
737 : //tt << name << "_"<< inStokes;
738 : //storeImg(String(tt),uvgrid);
739 : // }
740 : // {
741 : //String name("ftuvgrid.im");
742 : //storeImg(name,uvgrid);
743 : // }
744 :
745 : // Now make SkyMuller
746 : //
747 : //skyMuller(uvgrid);
748 148 : Int tempmueller=-1; // Set to -1 to use sanjay's code which pass the regressions.
749 148 : tempmueller=0; // Full-pol. imaging is requested, use PJ's code. Else use SB's.
750 :
751 : //if (uvgrid.shape()(3) > 2) tempmueller=0;
752 :
753 148 : if (tempmueller==0)
754 148 : skyMuller(uvgrid,muellerTerm);
755 : else
756 0 : skyMuller(uvgrid,-1);
757 : //cerr <<"FTap post skymuller " << max(uvgrid.get()) << " " << min(uvgrid.get()) << endl;
758 148 : }
759 :
760 0 : void VLACalcIlluminationConvFunc::loadFromImage(String& /*fileName*/)
761 : {
762 0 : throw(AipsError("VLACalcIlluminationConvFunc::loadFromImage() not yet supported."));
763 : };
764 :
765 0 : void VLACalcIlluminationConvFunc::skyMuller(Array<Complex>& buf,
766 : const IPosition& shape,
767 : const Int& inStokes)
768 : {
769 0 : Array<Complex> tmp;
770 0 : IPosition t(4,0,0,0,0),n0(4,0,0,0,0),n1(4,0,0,0,0);
771 : Float peak;
772 0 : peak=0;
773 0 : for(t(2)=0;t(2)<shape(2);t(2)++)
774 0 : for(t(1)=0;t(1)<shape(1);t(1)++)
775 0 : for(t(0)=0;t(0)<shape(0);t(0)++)
776 0 : if (abs(buf(t)) > peak) peak = abs(buf(t));
777 0 : if (peak > 1E-8)
778 0 : for(t(3)=0;t(3)<shape(3);t(3)++) // Freq axis
779 0 : for(t(2)=0;t(2)<shape(2);t(2)++) // Poln axis
780 0 : for(t(1)=0;t(1)<shape(1);t(1)++) // y axis
781 0 : for(t(0)=0;t(0)<shape(0);t(0)++) // X axis
782 0 : buf(t) = buf(t)/peak;
783 : // {
784 : // skyJones.put(buf);
785 : // String name("skyjones.im");
786 : // storeImg(name,skyJones);
787 : // }
788 :
789 0 : tmp.assign(buf);
790 :
791 0 : t(0)=t(1)=t(2)=t(3)=0;
792 :
793 0 : if ((inStokes == Stokes::RR) || (inStokes == Stokes::LL))
794 : {
795 0 : t(2)=0;n0(2)=0;n1(2)=0; //RR
796 0 : for( n0(0)=n1(0)=t(0)=0;n0(0)<shape(0);n0(0)++,n1(0)++,t(0)++)
797 0 : for(n0(1)=n1(1)=t(1)=0;n0(1)<shape(1);n0(1)++,n1(1)++,t(1)++)
798 0 : buf(t) = (tmp(n0)*conj(tmp(n1)));
799 : }
800 :
801 0 : if ((inStokes == Stokes::LR) || (inStokes == Stokes::RL))
802 : {
803 0 : t(2)=0;n0(3)=1;n1(2)=0; //LR
804 0 : for( n0(0)=n1(0)=t(0)=0;n0(0)<shape(0);n0(0)++,n1(0)++,t(0)++)
805 0 : for(n0(1)=n1(1)=t(1)=0;n0(1)<shape(1);n0(1)++,n1(1)++,t(1)++)
806 0 : buf(t) = (tmp(n0)*conj(tmp(n1)));
807 :
808 : }
809 :
810 : // if (inStokes == Stokes::RL)
811 : // {
812 : // t(2)=0;n0(2)=0;n1(3)=1; //LR
813 : // for( n0(0)=n1(0)=t(0)=0;n0(0)<shape(0);n0(0)++,n1(0)++,t(0)++)
814 : // for(n0(1)=n1(1)=t(1)=0;n0(1)<shape(1);n0(1)++,n1(1)++,t(1)++)
815 : // buf(t) = (tmp(n0)*conj(tmp(n1)));
816 :
817 : // }
818 : //{
819 : //skyJones.put(buf);
820 : // ostringstream tt;
821 : //String name("skyjones.im");
822 : //tt << name << "_" << inStokes;
823 : //storeImg(tt.string(),skyJones);
824 : //}
825 :
826 : //cout<<"Regular skyjones \n";
827 0 : }
828 :
829 : // void VLACalcIlluminationConvFunc::skyMuller(ImageInterface<Complex>& skyJones)
830 : // {
831 : // Int index = skyJones.coordinates().findCoordinate(Coordinate::STOKES);
832 : // Int inStokes = skyJones.coordinates().stokesCoordinate(index).stokes()(0);
833 : // Array<Complex> buf=skyJones.get();
834 : //Vector<Int> shape(buf.shape().asVector());
835 : // IPosition shape=skyJones.shape();
836 : // skyMuller(buf,shape, inStokes);
837 : // skyJones.put(buf);
838 : // }
839 :
840 148 : void VLACalcIlluminationConvFunc::skyMuller(ImageInterface<Complex>& skyJones, Int muellerTerm)
841 : {
842 148 : Int index = skyJones.coordinates().findCoordinate(Coordinate::STOKES);
843 : //cerr << "STOKES index in skymuller " << index << " shape " << skyJones.shape() << endl;
844 148 : Int inStokes = skyJones.coordinates().stokesCoordinate(index).stokes()(0);
845 : //PagedImage<Complex> lala(skyJones.shape(), skyJones.coordinates(), "BEFORESKYMULL.im");
846 : //lala.copyData(skyJones);
847 148 : Array<Complex> buf=skyJones.get(),tmp;
848 148 : IPosition shape=skyJones.shape();
849 148 : if(muellerTerm == -1)
850 : {
851 : //cout<<"####Temp - bypassing the full mueller convolution function generation \n";
852 0 : skyMuller(buf,shape,inStokes);
853 0 : skyJones.put(buf);
854 : }
855 : else
856 : {
857 : //cout<<"####Temp - Proceeding with IQUV convolution function generation\n";
858 148 : Array<Complex> M0,M1,M2,M3;
859 : //Vector<Int> shape(buf.shape().asVector());
860 : // IPosition shape=skyJones.shape();
861 : // cout<<"The shape of sky Jones matrix is "<<shape<<"\n";
862 148 : Array<Complex> Jp,Jq,Jpq,Jqp;
863 : // skyMuller(buf,shape, inStokes);
864 :
865 : // if (muellerTerm == 5)
866 : // {
867 : // skyJones.put(buf);
868 : // String name("skyjones5.im");
869 : // storeImg(name,skyJones);
870 : // }
871 : // Int index = skyJones.coordinates().findCoordinate(Coordinate::STOKES);
872 : // Int inStokes = skyJones.coordinates().stokesCoordinate(index).stokes()(0);
873 : // Array<Complex> buf=skyJones.get(),tmp;
874 :
875 148 : IPosition t(4,0,0,0,0),n0(4,0,0,0,0),n1(4,0,0,0,0);
876 :
877 148 : skyJones.put(buf); ////?????????????
878 : // ostringstream tt;
879 : // String name("skyjones.im");
880 : // tt << name << "_"<< inStokes;
881 : // storeImg(String(tt),skyJones);
882 : // skyJones.put(buf);
883 : // cout<<"Finished writing the initial sky jones \n";
884 : // exit(0);
885 : // skyMuller(buf,shape, inStokes);
886 :
887 148 : Float Normalizesq,pqscale=100.0;
888 : Int midx,midy;
889 148 : Normalizesq=0;
890 148 : midx = shape(0)/2; // This gives the central pixel(not the peak) of RR and LL.
891 148 : midy = shape(1)/2; // This normalization scheme was tested to be correct in the python code.
892 :
893 148 : tmp=buf;
894 296 : for(t(2)=0;t(2)<shape(2);t(2)++) // Start with poln axis as we want to loop in freq for the moment
895 740 : for(t(3)=0;t(3)<shape(3);t(3)++) // The freq axis each one of 4 chans contains a jones element
896 696912 : for(t(1)=0;t(1)<shape(1);t(1)++)
897 1162518528 : for(t(0)=0;t(0)<shape(0);t(0)++)
898 1161822208 : if((t(0)== midx)&&(t(1)==midy)) //?????Seriously quite a bogus looping..this is not a tape !
899 592 : Normalizesq = Normalizesq + abs(buf(t)*buf(t))/2.0; // This needs to be changed so that Normalizesq stays complex
900 :
901 :
902 296 : for(t(2)=0;t(2)<shape(2);t(2)++)
903 740 : for(t(3)=0;t(3)<shape(3);t(3)++)
904 696912 : for(t(1)=0;t(1)<shape(1);t(1)++)
905 1162518528 : for(t(0)=0;t(0)<shape(0);t(0)++)
906 1161822208 : if((t(3)==1)||(t(3)==2))
907 580911104 : tmp(t)=pqscale*conj(tmp(t)/sqrt(Normalizesq)); // This is the crosshand scale factor to be determined and hardcoded, currently is arbitrary.
908 :
909 : else
910 580911104 : tmp(t)=conj(tmp(t)/sqrt(Normalizesq));
911 :
912 : // cout<<"The Jones Matrix has been normalized using:"<< sqrt(Normalizesq)<<"\n";
913 148 : skyJones.put(tmp); //Why ??
914 : //cerr << "after weird normalization " << max(tmp) << " " << min(tmp) << endl;
915 : // ostringstream tt1;
916 : // String name1("skyjones_normalized_conj.im");
917 : // tt1 << name1 << "_"<< inStokes;
918 : // storeImg(String(tt1),skyJones);
919 : // // exit(0);
920 : // // skyJones.put(tmp);
921 : // cout<<"Finished writing the normalized conjugate sky jones \n";
922 :
923 : // cout<<"Begining the compute of Mueller Matrix term images \n";
924 :
925 148 : IPosition sliceStart0(4,0,0,0,0),sliceStart1(4,0,0,0,1),sliceLength0(4,shape(0),shape(1),1,1),sliceLength1(4,shape(0),shape(1),1,1);
926 148 : IPosition sliceStart2(4,0,0,0,2),sliceStart3(4,0,0,0,3),sliceLength2(4,shape(0),shape(1),1,1),sliceLength3(4,shape(0),shape(1),1,1);
927 148 : Slicer s0(sliceStart0,sliceLength0),s1(sliceStart1,sliceLength1);
928 148 : Slicer s2(sliceStart2,sliceLength2),s3(sliceStart3,sliceLength3);
929 :
930 : // For the sake of pixel math we are resizing the four initial jones buffers.
931 148 : IPosition shp=buf.shape();
932 : // shp = buf.shape();
933 : // shp(2)=shp(3);
934 : // shp(3)=1;
935 148 : shp(2)=shp(3)=1;
936 148 : Jp.resize(shp);
937 148 : Jpq.resize(shp);
938 148 : Jqp.resize(shp);
939 148 : Jq.resize(shp);
940 : // cout<<"The Jones buffer shape is :"<< shp <<"\n";
941 :
942 148 : Jp(s0)=tmp(s0);Jpq(s0)=tmp(s1);
943 148 : Jqp(s0)=tmp(s2);Jq(s0)=tmp(s3);
944 148 : M0=M1=M2=M3=tmp; //what an unnecessary mem copy
945 : // We will initialize the Mueller rows to zero as per need and then slice and return with only the first slice with written values
946 :
947 148 : M0(s0)=Jp*conj(Jp); M0(s1)=Jp*conj(Jpq); M0(s2)=Jpq*conj(Jp); M0(s3)=Jpq*conj(Jpq);
948 148 : M1(s0)=Jp*conj(Jqp); M1(s1)=Jp*conj(Jq); M1(s2)=Jpq*conj(Jqp); M1(s3)=Jpq*conj(Jq);
949 148 : M2(s0)=Jqp*conj(Jp); M2(s1)=Jqp*conj(Jpq); M2(s2)=Jq*conj(Jq); M2(s3)=Jq*conj(Jpq);
950 148 : M3(s0)=Jqp*conj(Jqp); M3(s1)=Jqp*conj(Jq); M3(s2)=Jq*conj(Jqp); M3(s3)=Jq*conj(Jq);
951 : // cout<<"Slicing Complete"<<"\n";
952 : // cout<<"Mueller row selection in place is :" << muellerTerm << "\n";
953 148 : if (muellerTerm <= 3)
954 : {
955 74 : M0=0; // ??????? all these multiplication up there is just to warm the CPU !
956 74 : if (muellerTerm==0) {
957 74 : M0(s0)=Jp*conj(Jp);
958 : }
959 0 : else if (muellerTerm==1){
960 0 : M0(s0)=Jp*conj(Jpq);
961 : }
962 0 : else if (muellerTerm==2){
963 0 : M0(s0)=Jpq*conj(Jp);
964 : }
965 : else {
966 0 : M0(s0)=Jpq*conj(Jpq);
967 : }
968 : //cerr << "after M0 " << max(M0) << " " << min(M0) << endl;
969 74 : skyJones.put(M0);
970 : //String name2("M0.im");
971 : //storeImg(name2,skyJones);
972 : // cout<<"Writing M0 to disk, muellerTerm : "<< muellerTerm <<"\n";
973 74 : M0.resize();
974 : }
975 74 : else if ((4<=muellerTerm)&&(muellerTerm<8))
976 : {
977 0 : M1=0;
978 0 : if (muellerTerm==4) {
979 0 : M1(s0)=Jp*conj(Jqp);
980 : }
981 0 : else if (muellerTerm==5){
982 0 : M1(s0)=Jp*conj(Jq);
983 : }
984 0 : else if (muellerTerm==6){
985 0 : M1(s0)=Jpq*conj(Jqp);
986 : }
987 : else {
988 0 : M1(s0)=Jpq*conj(Jq);
989 : }
990 0 : skyJones.put(M1);
991 : // String name3("M1.im");
992 : // storeImg(name3,skyJones);
993 : // cout<<"Writing M1 to disk, muellerTerm : "<< muellerTerm <<"\n";
994 0 : M1.resize();
995 : }
996 74 : else if ((8<=muellerTerm)&&(muellerTerm<12))
997 : {
998 0 : M2=0;
999 0 : if (muellerTerm==8) {
1000 0 : M2(s0)=Jqp*conj(Jp);
1001 : }
1002 0 : else if (muellerTerm==9){
1003 0 : M2(s0)=Jqp*conj(Jpq);
1004 : }
1005 0 : else if (muellerTerm==10){
1006 0 : M2(s0)=Jq*conj(Jp);
1007 : }
1008 : else {
1009 0 : M2(s0)=Jq*conj(Jpq);
1010 : }
1011 0 : skyJones.put(M2);
1012 : // String name4("M2.im");
1013 : // storeImg(name4,skyJones);
1014 : // cout<<"Writing M2 to disk, muellerTerm : "<< muellerTerm <<"\n";
1015 0 : M2.resize();
1016 : }
1017 74 : else if ((12<=muellerTerm)&&(muellerTerm<16))
1018 : {
1019 74 : M3=0;
1020 74 : if (muellerTerm==12) {
1021 0 : M3(s0)=Jqp*conj(Jqp);
1022 : }
1023 74 : else if (muellerTerm==13){
1024 0 : M3(s0)=Jqp*conj(Jq);
1025 : }
1026 74 : else if (muellerTerm==14){
1027 0 : M3(s0)=Jq*conj(Jqp);
1028 : }
1029 : else {
1030 74 : M3(s0)=Jq*conj(Jq);
1031 : }
1032 74 : skyJones.put(M3);
1033 : // String name5("M3.im");
1034 : // storeImg(name5,skyJones);
1035 : // cout<<"Writing M3 to disk, muellerTerm : "<< muellerTerm <<"\n";
1036 74 : M3.resize();
1037 : }
1038 : // cout<<"Mueller Matrix row computation complete \n";
1039 148 : }
1040 : // skyJones.put(buf);
1041 :
1042 148 : }
1043 :
1044 :
1045 :
1046 0 : void VLACalcIlluminationConvFunc::makeFullJones(ImageInterface<Complex>& /*pbImage*/,
1047 : const VisBuffer2& /*vb*/,
1048 : Bool /*doSquint*/,
1049 : Int /*bandID*/,
1050 : Double /*freqVal*/)
1051 0 : {}
1052 :
1053 : };
1054 : };
|