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 #ifndef FLAGGING_DDMAPPER_H
00028 #define FLAGGING_DDMAPPER_H
00029
00030 #include <casa/Arrays/Vector.h>
00031 #include <casa/Arrays/Cube.h>
00032 #include <casa/Exceptions/Error.h>
00033 #include <measures/Measures/Stokes.h>
00034
00035 namespace casa {
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 class DDMapper
00063 {
00064 protected:
00065 Bool valid;
00066 uShort corrmask;
00067
00068 public:
00069 DDMapper () { valid=False; }
00070 virtual ~DDMapper () {};
00071
00072
00073
00074 virtual Bool reset ( const Vector<Int> &corr ) =0;
00075
00076
00077
00078 virtual Float map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const =0;
00079
00080
00081
00082 uShort corrMask () const { return corrmask; }
00083
00084
00085 Bool masked (uInt icorr) const { return corrmask&(1<<icorr) != 0; }
00086
00087
00088 Bool isValid () { return valid; }
00089 };
00090
00091
00092
00093
00094
00095 class DDDummy : public DDMapper
00096 {
00097 public:
00098 DDDummy ();
00099 ~DDDummy ();
00100
00101 virtual void puke () const
00102 { throw(AipsError("Uninitialized DDMapper used")); }
00103
00104 virtual Bool reset ( const Vector<Int> & )
00105 { puke(); return False; }
00106 virtual Float map ( const Cube<Complex> &,uInt,uInt ) const
00107 { puke(); return 0.; }
00108
00109 };
00110
00111
00112
00113
00114
00115 class DDFunc : public DDMapper
00116 {
00117 public:
00118 typedef Float (*FuncSignature)(const Complex &);
00119
00120 DDFunc ( FuncSignature fsig,const String &corr );
00121 ~DDFunc() {};
00122
00123 virtual Bool reset ( const Vector<Int> &corr );
00124 virtual Float map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const;
00125
00126
00127
00128 static Float real (const Complex&);
00129 static Float imag (const Complex&);
00130
00131
00132
00133 static FuncSignature getFunction( const String &name );
00134
00135
00136
00137
00138
00139
00140
00141
00142 static DDMapper * getMapper ( String &desc,const Vector<String> &expr,Bool throw_excp=False );
00143
00144 protected:
00145 Int icorr;
00146 Stokes::StokesTypes corrtype;
00147 FuncSignature func;
00148 };
00149
00150
00151
00152
00153
00154 class DDSumFunc : public DDFunc
00155 {
00156 public:
00157 DDSumFunc ( FuncSignature fsig,const String &corr1,const String &corr2 );
00158 virtual ~DDSumFunc() {};
00159
00160 virtual Bool reset ( const Vector<Int> &corr );
00161 virtual Float map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const;
00162
00163 protected:
00164 Int icorr2;
00165 Stokes::StokesTypes corrtype2;
00166 };
00167
00168
00169
00170
00171
00172 class DDFuncSum : public DDSumFunc
00173 {
00174 public:
00175 DDFuncSum ( FuncSignature fsig,const String &corr1,const String &corr2 );
00176 virtual ~DDFuncSum() {};
00177
00178 virtual Float map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const;
00179 };
00180
00181
00182
00183
00184
00185 class DDFuncDiff : public DDSumFunc
00186 {
00187 public:
00188 DDFuncDiff ( FuncSignature fsig,const String &corr1,const String &corr2 );
00189 virtual ~DDFuncDiff() {};
00190
00191 virtual Float map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const;
00192 };
00193
00194
00195
00196
00197
00198 class DDDiffFunc : public DDSumFunc
00199 {
00200 public:
00201 DDDiffFunc ( FuncSignature fsig,const String &corr1,const String &corr2 );
00202 virtual ~DDDiffFunc() {};
00203
00204 virtual Float map ( const Cube<Complex> &vis,uInt ich,uInt irow ) const;
00205 };
00206
00207
00208 Vector<String> splitExpression( const Vector<String> &expr0 );
00209
00210
00211 }
00212
00213 #endif