LCOV - code coverage report
Current view: top level - synthesis/ImagerObjects - SIMapperCollection.cc (source / functions) Hit Total Coverage
Test: casa_coverage.info Lines: 178 293 60.8 %
Date: 2023-10-25 08:47:59 Functions: 21 31 67.7 %

          Line data    Source code
       1             : //# SIMapperCollection.cc: Implementation of Imager.h
       2             : //# Copyright (C) 1997-2008
       3             : //# Associated Universities, Inc. Washington DC, USA.
       4             : //#
       5             : //# This program is free software; you can redistribute it and/or modify it
       6             : //# under the terms of the GNU General Public License as published by the Free
       7             : //# Software Foundation; either version 2 of the License, or (at your option)
       8             : //# any later version.
       9             : //#
      10             : //# This program is distributed in the hope that it will be useful, but WITHOUT
      11             : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12             : //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
      13             : //# more details.
      14             : //#
      15             : //# You should have received a copy of the GNU General Public License along
      16             : //# with this program; if not, write to the Free Software Foundation, Inc.,
      17             : //# 675 Massachusetts Ave, Cambridge, MA 02139, USA.
      18             : //#
      19             : //# Correspondence concerning AIPS++ should be addressed as follows:
      20             : //#        Internet email: aips2-request@nrao.edu.
      21             : //#        Postal address: AIPS++ Project Office
      22             : //#                        National Radio Astronomy Observatory
      23             : //#                        520 Edgemont Road
      24             : //#                        Charlottesville, VA 22903-2475 USA
      25             : //#
      26             : //# $Id$
      27             : 
      28             : #include <casacore/casa/Exceptions/Error.h>
      29             : #include <iostream>
      30             : #include <sstream>
      31             : 
      32             : #include <casacore/casa/Arrays/Matrix.h>
      33             : #include <casacore/casa/Arrays/ArrayMath.h>
      34             : #include <casacore/casa/Arrays/ArrayLogical.h>
      35             : 
      36             : #include <casacore/casa/Logging.h>
      37             : #include <casacore/casa/Logging/LogIO.h>
      38             : #include <casacore/casa/Logging/LogMessage.h>
      39             : #include <casacore/casa/Logging/LogSink.h>
      40             : #include <casacore/casa/Logging/LogMessage.h>
      41             : 
      42             : #include <casacore/casa/OS/DirectoryIterator.h>
      43             : #include <casacore/casa/OS/File.h>
      44             : #include <casacore/casa/OS/Path.h>
      45             : 
      46             : #include <casacore/casa/OS/HostInfo.h>
      47             : 
      48             : #include <casacore/ms/MeasurementSets/MSHistoryHandler.h>
      49             : #include <casacore/ms/MeasurementSets/MeasurementSet.h>
      50             : 
      51             : #include <synthesis/ImagerObjects/SIMapperCollection.h>
      52             : #include <synthesis/ImagerObjects/SynthesisUtilMethods.h>
      53             : 
      54             : #include <synthesis/TransformMachines/VisModelData.h>
      55             : #include <casacore/images/Regions/WCBox.h>
      56             : #include <msvis/MSVis/VisibilityIteratorImpl2.h>
      57             : #include <msvis/MSVis/VisBufferComponents2.h>
      58             : 
      59             : #include <sys/types.h>
      60             : #include <unistd.h>
      61             : using namespace std;
      62             : 
      63             : using namespace casacore;
      64             : namespace casa { //# NAMESPACE CASA - BEGIN
      65             : 
      66             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
      67             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
      68             : 
      69        1650 :   SIMapperCollection::SIMapperCollection()
      70             :   {
      71        3300 :     LogIO os( LogOrigin("SIMapperCollection","Construct a mapperCollection",WHERE) );
      72             : 
      73        1650 :     itsMappers.resize(0);
      74        1650 :     oldMsId_p=-1;
      75        1650 :     itsIsNonZeroModel=false;
      76             : 
      77        1650 :   }
      78             : 
      79             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
      80             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
      81             : 
      82        1650 :   SIMapperCollection::~SIMapperCollection()
      83             :   {
      84        1650 :   }
      85             : 
      86             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
      87             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
      88             : 
      89        3449 :   Bool SIMapperCollection::releaseImageLocks()
      90             :   {
      91        3449 :     Bool validflag=true;
      92        7092 :     for(Int mapperid=0;mapperid<nMappers();mapperid++ )
      93             :       {
      94        3643 :         validflag &= itsMappers[mapperid]->releaseImageLocks();
      95             :       }
      96        3449 :     return validflag;
      97             :   }
      98             : 
      99             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     100             :     //////////////////////////////////////////////////////////////////////////////////////////////////////
     101             : 
     102        2569 :   std::vector<String> SIMapperCollection::cleanupTempFiles(const String& mess)
     103             :   {
     104        2569 :     std::vector<String> outstr;
     105        5410 :     auto appvectors = [](std::vector<String>&  a, const std::vector<String> b) {  a.insert(std::end(a), std::begin(b), std::end(b));};
     106        5274 :     for(Int mapperid=0;mapperid<nMappers();mapperid++ )
     107             :       {
     108        2705 :         if((itsMappers[mapperid]->getFTM2())){
     109        2705 :           appvectors( outstr, (itsMappers[mapperid]->getFTM2(True)->cleanupTempFiles(mess)).tovector());
     110        2705 :           appvectors(outstr, (itsMappers[mapperid]->getFTM2(False)->cleanupTempFiles(mess)).tovector());
     111             :         }
     112             :       }
     113        5138 :     return outstr;
     114             :   }
     115             : 
     116             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     117             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     118             : 
     119             :   /*
     120             :   // Allocate Memory and open images.
     121             :   void SIMapperCollection::addMapper( String mappertype,
     122             :                                       CountedPtr<SIImageStore> imagestore,
     123             :                                       CountedPtr<FTMachine> ftmachine,
     124             :                                       CountedPtr<FTMachine> iftmachine)
     125             :   {
     126             : 
     127             :     LogIO os( LogOrigin("SIMapperCollection","addMapper",WHERE) );
     128             : 
     129             :     CountedPtr<SIMapper> localMapper=NULL;
     130             :     Int nMappers = itsMappers.nelements();
     131             :     // Check 'mappertype' for valid types....
     132             :     if( mappertype == "default" )
     133             :       {
     134             :         localMapper = new SIMapperSingle( imagestore, ftmachine, iftmachine, nMappers );
     135             :       }
     136             : 
     137             :     else if( mappertype == "multiterm" )
     138             :       {
     139             :         localMapper = new SIMapperMultiTerm( imagestore, ftmachine, iftmachine,nMappers, ntaylorterms );
     140             :       }
     141             : 
     142             :     else
     143             :       {
     144             :         throw ( AipsError("Internal Error : Unrecognized Mapper Type in MapperCollection.addMapper") );
     145             :       }
     146             : 
     147             :     // If all is well, add to the list.
     148             :     itsMappers.resize(nMappers+1, true);
     149             :     itsMappers[nMappers] = localMapper;
     150             : 
     151             :   }
     152             :   */
     153             : 
     154             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     155             : 
     156             : 
     157             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     158        1707 :   void SIMapperCollection::addMapper( CountedPtr<SIMapper> map){
     159        1707 :     Int nMappers = itsMappers.nelements();
     160        1707 :     itsMappers.resize(nMappers+1, true);
     161        1707 :     itsMappers[nMappers]=map;
     162        1707 :   }
     163             : 
     164       24157 :   Int SIMapperCollection::nMappers()
     165             :   {
     166       24157 :     return itsMappers.nelements();
     167             :   }
     168             : 
     169             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     170             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     171             : 
     172           0 :   Vector<String> SIMapperCollection::getImageNames()
     173             :   {
     174           0 :     Vector<String> names( nMappers() );
     175             : 
     176           0 :     for(Int mapperid=0;mapperid<nMappers();mapperid++ )
     177             :       {
     178           0 :         names[mapperid] = itsMappers[mapperid]->getImageName();
     179             :       }
     180             : 
     181           0 :     return names;
     182             :   }
     183             : 
     184             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     185             :   ///////////////////  Start VB dependent code /////////////////////////////////////////////
     186        2198 :   void SIMapperCollection::initializeGrid(vi::VisBuffer2& vb, Bool dopsf, const Int mapperid)
     187             :   {
     188        2198 :     if(mapperid<0)
     189             :       {
     190        4522 :         for (uInt k=0; k < itsMappers.nelements(); ++k)
     191             :           {
     192        2325 :             (itsMappers[k])->initializeGrid(vb,dopsf,true);
     193             :           }
     194             :       }
     195             :     else
     196             :       {
     197           0 :         if (mapperid > (Int)itsMappers.nelements())
     198           0 :           throw ( AipsError("Internal Error : SIMapperCollection::initializeGrid(): mapperid out of range") );
     199           0 :         else itsMappers[mapperid]->initializeGrid(vb, dopsf, true);
     200             :       }
     201        2197 :   }
     202             : 
     203        2198 : void SIMapperCollection::initializeGrid(vi::VisibilityIterator2& vi, Bool dopsf, const Int mapperid)
     204             :   {
     205             : 
     206        2198 :     vi::VisBuffer2 *vb=vi.getVisBuffer();
     207        2198 :     initializeGrid(*vb, dopsf, mapperid);
     208        2197 :     if(mapperid<0)
     209             :       {
     210        4521 :         for (uInt k=0; k < itsMappers.nelements(); ++k)
     211             :           {
     212        2324 :             ((itsMappers[k])->getFTM2())->initBriggsWeightor(vi);
     213             :           }
     214             :       }
     215             :     else
     216             :       {
     217           0 :         if (mapperid > (Int)itsMappers.nelements())
     218           0 :           throw ( AipsError("Internal Error : SIMapperCollection::initializeGrid(): mapperid out of range") );
     219           0 :         else (itsMappers[mapperid]->getFTM2())->initBriggsWeightor(vi);
     220             :       }
     221        2197 :   }
     222             : 
     223             :   ////////////////////////////////////////////////////////////////////////////////////
     224             :   /////////////////////////////////OLD vi/vb //////////////////////////////////////////////
     225           0 :   void SIMapperCollection::initializeGrid(VisBuffer& vb, Bool dopsf, const Int mapperid)
     226             :   {
     227           0 :     if(mapperid<0)
     228             :       {
     229           0 :         for (uInt k=0; k < itsMappers.nelements(); ++k)
     230             :           {
     231           0 :             (itsMappers[k])->initializeGrid(vb,dopsf,true);
     232             :           }
     233             :       }
     234             :     else
     235             :       {
     236           0 :         if (mapperid > (Int)itsMappers.nelements())
     237           0 :           throw ( AipsError("Internal Error : SIMapperCollection::initializeGrid(): mapperid out of range") );
     238           0 :         else itsMappers[mapperid]->initializeGrid(vb, dopsf, true);
     239             :       }
     240           0 :   }
     241             : 
     242             :   //////////////////////////////////////////////////////////////////////////////
     243             : 
     244      666536 :   void SIMapperCollection::grid(vi::VisBuffer2& vb, Bool dopsf, refim::FTMachine::Type col,
     245             :                                 Int mapperid)
     246             :   {
     247      666536 :     if( itsIsNonZeroModel == true ) // Try to subtract model visibilities only if a model exists.
     248             :         {
     249      149666 :           if(col==refim::FTMachine::CORRECTED){
     250             :         //Dang i thought the new vb will return Data or FloatData if correctedData was
     251             :         //not there
     252      144554 :             if(!vb.existsColumn(VisBufferComponent2::VisibilityCorrected)){
     253       61460 :               col=refim::FTMachine::OBSERVED;
     254             :               //                          cerr << "Max of visCube" << max(vb.visCube()) << " model " << max(vb.modelVisCube())<< endl;
     255       61460 :               vb.setVisCube(vb.visCube()-vb.visCubeModel());
     256             :             }
     257             :             else{
     258       83094 :               vb.setVisCubeCorrected(vb.visCubeCorrected()-vb.visCubeModel());
     259             :             }
     260             :           }
     261        5112 :           else if (col==refim::FTMachine::OBSERVED) {
     262        5112 :             vb.setVisCube(vb.visCube()-vb.visCubeModel());
     263             :           }
     264             :         }// if non zero model
     265             : 
     266      666536 :     if(col==refim::FTMachine::CORRECTED && !vb.existsColumn(VisBufferComponent2::VisibilityCorrected)) {
     267             :       //cout << "Corrected column isn't there, using data instead" << endl;
     268      298237 :       col=refim::FTMachine::OBSERVED;
     269             :     }
     270             : 
     271      666536 :     if (mapperid < 0)
     272             :       {
     273             :         //cout << "Using column : " << col << endl;
     274     1346367 :         for (uInt k=0; k < itsMappers.nelements(); ++k)
     275             :           {
     276      680504 :             (itsMappers[k])->grid(vb, dopsf, col);
     277             :           }
     278             :       }
     279             :     else
     280             :       {
     281         672 :         if (mapperid > (Int)itsMappers.nelements())
     282           0 :           throw ( AipsError("Internal Error : SIMapperCollection::grid(): mapperid out of range") );
     283         672 :         else itsMappers[mapperid]->grid(vb, dopsf, col);
     284             :       }
     285      666535 :   }
     286             : 
     287             : ///////////////////
     288             :   ///////////////////////////////////////OLD VI/VB ///////////////////////////////////
     289           0 :   void SIMapperCollection::grid(VisBuffer& vb, Bool dopsf, FTMachine::Type col,
     290             :                                 Int mapperid)
     291             :   {
     292           0 :     if( itsIsNonZeroModel == true ) // Try to subtract model visibilities only if a model exists.
     293             :         {
     294           0 :           if(col==FTMachine::CORRECTED){
     295           0 :                   if(vb.msColumns().correctedData().isNull()){
     296           0 :                           col=FTMachine::OBSERVED;
     297             :                           //                      cerr << "Max of visCube" << max(vb.visCube()) << " model " << max(vb.modelVisCube())<< endl;
     298           0 :                           vb.visCube()-=vb.modelVisCube();
     299             :                   }
     300             :                   else{
     301           0 :                           vb.correctedVisCube()-=vb.modelVisCube();
     302             :                   }
     303             :           }
     304           0 :           else if (col==FTMachine::OBSERVED) {
     305           0 :                           vb.visCube()-=vb.modelVisCube();
     306             :             }
     307             :         }// if non zero model
     308             : 
     309           0 :     if(col==FTMachine::CORRECTED && vb.msColumns().correctedData().isNull())
     310           0 :       {     col=FTMachine::OBSERVED;}
     311             : 
     312           0 :     if (mapperid < 0)
     313             :       {
     314           0 :         for (uInt k=0; k < itsMappers.nelements(); ++k)
     315             :           {
     316           0 :             (itsMappers[k])->grid(vb, dopsf, col);
     317             : 
     318             :           }
     319             :       }
     320             :     else
     321             :       {
     322           0 :         if (mapperid > (Int)itsMappers.nelements())
     323           0 :           throw ( AipsError("Internal Error : SIMapperCollection::grid(): mapperid out of range") );
     324           0 :         else itsMappers[mapperid]->grid(vb, dopsf, col);
     325             :       }
     326           0 :   }
     327             :   ///////////////////////////////
     328             :   ////////////////////////////////
     329        2190 :   void SIMapperCollection::finalizeGrid(vi::VisBuffer2& vb, Bool dopsf,const Int mapperid)
     330             :   {
     331        2190 :     if(mapperid<0)
     332             :       {
     333        4507 :         for (uInt k=0; k < itsMappers.nelements(); ++k)
     334             :           {
     335        2317 :             (itsMappers[k])->finalizeGrid(vb, dopsf);
     336             :           }
     337             :       }
     338             :     else
     339             :       {
     340           0 :         if (mapperid > (Int)itsMappers.nelements())
     341           0 :           throw ( AipsError("Internal Error : SIMapperCollection::finalizeGrid(): mapperid out of range") );
     342           0 :         else itsMappers[mapperid]->finalizeGrid(vb, dopsf);
     343             :       }
     344        2190 :   }
     345             : 
     346             : 
     347             :   ////////////////////////////////////////////////////////////////////////////////////////////////////////
     348             :   /////////////////////////////////////////////OLD VI/VB////////////////////////////////////////////////
     349           0 :   void SIMapperCollection::finalizeGrid(VisBuffer& vb, Bool dopsf,const Int mapperid)
     350             :   {
     351           0 :     if(mapperid<0)
     352             :       {
     353           0 :         for (uInt k=0; k < itsMappers.nelements(); ++k)
     354             :           {
     355           0 :             (itsMappers[k])->finalizeGrid(vb, dopsf);
     356             :           }
     357             :       }
     358             :     else
     359             :       {
     360           0 :         if (mapperid > (Int)itsMappers.nelements())
     361           0 :           throw ( AipsError("Internal Error : SIMapperCollection::finalizeGrid(): mapperid out of range") );
     362           0 :         else itsMappers[mapperid]->finalizeGrid(vb, dopsf);
     363             :       }
     364           0 :   }
     365             : 
     366             : 
     367             : //////////////////////////////////////////////////////////////////////////////////////////////////////
     368        1421 :   void SIMapperCollection::initializeDegrid(vi::VisBuffer2& vb, const Int mapperid)
     369             :     {
     370             : 
     371        1421 :       itsIsNonZeroModel = anyNonZeroModels();
     372             : 
     373        1421 :       if( itsIsNonZeroModel == true )
     374             :         {
     375             :           //      vb.setModelVisCube( Complex(0.0,0.0) );
     376             : 
     377         790 :           if(mapperid<0)
     378             :             {
     379        1603 :               for (uInt k=0; k < itsMappers.nelements(); ++k)
     380             :                 {
     381         813 :                   (itsMappers[k])->initializeDegrid(vb);
     382             :                 }
     383             :             }
     384             :           else
     385             :             {
     386           0 :               if (mapperid > (Int)itsMappers.nelements())
     387           0 :                 throw ( AipsError("Internal Error : SIMapperCollection::initializeDegrid(): mapperid out of range") );
     388           0 :               else itsMappers[mapperid]->initializeDegrid(vb);
     389             :             }
     390             : 
     391             :         }// if non zero model
     392        1421 :     }
     393             : 
     394             : 
     395             : 
     396             : ///////////////////////////////////////OLD VI/VB ///////////////////////////////////////////////////
     397           0 :   void SIMapperCollection::initializeDegrid(VisBuffer& vb, const Int mapperid)
     398             :     {
     399             : 
     400           0 :       itsIsNonZeroModel = anyNonZeroModels();
     401             : 
     402           0 :       if( itsIsNonZeroModel == true )
     403             :         {
     404             :           //      vb.setModelVisCube( Complex(0.0,0.0) );
     405             : 
     406           0 :           if(mapperid<0)
     407             :             {
     408           0 :               for (uInt k=0; k < itsMappers.nelements(); ++k)
     409             :                 {
     410           0 :                   (itsMappers[k])->initializeDegrid(vb);
     411             :                 }
     412             :             }
     413             :           else
     414             :             {
     415           0 :               if (mapperid > (Int)itsMappers.nelements())
     416           0 :                 throw ( AipsError("Internal Error : SIMapperCollection::initializeDegrid(): mapperid out of range") );
     417           0 :               else itsMappers[mapperid]->initializeDegrid(vb);
     418             :             }
     419             : 
     420             :         }// if non zero model
     421           0 :     }
     422             : 
     423             :   ////////////////////////////////////////////////////////////////////////////////////////////////
     424      316691 :   void SIMapperCollection::degrid(vi::VisBuffer2& vb, Bool saveVirtualMod, const Int mapperid)
     425             :     {
     426      316691 :       if( itsIsNonZeroModel == true )
     427             :         {
     428      158394 :           if(mapperid<0)
     429             :             {
     430      320928 :               for (uInt k=0; k < itsMappers.nelements(); ++k)
     431             :                 {
     432      162534 :                   (itsMappers[k])->degrid(vb);
     433             :                 }
     434             :             }
     435             :           else
     436             :             {
     437           0 :               if (mapperid > (Int)itsMappers.nelements())
     438           0 :                 throw ( AipsError("Internal Error : SIMapperCollection::degrid(): mapperid out of range") );
     439           0 :               else itsMappers[mapperid]->degrid(vb);
     440             :             }
     441             : 
     442      158394 :           if(saveVirtualMod){
     443        8160 :             saveVirtualModel(vb);
     444             :           }
     445             :         }// if non zero model
     446      316691 :     }
     447             : 
     448         596 :   void SIMapperCollection::addPB(vi::VisBuffer2& vb, PBMath& pbMath, const MDirection& altDir, const Bool useAltDir)
     449             :   {
     450        1244 :     for (uInt k=0; k < itsMappers.nelements(); ++k)
     451             :       {
     452         648 :         (itsMappers[k])->addPB(vb,pbMath, altDir, useAltDir);
     453             : 
     454             :       }
     455         596 :   }
     456             : 
     457             : 
     458             :   /////////////////////////////////////OLD VI/VB ////////////////////////////////////////////////////
     459           0 :   void SIMapperCollection::degrid(VisBuffer& vb, Bool saveVirtualMod, const Int mapperid)
     460             :     {
     461           0 :       if( itsIsNonZeroModel == true )
     462             :         {
     463           0 :           if(mapperid<0)
     464             :             {
     465           0 :               for (uInt k=0; k < itsMappers.nelements(); ++k)
     466             :                 {
     467           0 :                   (itsMappers[k])->degrid(vb);
     468             :                 }
     469             :             }
     470             :           else
     471             :             {
     472           0 :               if (mapperid > (Int)itsMappers.nelements())
     473           0 :                 throw ( AipsError("Internal Error : SIMapperCollection::degrid(): mapperid out of range") );
     474           0 :               else itsMappers[mapperid]->degrid(vb);
     475             :             }
     476             : 
     477           0 :           if(saveVirtualMod){
     478           0 :             saveVirtualModel(vb);
     479             :           }
     480             :         }// if non zero model
     481           0 :     }
     482             : 
     483             : 
     484             :   /////
     485             :   /////////////
     486           0 :   void SIMapperCollection::saveVirtualModel(VisBuffer& vb){
     487             : 
     488             : 
     489             : 
     490           0 :           if(vb.msId() != oldMsId_p){
     491           0 :                   oldMsId_p=vb.msId();
     492             :                   /*Block< Vector<Int> > blockNGroup;
     493             :                                 Block< Vector<Int> > blockStart;
     494             :                                 Block< Vector<Int> > blockWidth;
     495             :                                 Block< Vector<Int> > blockIncr;
     496             :                                 Block< Vector<Int> > blockSpw;
     497             :                                 vb.getChannelSelection(blockNGroup, blockStart, blockWidth, blockIncr, blockSpw);
     498             :                                 Vector<Int> fields = vb.msColumns().fieldId().getColumn();
     499             :                                 const Int option = Sort::HeapSort | Sort::NoDuplicates;
     500             :                                 const Sort::Order order = Sort::Ascending;
     501             :                                 Int nfields = GenSort<Int>::sort (fields, order, option);
     502             : 
     503             :                                 // Make sure  we have the right size
     504             : 
     505             :                                 fields.resize(nfields, true);
     506             :                    */
     507             :                   //Int msid = vb.msId();
     508           0 :                   ROVisibilityIterator *viloc=vb.getVisibilityIterator();
     509           0 :                   for (uInt k=0; k < itsMappers.nelements(); ++k){
     510           0 :                           Record rec;
     511           0 :                           String modImage=viloc->ms().getPartNames()[0];
     512           0 :                           if(!((viloc->ms()).source().isNull()))
     513           0 :                             modImage=(viloc->ms()).source().tableName();
     514           0 :                           modImage=File::newUniqueName(modImage, "FT_MODEL").absoluteName();
     515           0 :                           Bool iscomp=itsMappers[k]->getCLRecord(rec);
     516           0 :                           if(iscomp || itsMappers[k]->getFTMRecord(rec, modImage)){
     517             : 
     518             :                                   //VisModelData::putModel(vb.getVisibilityIterator()->ms(), rec, fields, blockSpw[msid], blockStart[msid],
     519             :                                   //            blockWidth[msid], blockIncr[msid],
     520             :                                   //                         iscomp, true);
     521           0 :                                   VisibilityIterator * elvi=(dynamic_cast<VisibilityIterator* >(vb.getVisibilityIterator()));
     522           0 :                                   if(elvi)
     523           0 :                                           elvi->putModel(rec, iscomp, true);
     524             :                                   //                              VisModelData::listModel(vb.getVisibilityIterator()->ms());
     525             :                           }
     526             : 
     527             :                   }
     528             : 
     529             : 
     530             : 
     531             :           }
     532             : 
     533             : 
     534             : 
     535           0 :   }
     536             : 
     537        8160 :   void SIMapperCollection::saveVirtualModel(vi::VisBuffer2& vb){
     538             : 
     539             : 
     540             : 
     541        8160 :           if(vb.msId() != oldMsId_p){
     542          17 :             oldMsId_p=vb.msId();
     543             : 
     544          34 :             for (uInt k=0; k < itsMappers.nelements(); ++k){
     545          34 :               Record rec;
     546          34 :               String modImage=vb.ms().getPartNames()[0];
     547          17 :               if(!((vb.ms()).source().isNull()))
     548          17 :                 modImage=(vb.ms()).source().tableName();
     549          17 :               modImage=File::newUniqueName(modImage, "FT_MODEL").absoluteName();
     550          17 :               Bool iscomp=itsMappers[k]->getCLRecord(rec);
     551          17 :               if(iscomp || itsMappers[k]->getFTMRecord(rec, modImage)){
     552             : 
     553             :                 ////Darn not implemented
     554             :                 //static_cast<VisibilityIteratorImpl2 *>(viloc->getImpl())->writeModel(rec, //iscomp, true);
     555             : 
     556          17 :                 if(!iscomp && Table::isReadable(modImage)){
     557             :                   //make sure complex image is of compliant size/shape
     558          15 :                   (itsMappers[k]->imageStore())->intersectComplexImage(modImage);
     559             : 
     560             :                 }
     561          17 :                 VisibilityIterator2* vi=const_cast<VisibilityIterator2*>(vb.getVi());
     562          17 :                 const_cast<MeasurementSet& >(vi->ms()).lock();
     563             :                 /////TESTOO
     564             :                 //Int CPUID;
     565             :                 //MPI_Comm_rank(MPI_COMM_WORLD, &CPUID);
     566             :                 //cerr << CPUID << " writing " << modImage << endl;
     567             :                 /////////////////
     568          17 :                 vi->writeModel(rec, iscomp, true);
     569          17 :                 const_cast<MeasurementSet& >(vi->ms()).unlock();
     570             :                                   //                              VisModelData::listModel(vb.getVisibilityIterator()->ms());
     571             :                           }
     572             : 
     573             :                   }
     574             : 
     575             : 
     576             : 
     577             :           }
     578             : 
     579             : 
     580             : 
     581        8160 :   }
     582             : 
     583             : 
     584             :   /////////////////////////////////////////////////////////
     585        1421 :   void SIMapperCollection::finalizeDegrid(vi::VisBuffer2& /*vb*/, const Int mapperid)
     586             :     {
     587        1421 :       if( itsIsNonZeroModel == true )
     588             :         {
     589         790 :           if(mapperid<0)
     590             :             {
     591        1603 :               for (uInt k=0; k < itsMappers.nelements(); ++k)
     592             :                 {
     593         813 :                   (itsMappers[k])->finalizeDegrid();
     594             : 
     595             :                 }
     596             :             }
     597             :           else
     598             :             {
     599           0 :               if (mapperid > (Int)itsMappers.nelements())
     600           0 :                 throw ( AipsError("Internal Error : SIMapperCollection::finalizeDegrid(): mapperid out of range") );
     601           0 :               else itsMappers[mapperid]->finalizeDegrid();
     602             :             }
     603             :         }// if non zero model
     604        1421 :     }
     605             : 
     606             :  ////////////////////////////////////////////////////////
     607           0 :   void SIMapperCollection::finalizeDegrid(VisBuffer& /*vb*/, const Int mapperid)
     608             :     {
     609           0 :       if( itsIsNonZeroModel == true )
     610             :         {
     611           0 :           if(mapperid<0)
     612             :             {
     613           0 :               for (uInt k=0; k < itsMappers.nelements(); ++k)
     614             :                 {
     615           0 :                   (itsMappers[k])->finalizeDegrid();
     616             : 
     617             :                 }
     618             :             }
     619             :           else
     620             :             {
     621           0 :               if (mapperid > (Int)itsMappers.nelements())
     622           0 :                 throw ( AipsError("Internal Error : SIMapperCollection::finalizeDegrid(): mapperid out of range") );
     623           0 :               else itsMappers[mapperid]->finalizeDegrid();
     624             :             }
     625             :         }// if non zero model
     626           0 :     }
     627             : 
     628             : 
     629         564 :   void SIMapperCollection::initPB()
     630             :   {
     631        1180 :     for (uInt k=0; k < itsMappers.nelements(); ++k)
     632             :       {
     633         616 :         (itsMappers[k])->initPB();
     634             :       }
     635         564 :   }
     636             : 
     637           0 :   void SIMapperCollection::addPB(VisBuffer& vb, PBMath& pbMath)
     638             :   {
     639           0 :     for (uInt k=0; k < itsMappers.nelements(); ++k)
     640             :       {
     641           0 :         (itsMappers[k])->addPB(vb,pbMath);
     642             : 
     643             :       }
     644           0 :   }
     645             : 
     646             :   ///////////////////////////////////////////////////////////////////////////////////////////////////////
     647             :   //////////// End of VB dependent code.
     648             :   ///////////////////////////////////////////////////////////////////////////////////////////////////////
     649             : 
     650             : 
     651             : 
     652             :   ///////////////////////////////////////////////////////////////////////////////////////////////////////
     653             :   /////////////////////
     654       17418 :   CountedPtr<SIImageStore> SIMapperCollection::imageStore(Int id)
     655             :   {
     656       17418 :         if(uInt(id) < itsMappers.nelements())
     657             :         {
     658       17418 :                 return (itsMappers[id])->imageStore();
     659             :         }
     660           0 :         return make_shared<SIImageStore>( );
     661             :   }
     662             : /////////////////////////////////////////////////////////////////////////////////////////////
     663             : /////////////////////////////////////////////////////////////////////////////////////////////
     664           0 :   Record SIMapperCollection::getFTMRecord(Int mapperid)
     665             :   {
     666           0 :     AlwaysAssert( mapperid >=0 && mapperid < nMappers() , AipsError );
     667             :     //return itsMappers[mapperid]->getFTMRecord();
     668           0 :     Record rec;
     669           0 :     return rec;
     670             :   }
     671             : 
     672             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     673             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     674             : 
     675        4164 :   void SIMapperCollection::checkOverlappingModels(String action)
     676             :   {
     677             :     // If nothing that overlaps, don't check.
     678        4164 :     if(nMappers()==1) return;
     679             : 
     680         104 :     Int nmodels = nMappers();
     681             : 
     682             :     // If there is no model image (i.e. first major cycle with no starting model), don't check.
     683         104 :     Bool hasmodel=true;
     684         358 :     for (Int model=0;model<(nmodels-1); ++model)
     685         254 :       { hasmodel = hasmodel && ((itsMappers[model])->imageStore())->hasModel();  }
     686         104 :     if( hasmodel==false ) {
     687             :       //cout << "No model images to check overlap for." << endl;
     688          76 :       return;
     689             :     }
     690             : 
     691             :     // Internal check
     692          28 :     AlwaysAssert( action=="blank" || action=="restore" , AipsError );
     693             : 
     694          74 :     for (Int model=0;model<(nmodels-1); ++model)
     695             :       {
     696             :         // Connect to one image for aux info.
     697         138 :         LatticeLocker lockmodel (*(((itsMappers[model])->imageStore())->model()), FileLocker::Write);
     698         138 :         SubImage<Float> modelimage( *(((itsMappers[model])->imageStore())->model()), true );
     699             : 
     700          46 :         uInt nTaylor0 = ((itsMappers[model])->imageStore())->getNTaylorTerms();
     701             : 
     702          92 :         CoordinateSystem cs0=modelimage.coordinates();
     703          92 :         IPosition iblc0(modelimage.shape().nelements(),0);
     704          92 :         IPosition itrc0(modelimage.shape());
     705          46 :         itrc0=itrc0-Int(1);
     706          92 :         LCBox lbox0(iblc0, itrc0, modelimage.shape());
     707          92 :         ImageRegion imagreg0(WCBox(lbox0, cs0));
     708             : 
     709         118 :         for (Int nextmodel=model+1; nextmodel < nmodels; ++nextmodel)
     710             :           {
     711         144 :             LatticeLocker nextlockmodel (*(((itsMappers[nextmodel])->imageStore())->model()), FileLocker::Write);
     712         144 :             SubImage<Float> nextmodelimage( *(((itsMappers[nextmodel])->imageStore())->model()) , true);
     713             : 
     714          72 :             uInt nTaylor1 = ((itsMappers[nextmodel])->imageStore())->getNTaylorTerms();
     715             : 
     716          72 :             CoordinateSystem cs=nextmodelimage.coordinates();
     717          72 :             IPosition iblc(nextmodelimage.shape().nelements(),0);
     718          72 :             IPosition itrc(nextmodelimage.shape());
     719          72 :             itrc=itrc-Int(1);
     720          72 :             LCBox lbox(iblc, itrc, nextmodelimage.shape());
     721          72 :             ImageRegion imagreg(WCBox(lbox, cs));
     722             : 
     723             :             try{
     724             : 
     725          72 :               if( action.matches("blank") )
     726             :                 {
     727             : 
     728             :                   //cerr << "blank MODEL image shape " << modelimage.shape() << "  " << nextmodelimage.shape() << endl;
     729             : 
     730          72 :                   LatticeRegion latReg=imagreg.toLatticeRegion(modelimage.coordinates(), modelimage.shape());
     731             : 
     732           7 :                   for(uInt taylor=0;taylor<min(nTaylor0,nTaylor1);taylor++)
     733             :                     { // loop for taylor term
     734          12 :                       SubImage<Float> modelim( *(((itsMappers[model])->imageStore())->model(taylor)), true );
     735           8 :                       SubImage<Float> partToMask(modelim, imagreg, true);
     736           8 :                       LatticeLocker lock1 (partToMask, FileLocker::Write);
     737           8 :                       ArrayLattice<Bool> pixmask(latReg.get());
     738          12 :                       LatticeExpr<Float> myexpr(iif(pixmask, 0.0, partToMask) );
     739           4 :                       partToMask.copyData(myexpr);
     740             :                     }
     741             : 
     742             : 
     743             :                 }
     744             :               else // "restore"
     745             :                 {
     746             :                   //cerr << "rsetore MODEL image shape " << modelimage.shape() << "  " << nextmodelimage.shape() << endl;
     747          72 :                 LatticeRegion latReg0=imagreg0.toLatticeRegion(nextmodelimage.coordinates(), nextmodelimage.shape());
     748          64 :                 LatticeRegion latReg=imagreg.toLatticeRegion(modelimage.coordinates(), modelimage.shape());
     749           6 :                 ArrayLattice<Bool> pixmask(latReg.get());
     750             : 
     751             : 
     752           7 :                 for(uInt taylor=0;taylor<min(nTaylor0,nTaylor1);taylor++)
     753             :                   {// loop for taylor term
     754          12 :                     SubImage<Float> modelim( *(((itsMappers[model])->imageStore())->model(taylor)), true );
     755          12 :                     SubImage<Float> nextmodelim( *(((itsMappers[nextmodel])->imageStore())->model(taylor)), true );
     756             : 
     757           8 :                     SubImage<Float> partToMerge(nextmodelim, imagreg0, true);
     758           8 :                     SubImage<Float> partToUnmask(modelim, imagreg, true);
     759           8 :                     LatticeLocker lock1 (partToUnmask, FileLocker::Write);
     760           8 :                     LatticeLocker lock2 (partToMerge, FileLocker::Write);
     761          12 :                     LatticeExpr<Float> myexpr0(iif(pixmask,partToMerge,partToUnmask));
     762           4 :                     partToUnmask.copyData(myexpr0);
     763             :                   }
     764             : 
     765             :                 }
     766             :             }
     767         132 :             catch(AipsError &x){
     768             :               //              cout << "Hmm.... in here : "<< x.getMesg() << endl;
     769             :               //no overlap you think ?
     770             :               /*
     771             :                 os << LogIO::WARN
     772             :                 << "no overlap or failure of copying the clean components"
     773             :                 << x.getMesg()
     774             :                 << LogIO::POST;
     775             :         */
     776          66 :               continue;
     777             :             }
     778             :           }
     779             :       }
     780             :   }
     781             : 
     782             :   ////////////////////////////////////////////////////////////////////////////////////////////////////
     783             :   ///////////////////////////////////////////////////////////////////////////////////////////////////
     784         677 :   Long SIMapperCollection::estimateRAM(){
     785         677 :     Long mem=0;
     786        1406 :         for (uInt k=0; k < itsMappers.nelements(); ++k)
     787             :           {
     788         729 :             if(! ((itsMappers[k])->getFTM2()))
     789           0 :               throw(AipsError("No VI/VB2 FTMachine set"));
     790             :             ///IFT
     791         729 :             if(((itsMappers[k])->getFTM2())->estimateRAM(((itsMappers[k])->imageStore()))> 0){
     792         729 :               mem+=((itsMappers[k])->getFTM2())->estimateRAM(((itsMappers[k])->imageStore()));
     793             :             //FT
     794         729 :               mem+=((itsMappers[k])->getFTM2(False))->estimateRAM(((itsMappers[k])->imageStore()));
     795             :             }
     796             :             else{
     797             :               //Assuming double precision...ignoring padding etc.
     798           0 :               mem+=6*sizeof(float)*(((itsMappers[k])->imageStore())->getShape().product());
     799             :             }
     800             :             //Imagestorages
     801         729 :             mem+=((itsMappers[k])->imageStore())->estimateRAM();
     802             :           }
     803         677 :         return mem;
     804             :   }
     805             : 
     806             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     807             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     808             : 
     809        1421 :   Bool SIMapperCollection::anyNonZeroModels()
     810             :   {
     811        1421 :     Bool validmodel=false;
     812             :     // If any one Mapper has a valid and nonzero model, return true.
     813        2917 :     for (Int model=0;model<nMappers(); ++model)
     814             :       {
     815        1496 :         validmodel |= (! ( ((itsMappers[model])->imageStore())->isModelEmpty() ));
     816             :       }
     817        1421 :     return validmodel;
     818             :   }
     819             :   //////////////////////////////////////////////////////////////////////////////////////////////////////
     820             : 
     821             : } //# NAMESPACE CASA - END
     822             : 

Generated by: LCOV version 1.16