casa  $Rev:20696$
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
VisBuffer2.h
Go to the documentation of this file.
00001 //# VisBuffer.h: buffer for iterating through MS in large blocks
00002 //# Copyright (C) 1996,1997,1998,1999,2000,2002,2003
00003 //# Associated Universities, Inc. Washington DC, USA.
00004 //#
00005 //# This library is free software; you can redistribute it and/or modify it
00006 //# under the terms of the GNU Library General Public License as published by
00007 //# the Free Software Foundation; either version 2 of the License, or (at your
00008 //# option) any later version.
00009 //#
00010 //# This library is distributed in the hope that it will be useful, but WITHOUT
00011 //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00012 //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
00013 //# License for more details.
00014 //#
00015 //# You should have received a copy of the GNU Library General Public License
00016 //# along with this library; if not, write to the Free Software Foundation,
00017 //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
00018 //#
00019 //# Correspondence concerning AIPS++ should be addressed as follows:
00020 //#        Internet email: aips2-request@nrao.edu.
00021 //#        Postal address: AIPS++ Project Office
00022 //#                        National Radio Astronomy Observatory
00023 //#                        520 Edgemont Road
00024 //#                        Charlottesville, VA 22903-2475 USA
00025 //#
00026 
00027 #ifndef MSVIS_VISBUFFER2_H
00028 #define MSVIS_VISBUFFER2_H
00029 
00030 #include <casa/aips.h>
00031 
00032 //#include <casa/Arrays/Cube.h>
00033 //#include <casa/Arrays/Vector.h>
00034 //#include <casa/Arrays/Matrix.h>
00035 //#include <casa/BasicSL/Complex.h>
00036 #include <casa/BasicSL/Complexfwd.h>
00037 #include <synthesis/MSVis/VisBufferComponents2.h>
00038 //#include <synthesis/MSVis/VisibilityIterator2.h>
00039 
00040 #include <boost/utility.hpp>
00041 
00042 using casa::vi::VisBufferComponent2;
00043 using casa::vi::VisBufferComponents2;
00044 
00045 namespace casa { //# NAMESPACE CASA - BEGIN
00046 
00047 //#forward
00048 
00049 template <typename T> class Array;
00050 class CStokesVector;
00051 template <typename T> class Cube;
00052 template <typename T> class Matrix;
00053 class MDirection;
00054 template <typename T, Int N> class SquareMatrix;
00055 template <typename T> class Vector;
00056 
00057 namespace vi {
00058 
00059 class Subchunk;
00060 class VisibilityIterator2;
00061 
00062 typedef enum {VbPlain, VbAsynchronous} VisBufferType;
00063 
00064 // These are options to be applied to a VisBuffer, usually when it's created.
00065 // The intent is that these form a bit mask so that they can be used as
00066 // VbWritable | VbRekeyable, etc.  So add the next one in as 2 * theLastOne.
00067 
00068 typedef enum {VbNoOptions, VbWritable = 1, VbRekeyable = 2} VisBufferOptions;
00069 
00070 //<summary>VisBuffer2s encapsulate one chunk of visibility data for processing.</summary>
00071 //
00072 // <use visibility=export>
00073 //
00074 // <reviewed reviewer="" date="" tests="" demos="">
00075 
00076 // <prerequisite>
00077 //   <li> <linkto class="VisibilityIterator">VisibilityIterator</linkto>
00078 //   <li> <linkto class="VbDirtyComponents">VbDirtyComponents</linkto>
00079 // </prerequisite>
00080 //
00081 // <etymology>
00082 // VisBuffer2 is a buffer for visibility data
00083 // </etymology>
00084 //
00085 //<synopsis>
00086 // The VisBuffer is designed to contain a small amount of visibility-related
00087 // data.  The VisBuffer can be used in two somewhat distinct ways.  The first
00088 // is as an integral (or attached) part of the VisibilityIterator and the second
00089 // is as a free or unattached object.
00090 //
00091 // Attached VisBuffer -- Each VisibilityIterator has a exactly one VisBuffer
00092 // attached to it.  This VisBuffer is created and destroyed by the
00093 // VisibilityIterator.  The role of an attached VB is to contain the data
00094 // currently "pointed to" by the VI.  Because of this tight coupling between
00095 // an attached VI and its VB the operations that can be applied to a VisBuffer
00096 // are somewhat restricted in order to maintain the relationship between the
00097 // MeasurementSet's data and the data i the VisBuffer (failure to do so allows
00098 // obscure bugs to be created).  As such the functions for averaging in either
00099 // the time or frequency axes is not permitted on an attached VB.
00100 //
00101 // Free VisBuffer -- A free VisBuffer is used to contain data that might not
00102 // correspond to the data in the MeasurementSet.  The meaning of the data in
00103 // a free VisBuffer will depend on the user.  Some obvious examples might be:
00104 // a VisBuffer used to resample or average frequencies together; creation of
00105 // "virtual" spectral windows which might reconnect frequencies that were
00106 // split into separate spectral windows becasue of hardware limitation; and
00107 // performing a time average of visibility data.  Because the free VB is not
00108 // tightly coupled to a VI, it is the responsibility of the user to assign
00109 // meaningful values to some of the fields in the VB.  For example, the user
00110 // averaging across time will need to decide what values ought to be reported
00111 // for the VisBuffer's timestamp, pointing angle, etc.
00112 //
00113 // Another possible attribute of a VisBuffer is "rekeyable".  This is for when
00114 // the VisBuffer is being filled by client code rather than from an input MS.
00115 // Because of this, the enforcement of VisBuffer invariants is relaxed.  Users
00116 // will be able to change row key fields (e.g., antenna1, data description id,
00117 // etc.) as well as change the shape of the data.  The method validateShapes is
00118 // provided which will check that all modified shapes are consistent.  This method
00119 // is automatically called by writeChangesBack and should also be called whenever
00120 // the construction process is complete and the VisBuffer is about to be released
00121 // for use; it's better to catch the error rather than letting an inconsistent
00122 // VisBuffer escape into consuming code.
00123 //
00124 //</synopsis>
00125 //
00126 //<todo>
00127 //</todo>
00128 
00129 class VisBuffer2 : private boost::noncopyable {
00130 
00131     friend class VisibilityIteratorImpl2;
00132     friend class FinalTvi2;
00133 
00134 public:
00135 
00136     enum {FrameNotSpecified = -2};
00137 
00138     VisBuffer2 () {}
00139     static VisBuffer2 * factory (VisBufferType t, VisBufferOptions vbOptions = VbNoOptions);
00140 
00141     // Destructor (detaches from VisIter)
00142 
00143     virtual ~VisBuffer2() {}
00144 
00145     //---------------------------------------------------------------------
00146     //
00147     // Copying methods
00148     //
00149     // These methods allow copying portions of the data between two
00150     // VisBuffers.  Because of the complicated semantics of a VisBuffer the
00151     // assignment and copy-construction methods are not used as they are likely
00152     // to confuse VisBuffer users.
00153 
00154 
00155     // Copies all of the components from the specified VisBuffer into this one.
00156     // Uncached values will be cleared in this VB.
00157 
00158     virtual void copy (const VisBuffer2 & other, Bool fetchIfNeeded) = 0;
00159 
00160     // Copies the specified components (or just the one in the cache) from
00161     // the specified VisBuffer into this one.
00162 
00163     virtual void copyComponents (const VisBuffer2 & other,
00164                                  const VisBufferComponents2 & components,
00165                                  Bool fetchIfNeeded = True) = 0;
00166 
00167     // Copies the coordinate components from the specified VisBuffer into this one.
00168     // Depending on includeDirections the direction related ones are copied or not.
00169 
00170     virtual void copyCoordinateInfo(const VisBuffer2 * other, Bool includeDirections,
00171                                     Bool fetchIfNeeded = True) = 0;
00172 
00173     virtual void setShape (Int nCorrelations, Int nChannels, Int nRows, Bool copyValues = False) = 0;
00174     virtual void validateShapes () const = 0;
00175 
00176     // For attached VBs this returns the VI the VB is attached to.  For free
00177     // VBs this method returns False.
00178 
00179     virtual const VisibilityIterator2 * getVi () const = 0;
00180 
00181     virtual Bool isAttached () const = 0;
00182     virtual Bool isFillable () const = 0;
00183 
00184     //---------------------------------------------------------------------
00185     //
00186     //    Dirty component methods
00187     //
00188     //    The dirtyComponent methods support the data-flow approach to using
00189     //    VisBuffers (the Visibility Processing Framework).  In this approach
00190     //    a VisBuffer is passed to successive processing nodes (e.g., applycal,
00191     //    flagging, etc.) which operate  on it and pass it on to the next node
00192     //    in the algorithm. The dirtyComponents mechanism allows a processing
00193     //    node to mark portions of the VisBuffer as modified.  If the VisBuffer
00194     //    reaches an write-to-disk node then the modified portions of the
00195     //    VisBuffer will be written out.  The user can also explicitly direct
00196     //    that the changes be written out using the writeChangesBack method.
00197     //
00198     //    Using a setter on a VisBuffer component will also set the dirty flag for
00199     //    that component.  Normally the user should not need to use these methods;
00200     //    however, they are available in case unexpected situations should arise
00201     //    in the future.
00202 
00203     virtual void writeChangesBack () = 0;
00204 
00205     virtual void dirtyComponentsAdd (const VisBufferComponents2 & additionalDirtyComponents) = 0;
00206     virtual void dirtyComponentsAdd (VisBufferComponent2 component) = 0;
00207     virtual void dirtyComponentsClear () = 0;
00208     virtual VisBufferComponents2 dirtyComponentsGet () const = 0;
00209     virtual void dirtyComponentsSet (const VisBufferComponents2 & dirtyComponents) = 0;
00210     virtual void dirtyComponentsSet (VisBufferComponent2 component) = 0;
00211 
00212     // This method returns the imaging weights associated with the VisBuffer.
00213     // If an imaging weight generator has not been supplied to the associated
00214     // VisibilityIterator then this method will throw an exception.
00215 
00216     virtual const Matrix<Float> & imagingWeight() const = 0;
00217 
00218     //---------------------------------------------------------------------------
00219     //
00220     // Frequency reporting methods.
00221     //
00222     // These methods provide information about the frequencies returned in the
00223     // visibility cubes.  The information can returned as the channel numbers
00224     // (numbered as in the underlying MS data) or in a frame-based frequency.
00225     // This information reported need not be in the same frame of reference
00226     // used to select the data.  If the frame of reference is specified in the
00227     // call, then that is the frame that is used to calculate the frequencies.
00228     // If it is not specified, then the VisibilityIterator will be queried for
00229     // virtual the reportingFrame = 0; if the user has specified a reporting frame to the
00230     // virtual VI then that frame will be used = 0; otherwise the frame used to select
00231     // the frequencies will be used.  If the user provides no frequency selection
00232     // to the VI then the selection frame will TOPO.
00233     //
00234     // Both the channelNumber and frequency reporting methods come in two versions:
00235     // one returns a single frequency for the specified frequency index and row
00236     // while the other provides all of the frequencies for the specified row.
00237     // The frequency index is the zero-based index along the frequency axis of
00238     // a visibility cube.
00239 
00240     virtual Vector<Int> getCorrelationNumbers () const = 0;
00241     virtual Double getFrequency (Int rowInBuffer, Int frequencyIndex,
00242                                  Int frame = FrameNotSpecified) const = 0;
00243     virtual const Vector<Double> & getFrequencies (Int rowInBuffer,
00244                                                    Int frame = FrameNotSpecified) const = 0;
00245     virtual Int getChannelNumber (Int rowInBuffer, Int frequencyIndex) const = 0;
00246     virtual const Vector<Int> & getChannelNumbers (Int rowInBuffer) const = 0;
00247 
00248     // Sort/unsort the correlations, if necessary
00249     //  (Rudimentary handling of non-canonically sorted correlations--use with care!)
00250     //
00251     // The sorting functionality is a horrible kluge that puts the VisBuffer into a
00252     // somewhat incoherent state (e.g., after sorting the correlation types array
00253     // does not correspond to the data) and appears to serve the needs
00254     // of a tiny piece of code.  As such, this refactor is initially not going to
00255     // support this functionality since it is probably better implemented in the one
00256     // place that actually needs it. (jjacobs 10/3/12)
00257     //
00258     //virtual void sortCorr () = 0;
00259     //virtual void unSortCorr() = 0;
00260 
00261     // Normalize the visCube by the modelVisCube.
00262 
00263     virtual void normalize() = 0;
00264 
00265     // Set the weight cube using the sigma cube.  Each weight will be
00266     // the reciprocal of the square of the corresponding element in the model
00267     // VisCube multiplied by the number of channels in the spectral window.
00268     // If an element in sigma is zero then the corresponding weight element
00269     // will also be set to zero.
00270 
00271     virtual void resetWeightsUsingSigma () = 0;//void resetWeightMat() = 0;
00272 
00273     //----------------------------------------------------------------------
00274     //
00275     //  Subhchunk information methods
00276     //
00277     //  These methods provide information related to the current subchunk.
00278     //  The isNewXXX methods return True if the XXX property of the subchunk
00279     //  differs from the previous subchunk.
00280     //
00281     //  The methods msId and msName provide information about the MS
00282     //  related to the current subchunk.  The msID is the zero-based index
00283     //  of the MS in the sequence of MSs being iterated over.
00284     //
00285     //  The isWritable method is True when the attached iterator is writable
00286     //  and False otherwise.
00287     //
00288     //  The isRekeyable method is True when the VisBuffer is writable and also
00289     //  allows the modification of non-data fields (e.g., antenna1, fieldId, etc.)
00290     //  A rekeyable VB is one that could be used to create data for a brand new
00291     //  MS.
00292 
00293     virtual Bool isNewArrayId () const = 0;
00294     virtual Bool isNewFieldId () const = 0;
00295     virtual Bool isNewMs() const = 0;
00296     virtual Bool isNewSpectralWindow () const = 0;
00297     virtual Bool isWritable () const = 0;
00298     virtual Int msId() const = 0;
00299     virtual String msName (Bool stripPath = False) const = 0;
00300     virtual Subchunk getSubchunk () const = 0;
00301 
00303     //
00304     //  Data accessors and setters (where appropriate)
00305     //
00306     //  There are the methods that allows access to the items cached in the
00307     //  VisBuffer.  The straight accessors provide read-only access to the
00308     //  item.  Where the item is allowed to be modified, one or more set
00309     //  methods are provided.
00310     //
00311     //  The dimensionality of the major object in in accessor/setter is
00312     //  shown in a trailing comment using the following abbreviations:
00313     //
00314     //  nA :== number of antennas
00315     //  nF :== number of frequencies (or channels)
00316     //  nC :== number of correlations
00317     //  nR :== number of table rows contained in the buffer
00318 
00319     //--------------------------------------------------------
00320     //
00321     // Accessors for data contained in the main MeasurementSet main table
00322     // The actual visibility data are at the end.
00323     //
00324     //  *** N.B.: the VB usually caches the information
00325     //  in the representation requested so that using a setter to modify
00326     //  one value type (e.g., weight or visibility) will not modify the
00327     //  cached value in a different representation (e.g., weightMat or
00328     //  visCube).  This should not be a problem in normal usage.
00329 
00330     virtual const Vector<Int> & antenna1 () const = 0; // [nR]
00331     virtual void setAntenna1 (const Vector<Int> & value) = 0; // [nR]
00332     virtual const Vector<Int> & antenna2 () const = 0; // [nR]
00333     virtual void setAntenna2 (const Vector<Int> & value) = 0; // [nR]
00334     virtual const Vector<Int> & arrayId () const = 0;
00335     virtual void setArrayId (const Vector<Int> & ) = 0;
00336     //virtual Int dataDescriptionId () const = 0;
00337     //virtual void setDataDescriptionId (Int value) = 0;
00338     virtual const Vector<Int> & dataDescriptionIds () const = 0; // [nR]
00339     virtual void setDataDescriptionIds (const Vector<Int> & ) = 0; // [nR]
00340     virtual const Vector<MDirection> & direction1 () const = 0; // [nR]
00341     virtual const Vector<MDirection> & direction2 () const = 0; // [nR]
00342     virtual const Vector<Double> & exposure () const = 0; // [nR]
00343     virtual void setExposure (const Vector<Double> & value) = 0; // [nR]
00344     virtual const Vector<Int> & feed1 () const = 0; // [nR]
00345     virtual void setFeed1 (const Vector<Int> & value) = 0; // [nR]
00346     virtual const Vector<Int> & feed2 () const = 0; // [nR]
00347     virtual void setFeed2 (const Vector<Int> & value) = 0; // [nR]
00348     virtual const Vector<Int> & fieldId () const = 0;
00349     virtual void setFieldId (const Vector<Int> &) = 0;
00350     virtual const Matrix<Bool> & flag () const = 0; // [nF,nR]
00351     virtual void setFlag (const Matrix<Bool>& value) = 0; // [nF,nR]
00352     virtual const Array<Bool> & flagCategory () const = 0; // [nC,nF,nCategories,nR]
00353     virtual void setFlagCategory (const Array<Bool>& value) = 0; // [nC,nF,nCategories,nR]
00354     virtual const Cube<Bool> & flagCube () const = 0; // [nC,nF,nR]
00355     virtual void setFlagCube (const Cube<Bool>& value) = 0; // [nC,nF,nR]
00356     virtual const Vector<Bool> & flagRow () const = 0; // [nR]
00357     virtual void setFlagRow (const Vector<Bool>& value) = 0; // [nR]
00358     virtual const Vector<Int> & observationId () const = 0; // [nR]
00359     virtual void setObservationId (const Vector<Int> & value) = 0; // [nR]
00360     virtual const Vector<Int> & processorId () const = 0; // [nR]
00361     virtual void setProcessorId (const Vector<Int> & value) = 0; // [nR]
00362     virtual const Vector<Int> & scan () const = 0; // [nR]
00363     virtual void setScan (const Vector<Int> & value) = 0; // [nR]
00364     virtual const Matrix<Float> & sigma () const = 0; // [nC, nR]
00365     virtual void setSigma (const Matrix <Float> & value) = 0; // [nC, nR]
00366     //virtual const Matrix<Float> & sigmaMat () const = 0; // [nC,nR]
00367     virtual const Vector<Int> & stateId () const = 0; // [nR]
00368     virtual void setStateId (const Vector<Int> & value) = 0; // [nR]
00369     virtual const Vector<Double> & time () const = 0; // [nR]
00370     virtual void setTime (const Vector<Double> & value) = 0; // [nR]
00371     virtual const Vector<Double> & timeCentroid () const = 0; // [nR]
00372     virtual void setTimeCentroid (const Vector<Double> & value) = 0; // [nR]
00373     virtual const Vector<Double> & timeInterval () const = 0; // [nR]
00374     virtual void setTimeInterval (const Vector<Double> & value) = 0; // [nR]
00375     virtual const Matrix<Double> & uvw () const = 0; // [3,nR]
00376     virtual void setUvw (const Matrix<Double> & value) = 0; // [3,nR]
00377     virtual const Matrix<Float> & weight () const = 0; // [nC, nR]
00378     virtual void setWeight (const Matrix <Float>& value) = 0; // [nC, nR]
00379     //virtual const Matrix<Float> & weightMat () const = 0; // [nC,nR]
00380     //virtual void setWeightMat (const Matrix<Float>& value) = 0; // [nC,nR]
00381     virtual const Cube<Float> & weightSpectrum () const = 0; // [nC,nF,nR]
00382     virtual void setWeightSpectrum (const Cube<Float>& value) = 0; // [nC,nF,nR]
00383 
00384     // --------------------------------------------------------------
00385     // Visibility data accessors in order of observed, corrected,
00386     // float, & model
00387 
00388     virtual const Cube<Complex> & visCube () const = 0; // [nC,nF,nR]
00389     virtual void setVisCube(const Complex & c) = 0;
00390     virtual void setVisCube (const Cube<Complex> &) = 0; // [nC,nF,nR]
00391 //    virtual const Matrix<CStokesVector> & vis () const = 0; // [nF,nR]
00392 //    virtual void setVis (Matrix<CStokesVector> &) = 0; // [nF,nR]
00393 
00394     virtual const Cube<Complex> & visCubeCorrected () const = 0; // [nC,nF,nR]
00395     virtual void setVisCubeCorrected (const Cube<Complex> &) = 0; // [nC,nF,nR]
00396 //    virtual const Matrix<CStokesVector> & visCorrected () const = 0; // [nF,nR]
00397 //    virtual void setVisCorrected (const Matrix<CStokesVector> &) = 0; // [nF,nR]
00398 
00399     virtual const Cube<Float> & visCubeFloat () const = 0; // [nC,nF,nR]
00400     virtual void setVisCubeFloat (const Cube<Float> &) = 0; // [nC,nF,nR]
00401 
00402     virtual const Cube<Complex> & visCubeModel () const = 0; // [nC,nF,nR]
00403     virtual void setVisCubeModel(const Complex & c) = 0;
00404     virtual void setVisCubeModel(const Cube<Complex>& vis) = 0; // [nC,nF,nR]
00405 //    virtual void setVisCubeModel(const Vector<Float>& stokes) = 0; // [1..4]
00406 //    virtual const Matrix<CStokesVector> & visModel () const = 0; // [nF,nR]
00407 //    virtual void setVisModel (Matrix<CStokesVector> &) = 0; // [nF,nR]
00408 
00409     //--------------------------------------------------------
00410     //
00411     // Accessors for data derived from the MS main table data
00412 
00413     // Returns the pointing angle for the array as a whole at the
00414     // specified time.
00415 
00416     virtual MDirection azel0 (Double time) const = 0;
00417 
00418     // Returns the pointing angle for each antenna in the array
00419     // at the specified time.
00420 
00421     virtual const Vector<MDirection> & azel(Double time) const = 0; // [nA]
00422 
00423     // Returns the Jones C matrix for each antenna.
00424 
00425     virtual const Vector<SquareMatrix<Complex, 2> > & cjones () const = 0; // [nA]
00426 
00427     // Returns the correlation type of each correlation in the
00428     // VisCube.
00429 
00430     virtual const Vector<Int> & correlationTypes () const = 0; // [nC]
00431 
00432     // Calculates the parallactic angle for the first receptor of
00433     // each antenna at the specified time.
00434 
00435     virtual const Vector<Float> & feedPa(Double time) const = 0; // [nR]
00436 
00437     // Calculates the parallactic angle for feed 0 of the
00438     // row's Antenna1.
00439 
00440     virtual const Vector<Float> & feedPa1 () const = 0; // [nR]
00441 
00442     // Calculates the parallactic angle for feed 0 of the
00443     // row's Antenna2.
00444 
00445     virtual const Vector<Float> & feedPa2 () const = 0; // [nR]
00446 
00447     // Returns the hour angle of the array at the specified time.
00448 
00449     virtual Double hourang(Double time) const = 0;
00450 
00451     virtual Int nAntennas () const = 0;
00452 
00453     virtual Int nChannels () const = 0;
00454 
00455     // Returns the number of correlations along the visCube
00456     // correlation axis.
00457 
00458     virtual Int nCorrelations () const = 0;
00459 
00460     // Returns the number of rows in this VisBuffer
00461 
00462     virtual Int nRows () const = 0;
00463 
00464     // Calculates the parallactic angle of the array as a whole
00465     // at the specified time.
00466 
00467     virtual Float parang0(Double time) const = 0;
00468 
00469     // Calculates the parallactic angle of each antenna in the
00470     // array at the specified time.
00471 
00472     virtual const Vector<Float> & parang(Double time) const = 0; // [nA]
00473 
00474     // Returns the phase center of the array for the specified
00475     // row.
00476 
00477     virtual const MDirection& phaseCenter () const = 0;
00478 
00479     // Returns the polarization frame for the specified row.
00480 
00481     virtual Int polarizationFrame () const = 0;
00482 
00483     virtual Int polarizationId () const = 0;
00484 
00485     // The returned Vector serves as a map between the rows in
00486     // the VisBuffer and the row IDs in the underlying MS main
00487     // virtual table:  mainTableID [i] = rowIds () [ i] = 0;
00488 
00489     virtual const Vector<uInt> & rowIds () const = 0; // [nR]
00490 
00491     // Returns the spectral window ID for the specified row.
00492 
00493     //virtual Int spectralWindow () const = 0;
00494 
00495     virtual const Vector<Int> & spectralWindows () const = 0; // [nR]
00496     //virtual void setSpectralWindows (const Vector<Int> & spectralWindows) = 0;
00497 
00498     static VisBuffer2 * factory (VisibilityIterator2 * vi, VisBufferType t, VisBufferOptions options);
00499 
00500 protected:
00501 
00502     virtual void configureNewSubchunk (Int msId, const String & msName, Bool isNewMs,
00503                                        Bool isNewArrayId, Bool isNewFieldId,
00504                                        Bool isNewSpectralWindow, const Subchunk & subchunk,
00505                                        Int nRows, Int nChannels, Int nCorrelations,
00506                                        const Vector<Int> & correlations) = 0;
00507     virtual void invalidate() = 0;
00508     virtual Bool isRekeyable () const = 0;
00509     virtual void setFillable (Bool isFillable) = 0;
00510     virtual void setRekeyable (Bool isRekeable) = 0;
00511 
00512     virtual Vector<Bool> & flagRowRef () = 0;  // [nR]
00513     virtual Cube<Bool> & flagCubeRef () = 0;  // [nC,nF,nR]
00514     virtual Cube<Complex> & visCubeRef () = 0; // [nC,nF,nR]
00515     virtual Cube<Complex> & visCubeCorrectedRef () = 0; // [nC,nF,nR]
00516     virtual Cube<Complex> & visCubeModelRef () = 0; // [nC,nF,nR]
00517     virtual Cube<Float> & weightSpectrumRef () = 0; // [nC,nF,nR]
00518 
00519     //virtual VisBuffer2 * vb_p = 0; // One of the implementation classes
00520 
00521 private:
00522 
00523 };
00524 
00525 
00526 } // end namespace vi
00527 
00528 
00529 } //# NAMESPACE CASA - END
00530 
00531 
00532 #endif
00533