Changeset 459
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/SDPol.cc
r446 r459 57 57 const String& inputColumnName) 58 58 : BaseMappedArrayEngine<Float,Float> (outputColumnName, inputColumnName) 59 {} 59 { 60 setWritable(False); 61 } 60 62 61 63 … … 63 65 : BaseMappedArrayEngine<Float,Float> () 64 66 { 67 setWritable(False); 65 68 if (spec.isDefined("OUTPUTNAME") && spec.isDefined("INPUTNAME")) { 66 69 setNames (spec.asString("OUTPUTNAME"), spec.asString("INPUTNAME")); … … 95 98 String SDStokesEngine::dataManagerName() const 96 99 { 97 return sourceName();100 return virtualName(); 98 101 } 99 102 … … 101 104 { 102 105 Record spec; 103 spec.define ("OUTPUTNAME", sourceName()); // Ger uses opposite meaning for source/target104 spec.define ("INPUTNAME", targetName());106 spec.define ("OUTPUTNAME", virtualName()); 107 spec.define ("INPUTNAME", storedName()); 105 108 return spec; 106 109 } … … 148 151 throw(AipsError("This Virtual Column is not writable")); 149 152 } 150 151 152 153 153 154 154 … … 320 320 return Float(0.5)*(I-V); 321 321 } 322 }323 324 Array<Bool> SDPolUtil::stokesMask (Array<Bool> rawFlags,325 Bool doLinear)326 //327 // Generate mask for each Stokes parameter from the328 // raw flags. This is a lot of computational work and may329 // not be worth the effort.330 //331 {332 IPosition shapeIn = rawFlags.shape();333 uInt nPol = shapeIn(asap::PolAxis);334 const uInt nDim = shapeIn.nelements();335 Array<Bool> stokesFlags;336 //337 IPosition start(nDim,0);338 IPosition end(shapeIn-1);339 IPosition shapeOut = shapeIn;340 //341 if (doLinear) {342 if (nPol==1) {343 stokesFlags.resize(shapeOut);344 stokesFlags = rawFlags;345 } else if (nPol==2 || nPol==4) {346 347 // Set shape of output array348 349 if (nPol==2) {350 shapeOut(asap::PolAxis) = 1;351 } else {352 shapeOut(asap::PolAxis) = 4;353 }354 stokesFlags.resize(shapeOut);355 356 // Get reference slices and assign/compute357 358 start(asap::PolAxis) = 0;359 end(asap::PolAxis) = 0;360 Array<Bool> M1In = rawFlags(start,end);361 //362 start(asap::PolAxis) = 1;363 end(asap::PolAxis) = 1;364 Array<Bool> M2In = rawFlags(start,end);365 //366 start(asap::PolAxis) = 0;367 end(asap::PolAxis) = 0;368 Array<Bool> M1Out = stokesFlags(start,end);369 M1Out = M1In && M2In; // I370 //371 if (nPol==4) {372 start(asap::PolAxis) = 2;373 end(asap::PolAxis) = 2;374 Array<Bool> M3In = rawFlags(start,end);375 //376 start(asap::PolAxis) = 3;377 end(asap::PolAxis) = 3;378 Array<Bool> M4In = rawFlags(start,end);379 //380 start(asap::PolAxis) = 1;381 end(asap::PolAxis) = 1;382 Array<Bool> M2Out = stokesFlags(start,end);383 M2Out = M1Out; // Q384 //385 start(asap::PolAxis) = 2;386 end(asap::PolAxis) = 2;387 Array<Bool> M3Out = stokesFlags(start,end);388 M3Out = M3In; // U389 //390 start(asap::PolAxis) = 3;391 end(asap::PolAxis) = 3;392 Array<Bool> M4Out = stokesFlags(start,end);393 M4Out = M4In; // V394 }395 } else {396 throw(AipsError("Can only handle 1,2 or 4 polarizations"));397 }398 } else {399 throw (AipsError("Only implemented for Linear polarizations"));400 }401 //402 return stokesFlags;403 322 } 404 323 -
trunk/src/SDPol.h
r446 r459 35 35 #include <casa/aips.h> 36 36 #include <casa/Arrays/Array.h> 37 #include <casa/Arrays/ArrayMath.h> 38 #include <casa/Arrays/ArrayLogical.h> 37 39 #include <measures/Measures/Stokes.h> 38 40 #include <tables/Tables/BaseMappedArrayEngine.h> … … 40 42 41 43 namespace asap { 42 43 class SDPolUtil44 {45 public:46 // Convert Q and U to polarized intensity47 static casa::Array<casa::Float> polarizedIntensity (const casa::Array<casa::Float>& Q,48 const casa::Array<casa::Float>& U);49 // Convert Q and U to polarized position angle (degrees)50 static casa::Array<casa::Float> positionAngle (const casa::Array<casa::Float>& Q,51 const casa::Array<casa::Float>& U);52 // Rotate phase of Complex correlation C3+iC4 by phase (degrees)53 static void rotateXYPhase (casa::Array<casa::Float>& C3,54 casa::Array<casa::Float>& C4,55 casa::Float phase);56 57 // Get Stokes slices from the Array. Start and End should58 // already be setup to access the Array at the current cursor location59 // (beam, IF, chanells; see SDMemTable). This function will modify the asap::PolAxis60 // location to access the desired Stokes slice ("I", "Q", "U", "V")61 static casa::Array<casa::Float> getStokesSlice (casa::Array<casa::Float>& input, const casa::IPosition& start,62 const casa::IPosition& end, const casa::String& stokes);63 64 // Compute Circular polarization RR or LL from I and V65 static casa::Array<casa::Float> circularPolarizationFromStokes (casa::Array<casa::Float>& I,66 casa::Array<casa::Float>& V,67 casa::Bool doRR);68 69 // Compute Mask for STokes parameters from raw correlation masks70 // Gets output shape right (e.g. XX,YY -> I)71 static casa::Array<casa::Bool> stokesMask (casa::Array<casa::Bool> rawFlags,72 casa::Bool doLinear);73 74 // Find the Stokes type for the given polarization axis (0,1,2,3)75 // You can ask for STokes or raw correltions (linear or circular)76 static casa::Stokes::StokesTypes convertStokes(casa::Int val, casa::Bool toStokes,77 casa::Bool linear);78 };79 80 81 44 82 45 class SDStokesEngine : public casa::BaseMappedArrayEngine<casa::Float, casa::Float> … … 84 47 //# Make members of parent class known. 85 48 public: 86 using casa::BaseMappedArrayEngine<casa::Float,casa::Float>:: sourceName;49 using casa::BaseMappedArrayEngine<casa::Float,casa::Float>::virtualName; 87 50 protected: 88 using casa::BaseMappedArrayEngine<casa::Float,casa::Float>:: targetName;51 using casa::BaseMappedArrayEngine<casa::Float,casa::Float>::storedName; 89 52 using casa::BaseMappedArrayEngine<casa::Float,casa::Float>::table; 90 53 using casa::BaseMappedArrayEngine<casa::Float,casa::Float>::roColumn; … … 95 58 // correlations 96 59 SDStokesEngine (const casa::String& virtualColumnName, 97 const casa::String& sourceColumnName);60 const casa::String& sourceColumnName); 98 61 99 62 // Construct from a record specification as created by getmanagerSpec(). … … 180 143 }; 181 144 145 146 147 class SDPolUtil 148 { 149 public: 150 // Convert Q and U to linearly polarized intensity 151 static casa::Array<casa::Float> polarizedIntensity (const casa::Array<casa::Float>& Q, 152 const casa::Array<casa::Float>& U); 153 // Convert Q and U to linearly polarized position angle (degrees) 154 static casa::Array<casa::Float> positionAngle (const casa::Array<casa::Float>& Q, 155 const casa::Array<casa::Float>& U); 156 157 // Rotate phase of Complex correlation C3+iC4 by phase (degrees) 158 static void rotateXYPhase (casa::Array<casa::Float>& C3, 159 casa::Array<casa::Float>& C4, 160 casa::Float phase); 161 162 // Get Stokes slices from the Array. Start and End should 163 // already be setup to access the Array at the current cursor location 164 // (beam, IF, Pol; see SDMemTable). The desired Stokes 165 // is specfied in the string from "I", "Q", "U", "V" 166 static casa::Array<casa::Float> getStokesSlice (casa::Array<casa::Float>& input, const casa::IPosition& start, 167 const casa::IPosition& end, const casa::String& stokes); 168 169 // Compute Circular polarization RR or LL from I and V 170 static casa::Array<casa::Float> circularPolarizationFromStokes (casa::Array<casa::Float>& I, 171 casa::Array<casa::Float>& V, 172 casa::Bool doRR); 173 174 175 // Compute value for STokes parameters by combining the raw correlation values 176 // The output shape may change from the input shape according to 177 // XX or YY -> I 178 // XX,YY -> I 179 // XX,YY,R(XY),I(XY) -> I,Q,U,V 180 // Bool for mask 181 // Float for TSys 182 template <class T> 183 static casa::Array<T> stokesData (casa::Array<T>& rawData, casa::Bool doLinear); 184 185 186 // Find the Stokes type for the given polarization axis (0,1,2,3) 187 // You can ask for STokes or raw correltions (linear or circular) 188 static casa::Stokes::StokesTypes convertStokes(casa::Int val, casa::Bool toStokes, 189 casa::Bool linear); 190 191 private: 192 static casa::Array<casa::Float> andArrays (const casa::Array<casa::Float>& in1, 193 const casa::Array<casa::Float>& in2) 194 {return (in1+in2)/casa::Float(2.0);} 195 196 static casa::Array<casa::Bool> andArrays (const casa::Array<casa::Bool>& in1, 197 const casa::Array<casa::Bool>& in2) 198 {return in1&&in2;} 199 }; 200 201 202 203 204 182 205 } // namespace 183 206
Note:
See TracChangeset
for help on using the changeset viewer.