LCOV - code coverage report
Current view: top level - flagging/Flagging - FlagCalTableHandler.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 354 448 79.0 %
Date: 2024-10-12 00:35:29 Functions: 33 38 86.8 %

          Line data    Source code
       1             : //# FlagCalTableHandler.h: This file contains the implementation of the FlagCalTableHandler class.
       2             : //#
       3             : //#  CASA - Common Astronomy Software Applications (http://casa.nrao.edu/)
       4             : //#  Copyright (C) Associated Universities, Inc. Washington DC, USA 2011, All rights reserved.
       5             : //#  Copyright (C) European Southern Observatory, 2011, All rights reserved.
       6             : //#
       7             : //#  This library is free software; you can redistribute it and/or
       8             : //#  modify it under the terms of the GNU Lesser General Public
       9             : //#  License as published by the Free software Foundation; either
      10             : //#  version 2.1 of the License, or (at your option) any later version.
      11             : //#
      12             : //#  This library is distributed in the hope that it will be useful,
      13             : //#  but WITHOUT ANY WARRANTY, without even the implied warranty of
      14             : //#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15             : //#  Lesser General Public License for more details.
      16             : //#
      17             : //#  You should have received a copy of the GNU Lesser General Public
      18             : //#  License along with this library; if not, write to the Free Software
      19             : //#  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
      20             : //#  MA 02111-1307  USA
      21             : //# $Id: $
      22             : 
      23             : #include <flagging/Flagging/FlagCalTableHandler.h>
      24             : 
      25             : #include <synthesis/CalTables/NewCalTable.h>
      26             : #include <synthesis/CalTables/CTInterface.h>
      27             : #include <synthesis/CalTables/CTIter.h>
      28             : #include <synthesis/CalTables/CalBuffer.h>
      29             : 
      30             : using namespace casacore;
      31             : namespace casa { //# NAMESPACE CASA - BEGIN
      32             : 
      33             : //////////////////////////////////////////
      34             : /// FlagCalTableHandler implementation ///
      35             : //////////////////////////////////////////
      36             : 
      37             : // -----------------------------------------------------------------------
      38             : // Default constructor
      39             : // -----------------------------------------------------------------------
      40         182 : FlagCalTableHandler::FlagCalTableHandler(string tablename, uShort iterationApproach, Double timeInterval):
      41         182 :                 FlagDataHandler(tablename,iterationApproach,timeInterval)
      42             : {
      43         182 :         selectedCalTable_p = NULL;
      44         182 :         originalCalTable_p = NULL;
      45         182 :         calTableInterface_p = NULL;
      46         182 :         calBuffer_p = NULL;
      47         182 :         calIter_p = NULL;
      48         182 :         tableTye_p = CALIBRATION_TABLE;
      49         182 : }
      50             : 
      51             : // -----------------------------------------------------------------------
      52             : // Default destructor
      53             : // -----------------------------------------------------------------------
      54         364 : FlagCalTableHandler::~FlagCalTableHandler()
      55             : {
      56         182 :         logger_p->origin(LogOrigin("FlagCalTableHandler",__FUNCTION__,WHERE));
      57         182 :         *logger_p << LogIO::DEBUG1 << "FlagCalTableHandler::~FlagCalTableHandler()" << LogIO::POST;
      58             : 
      59         182 :         if (calBuffer_p) delete calBuffer_p;
      60         182 :         if (calIter_p) delete calIter_p;
      61         182 :         if (calTableInterface_p) delete calTableInterface_p;
      62         182 :         if (selectedCalTable_p) delete selectedCalTable_p;
      63         182 :         if (originalCalTable_p) delete originalCalTable_p;
      64         364 : }
      65             : 
      66             : 
      67             : // -----------------------------------------------------------------------
      68             : // Open CalTable
      69             : // -----------------------------------------------------------------------
      70             : bool
      71         182 : FlagCalTableHandler::open()
      72             : {
      73         182 :         if (originalCalTable_p) delete originalCalTable_p;
      74         182 :         originalCalTable_p = new NewCalTable(tablename_p,Table::Update,Table::Plain);
      75             : 
      76             :         // Read field names
      77         182 :         MSFieldColumns fieldSubTable(originalCalTable_p->field());
      78         182 :         fieldNames_p = new Vector<String>(fieldSubTable.name().getColumn());
      79         182 :         *logger_p << LogIO::DEBUG1 << "Field names are " << *fieldNames_p << LogIO::POST;
      80             : 
      81             :         // Read antenna names and diameters from Antenna table
      82         182 :         MSAntennaColumns antennaSubTable(originalCalTable_p->antenna());
      83         182 :         antennaNames_p = new Vector<String>(antennaSubTable.name().getColumn());
      84         182 :         antennaDiameters_p = new Vector<Double>(antennaSubTable.dishDiameter().getColumn());
      85         182 :         antennaPositions_p = new ROScalarMeasColumn<MPosition>(antennaSubTable.positionMeas());
      86         182 :         *logger_p << LogIO::DEBUG1 << "There are " << antennaNames_p->size() << " antennas with names: " << *antennaNames_p << LogIO::POST;
      87             : 
      88             :         // File the baseline to Ant1xAnt2 map
      89         182 :         String baseline;
      90         182 :         std::pair<Int,Int> ant1ant2;
      91        3538 :         for (Int ant1Idx=0;ant1Idx < static_cast<Int>(antennaNames_p->size());ant1Idx++)
      92             :         {
      93       39429 :                 for (Int ant2Idx=ant1Idx+1;ant2Idx < static_cast<Int>(antennaNames_p->size());ant2Idx++)
      94             :                 {
      95       36073 :                         ant1ant2.first = ant1Idx;
      96       36073 :                         ant1ant2.second = ant2Idx;
      97       36073 :                         baseline = antennaNames_p->operator()(ant1Idx) + "&&" + antennaNames_p->operator()(ant2Idx);
      98       36073 :                         baselineToAnt1Ant2_p[baseline] = ant1ant2;
      99       36073 :                         Ant1Ant2ToBaseline_p[ant1ant2] = baseline;
     100             :                 }
     101             :         }
     102             : 
     103             :         // Create "dummy" correlation products list
     104         182 :         corrProducts_p = new std::vector<String>();
     105         182 :         corrProducts_p->push_back("SOL1");
     106         182 :         corrProducts_p->push_back("SOL2");
     107         182 :         corrProducts_p->push_back("SOL3");
     108         182 :         corrProducts_p->push_back("SOL4");
     109             : 
     110         182 :         return true;
     111         182 : }
     112             : 
     113             : 
     114             : // -----------------------------------------------------------------------
     115             : // Close CalTable
     116             : // -----------------------------------------------------------------------
     117             : bool
     118           0 : FlagCalTableHandler::close()
     119             : {
     120           0 :         if (selectedCalTable_p)
     121             :         {
     122           0 :                 selectedCalTable_p->flush();
     123           0 :                 selectedCalTable_p->relinquishAutoLocks(true);
     124           0 :                 selectedCalTable_p->unlock();
     125             :         }
     126             : 
     127           0 :         return true;
     128             : }
     129             : 
     130             : 
     131             : // -----------------------------------------------------------------------
     132             : // Generate selected CalTable
     133             : // -----------------------------------------------------------------------
     134             : bool
     135         179 : FlagCalTableHandler::selectData()
     136             : {
     137         179 :         logger_p->origin(LogOrigin("FlagCalTableHandler",__FUNCTION__,WHERE));
     138             : 
     139         179 :         if (calTableInterface_p) delete calTableInterface_p;
     140         179 :         calTableInterface_p = new CTInterface(*originalCalTable_p);
     141             : 
     142         179 :         if (measurementSetSelection_p) delete measurementSetSelection_p;
     143         179 :         const String dummyExpr = String("");
     144         179 :         measurementSetSelection_p = new MSSelection();
     145         358 :         measurementSetSelection_p->reset(*calTableInterface_p,
     146         179 :                                                                         MSSelection::PARSE_LATE,
     147         358 :                                                                         (const String)timeSelection_p,
     148         358 :                                                                         (const String)baselineSelection_p,
     149         358 :                                                                         (const String)fieldSelection_p,
     150         358 :                                                                         (const String)spwSelection_p,
     151         358 :                                                                         (const String)uvwSelection_p,
     152             :                                                                         dummyExpr, // taqlExpr
     153         358 :                                                                         (const String)polarizationSelection_p,
     154         358 :                                                                         (const String)scanSelection_p,
     155         358 :                                                                         (const String)arraySelection_p,
     156         358 :                                                                         (const String)scanIntentSelection_p,
     157         358 :                                                                         (const String)observationSelection_p);
     158             : 
     159             : 
     160         179 :         if (selectedCalTable_p) delete selectedCalTable_p;
     161             : 
     162             : //      try
     163             : //      {
     164         179 :                 TableExprNode ten = measurementSetSelection_p->toTableExprNode(calTableInterface_p);
     165         179 :                 selectedCalTable_p = new NewCalTable();
     166         181 :                 Bool madeSelection = getSelectedTable(*selectedCalTable_p,*originalCalTable_p,ten,String(""));
     167             : 
     168         177 :                 if (madeSelection == false)
     169             :                 {
     170         151 :                         *logger_p << LogIO::NORMAL << "Selection not applicable, using entire MS" << LogIO::POST;
     171         151 :                         delete selectedCalTable_p;
     172         151 :                         selectedCalTable_p = new NewCalTable(*originalCalTable_p);
     173             :                 }
     174             : //      }
     175             : //      catch (MSSelectionError &ex)
     176             : //      {
     177             : //              *logger_p << LogIO::WARN << "Selection not supported, using entire MS (" << ex.getMesg() << ")" << LogIO::POST;
     178             : //              delete selectedCalTable_p;
     179             : //              selectedCalTable_p = new NewCalTable(*originalCalTable_p);
     180             : //      }
     181             : 
     182             :         // Check if selected CalTable has rows...
     183         177 :         if (selectedCalTable_p->nrow() == 0)
     184             :         {
     185           0 :                 *logger_p << LogIO::WARN << "Selected CalTable doesn't have any rows " << LogIO::POST;
     186             :         }
     187             :         else
     188             :         {
     189         177 :                 *logger_p << LogIO::NORMAL        << "Original CalTable has "
     190         177 :                                                                         << originalCalTable_p->nrow()
     191             :                                                                         << " rows, and selected CalTable has "
     192         177 :                                                                         << selectedCalTable_p->nrow()
     193         177 :                                                                         << " rows" << LogIO::POST;
     194             :         }
     195             : 
     196             :         // There is a new selected MS so iterators have to be regenerated
     197         177 :         iteratorGenerated_p = false;
     198         177 :         chunksInitialized_p = false;
     199         177 :         buffersInitialized_p = false;
     200         177 :         stopIteration_p = false;
     201             : 
     202         177 :         return true;
     203         181 : }
     204             : 
     205             : 
     206             : // -----------------------------------------------------------------------
     207             : // Parse MSSelection expression
     208             : // -----------------------------------------------------------------------
     209             : bool
     210           9 : FlagCalTableHandler::parseExpression(MSSelection &parser)
     211             : {
     212           9 :         logger_p->origin(LogOrigin("FlagCalTableHandler",__FUNCTION__,WHERE));
     213           9 :         CTInterface tmpCTInterface(*originalCalTable_p);
     214             : 
     215             :         try
     216             :         {
     217           9 :                 TableExprNode ten = parser.toTableExprNode(&tmpCTInterface);
     218           9 :         }
     219           0 :         catch (MSSelectionError &ex)
     220             :         {
     221           0 :                 *logger_p << LogIO::WARN << "Selection not supported, canceling filtering (" << ex.getMesg() << ")" << LogIO::POST;
     222           0 :                 return false;
     223           0 :         }
     224             : 
     225           9 :         return true;
     226           9 : }
     227             : 
     228             : 
     229             : // -----------------------------------------------------------------------
     230             : // Generate CalIter with a given sort order and time interval
     231             : // -----------------------------------------------------------------------
     232             : bool
     233         168 : FlagCalTableHandler::generateIterator()
     234             : {
     235         168 :         if (!iteratorGenerated_p)
     236             :         {
     237             :                 // Generate CalIterator
     238         168 :                 if (calIter_p) delete calIter_p;
     239         168 :                 calIter_p = new CTIter(*selectedCalTable_p,getSortColumns(sortOrder_p));
     240             : 
     241             :                 // Create CalBuffer and put VisBuffer wrapper around
     242             :                 // NOTE: VisBuferAutoPtr destructor also deletes the VisBuffer inside
     243         168 :                 if (visibilityBuffer_p) delete visibilityBuffer_p;
     244         168 :                 calBuffer_p = new CTBuffer(calIter_p);
     245         168 :                 visibilityBuffer_p = (vi::VisBuffer2 *)calBuffer_p;
     246             : 
     247         168 :                 iteratorGenerated_p = true;
     248         168 :                 chunksInitialized_p = false;
     249         168 :                 buffersInitialized_p = false;
     250         168 :                 stopIteration_p = false;
     251             :         }
     252             :         else
     253             :         {
     254           0 :                 chunksInitialized_p = false;
     255           0 :                 buffersInitialized_p = false;
     256           0 :                 stopIteration_p = false;
     257             :         }
     258             : 
     259             :         // Do quack pre-swap
     260         168 :         if (mapScanStartStop_p)
     261             :         {
     262           0 :                 calIter_p->reset();
     263           0 :                 while (!calIter_p->pastEnd())
     264             :                 {
     265           0 :                         generateScanStartStopMap();
     266           0 :                         calIter_p->next();
     267             :                 }
     268             :         }
     269             : 
     270         168 :         return true;
     271             : }
     272             : 
     273             : 
     274             : // -----------------------------------------------------------------------
     275             : // Translate sorting columns from Block<Int> format to Block<string> format
     276             : // -----------------------------------------------------------------------
     277             : Block<String>
     278         168 : FlagCalTableHandler::getSortColumns(Block<Int> /*intCols*/)
     279             : {
     280         168 :         Block<String> strCols(4);
     281         168 :         strCols[0] = "OBSERVATION_ID";
     282         168 :         strCols[1] = "SCAN_NUMBER";
     283         168 :         strCols[2] = "FIELD_ID";
     284         168 :         strCols[3] = "SPECTRAL_WINDOW_ID";
     285             : 
     286         168 :         return strCols;
     287           0 : }
     288             : 
     289             : 
     290             : // -----------------------------------------------------------------------
     291             : // Move to next chunk
     292             : // -----------------------------------------------------------------------
     293             : bool
     294        8964 : FlagCalTableHandler::nextChunk()
     295             : {
     296        8964 :         logger_p->origin(LogOrigin("FlagCalTableHandler",__FUNCTION__,WHERE));
     297             : 
     298        8964 :         chunkCounts_p = 0;
     299        8964 :         bool moreChunks = false;
     300        8964 :         if (stopIteration_p)
     301             :         {
     302           0 :                 moreChunks = false;
     303             :         }
     304             :         else
     305             :         {
     306        8964 :                 if (!chunksInitialized_p)
     307             :                 {
     308         168 :                         if (!iteratorGenerated_p) generateIterator();
     309         168 :                         calIter_p->reset();
     310         168 :                         chunksInitialized_p = true;
     311         168 :                         buffersInitialized_p = false;
     312         168 :                         chunkNo_p++;
     313         168 :                         bufferNo_p = 0;
     314         168 :                         moreChunks = true;
     315             :                 }
     316             :                 else
     317             :                 {
     318        8796 :                         calIter_p->next();
     319             : 
     320        8796 :                         if (!calIter_p->pastEnd())
     321             :                         {
     322        8628 :                                 buffersInitialized_p = false;
     323        8628 :                                 moreChunks = true;
     324        8628 :                                 chunkNo_p++;
     325        8628 :                                 bufferNo_p = 0;
     326             :                         }
     327             :                 }
     328             :         }
     329             : 
     330        8964 :         if (!moreChunks)
     331             :         {
     332         168 :                 *logger_p << LogIO::NORMAL << "==================================================================================== " << LogIO::POST;
     333             :         }
     334             : 
     335        8964 :         return moreChunks;
     336             : }
     337             : 
     338             : 
     339             : // -----------------------------------------------------------------------
     340             : // Move to next buffer
     341             : // -----------------------------------------------------------------------
     342             : bool
     343       17592 : FlagCalTableHandler::nextBuffer()
     344             : {
     345       17592 :         bool moreBuffers = false;
     346       17592 :         if (stopIteration_p)
     347             :         {
     348           0 :                 moreBuffers = false;
     349             :         }
     350             :         else
     351             :         {
     352       17592 :                 if (!buffersInitialized_p)
     353             :                 {
     354        8796 :                         ((CTBuffer *)visibilityBuffer_p)->invalidate();
     355        8796 :                         if (!asyncio_enabled_p) preFetchColumns();
     356        8796 :                         if (mapPolarizations_p) generatePolarizationsMap();
     357        8796 :                         if (mapAntennaPairs_p) generateAntennaPairMap();
     358        8796 :                         buffersInitialized_p = true;
     359        8796 :                         flushFlags_p = false;
     360        8796 :                         flushFlagRow_p = false;
     361        8796 :                         bufferNo_p++;
     362             : 
     363        8796 :                         moreBuffers = true;
     364             :                 }
     365             :                 else
     366             :                 {
     367             :                         // In CalTables there is only one iteration level
     368        8796 :                         moreBuffers = false;
     369             :                 }
     370             :         }
     371             : 
     372             :         // Print chunk characteristics
     373       17592 :         if (moreBuffers)
     374             :         {
     375             :                 // Get flag  (WARNING: We have to modify the shape of the cube before re-assigning it)
     376        8796 :                 Cube<Bool> curentFlagCube= visibilityBuffer_p->flagCube();
     377        8796 :                 modifiedFlagCube_p.resize(curentFlagCube.shape());
     378        8796 :                 modifiedFlagCube_p = curentFlagCube;
     379        8796 :                 originalFlagCube_p.resize(curentFlagCube.shape());
     380        8796 :                 originalFlagCube_p = curentFlagCube;
     381             : 
     382             :                 // Get flag row (WARNING: We have to modify the shape of the cube before re-assigning it)
     383             :                 // NOTE: There is no FlagRow in CalTables yet, but we have it here for compatibility reasons
     384        8796 :                 modifiedFlagRow_p.resize(visibilityBuffer_p->nRows());
     385        8796 :                 originalFlagRow_p.resize(visibilityBuffer_p->nRows());
     386             : 
     387             :                 // Compute total number of flags per buffer to be used for generating the agents stats
     388        8796 :                 Int64 currentBufferCounts = curentFlagCube.shape().product();
     389        8796 :                 chunkCounts_p += currentBufferCounts;
     390        8796 :                 progressCounts_p += currentBufferCounts;
     391        8796 :                 msCounts_p += currentBufferCounts;
     392             : 
     393             :                 // Print chunk characteristics
     394        8796 :                 if (bufferNo_p == 1)
     395             :                 {
     396             :                         // jagonzal: This is correct because in CalTables there is only one iteration level
     397        8796 :                         processedRows_p += visibilityBuffer_p->nRows();
     398             : 
     399        8796 :                         if (printChunkSummary_p)
     400             :                         {
     401        8796 :                                 logger_p->origin(LogOrigin("FlagCalTableHandler",""));
     402        8796 :                                 Vector<Int> scan = visibilityBuffer_p->scan();
     403        8796 :                                 Vector<Int> observation = visibilityBuffer_p->observationId();
     404        8796 :                                 String corrs = "[ ";
     405       26388 :                                 for (uInt corr_i=0;corr_i<(uInt) visibilityBuffer_p->nCorrelations();corr_i++)
     406             :                                 {
     407       17592 :                                         corrs += (*polarizationIndexMap_p)[corr_i] + " ";
     408             :                                 }
     409        8796 :                                 corrs += "]";
     410             : 
     411        8796 :                                 Double progress  = 100.0* ((Double) processedRows_p / (Double) selectedCalTable_p->nrow());
     412             : 
     413        8796 :                                 *logger_p << LogIO::NORMAL <<
     414        8796 :                                                 "------------------------------------------------------------------------------------ " << LogIO::POST;
     415        8796 :                                 *logger_p << LogIO::NORMAL <<
     416             :                                                 "Chunk = " << chunkNo_p << " [progress: " << (Int)progress << "%]"
     417        8796 :                                                 ", Observation = " << observation[0] << "~" << observation[observation.size()-1] <<
     418        8796 :                                                 ", Scan = " << scan[0] << "~" << scan[scan.size()-1] <<
     419       26388 :                                                 ", Field = " << visibilityBuffer_p->fieldId()(0) << " (" << fieldNames_p->operator()(visibilityBuffer_p->fieldId()) << ")"
     420        8796 :                                                 ", Spw = " << visibilityBuffer_p->spectralWindows()(0) <<
     421        8796 :                                                 ", Channels = " << visibilityBuffer_p->nChannels() <<
     422             :                                                 ", CalSolutions = " << corrs <<
     423       52776 :                                                 ", Total Rows = " << visibilityBuffer_p->nRows() << LogIO::POST;
     424        8796 :                         }
     425             :                 }
     426        8796 :         }
     427             : 
     428       17592 :         return moreBuffers;
     429             : }
     430             : 
     431             : 
     432             : // -----------------------------------------------------------------------
     433             : // Generate scan start stop map
     434             : // -----------------------------------------------------------------------
     435             : void
     436           0 : FlagCalTableHandler::generateScanStartStopMap()
     437             : {
     438             :         Int scan;
     439             :         Double start,stop;
     440           0 :         Vector<Int> scans;
     441           0 :         Vector<Double> times;
     442             : 
     443           0 :         Cube<Bool> flags;
     444             :         uInt scanStartRow;
     445             :         uInt scanStopRow;
     446             :         uInt ncorrs,nchannels,nrows;
     447             :         Bool stopSearch;
     448             : 
     449           0 :         if (scanStartStopMap_p == NULL) scanStartStopMap_p = new scanStartStopMap();
     450             : 
     451           0 :         scans = calIter_p->scan();
     452           0 :         times = calIter_p->time();
     453             : 
     454             :         // Check if anything is flagged in this buffer
     455           0 :         scanStartRow = 0;
     456           0 :         scanStopRow = times.size()-1;
     457           0 :         if (mapScanStartStopFlagged_p)
     458             :         {
     459           0 :                 calIter_p->flag(flags);
     460           0 :                 IPosition shape = flags.shape();
     461           0 :                 ncorrs = shape[0];
     462           0 :                 nchannels = shape[1];
     463           0 :                 nrows = shape[2];
     464             : 
     465             :                 // Look for effective scan start
     466           0 :                 stopSearch = false;
     467           0 :                 for (uInt row_i=0;row_i<nrows;row_i++)
     468             :                 {
     469           0 :                         if (stopSearch) break;
     470             : 
     471           0 :                         for (uInt channel_i=0;channel_i<nchannels;channel_i++)
     472             :                         {
     473           0 :                                 if (stopSearch) break;
     474             : 
     475           0 :                                 for (uInt corr_i=0;corr_i<ncorrs;corr_i++)
     476             :                                 {
     477           0 :                                         if (stopSearch) break;
     478             : 
     479           0 :                                         if (!flags(corr_i,channel_i,row_i))
     480             :                                         {
     481           0 :                                                 scanStartRow = row_i;
     482           0 :                                                 stopSearch = true;
     483             :                                         }
     484             :                                 }
     485             :                         }
     486             :                 }
     487             : 
     488             :                 // If none of the rows were un-flagged we don't continue checking from the end
     489             :                 // As a consequence of this some scans may not be present in the map, and have
     490             :                 // to be skipped in the flagging process because they are already flagged.
     491           0 :                 if (!stopSearch) return;
     492             : 
     493             :                 // Look for effective scan stop
     494           0 :                 stopSearch = false;
     495           0 :                 for (uInt row_i=0;row_i<nrows;row_i++)
     496             :                 {
     497           0 :                         if (stopSearch) break;
     498             : 
     499           0 :                         for (uInt channel_i=0;channel_i<nchannels;channel_i++)
     500             :                         {
     501           0 :                                 if (stopSearch) break;
     502             : 
     503           0 :                                 for (uInt corr_i=0;corr_i<ncorrs;corr_i++)
     504             :                                 {
     505           0 :                                         if (stopSearch) break;
     506             : 
     507           0 :                                         if (!flags(corr_i,channel_i,nrows-1-row_i))
     508             :                                         {
     509           0 :                                                 scanStopRow = nrows-1-row_i;
     510           0 :                                                 stopSearch = true;
     511             :                                         }
     512             :                                 }
     513             :                         }
     514             :                 }
     515           0 :         }
     516             : 
     517             :         // Check scan start/stop times
     518           0 :         scan = scans[0];
     519           0 :         start = times[scanStartRow];
     520           0 :         stop = times[scanStopRow];
     521             : 
     522           0 :         if (scanStartStopMap_p->find(scan) == scanStartStopMap_p->end())
     523             :         {
     524           0 :                 (*scanStartStopMap_p)[scan].push_back(start);
     525           0 :                 (*scanStartStopMap_p)[scan].push_back(stop);
     526             :         }
     527             :         else
     528             :         {
     529             :                 // Check if we have a better start time
     530           0 :                 if ((*scanStartStopMap_p)[scan][0] > start)
     531             :                 {
     532           0 :                         (*scanStartStopMap_p)[scan][0] = start;
     533             :                 }
     534             :                 // Check if we have a better stop time
     535           0 :                 if ((*scanStartStopMap_p)[scan][1] < stop)
     536             :                 {
     537           0 :                         (*scanStartStopMap_p)[scan][1] = stop;
     538             :                 }
     539             :         }
     540             : 
     541           0 :         return;
     542           0 : }
     543             : 
     544             : 
     545             : // -----------------------------------------------------------------------
     546             : // Flush flags to CalTable
     547             : // -----------------------------------------------------------------------
     548             : bool
     549        5622 : FlagCalTableHandler::flushFlags()
     550             : {
     551        5622 :         if (flushFlags_p)
     552             :         {
     553        5086 :                 calIter_p->setflag(modifiedFlagCube_p);
     554        5086 :                 flushFlags_p = false;
     555             :         }
     556             : 
     557        5622 :         return true;
     558             : }
     559             : 
     560             : 
     561             : // -----------------------------------------------------------------------
     562             : // Flush flags to CalTable
     563             : // -----------------------------------------------------------------------
     564             : String
     565           9 : FlagCalTableHandler::getTableName()
     566             : {
     567           9 :         return originalCalTable_p->tableName();
     568             : }
     569             : 
     570             : // -----------------------------------------------------------------------
     571             : // Signal true when a progress summary has to be printed
     572             : // -----------------------------------------------------------------------
     573             : bool
     574        8796 : FlagCalTableHandler::summarySignal()
     575             : {
     576        8796 :         Double progress = 100.0* ((Double) processedRows_p / (Double) selectedCalTable_p->nrow());
     577        8796 :         if ((progress >= summaryThreshold_p) or (logger_p->priority() >= LogMessage::DEBUG1))
     578             :         {
     579        8796 :                 summaryThreshold_p += 10;
     580        8796 :                 printChunkSummary_p = true;
     581        8796 :                 return true;
     582             :         }
     583             :         else
     584             :         {
     585           0 :                 printChunkSummary_p = false;
     586           0 :                 return false;
     587             :         }
     588             : }
     589             : 
     590             : 
     591             : // -----------------------------------------------------------------------
     592             : // Check what data columns exist
     593             : // -----------------------------------------------------------------------
     594             : bool
     595          34 : FlagCalTableHandler::checkIfColumnExists(String column)
     596             : {
     597          34 :         return originalCalTable_p->tableDesc().isColumn(column);
     598             : }
     599             : 
     600             : //////////////////////////////////////////
     601             : //////// CTBuffer implementation ////////
     602             : //////////////////////////////////////////
     603             : 
     604         168 : CTCache::CTCache(CTIter *calIter): calIter_p(calIter)
     605             : {
     606         168 :         invalidate();
     607         168 : }
     608             : 
     609           0 : CTCache::~CTCache()
     610             : {
     611             : 
     612           0 : }
     613             : 
     614       11970 : Int CTCache::arrayId()
     615             : {
     616       11970 :         return -1;
     617             : }
     618             : 
     619       32802 : Int CTCache::fieldId()
     620             : {
     621       32802 :         if (!CTfieldIdOK_p)
     622             :         {
     623       32802 :                 field0_p = calIter_p->field()[0];
     624       32802 :                 CTfieldIdOK_p = false;
     625             :         }
     626             : 
     627       32802 :         return field0_p;
     628             : }
     629             : 
     630       24408 : Int CTCache::spectralWindow()
     631             : {
     632       24408 :         if (!CTspectralWindowOK_p)
     633             :         {
     634        8796 :                 Vector<Int> tmp = calIter_p->spw();
     635        8796 :                 spw_p.resize(tmp.size(),false);
     636        8796 :                 spw_p = tmp;
     637        8796 :                 spw0_p = spw_p[0];
     638        8796 :                 CTspectralWindowOK_p = true;
     639        8796 :         }
     640             : 
     641       24408 :         return spw0_p;
     642             : }
     643             : 
     644      232812 : Vector<Int>& CTCache::scan()
     645             : {
     646      232812 :         if (!CTscanOK_p)
     647             :         {
     648        8796 :                 Vector<Int> tmp = calIter_p->scan();
     649        8796 :                 scan_p.resize(tmp.size(),false);
     650        8796 :                 scan_p = tmp;
     651        8796 :                 CTscanOK_p = true;
     652        8796 :         }
     653             : 
     654      232812 :         return scan_p;
     655             : }
     656             : 
     657       69180 : Vector<Double>& CTCache::time()
     658             : {
     659       69180 :         if (!CTtimeOK_p)
     660             :         {
     661        8796 :                 Vector<Double> tmp = calIter_p->time();
     662        8796 :                 time_p.resize(tmp.size(),false);
     663        8796 :                 time_p = tmp;
     664        8796 :                 CTtimeOK_p = true;
     665        8796 :         }
     666             : 
     667       69180 :         return time_p;
     668             : }
     669             : 
     670      219533 : Vector<Int>& CTCache::antenna1()
     671             : {
     672      219533 :         if (!CTantenna1OK_p)
     673             :         {
     674        3586 :                 Vector<Int> tmp = calIter_p->antenna1();
     675        3586 :                 antenna1_p.resize(tmp.size(),false);
     676        3586 :                 antenna1_p = tmp;
     677        3586 :                 CTantenna1OK_p = true;
     678        3586 :         }
     679             : 
     680      219533 :         return antenna1_p;
     681             : }
     682             : 
     683      219158 : Vector<Int>& CTCache::antenna2()
     684             : {
     685      219158 :         if (!CTantenna2OK_p)
     686             :         {
     687        3586 :                 Vector<Int> tmp = calIter_p->antenna2();
     688        3586 :                 if (tmp[0] < 0) tmp = calIter_p->antenna1();
     689        3586 :                 antenna2_p.resize(tmp.size(),false);
     690        3586 :                 antenna2_p = tmp;
     691        3586 :                 CTantenna2OK_p = true;
     692        3586 :         }
     693             : 
     694      219158 :         return antenna2_p;
     695             : }
     696             : 
     697       17592 : Cube<Bool>& CTCache::flagCube()
     698             : {
     699       17592 :         if (!CTflagCubeOk_p)
     700             :         {
     701        8796 :                 Cube<Bool> tmp = calIter_p->flag();
     702        8796 :                 flagCube_p.resize(tmp.shape(),false);
     703        8796 :                 flagCube_p = tmp;
     704        8796 :                 CTflagCubeOk_p = true;
     705             : 
     706             :                 // Also fill shapes
     707        8796 :                 nRow_p = flagCube_p.shape()[2];
     708        8796 :                 nRowChunk_p = flagCube_p.shape()[2];
     709        8796 :                 nChannel_p = flagCube_p.shape()[1];
     710        8796 :                 nCorr_p = flagCube_p.shape()[0];
     711             : 
     712        8796 :                 CTnRowOK_p = true;
     713        8796 :                 CTnRowChunkOK_p = true;
     714        8796 :                 CTnChannelOK_p = true;
     715        8796 :                 CTnCorrOK_p = true;
     716        8796 :         }
     717             : 
     718       17592 :         return flagCube_p;
     719             : }
     720             : 
     721       20766 : Vector<Int>& CTCache::observationId()
     722             : {
     723       20766 :         if (!CTobservationIdOK_p)
     724             :         {
     725        8796 :                 Vector<Int> tmp = calIter_p->obs();
     726        8796 :                 observationId_p.resize(tmp.size(),false);
     727        8796 :                 observationId_p = tmp;
     728        8796 :                 CTobservationIdOK_p = true;
     729        8796 :         }
     730             : 
     731       20766 :         return observationId_p;
     732             : }
     733             : 
     734       13676 : Vector<Int>& CTCache::correlationTypes()
     735             : {
     736       13676 :         if (!CTcorrTypeOK_p)
     737             :         {
     738        8796 :                 if (!CTnRowOK_p) nCorrelations();
     739        8796 :                 corrType_p.resize(nCorr_p,false);
     740       26388 :                 for (uInt corr_i=0;corr_i<(uInt) nCorr_p;corr_i++)
     741             :                 {
     742       17592 :                         corrType_p[corr_i] =  Stokes::NumberOfTypes+corr_i;
     743             :                 }
     744        8796 :                 CTcorrTypeOK_p = true;
     745             :         }
     746             : 
     747       13676 :         return corrType_p;
     748             : }
     749             : 
     750           0 : Vector<Int>& CTCache::getChannelNumbers(Int /*rowInBuffer*/)
     751             : {
     752           0 :         if (!CTchannelOK_p)
     753             :         {
     754           0 :                 Vector<Int> tmp = calIter_p->chan();
     755           0 :                 channel_p.resize(tmp.size(),false);
     756           0 :                 channel_p = tmp;
     757           0 :                 CTchannelOK_p = true;
     758           0 :         }
     759             : 
     760           0 :         return channel_p;
     761             : }
     762             : 
     763         116 : Vector<Double>& CTCache::getFrequencies(Int /*rowInBuffer*/, Int /*frame*/)
     764             : {
     765         116 :         if (!CTfrequencyOK_p)
     766             :         {
     767         116 :                 Vector<Double> tmp = calIter_p->freq();
     768         116 :                 frequency_p.resize(tmp.size(),false);
     769         116 :                 frequency_p = tmp;
     770         116 :                 CTfrequencyOK_p = true;
     771         116 :         }
     772             : 
     773         116 :         return frequency_p;
     774             : }
     775             : 
     776        1384 : Cube<Complex>& CTCache::visCube()
     777             : {
     778        1384 :         if (!CTVisCubeOK_p)
     779             :         {
     780         692 :                 Cube<Float> tmp = calIter_p->fparam();
     781             : 
     782             :                 // Transform Cube<Float> into Cube<Complex>
     783         692 :                 Cube<Complex> tmpTrans(tmp.shape());
     784        2076 :                 for (uInt idx1=0;idx1<tmp.shape()[0];idx1++)
     785             :                 {
     786      178536 :                         for (uInt idx2=0;idx2<tmp.shape()[1];idx2++)
     787             :                         {
     788     1771520 :                                 for (uInt idx3=0;idx3<tmp.shape()[2];idx3++)
     789             :                                 {
     790     1594368 :                                         tmpTrans(idx1,idx2,idx3) = Complex(tmp(idx1,idx2,idx3),0);
     791             :                                 }
     792             :                         }
     793             :                 }
     794             : 
     795         692 :                 fparam_p.resize(tmpTrans.shape(),false);
     796         692 :                 fparam_p = tmpTrans;
     797         692 :                 CTVisCubeOK_p = true;
     798         692 :         }
     799             : 
     800        1384 :         return fparam_p;
     801             : }
     802             : 
     803        9296 : Cube<Complex>& CTCache::visCubeCorrected()
     804             : {
     805        9296 :         if (!CTcorrectedVisCubeOK_p)
     806             :         {
     807         838 :                 Cube<Complex> tmp = calIter_p->cparam();
     808         838 :                 cparam_p.resize(tmp.shape(),false);
     809         838 :                 cparam_p = tmp;
     810         838 :                 CTcorrectedVisCubeOK_p = true;
     811         838 :         }
     812             : 
     813        9296 :         return cparam_p;
     814             : }
     815             : 
     816         232 : Cube<Complex>& CTCache::visCubeModel()
     817             : {
     818         232 :         if (!CTmodelVisCubeOK_p)
     819             :         {
     820         116 :                 Cube<Float> tmp = calIter_p->snr();
     821             : 
     822             :                 // Transform Cube<Float> into Cube<Complex>
     823         116 :                 Cube<Complex> tmpTrans(tmp.shape());
     824         348 :                 for (uInt idx1=0;idx1<tmp.shape()[0];idx1++)
     825             :                 {
     826       22248 :                         for (uInt idx2=0;idx2<tmp.shape()[1];idx2++)
     827             :                         {
     828     1399040 :                                 for (uInt idx3=0;idx3<tmp.shape()[2];idx3++)
     829             :                                 {
     830     1377024 :                                         tmpTrans(idx1,idx2,idx3) = Complex(tmp(idx1,idx2,idx3),0);
     831             :                                 }
     832             :                         }
     833             :                 }
     834             : 
     835         116 :                 snr_p.resize(tmpTrans.shape(),false);
     836         116 :                 snr_p = tmpTrans;
     837         116 :                 CTmodelVisCubeOK_p = true;
     838         116 :         }
     839             : 
     840         232 :         return snr_p;
     841             : }
     842             : 
     843           0 : Int CTCache::nRowChunk()
     844             : {
     845           0 :         if (!CTnRowChunkOK_p)
     846             :         {
     847           0 :                 if (!CTflagCubeOk_p) flagCube();
     848           0 :                 nRowChunk_p = flagCube_p.shape()[2];
     849           0 :                 CTnRowChunkOK_p = true;
     850             :         }
     851             : 
     852           0 :         return nRowChunk_p;
     853             : }
     854             : 
     855       43980 : Int CTCache::nRows()
     856             : {
     857       43980 :         if (!CTnRowOK_p)
     858             :         {
     859        8796 :                 if (!CTflagCubeOk_p) flagCube();
     860        8796 :                 nRow_p = flagCube_p.shape()[2];
     861        8796 :                 CTnRowOK_p = true;
     862             :         }
     863             : 
     864       43980 :         return nRow_p;
     865             : }
     866             : 
     867       17592 : Int CTCache::nChannels()
     868             : {
     869       17592 :         if (!CTnChannelOK_p)
     870             :         {
     871           0 :                 if (!CTflagCubeOk_p) flagCube();
     872           0 :                 nChannel_p = flagCube_p.shape()[1];
     873           0 :                 CTnChannelOK_p = true;
     874             :         }
     875             : 
     876       17592 :         return nChannel_p;
     877             : }
     878             : 
     879       35184 : Int CTCache::nCorrelations()
     880             : {
     881       35184 :         if (!CTnCorrOK_p)
     882             :         {
     883           0 :                 if (!CTflagCubeOk_p) flagCube();
     884           0 :                 nCorr_p = flagCube_p.shape()[0];
     885           0 :                 CTnCorrOK_p = true;
     886             :         }
     887             : 
     888       35184 :         return nCorr_p;
     889             : }
     890             : 
     891        9132 : void CTCache::invalidate()
     892             : {
     893        9132 :         CTfieldIdOK_p = false;
     894        9132 :         CTspectralWindowOK_p = false;
     895        9132 :         CTscanOK_p = false;
     896        9132 :         CTtimeOK_p = false;
     897        9132 :         CTantenna1OK_p = false;
     898        9132 :         CTantenna2OK_p = false;
     899        9132 :         CTflagCubeOk_p = false;
     900        9132 :         CTobservationIdOK_p = false;
     901        9132 :         CTcorrTypeOK_p = false;
     902        9132 :         CTchannelOK_p = false;
     903        9132 :         CTfrequencyOK_p = false;
     904        9132 :         CTVisCubeOK_p = false;
     905        9132 :         CTcorrectedVisCubeOK_p = false;
     906        9132 :         CTmodelVisCubeOK_p = false;
     907        9132 :         CTnRowChunkOK_p = false;
     908        9132 :         CTnRowOK_p = false;
     909        9132 :         CTnChannelOK_p = false;
     910        9132 :         CTnCorrOK_p = false;
     911             : 
     912        9132 :         return;
     913             : }
     914             : 
     915             : 
     916             : } //# NAMESPACE CASA - END
     917             : 

Generated by: LCOV version 1.16