diff --git a/CEP/DP3/DPPP/src/ApplyCal.cc b/CEP/DP3/DPPP/src/ApplyCal.cc index 955aeb5d75608dc900aaa167e29bfeb2541daab2..9cc81ef077cafb9c4104ec0c25101d74c5ce4537 100644 --- a/CEP/DP3/DPPP/src/ApplyCal.cc +++ b/CEP/DP3/DPPP/src/ApplyCal.cc @@ -175,6 +175,8 @@ namespace LOFAR { itsParmExprs.push_back("CommonRotationAngle"); } else if (itsCorrectType == "commonscalarphase") { itsParmExprs.push_back("CommonScalarPhase"); + } else if (itsCorrectType == "rotationmeasure") { + itsParmExprs.push_back("RotationMeasure"); } else { THROW (Exception, "Correction type " + itsCorrectType + @@ -399,10 +401,30 @@ namespace LOFAR { } } else if (itsCorrectType=="commonrotationangle") { - itsParms[0][ant][tf] = cos(parmvalues[0][ant][tf]); - itsParms[1][ant][tf] = -sin(parmvalues[0][ant][tf]); - itsParms[2][ant][tf] = sin(parmvalues[0][ant][tf]); - itsParms[3][ant][tf] = cos(parmvalues[0][ant][tf]); + double phi=parmvalues[0][ant][tf]; + if (itsInvert) { + phi = -phi; + } + double sinv=sin(phi); + double cosv=cos(phi); + itsParms[0][ant][tf] = cosv; + itsParms[1][ant][tf] = -sinv; + itsParms[2][ant][tf] = sinv; + itsParms[3][ant][tf] = cosv; + } + else if (itsCorrectType=="rotationmeasure") { + double lambda2 = casa::C::c / freq; + lambda2 *= lambda2; + double chi = parmvalues[0][ant][tf] * lambda2; + if (itsInvert) { + chi = -chi; + } + double sinv = sin(parmvalues[0][ant][tf] * chi); + double cosv = cos(parmvalues[0][ant][tf] * chi); + itsParms[0][ant][tf] = cosv; + itsParms[1][ant][tf] = -sinv; + itsParms[2][ant][tf] = sinv; + itsParms[3][ant][tf] = cosv; } else if (itsCorrectType=="commonscalarphase") { itsParms[0][ant][tf] = polar(1., parmvalues[0][ant][tf]); @@ -410,6 +432,7 @@ namespace LOFAR { } // Invert diagonal corrections (not fulljones and commonrotationangle) + // For fulljones it will be handled in applyFull if (itsInvert && itsParms.size()==2) { itsParms[0][ant][tf] = 1./itsParms[0][ant][tf]; itsParms[1][ant][tf] = 1./itsParms[1][ant][tf]; @@ -494,7 +517,7 @@ namespace LOFAR { gainB[3] = itsParms[3][antB][timeFreqOffset]; DComplex gainAxvis[4]; - if (itsInvert) { + if (itsInvert && itsCorrectType=="fulljones") { invert(gainA,itsSigmaMMSE); invert(gainB,itsSigmaMMSE); }