LCOV - code coverage report
Current view: top level - msvis/MSVis - VisBufferAsync.cc (source / functions) Hit Total Coverage
Test: casa_coverage.info Lines: 0 481 0.0 %
Date: 2023-10-25 08:47:59 Functions: 0 83 0.0 %

          Line data    Source code
       1             : /*
       2             :  * VisibilityBufferAsync.cc
       3             :  *
       4             :  *  Created on: Nov 1, 2010
       5             :  *      Author: jjacobs
       6             :  */
       7             : #include <stdcasa/UtilJ.h>
       8             : 
       9             : using namespace casacore;
      10             : #include <regex>  // >>>----------------> no compile failure
      11             : using namespace casa::utilj;
      12             : // include <regex>   >>>----------------> causes compile failure
      13             : #include <casacore/casa/Containers/Record.h>
      14             : 
      15             : #include <msvis/MSVis/VisBufferAsync.h>
      16             : #include <msvis/MSVis/VisBufferAsyncWrapper.h>
      17             : #include <msvis/MSVis/VisibilityIterator.h>
      18             : #include <msvis/MSVis/AsynchronousInterface.h>
      19             : #include <msvis/MSVis/VLAT.h>
      20             : 
      21             : #include <algorithm>
      22             : 
      23             : using std::transform;
      24             : 
      25             : #include <casacore/ms/MeasurementSets/MSColumns.h>
      26             : #include <typeinfo>
      27             : 
      28             : #define Log(level, ...) \
      29             :     {if (casa::asyncio::AsynchronousInterface::logThis (level)) \
      30             :          casa::async::Logger::get()->log (__VA_ARGS__);};
      31             : 
      32             : using namespace casacore;
      33             : namespace casa {
      34             : 
      35             : namespace asyncio {
      36             : 
      37             : template <typename MeasureType, typename AsMeasure>
      38             : MeasureType
      39           0 : unsharedCopyMeasure (const MeasureType & measure, AsMeasure asMeasure)
      40             : {
      41             :     // MeasureType is a derived type of MeasBase<> (e.g., MDirection, MEpoch, etc.)
      42             :     // AsMeasure is the MeasureHolder converter for the desired type (e.g., asMDirection, asMEpoch, etc.)
      43             : 
      44             :     // Make a completely distinct copy of this measure.  The
      45             :     // methods provided by a Measure always result in the sharing
      46             :     // of the measurement reference object so this roundabout
      47             :     // approach is necessary.
      48             : 
      49             :     // Using a MeasureHolder object, transform the contents of the
      50             :     // measure into a generic record.
      51             : 
      52           0 :     MeasureHolder original (measure);
      53           0 :     Record record;
      54           0 :     String err;
      55             : 
      56           0 :     original.toRecord(err, record);
      57             : 
      58             :     // Now use the record to create another MMeasure object using
      59             :     // the record created to hold the original's information.
      60             : 
      61           0 :     MeasureHolder copy;
      62           0 :     copy.fromRecord (err, record);
      63             : 
      64           0 :     MeasureType result = (copy .* asMeasure) ();
      65             : 
      66           0 :     return result;
      67             : }
      68             : 
      69             : } // end namespace asyncio
      70             : 
      71           0 : VisBufferAsync::VisBufferAsync ()
      72           0 :   : VisBuffer ()
      73             : {
      74           0 :     construct();
      75           0 : }
      76             : 
      77           0 : VisBufferAsync::VisBufferAsync (const VisBufferAsync & vb)
      78           0 : : VisBuffer ()
      79             : {
      80             : //    const VisBufferAsync * vb = dynamic_cast<const VisBufferAsync *> (& vb0);
      81             : //    ThrowIf (vb == NULL, "Cannot copy VisBuffer into VisBufferAsync");
      82             : 
      83           0 :     construct ();
      84             : 
      85           0 :     * this = vb;
      86           0 : }
      87             : 
      88           0 : VisBufferAsync::VisBufferAsync (ROVisibilityIterator & iter)
      89           0 :   : VisBuffer ()
      90             : {
      91           0 :     construct ();
      92             : 
      93           0 :     Log (2, "VisBufferAsync::VisBufferAsync: attaching in constructor this=%08x\n", this);
      94           0 :     attachToVisIter (iter);
      95           0 : }
      96             : 
      97             : 
      98           0 : VisBufferAsync::~VisBufferAsync ()
      99             : {
     100           0 :     Log (2, "Destroying VisBufferAsync; addr=0x%016x\n", this);
     101             : 
     102             :     // Should never be attached at the synchronous level
     103             : 
     104           0 :     Assert (visIter_p == NULL || ! twoWayConnection_p);
     105             : 
     106           0 :     delete msColumns_p;
     107           0 :     delete msd_p;
     108           0 : }
     109             : 
     110             : VisBufferAsync &
     111           0 : VisBufferAsync::operator= (const VisBufferAsync & other)
     112             : {
     113           0 :     if (this != & other){
     114             : 
     115           0 :         assign (other, true);
     116             :     }
     117             : 
     118           0 :     return * this;
     119             : }
     120             : 
     121             : void
     122           0 : VisBufferAsync::allSelectedSpectralWindows(Vector<Int> & spectralWindows,
     123             :                                            Vector<Int>& nVisibilityChannels)
     124             : {
     125           0 :     spectralWindows.assign (selectedSpectralWindows_p);
     126           0 :     nVisibilityChannels.assign (selectedNVisibilityChannels_p);
     127           0 : }
     128             : 
     129             : VisBufferAsync &
     130           0 : VisBufferAsync::assign (const VisBuffer & other, Bool copy)
     131             : {
     132           0 :     if (this != & other){
     133             : 
     134             :         //    assert (copy); // The copy parameter is ignored since it makes no sense to
     135             :         //                   // assign a VBA without copying its values
     136             : 
     137           0 :         Log (2, "Assign from VisBufferAsync @ 0x%08x to VisBufferAsync @ 0x%08x\n", & other, this);
     138             : 
     139           0 :         Assert (dynamic_cast<const VisBufferAsync *> (& other) != NULL);
     140           0 :         Assert (visIter_p == NULL); // shouldn't be attached at sync level
     141             : 
     142           0 :         if (other.corrSorted_p)
     143           0 :             throw(AipsError("Cannot assign a VisBuffer that has had correlations sorted!"));
     144             : 
     145           0 :         azelCachedTime_p = 0; // flush this cached value
     146           0 :         feedpaCachedTime_p = 0; // flush this cached value
     147           0 :         parangCachedTime_p = 0; // flush this cached value
     148             : 
     149           0 :         if (copy){
     150             : 
     151             :             // Let the standard VisBuffer do the copying of values
     152             :             // from the old VisBuffer
     153             : 
     154           0 :             copyCache (other, false);
     155             : 
     156             :             // Copy over the async values
     157             : 
     158           0 :             copyAsyncValues (dynamic_cast<const VisBufferAsync &> (other));
     159             : 
     160             :         }
     161             :     }
     162             : 
     163           0 :     return * this;
     164             : }
     165             : 
     166             : void
     167           0 : VisBufferAsync::attachToVisIter(ROVisibilityIterator & iter)
     168             : {
     169           0 :     Assert (isFilling_p == true); // Only allowed while being filled
     170           0 :     Assert (visIter_p == NULL);   // Shouldn't already be attached
     171             : 
     172           0 :     VisBuffer::attachToVisIter(iter);
     173           0 : }
     174             : 
     175             : Vector<MDirection>
     176           0 : VisBufferAsync::azel(Double time) const
     177             : {
     178           0 :     if (time != azelCachedTime_p){
     179             : 
     180           0 :         azelCachedTime_p = time;
     181             : 
     182           0 :         ROVisibilityIterator::azelCalculate (time, * msd_p, azelCached_p, nAntennas_p, mEpoch_p);
     183             :     }
     184             : 
     185           0 :     return azelCached_p;
     186             : }
     187             : 
     188             : MDirection
     189           0 : VisBufferAsync::azel0(Double time) const
     190             : {
     191           0 :     MDirection azel0;
     192             :     //MSDerivedValues msd;
     193             :     //msd.setMeasurementSet (* measurementSet_p);
     194             : 
     195             : 
     196           0 :     ROVisibilityIterator::azel0Calculate (time, * msd_p, azel0, mEpoch_p);
     197             : 
     198           0 :     return azel0;
     199             : }
     200             : 
     201             : void
     202           0 : VisBufferAsync::checkVisIter (const char * func, const char * file, int line, const char * extra) const
     203             : {
     204             :     // This is called from a VisBuffer fill method.  Throw an error if the this is not
     205             :     // part of the VLAT filling operation or if there is not visibility iterator attached
     206             : 
     207           0 :     if (visIter_p == NULL){
     208           0 :         Log (1, "VisBufferAsync: request for column not in prefetched set (in call to %s (%s))\n)",
     209             :              func, extra);
     210             :         throw AipsErrorTrace ("VisBufferAsync: request for column not in prefetched set (in call to "
     211           0 :                               + String (func) + String (extra) + ")", file, line);
     212             :     }
     213           0 : }
     214             : 
     215             : 
     216             : void
     217           0 : VisBufferAsync::clear ()
     218             : {
     219           0 :     Log (2, "Clearing VisBufferAsync; addr=0x%016x\n", this);
     220             : 
     221             :     // Put scalars to deterministic values
     222             : 
     223           0 :     dataDescriptionId_p = -1;
     224           0 :     measurementSet_p = NULL;
     225           0 :     nAntennas_p = 0;
     226             : 
     227           0 :     invalidateAsync ();  // set all the flags to indicate caches are empty
     228             : 
     229             :     // Since VBA was created using a shallow copy of shared data
     230             :     // it is necessary to break the linkage with the shared data
     231             :     // while the shared data is locked.  Otherwise there could be
     232             :     // some interaction between the base and lookahead threads
     233             :     // because of the reference counted data structures, etc.
     234             : 
     235             :     // Wipe the fields that are part of VisBuffer proper
     236             : 
     237           0 :     if (antenna1OK_p)
     238           0 :         antenna1_p.resize();
     239           0 :     if (antenna2OK_p)
     240           0 :         antenna2_p.resize();
     241           0 :     chanAveBounds_p.resize();
     242             :     //chanFreqs_p = NULL;
     243           0 :     if (channelOK_p)
     244           0 :         channel_p.resize();
     245           0 :     if (cjonesOK_p)
     246           0 :         cjones_p.resize();
     247           0 :     if (corrTypeOK_p)
     248           0 :         corrType_p.resize();
     249           0 :     if (correctedVisCubeOK_p)
     250           0 :         correctedVisCube_p.resize();
     251           0 :     if (correctedVisibilityOK_p)
     252           0 :         correctedVisibility_p.resize();
     253           0 :     if (direction1OK_p)
     254           0 :         direction1_p.resize();
     255           0 :     if (direction2OK_p)
     256           0 :         direction2_p.resize();
     257           0 :     if (feed1OK_p)
     258           0 :         feed1_p.resize();
     259           0 :     if (feed1_paOK_p)
     260           0 :         feed1_pa_p.resize();
     261           0 :     if (feed2OK_p)
     262           0 :         feed2_p.resize();
     263           0 :     if (feed2_paOK_p)
     264           0 :         feed2_pa_p.resize();
     265           0 :     if (flagCubeOK_p)
     266           0 :         flagCube_p.resize();
     267           0 :     if (flagRowOK_p)
     268           0 :         flagRow_p.resize();
     269           0 :     if (flagOK_p)
     270           0 :         flag_p.resize();
     271           0 :     if (frequencyOK_p)
     272           0 :         frequency_p.resize();
     273           0 :     if (imagingWeightOK_p)
     274           0 :         imagingWeight_p.resize();
     275             : //    if (lsrFrequencyOK_p)
     276             : //        lsrFrequency_p.resize();
     277           0 :     measurementSet_p = NULL;
     278           0 :     if (modelVisCubeOK_p)
     279           0 :         modelVisCube_p.resize();
     280           0 :     if (modelVisibilityOK_p)
     281           0 :         modelVisibility_p.resize();
     282           0 :     delete msColumns_p;
     283           0 :     msColumns_p = NULL;
     284           0 :     nAntennas_p = -1;
     285           0 :     nCoh_p = -1;
     286           0 :     phaseCenter_p = MDirection ();
     287           0 :     if (rowIdsOK_p)
     288           0 :         rowIds_p.resize();
     289           0 :     if (scanOK_p)
     290           0 :         scan_p.resize();
     291           0 :     if (sigmaMatOK_p)
     292           0 :         sigmaMat_p.resize();
     293           0 :     if (sigmaOK_p)
     294           0 :         sigma_p.resize();
     295           0 :     if (timeIntervalOK_p)
     296           0 :         timeInterval_p.resize();
     297           0 :     if (timeOK_p)
     298           0 :         time_p.resize();
     299           0 :     if (uvwMatOK_p)
     300           0 :         uvwMat_p.resize();
     301           0 :     if (uvwOK_p)
     302           0 :         uvw_p.resize();
     303           0 :     if (visCubeOK_p)
     304           0 :         visCube_p.resize();
     305           0 :     if (visibilityOK_p)
     306           0 :         visibility_p.resize();
     307           0 :     weightCube_p.resize();
     308           0 :     if (weightMatOK_p)
     309           0 :         weightMat_p.resize();
     310           0 :     if (weightSpectrumOK_p)
     311           0 :         weightSpectrum_p.resize();
     312           0 :     if (weightOK_p)
     313           0 :         weight_p.resize();
     314             : 
     315             :     // Wipe fields that are part of VisBufferAsync only
     316             : 
     317             :     //delete msd_p;
     318             :     //msd_p = new MSDerivedValues();
     319             : 
     320           0 :     channelGroupNumber_p.resize (0);
     321           0 :     channelIncrement_p.resize (0);
     322           0 :     channelStart_p.resize (0);
     323           0 :     channelWidth_p.resize (0);
     324           0 :     lsrFrequency_p.resize (0);
     325           0 :     mEpoch_p = MEpoch();
     326           0 :     observatoryPosition_p = MPosition();
     327           0 :     phaseCenter_p = MDirection();
     328           0 :     receptor0Angle_p.resize (0);
     329           0 :     rowIds_p.resize (0);
     330           0 :     selFreq_p.resize (0);
     331           0 :     selectedNVisibilityChannels_p.resize (0);
     332           0 :     selectedSpectralWindows_p.resize (0);
     333           0 :     visibilityShape_p.resize (0, false);
     334           0 : }
     335             : 
     336             : VisBuffer *
     337           0 : VisBufferAsync::clone () const
     338             : {
     339           0 :     return new VisBufferAsync (* this);
     340             : }
     341             : 
     342             : 
     343             : void
     344           0 : VisBufferAsync::construct ()
     345             : {
     346           0 :     Log (2, "Constructing VisBufferAsync; addr=0x%016x\n", this);
     347             : 
     348           0 :     initializeScalars ();
     349             : 
     350           0 :     azelCachedTime_p = 0; // tag azel as currently uncached
     351           0 :     feedpaCachedTime_p = 0; // tag azel as currently uncached
     352           0 :     parangCachedTime_p = 0; // tag azel as currently uncached
     353           0 :     msColumns_p = NULL;
     354           0 :     visIter_p = NULL;
     355           0 :     isFilling_p = false;
     356           0 :     msd_p = new MSDerivedValues();
     357             : 
     358           0 :     clear ();
     359           0 : }
     360             : 
     361             : void
     362           0 : VisBufferAsync::copyCache (const VisBuffer & other, Bool force)
     363             : {
     364           0 :     assert (! force);
     365             :     UnusedVariable (force);
     366             : 
     367           0 :     VisBuffer::copyCache (other, false);
     368           0 : }
     369             : 
     370             : 
     371             : void
     372           0 : VisBufferAsync::copyAsyncValues (const VisBufferAsync & other)
     373             : {
     374             : 
     375           0 :     channelGroupNumber_p = other.channelGroupNumber_p;
     376           0 :     channelIncrement_p = other.channelIncrement_p;
     377           0 :     channelStart_p = other.channelStart_p;
     378           0 :     channelWidth_p = other.channelWidth_p;
     379             : 
     380           0 :     dataDescriptionId_p = other.dataDescriptionId_p;
     381           0 :     lsrFrequency_p = other.lsrFrequency_p;
     382           0 :     measurementSet_p = other.measurementSet_p;
     383           0 :     mEpoch_p = other.mEpoch_p;
     384             : 
     385             : 
     386           0 :     delete msColumns_p; // kill the current one
     387           0 :     msColumns_p = NULL;
     388             : 
     389           0 :     nAntennas_p = other.nAntennas_p;
     390           0 :     newArrayId_p = other.newArrayId_p;
     391           0 :     newFieldId_p = other.newFieldId_p;
     392           0 :     newSpectralWindow_p = other.newSpectralWindow_p;
     393           0 :     nRowChunk_p = other.nRowChunk_p;
     394             : //    obsMFreqTypes_p = other.obsMFreqTypes_p;
     395           0 :     observatoryPosition_p = other.observatoryPosition_p;
     396           0 :     phaseCenter_p = other.phaseCenter_p;
     397           0 :     receptor0Angle_p = other.receptor0Angle_p;
     398           0 :     rowIds_p = other.rowIds_p;
     399           0 :     selectedNVisibilityChannels_p = other.selectedNVisibilityChannels_p;
     400           0 :     selectedSpectralWindows_p = other.selectedSpectralWindows_p;
     401           0 :     selFreq_p = other.selFreq_p;
     402           0 :     velSelection_p = other.velSelection_p;
     403           0 :     visibilityShape_p = other.visibilityShape_p;
     404             : 
     405           0 :     setMSD (* other.msd_p);
     406           0 : }
     407             : 
     408             : 
     409             : //VisBuffer *
     410             : //VisBufferAsync::create (const VisBuffer & other)
     411             : //{
     412             : //
     413             : //    VisBuffer * result;
     414             : //
     415             : //    if (ROVisibilityIteratorAsync::isAsynchronousIoEnabled ()){
     416             : //
     417             : //        result = new VisBufferAsync (other);
     418             : //
     419             : //    }
     420             : //    else {
     421             : //
     422             : //
     423             : //        result = new VisBuffer (other);
     424             : //    }
     425             : //
     426             : //    return result;
     427             : //}
     428             : 
     429             : 
     430             : //VisBuffer *
     431             : //VisBufferAsync::create (ROVisibilityIterator & iter)
     432             : //{
     433             : //    return create (& iter);
     434             : //}
     435             : //
     436             : //VisBuffer *
     437             : //VisBufferAsync::create (ROVisibilityIterator * iter)
     438             : //{
     439             : //    VisBuffer * result = NULL;
     440             : //    ROVisibilityIteratorAsync * via = dynamic_cast<ROVisibilityIteratorAsync *> (iter);
     441             : //
     442             : //    bool createAsynchronous = ROVisibilityIteratorAsync::isAsynchronousIoEnabled () &&
     443             : //                              via != NULL;
     444             : //
     445             : //    if (createAsynchronous){
     446             : //
     447             : //        // Asynchronous I/O is enabled so return a
     448             : //        // VisBufferAsync
     449             : //
     450             : //        Assert (via != NULL); // mixing VB with other than a ROVIA is not good
     451             : //        result = new VisBufferAsync (* via);
     452             : //    }
     453             : //    else {
     454             : //
     455             : //        // By default return a normal VisBuffer
     456             : //
     457             : //        Assert (via == NULL); // mixing VB with a ROVIA is not good
     458             : //
     459             : //        result = new VisBuffer (* iter);
     460             : //    }
     461             : //
     462             : //    String reason;
     463             : //    if (ROVisibilityIteratorAsync::isAsynchronousIoEnabled ()){
     464             : //        if (via == NULL){
     465             : //            reason = format (" (synchronous iterator received: %s)", typeid (* iter).name());
     466             : //        }
     467             : //        else{
     468             : //            reason = format ("Async; addr=0x%016x", result);
     469             : //        }
     470             : //
     471             : //    }
     472             : //    else{
     473             : //        reason = " (async I/O disabled)";
     474             : //    }
     475             : //
     476             : //    Log (2, "Created VisBuffer%s\n", reason.c_str());
     477             : //    //printBacktrace (cerr, "VisBufferAsync creation");
     478             : //
     479             : //    return result;
     480             : //}
     481             : 
     482             : 
     483             : //Int
     484             : //VisBufferAsync::dataDescriptionId() const
     485             : //{
     486             : //    return dataDescriptionId_p;
     487             : //}
     488             : 
     489             : void
     490           0 : VisBufferAsync::detachFromVisIter ()
     491             : {
     492             : 
     493           0 :         if (isFilling_p){
     494           0 :             VisBuffer::detachFromVisIter();
     495             :         }
     496           0 : }
     497             : 
     498             : 
     499             : Vector<Float>
     500           0 : VisBufferAsync::feed_pa(Double time) const
     501             : {
     502           0 :     if (time != feedpaCachedTime_p){
     503             : 
     504           0 :         feedpaCachedTime_p = time;
     505             : 
     506           0 :         if (visIter_p != NULL){
     507             : 
     508             :             // This method can be called during filling; if so then let it
     509             :             // work the original way (possible hole for detached VBAs).
     510             : 
     511           0 :             feedpaCached_p = VisBuffer::feed_pa (time);
     512             :         }
     513             :         else{
     514             : 
     515             :             //MSDerivedValues msd;
     516             :             //msd.setMeasurementSet (* measurementSet_p);
     517             : 
     518           0 :             feedpaCached_p.assign (ROVisibilityIterator::feed_paCalculate (time, * msd_p, nAntennas_p,
     519           0 :                                                                            mEpoch_p, receptor0Angle_p));
     520             :         }
     521             : 
     522             :     }
     523             : 
     524           0 :     return feedpaCached_p;
     525             : }
     526             : 
     527             : Bool
     528           0 : VisBufferAsync::fillAllBeamOffsetsZero ()
     529             : {
     530           0 :     allBeamOffsetsZero_p = visIter_p->allBeamOffsetsZero();
     531             : 
     532           0 :     return allBeamOffsetsZero_p;
     533             : }
     534             : 
     535             : Vector <String>
     536           0 : VisBufferAsync::fillAntennaMounts ()
     537             : {
     538           0 :     antennaMounts_p = visIter_p->antennaMounts();
     539             : 
     540           0 :     return antennaMounts_p;
     541             : }
     542             : 
     543             : Cube <RigidVector <Double, 2> >
     544           0 : VisBufferAsync::fillBeamOffsets ()
     545             : {
     546           0 :     beamOffsets_p = visIter_p->getBeamOffsets ();
     547             : 
     548           0 :     return beamOffsets_p;
     549             : }
     550             : 
     551             : Cube <Double>
     552           0 : VisBufferAsync::fillReceptorAngles ()
     553             : {
     554           0 :     receptorAngles_p = visIter_p->receptorAngles();
     555             : 
     556           0 :     return receptorAngles_p;
     557             : }
     558             : 
     559             : 
     560             : void
     561           0 : VisBufferAsync::fillFrom (const VisBufferAsync & other)
     562             : {
     563             :     // Almost like assignment except that the attachment to the
     564             :     // Visibility iterator is preserved.  Only used for copying
     565             :     // data from the buffer ring into the user's VB
     566             : 
     567           0 :     Log (2, "Fill from VisBufferAsync @ 0x%08x to VisBufferAsync @ 0x%08x\n", & other, this);
     568             : 
     569           0 :     copyCache (other, false);
     570           0 :     copyAsyncValues (other);
     571             : 
     572           0 : }
     573             : 
     574             : Vector<MDirection>&
     575           0 : VisBufferAsync::fillDirection1()
     576             : {
     577             :     // Perform filling in the normal way
     578             : 
     579           0 :     VisBuffer::fillDirection1();
     580             : 
     581           0 :     if (isFilling_p) {
     582             : 
     583             :         // Now install unshared copies of the direction objects
     584             : 
     585           0 :         unsharedCopyDirectionVector (direction1_p);
     586             : 
     587             :     }
     588             : 
     589           0 :     return direction1_p;
     590             : }
     591             : 
     592             : 
     593             : 
     594             : Vector<MDirection>&
     595           0 : VisBufferAsync::fillDirection2()
     596             : {
     597             :     // Perform filling in the normal way
     598             : 
     599           0 :     VisBuffer::fillDirection2();
     600             : 
     601           0 :     if (isFilling_p){
     602             : 
     603             :         // Now install unshared copies of the direction objects
     604             : 
     605           0 :         unsharedCopyDirectionVector (direction2_p);
     606             : 
     607             :     }
     608             : 
     609           0 :     return direction2_p;
     610             : }
     611             : 
     612             : MDirection &
     613           0 : VisBufferAsync::fillPhaseCenter()
     614             : {
     615             :     // Perform filling in the normal way
     616             : 
     617           0 :     VisBuffer::fillPhaseCenter();
     618             : 
     619             :     // Now convert the value to an unshared one.
     620             : 
     621           0 :     phaseCenter_p = unsharedCopyDirection (phaseCenter_p);
     622           0 :     phaseCenterOK_p = true;
     623             : 
     624           0 :     return phaseCenter_p;
     625             : }
     626             : 
     627             : Bool
     628           0 : VisBufferAsync::getAllBeamOffsetsZero () const
     629             : {
     630           0 :     return allBeamOffsetsZero_p;
     631             : }
     632             : 
     633             : const Vector <String> &
     634           0 : VisBufferAsync::getAntennaMounts () const
     635             : {
     636           0 :     return antennaMounts_p;
     637             : }
     638             : 
     639             : const Cube <RigidVector <Double, 2> > &
     640           0 : VisBufferAsync::getBeamOffsets () const
     641             : {
     642           0 :     return beamOffsets_p;
     643             : }
     644             : 
     645             : 
     646             : const MeasurementSet &
     647           0 : VisBufferAsync::getMs () const
     648             : {
     649           0 :     return * measurementSet_p;
     650             : }
     651             : 
     652             : Int
     653           0 : VisBufferAsync::getNSpw () const
     654             : {
     655           0 :     return nSpw_p;
     656             : }
     657             : 
     658             : 
     659             : MDirection
     660           0 : VisBufferAsync::getPhaseCenter () const
     661             : {
     662           0 :     return phaseCenter_p;
     663             : }
     664             : 
     665             : 
     666             : const Cube <Double> &
     667           0 : VisBufferAsync::getReceptorAngles () const
     668             : {
     669           0 :     return receptorAngles_p;
     670             : }
     671             : 
     672             : Double
     673           0 : VisBufferAsync::hourang(Double time) const
     674             : {
     675             :     //MSDerivedValues msd;
     676             :     //msd.setMeasurementSet (* measurementSet_p);
     677             : 
     678           0 :     Double hourang = ROVisibilityIterator::hourangCalculate (time, * msd_p, mEpoch_p);
     679             : 
     680           0 :     return hourang;
     681             : }
     682             : 
     683             : void
     684           0 : VisBufferAsync::initializeScalars ()
     685             : {
     686             :     // Set all VBA specific scalars to known values to prevent
     687             :     // nondeterminism.
     688             : 
     689           0 :     dataDescriptionId_p = -1;
     690           0 :     feedpaCachedTime_p = -1;
     691           0 :     isFilling_p = false;
     692           0 :     measurementSet_p = NULL;
     693           0 :     msColumns_p = NULL;
     694           0 :     msd_p = NULL;
     695           0 :     nAntennas_p = -1;
     696           0 :     nCoh_p = -1;
     697           0 :     newArrayId_p = false;
     698           0 :     newFieldId_p = false;
     699           0 :     newSpectralWindow_p = false;
     700           0 :     nRowChunk_p = -1;
     701           0 :     nSpw_p = -1;
     702           0 :     parangCachedTime_p = -1;
     703           0 :     polarizationId_p = -1;
     704           0 :     velSelection_p = false;
     705           0 : }
     706             : 
     707             : void
     708           0 : VisBufferAsync::invalidate ()
     709             : {
     710             :     // This is called by synchronous code.  Just ignore it since
     711             :     // the cache validity is being managed by async code.  To really
     712             :     // invalidate use invalidateAsync.
     713           0 : }
     714             : 
     715             : void
     716           0 : VisBufferAsync::invalidateAsync ()
     717             : {
     718             :     // A way for the new code to invalidate the buffer that
     719             :     // can be distinguished from the old way.
     720             : 
     721           0 :     VisBuffer::invalidate ();
     722           0 : }
     723             : 
     724             : void
     725           0 : VisBufferAsync::lsrFrequency (const Int& spw, Vector<Double>& freq, Bool& convert) const
     726             : {
     727           0 :     if (velSelection_p) {
     728           0 :         freq.assign (lsrFrequency_p);
     729           0 :         convert = false;
     730           0 :         return;
     731             :     }
     732             : 
     733           0 :     const ArrayColumn <Double> & chanFreqs = msColumns().spectralWindow().chanFreq();
     734           0 :     const ScalarColumn<Int> & obsMFreqTypes= msColumns().spectralWindow().measFreqRef();
     735             : 
     736           0 :     MPosition obsPos = observatoryPosition_p;
     737           0 :     MDirection dir = phaseCenter_p;
     738             : 
     739           0 :     ROVisibilityIterator::lsrFrequency (spw, freq, convert, channelStart_p, channelWidth_p, channelIncrement_p,
     740           0 :                                         channelGroupNumber_p, chanFreqs, obsMFreqTypes, mEpoch_p, obsPos, dir);
     741             : }
     742             : 
     743             : const MSColumns &
     744           0 : VisBufferAsync::msColumns() const
     745             : {
     746           0 :     if (isFilling_p){
     747             : 
     748           0 :         Assert (visIter_p != NULL);
     749             : 
     750           0 :         return visIter_p->msColumns ();
     751             :     }
     752             :     else {
     753             : 
     754           0 :         Assert (measurementSet_p != NULL);
     755             : 
     756           0 :         if (msColumns_p == NULL){
     757           0 :             msColumns_p = new MSColumns (* measurementSet_p);
     758             :         }
     759             : 
     760           0 :         return * msColumns_p;
     761             :     }
     762             : }
     763             : 
     764             : Int
     765           0 : VisBufferAsync::msId () const
     766             : {
     767           0 :     return oldMSId_p;
     768             : }
     769             : 
     770             : Bool
     771           0 : VisBufferAsync::newArrayId () const
     772             : {
     773           0 :     return newArrayId_p;
     774             : }
     775             : 
     776             : Bool
     777           0 : VisBufferAsync::newFieldId () const
     778             : {
     779           0 :     return newFieldId_p;
     780             : }
     781             : 
     782             : Bool
     783           0 : VisBufferAsync::newSpectralWindow () const
     784             : {
     785           0 :     return newSpectralWindow_p;
     786             : }
     787             : 
     788             : 
     789             : Bool
     790           0 : VisBufferAsync::newMS() const
     791             : {
     792           0 :     return newMS_p;
     793             : }
     794             : 
     795             : 
     796             : Int
     797           0 : VisBufferAsync::numberAnt () const
     798             : {
     799           0 :   return nAntennas_p;
     800             : }
     801             : 
     802             : Int
     803           0 : VisBufferAsync::numberCoh () const
     804             : {
     805           0 :     return nCoh_p;
     806             : }
     807             : 
     808             : 
     809             : Vector<Float>
     810           0 : VisBufferAsync::parang(Double time) const
     811             : {
     812           0 :     if (time != parangCachedTime_p){
     813             : 
     814           0 :         parangCachedTime_p = time;
     815             : 
     816           0 :         parangCached_p = ROVisibilityIterator::parangCalculate (time, * msd_p, nAntennas_p, mEpoch_p);
     817             :     }
     818             : 
     819           0 :     return parangCached_p;
     820             : }
     821             : 
     822             : Float
     823           0 : VisBufferAsync::parang0(Double time) const
     824             : {
     825             :     //MSDerivedValues msd;
     826             :     //msd.setMeasurementSet (* measurementSet_p);
     827             : 
     828           0 :     Float parang0 = ROVisibilityIterator::parang0Calculate (time, * msd_p, mEpoch_p);
     829             : 
     830           0 :     return parang0;
     831             : }
     832             : 
     833             : Int
     834           0 : VisBufferAsync::polarizationId() const
     835             : {
     836           0 :     return polarizationId_p;
     837             : }
     838             : 
     839             : 
     840             : 
     841             : //Vector<uInt>&
     842             : //VisBufferAsync::rowIds()
     843             : //{
     844             : //    return rowIds_p;
     845             : //}
     846             : 
     847             : //void
     848             : //VisBufferAsync::setDataDescriptionId (Int id)
     849             : //{
     850             : //    dataDescriptionId_p = id;
     851             : //}
     852             : 
     853             : void
     854           0 : VisBufferAsync::setCorrectedVisCube(Complex c)
     855             : {
     856           0 :     correctedVisCube_p.resize(visibilityShape_p);
     857           0 :     correctedVisCube_p.set(c);
     858           0 :     correctedVisCubeOK_p=true;
     859           0 : }
     860             : 
     861             : void
     862           0 : VisBufferAsync::setCorrectedVisCube (const Cube<Complex> & vis)
     863             : {
     864           0 :     VisBuffer::setCorrectedVisCube (vis);
     865           0 : }
     866             : 
     867             : 
     868             : void
     869           0 : VisBufferAsync::setModelVisCube (const Cube<Complex> & vis)
     870             : {
     871           0 :     VisBuffer::setModelVisCube (vis);
     872           0 : }
     873             : 
     874             : void
     875           0 : VisBufferAsync::setModelVisCube (const Vector<Float> & stokes)
     876             : {
     877           0 :     VisBuffer::setModelVisCube (stokes);
     878           0 : }
     879             : 
     880             : void
     881           0 : VisBufferAsync::setNRowChunk (Int nRowChunk)
     882             : {
     883           0 :     nRowChunk_p = nRowChunk;
     884           0 : }
     885             : 
     886             : 
     887             : void
     888           0 : VisBufferAsync::setFilling (Bool isFilling)
     889             : {
     890           0 :     isFilling_p = isFilling;
     891           0 : }
     892             : 
     893             : void
     894           0 : VisBufferAsync::setLsrInfo (const Block <Int> & channelGroupNumber,
     895             :                             const Block <Int> & channelIncrement,
     896             :                             const Block <Int> & channelStart,
     897             :                             const Block <Int> & channelWidth,
     898             :                             const MPosition & observatoryPosition,
     899             :                             const MDirection & phaseCenter,
     900             :                             Bool velocitySelection)
     901             : {
     902           0 :     channelGroupNumber_p = channelGroupNumber;
     903           0 :     channelIncrement_p = channelIncrement;
     904           0 :     channelStart_p = channelStart;
     905           0 :     channelWidth_p = channelWidth;
     906           0 :     observatoryPosition_p = unsharedCopyPosition (observatoryPosition);
     907           0 :     phaseCenter_p = unsharedCopyDirection (phaseCenter);
     908           0 :     velSelection_p = velocitySelection;
     909           0 : }
     910             : 
     911             : 
     912             : void
     913           0 : VisBufferAsync::setMeasurementSet (const MeasurementSet & ms)
     914             : {
     915           0 :     measurementSet_p = & ms;
     916             :     //msd_p->setMeasurementSet (ms);
     917           0 : }
     918             : 
     919             : void
     920           0 : VisBufferAsync::setMeasurementSetId (Int id, Bool isNew)
     921             : {
     922           0 :     oldMSId_p = id;
     923           0 :     msOK_p = true;
     924           0 :     newMS_p = isNew;
     925           0 : }
     926             : 
     927             : 
     928             : void
     929           0 : VisBufferAsync::setMEpoch (const MEpoch & mEpoch)
     930             : {
     931           0 :     mEpoch_p = unsharedCopyEpoch (mEpoch);
     932           0 : }
     933             : 
     934             : void
     935           0 : VisBufferAsync::setModelVisCube(Complex c)
     936             : {
     937           0 :     modelVisCube_p.resize(visibilityShape_p);
     938           0 :     modelVisCube_p.set(c);
     939           0 :     modelVisCubeOK_p=true;
     940           0 : }
     941             : 
     942             : void
     943           0 : VisBufferAsync::setMSD (const MSDerivedValues & msd)
     944             : {
     945           0 :     * msd_p = msd;
     946             : 
     947           0 :     msd_p->setEpoch (mEpoch_p);
     948             : 
     949             :     // set antennas
     950             : 
     951           0 :     const Vector<MPosition> & antennaPositions = msd.getAntennaPositions();
     952           0 :     Vector<MPosition> unsharedAntennaPositions (antennaPositions.nelements());
     953             : 
     954           0 :     for (Vector<MPosition>::const_iterator ap = antennaPositions.begin();
     955           0 :             ap != antennaPositions.end();
     956             :             ap ++){
     957             : 
     958           0 :         unsharedAntennaPositions = unsharedCopyPosition (* ap);
     959             :     }
     960             : 
     961           0 :     msd_p->setAntennaPositions (unsharedAntennaPositions);
     962             : 
     963           0 :     msd_p->setObservatoryPosition (observatoryPosition_p);
     964             : 
     965           0 :     msd_p->setFieldCenter (phaseCenter_p);
     966             : 
     967           0 :     msd_p->setVelocityFrame (msd.getRadialVelocityType ());
     968           0 : }
     969             : 
     970             : 
     971             : void
     972           0 : VisBufferAsync::setNAntennas (Int nAntennas)
     973             : {
     974           0 :     nAntennas_p = nAntennas;
     975           0 : }
     976             : 
     977             : void
     978           0 : VisBufferAsync::setNCoh (Int nCoh)
     979             : {
     980           0 :     nCoh_p = nCoh;
     981           0 : }
     982             : 
     983             : void
     984           0 : VisBufferAsync::setNewEntityFlags (bool newArrayId, bool newFieldId, bool newSpectralWindow)
     985             : {
     986           0 :     newArrayId_p = newArrayId;
     987           0 :     newFieldId_p = newFieldId;
     988           0 :     newSpectralWindow_p = newSpectralWindow;
     989           0 : }
     990             : 
     991             : void
     992           0 : VisBufferAsync::setNSpw (Int nSpw)
     993             : {
     994           0 :     nSpw_p = nSpw;
     995           0 : }
     996             : 
     997             : 
     998             : void
     999           0 : VisBufferAsync::setPolarizationId (Int pId)
    1000             : {
    1001           0 :     polarizationId_p = pId;
    1002           0 : }
    1003             : 
    1004             : void
    1005           0 : VisBufferAsync::setReceptor0Angle (const Vector<Float> & angles)
    1006             : {
    1007           0 :     receptor0Angle_p = angles;
    1008           0 : }
    1009             : 
    1010             : void
    1011           0 : VisBufferAsync::setRowIds (const Vector<rownr_t> & rowIds)
    1012             : {
    1013           0 :     rowIds_p = rowIds;
    1014           0 : }
    1015             : 
    1016             : void
    1017           0 : VisBufferAsync::setSelectedNVisibilityChannels (const Vector<Int> & nVisibilityChannels)
    1018             : {
    1019           0 :     selectedNVisibilityChannels_p.assign (nVisibilityChannels);
    1020           0 : }
    1021             : 
    1022             : void
    1023           0 : VisBufferAsync::setSelectedSpectralWindows (const Vector<Int> & spectralWindows)
    1024             : {
    1025           0 :     selectedSpectralWindows_p.assign (spectralWindows);
    1026           0 : }
    1027             : 
    1028             : 
    1029             : void
    1030           0 : VisBufferAsync::setTopoFreqs (const Vector<Double> & lsrFreq, const Vector<Double> & selFreq)
    1031             : {
    1032           0 :     lsrFrequency_p.assign (lsrFreq);
    1033           0 :     selFreq_p.assign (selFreq);
    1034           0 : }
    1035             : 
    1036             : void
    1037           0 : VisBufferAsync::setVisCube(Complex c)
    1038             : {
    1039           0 :     visCube_p.resize(visibilityShape_p);
    1040           0 :     visCube_p.set(c);
    1041           0 :     visCubeOK_p=true;
    1042           0 : }
    1043             : 
    1044             : void
    1045           0 : VisBufferAsync::setVisCube (const Cube<Complex>& vis)
    1046             : {
    1047           0 :     VisBuffer::setVisCube (vis);
    1048           0 : }
    1049             : 
    1050             : 
    1051             : void
    1052           0 : VisBufferAsync::setVisibilityShape (const IPosition & visibilityShape)
    1053             : {
    1054           0 :     visibilityShape_p = visibilityShape;
    1055           0 : }
    1056             : 
    1057             : MDirection
    1058           0 : VisBufferAsync::unsharedCopyDirection (const MDirection & direction)
    1059             : {
    1060           0 :     return asyncio::unsharedCopyMeasure (direction, & MeasureHolder::asMDirection);
    1061             : }
    1062             : 
    1063             : void
    1064           0 : VisBufferAsync::unsharedCopyDirectionVector (Vector<MDirection> & direction)
    1065             : {
    1066             :     // The MDirection object consists of the actual direction a frame of reference
    1067             :     // object.  The direction component follows copy semnatics while the frame of
    1068             :     // reference uses a counter pointer and is shared across multiple MDirections.
    1069             :     // This causes problems now that values are being shared across threads.  Modify
    1070             :     // the direction vector so that the frame of reference object is only shared
    1071             :     // within this vector.  N.B., this could cause a problem if there is comparison
    1072             :     // between the reference frames of the two direction.  Each element doesn't get
    1073             :     // its own copy because the unsharing operation is klugy and somewhat compute
    1074             :     // intensive.
    1075             : 
    1076           0 :     int nElements = direction.shape () [0];
    1077             : 
    1078           0 :     if (nElements > 0){
    1079             : 
    1080             :         // Take the first reference frame object, make an unshared copy and provide it to
    1081             :         // any of the other direction components which use the same reference.  If a
    1082             :         // direction uses a different reference give it its own unshared copy.
    1083             : 
    1084           0 :         MeasRef<MDirection> uncleanRef = direction[0].getRef ();
    1085           0 :         MDirection cleanDirection = unsharedCopyDirection (direction[0]);
    1086           0 :         MeasRef<MDirection> cleanRef = cleanDirection.getRef ();
    1087             :             // Since cleanRef uses a counted pointer to an underlying object
    1088             :             // the above construction does not cause a dangling pointer problem.
    1089             : 
    1090           0 :         for (int i = 0; i < nElements; i++){
    1091             : 
    1092             :             // If this element of the direction uses the same reference as the
    1093             :             // original, then just install a reference to our "clean" reference.
    1094             :             // N.B., the == comparasion just compares the pointer to the underlying
    1095             :             // reference frame object!
    1096             : 
    1097           0 :             if (uncleanRef == direction[i].getRef()){
    1098             : 
    1099           0 :                 direction[i].set (cleanRef);
    1100             :             }
    1101             :             else {
    1102           0 :                 direction[i] = unsharedCopyDirection (direction[i]);
    1103             :             }
    1104             :         }
    1105             :     }
    1106           0 : }
    1107             : 
    1108             : MEpoch
    1109           0 : VisBufferAsync::unsharedCopyEpoch (const MEpoch & epoch)
    1110             : {
    1111           0 :     return asyncio::unsharedCopyMeasure (epoch, & MeasureHolder::asMEpoch);
    1112             : }
    1113             : 
    1114             : MPosition
    1115           0 : VisBufferAsync::unsharedCopyPosition (const MPosition & position)
    1116             : {
    1117           0 :     return asyncio::unsharedCopyMeasure (position, & MeasureHolder::asMPosition);
    1118             : }
    1119             : 
    1120             : void
    1121           0 : VisBufferAsync::updateCoordInfo(const VisBuffer * other, const Bool dirDepend)
    1122             : {
    1123           0 :     clear ();
    1124           0 :     copyVector (other->antenna1_p, antenna1_p);
    1125           0 :     antenna1OK_p = true;
    1126           0 :     copyVector (other->antenna2_p, antenna2_p);
    1127           0 :     antenna2OK_p = true;
    1128           0 :     copyVector (other->time_p, time_p);
    1129           0 :     timeOK_p = true;
    1130           0 :     copyVector (other->frequency_p, frequency_p);
    1131           0 :     frequencyOK_p = true;
    1132           0 :     copyVector (other->feed1_p, feed1_p);
    1133           0 :     feed1OK_p = true;
    1134           0 :     copyVector (other->feed2_p, feed2_p);
    1135           0 :     feed2OK_p = true;
    1136           0 :     if(dirDepend){
    1137           0 :       copyVector (other->feed1_pa_p, feed1_pa_p);
    1138           0 :       feed1_paOK_p = true;
    1139           0 :       copyVector (other->feed2_pa_p, feed2_pa_p);
    1140           0 :       feed2_paOK_p = true;
    1141             :       //copyVector (direction1_p);
    1142             :       //copyVector (direction2_p);
    1143             :     }
    1144             :     else{
    1145           0 :       feed1_paOK_p=false; 
    1146           0 :       feed2_paOK_p=false;
    1147           0 :       direction1OK_p=false;
    1148           0 :       direction2OK_p=false;
    1149             :     }
    1150           0 : }
    1151             : 
    1152             : 
    1153             : 
    1154             : 
    1155             : using namespace casacore;
    1156             : } // end namespace casa
    1157             : 
    1158             : 

Generated by: LCOV version 1.16