00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef MSVIS_VISIBILITYITERATORIMPL_H
00029 #define MSVIS_VISIBILITYITERATORIMPL_H
00030
00031 #include <casa/aips.h>
00032 #include <casa/Arrays/Matrix.h>
00033 #include <casa/Arrays/Cube.h>
00034 #include <casa/Arrays/Slicer.h>
00035 #include <casa/Containers/Stack.h>
00036 #include <ms/MeasurementSets/MeasurementSet.h>
00037 #include <measures/Measures/Stokes.h>
00038 #include <measures/Measures/MeasConvert.h>
00039 #include <casa/Quanta/MVDoppler.h>
00040 #include <measures/Measures/MCDoppler.h>
00041 #include <measures/Measures/MDoppler.h>
00042 #include <tables/Tables/ArrayColumn.h>
00043 #include <tables/Tables/ScalarColumn.h>
00044 #include <casa/BasicSL/String.h>
00045 #include <scimath/Mathematics/SquareMatrix.h>
00046 #include <scimath/Mathematics/RigidVector.h>
00047
00048 #include <ms/MSOper/MSDerivedValues.h>
00049 #include <msvis/MSVis/StokesVector.h>
00050 #include <msvis/MSVis/VisImagingWeight.h>
00051 #include <msvis/MSVis/VisibilityIterator.h>
00052 #include <msvis/MSVis/VisBufferComponents.h>
00053 #include <ms/MeasurementSets/MSIter.h>
00054
00055 #include <map>
00056 #include <vector>
00057
00058 namespace casa {
00059
00060
00061 class VisBuffer;
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 class VisibilityIteratorReadImpl {
00116
00117 friend class AsyncEnabler;
00118 friend class ViReadImplAsync;
00119 friend class VisibilityIteratorWriteImpl;
00120 friend class ROVisibilityIterator;
00121 friend class ROVisIterator;
00122 friend class VisIterator;
00123 friend class VLAT;
00124
00125
00126 public:
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 typedef ROVisibilityIterator::DataColumn DataColumn;
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 VisibilityIteratorReadImpl ();
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 VisibilityIteratorReadImpl (ROVisibilityIterator * rovi,
00195 const Block<MeasurementSet> & mss,
00196 const Block<Int> & sortColumns,
00197 const Bool addDefaultSortCols,
00198 Double timeInterval);
00199
00200
00201 VisibilityIteratorReadImpl (const VisibilityIteratorReadImpl & other,
00202 ROVisibilityIterator * rovi);
00203
00204
00205 VisibilityIteratorReadImpl & operator= (const VisibilityIteratorReadImpl & other);
00206
00207
00208 virtual ~VisibilityIteratorReadImpl ();
00209
00210 virtual VisibilityIteratorReadImpl * clone (ROVisibilityIterator * rovi) const;
00211
00212
00213
00214 Bool isAsyncEnabled () const;
00215
00216 virtual Bool isWritable () const {
00217 return False;
00218 }
00219
00220
00221 virtual void origin ();
00222
00223 virtual void originChunks ();
00224
00225
00226
00227 virtual Double getInterval() const { return timeInterval_p; }
00228
00229
00230
00231
00232 virtual void setInterval (Double timeInterval) {
00233 msIter_p.setInterval (timeInterval);
00234 timeInterval_p = timeInterval;
00235 }
00236
00237
00238
00239
00240
00241
00242 virtual void setRowBlocking (Int nRows = 0);
00243
00244 virtual Bool existsColumn (VisBufferComponents::EnumType id) const;
00245
00246
00247 virtual Bool more () const;
00248
00249 virtual SubChunkPair getSubchunkId () const;
00250
00251 virtual const Block<Int>& getSortColumns() const;
00252
00253
00254 virtual Bool moreChunks () const {
00255 return msIter_p.more ();
00256 }
00257
00258
00259 virtual Bool newMS () const {
00260 return msIter_p.newMS ();
00261 }
00262
00263 virtual Int msId () const {
00264 return msIter_p.msId ();
00265 }
00266
00267 virtual VisBuffer * getVisBuffer ();
00268
00269
00270 virtual const MeasurementSet & ms () const {
00271 return msIter_p.ms ();
00272 }
00273
00274 virtual VisibilityIteratorReadImpl & nextChunk ();
00275
00276
00277 virtual Vector<Int> & antenna1 (Vector<Int> & ant1) const;
00278
00279
00280 virtual Vector<Int> & antenna2 (Vector<Int> & ant2) const;
00281
00282
00283 virtual Vector<Int> & feed1 (Vector<Int> & fd1) const;
00284
00285
00286 virtual Vector<Int> & feed2 (Vector<Int> & fd2) const;
00287
00288
00289
00290
00291 virtual Vector<Int> & channel (Vector<Int> & chan) const;
00292
00293
00294 virtual Vector<SquareMatrix<Complex, 2> > &
00295 CJones (Vector<SquareMatrix<Complex, 2> > & cjones) const;
00296
00297
00298
00299
00300
00301
00302
00303 virtual const Cube<Double> & receptorAngles () const;
00304
00305
00306 virtual const Vector<String> & antennaMounts () const;
00307
00308
00309
00310
00311
00312 virtual const Cube<RigidVector<Double, 2> > & getBeamOffsets () const;
00313
00314
00315 virtual Bool allBeamOffsetsZero () const;
00316
00317
00318 virtual Vector<Float> feed_pa (Double time) const;
00319 static Vector<Float> feed_paCalculate (Double time, MSDerivedValues & msd,
00320 Int nAntennas, const MEpoch & mEpoch0,
00321 const Vector<Float> & receptor0Angle);
00322
00323
00324
00325
00326 virtual const Float & parang0 (Double time) const;
00327 static Float parang0Calculate (Double time, MSDerivedValues & msd, const MEpoch & epoch0);
00328
00329
00330 virtual Vector<Float> parang (Double time) const;
00331 static Vector<Float> parangCalculate (Double time, MSDerivedValues & msd,
00332 int nAntennas, const MEpoch mEpoch0);
00333
00334
00335 virtual MDirection azel0 (Double time) const;
00336 static void azel0Calculate (Double time, MSDerivedValues & msd,
00337 MDirection & azel0, const MEpoch & mEpoch0);
00338
00339 virtual Vector<MDirection> azel (Double time) const;
00340 static void azelCalculate (Double time, MSDerivedValues & msd, Vector<MDirection> & azel,
00341 Int nAnt, const MEpoch & mEpoch0);
00342
00343
00344
00345 virtual Double hourang (Double time) const;
00346 static Double hourangCalculate (Double time, MSDerivedValues & msd, const MEpoch & mEpoch0);
00347
00348
00349 virtual Int fieldId () const {
00350 return msIter_p.fieldId ();
00351 }
00352
00353
00354 virtual Int arrayId () const {
00355 return msIter_p.arrayId ();
00356 }
00357
00358
00359 virtual String fieldName () const {
00360 return msIter_p.fieldName ();
00361 }
00362
00363
00364 virtual String sourceName () const {
00365 return msIter_p.sourceName ();
00366 }
00367
00368
00369 virtual Cube<Bool> & flag (Cube<Bool> & flags) const;
00370
00371
00372 virtual Matrix<Bool> & flag (Matrix<Bool> & flags) const;
00373
00374
00375 Bool existsFlagCategory() const;
00376
00377
00378 virtual Array<Bool> & flagCategory (Array<Bool> & flagCategories) const;
00379
00380
00381 virtual Vector<Bool> & flagRow (Vector<Bool> & rowflags) const;
00382
00383
00384 virtual Vector<Int> & scan (Vector<Int> & scans) const;
00385
00386
00387 virtual Vector<Int> & observationId (Vector<Int> & obsids) const;
00388
00389
00390 virtual Vector<Int> & processorId (Vector<Int> & procids) const;
00391
00392
00393 virtual Vector<Int> & stateId (Vector<Int> & stateids) const;
00394
00395
00396 virtual Vector<Double> & frequency (Vector<Double> & freq) const;
00397
00398
00399
00400 virtual Vector<Double> & lsrFrequency (Vector<Double> & freq) const;
00401
00402
00403 virtual const MDirection & phaseCenter () const {
00404 return msIter_p.phaseCenter ();
00405 }
00406
00407
00408 virtual Int polFrame () const {
00409 return msIter_p.polFrame ();
00410 }
00411
00412
00413 virtual Vector<Int> & corrType (Vector<Int> & corrTypes) const;
00414
00415
00416 virtual Vector<Float> & sigma (Vector<Float> & sig) const;
00417
00418
00419 virtual Matrix<Float> & sigmaMat (Matrix<Float> & sigmat) const;
00420
00421
00422 virtual Int spectralWindow () const {
00423 return msIter_p.spectralWindowId ();
00424 }
00425
00426
00427 virtual Int polarizationId () const {
00428 return msIter_p.polarizationId ();
00429 }
00430
00431
00432 virtual Int dataDescriptionId () const {
00433 return msIter_p.dataDescriptionId ();
00434 }
00435
00436
00437 virtual Vector<Double> & time (Vector<Double> & t) const;
00438
00439
00440 virtual Vector<Double> & timeCentroid (Vector<Double> & t) const;
00441
00442
00443 virtual Vector<Double> & timeInterval (Vector<Double> & ti) const;
00444
00445
00446 virtual Vector<Double> & exposure (Vector<Double> & expo) const;
00447
00448
00449 virtual Cube<Complex> & visibility (Cube<Complex> & vis,
00450 DataColumn whichOne) const;
00451
00452
00453 virtual Cube<Float> & floatData (Cube<Float> & fcube) const;
00454
00455
00456
00457
00458 virtual Matrix<CStokesVector> & visibility (Matrix<CStokesVector> & vis,
00459 DataColumn whichOne) const;
00460
00461
00462 virtual IPosition visibilityShape () const;
00463
00464
00465 virtual Vector<RigidVector<Double, 3> > & uvw (Vector<RigidVector<Double, 3> > & uvwvec) const;
00466 virtual Matrix<Double> & uvwMat (Matrix<Double> & uvwmat) const;
00467
00468
00469 virtual Vector<Float> & weight (Vector<Float> & wt) const;
00470
00471
00472 virtual Matrix<Float> & weightMat (Matrix<Float> & wtmat) const;
00473
00474
00475 Bool existsWeightSpectrum () const;
00476
00477
00478 virtual Cube<Float> & weightSpectrum (Cube<Float> & wtsp) const;
00479
00480
00481
00482 const VisImagingWeight & getImagingWeightGenerator () const;
00483
00484
00485 virtual Bool newFieldId () const {
00486 return (curStartRow_p == 0 && msIter_p.newField ());
00487 }
00488
00489
00490 virtual Bool newArrayId () const {
00491 return (curStartRow_p == 0 && msIter_p.newArray ());
00492 }
00493
00494
00495 virtual Bool newSpectralWindow () const {
00496 return (curStartRow_p == 0 && msIter_p.newSpectralWindow ());
00497 }
00498
00499
00500
00501 virtual Int channelIndex () const;
00502
00503
00504
00505 virtual Int channelGroupSize () const;
00506
00507
00508 virtual Int nCorr () const {
00509 return nPol_p;
00510 };
00511
00512
00513 virtual Int nRow () const;
00514
00515
00516
00517
00518 virtual Vector<uInt> & rowIds (Vector<uInt> & rowids) const;
00519
00520
00521 virtual Int nRowChunk () const;
00522
00523
00524 virtual Int nSubInterval () const;
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535 virtual void slurp () const;
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551 virtual VisibilityIteratorReadImpl &
00552 selectVelocity (Int nChan,
00553 const MVRadialVelocity & vStart, const MVRadialVelocity & vInc,
00554 MRadialVelocity::Types rvType = MRadialVelocity::LSR,
00555 MDoppler::Types dType = MDoppler::RADIO, Bool precise = False);
00556
00557
00558
00559
00560
00561 virtual VisibilityIteratorReadImpl & velInterpolation (const String & ) {return * this; }
00562
00563
00564
00565
00566
00567
00568 virtual VisibilityIteratorReadImpl & selectChannel (Int nGroup = 1, Int start = 0, Int width = 0,
00569 Int increment = 1, Int spectralWindow = -1);
00570
00571
00572
00573 virtual VisibilityIteratorReadImpl & selectChannel (const Block< Vector<Int> > & blockNGroup,
00574 const Block< Vector<Int> > & blockStart,
00575 const Block< Vector<Int> > & blockWidth,
00576 const Block< Vector<Int> > & blockIncr,
00577 const Block< Vector<Int> > & blockSpw);
00578
00579
00580
00581
00582 virtual void getChannelSelection (Block< Vector<Int> > & blockNGroup,
00583 Block< Vector<Int> > & blockStart,
00584 Block< Vector<Int> > & blockWidth,
00585 Block< Vector<Int> > & blockIncr,
00586 Block< Vector<Int> > & blockSpw);
00587
00588
00589
00590
00591 void slicesToMatrices (Vector<Matrix<Int> > & matv,
00592 const Vector<Vector<Slice> > & slicesv,
00593 const Vector<Int> & widthsv) const;
00594
00595
00596
00597
00598
00599
00600
00601 virtual void getSpwInFreqRange (Block<Vector<Int> > & spw,
00602 Block<Vector<Int> > & start,
00603 Block<Vector<Int> > & nchan,
00604 Double freqStart, Double freqEnd,
00605 Double freqStep, MFrequency::Types freqFrame = MFrequency::LSRK) const;
00606
00607
00608
00609 virtual void getFreqInSpwRange(Double& freqStart, Double& freqEnd, MFrequency::Types freqframe = MFrequency::LSRK) const;
00610
00611
00612
00613
00614
00615 virtual void attachVisBuffer (VisBuffer & vb);
00616
00617
00618
00619
00620 virtual void detachVisBuffer (VisBuffer & vb);
00621
00622
00623 virtual const ROMSColumns & msColumns () const {
00624 return msIter_p.msColumns ();
00625 }
00626
00627
00628
00629
00630 virtual void allSelectedSpectralWindows (Vector<Int> & spws, Vector<Int> & nvischan);
00631
00632
00633
00634
00635
00636
00637 virtual void lsrFrequency (const Int & spw, Vector<Double> & freq, Bool & convert, const Bool ignoreconv=False);
00638
00639 virtual void useImagingWeight (const VisImagingWeight & imWgt);
00640
00641 virtual Int numberAnt ();
00642
00643 virtual Int numberCoh ();
00644
00645
00646 virtual Int numberSpw ();
00647 virtual Int numberPol ();
00648 virtual Int numberDDId ();
00649
00650 ROArrayColumn <Double> & getChannelFrequency () const;
00651 Block<Int> getChannelGroupNumber () const;
00652 Block<Int> getChannelIncrement () const;
00653 Block<Int> getChannelStart () const;
00654 Block<Int> getChannelWidth () const;
00655 Int getDataDescriptionId () const;
00656 const MeasurementSet & getMeasurementSet () const;;
00657 Int getMeasurementSetId () const;
00658 Int getNAntennas () const;
00659 virtual MEpoch getEpoch () const;
00660 MFrequency::Types getObservatoryFrequencyType () const;
00661 MPosition getObservatoryPosition () const;
00662 MDirection getPhaseCenter () const;
00663 Vector<Float> getReceptor0Angle ();
00664 Vector<uInt> getRowIds () const;
00665
00666 static void lsrFrequency (const Int & spw,
00667 Vector<Double> & freq,
00668 Bool & convert,
00669 const Block<Int> & chanStart,
00670 const Block<Int> & chanWidth,
00671 const Block<Int> & chanInc,
00672 const Block<Int> & numChanGroup,
00673 const ROArrayColumn <Double> & chanFreqs,
00674 const ROScalarColumn<Int> & obsMFreqTypes,
00675 const MEpoch & ep,
00676 const MPosition & obsPos,
00677 const MDirection & dir,
00678 const Bool ignoreconv=False);
00679
00680 protected:
00681
00682 void attachColumnsSafe (const Table & t);
00683
00684
00685 virtual void advance ();
00686
00687 virtual void setSelTable ();
00688
00689 virtual void setState ();
00690
00691 virtual void getTopoFreqs ();
00692 virtual void getTopoFreqs (Vector<Double> & lsrFreq, Vector<Double> & selFreq);
00693
00694 virtual void getLsrInfo (Block<Int> & channelGroupNumber,
00695 Block<Int> & channelIncrement,
00696 Block<Int> & channelStart,
00697 Block<Int> & channelWidth,
00698 MPosition & observatoryPositon,
00699 MDirection & phaseCenter,
00700 Bool & velocitySelection) const;
00701
00702 vector<MeasurementSet> getMeasurementSets () const;
00703
00704 const MSDerivedValues & getMSD () const;
00705
00706
00707 virtual void updateSlicer ();
00708
00709 virtual void attachColumns (const Table & t);
00710
00711
00712 virtual const Table attachTable () const;
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725 Bool usesTiledDataManager (const String & columnName, const MeasurementSet & ms) const;
00726
00727
00728
00729 virtual void getDataColumn (ROVisibilityIterator::DataColumn whichOne, const Slicer & slicer,
00730 Cube<Complex> & data) const;
00731 virtual void getDataColumn (DataColumn whichOne, Cube<Complex> & data) const;
00732
00733
00734 virtual void getFloatDataColumn (const Slicer & slicer, Cube<Float> & data) const;
00735 virtual void getFloatDataColumn (Cube<Float> & data) const;
00736
00737
00738 virtual void initialize (const Block<MeasurementSet> & mss);
00739
00740 virtual void originChunks (Bool forceRewind);
00741
00742
00743 virtual void doChannelSelection ();
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754 virtual void setTileCache ();
00755
00756 virtual Bool isInSelectedSPW (const Int & spw);
00757
00758
00759 virtual void update_rowIds () const;
00760
00761 void setAsyncEnabled (Bool enable);
00762
00763 template<class T>
00764 void getColScalar (const ROScalarColumn<T> & column, Vector<T> & array, Bool resize) const;
00765
00766 template<class T>
00767 void getColArray (const ROArrayColumn<T> & column, Array<T> & array, Bool resize) const;
00768
00769
00770 virtual void getCol (const ROScalarColumn<Bool> & column, Vector<Bool> & array, Bool resize = False) const;
00771 virtual void getCol (const ROScalarColumn<Int> & column, Vector<Int> & array, Bool resize = False) const;
00772 virtual void getCol (const ROScalarColumn<Double> & column, Vector<Double> & array, Bool resize = False) const;
00773
00774 virtual void getCol (const ROArrayColumn<Bool> & column, Array<Bool> & array, Bool resize = False) const;
00775 virtual void getCol (const ROArrayColumn<Float> & column, Array<Float> & array, Bool resize = False) const;
00776 virtual void getCol (const ROArrayColumn<Double> & column, Array<Double> & array, Bool resize = False) const;
00777 virtual void getCol (const ROArrayColumn<Complex> & column, Array<Complex> & array, Bool resize = False) const;
00778
00779 virtual void getCol (const ROArrayColumn<Bool> & column, const Slicer & slicer, Array<Bool> & array, Bool resize = False) const;
00780 virtual void getCol (const ROArrayColumn<Float> & column, const Slicer & slicer, Array<Float> & array, Bool resize = False) const;
00781 virtual void getCol (const ROArrayColumn<Complex> & column, const Slicer & slicer, Array<Complex> & array, Bool resize = False) const;
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792 template<class T>
00793 void swapyz (Cube<T> & out, const Cube<T> & in) const;
00794
00795 class Cache {
00796
00797 public:
00798
00799 Cache ();
00800
00801 Cache & operator= (const Cache & other);
00802
00803 MDirection azel0_p;
00804 Vector<MDirection> azel_p;
00805 Vector<Float> feedpa_p;
00806 Cube<Bool> flagCube_p;
00807 Bool flagOK_p;
00808 Bool floatDataCubeOK_p;
00809 Cube<Float> floatDataCube_p;
00810 Bool freqCacheOK_p;
00811 Vector<Double> frequency_p;
00812 Double hourang_p;
00813 Matrix<Float> imagingWeight_p;
00814 Double lastParang0UT_p;
00815 Double lastParangUT_p;
00816 Double lastazelUT_p;
00817 Double lastazel0UT_p;
00818 Double lasthourangUT_p;
00819 Double lastfeedpaUT_p;
00820 Bool msHasFC_p;
00821 Bool msHasWtSp_p;
00822 Float parang0_p;
00823 Vector<Float> parang_p;
00824 Vector<uInt> rowIds_p;
00825 Matrix<Double> uvwMat_p;
00826 Cube<Complex> visCube_p;
00827 Block<Bool> visOK_p;
00828 Bool weightSpOK_p;
00829 Cube<Float> wtSp_p;
00830 };
00831
00832 class Channels {
00833
00834 public:
00835
00836 Block<Int> inc_p;
00837 Block<Int> start_p;
00838 Block<Int> width_p;
00839 Block<Int> nGroups_p;
00840 Block<Int> preselectedChanStart_p;
00841 Block<Int> preselectednChan_p;
00842
00843 };
00844
00845 class Columns {
00846
00847 public:
00848
00849 Columns & operator= (const Columns & other);
00850
00851 ROScalarColumn<Int> antenna1_p;
00852 ROScalarColumn<Int> antenna2_p;
00853 ROArrayColumn<Complex> corrVis_p;
00854 ROScalarColumn<Double> exposure_p;
00855 ROScalarColumn<Int> feed1_p;
00856 ROScalarColumn<Int> feed2_p;
00857 ROArrayColumn<Bool> flagCategory_p;
00858 ROScalarColumn<Bool> flagRow_p;
00859 ROArrayColumn<Bool> flag_p;
00860 ROArrayColumn<Float> floatVis_p;
00861 ROArrayColumn<Complex> modelVis_p;
00862 ROScalarColumn<Int> observation_p;
00863 ROScalarColumn<Int> processor_p;
00864 ROScalarColumn<Int> scan_p;
00865 ROArrayColumn<Float> sigma_p;
00866 ROScalarColumn<Int> state_p;
00867 ROScalarColumn<Double> timeCentroid_p;
00868 ROScalarColumn<Double> timeInterval_p;
00869 ROScalarColumn<Double> time_p;
00870 ROArrayColumn<Double> uvw_p;
00871 ROArrayColumn<Complex> vis_p;
00872 ROArrayColumn<Float> weightSpectrum_p;
00873 ROArrayColumn<Float> weight_p;
00874
00875 };
00876
00877 class MeasurementSetChannels {
00878
00879 public:
00880
00881 Block < Vector<Int> > inc_p;
00882 Block < Vector<Int> > nGroups_p;
00883 Block < Vector<Int> > start_p;
00884 Block < Vector<Int> > width_p;
00885 Block < Vector<Int> > spw_p;
00886
00887 };
00888
00889 class Velocity {
00890
00891 public:
00892
00893 Velocity ();
00894 Velocity & operator= (const Velocity & other);
00895
00896 MDoppler::Convert cFromBETA_p;
00897 Vector<Double> lsrFreq_p;
00898 Int nVelChan_p;
00899 Vector<Double> selFreq_p;
00900 MDoppler::Types vDef_p;
00901 MVRadialVelocity vInc_p;
00902 String vInterpolation_p;
00903 Bool velSelection_p;
00904 Bool vPrecise_p;
00905 MVRadialVelocity vStart_p;
00906
00907 };
00908
00909
00910 typedef std::vector<MeasurementSet> MeasurementSets;
00911
00912 Bool addDefaultSort_p;
00913 Bool asyncEnabled_p;
00914 Bool autoTileCacheSizing_p;
00915 mutable Cache cache_p;
00916 Int channelGroupSize_p;
00917 Channels channels_p;
00918 Int chunkNumber_p;
00919 Columns columns_p;
00920 Int curChanGroup_p;
00921 Int curEndRow_p;
00922 Int curNGroups_p;
00923 uInt curNumRow_p;
00924 Int curStartRow_p;
00925 Int curTableNumRow_p;
00926 Bool floatDataFound_p;
00927 VisImagingWeight imwgt_p;
00928 Bool initialized_p;
00929 Bool isMultiMS_p;
00930 MeasurementSets measurementSets_p;
00931 Bool more_p;
00932 MeasurementSetChannels msChannels_p;
00933 Int msCounter_p;
00934 Bool msIterAtOrigin_p;
00935 MSIter msIter_p;
00936 mutable MSDerivedValues msd_p;
00937 Int nAnt_p;
00938 Int nChan_p;
00939 Int nPol_p;
00940 Int nRowBlocking_p;
00941 Bool newChanGroup_p;
00942 ROVisibilityIterator * rovi_p;
00943 RefRows selRows_p;
00944 Slicer slicer_p;
00945 Block<Int> sortColumns_p;
00946 Bool stateOk_p;
00947 SubChunkPair subchunk_p;
00948 Vector<Bool> tileCacheIsSet_p;
00949 Double timeInterval_p;
00950 Vector<Double> time_p;
00951 Bool useSlicer_p;
00952 Stack<VisBuffer *> vbStack_p;
00953 Velocity velocity_p;
00954 Slicer weightSlicer_p;
00955
00956
00957 };
00958
00959 inline Bool VisibilityIteratorReadImpl::more () const
00960 {
00961 return more_p;
00962 }
00963
00964 inline Vector<SquareMatrix<Complex, 2> > &
00965 VisibilityIteratorReadImpl::CJones (Vector<SquareMatrix<Complex, 2> > & cjones) const
00966 {
00967 cjones.resize (msIter_p.CJones ().nelements ());
00968 return cjones = msIter_p.CJones ();
00969 }
00970
00971 inline const Cube<Double> & VisibilityIteratorReadImpl::receptorAngles () const
00972 {
00973 return msIter_p.receptorAngles ();
00974 }
00975
00976 inline const Vector<String> & VisibilityIteratorReadImpl::antennaMounts () const
00977 {
00978 return msIter_p.antennaMounts ();
00979 }
00980
00981 inline const Cube<RigidVector<Double, 2> > &
00982 VisibilityIteratorReadImpl::getBeamOffsets () const
00983 {
00984 return msIter_p.getBeamOffsets ();
00985 }
00986
00987 inline Bool VisibilityIteratorReadImpl::allBeamOffsetsZero () const
00988 {
00989 return msIter_p.allBeamOffsetsZero ();
00990 }
00991
00992 inline Int VisibilityIteratorReadImpl::channelGroupSize () const
00993 {
00994 return channels_p.width_p[msIter_p.spectralWindowId ()];
00995 }
00996 inline Int VisibilityIteratorReadImpl::channelIndex () const
00997 {
00998 return channels_p.inc_p[msIter_p.spectralWindowId ()] * curChanGroup_p;
00999 }
01000 inline Int VisibilityIteratorReadImpl::nRow () const
01001 {
01002 return curNumRow_p;
01003 }
01004 inline Int VisibilityIteratorReadImpl::nRowChunk () const
01005 {
01006 return msIter_p.table ().nrow ();
01007 }
01008
01009
01010
01011
01012
01013
01014 inline IPosition VisibilityIteratorReadImpl::visibilityShape () const
01015 {
01016 return IPosition (3, nPol_p, channelGroupSize (), curNumRow_p);
01017 }
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068 class VisibilityIteratorWriteImpl {
01069
01070 friend class VisibilityIterator;
01071
01072 public:
01073
01074 typedef ROVisibilityIterator::DataColumn DataColumn;
01075
01076
01077
01078
01079
01080 VisibilityIteratorWriteImpl (VisibilityIterator * vi);
01081
01082
01083
01084 VisibilityIteratorWriteImpl (const VisibilityIteratorWriteImpl & other);
01085
01086
01087
01088 virtual ~VisibilityIteratorWriteImpl ();
01089
01090
01091
01092 virtual VisibilityIteratorWriteImpl * clone (VisibilityIterator * vi) const;
01093
01094 virtual Bool isWritable () const {
01095 return True;
01096 }
01097
01098
01099
01100
01101
01102 virtual void setFlag (const Matrix<Bool> & flag);
01103
01104
01105
01106
01107
01108 virtual void setFlag (const Cube<Bool> & flag);
01109
01110
01111 virtual void setFlagRow (const Vector<Bool> & rowflags);
01112
01113 void setFlagCategory(const Array<Bool>& fc);
01114
01115
01116
01117
01118
01119
01120
01121 virtual void setVis (const Matrix<CStokesVector> & vis, DataColumn whichOne);
01122
01123
01124
01125 virtual void setVis (const Cube<Complex> & vis, DataColumn whichOne);
01126
01127
01128 virtual void setVisAndFlag (const Cube<Complex> & vis, const Cube<Bool> & flag,
01129 DataColumn whichOne);
01130
01131
01132 virtual void setWeight (const Vector<Float> & wt);
01133
01134
01135 virtual void setWeightMat (const Matrix<Float> & wtmat);
01136
01137
01138 virtual void setWeightSpectrum (const Cube<Float> & wtsp);
01139
01140
01141 virtual void setSigma (const Vector<Float> & sig);
01142
01143
01144 virtual void setSigmaMat (const Matrix<Float> & sigmat);
01145
01146 virtual void writeBack (VisBuffer *);
01147
01148 protected:
01149
01150
01151
01152 class BackWriter {
01153
01154 public:
01155
01156 virtual ~BackWriter () {}
01157
01158 virtual void operator () (VisibilityIteratorWriteImpl * vi, VisBuffer * vb) = 0;
01159
01160 };
01161
01162
01163 template <typename Setter, typename Getter>
01164 class BackWriterImpl : public BackWriter {
01165 public:
01166
01167 BackWriterImpl (Setter setter, Getter getter) : getter_p (getter), setter_p (setter) {}
01168 void operator () (VisibilityIteratorWriteImpl * vi, VisBuffer * vb) {
01169 (vi ->* setter_p) ((vb ->* getter_p) ());
01170 }
01171
01172 private:
01173
01174 Getter getter_p;
01175 Setter setter_p;
01176 };
01177
01178
01179
01180
01181 template <typename Setter, typename Getter>
01182 class BackWriterImpl2 : public BackWriter {
01183 public:
01184
01185 typedef VisibilityIteratorReadImpl::DataColumn DataColumn;
01186
01187 BackWriterImpl2 (Setter setter, Getter getter, DataColumn dc)
01188 : dataColumn_p (dc), getter_p (getter), setter_p (setter)
01189 {}
01190 void operator () (VisibilityIteratorWriteImpl * vi, VisBuffer * vb) {
01191 (vi ->* setter_p) ((vb ->* getter_p) (), dataColumn_p);
01192 }
01193
01194 private:
01195
01196 DataColumn dataColumn_p;
01197 Getter getter_p;
01198 Setter setter_p;
01199 };
01200
01201
01202
01203
01204 template <typename Ret>
01205 static
01206 BackWriter *
01207 makeBackWriter (void (VisibilityIteratorWriteImpl::* setter) (Ret), Ret (VisBuffer::* getter) () const) {
01208 return new BackWriterImpl <void (VisibilityIteratorWriteImpl:: *) (Ret),
01209 Ret (VisBuffer:: *) () const >
01210 (setter, getter);
01211 }
01212
01213 template <typename Ret>
01214 static
01215 BackWriter *
01216 makeBackWriter2 (void (VisibilityIteratorWriteImpl::* setter) (Ret, VisibilityIteratorReadImpl::DataColumn),
01217 Ret (VisBuffer::* getter) () const,
01218 ROVisibilityIterator::DataColumn dc) {
01219
01220
01221
01222 typedef void (VisibilityIteratorWriteImpl::* Setter) (Ret, VisibilityIteratorReadImpl::DataColumn);
01223 typedef Ret (VisBuffer::* Getter) () const;
01224
01225 return new BackWriterImpl2 < Setter, Getter> (setter, getter, dc);
01226 }
01227
01228 VisibilityIteratorReadImpl * getReadImpl ();
01229
01230 void initializeBackWriters ();
01231
01232 virtual void attachColumns (const Table & t);
01233
01234
01235
01236
01237
01238
01239
01240
01241 void putDataColumn (DataColumn whichOne, const Slicer & slicer,
01242 const Cube<Complex> & data);
01243 void putDataColumn (DataColumn whichOne, const Cube<Complex> & data);
01244
01245
01246 virtual void putCol (ScalarColumn<Bool> & column, const Vector<Bool> & array);
01247 virtual void putCol (ArrayColumn<Bool> & column, const Array<Bool> & array);
01248 virtual void putCol (ArrayColumn<Float> & column, const Array<Float> & array);
01249 virtual void putCol (ArrayColumn<Complex> & column, const Array<Complex> & array);
01250
01251 virtual void putCol (ArrayColumn<Bool> & column, const Slicer & slicer, const Array<Bool> & array);
01252 virtual void putCol (ArrayColumn<Float> & column, const Slicer & slicer, const Array<Float> & array);
01253 virtual void putCol (ArrayColumn<Complex> & column, const Slicer & slicer, const Array<Complex> & array);
01254
01255 template <class T> void setTileShape(RefRows &rowRef,ArrayColumn<T> &outputDataCol,const IPosition &arrayShape);
01256 Bool useCustomTileShape();
01257
01258
01259 void putColScalar (ScalarColumn<Bool> & column, const Vector<Bool> & array);
01260
01261
01262
01263
01264
01265 virtual void putModel(const RecordInterface& rec, Bool iscomponentlist=True, Bool incremental=False);
01266
01267
01268
01269
01270
01271 private:
01272
01273 class Columns {
01274
01275 public:
01276
01277 Columns & operator= (const Columns & other);
01278
01279 ArrayColumn<Complex> corrVis_p;
01280 ScalarColumn<Bool> flagRow_p;
01281 ArrayColumn<Bool> flag_p;
01282 ArrayColumn<Bool> flagCategory_p;
01283 ArrayColumn<Float> floatVis_p;
01284 ArrayColumn<Complex> modelVis_p;
01285 ArrayColumn<Float> sigma_p;
01286 ArrayColumn<Complex> vis_p;
01287 ArrayColumn<Float> weightSpectrum_p;
01288 ArrayColumn<Float> weight_p;
01289
01290 };
01291
01292 std::map <VisBufferComponents::EnumType, BackWriter *> backWriters_p;
01293 Columns columns_p;
01294 VisibilityIterator * vi_p;
01295 Bool useCustomTileShape_p;
01296 };
01297
01298 }
01299
01300 #endif
01301