LCOV - code coverage report
Current view: top level - synthesis/TransformMachines - CFBuffer.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 268 0.0 %
Date: 2024-11-06 17:42:47 Functions: 0 28 0.0 %

          Line data    Source code
       1             : // -*- C++ -*-
       2             : //# CFBuffer.cc: Implementation of the CFBuffer class
       3             : //# Copyright (C) 1997,1998,1999,2000,2001,2002,2003
       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 addressed 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             : //# $Id$
      28             : #include <synthesis/TransformMachines/CFBuffer.h>
      29             : #include <synthesis/TransformMachines/Utils.h>
      30             : #include <casacore/casa/Utilities/BinarySearch.h>
      31             : #include <casacore/coordinates/Coordinates/SpectralCoordinate.h>
      32             : #include <casacore/casa/Utilities/Assert.h>
      33             : using namespace casacore;
      34             : 
      35             : namespace casa{
      36             : 
      37             :   // Instantiate a commonly used extern template
      38             : 
      39             :   //
      40             :   //---------------------------------------------------------------
      41             :   //
      42             :   //
      43           0 :   void CFBuffer::setParams(const CFBuffer& other)
      44             :   {
      45           0 :     wValues_p.assign(other.wValues_p);
      46           0 :     freqValues_p.assign(other.freqValues_p);
      47           0 :     muellerElements_p.assign(other.muellerElements_p);
      48           0 :     muellerElementsIndex_p.assign(other.muellerElementsIndex_p);
      49           0 :     conjMuellerElements_p.assign(other.conjMuellerElements_p);
      50           0 :     conjMuellerElementsIndex_p.assign(other.conjMuellerElementsIndex_p); 
      51           0 :     wValIncr_p = other.wValIncr_p; 
      52           0 :     freqValIncr_p = other.freqValIncr_p;
      53           0 :     muellerMask_p.assign(other.muellerMask_p);
      54           0 :     pointingOffset_p.assign(other.pointingOffset_p);
      55           0 :     freqNdxMapsReady_p = other.freqNdxMapsReady_p;
      56             : 
      57           0 :     freqNdxMap_p.assign(other.freqNdxMap_p);
      58           0 :     for(uInt i=0;i<freqNdxMap_p.nelements();i++) freqNdxMap_p[i].assign(other.freqNdxMap_p[i]);
      59           0 :     conjFreqNdxMap_p.assign(other.conjFreqNdxMap_p);
      60           0 :     for(uInt i=0;i<conjFreqNdxMap_p.nelements();i++) conjFreqNdxMap_p[i].assign(other.conjFreqNdxMap_p[i]);
      61           0 :     cfCacheDirName_p = other.cfCacheDirName_p;
      62           0 :   }
      63             :   //---------------------------------------------------------------
      64             :   //
      65             :   //
      66           0 :   CountedPtr<CFBuffer> CFBuffer::clone()
      67             :   {
      68           0 :     CountedPtr<CFBuffer> clone=new CFBuffer();
      69           0 :     clone->setParams(*this);
      70             : 
      71           0 :     IPosition shp(cfCells_p.shape());
      72           0 :     clone->resize(shp);
      73           0 :     clone->allocCells(cfCells_p);
      74             :     // clone->show("####CLONE: ",cerr);
      75           0 :     return clone;
      76           0 :   }
      77           0 :   void CFBuffer::allocCells(const Cube<CountedPtr<CFCell> >& cells)
      78             :   {
      79           0 :     IPosition shp(cells.shape());
      80           0 :     for (Int i=0;i < shp[0]; i++)
      81           0 :       for (Int j=0; j < shp[1]; j++)
      82           0 :         for (Int k=0; k < shp[2]; k++)
      83             :           {
      84           0 :             cfCells_p(i,j,k) = cells(i,j,k)->clone();
      85             :           }
      86           0 :   }
      87             :   //---------------------------------------------------------------
      88             :   //
      89             :   //  template<class T> Int CFBuffer<T>
      90           0 :   Int CFBuffer::noOfMuellerElements(const PolMapType& muellerElements)
      91             :   {
      92           0 :     Int n=0,nrows = muellerElements.nelements();
      93           0 :     for (Int i=0;i<nrows;i++)
      94           0 :       n+=muellerElements(i).nelements();
      95           0 :     return n;
      96             :     // Int n=0;
      97             :     // for(Int i=0;i<muellerElements.nelements();i++)
      98             :     //   for(Int j=0;j<muellerElements(i).nelements();j++)
      99             :     //  if (muellerElements(i)(j) > n) n=muellerElements(i)(j);
     100             :     // return n;
     101             :   }
     102             :   //
     103             :   //---------------------------------------------------------------
     104             :   //
     105           0 :   void CFBuffer::clear()
     106             :   {
     107           0 :     IPosition shp(cfCells_p.shape());
     108           0 :     for (Int i=0;i < shp[0]; i++)
     109           0 :       for (Int j=0; j < shp[1]; j++)
     110           0 :         for (Int k=0; k < shp[2]; k++)
     111             :           {
     112           0 :             cfCells_p(i,j,k)->clear();
     113             :           }
     114           0 :   }
     115             :   //
     116             :   //---------------------------------------------------------------
     117             :   //
     118             :   //  template<class T>  void CFBuffer<T>
     119           0 :   void CFBuffer::resize(const Double& wScale, const Double& freqIncr,
     120             :                         const Vector<Double>& wValues, 
     121             :                         const Vector<Double>& freqValues,
     122             :                         const PolMapType& muellerElements,
     123             :                         const PolMapType& muellerElementsIndex,
     124             :                         const PolMapType& conjMuellerElements,
     125             :                         const PolMapType& conjMuellerElementsIndex
     126             :                         )
     127             :   {
     128           0 :     wValues_p.assign(wValues);
     129           0 :     freqValues_p.assign(freqValues);
     130           0 :     wValIncr_p = wScale;
     131           0 :     freqValIncr_p = freqIncr;
     132             :     //    muellerMask_p.assign(muellerElements);
     133             : 
     134             :     //    nPol_p=noOfMuellerElements(muellerMask_p);
     135           0 :     nPol_p=noOfMuellerElements(muellerElementsIndex);
     136           0 :     nChan_p = freqValues_p.nelements();
     137           0 :     nW_p = wValues_p.nelements();
     138             : 
     139             :     //    muellerElements_p.resize(nPol_p);
     140           0 :     muellerElements_p.assign(muellerElements);
     141           0 :     muellerElementsIndex_p.assign(muellerElementsIndex);
     142           0 :     conjMuellerElements_p.assign(conjMuellerElements);
     143           0 :     conjMuellerElementsIndex_p.assign(conjMuellerElementsIndex);
     144             :     // Resize the various aux. information storage buffers.
     145             :     //
     146             :     // Resize the storage.  Retain the value of the existing pixels.
     147             :     // New pixels due to resize, if any, are assigned a new Array<T>
     148             :     // pointer.
     149           0 :     cfCells_p.resize(nChan_p, nW_p, nPol_p, true);
     150             : 
     151           0 :     for (uInt i=0;i<cfCells_p.shape()(0);i++)      // nChan_p
     152           0 :       for (uInt j=0;j<cfCells_p.shape()(1);j++)    // nW_p
     153             :         {
     154           0 :           Int k=0;                                 // nPol_p
     155           0 :           for(uInt prow=0;prow<muellerElements_p.nelements();prow++)
     156           0 :             for(uInt pcol=0;pcol<muellerElements_p(prow).nelements();pcol++)
     157             :               {
     158           0 :                 if (cfCells_p(i,j,k).null()) cfCells_p(i,j,k) = new CFCell;
     159           0 :                 if (cfCells_p(i,j,k)->storage_p.null()) cfCells_p(i,j,k)->storage_p=new Array<TT>;
     160           0 :                 cfCells_p(i,j,k)->freqValue_p = freqValues(i);
     161           0 :                 cfCells_p(i,j,k)->freqIncr_p = freqIncr;
     162           0 :                 cfCells_p(i,j,k)->wValue_p = wValues(j);
     163           0 :                 cfCells_p(i,j,k)->wIncr_p = wValIncr_p;
     164           0 :                 cfCells_p(i,j,k)->muellerElement_p = muellerElements_p(prow)(pcol);
     165           0 :                 cfCells_p(i,j,k)->xSupport_p = 0;
     166           0 :                 cfCells_p(i,j,k)->ySupport_p = 0;
     167           0 :                 k++;
     168             :               }
     169             :         }
     170           0 :   }
     171             :   //
     172             :   //---------------------------------------------------------------
     173             :   //
     174             :   //  template <class T>  void CFBuffer<T>
     175             :   // RigidVector<Int, 3> CFBuffer::setParams(const Int& inu, const Int& iw, const Int& muellerElement,
     176             :   //                                      const TableRecord& miscInfo)
     177             :   // {
     178             :   //   RigidVector<Int,3> ndx = setParams(inu, iw, 
     179             :   //                                   miscInfo.coordSys, miscInfo.sampling,
     180             :   //                                   miscInfo.xSupport,miscInfo.ySupport,
     181             :   //                                   miscInfo.freqValue, miscInfo.wValue,
     182             :   //                                   muellerElements, 
     183             :   //                                   miscInfo.fileName, miscInfo.conjfFreq,
     184             :   //                                   miscinfo.conjPoln);
     185             :   //   cfCells_p(ndx(0), ndx(1), ndx(2))->telescopeName = micsInfo.telescopeName;
     186             :   // }
     187             :   //
     188             :   //---------------------------------------------------------------
     189             :   //
     190             :   //  template <class T>  void CFBuffer<T>
     191           0 :   RigidVector<Int, 3> CFBuffer::setParams(const Int& inu, const Int& iw, const Int& ipx, const Int& ipy,
     192             :                                           const Double& freqValue, 
     193             :                                           const Double& wValue,
     194             :                                           const Int& muellerElement,
     195             :                                           CoordinateSystem& cs,
     196             :                                           const TableRecord& miscInfo)
     197             :   {
     198           0 :     float sampling; miscInfo.get("Sampling",sampling);
     199           0 :     int xSupport, ySupport; miscInfo.get("Xsupport",xSupport);miscInfo.get("Ysupport",ySupport);
     200           0 :     String fileName; miscInfo.get("Name",fileName);
     201           0 :     double conjFreq; miscInfo.get("ConjFreq", conjFreq);
     202           0 :     int conjPoln; miscInfo.get("ConjPoln", conjPoln);
     203           0 :     String telescopeName; miscInfo.get("TelescopeName", telescopeName);
     204           0 :     String bandName; miscInfo.get("BandName", bandName);
     205           0 :     float diameter; miscInfo.get("Diameter", diameter);
     206             :     // In the absense of evidence, assume that users are sensible and
     207             :     // are using AWProjection where it is really need it and not for
     208             :     // using it as a replacement for rotatially symmetric stuff.  So
     209             :     // by default, the CFs are assumed to be rotationally asymmetric.
     210           0 :     bool isRotationallySymmetric=True; 
     211             :     
     212           0 :     if (miscInfo.isDefined("OpCode"))
     213           0 :         miscInfo.get("OpCode",isRotationallySymmetric);
     214             : 
     215             :     RigidVector<Int,3> ndx=setParams(inu, iw, ipx, ipy, freqValue, bandName, wValue, muellerElement, cs,
     216             :                                      sampling, xSupport, ySupport, fileName, conjFreq, conjPoln, telescopeName,
     217           0 :                                      diameter);
     218           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->isRotationallySymmetric_p = isRotationallySymmetric;
     219           0 :     return ndx;
     220           0 :   }
     221           0 :   RigidVector<Int, 3> CFBuffer::setParams(const Int& inu, const Int& iw, const Int& /*ipx*/, const Int& /*ipy*/,
     222             :                                           const Double& freqValue,
     223             :                                           const String& bandName,
     224             :                                           const Double& wValue,
     225             :                                           const Int& muellerElement,
     226             :                                           CoordinateSystem& cs,
     227             :                                           Float& sampling,
     228             :                                           Int& xSupport, Int& ySupport, 
     229             :                                           const String& fileName,
     230             :                                           const Double& conjFreq,
     231             :                                           const Int& conjPoln,
     232             :                                           const String& telescopeName,
     233             :                                           const Float& diameter)
     234             :   {
     235           0 :     RigidVector<Int,3> ndx=getIndex(freqValue, wValue, muellerElement);
     236           0 :     ndx(0)=inu; ndx(1)=iw;//ndx(2) = muellerElements_p(ipx)(ipy);
     237           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->sampling_p = sampling;
     238           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->xSupport_p = xSupport;
     239           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->ySupport_p = ySupport;
     240           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->muellerElement_p = muellerElement;
     241           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->conjFreq_p = conjFreq;
     242           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->conjPoln_p = conjPoln;
     243           0 :     if (fileName != "")
     244           0 :       cfCells_p(ndx(0),ndx(1),ndx(2))->fileName_p = fileName;
     245           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->telescopeName_p = telescopeName;//String("EVLA");
     246           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->diameter_p = diameter;//25.0;
     247           0 :     if (bandName != "") cfCells_p(ndx(0),ndx(1),ndx(2))->bandName_p = bandName;
     248             : 
     249           0 :     Int index=cs.findCoordinate(Coordinate::SPECTRAL);
     250           0 :     SpectralCoordinate spCS = cs.spectralCoordinate(index);
     251           0 :     Vector<Double> val; val.resize(1);val(0)=freqValues_p(ndx(0));
     252           0 :     spCS.setReferenceValue(val);
     253             :     //val.resize();
     254             :     //val = spCS.increment();
     255             :     //val = cfCells_p(ndx(0),ndx(1),ndx(2))->freqIncr_p;
     256             :     //spCS.setIncrement(val);
     257           0 :     cs.replaceCoordinate(spCS,index);
     258             : 
     259             :     // cfCells_p(ndx(0),ndx(1),ndx(2))->freqValue_p = 
     260             :     //   cs.spectralCoordinate(cs.findCoordinate(Coordinate::SPECTRAL)).referenceValue()(0);
     261             :     // cfCells_p(ndx(0),ndx(1),ndx(2))->freqIncr_p  = 
     262             :     //   cs.spectralCoordinate(cs.findCoordinate(Coordinate::SPECTRAL)).increment()(0);
     263             : 
     264           0 :     cfCells_p(ndx(0),ndx(1),ndx(2))->coordSys_p  = cs;
     265           0 :     return ndx;
     266           0 :   }
     267             :   //
     268             :   //---------------------------------------------------------------
     269             :   //
     270           0 :   void CFBuffer::setPA(Float& pa)
     271             :   {
     272           0 :     RigidVector<Int,3> ndx(-1);
     273           0 :     Int nF=cfCells_p.shape()(0), nW=cfCells_p.shape()(1), nM=cfCells_p.shape()(2);
     274           0 :     for (Int i=0; i<nF; i++)
     275           0 :       for(Int j=0; j<nW; j++)
     276           0 :         for(Int k=0; k<nM; k++)
     277           0 :           cfCells_p(i,j,k)->pa_p=Quantity(pa,"deg");
     278           0 :   }
     279             : 
     280           0 :   void CFBuffer::setParams(Int& /*nx*/, Int& /*ny*/, CoordinateSystem& /*cs*/, Float& /*sampling*/, 
     281             :                            Int& /*xSupport*/, Int& /*ySupport*/, const Double& /*freqValue*/, 
     282             :                            const Double& /*wValue*/, const Int& /*muellerElement*/,
     283             :                            const String& /*fileName*/)
     284             :   {
     285             :     /*
     286             :     RigidVector<Int,3> ndx=setParams(cs, sampling, xSupport, ySupport,
     287             :                                      freqValue, wValue, muellerElement);
     288             :     // Adding degenerate axis here to make life easier when using these
     289             :     // buffers to write them as Images later (with a 4D co-ordinate
     290             :     // system - the degenerate axis become the Freq. and Polarization
     291             :     // axis).
     292             : 
     293             :     //    cfCells_p(ndx(0),ndx(1),ndx(2))->storage_p->resize(IPosition(4,nx,ny,1,1));
     294             :     cfCells_p(ndx(0),ndx(1),ndx(2))->shape_p=IPosition(4,nx,ny,1,1);
     295             :     */
     296           0 :   }
     297             :   //
     298             :   //---------------------------------------------------------------
     299             :   //
     300             :   //  template<class T>  Array<T>& CFBuffer<T>::
     301           0 :   CFCell& CFBuffer::getCFCell(const Int& i, const Int& j, const Int& k)
     302             :   {
     303           0 :     return *cfCells_p(i,j,k); // Nfreq x Nw x Nmueller
     304             :   }
     305             :   //
     306             :   //---------------------------------------------------------------
     307             :   //
     308             :   //  template <class T>  Array<T>& CFBuffer<T>
     309           0 :   CFCell& CFBuffer::getCFCell(const Double& freqVal, 
     310             :                              const Double& wValue, 
     311             :                              const Int& muellerElement) // muellerElement: (i,j) of the Mueller Matrix
     312             :   {
     313           0 :     RigidVector<Int,3> ndx=getIndex(freqVal, wValue, muellerElement);
     314           0 :     return getCFCell(ndx(0), ndx(1),ndx(2));
     315             :   }
     316             :   //
     317             :   //---------------------------------------------------------------
     318             :   //
     319             :   //  template<class T>  Array<T>& CFBuffer<T>::
     320           0 :   CountedPtr<CFCell>& CFBuffer::getCFCellPtr(const Int& i/*FreqNdx*/, const Int& j/*WNdx*/, const Int& k/*MuellerNdx*/)
     321             :   {
     322             :     // IPosition shp=cfCells_p.shape();
     323             :     // if (cfHitsStats.shape().product()==0)
     324             :     //   {
     325             :     //  cfHitsStats.resize(shp);
     326             :     //  cfHitsStats = 0;
     327             :     //   }
     328             :     // try
     329             :     //   {
     330             :     //  AlwaysAssert(((i<shp[0]) && (j<shp[1]) && (k<shp[2])) , AipsError);
     331             :     //   }
     332             :     // catch (AipsError x)
     333             :     //   {
     334             :     //  cerr << "#### " << i << " " << j << " " << k << " " << shp << endl;
     335             :     //  throw(x);
     336             :     //   }
     337             : 
     338             :     // cfHitsStats(i,j,k)++;
     339             :     // //    cerr << "CFBuffer: Cell: " << i << " " << j << " " << k << " " << cfCells_p(i,j,k)->xSupport_p << endl;
     340           0 :     return cfCells_p(i,j,k); // Nfreq x Nw x Nmueller
     341             :   }
     342             :   //
     343             :   //---------------------------------------------------------------
     344             :   //
     345             :   //  template <class T>  Array<T>& CFBuffer<T>
     346           0 :   CountedPtr<CFCell>& CFBuffer::getCFCellPtr(const Double& freqVal, 
     347             :                                              const Double& wValue, 
     348             :                                              const Int & muellerElement)
     349             :   {
     350           0 :     RigidVector<Int,3> ndx=getIndex(freqVal, wValue, muellerElement);
     351           0 :     return cfCells_p(ndx(0), ndx(1),ndx(2));
     352             :   }
     353             :   //
     354             :   //---------------------------------------------------------------
     355             :   //
     356             :   //  template<class T>  Vector<Int>& CFBuffer<T>
     357             :   // This should be made more efficient with binary search.
     358           0 :   RigidVector<Int,3> CFBuffer::getIndex(const Double& freqValue, 
     359             :                                         const Double& wValue, 
     360             :                                         const Int& muellerElement)
     361             :   {
     362           0 :     RigidVector<Int,3> ndx(-1);
     363           0 :     Int nF=cfCells_p.shape()(0), nW=cfCells_p.shape()(1), nM=cfCells_p.shape()(2);
     364             :     Int i,j,k;
     365             :     //UNUSED: Int di;
     366             : 
     367             :     // Double dfMin=0;di=0;
     368             :     // for (i=0;i<nF;i++)
     369             :     //   {
     370             :     //  Double df=fabs(cfCells_p(i,0,0)->freqValue_p - freqValue);
     371             :     //  if (df < dfMin) {dfMin=df; di=i;}
     372             :     //   }
     373             :     // i=di;
     374           0 :     for (i=0; i<nF; i++)
     375             :       //      if ((fabs(cfCells_p(i,0,0)->freqValue_p - freqValue) < cfCells_p(i,0,0)->freqIncr_p))
     376           0 :       if (cfCells_p(i,0,0)->freqValue_p == freqValue) break;
     377           0 :     for(j=0; j<nW; j++)   if (cfCells_p(i,j,0)->wValue_p == wValue) break;
     378           0 :     for (k=0; k<nM; k++)  if (cfCells_p(i,j,k)->muellerElement_p == muellerElement) break;
     379             : 
     380           0 :     ndx(0)=i;ndx(1)=j;ndx(2)=k;
     381             :     // for (Int i=0;i<nF;i++)
     382             :     //   for(Int j=0;j<nW;j++)
     383             :     //  for(Int k=0;k<nM;k++)
     384             :     //    {
     385             :     //      if (
     386             :     //          (fabs(cfCells_p(i,j,k)->freqValue_p - freqValue) < cfCells_p(i,j,k)->freqIncr_p) &&
     387             :     //          (cfCells_p(i,j,k)->wValue_p         == wValue) &&
     388             :     //          (cfCells_p(i,j,k)->muellerElement_p == muellerElement)
     389             :     //          )
     390             :     //        {ndx(0)=i;ndx(1)=j;ndx(2)=k;break;}
     391             :     //    }
     392             : 
     393             :     // cerr << "@#$%#@ " << freqValue 
     394             :     //   << " " << cfCells_p(ndx(0),ndx(1),ndx(2))->freqValue_p
     395             :     //   << " " << cfCells_p(ndx(0),ndx(1),ndx(2))->freqIncr_p 
     396             :     //   << " " << ndx
     397             :     //   << endl;
     398             :     // for(uInt i=0;i<nF;i++)
     399             :     //   if (freqValue==cfCells_pfreqValues_p(i)) {ndx(0)=i;break;}
     400             : 
     401             :     // for(uInt i=0;i<wValues_p.nelements();i++)
     402             :     //   if (wValue==wValues_p(i)) {ndx(1)=i;break;}
     403             : 
     404             :     // ndx(2)=muellerElements_p(muellerElement(0),muellerElement(1));
     405             : 
     406           0 :     return ndx;
     407             :   }
     408             :   //
     409             :   //---------------------------------------------------------------
     410             :   //
     411           0 :   void CFBuffer::getParams(CoordinateSystem& cs, Float& sampling, 
     412             :                            Int& xSupport, Int& ySupport, 
     413             :                            const Double& freqVal, const Double& wValue, 
     414             :                            const Int& muellerElement)
     415             :   {
     416           0 :     RigidVector<Int,3> ndx=getIndex(freqVal, wValue, muellerElement);
     417           0 :     getParams(cs, sampling, xSupport, ySupport, ndx(0), ndx(1), ndx(2));
     418           0 :   }
     419             :   //
     420             :   //---------------------------------------------------------------
     421             :   //
     422           0 :   Double CFBuffer::nearest(Bool& found, const Double& val,
     423             :                            const Vector<Double>& valList,
     424             :                            const Double& /*incr*/)
     425             :   {
     426           0 :     Int n=valList.nelements();
     427           0 :     if (n==1) {found=true;return valList[0];}
     428           0 :     Int where = binarySearch(found, valList, val, n);
     429           0 :     if (found) return valList(where);
     430           0 :     else return -1.0;
     431             :   }
     432             :   //
     433             :   //---------------------------------------------------------------
     434             :   //
     435           0 :   Int CFBuffer::nearestNdx(const Double& val,
     436             :                            const Vector<Double>& /*valList*/,
     437             :                            const Double& incr)
     438             :   {
     439           0 :     return SynthesisUtils::nint(incr*val);
     440             : 
     441             :     // Int n=valList.nelements();
     442             :     // if (n==1) return 0;
     443             :     // else return -1;
     444             : 
     445             :     // Int where = binarySearch(found, valList, val, n);
     446             :     // if (found) return valList(where);
     447             :     // else return -1.0;
     448             :   }
     449             :   //
     450             :   //---------------------------------------------------------------
     451             :   //
     452             :   //  template <class T>  void CFBuffer<T>
     453           0 :   void CFBuffer::show(const char *Mesg,ostream &os)
     454             :   {
     455           0 :     LogIO log_l(LogOrigin("CFBuffer","show[R&D]"));
     456             : 
     457           0 :     if (Mesg != NULL) os << Mesg << endl;
     458           0 :     os<< "---------------------------------------------------------" << endl
     459           0 :       << "Shapes: " << cfCells_p.shape() << endl;
     460           0 :     for (Int i=0;i<cfCells_p.shape()(0);i++)
     461           0 :       for (Int j=0;j<cfCells_p.shape()(1);j++)
     462           0 :         for (Int k=0;k<cfCells_p.shape()(2);k++)
     463             :           {
     464           0 :             os << "CFCell["<<i<<","<<j<<","<<k<<"]:" << endl;
     465           0 :             cfCells_p(i,j,k)->show(Mesg, os);
     466           0 :             os << "Pointing offset: " << pointingOffset_p << endl;
     467             :           }
     468           0 :     os << "---------------------------------------------------------" << endl;
     469           0 :   }
     470             : 
     471           0 :   void CFBuffer::makePersistent(const char *dir, const char *cfName)
     472             :   {
     473           0 :     for (Int i=0;i<cfCells_p.shape()(0);i++)
     474           0 :       for (Int j=0;j<cfCells_p.shape()(1);j++)
     475           0 :         for (Int k=0;k<cfCells_p.shape()(2);k++)
     476             :           {
     477           0 :             ostringstream name;
     478           0 :             name << String(cfName) << "_CF_" << i << "_" << j << "_" << k << ".im";
     479             :             //cerr << "CFB Name : " << name.str() << endl;
     480             :             // const char *formedName;
     481             :             // if (cfName != "" ) formedName = name.str().c_str();
     482             :             // else               formedName = cfName;
     483             :             // cerr << "Formed name = " << formedName << endl;
     484           0 :             cfCells_p(i,j,k)->makePersistent(dir, name.str().c_str());
     485           0 :           }
     486           0 :   }
     487             : 
     488           0 :   Int CFBuffer::nearestFreqNdx(const Double& freqVal) 
     489             :   {
     490             :     Int index;
     491           0 :     SynthesisUtils::nearestValue(freqValues_p, freqVal, index);
     492           0 :     return index;
     493             :     // // The algorithm below has a N*log(N) cost.
     494             :     // Vector<Double> diff = fabs(freqValues_p - freqVal);
     495             :     // Bool dummy;
     496             :     // Sort sorter(diff.getStorage(dummy), sizeof(Double));
     497             :     // sorter.sortKey((uInt)0,TpDouble);
     498             :     // Int nch=freqValues_p.nelements();
     499             :     // Vector<uInt> sortIndx;
     500             :     // sorter.sort(sortIndx, nch);
     501             :     
     502             :     // return sortIndx(0);
     503             : 
     504             :     // Int ndx=min(freqValues_p.nelements()-1,max(0,SynthesisUtils::nint((freqVal-freqValues_p[0])/freqValIncr_p)));
     505             :     // return ndx;
     506             :   }
     507             : 
     508             : 
     509           0 :   void CFBuffer::primeTheCache()
     510             :   {
     511             :     //
     512             :     // In each CFCell of this CFBuffer, cache things that might be
     513             :     // required in tight loops and can be expensive to extract
     514             :     // otherwise.
     515             :     //
     516           0 :     IPosition cfCShape=cfCells_p.shape();
     517           0 :     for (Int i=0; i < cfCShape(0); i++)
     518           0 :       for (Int j=0; j < cfCShape(1); j++)
     519           0 :         for (Int k=0; k < cfCShape(2); k++)
     520           0 :           getCFCellPtr(i,j,k)->initCache();
     521           0 :   }
     522             : 
     523           0 :   void CFBuffer::initMaps(const VisBuffer&, // vb, 
     524             :                           const Matrix<Double>& freqSelection, const Double& imRefFreq)
     525             :   {
     526           0 :     Vector<Double> spwList=freqSelection.column(0);
     527           0 :     Int maxSpw=(Int)(max(spwList));
     528           0 :     freqNdxMap_p.resize(maxSpw+1);
     529           0 :     conjFreqNdxMap_p.resize(maxSpw+1);
     530             : 
     531           0 :     for (Int i=0;i<(Int)spwList.nelements(); i++)
     532             :       {
     533           0 :         Int spw=(Int)freqSelection(i,0);
     534           0 :         Double fmin=freqSelection(i,1), fmax=freqSelection(i,2), finc=freqSelection(i,3);
     535           0 :         Int nchan = (Int)((fmax-fmin)/finc + 1);
     536           0 :         freqNdxMap_p[spw].resize(nchan);
     537           0 :         conjFreqNdxMap_p[spw].resize(nchan);
     538           0 :         for (Int c=0;c<nchan;c++)
     539             :           {
     540           0 :             Double freq=fmin+c*finc;
     541           0 :             Double conjFreq=sqrt(2*imRefFreq*imRefFreq - freq*freq);
     542           0 :             freqNdxMap_p[spw][c]=nearestFreqNdx(freq);
     543           0 :             conjFreqNdxMap_p[spw][c]=nearestFreqNdx(conjFreq);
     544             :           }
     545             :       }
     546             : 
     547             :     
     548             :     // cerr << "CFBuffer::initMaps: " 
     549             :     //   << freqSelection << endl
     550             :     //   << freqValues_p << endl
     551             :     //   << freqNdxMap_p << endl
     552             :     //   << conjFreqNdxMap_p << endl;
     553             : 
     554           0 :   }
     555             : 
     556           0 :   void CFBuffer::initPolMaps(PolMapType& polMap, PolMapType& conjPolMap) 
     557             :   {
     558           0 :     muellerElementsIndex_p.assign(polMap);
     559           0 :     conjMuellerElementsIndex_p.assign(conjPolMap);
     560           0 :   }
     561             : 
     562           0 :   void CFBuffer::getFreqNdxMaps(Vector<Vector<Int> >& freqNdx, Vector<Vector<Int> >& conjFreqNdx)
     563             :   {
     564             :     Int nspw;
     565           0 :     nspw=freqNdxMap_p.nelements();
     566           0 :     freqNdx.resize(nspw);
     567           0 :     for (Int s=0;s<nspw;s++)
     568           0 :       freqNdx[s].assign(freqNdxMap_p[s]);
     569             : 
     570           0 :     nspw=conjFreqNdxMap_p.nelements();
     571           0 :     conjFreqNdx.resize(nspw);
     572           0 :     for (Int s=0;s<nspw;s++)
     573           0 :       conjFreqNdx[s].assign(conjFreqNdxMap_p[s]);
     574           0 :   }
     575             : 
     576           0 :   void CFBuffer::ASSIGNVVofI(Int** &target,Vector<Vector<Int> >& source, Bool& doAlloc)
     577             :   {
     578             :     // cerr << "Source: " << target << " " << source << endl;
     579             : 
     580             :     Int nx,ny;                                  
     581           0 :     Bool b=(doAlloc||(target==NULL));
     582           0 :     nx=source.nelements();
     583           0 :     if (b) target=(int **)malloc(nx*sizeof(int*));
     584           0 :     for (int i=0;i<nx;i++)
     585             :       {
     586           0 :         ny = source[i].nelements();
     587           0 :         if (b) (target[i]) = (int *)malloc(ny*sizeof(int));
     588           0 :         for (int j=0;j<ny;j++)
     589           0 :           (target)[i][j]=source[i][j];
     590             :       }
     591             : 
     592             :     // cerr << "Target: ";
     593             :     // for (int ii=0;ii<source.nelements();ii++)
     594             :     //   {
     595             :     //  Int ny=source[ii].nelements();
     596             :     //  for(Int jj=0;jj<ny;jj++)
     597             :     //    cerr << target[ii][jj] << " ";
     598             :     //  cerr << endl;
     599             :     //   }
     600           0 :   }
     601             : 
     602           0 :   void CFBuffer::getAsStruct(CFBStruct& st)
     603             :   {
     604           0 :     Vector<Int> shp=cfCells_p.shape().asVector();
     605             : 
     606           0 :     Bool doAlloc=(st.CFBStorage == NULL);
     607             : 
     608           0 :     st.shape[0]=shp[0];
     609           0 :     st.shape[1]=shp[1];
     610           0 :     st.shape[2]=shp[2];
     611           0 :     st.fIncr = freqValIncr_p; st.wIncr = wValIncr_p;
     612             : 
     613             : 
     614             :     Bool dummy;
     615           0 :     Int n=cfCells_p.nelements();
     616           0 :     if (doAlloc) st.CFBStorage = (CFCStruct *)malloc(n*sizeof(CFCStruct));
     617           0 :     CountedPtr<CFCell> *cfstore=cfCells_p.getStorage(dummy);
     618           0 :     for (int i=0;i<n;i++)
     619             :       {
     620             :         //        st.CFBStorage[i]=(CFCStruct *)malloc(sizeof(CFCStruct));
     621           0 :         (cfstore[i]).operator->()->getAsStruct(st.CFBStorage[i]);
     622             :       }
     623             :     //  st.CFBStorage[i] = (cfstore[i]).operator->()->getStorage()->getStorage(dummy);
     624             :     
     625           0 :     if (doAlloc) st.pointingOffset=(Double *)malloc(pointingOffset_p.nelements()*sizeof(Double));
     626           0 :     for (uInt i=0;i<pointingOffset_p.nelements();i++) st.pointingOffset[i]=pointingOffset_p[i];
     627             : 
     628           0 :     if (doAlloc) st.freqValues=(Double *)malloc(freqValues_p.nelements()*sizeof(Double));
     629           0 :     for (uInt i=0;i<freqValues_p.nelements();i++) st.freqValues[i]=freqValues_p[i];
     630             : 
     631           0 :     if (doAlloc) st.wValues=(Double *)malloc(wValues_p.nelements()*sizeof(Double));
     632           0 :     for (uInt i=0;i<wValues_p.nelements();i++) st.wValues[i]=wValues_p[i];
     633             : 
     634           0 :     ASSIGNVVofI(st.muellerElements, muellerElements_p, doAlloc);
     635           0 :     ASSIGNVVofI(st.muellerElementsIndex, muellerElementsIndex_p,doAlloc);
     636           0 :     ASSIGNVVofI(st.conjMuellerElements, conjMuellerElements_p,doAlloc);
     637           0 :     ASSIGNVVofI(st.conjMuellerElementsIndex, conjMuellerElementsIndex_p,doAlloc);
     638             : 
     639           0 :     st.nMueller = muellerElements_p.nelements();
     640             :     
     641           0 :     Vector<Vector<Int> > freqNdx, conjFreqNdx;
     642           0 :     getFreqNdxMaps(freqNdx, conjFreqNdx);
     643           0 :     ASSIGNVVofI(st.freqNdxMap, freqNdx, doAlloc);
     644           0 :     ASSIGNVVofI(st.conjFreqNdxMap, conjFreqNdx, doAlloc);
     645           0 :   }
     646             :   
     647             :   //
     648             :   //----------------------------------------------------------------------
     649             :   //
     650           0 :   void CFBuffer::fill(const Int& /*nx*/, const Int& /*ny*/, 
     651             :                       const Vector<Double>& freqValues,
     652             :                       const Vector<Double>& wValues,
     653             :                       const PolMapType& muellerElements)
     654             :   {
     655             : 
     656           0 :     LogIO log_l(LogOrigin("CFBuffer", "fillBuffer[R&D]"));
     657           0 :     for (uInt imx=0;imx<muellerElements.nelements();imx++) // Loop over all MuellerElements
     658           0 :       for (uInt imy=0;imy<muellerElements(imx).nelements();imy++)
     659             :         {
     660           0 :             for (uInt inu=0;inu<freqValues.nelements();inu++) // All freq. channels
     661             :               {
     662           0 :                 for (uInt iw=0;iw<wValues.nelements();iw++)     // All w-planes
     663             :                   {
     664             :                     log_l << " CF("
     665           0 :                           << "M:"<<muellerElements(imx)(imy) 
     666             :                           << ",C:" << inu 
     667           0 :                           << ",W:" << iw << "): ";
     668           0 :                     Vector<Double> ftRef(2);
     669             : 
     670             :                     // ftRef(0)=cfWtBuf.shape()(0)/2.0;
     671             :                     // ftRef(1)=cfWtBuf.shape()(1)/2.0;
     672           0 :                     CoordinateSystem ftCoords;//=cs_l;
     673             :                     // SynthesisUtils::makeFTCoordSys(cs_l, cfWtBuf.shape()(0), ftRef, ftCoords);
     674             : 
     675             :                     // cfb.setParams(inu,iw,imx,imy,//muellerElements(imx)(imy),
     676             :                     //            ftCoords, sampling, xSupport, ySupport,
     677             :                     //            freqValues(inu), wValues(iw), muellerElements(imx)(imy));
     678             :                     // cfb.getCFCellPtr(freqValues(inu), wValues(iw), 
     679             :                     //               muellerElements(imx)(imy))->pa_p=Quantity(vbPA,"rad");
     680             :                     //
     681             :                     // Now tha the CFs have been computed, cache its
     682             :                     // paramters in CFCell for quick access in tight
     683             :                     // loops (in the re-sampler, e.g.).
     684             :                     //
     685           0 :                     (getCFCellPtr(freqValues(inu), wValues(iw), 
     686           0 :                                   muellerElements(imx)(imy)))->initCache();
     687           0 :                   }
     688             :               }
     689             :         }
     690           0 :   }
     691             : 
     692             : } // end casa namespace
     693             : 
     694             : 
     695             : 

Generated by: LCOV version 1.16