LCOV - code coverage report
Current view: top level - flagging/Flagging - DDMapper.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 121 0.0 %
Date: 2024-10-04 18:58:15 Functions: 0 18 0.0 %

          Line data    Source code
       1             : //# DDMapper.cc: this defines DDMapper
       2             : //# Copyright (C) 2000,2001,2002
       3             : //# Associated Universities, Inc. Washington DC, USA.
       4             : //#
       5             : //# This library is free software; you can redistribute it and/or modify it
       6             : //# under the terms of the GNU Library General Public License as published by
       7             : //# the Free Software Foundation; either version 2 of the License, or (at your
       8             : //# option) any later version.
       9             : //#
      10             : //# This library is distributed in the hope that it will be useful, but WITHOUT
      11             : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12             : //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
      13             : //# License for more details.
      14             : //#
      15             : //# You should have received a copy of the GNU Library General Public License
      16             : //# along with this library; if not, write to the Free Software Foundation,
      17             : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
      18             : //#
      19             : //# Correspondence concerning AIPS++ should be addressed as follows:
      20             : //#        Internet email: casa-feedback@nrao.edu.
      21             : //#        Postal address: AIPS++ Project Office
      22             : //#                        National Radio Astronomy Observatory
      23             : //#                        520 Edgemont Road
      24             : //#                        Charlottesville, VA 22903-2475 USA
      25             : //#
      26             : //# $Id$
      27             : #include <casacore/casa/Exceptions/Error.h>
      28             : #include <flagging/Flagging/DDMapper.h>
      29             : #include <flagging/Flagging/RFChunkStats.h>
      30             : #include <casacore/casa/Utilities/Regex.h>
      31             : 
      32             : using namespace casacore;
      33             : namespace casa { //# NAMESPACE CASA - BEGIN
      34             : 
      35           0 : DDFunc::DDFunc( FuncSignature fsig,const String &corrstr )
      36           0 :   : DDMapper(),icorr(-1),func(fsig)
      37             : {
      38           0 :   corrtype = Stokes::type( corrstr );
      39           0 :   valid = false;
      40           0 : }
      41             : 
      42           0 : Bool DDFunc::reset ( const Vector<Int> &corr )
      43             : { 
      44           0 :   icorr = findCorrType( corrtype,corr );
      45           0 :   if( icorr<0 )
      46           0 :     return valid=false;
      47           0 :   corrmask = (1<<icorr);
      48           0 :   return valid=true;
      49             : }
      50             : 
      51           0 : Float DDFunc::map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const
      52             : { 
      53           0 :   return (*func)( vis(icorr,ich,irow) ); 
      54             : }
      55             : 
      56           0 : Float DDFunc::real ( const Complex &val)
      57             : {
      58           0 :   return val.real();
      59             : }
      60             : 
      61           0 : Float DDFunc::imag ( const Complex &val)
      62             : {
      63           0 :   return val.imag();
      64             : }
      65             : 
      66           0 : DDSumFunc::DDSumFunc( FuncSignature fsig,const String &corr1,const String &corr2 )
      67           0 :   : DDFunc(fsig,corr1),icorr2(-1)
      68             : {
      69           0 :   corrtype2 = Stokes::type( corr2 );
      70           0 :   valid = false;
      71           0 : }
      72             : 
      73           0 : Bool DDSumFunc::reset ( const Vector<Int> &corr )
      74             : { 
      75             : // case of "I" - look up XX+YY or RR+LL
      76           0 :   if( corrtype == Stokes::I )
      77             :   {
      78           0 :     icorr = findCorrType( Stokes::XX,corr );
      79           0 :     icorr2 = findCorrType( Stokes::YY,corr );
      80             :     // no XX+YY? try RR+LL
      81           0 :     if( icorr<0 || icorr2<0 )
      82             :     {
      83           0 :       icorr = findCorrType( Stokes::RR,corr );
      84           0 :       icorr2 = findCorrType( Stokes::LL,corr );
      85             :     }
      86             :     // give up if not found
      87           0 :     if( icorr<0 || icorr2<0 )
      88           0 :       return valid=false;
      89           0 :     corrmask = (1<<icorr)|(1<<icorr2);
      90           0 :     return valid=true;
      91             :   }
      92             : // standard case - just look up correlations directly
      93             :   else
      94             :   {
      95           0 :     if( !DDFunc::reset(corr) )
      96           0 :       return false;
      97           0 :     icorr2 = findCorrType( corrtype2,corr );
      98           0 :     if( icorr2<0 )
      99           0 :       return valid=false;
     100           0 :     corrmask |= (1<<icorr2);
     101           0 :     return valid=true;
     102             :   }
     103             : }
     104             : 
     105           0 : Float DDSumFunc::map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const
     106             : { 
     107           0 :   return (*func)( vis(icorr,ich,irow) ) + (*func)( vis(icorr2,ich,irow) ); 
     108             : }
     109             : 
     110           0 : DDFuncSum::DDFuncSum( FuncSignature fsig,const String &corr1,const String &corr2 )
     111           0 :   : DDSumFunc(fsig,corr1,corr2)
     112           0 : {}
     113             : 
     114           0 : Float DDFuncSum::map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const
     115             : { 
     116           0 :   return (*func)( vis(icorr,ich,irow) + vis(icorr2,ich,irow) ); 
     117             : }
     118             : 
     119           0 : DDFuncDiff::DDFuncDiff( FuncSignature fsig,const String &corr1,const String &corr2 )
     120           0 :   : DDSumFunc(fsig,corr1,corr2)
     121           0 : {}
     122             : 
     123           0 : Float DDFuncDiff::map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const
     124             : { 
     125           0 :   return (*func)( vis(icorr,ich,irow) - vis(icorr2,ich,irow) ); 
     126             : }
     127             : 
     128           0 : DDDiffFunc::DDDiffFunc( FuncSignature fsig,const String &corr1,const String &corr2 )
     129           0 :   : DDSumFunc(fsig,corr1,corr2)
     130           0 : {}
     131             : 
     132           0 : Float DDDiffFunc::map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const
     133             : { 
     134           0 :   return (*func)( vis(icorr,ich,irow) ) - (*func)( vis(icorr2,ich,irow) ); 
     135             : }
     136             : 
     137             : // -----------------------------------------------------------------------
     138             : // getDDFunction
     139             : // Maps a string to a function pointer
     140             : // -----------------------------------------------------------------------
     141           0 : DDFunc::FuncSignature DDFunc::getFunction ( const String &func )
     142             : {
     143             :   // Map of available functions
     144           0 :   const struct { const char *name; DDFunc::FuncSignature func; } func_map[] = 
     145             :   { { "ABS", std::abs },
     146             :     { "ARG", std::arg },
     147             :     { "RE" , DDFunc::real },
     148             :     { "IM" , DDFunc::imag },
     149             :     { "RE" , DDFunc::real },
     150             :     { "NORM" , std::norm }
     151             :   };
     152           0 :   const uInt num_func_map = sizeof(func_map)/sizeof(func_map[0]);
     153             : 
     154           0 :   for( uInt i=0; i<num_func_map; i++ )
     155           0 :     if( func.matches( func_map[i].name ) )
     156           0 :       return func_map[i].func;
     157           0 :   return NULL;
     158             : } 
     159             : 
     160           0 : static AipsError funcError ( const String &name )
     161             : {
     162           0 :   return AipsError( String("DDMapper: unrecognized function '")+name+"'");
     163             : }
     164             : 
     165             : // -----------------------------------------------------------------------
     166             : // splitExpression
     167             : // helper function, converts vector of strings (or single string
     168             : // w/whitespace separators) into vector of uppercase Strings.
     169             : // -----------------------------------------------------------------------
     170           0 : Vector<String> splitExpression( const Vector<String> &expr0 )
     171             : {
     172           0 :   uInt nel = expr0.nelements();
     173           0 :   if( nel == 1 ) // if only one element, try to split it at whitespace
     174             :   {
     175             : // split expression into array of strings
     176           0 :     String expr[20];
     177           0 :     nel = split(expr0(0),expr,20,RXwhite);
     178           0 :     Vector<String> out(nel);
     179           0 :     for( uInt i=0; i<nel; i++ )
     180           0 :       out(i) = upcase( expr[i] );
     181           0 :     return out;
     182           0 :   }
     183             : // else just copy vector, converting to uppercase
     184           0 :   Vector<String> out(nel);
     185           0 :   for( uInt i=0; i<nel; i++ )
     186           0 :     out(i) = upcase( expr0(i) );
     187           0 :   return out;    
     188           0 : }
     189             :   
     190             : // -----------------------------------------------------------------------
     191             : // getDDMapper
     192             : // Parses vector of strings to define a mapper
     193             : // -----------------------------------------------------------------------
     194           0 : DDMapper * DDFunc::getMapper ( String &descr,const Vector<String> &expr0,Bool throw_excp )
     195             : {
     196             : // convert to C array
     197           0 :   Vector<String> expr( splitExpression(expr0) );
     198           0 :   uInt nel = expr.nelements();
     199             :   
     200           0 :   if( nel == 1 ) // 1 element: assume it's just CORR, and use abs(CORR)
     201             :   {
     202           0 :     if( expr(0) == "I" ) // I is special (maps to XX+YY or RR+LL)
     203           0 :       return new DDFuncSum(&std::abs,"I","I");
     204           0 :     return new DDFunc(&std::abs,expr(0));
     205             :   }
     206           0 :   else if( nel == 2 ) // 2 elements: assume FUNC CC
     207             :   {
     208           0 :     DDFunc::FuncSignature func = getFunction(expr(0));
     209           0 :     if( !func )
     210           0 :       throw( funcError(expr(0)) );
     211           0 :     descr = expr(0)+"("+expr(1)+")";
     212           0 :     if( expr(1) == "I" ) // I is special (maps to XX+YY or RR+LL)
     213           0 :       return new DDFuncSum(func,"I","I");
     214           0 :     return new DDFunc(func,expr(1));
     215             :   }
     216           0 :   else if( nel == 4 ) // 4 elements: SUM FUNC CC CC or FUNC SUM CC CC
     217             :   {
     218             :     DDFunc::FuncSignature func;
     219           0 :     if( expr(0) == "+" || expr(0) == "-" )
     220             :     {
     221           0 :       func = getFunction(expr(1));
     222           0 :       if( !func )
     223           0 :         throw( funcError(expr(1)) );
     224           0 :       descr = expr(1)+"("+expr(2)+")"+expr(0)+expr(1)+"("+expr(3)+")";
     225           0 :       if( expr(0) == "+" )
     226           0 :         return new DDSumFunc(func,expr(2),expr(3));
     227             :       else
     228           0 :         return new DDDiffFunc(func,expr(2),expr(3));
     229             :     }
     230           0 :     if( expr(1) == "+" || expr(1) == "-" )
     231             :     {
     232           0 :       func = getFunction(expr(0));
     233           0 :       if( !func )
     234           0 :         throw( funcError(expr(0)) );
     235           0 :       descr = expr(0)+"("+expr(2)+expr(1)+expr(3)+")";
     236           0 :       if( expr(1) == "+" )
     237           0 :         return new DDFuncSum(func,expr(2),expr(3));
     238             :       else
     239           0 :         return new DDFuncDiff(func,expr(2),expr(3));
     240             :     }
     241             :   }
     242             : // fall through to error report
     243           0 :   if( throw_excp )
     244             :   {
     245           0 :     String err("bad DDMapper expression:");
     246           0 :     for( uInt i=0; i<nel; i++ )
     247           0 :       err += String(" ")+expr(i);
     248           0 :     throw( AipsError(err) );
     249           0 :   }
     250           0 :   return NULL;
     251           0 : }
     252             : 
     253             : 
     254             : } //# NAMESPACE CASA - END
     255             : 

Generated by: LCOV version 1.16