LCOV - code coverage report
Current view: top level - synthesis/TransformMachines - VisibilityResampler.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 165 0.0 %
Date: 2024-10-29 13:38:20 Functions: 0 4 0.0 %

          Line data    Source code
       1             : // -*- C++ -*-
       2             : //# VisibilityResampler.cc: Implementation of the VisibilityResampler 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             : 
      29             : #include <synthesis/TransformMachines/SynthesisError.h>
      30             : #include <synthesis/TransformMachines/VisibilityResampler.h>
      31             : #include <synthesis/TransformMachines/Utils.h>
      32             : #include <stdcasa/thread/AsynchronousTools.h>
      33             : #include <fstream>
      34             : 
      35             : using namespace casacore;
      36             : namespace casa{
      37             : #define NEED_UNDERSCORES
      38             : #if defined(NEED_UNDERSCORES)
      39             : #define gridengine gridengine_
      40             : #define addtogrid addtogrid_
      41             : #endif
      42             :   extern "C"{
      43             :       void gridengine(int *gnx,int *gny,int *gnpol,int *gnchan,
      44             :                       double *grid,
      45             :                       int *ncf, double  *convfunc,
      46             :                       float *sampling, int* support,
      47             :                       int *loc, int* off, int *achan, int *apol,
      48             :                       double * norm,
      49             :                       float *phasor,
      50             :                       int* ipol,int* ichan,int* irow,
      51             :                       float* imgWts,int *dopsf,
      52             :                       float* visCube, 
      53             :                       int *visCubePol, int *visCubeChan, int *visCubeRow);
      54             :     void addtogrid(double* grid, int* pos, float *val, double* wt,
      55             :                    int *nx, int *ny, int *npol, int* nchan);
      56             :   }
      57             :   //
      58             :   //-----------------------------------------------------------------------------------
      59             :   //
      60             :   // VisibilityResampler& VisibilityResampler::operator=(const VisibilityResampler& other)
      61             :   // {
      62             :   //   SynthesisUtils::SETVEC(uvwScale_p, other.uvwScale_p);
      63             :   //   SynthesisUtils::SETVEC(offset_p, other.offset_p);
      64             :   //   SynthesisUtils::SETVEC(dphase_p, other.dphase_p);
      65             :   //   SynthesisUtils::SETVEC(chanMap_p, other.chanMap_p);
      66             :   //   SynthesisUtils::SETVEC(polMap_p, other.polMap_p);
      67             : 
      68             :   //   convFuncStore_p = other.convFuncStore_p;
      69             :   //   myMutex_p = other.myMutex_p;
      70             :   //   return *this;
      71             :   // }
      72             :   //
      73             :   //-----------------------------------------------------------------------------------
      74             :   // Re-sample the griddedData on the VisBuffer (a.k.a gridding)
      75             :   //
      76             :   // Template instantiations for re-sampling onto a double precision
      77             :   // or single precision grid.
      78             :   //
      79             :   template
      80             :   void VisibilityResampler::DataToGridImpl_p(Array<DComplex>& grid, VBStore& vbs, 
      81             :                                              const Bool& dopsf,  Matrix<Double>& sumwt,
      82             :                                              Bool /*useConjFreqCF*/); // __restrict__;
      83             :   template
      84             :   void VisibilityResampler::DataToGridImpl_p(Array<Complex>& grid, VBStore& vbs, 
      85             :                                              const Bool& dopsf,  Matrix<Double>& sumwt,
      86             :                                              Bool /*useConjFreqCF*/); // __restrict__;
      87             : 
      88             :   // template void VisibilityResampler::addTo4DArray(DComplex* store,const Int* iPos, Complex& val, Double& wt) __restrict__;
      89             :   // template void VisibilityResampler::addTo4DArray(Complex* store,const Int* iPos, Complex& val, Double& wt) __restrict__;
      90             :   //
      91             :   //-----------------------------------------------------------------------------------
      92             :   // Template implementation for DataToGrid
      93             :   //
      94             :   /*
      95             :   template <class T>
      96             :   void VisibilityResampler::DataToGridImpl_p(Array<T>& grid,  VBStore& vbs, const Bool& dopsf,
      97             :                                              Matrix<Double>& sumwt)
      98             :   {
      99             :     Int nDataChan, nDataPol, nGridPol, nGridChan, nx, ny;
     100             :     Int achan, apol, rbeg, rend;
     101             :     Vector<Float> sampling(2);
     102             :     Vector<Int> support(2),loc(2), off(2), iloc(2);
     103             :     Vector<Double> pos(2);
     104             : 
     105             :     //    IPosition grdpos(4);
     106             :     Vector<Int> igrdpos(4), gridIncrements;
     107             : 
     108             :     Double norm=0, wt, imgWt;
     109             :     Complex phasor, nvalue;
     110             : 
     111             :     rbeg = vbs.beginRow_p;
     112             :     rend = vbs.endRow_p;
     113             :     //    cerr << rbeg << " " << rend << " " << vbs.nRow() << endl;
     114             :     nx       = grid.shape()[0]; ny        = grid.shape()[1];
     115             :     nGridPol = grid.shape()[2]; nGridChan = grid.shape()[3];
     116             :     gridIncrements = grid.shape().asVector();
     117             :     nDataPol  = vbs.flagCube_p.shape()[0];
     118             :     nDataChan = vbs.flagCube_p.shape()[1];
     119             : 
     120             :     sampling[0] = sampling[1] = convFuncStore_p.sampling[0];
     121             :     support(0) = convFuncStore_p.xSupport[0];
     122             :     support(1) = convFuncStore_p.ySupport[0];
     123             : 
     124             :     Bool Dummy, gDummy;
     125             :     T __restrict__ *gridStore = grid.getStorage(gDummy);
     126             :     Int * __restrict__ iPosPtr = igrdpos.getStorage(Dummy);
     127             :     const Int * __restrict__ iPosPtrConst = iPosPtr;
     128             :     Double *__restrict__ convFunc=(*(convFuncStore_p.rdata)).getStorage(Dummy);
     129             :     Double * __restrict__ freq=vbs.freq_p.getStorage(Dummy);
     130             :     Bool * __restrict__ rowFlag=vbs.rowFlag_p.getStorage(Dummy);
     131             : 
     132             :     Float * __restrict__ imagingWeight = vbs.imagingWeight_p.getStorage(Dummy);
     133             :     Double * __restrict__ uvw = vbs.uvw_p.getStorage(Dummy);
     134             :     Bool * __restrict__ flagCube = vbs.flagCube_p.getStorage(Dummy);
     135             :     Complex * __restrict__ visCube = vbs.visCube_p.getStorage(Dummy);
     136             :     Double * __restrict__ scale = uvwScale_p.getStorage(Dummy);
     137             :     Double * __restrict__ offset = offset_p.getStorage(Dummy);
     138             :     Float * __restrict__ samplingPtr = sampling.getStorage(Dummy);
     139             :     Double * __restrict__ posPtr=pos.getStorage(Dummy);
     140             :     Int * __restrict__ locPtr=loc.getStorage(Dummy);
     141             :     Int * __restrict__ offPtr=off.getStorage(Dummy);
     142             :     Double * __restrict__ sumwtPtr = sumwt.getStorage(Dummy);
     143             :     Int * __restrict__ ilocPtr=iloc.getStorage(Dummy);
     144             :     Int * __restrict__ supportPtr = support.getStorage(Dummy);
     145             :     Int nDim = vbs.uvw_p.shape()[0];
     146             : 
     147             :     //    cacheAxisIncrements(nx,ny,nGridPol, nGridChan);
     148             :     cacheAxisIncrements(grid.shape().asVector());
     149             : 
     150             :     for(Int irow=rbeg; irow < rend; irow++){          // For all rows
     151             :       
     152             :       if(!rowFlag[irow]){                        // If the row is not flagged
     153             :         
     154             :         for(Int ichan=0; ichan< nDataChan; ichan++){ // For all channels
     155             :           
     156             :           //      if (vbs.imagingWeight(ichan,irow)!=0.0) {  // If weights are not zero
     157             :           if (imagingWeight[ichan+irow*nDataChan]!=0.0) {  // If weights are not zero
     158             :             achan=chanMap_p(ichan);
     159             :             
     160             :             if((achan>=0) && (achan<nGridChan)) {   // If selected channels are valid
     161             :               
     162             :               // sgrid(pos,loc,off, phasor, irow, 
     163             :               //            vbs.uvw,dphase_p[irow], vbs.freq[ichan], 
     164             :               //            uvwScale_p, offset_p, sampling);
     165             :               sgrid(nDim,posPtr,locPtr,offPtr, phasor, irow, 
     166             :                     uvw,dphase_p[irow], freq[ichan], 
     167             :                     scale, offset, samplingPtr);
     168             : 
     169             :               if (onGrid(nx, ny, loc, support)) {   // If the data co-ords. are with-in the grid
     170             :                 
     171             :                 for(Int ipol=0; ipol< nDataPol; ipol++) { // For all polarizations
     172             :                   // if((!vbs.flagCube(ipol,ichan,irow))){   // If the pol. & chan. specific
     173             :                   if((!flagCube[ipol+ichan*nDataPol+irow*nDataChan*nDataPol])){
     174             :                     apol=polMap_p(ipol);
     175             :                     if ((apol>=0) && (apol<nGridPol)) {
     176             :                       //              igrdpos(2)=apol; igrdpos(3)=achan;
     177             :                       iPosPtr[2]=apol; iPosPtr[3]=achan;
     178             :                       norm=0.0;
     179             :                       
     180             :                       imgWt=imagingWeight[ichan+irow*nDataChan];
     181             : 
     182             :                       Int idopsf = (dopsf==true);
     183             :                       Int ncf=(*convFuncStore_p.rdata).shape()(0);
     184             :                       Int nrow = vbs.nRow();
     185             :                       gridengine(&nx, &ny, &nGridPol, &nGridChan, (double*)gridStore, 
     186             :                                  &ncf, (double*)convFunc, samplingPtr, supportPtr, 
     187             :                                  locPtr, offPtr, &achan, &apol, &norm, (float *)&phasor,
     188             :                                  &ipol, &ichan, &irow, imagingWeight, &idopsf,
     189             :                                  (float *)visCube, &nDataPol, &nDataChan,&nrow);
     190             : 
     191             :                       // if(dopsf)  nvalue=Complex(imgWt);
     192             :                       // else    nvalue=imgWt*
     193             :                       //                   // (vbs.visCube(ipol,ichan,irow)*phasor);
     194             :                       //                   (visCube[ipol+ichan*nDataPol+irow*nDataPol*nDataChan]*phasor);
     195             : 
     196             :                       // for(Int iy=-supportPtr[1]; iy <= supportPtr[1]; iy++) 
     197             :                       //        {
     198             :                       //          ilocPtr[1]=abs((int)(samplingPtr[1]*iy+offPtr[1]));
     199             :                       //          //                      igrdpos(1)=loc(1)+iy;
     200             :                       //          iPosPtr[1]=locPtr[1]+iy;
     201             :                       //          //                      wt = convFunc[ilocPtr[1]];
     202             :                       //          for(Int ix=-supportPtr[0]; ix <= supportPtr[0]; ix++) 
     203             :                       //            {
     204             :                       //              ilocPtr[0]=abs((int)(samplingPtr[0]*ix+offPtr[0]));
     205             :                       //              wt = convFunc[iloc[0]]*convFunc[iloc[1]];
     206             :                       //              //                              wt *= convFunc[ilocPtr[0]];
     207             : 
     208             :                       //              //igrdpos(0)=loc(0)+ix;
     209             :                       //              iPosPtr[0]=locPtr[0]+ix;
     210             : 
     211             : 
     212             :                       //              // grid(grdpos) += nvalue*wt;
     213             : 
     214             :                       //              // gridStore[iPosPtr[0] + 
     215             :                       //              //                iPosPtr[1]*incPtr_p[1] + 
     216             :                       //              //                iPosPtr[2]*incPtr_p[2] +
     217             :                       //              //                iPosPtr[3]*incPtr_p[3]].real() += (nvalue.real()*wt);
     218             :                       //              // gridStore[iPosPtr[0] + 
     219             :                       //              //                iPosPtr[1]*incPtr_p[1] + 
     220             :                       //              //                iPosPtr[2]*incPtr_p[2] +
     221             :                       //              //                iPosPtr[3]*incPtr_p[3]].imag() += (nvalue.imag()*wt);
     222             : 
     223             :                       //              // The following uses raw index on the 4D grid
     224             :                       //              //                              addTo4DArray(gridStore,iPosPtr,nvalue,wt);
     225             : 
     226             :                       //              addtogrid((double *)gridStore, iPosPtr, (float *)&nvalue, (double *)&wt,
     227             :                       //                        &nx, &ny, &nGridPol, &nGridChan);
     228             : 
     229             :                       //              norm+=wt;
     230             :                       //            }
     231             :                       //        }
     232             :                       sumwtPtr[apol+achan*nGridPol]+=imgWt*norm;
     233             :                                       //                      sumwt(apol,achan)+=imgWt*norm;
     234             :                     }
     235             :                   }
     236             :                 }
     237             :               }
     238             :             }
     239             :           }
     240             :         }
     241             :       }
     242             :     }
     243             :     // T *tt=(T *)gridStore;
     244             :     // grid.putStorage(tt,gDummy);
     245             :   }
     246             :   */
     247             :   //
     248             :   //-----------------------------------------------------------------------------------
     249             :   // Re-sample VisBuffer to a regular grid (griddedData) (a.k.a. de-gridding)
     250             :   //
     251           0 :   void VisibilityResampler::GridToData(VBStore& vbs, const Array<Complex>& grid)
     252             :   //  void VisibilityResampler::GridToData(VBStore& vbs, Array<Complex>& grid)
     253             :   {
     254             :     using casacore::operator*;
     255             : 
     256             :     Int nDataChan, nDataPol, nGridPol, nGridChan, nx, ny;
     257             :     Int achan, apol, rbeg, rend;
     258           0 :     Vector<Float> sampling(2);
     259           0 :     Vector<Int> support(2),loc(2), off(2), iloc(2);
     260           0 :     Vector<Double> pos(2);
     261             : 
     262           0 :     IPosition grdpos(4);
     263             : 
     264           0 :     Double norm=0, wt;
     265           0 :     Complex phasor, nvalue;
     266             : 
     267             :     // rbeg=0;
     268             :     // rend=vbs.nRow_p;
     269           0 :     rbeg = vbs.beginRow_p;
     270           0 :     rend = vbs.endRow_p;
     271             :     //    cerr << rbeg << " " << rend << " " << vbs.nRow() << endl;
     272           0 :     nx       = grid.shape()[0]; ny        = grid.shape()[1];
     273           0 :     nGridPol = grid.shape()[2]; nGridChan = grid.shape()[3];
     274             : 
     275           0 :     nDataPol  = vbs.flagCube_p.shape()[0];
     276           0 :     nDataChan = vbs.flagCube_p.shape()[1];
     277             : 
     278           0 :     sampling[0] = sampling[1] = convFuncStore_p.sampling[0];
     279           0 :     support(0) = convFuncStore_p.xSupport[0];
     280           0 :     support(1) = convFuncStore_p.ySupport[0];
     281             : 
     282             :     Bool Dummy,vbcDummy;
     283           0 :     const Complex *__restrict__ gridStore = grid.getStorage(Dummy);
     284           0 :     Vector<Int> igrdpos(4);
     285           0 :     Int *__restrict__ iPosPtr = igrdpos.getStorage(Dummy);
     286           0 :     const Int *__restrict__ iPosPtrConst = iPosPtr;
     287           0 :     Double *__restrict__ convFunc=(*(convFuncStore_p.rdata)).getStorage(Dummy);
     288           0 :     Double *__restrict__ freq=vbs.freq_p.getStorage(Dummy);
     289           0 :     Bool *__restrict__ rowFlag=vbs.rowFlag_p.getStorage(Dummy);
     290             : 
     291             :     //UNUSED: Float * __restrict__ imagingWeight = vbs.imagingWeight_p.getStorage(Dummy);
     292           0 :     Double * __restrict__ uvw = vbs.uvw_p.getStorage(Dummy);
     293           0 :     Bool * __restrict__ flagCube = vbs.flagCube_p.getStorage(Dummy);
     294           0 :     Complex * __restrict__ visCube = vbs.visCube_p.getStorage(vbcDummy);
     295           0 :     Double * __restrict__ scale = uvwScale_p.getStorage(Dummy);
     296           0 :     Double * __restrict__ offset = offset_p.getStorage(Dummy);
     297           0 :     Int * __restrict__ supportPtr = support.getStorage(Dummy);
     298           0 :     Float * __restrict__ samplingPtr = sampling.getStorage(Dummy);
     299           0 :     Double * __restrict__ posPtr=pos.getStorage(Dummy);
     300           0 :     Int * __restrict__ locPtr=loc.getStorage(Dummy);
     301           0 :     Int * __restrict__ offPtr=off.getStorage(Dummy);
     302           0 :     Int * __restrict__ ilocPtr=iloc.getStorage(Dummy);
     303           0 :     Int nDim = vbs.uvw_p.shape()(0);
     304             : 
     305             :     //    cacheAxisIncrements(nx,ny,nGridPol, nGridChan);
     306           0 :     cacheAxisIncrements(grid.shape().asVector());
     307             :     //UNUSED: Int xSupport_l, ySupport_l;
     308             :     //UNUSED: Float sampling_l;
     309           0 :     for(Int irow=rbeg; irow < rend; irow++) {
     310           0 :       if(!rowFlag[irow]) {
     311           0 :         for (Int ichan=0; ichan < nDataChan; ichan++) {
     312           0 :           achan=chanMap_p(ichan);
     313             : 
     314           0 :           if((achan>=0) && (achan<nGridChan)) {
     315             :             // sgrid(pos,loc,off,phasor,irow,vbs.uvw,
     316             :             //    dphase_p[irow],vbs.freq[ichan],
     317             :             //    uvwScale_p,offset_p,sampling);
     318             : 
     319           0 :             sgrid(nDim,posPtr,locPtr,offPtr,phasor,irow,uvw,
     320           0 :                   dphase_p[irow],freq[ichan],
     321             :                   scale,offset,samplingPtr);
     322             : 
     323           0 :             if (onGrid(nx, ny, loc, support)) {
     324           0 :               for(Int ipol=0; ipol < nDataPol; ipol++) {
     325             : 
     326           0 :                 if(!flagCube[ipol+ichan*nDataPol+irow*nDataChan*nDataPol]) { 
     327           0 :                   apol=polMap_p(ipol);
     328             :                   
     329           0 :                   if((apol>=0) && (apol<nGridPol)) {
     330             :                     //              igrdpos(2)=apol; igrdpos(3)=achan;
     331           0 :                     iPosPtr[2]=apol; iPosPtr[3]=achan;
     332           0 :                     nvalue=0.0;
     333           0 :                     norm=0.0;
     334             : 
     335           0 :                     for(Int iy=-supportPtr[1]; iy <= supportPtr[1]; iy++) 
     336             :                       {
     337           0 :                         ilocPtr[1]=abs((Int)(samplingPtr[1]*iy+offPtr[1]));
     338             :                         //                      igrdpos(1)=loc(1)+iy;
     339           0 :                         iPosPtr[1]=locPtr[1]+iy;
     340             :                         //                      wt = convFunc[ilocPtr[1]];
     341           0 :                         for(Int ix=-supportPtr[0]; ix <= supportPtr[0]; ix++) 
     342             :                           {
     343           0 :                             ilocPtr[0]=abs((Int)(samplingPtr[0]*ix+offPtr[0]));
     344             :                             //                      igrdpos(0)=loc(0)+ix;
     345           0 :                             iPosPtr[0]=locPtr[0]+ix;
     346           0 :                             wt=convFunc[ilocPtr[0]]*convFunc[ilocPtr[1]];
     347             :                             //                      wt *= convFunc[ilocPtr[0]];
     348           0 :                             norm+=wt;
     349             :                             //                      nvalue+=wt*grid(grdpos);
     350             :                             // The following uses raw index on the 4D grid
     351           0 :                             nvalue+=wt*getFrom4DArray(gridStore,iPosPtrConst);
     352             :                           }
     353             :                       }
     354           0 :                     visCube[ipol+ichan*nDataPol+irow*nDataChan*nDataPol]=(nvalue*conj(phasor))/norm;
     355             :                   }
     356             :                 }
     357             :               }
     358             :             }
     359             :           }
     360             :         }
     361             :       }
     362             :     }
     363           0 :     Complex *tt=(Complex *) visCube;
     364           0 :     vbs.visCube_p.putStorage(tt,vbcDummy);
     365           0 :   }
     366             :   //
     367             :   //-----------------------------------------------------------------------------------
     368             :   //
     369             :   // void VisibilityResampler::sgrid(Int& uvwDim,Double* __restrict__ pos, 
     370             :   //                              Int* __restrict__ loc, 
     371             :   //                              Int* __restrict__ off, 
     372             :   //                              Complex& phasor, const Int& irow,
     373             :   //                              // const Matrix<Double>& __restrict__ uvw, 
     374             :   //                              const Double* __restrict__ uvw, 
     375             :   //                              const Double& __restrict__ dphase, 
     376             :   //                              const Double& __restrict__ freq, 
     377             :   //                              const Double* __restrict__ scale, 
     378             :   //                              const Double* __restrict__ offset,
     379             :   //                              const Float* __restrict__ sampling) __restrict__ 
     380             :   //                              // const Vector<Double>& __restrict__ scale, 
     381             :   //                              // const Vector<Double>& __restrict__ offset,
     382             :   //                              // const Vector<Float>& __restrict__ sampling) __restrict__ 
     383             :   // {
     384             :   //   Double phase;
     385             :   //   //    Int ndim=pos.shape()(0);
     386             :   //   Int ndim=2;
     387             : 
     388             :   //   for(Int idim=0;idim<ndim;idim++)
     389             :   //     {
     390             :   //    pos[idim]=scale[idim]*uvw[idim+irow*uvwDim]*freq/C::c+offset[idim];
     391             :   //    loc[idim]=(Int)std::floor(pos[idim]+0.5);
     392             :   //    off[idim]=(Int)std::floor(((loc[idim]-pos[idim])*sampling[idim])+0.5);
     393             :   //     }
     394             : 
     395             :   //   if (dphase != 0.0)
     396             :   //     {
     397             :   //    phase=-2.0*C::pi*dphase*freq/C::c;
     398             :   //    phasor=Complex(cos(phase), sin(phase));
     399             :   //     }
     400             :   //   else
     401             :   //     phasor=Complex(1.0);
     402             :   // }
     403           0 :   void VisibilityResampler::ComputeResiduals(VBStore& vbs)
     404             :   {
     405           0 :     Int rbeg = vbs.beginRow_p, rend = vbs.endRow_p;
     406           0 :     IPosition vbDataShape=vbs.modelCube_p.shape();
     407           0 :     IPosition start(vbDataShape), last(vbDataShape);
     408           0 :     start=0; start(2)=rbeg;
     409           0 :     last(2)=rend; //last=last-1;
     410             : 
     411           0 :     if (!vbs.useCorrected_p)
     412             :       {
     413           0 :         for(uInt ichan = start(0); ichan < last(0); ichan++)
     414           0 :           for(uInt ipol = start(1); ipol < last(1); ipol++)
     415           0 :             for(uInt irow = start(2); irow < last(2); irow++)
     416           0 :               vbs.modelCube_p(ichan,ipol,irow) = vbs.modelCube_p(ichan,ipol,irow) - vbs.visCube_p(ichan,ipol,irow);
     417             :         //            vbs.modelCube_p(ichan,ipol,irow) =  vbs.visCube_p(ichan,ipol,irow) - vbs.modelCube_p(ichan,ipol,irow);
     418             :       }
     419             :     else
     420             :       {
     421           0 :         for(uInt ichan = start(0); ichan < last(0); ichan++)
     422           0 :           for(uInt ipol = start(1); ipol < last(1); ipol++)
     423           0 :             for(uInt irow = start(2); irow < last(2); irow++)
     424           0 :               vbs.modelCube_p(ichan,ipol,irow) = vbs.modelCube_p(ichan,ipol,irow) - vbs.correctedCube_p(ichan,ipol,irow);
     425             :         //vbs.modelCube_p(ichan,ipol,irow) = vbs.correctedCube_p(ichan,ipol,irow) - vbs.modelCube_p(ichan,ipol,irow);
     426             :       }
     427             :       
     428             :     // Slicer mySlice(start,last,Slicer::endIsLast);
     429             :     // Cube<Complex> slicedModel, slicedData, slicedCorrected;
     430             :     // if (!vbs.useCorrected_p) 
     431             :     //   {
     432             :     //  {
     433             :     //    async::MutexLocker tt(*myMutex_p);
     434             :     //    slicedModel = Cube<Complex>(vbs.modelCube_p(mySlice));
     435             :     //    slicedData = Cube<Complex>(vbs.visCube_p(mySlice));
     436             :     //  }
     437             :     //  slicedModel -= slicedData;
     438             :     //   }
     439             :     // else
     440             :     //   {
     441             :     //  {
     442             :     //    async::MutexLocker tt(*myMutex_p);
     443             :     //    slicedModel = Cube<Complex>(vbs.modelCube_p(mySlice));
     444             :     //    slicedCorrected = Cube<Complex>(vbs.correctedCube_p(mySlice));
     445             :     //  }
     446             :     //  slicedModel -= slicedCorrected;
     447             :     //   }
     448           0 :   }
     449             : 
     450             : 
     451             : 
     452             : 
     453             : #define DoOld 1
     454             : 
     455             :   template <class T>
     456           0 :   void VisibilityResampler::DataToGridImpl_p(Array<T>& grid,  VBStore& vbs, const Bool& dopsf,
     457             :                                              Matrix<Double>& sumwt,
     458             :                                              Bool /*useConjFreqCF*/)
     459             :   {
     460             :     using casacore::operator*;
     461             : 
     462             : static Bool beenThereDoneThat = false;
     463           0 : if (! beenThereDoneThat){
     464             : #if DoOld
     465           0 :     cerr << "==> Doing it the old way" << endl;
     466             : #else
     467             :     cerr << "==> Doing it the new way" << endl;
     468             : #endif
     469           0 :     beenThereDoneThat = true;
     470             : }
     471             : 
     472             :     Int nDataChan, nDataPol, nGridPol, nGridChan, nx, ny;
     473             :     Int achan, apol, rbeg, rend;
     474           0 :     Vector<Float> sampling(2);
     475           0 :     Vector<Int> support(2),loc(2), off(2), iloc(2);
     476           0 :     Vector<Double> pos(2);
     477             : 
     478             :     //    IPosition grdpos(4);
     479           0 :     Vector<Int> igrdpos(4);
     480             : 
     481           0 :     Double norm=0, wt, imgWt;
     482           0 :     Complex phasor, nvalue;
     483             : 
     484           0 :     rbeg = vbs.beginRow_p;
     485           0 :     rend = vbs.endRow_p;
     486             :     //    cerr << rbeg << " " << rend << " " << vbs.nRow() << endl;
     487           0 :     nx       = grid.shape()[0]; ny        = grid.shape()[1];
     488           0 :     nGridPol = grid.shape()[2]; nGridChan = grid.shape()[3];
     489             : 
     490           0 :     nDataPol  = vbs.flagCube_p.shape()[0];
     491           0 :     nDataChan = vbs.flagCube_p.shape()[1];
     492             : 
     493           0 :     sampling[0] = sampling[1] = convFuncStore_p.sampling[0];
     494           0 :     support(0) = convFuncStore_p.xSupport[0];
     495           0 :     support(1) = convFuncStore_p.ySupport[0];
     496             : 
     497             :     Bool Dummy,gDummy;
     498           0 :     T * __restrict__ gridStore = grid.getStorage(gDummy);
     499           0 :     Int * __restrict__ iPosPtr = igrdpos.getStorage(Dummy);
     500           0 :     Double *__restrict__ convFunc=(*(convFuncStore_p.rdata)).getStorage(Dummy);
     501           0 :     Double * __restrict__ freq=vbs.freq_p.getStorage(Dummy);
     502           0 :     Bool * __restrict__ rowFlag=vbs.rowFlag_p.getStorage(Dummy);
     503             : 
     504           0 :     Float * __restrict__ imagingWeight = vbs.imagingWeight_p.getStorage(Dummy);
     505           0 :     Double * __restrict__ uvw = vbs.uvw_p.getStorage(Dummy);
     506           0 :     Bool * __restrict__ flagCube = vbs.flagCube_p.getStorage(Dummy);
     507           0 :     Complex * __restrict__ visCube = vbs.visCube_p.getStorage(Dummy);
     508           0 :     Double * __restrict__ scale = uvwScale_p.getStorage(Dummy);
     509           0 :     Double * __restrict__ offset = offset_p.getStorage(Dummy);
     510           0 :     Float * __restrict__ samplingPtr = sampling.getStorage(Dummy);
     511           0 :     Double * __restrict__ posPtr=pos.getStorage(Dummy);
     512           0 :     Int * __restrict__ locPtr=loc.getStorage(Dummy);
     513           0 :     Int * __restrict__ offPtr=off.getStorage(Dummy);
     514             :     //UNUSED: Double * __restrict__ sumwtPtr = sumwt.getStorage(Dummy);
     515           0 :     Int nDim = vbs.uvw_p.shape()[0];
     516             : 
     517             :     //    cacheAxisIncrements(nx,ny,nGridPol, nGridChan);
     518           0 :     cacheAxisIncrements(grid.shape().asVector());
     519             : 
     520             :     //    Vector<Int> gridIncrements = grid.shape().asVector();
     521           0 :     Vector<Int> gridShape = grid.shape().asVector();
     522           0 :     Vector<Int> gridIncrements (gridShape.nelements());
     523             : 
     524           0 :     gridIncrements[0] = 1;
     525           0 :     for (uint i = 1; i < gridShape.nelements(); i++){
     526           0 :         gridIncrements [i] = gridIncrements[i-1] * gridShape[i-1];
     527             :     }
     528           0 :     Vector<Double> convolutionLookupX (2 * support[0] + 1, 0.0);
     529           0 :     Vector<Double> convolutionLookupY (2 * support[1] + 1, 0.0);
     530             :     //UNUSED: const Double * const pConvolutionLookupY0 = convolutionLookupY.getStorage (Dummy);
     531             :     //UNUSED const Double * const pConvolutionLookupX0 = convolutionLookupX.getStorage (Dummy);
     532             :     //UNUSED: const Double * const pConvolutionLookupXEnd = pConvolutionLookupX0 + convolutionLookupX.size();
     533             : 
     534           0 :     for(Int irow=rbeg; irow < rend; irow++){          // For all rows
     535             :       
     536           0 :       if(!rowFlag[irow]){                        // If the row is not flagged
     537             :         
     538           0 :         for(Int ichan=0; ichan< nDataChan; ichan++){ // For all channels
     539             :           
     540             :           //      if (vbs.imagingWeight(ichan,irow)!=0.0) {  // If weights are not zero
     541           0 :           if (imagingWeight[ichan+irow*nDataChan]!=0.0) {  // If weights are not zero
     542           0 :             achan=chanMap_p[ichan];
     543             :             
     544           0 :             if((achan>=0) && (achan<nGridChan)) {   // If selected channels are valid
     545             :               
     546             :               // sgrid(pos,loc,off, phasor, irow, 
     547             :               //            vbs.uvw,dphase_p[irow], vbs.freq[ichan], 
     548             :               //            uvwScale_p, offset_p, sampling);
     549           0 :               sgrid(nDim,posPtr,locPtr,offPtr, phasor, irow, 
     550           0 :                     uvw,dphase_p[irow], freq[ichan], 
     551             :                     scale, offset, samplingPtr);
     552             : 
     553           0 :               if (onGrid(nx, ny, loc, support)) {   // If the data co-ords. are with-in the grid
     554             : 
     555           0 :         Double convolutionSumX = 0;
     556           0 :     for (int ix = - support [0], ii = 0; ix <= support [0]; ix ++, ii++){
     557           0 :         Int iConv = abs(int(sampling[0] * ix + off[0]));
     558           0 :         convolutionLookupX [ii] = convFunc[iConv];
     559           0 :         convolutionSumX += convFunc[iConv];
     560             :     }
     561             : 
     562           0 :         Double convolutionSumY= 0;
     563           0 :     for (int iy = - support [1], ii = 0; iy <= support [1]; iy ++, ii++){
     564           0 :         Int iConv = abs(int(sampling[1] * iy + off[1]));
     565           0 :         convolutionLookupY [ii] = convFunc[iConv];
     566           0 :         convolutionSumY += convFunc[iConv];
     567             :     }
     568             : 
     569             :     //UNUSED: Double Norm = convolutionSumX * convolutionSumY;
     570             : 
     571             :                 
     572           0 :                 for(Int ipol=0; ipol< nDataPol; ipol++) { // For all polarizations
     573             :                   // if((!vbs.flagCube(ipol,ichan,irow))){   // If the pol. & chan. specific
     574           0 :                   if((!flagCube[ipol+ichan*nDataPol+irow*nDataChan*nDataPol])){
     575           0 :                     apol=polMap_p(ipol);
     576           0 :                     if ((apol>=0) && (apol<nGridPol)) {
     577           0 :                       igrdpos[2]=apol; igrdpos[3]=achan;
     578             :                       
     579           0 :                       norm=0.0;
     580             : 
     581           0 :                       imgWt=imagingWeight[ichan+irow*nDataChan];
     582           0 :                       if(dopsf)  nvalue=Complex(imgWt);
     583           0 :                       else       nvalue=imgWt*
     584             :                                    // (vbs.visCube(ipol,ichan,irow)*phasor);
     585           0 :                                    (visCube[ipol+ichan*nDataPol+irow*nDataPol*nDataChan]*phasor);
     586             : 
     587             : #if DoOld
     588             : 
     589             :                       // Original Inner Loop
     590             : 
     591             : //vector<const T*> oldAddresses;
     592             : 
     593             :                       //  off[idim]=(Int)std::floor(((loc[idim]-pos[idim])*sampling[idim])+0.5); un
     594             : 
     595           0 :                       for(Int iy=-support[1]; iy <= support[1]; iy++)
     596             :                       {
     597           0 :                           iloc(1)=abs((int)(sampling[1]*iy+off[1]));
     598           0 :                           igrdpos[1]=loc[1]+iy;
     599           0 :                           for(Int ix=-support[0]; ix <= support[0]; ix++)
     600             :                             {
     601           0 :                               iloc[0]=abs((int)(sampling[0]*ix+off[0]));
     602           0 :                               wt = convFunc[iloc[0]]*convFunc[iloc[1]];
     603             : 
     604           0 :                               igrdpos[0]=loc[0]+ix;
     605             :                               // grid(grdpos) += nvalue*wt;
     606             : 
     607             :                               // The following uses raw index on the 4D grid
     608           0 :                               addTo4DArray(gridStore,iPosPtr,nvalue,wt);
     609             : 
     610             : //oldAddresses.push_back (& gridStore[igrdpos[0] + igrdpos[1]*gridIncrements[1] + igrdpos[2]*gridIncrements[2] +
     611             : //                                  igrdpos[3]*gridIncrements[3]]);
     612             : 
     613           0 :                               norm+=wt;
     614             :                             }
     615             :                         }
     616             : #else
     617             : 
     618             :                       // New Inner Loop
     619             : 
     620             : //vector<const T*> newAddresses;
     621             : 
     622             : 
     623             :                       const Int X = 0;
     624             :                       const Int Y = 1;
     625             :                       const Int Z1 = 2; // channel
     626             :                       const Int Z2 = 3; // polarization
     627             : 
     628             :                       Int gridZ1 = igrdpos[Z1]; // Third grid coordinate, Z1
     629             :                       Int gridZ2 = igrdpos[Z2]; // Fourth grid coordinate, Z2
     630             : 
     631             :                       T * gridStoreZ1Z2 = gridStore + gridZ1 * gridIncrements [Z1] +
     632             :                                           gridZ2 * gridIncrements [Z2];
     633             :                           // Position of origin of xy plane specified by Z1, Z2
     634             : 
     635             :                       T * gridStoreYZ1Z2 =
     636             :                               gridStoreZ1Z2 + gridIncrements [Y] * (loc[Y] - support[Y] - 1);
     637             :                           // Position of origin of lower left corner of rectangle
     638             :                           // of XY plane used in convolution
     639             : 
     640             :                       //const Int offX = off[X];
     641             :                       //const Int offY = off[Y];
     642             :                       const Int yIncrement = gridIncrements [Y];
     643             :                       const Int x0 = (loc[X] - support[X]) - 1;
     644             :                       const Int xMax = support[X];
     645             :                       const Int nX = xMax * 2 + 1;
     646             :                       const Int yMax = support[Y];
     647             :                       const Int nY = yMax * 2 + 1;
     648             :                       const Double * pConvolutionLookupY = pConvolutionLookupY0;
     649             : 
     650             :                       for(Int iy=0; iy < nY ; iy ++)
     651             :                       {
     652             :                           const Double convFuncY = * pConvolutionLookupY ++;
     653             :                           const Double * __restrict__ pConvolutionLookupX = pConvolutionLookupX0;
     654             : 
     655             :                           gridStoreYZ1Z2 += yIncrement;
     656             :                           T * __restrict__ gridStoreXYZ1Z2 = gridStoreYZ1Z2 + x0;
     657             : 
     658             :                           for (const Double * pConvolutionLookupX = pConvolutionLookupX0;
     659             :                                pConvolutionLookupX != pConvolutionLookupXEnd;
     660             :                                pConvolutionLookupX ++){
     661             : //                        for(Int ix=0; ix < nX; ix ++)
     662             : //                        {
     663             :                               wt = (* pConvolutionLookupX) * convFuncY;
     664             : 
     665             :                               gridStoreXYZ1Z2 += 1;
     666             : //newAddresses.push_back (gridStoreXYZ1Z2);
     667             :                               * gridStoreXYZ1Z2 += (nvalue * wt);
     668             :                               //multiplyAndAdd (gridStoreXYZ1Z2, nvalue, wt);
     669             : 
     670             :                               //norm += wt;
     671             :                           }
     672             :                       }
     673             : 
     674             :                       norm = Norm;
     675             : 
     676             : 
     677             : #endif
     678             : 
     679             :                       //                      sumwtPtr[apol+achan*nGridPol]+=imgWt*norm;
     680           0 :                       sumwt(apol,achan)+=imgWt*norm;
     681             :                     }
     682             :                   }
     683             :                 }
     684             :               }
     685             :             }
     686             :           }
     687             :         }
     688             :       }
     689             :     }
     690           0 :     T *tt=(T *)gridStore;
     691           0 :     grid.putStorage(tt,gDummy);
     692           0 :   }
     693             : 
     694             : 
     695             : using namespace casacore;
     696             : };// end namespace casa

Generated by: LCOV version 1.16