Jones.h
Go to the documentation of this file.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
00028 #ifndef SYNTHESIS_JONES_H
00029 #define SYNTHESIS_JONES_H
00030
00031 #include <casa/aips.h>
00032 #include <casa/BasicSL/Complex.h>
00033 #include <casa/iostream.h>
00034 #include <casa/Exceptions/Error.h>
00035
00036 #include <synthesis/MeasurementComponents/VisVector.h>
00037
00038 namespace casa {
00039
00040 class Jones {
00041
00042 public:
00043
00044 enum JonesType{General=4,GenLinear=3,Diagonal=2,Scalar=1};
00045
00046
00047 Jones();
00048
00049
00050 virtual ~Jones() {};
00051
00052
00053 inline virtual JonesType type() const { return Jones::General; };
00054 inline virtual Int typesize() const { return 4; };
00055
00056
00057
00058
00059
00060 inline void setScalarData(Bool scalardata) const { scalardata_=scalardata; };
00061
00062
00063 inline void sync(Complex& mat) { j0_=&mat; origin(); };
00064 inline void sync(Complex& mat, Bool& ok) { j0_=&mat; ok0_=&ok; origin(); };
00065
00066
00067 inline void origin() {j_=j0_; ok_=ok0_;};
00068
00069
00070 inline void operator++() { j_+=typesize(); if (ok_) ok_+=typesize();};
00071 inline void operator++(int) { j_+=typesize(); if (ok_) ok_+=typesize();};
00072
00073
00074 inline void advance(const Int& step) { j_+=(step*typesize()); if (ok_) ok_+=(step*typesize());};
00075
00076
00077 virtual void invert();
00078
00079
00080
00081 virtual void setMatByOk();
00082
00083
00084 virtual void operator*=(const Jones& other);
00085
00086
00087 virtual void applyRight(VisVector& v) const;
00088 virtual void applyRight(VisVector& v, Bool& vflag) const;
00089
00090
00091 virtual void applyLeft(VisVector& v) const;
00092 virtual void applyLeft(VisVector& v, Bool& vflag) const;
00093
00094
00095 virtual void applyFlag(Bool& vflag) const;
00096 virtual void flagRight(VisVector& v) const;
00097 virtual void flagLeft(VisVector& v) const;
00098
00099
00100 friend ostream& operator<<(ostream& os, const Jones& mat);
00101
00102
00103 friend class Mueller;
00104 friend class MuellerDiag;
00105 friend class MuellerDiag2;
00106 friend class MuellerScal;
00107
00108 friend class JonesDiag;
00109 friend class JonesScal;
00110
00111 protected:
00112
00113
00114 Jones(const Jones& mat);
00115
00116
00117 Complex *j0_;
00118 Bool *ok0_;
00119
00120
00121 Complex *j_, *ji_;
00122 Bool *ok_, *oki_;
00123
00124
00125 const Complex cOne_,cZero_;
00126
00127
00128 mutable Bool scalardata_;
00129
00130 private:
00131
00132
00133 virtual void zero();
00134
00135
00136 VisVector vtmp_;
00137
00138 };
00139
00140
00141 class JonesGenLin : public Jones {
00142
00143 public:
00144
00145
00146 JonesGenLin();
00147
00148
00149 virtual ~JonesGenLin() {};
00150
00151
00152 inline virtual JonesType type() const { return Jones::GenLinear; };
00153 inline virtual Int typesize() const { return 2; };
00154
00155
00156 virtual void invert();
00157
00158
00159
00160 virtual void setMatByOk();
00161
00162
00163 virtual void operator*=(const Jones& other);
00164
00165
00166 virtual void applyRight(VisVector& v) const;
00167 virtual void applyRight(VisVector& v, Bool& vflag) const;
00168
00169
00170 virtual void applyLeft(VisVector& v) const;
00171 virtual void applyLeft(VisVector& v, Bool& vflag) const;
00172
00173
00174 virtual void applyFlag(Bool& vflag) const;
00175 virtual void flagRight(VisVector& v) const;
00176 virtual void flagLeft(VisVector& v) const;
00177
00178
00179 friend class MuellerDiag;
00180 friend class MuellerDiag2;
00181
00182 protected:
00183
00184
00185 JonesGenLin(const JonesGenLin& mat);
00186
00187 private:
00188
00189
00190 virtual void zero();
00191
00192 };
00193
00194
00195 class JonesDiag : public Jones {
00196
00197 public:
00198
00199
00200 JonesDiag();
00201
00202
00203 virtual ~JonesDiag() {};
00204
00205
00206 inline virtual JonesType type() const { return Jones::Diagonal; };
00207 inline virtual Int typesize() const { return 2; };
00208
00209
00210 virtual void invert();
00211
00212
00213
00214 virtual void setMatByOk();
00215
00216
00217 virtual void operator*=(const Jones& other);
00218
00219
00220 virtual void applyRight(VisVector& v) const;
00221 virtual void applyRight(VisVector& v, Bool& vflag) const;
00222
00223
00224 virtual void applyLeft(VisVector& v) const;
00225 virtual void applyLeft(VisVector& v, Bool& vflag) const;
00226
00227
00228 virtual void applyFlag(Bool& vflag) const;
00229 virtual void flagRight(VisVector& v) const;
00230 virtual void flagLeft(VisVector& v) const;
00231
00232
00233 friend class MuellerDiag;
00234 friend class MuellerDiag2;
00235
00236 protected:
00237
00238
00239 JonesDiag(const JonesDiag& mat);
00240
00241 private:
00242
00243
00244 virtual void zero();
00245
00246 };
00247
00248
00249 class JonesScal : public JonesDiag {
00250
00251 public:
00252
00253
00254 JonesScal();
00255
00256
00257 virtual ~JonesScal() {};
00258
00259
00260 inline virtual JonesType type() const { return Jones::Scalar; };
00261 inline virtual Int typesize() const { return 1; };
00262
00263
00264 virtual void invert();
00265
00266
00267
00268 virtual void setMatByOk();
00269
00270
00271 virtual void operator*=(const Jones& other);
00272
00273
00274 virtual void applyRight(VisVector& v) const;
00275 virtual void applyRight(VisVector& v, Bool& vflag) const;
00276
00277
00278 virtual void applyLeft(VisVector& v) const;
00279 virtual void applyLeft(VisVector& v, Bool& vflag) const;
00280
00281
00282 virtual void applyFlag(Bool& vflag) const;
00283 virtual void flagRight(VisVector& v) const;
00284 virtual void flagLeft(VisVector& v) const { flagRight(v); };
00285
00286
00287 friend class MuellerScal;
00288
00289 protected:
00290
00291
00292 JonesScal(const JonesScal& mat);
00293
00294 private:
00295
00296
00297 virtual void zero();
00298
00299 };
00300
00301
00302
00303
00304
00305 Jones* createJones(const Jones::JonesType& jtype);
00306
00307
00308 void apply(const Jones& j1, VisVector& v, const Jones& j2);
00309 void apply(const Jones& j1, VisVector& v, const Jones& j2, Bool& vflag);
00310
00311
00312 Jones::JonesType jonesType(const Int& n);
00313
00314
00315 inline Int jonesNPar(const Jones::JonesType& jtype) {
00316 switch (jtype) {
00317 case Jones::General:
00318 return 4;
00319 break;
00320 case Jones::GenLinear:
00321 case Jones::Diagonal:
00322 return 2;
00323 break;
00324 case Jones::Scalar:
00325 return 1;
00326 break;
00327 }
00328
00329 return 0;
00330 }
00331
00332
00333 }
00334
00335 #endif
00336
00337