LCOV - code coverage report
Current view: top level - flagging/Flagging - FlagCalTableHandler.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 448 0.0 %
Date: 2024-10-04 18:58:15 Functions: 0 38 0.0 %

          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           0 : FlagCalTableHandler::FlagCalTableHandler(string tablename, uShort iterationApproach, Double timeInterval):
      41           0 :                 FlagDataHandler(tablename,iterationApproach,timeInterval)
      42             : {
      43           0 :         selectedCalTable_p = NULL;
      44           0 :         originalCalTable_p = NULL;
      45           0 :         calTableInterface_p = NULL;
      46           0 :         calBuffer_p = NULL;
      47           0 :         calIter_p = NULL;
      48           0 :         tableTye_p = CALIBRATION_TABLE;
      49           0 : }
      50             : 
      51             : // -----------------------------------------------------------------------
      52             : // Default destructor
      53             : // -----------------------------------------------------------------------
      54           0 : FlagCalTableHandler::~FlagCalTableHandler()
      55             : {
      56           0 :         logger_p->origin(LogOrigin("FlagCalTableHandler",__FUNCTION__,WHERE));
      57           0 :         *logger_p << LogIO::DEBUG1 << "FlagCalTableHandler::~FlagCalTableHandler()" << LogIO::POST;
      58             : 
      59           0 :         if (calBuffer_p) delete calBuffer_p;
      60           0 :         if (calIter_p) delete calIter_p;
      61           0 :         if (calTableInterface_p) delete calTableInterface_p;
      62           0 :         if (selectedCalTable_p) delete selectedCalTable_p;
      63           0 :         if (originalCalTable_p) delete originalCalTable_p;
      64           0 : }
      65             : 
      66             : 
      67             : // -----------------------------------------------------------------------
      68             : // Open CalTable
      69             : // -----------------------------------------------------------------------
      70             : bool
      71           0 : FlagCalTableHandler::open()
      72             : {
      73           0 :         if (originalCalTable_p) delete originalCalTable_p;
      74           0 :         originalCalTable_p = new NewCalTable(tablename_p,Table::Update,Table::Plain);
      75             : 
      76             :         // Read field names
      77           0 :         MSFieldColumns fieldSubTable(originalCalTable_p->field());
      78           0 :         fieldNames_p = new Vector<String>(fieldSubTable.name().getColumn());
      79           0 :         *logger_p << LogIO::DEBUG1 << "Field names are " << *fieldNames_p << LogIO::POST;
      80             : 
      81             :         // Read antenna names and diameters from Antenna table
      82           0 :         MSAntennaColumns antennaSubTable(originalCalTable_p->antenna());
      83           0 :         antennaNames_p = new Vector<String>(antennaSubTable.name().getColumn());
      84           0 :         antennaDiameters_p = new Vector<Double>(antennaSubTable.dishDiameter().getColumn());
      85           0 :         antennaPositions_p = new ROScalarMeasColumn<MPosition>(antennaSubTable.positionMeas());
      86           0 :         *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           0 :         String baseline;
      90           0 :         std::pair<Int,Int> ant1ant2;
      91           0 :         for (Int ant1Idx=0;ant1Idx < static_cast<Int>(antennaNames_p->size());ant1Idx++)
      92             :         {
      93           0 :                 for (Int ant2Idx=ant1Idx+1;ant2Idx < static_cast<Int>(antennaNames_p->size());ant2Idx++)
      94             :                 {
      95           0 :                         ant1ant2.first = ant1Idx;
      96           0 :                         ant1ant2.second = ant2Idx;
      97           0 :                         baseline = antennaNames_p->operator()(ant1Idx) + "&&" + antennaNames_p->operator()(ant2Idx);
      98           0 :                         baselineToAnt1Ant2_p[baseline] = ant1ant2;
      99           0 :                         Ant1Ant2ToBaseline_p[ant1ant2] = baseline;
     100             :                 }
     101             :         }
     102             : 
     103             :         // Create "dummy" correlation products list
     104           0 :         corrProducts_p = new std::vector<String>();
     105           0 :         corrProducts_p->push_back("SOL1");
     106           0 :         corrProducts_p->push_back("SOL2");
     107           0 :         corrProducts_p->push_back("SOL3");
     108           0 :         corrProducts_p->push_back("SOL4");
     109             : 
     110           0 :         return true;
     111           0 : }
     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           0 : FlagCalTableHandler::selectData()
     136             : {
     137           0 :         logger_p->origin(LogOrigin("FlagCalTableHandler",__FUNCTION__,WHERE));
     138             : 
     139           0 :         if (calTableInterface_p) delete calTableInterface_p;
     140           0 :         calTableInterface_p = new CTInterface(*originalCalTable_p);
     141             : 
     142           0 :         if (measurementSetSelection_p) delete measurementSetSelection_p;
     143           0 :         const String dummyExpr = String("");
     144           0 :         measurementSetSelection_p = new MSSelection();
     145           0 :         measurementSetSelection_p->reset(*calTableInterface_p,
     146           0 :                                                                         MSSelection::PARSE_LATE,
     147           0 :                                                                         (const String)timeSelection_p,
     148           0 :                                                                         (const String)baselineSelection_p,
     149           0 :                                                                         (const String)fieldSelection_p,
     150           0 :                                                                         (const String)spwSelection_p,
     151           0 :                                                                         (const String)uvwSelection_p,
     152             :                                                                         dummyExpr, // taqlExpr
     153           0 :                                                                         (const String)polarizationSelection_p,
     154           0 :                                                                         (const String)scanSelection_p,
     155           0 :                                                                         (const String)arraySelection_p,
     156           0 :                                                                         (const String)scanIntentSelection_p,
     157           0 :                                                                         (const String)observationSelection_p);
     158             : 
     159             : 
     160           0 :         if (selectedCalTable_p) delete selectedCalTable_p;
     161             : 
     162             : //      try
     163             : //      {
     164           0 :                 TableExprNode ten = measurementSetSelection_p->toTableExprNode(calTableInterface_p);
     165           0 :                 selectedCalTable_p = new NewCalTable();
     166           0 :                 Bool madeSelection = getSelectedTable(*selectedCalTable_p,*originalCalTable_p,ten,String(""));
     167             : 
     168           0 :                 if (madeSelection == false)
     169             :                 {
     170           0 :                         *logger_p << LogIO::NORMAL << "Selection not applicable, using entire MS" << LogIO::POST;
     171           0 :                         delete selectedCalTable_p;
     172           0 :                         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           0 :         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           0 :                 *logger_p << LogIO::NORMAL        << "Original CalTable has "
     190           0 :                                                                         << originalCalTable_p->nrow()
     191             :                                                                         << " rows, and selected CalTable has "
     192           0 :                                                                         << selectedCalTable_p->nrow()
     193           0 :                                                                         << " rows" << LogIO::POST;
     194             :         }
     195             : 
     196             :         // There is a new selected MS so iterators have to be regenerated
     197           0 :         iteratorGenerated_p = false;
     198           0 :         chunksInitialized_p = false;
     199           0 :         buffersInitialized_p = false;
     200           0 :         stopIteration_p = false;
     201             : 
     202           0 :         return true;
     203           0 : }
     204             : 
     205             : 
     206             : // -----------------------------------------------------------------------
     207             : // Parse MSSelection expression
     208             : // -----------------------------------------------------------------------
     209             : bool
     210           0 : FlagCalTableHandler::parseExpression(MSSelection &parser)
     211             : {
     212           0 :         logger_p->origin(LogOrigin("FlagCalTableHandler",__FUNCTION__,WHERE));
     213           0 :         CTInterface tmpCTInterface(*originalCalTable_p);
     214             : 
     215             :         try
     216             :         {
     217           0 :                 TableExprNode ten = parser.toTableExprNode(&tmpCTInterface);
     218           0 :         }
     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           0 :         return true;
     226           0 : }
     227             : 
     228             : 
     229             : // -----------------------------------------------------------------------
     230             : // Generate CalIter with a given sort order and time interval
     231             : // -----------------------------------------------------------------------
     232             : bool
     233           0 : FlagCalTableHandler::generateIterator()
     234             : {
     235           0 :         if (!iteratorGenerated_p)
     236             :         {
     237             :                 // Generate CalIterator
     238           0 :                 if (calIter_p) delete calIter_p;
     239           0 :                 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           0 :                 if (visibilityBuffer_p) delete visibilityBuffer_p;
     244           0 :                 calBuffer_p = new CTBuffer(calIter_p);
     245           0 :                 visibilityBuffer_p = (vi::VisBuffer2 *)calBuffer_p;
     246             : 
     247           0 :                 iteratorGenerated_p = true;
     248           0 :                 chunksInitialized_p = false;
     249           0 :                 buffersInitialized_p = false;
     250           0 :                 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           0 :         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           0 :         return true;
     271             : }
     272             : 
     273             : 
     274             : // -----------------------------------------------------------------------
     275             : // Translate sorting columns from Block<Int> format to Block<string> format
     276             : // -----------------------------------------------------------------------
     277             : Block<String>
     278           0 : FlagCalTableHandler::getSortColumns(Block<Int> /*intCols*/)
     279             : {
     280           0 :         Block<String> strCols(4);
     281           0 :         strCols[0] = "OBSERVATION_ID";
     282           0 :         strCols[1] = "SCAN_NUMBER";
     283           0 :         strCols[2] = "FIELD_ID";
     284           0 :         strCols[3] = "SPECTRAL_WINDOW_ID";
     285             : 
     286           0 :         return strCols;
     287           0 : }
     288             : 
     289             : 
     290             : // -----------------------------------------------------------------------
     291             : // Move to next chunk
     292             : // -----------------------------------------------------------------------
     293             : bool
     294           0 : FlagCalTableHandler::nextChunk()
     295             : {
     296           0 :         logger_p->origin(LogOrigin("FlagCalTableHandler",__FUNCTION__,WHERE));
     297             : 
     298           0 :         chunkCounts_p = 0;
     299           0 :         bool moreChunks = false;
     300           0 :         if (stopIteration_p)
     301             :         {
     302           0 :                 moreChunks = false;
     303             :         }
     304             :         else
     305             :         {
     306           0 :                 if (!chunksInitialized_p)
     307             :                 {
     308           0 :                         if (!iteratorGenerated_p) generateIterator();
     309           0 :                         calIter_p->reset();
     310           0 :                         chunksInitialized_p = true;
     311           0 :                         buffersInitialized_p = false;
     312           0 :                         chunkNo_p++;
     313           0 :                         bufferNo_p = 0;
     314           0 :                         moreChunks = true;
     315             :                 }
     316             :                 else
     317             :                 {
     318           0 :                         calIter_p->next();
     319             : 
     320           0 :                         if (!calIter_p->pastEnd())
     321             :                         {
     322           0 :                                 buffersInitialized_p = false;
     323           0 :                                 moreChunks = true;
     324           0 :                                 chunkNo_p++;
     325           0 :                                 bufferNo_p = 0;
     326             :                         }
     327             :                 }
     328             :         }
     329             : 
     330           0 :         if (!moreChunks)
     331             :         {
     332           0 :                 *logger_p << LogIO::NORMAL << "==================================================================================== " << LogIO::POST;
     333             :         }
     334             : 
     335           0 :         return moreChunks;
     336             : }
     337             : 
     338             : 
     339             : // -----------------------------------------------------------------------
     340             : // Move to next buffer
     341             : // -----------------------------------------------------------------------
     342             : bool
     343           0 : FlagCalTableHandler::nextBuffer()
     344             : {
     345           0 :         bool moreBuffers = false;
     346           0 :         if (stopIteration_p)
     347             :         {
     348           0 :                 moreBuffers = false;
     349             :         }
     350             :         else
     351             :         {
     352           0 :                 if (!buffersInitialized_p)
     353             :                 {
     354           0 :                         ((CTBuffer *)visibilityBuffer_p)->invalidate();
     355           0 :                         if (!asyncio_enabled_p) preFetchColumns();
     356           0 :                         if (mapPolarizations_p) generatePolarizationsMap();
     357           0 :                         if (mapAntennaPairs_p) generateAntennaPairMap();
     358           0 :                         buffersInitialized_p = true;
     359           0 :                         flushFlags_p = false;
     360           0 :                         flushFlagRow_p = false;
     361           0 :                         bufferNo_p++;
     362             : 
     363           0 :                         moreBuffers = true;
     364             :                 }
     365             :                 else
     366             :                 {
     367             :                         // In CalTables there is only one iteration level
     368           0 :                         moreBuffers = false;
     369             :                 }
     370             :         }
     371             : 
     372             :         // Print chunk characteristics
     373           0 :         if (moreBuffers)
     374             :         {
     375             :                 // Get flag  (WARNING: We have to modify the shape of the cube before re-assigning it)
     376           0 :                 Cube<Bool> curentFlagCube= visibilityBuffer_p->flagCube();
     377           0 :                 modifiedFlagCube_p.resize(curentFlagCube.shape());
     378           0 :                 modifiedFlagCube_p = curentFlagCube;
     379           0 :                 originalFlagCube_p.resize(curentFlagCube.shape());
     380           0 :                 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           0 :                 modifiedFlagRow_p.resize(visibilityBuffer_p->nRows());
     385           0 :                 originalFlagRow_p.resize(visibilityBuffer_p->nRows());
     386             : 
     387             :                 // Compute total number of flags per buffer to be used for generating the agents stats
     388           0 :                 Int64 currentBufferCounts = curentFlagCube.shape().product();
     389           0 :                 chunkCounts_p += currentBufferCounts;
     390           0 :                 progressCounts_p += currentBufferCounts;
     391           0 :                 msCounts_p += currentBufferCounts;
     392             : 
     393             :                 // Print chunk characteristics
     394           0 :                 if (bufferNo_p == 1)
     395             :                 {
     396             :                         // jagonzal: This is correct because in CalTables there is only one iteration level
     397           0 :                         processedRows_p += visibilityBuffer_p->nRows();
     398             : 
     399           0 :                         if (printChunkSummary_p)
     400             :                         {
     401           0 :                                 logger_p->origin(LogOrigin("FlagCalTableHandler",""));
     402           0 :                                 Vector<Int> scan = visibilityBuffer_p->scan();
     403           0 :                                 Vector<Int> observation = visibilityBuffer_p->observationId();
     404           0 :                                 String corrs = "[ ";
     405           0 :                                 for (uInt corr_i=0;corr_i<(uInt) visibilityBuffer_p->nCorrelations();corr_i++)
     406             :                                 {
     407           0 :                                         corrs += (*polarizationIndexMap_p)[corr_i] + " ";
     408             :                                 }
     409           0 :                                 corrs += "]";
     410             : 
     411           0 :                                 Double progress  = 100.0* ((Double) processedRows_p / (Double) selectedCalTable_p->nrow());
     412             : 
     413           0 :                                 *logger_p << LogIO::NORMAL <<
     414           0 :                                                 "------------------------------------------------------------------------------------ " << LogIO::POST;
     415           0 :                                 *logger_p << LogIO::NORMAL <<
     416             :                                                 "Chunk = " << chunkNo_p << " [progress: " << (Int)progress << "%]"
     417           0 :                                                 ", Observation = " << observation[0] << "~" << observation[observation.size()-1] <<
     418           0 :                                                 ", Scan = " << scan[0] << "~" << scan[scan.size()-1] <<
     419           0 :                                                 ", Field = " << visibilityBuffer_p->fieldId()(0) << " (" << fieldNames_p->operator()(visibilityBuffer_p->fieldId()) << ")"
     420           0 :                                                 ", Spw = " << visibilityBuffer_p->spectralWindows()(0) <<
     421           0 :                                                 ", Channels = " << visibilityBuffer_p->nChannels() <<
     422             :                                                 ", CalSolutions = " << corrs <<
     423           0 :                                                 ", Total Rows = " << visibilityBuffer_p->nRows() << LogIO::POST;
     424           0 :                         }
     425             :                 }
     426           0 :         }
     427             : 
     428           0 :         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           0 : FlagCalTableHandler::flushFlags()
     550             : {
     551           0 :         if (flushFlags_p)
     552             :         {
     553           0 :                 calIter_p->setflag(modifiedFlagCube_p);
     554           0 :                 flushFlags_p = false;
     555             :         }
     556             : 
     557           0 :         return true;
     558             : }
     559             : 
     560             : 
     561             : // -----------------------------------------------------------------------
     562             : // Flush flags to CalTable
     563             : // -----------------------------------------------------------------------
     564             : String
     565           0 : FlagCalTableHandler::getTableName()
     566             : {
     567           0 :         return originalCalTable_p->tableName();
     568             : }
     569             : 
     570             : // -----------------------------------------------------------------------
     571             : // Signal true when a progress summary has to be printed
     572             : // -----------------------------------------------------------------------
     573             : bool
     574           0 : FlagCalTableHandler::summarySignal()
     575             : {
     576           0 :         Double progress = 100.0* ((Double) processedRows_p / (Double) selectedCalTable_p->nrow());
     577           0 :         if ((progress >= summaryThreshold_p) or (logger_p->priority() >= LogMessage::DEBUG1))
     578             :         {
     579           0 :                 summaryThreshold_p += 10;
     580           0 :                 printChunkSummary_p = true;
     581           0 :                 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           0 : FlagCalTableHandler::checkIfColumnExists(String column)
     596             : {
     597           0 :         return originalCalTable_p->tableDesc().isColumn(column);
     598             : }
     599             : 
     600             : //////////////////////////////////////////
     601             : //////// CTBuffer implementation ////////
     602             : //////////////////////////////////////////
     603             : 
     604           0 : CTCache::CTCache(CTIter *calIter): calIter_p(calIter)
     605             : {
     606           0 :         invalidate();
     607           0 : }
     608             : 
     609           0 : CTCache::~CTCache()
     610             : {
     611             : 
     612           0 : }
     613             : 
     614           0 : Int CTCache::arrayId()
     615             : {
     616           0 :         return -1;
     617             : }
     618             : 
     619           0 : Int CTCache::fieldId()
     620             : {
     621           0 :         if (!CTfieldIdOK_p)
     622             :         {
     623           0 :                 field0_p = calIter_p->field()[0];
     624           0 :                 CTfieldIdOK_p = false;
     625             :         }
     626             : 
     627           0 :         return field0_p;
     628             : }
     629             : 
     630           0 : Int CTCache::spectralWindow()
     631             : {
     632           0 :         if (!CTspectralWindowOK_p)
     633             :         {
     634           0 :                 Vector<Int> tmp = calIter_p->spw();
     635           0 :                 spw_p.resize(tmp.size(),false);
     636           0 :                 spw_p = tmp;
     637           0 :                 spw0_p = spw_p[0];
     638           0 :                 CTspectralWindowOK_p = true;
     639           0 :         }
     640             : 
     641           0 :         return spw0_p;
     642             : }
     643             : 
     644           0 : Vector<Int>& CTCache::scan()
     645             : {
     646           0 :         if (!CTscanOK_p)
     647             :         {
     648           0 :                 Vector<Int> tmp = calIter_p->scan();
     649           0 :                 scan_p.resize(tmp.size(),false);
     650           0 :                 scan_p = tmp;
     651           0 :                 CTscanOK_p = true;
     652           0 :         }
     653             : 
     654           0 :         return scan_p;
     655             : }
     656             : 
     657           0 : Vector<Double>& CTCache::time()
     658             : {
     659           0 :         if (!CTtimeOK_p)
     660             :         {
     661           0 :                 Vector<Double> tmp = calIter_p->time();
     662           0 :                 time_p.resize(tmp.size(),false);
     663           0 :                 time_p = tmp;
     664           0 :                 CTtimeOK_p = true;
     665           0 :         }
     666             : 
     667           0 :         return time_p;
     668             : }
     669             : 
     670           0 : Vector<Int>& CTCache::antenna1()
     671             : {
     672           0 :         if (!CTantenna1OK_p)
     673             :         {
     674           0 :                 Vector<Int> tmp = calIter_p->antenna1();
     675           0 :                 antenna1_p.resize(tmp.size(),false);
     676           0 :                 antenna1_p = tmp;
     677           0 :                 CTantenna1OK_p = true;
     678           0 :         }
     679             : 
     680           0 :         return antenna1_p;
     681             : }
     682             : 
     683           0 : Vector<Int>& CTCache::antenna2()
     684             : {
     685           0 :         if (!CTantenna2OK_p)
     686             :         {
     687           0 :                 Vector<Int> tmp = calIter_p->antenna2();
     688           0 :                 if (tmp[0] < 0) tmp = calIter_p->antenna1();
     689           0 :                 antenna2_p.resize(tmp.size(),false);
     690           0 :                 antenna2_p = tmp;
     691           0 :                 CTantenna2OK_p = true;
     692           0 :         }
     693             : 
     694           0 :         return antenna2_p;
     695             : }
     696             : 
     697           0 : Cube<Bool>& CTCache::flagCube()
     698             : {
     699           0 :         if (!CTflagCubeOk_p)
     700             :         {
     701           0 :                 Cube<Bool> tmp = calIter_p->flag();
     702           0 :                 flagCube_p.resize(tmp.shape(),false);
     703           0 :                 flagCube_p = tmp;
     704           0 :                 CTflagCubeOk_p = true;
     705             : 
     706             :                 // Also fill shapes
     707           0 :                 nRow_p = flagCube_p.shape()[2];
     708           0 :                 nRowChunk_p = flagCube_p.shape()[2];
     709           0 :                 nChannel_p = flagCube_p.shape()[1];
     710           0 :                 nCorr_p = flagCube_p.shape()[0];
     711             : 
     712           0 :                 CTnRowOK_p = true;
     713           0 :                 CTnRowChunkOK_p = true;
     714           0 :                 CTnChannelOK_p = true;
     715           0 :                 CTnCorrOK_p = true;
     716           0 :         }
     717             : 
     718           0 :         return flagCube_p;
     719             : }
     720             : 
     721           0 : Vector<Int>& CTCache::observationId()
     722             : {
     723           0 :         if (!CTobservationIdOK_p)
     724             :         {
     725           0 :                 Vector<Int> tmp = calIter_p->obs();
     726           0 :                 observationId_p.resize(tmp.size(),false);
     727           0 :                 observationId_p = tmp;
     728           0 :                 CTobservationIdOK_p = true;
     729           0 :         }
     730             : 
     731           0 :         return observationId_p;
     732             : }
     733             : 
     734           0 : Vector<Int>& CTCache::correlationTypes()
     735             : {
     736           0 :         if (!CTcorrTypeOK_p)
     737             :         {
     738           0 :                 if (!CTnRowOK_p) nCorrelations();
     739           0 :                 corrType_p.resize(nCorr_p,false);
     740           0 :                 for (uInt corr_i=0;corr_i<(uInt) nCorr_p;corr_i++)
     741             :                 {
     742           0 :                         corrType_p[corr_i] =  Stokes::NumberOfTypes+corr_i;
     743             :                 }
     744           0 :                 CTcorrTypeOK_p = true;
     745             :         }
     746             : 
     747           0 :         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           0 : Vector<Double>& CTCache::getFrequencies(Int /*rowInBuffer*/, Int /*frame*/)
     764             : {
     765           0 :         if (!CTfrequencyOK_p)
     766             :         {
     767           0 :                 Vector<Double> tmp = calIter_p->freq();
     768           0 :                 frequency_p.resize(tmp.size(),false);
     769           0 :                 frequency_p = tmp;
     770           0 :                 CTfrequencyOK_p = true;
     771           0 :         }
     772             : 
     773           0 :         return frequency_p;
     774             : }
     775             : 
     776           0 : Cube<Complex>& CTCache::visCube()
     777             : {
     778           0 :         if (!CTVisCubeOK_p)
     779             :         {
     780           0 :                 Cube<Float> tmp = calIter_p->fparam();
     781             : 
     782             :                 // Transform Cube<Float> into Cube<Complex>
     783           0 :                 Cube<Complex> tmpTrans(tmp.shape());
     784           0 :                 for (uInt idx1=0;idx1<tmp.shape()[0];idx1++)
     785             :                 {
     786           0 :                         for (uInt idx2=0;idx2<tmp.shape()[1];idx2++)
     787             :                         {
     788           0 :                                 for (uInt idx3=0;idx3<tmp.shape()[2];idx3++)
     789             :                                 {
     790           0 :                                         tmpTrans(idx1,idx2,idx3) = Complex(tmp(idx1,idx2,idx3),0);
     791             :                                 }
     792             :                         }
     793             :                 }
     794             : 
     795           0 :                 fparam_p.resize(tmpTrans.shape(),false);
     796           0 :                 fparam_p = tmpTrans;
     797           0 :                 CTVisCubeOK_p = true;
     798           0 :         }
     799             : 
     800           0 :         return fparam_p;
     801             : }
     802             : 
     803           0 : Cube<Complex>& CTCache::visCubeCorrected()
     804             : {
     805           0 :         if (!CTcorrectedVisCubeOK_p)
     806             :         {
     807           0 :                 Cube<Complex> tmp = calIter_p->cparam();
     808           0 :                 cparam_p.resize(tmp.shape(),false);
     809           0 :                 cparam_p = tmp;
     810           0 :                 CTcorrectedVisCubeOK_p = true;
     811           0 :         }
     812             : 
     813           0 :         return cparam_p;
     814             : }
     815             : 
     816           0 : Cube<Complex>& CTCache::visCubeModel()
     817             : {
     818           0 :         if (!CTmodelVisCubeOK_p)
     819             :         {
     820           0 :                 Cube<Float> tmp = calIter_p->snr();
     821             : 
     822             :                 // Transform Cube<Float> into Cube<Complex>
     823           0 :                 Cube<Complex> tmpTrans(tmp.shape());
     824           0 :                 for (uInt idx1=0;idx1<tmp.shape()[0];idx1++)
     825             :                 {
     826           0 :                         for (uInt idx2=0;idx2<tmp.shape()[1];idx2++)
     827             :                         {
     828           0 :                                 for (uInt idx3=0;idx3<tmp.shape()[2];idx3++)
     829             :                                 {
     830           0 :                                         tmpTrans(idx1,idx2,idx3) = Complex(tmp(idx1,idx2,idx3),0);
     831             :                                 }
     832             :                         }
     833             :                 }
     834             : 
     835           0 :                 snr_p.resize(tmpTrans.shape(),false);
     836           0 :                 snr_p = tmpTrans;
     837           0 :                 CTmodelVisCubeOK_p = true;
     838           0 :         }
     839             : 
     840           0 :         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           0 : Int CTCache::nRows()
     856             : {
     857           0 :         if (!CTnRowOK_p)
     858             :         {
     859           0 :                 if (!CTflagCubeOk_p) flagCube();
     860           0 :                 nRow_p = flagCube_p.shape()[2];
     861           0 :                 CTnRowOK_p = true;
     862             :         }
     863             : 
     864           0 :         return nRow_p;
     865             : }
     866             : 
     867           0 : Int CTCache::nChannels()
     868             : {
     869           0 :         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           0 :         return nChannel_p;
     877             : }
     878             : 
     879           0 : Int CTCache::nCorrelations()
     880             : {
     881           0 :         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           0 :         return nCorr_p;
     889             : }
     890             : 
     891           0 : void CTCache::invalidate()
     892             : {
     893           0 :         CTfieldIdOK_p = false;
     894           0 :         CTspectralWindowOK_p = false;
     895           0 :         CTscanOK_p = false;
     896           0 :         CTtimeOK_p = false;
     897           0 :         CTantenna1OK_p = false;
     898           0 :         CTantenna2OK_p = false;
     899           0 :         CTflagCubeOk_p = false;
     900           0 :         CTobservationIdOK_p = false;
     901           0 :         CTcorrTypeOK_p = false;
     902           0 :         CTchannelOK_p = false;
     903           0 :         CTfrequencyOK_p = false;
     904           0 :         CTVisCubeOK_p = false;
     905           0 :         CTcorrectedVisCubeOK_p = false;
     906           0 :         CTmodelVisCubeOK_p = false;
     907           0 :         CTnRowChunkOK_p = false;
     908           0 :         CTnRowOK_p = false;
     909           0 :         CTnChannelOK_p = false;
     910           0 :         CTnCorrOK_p = false;
     911             : 
     912           0 :         return;
     913             : }
     914             : 
     915             : 
     916             : } //# NAMESPACE CASA - END
     917             : 

Generated by: LCOV version 1.16