LCOV - code coverage report
Current view: top level - mstransform/MSTransform - MSTransformRegridder.h (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 4 6 66.7 %
Date: 2024-12-11 20:54:31 Functions: 4 6 66.7 %

          Line data    Source code
       1             : //# MSTransformRegridder.h: This file contains the interface definition of the MSTransformRegridder class.
       2             : //#
       3             : //#  CASA - Common Astronomy Software Applications (http://casa.nrao.edu/)
       4             : //#  Copyright (C) Associated Universities, Inc. Washington DC, USA 2011, All rights reserved.
       5             : //#  Copyright (C) European Southern Observatory, 2011, All rights reserved.
       6             : //#
       7             : //#  This library is free software; you can redistribute it and/or
       8             : //#  modify it under the terms of the GNU Lesser General Public
       9             : //#  License as published by the Free software Foundation; either
      10             : //#  version 2.1 of the License, or (at your option) any later version.
      11             : //#
      12             : //#  This library is distributed in the hope that it will be useful,
      13             : //#  but WITHOUT ANY WARRANTY, without even the implied warranty of
      14             : //#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15             : //#  Lesser General Public License for more details.
      16             : //#
      17             : //#  You should have received a copy of the GNU Lesser General Public
      18             : //#  License along with this library; if not, write to the Free Software
      19             : //#  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
      20             : //#  MA 02111-1307  USA
      21             : //# $Id: $
      22             : 
      23             : #ifndef MSTransformRegridder_H_
      24             : #define MSTransformRegridder_H_
      25             : 
      26             : // Logging
      27             : #include <casacore/casa/Logging/LogIO.h>
      28             : 
      29             : // casacore::Coordinate systems
      30             : #include <casacore/measures/Measures/MeasTable.h>
      31             : 
      32             : // casacore::MS handling
      33             : #include <casacore/ms/MeasurementSets.h>
      34             : 
      35             : // To use ostringstream
      36             : #include <iomanip>
      37             : 
      38             : // Enable record conversions
      39             : #include <casacore/casa/Quanta/QuantumHolder.h>
      40             : 
      41             : 
      42             : namespace casa { //# NAMESPACE CASA - BEGIN
      43             : 
      44             : //  MSTransformRegridder definition
      45             : class MSTransformRegridder
      46             : {
      47             : 
      48             : public:
      49             : 
      50             :         MSTransformRegridder();
      51             :         ~MSTransformRegridder();
      52             : 
      53             :         // Make one spectral window from all SPWs given by the SPW Ids vector
      54             :         static casacore::Bool combineSpws(      casacore::LogIO& os,
      55             :                                                                 casacore::String msName,
      56             :                                                                 const casacore::Vector<casacore::Int>& spwids, // casacore::Vector<casacore::Int>(1,-1) means: use all SPWs
      57             :                                                                 casacore::Vector<casacore::Double>& newCHAN_FREQ, // Will return the grid of the resulting SPW
      58             :                                                                 casacore::Vector<casacore::Double>& newCHAN_WIDTH,
      59             :                                                                 std::vector<std::vector<casacore::Int> >& averageWhichChan,
      60             :                                                                 std::vector<std::vector<casacore::Int> >& averageWhichSPW,
      61             :                                                                 std::vector<std::vector<casacore::Double> >& averageChanFrac,
      62             :                                                                 casacore::Bool verbose = false);
      63             : 
      64             :         // Make one spectral window from all SPWs given by the SPW Ids vector
      65             :         static casacore::Bool combineSpwsCore(  casacore::LogIO& os,
      66             :                                                                         casacore::MeasurementSet& ms_p,
      67             :                                                                         const casacore::Vector<casacore::Int>& spwids, // casacore::Vector<casacore::Int>(1,-1) means: use all SPWs
      68             :                                                                         casacore::Vector<casacore::Double>& newCHAN_FREQ, // Will return the grid of the resulting SPW
      69             :                                                                         casacore::Vector<casacore::Double>& newCHAN_WIDTH,
      70             :                                                                         std::vector<std::vector<casacore::Int> >& averageWhichChan,
      71             :                                                                         std::vector<std::vector<casacore::Int> >& averageWhichSPW,
      72             :                                                                         std::vector<std::vector<casacore::Double> >& averageChanFrac,
      73             :                                                                         casacore::Bool verbose = false);
      74             : 
      75             :         // A wrapper for regridChanBounds() which takes the user interface type re-gridding parameters
      76             :         // The ready-made grid is returned in newCHAN_FREQ and newCHAN_WIDTH
      77             :         static casacore::Bool calcChanFreqs(    casacore::LogIO& os,
      78             :                                                                 // Output
      79             :                                                                 casacore::Vector<casacore::Double>& newCHAN_FREQ,
      80             :                                                                 casacore::Vector<casacore::Double>& newCHAN_WIDTH,
      81             :                                                                 casacore::Double& weightScale,
      82             :                                                                 // casacore::Input (original grid)
      83             :                                                                 const casacore::Vector<casacore::Double>& oldCHAN_FREQ,
      84             :                                                                 const casacore::Vector<casacore::Double>& oldCHAN_WIDTH,
      85             :                                                                 // Re-gridding parameters
      86             :                                                                 const casacore::MDirection  phaseCenter,
      87             :                                                                 const casacore::MFrequency::Types theOldRefFrame,
      88             :                                                                 const casacore::MEpoch theObsTime,
      89             :                                                                 const casacore::MPosition mObsPos,
      90             :                                                                 const casacore::String& mode,
      91             :                                                                 const int nchan,
      92             :                                                                 const casacore::String& start,
      93             :                                                                 const casacore::String& width,
      94             :                                                                 const casacore::String& restfreq,
      95             :                                                                 const casacore::String& outframe,
      96             :                                                                 const casacore::String& veltype,
      97             :                                                                 const casacore::Bool verbose=false,
      98             :                                                                 // Additional radial velocity shift to apply, used e.g. when outframe=="SOURCE"
      99             :                                                                 const casacore::MRadialVelocity mRV=casacore::MRadialVelocity() );
     100             : 
     101             :           // Helper function for handling the re-gridding parameter user input
     102             :           static casacore::Bool convertGridPars(casacore::LogIO& os,
     103             :                                                           const casacore::String& mode,
     104             :                                                           const int nchan,
     105             :                                                           const casacore::String& start,
     106             :                                                           const casacore::String& width,
     107             :                                                           const casacore::String& interp,
     108             :                                                           const casacore::String& restfreq,
     109             :                                                           const casacore::String& outframe,
     110             :                                                           const casacore::String& veltype,
     111             :                                                           casacore::String& t_mode,
     112             :                                                           casacore::String& t_outframe,
     113             :                                                           casacore::String& t_regridQuantity,
     114             :                                                           casacore::Double& t_restfreq,
     115             :                                                           casacore::String& t_regridInterpMeth,
     116             :                                                           casacore::Double& t_cstart,
     117             :                                                           casacore::Double& t_bandwidth,
     118             :                                                           casacore::Double& t_cwidth,
     119             :                                                           casacore::Bool& t_centerIsStart,
     120             :                                                           casacore::Bool& t_startIsEnd,
     121             :                                                           casacore::Int& t_nchan,
     122             :                                                           casacore::Int& t_width,
     123             :                                                           casacore::Int& t_start);
     124             : 
     125             :           // Calculate the final new channel boundaries from the re-regridding parameters and
     126             :           // the old channel boundaries (already transformed to the desired reference frame).
     127             :           // Returns false if input parameters were invalid and no useful boundaries could be created
     128             :           static casacore::Bool regridChanBounds(casacore::Vector<casacore::Double>& newChanLoBound,
     129             :                                                            casacore::Vector<casacore::Double>& newChanHiBound,
     130             :                                                            const casacore::Double regridCenter,
     131             :                                                            const casacore::Double regridBandwidth,
     132             :                                                            const casacore::Double regridChanWidth,
     133             :                                                            const casacore::Double regridVeloRestfrq,
     134             :                                                            const casacore::String regridQuant,
     135             :                                                            const casacore::Vector<casacore::Double>& transNewXin,
     136             :                                                            const casacore::Vector<casacore::Double>& transCHAN_WIDTH,
     137             :                                                            casacore::String& message, // message to the user, especially in case of error
     138             :                                                            const casacore::Bool centerIsStart=false, // if true, the parameter regridCenter specifies the start
     139             :                                                            const casacore::Bool startIsEnd=false, // if true, and centerIsStart is true, regridCenter specifies the upper end in frequency
     140             :                                                            const casacore::Int nchan=0, // if != 0 : used instead of regridBandwidth, -1 means use all channels
     141             :                                                            const casacore::Int width=0, // if >0 and regridQuant=="freq": used instead of regridChanWidth
     142             :                                                            const casacore::Int start=-1); // if >=0 and regridQuant=="freq": used instead of regridCenter
     143             : 
     144             :           // The following inline convenience methods for regridSpw bypass the whole CASA measure system
     145             :           // because when they are used, they can assume that the frame stays the same and the units are OK
     146        5420 :           static casacore::lDouble vrad(const casacore::lDouble freq, const casacore::lDouble rest){ return (casacore::C::c * (1. - freq/rest)); };
     147         279 :           static casacore::lDouble vopt(const casacore::lDouble freq, const casacore::lDouble rest){ return (casacore::C::c *(rest/freq - 1.)); };
     148           0 :           static casacore::lDouble lambda(const casacore::lDouble freq){ return (casacore::C::c/freq); };
     149        5058 :           static casacore::lDouble freq_from_vrad(const casacore::lDouble vrad, const casacore::lDouble rest){ return (rest * (1. - vrad/casacore::C::c)); };
     150         238 :           static casacore::lDouble freq_from_vopt(const casacore::lDouble vopt, const casacore::lDouble rest){ return (rest / (1. + vopt/casacore::C::c)); };
     151           0 :           static casacore::lDouble freq_from_lambda(const casacore::lDouble lambda){ return (casacore::C::c/lambda); };
     152             : };
     153             : 
     154             : } //# NAMESPACE CASA - END
     155             : 
     156             : #endif /* MSTransformRegridder_H_ */

Generated by: LCOV version 1.16