//# VisSetUtil.h: Definitions for casacore::Stokes Image utilities
//# Copyright (C) 1996,1997,1998
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be adressed as follows:
//#        Internet email: aips2-request@nrao.edu.
//#        Postal address: AIPS++ Project Office
//#                        National Radio Astronomy Observatory
//#                        520 Edgemont Road
//#                        Charlottesville, VA 22903-2475 USA
//#
//#
//# $Id$

#ifndef MSVIS_VISSETUTIL_H
#define MSVIS_VISSETUTIL_H

#include <casacore/casa/aips.h>
#include <casacore/casa/BasicSL/Complex.h>
#include <casacore/casa/Quanta/Quantum.h>
#include <casacore/ms/MeasurementSets/MeasurementSet.h>
#include <msvis/MSVis/VisibilityIterator.h>

namespace casa { //# NAMESPACE CASA - BEGIN

  class VisSet;

// <summary> 
// Utilities for operating on VisSets.
// </summary>

// <reviewed reviewer="" date="" tests="" demos="">

// <prerequisite>
// </prerequisite>
//
// <etymology>
// </etymology>
//
// <synopsis> 
// </synopsis> 
//
// <example>
// <srcblock>
// </srcblock>
// </example>
//
// <motivation>
// </motivation>
//
// <todo asof="">
// </todo>


class VisSetUtil {
  
public:
  // Calculate sensitivity
  static void Sensitivity(VisSet &vs, casacore::Matrix<casacore::Double>& mssFreqSel,casacore::Matrix<casacore::Int>& mssChanSel,
			  casacore::Quantity& pointsourcesens, casacore::Double& relativesens,
			  casacore::Double& sumwt,
			  casacore::Double& effectiveBandwidth,
			  casacore::Double& effectiveIntegration,
			  casacore::Int& nBaselines,
			  casacore::Vector<casacore::Vector<casacore::Int> >& nData,
			  casacore::Vector<casacore::Vector<casacore::Double> >& sumwtChan,
			  casacore::Vector<casacore::Vector<casacore::Double> >& sumwtsqChan,
			  casacore::Vector<casacore::Vector<casacore::Double> >& sumInverseVarianceChan);
  static void Sensitivity(ROVisibilityIterator &vi, 
			  casacore::Matrix<casacore::Double>& mssFreqSel,
			  casacore::Matrix<casacore::Int>& mssChanSel,
			  casacore::Quantity& pointsourcesens, 
			  casacore::Double& relativesens,
			  casacore::Double& sumwt,
			  casacore::Double& effectiveBandwidth,
			  casacore::Double& effectiveIntegration,
			  casacore::Int& nBaselines,
			  casacore::Vector<casacore::Vector<casacore::Int> >& nData,
			  casacore::Vector<casacore::Vector<casacore::Double> >& sumwtChan,
			  casacore::Vector<casacore::Vector<casacore::Double> >& sumwtsqChan,
			  casacore::Vector<casacore::Vector<casacore::Double> >& sumInverseVarianceChan);
  // Hanning smoothing of spectral channels
  static void HanningSmooth(VisSet &vs, const casacore::String& dataCol="corrected", 
			    const casacore::Bool& doFlagAndWeight=true);
  static void HanningSmooth(VisibilityIterator &vi, const casacore::String& dataCol="corrected",
			    const casacore::Bool& doFlagAndWeight=true);
  // Subtract/add model from/to corrected visibility data
  static void UVSub(VisSet &vs, casacore::Bool reverse=false);
  static void UVSub(VisibilityIterator &vs, casacore::Bool reverse=false);


  // Add and (optionally) initialize scratch columns
  static void addScrCols(casacore::MeasurementSet& ms, casacore::Bool addModel, casacore::Bool addCorr, 
			 casacore::Bool init, casacore::Bool compress);

  // Initialize scr cols
  static void initScrCols(casacore::MeasurementSet& ms, casacore::Bool initModel, casacore::Bool initCorr);
  static void initScrCols(VisibilityIterator& ms, casacore::Bool initModel, casacore::Bool initCorr);

  // Remove OTF model keywords
  static void remOTFModel(casacore::MeasurementSet& ms);

  // Remove physical scrcols
  static void remScrCols(casacore::MeasurementSet& ms, casacore::Bool remModel, casacore::Bool remCorr);

   // Remove an existing cal set (a CORRECTED_DATA and MODEL_DATA 
  // column set and, optionally, any associated compression columns)
  //if removeModel=true...any model for OTF model vis saved in the header is removed
  static void removeCalSet(casacore::MeasurementSet& ms, casacore::Bool removeModel=false);

};

} //# NAMESPACE CASA - END

#endif