diff --git a/CEP/Calibration/BBSControl/src/Step.cc b/CEP/Calibration/BBSControl/src/Step.cc index 22077c95382a67c7c30d639668158df37f0c857c..d5f2716a1f97194c4c3b774e136276ce69cbd44e 100644 --- a/CEP/Calibration/BBSControl/src/Step.cc +++ b/CEP/Calibration/BBSControl/src/Step.cc @@ -254,8 +254,20 @@ namespace LOFAR itsModelConfig.clearGainConfig(); } - itsModelConfig.setTEC(ps.getBool(prefix+"Model.TEC.Enable", - itsModelConfig.useTEC())); + if (ps.getBool(prefix+"Model.TEC.Enable", itsModelConfig.useTEC())) { + TECConfig parentConfig = itsModelConfig.getTECConfig(); + + bool splitTEC = false; + if(itsModelConfig.useTEC()) { + splitTEC = ps.getBool(prefix+"Model.TEC.Split", + parentConfig.splitTEC()); + } else { + splitTEC = ps.getBool(prefix+"Model.TEC.Split", false); + } + itsModelConfig.setTECConfig(TECConfig(splitTEC)); + } else { + itsModelConfig.clearTECConfig(); + } itsModelConfig.setCommonRotation(ps.getBool(prefix+"Model.CommonRotation.Enable", itsModelConfig.useCommonRotation())); diff --git a/CEP/Calibration/BBSKernel/include/BBSKernel/MeasurementExprLOFARUtil.h b/CEP/Calibration/BBSKernel/include/BBSKernel/MeasurementExprLOFARUtil.h index ba5e9466c948931f2016dc0179b7535fad283f45..45b8cd2ed948f8aed955e104cd91ee30c4563ea2 100644 --- a/CEP/Calibration/BBSKernel/include/BBSKernel/MeasurementExprLOFARUtil.h +++ b/CEP/Calibration/BBSKernel/include/BBSKernel/MeasurementExprLOFARUtil.h @@ -86,7 +86,8 @@ makeGainExpr(Scope &scope, Expr<JonesMatrix>::Ptr makeTECExpr(Scope &scope, - const Station::ConstPtr &station); + const Station::ConstPtr &station, + const TECConfig &config); Expr<JonesMatrix>::Ptr makeCommonRotationExpr(Scope &scope, diff --git a/CEP/Calibration/BBSKernel/include/BBSKernel/ModelConfig.h b/CEP/Calibration/BBSKernel/include/BBSKernel/ModelConfig.h index 3664d74c6c6787a4e337a97ca057cba37da7fb44..9fefedc7b74e96916c608bf05bf4a79dabba5e0d 100644 --- a/CEP/Calibration/BBSKernel/include/BBSKernel/ModelConfig.h +++ b/CEP/Calibration/BBSKernel/include/BBSKernel/ModelConfig.h @@ -52,6 +52,19 @@ private: bool itsSplitClock; }; +// Configuration options specific to TEC. +class TECConfig +{ +public: + TECConfig(); + TECConfig(bool splitTEC); + + bool splitTEC() const; + +private: + bool itsSplitTEC; +}; + // Configuration options specific to the direction independent gain model. class GainConfig { @@ -175,7 +188,9 @@ public: void clearGainConfig(); bool useTEC() const; - void setTEC(bool value = true); + void setTECConfig(const TECConfig &config); + const TECConfig &getTECConfig() const; + void clearTECConfig(); bool useCommonRotation() const; void setCommonRotation(bool value = true); @@ -251,6 +266,7 @@ private: bool itsModelOptions[N_ModelOptions]; ClockConfig itsConfigClock; + TECConfig itsConfigTEC; GainConfig itsConfigGain; DirectionalGainConfig itsConfigDirectionalGain; ElevationCutConfig itsConfigElevationCut; diff --git a/CEP/Calibration/BBSKernel/src/MeasurementExprLOFAR.cc b/CEP/Calibration/BBSKernel/src/MeasurementExprLOFAR.cc index 503a01924da334a308fc50f33e0b5d33a11d0b9e..489acad11c92af6e3358d3120814b3f915deb483 100644 --- a/CEP/Calibration/BBSKernel/src/MeasurementExprLOFAR.cc +++ b/CEP/Calibration/BBSKernel/src/MeasurementExprLOFAR.cc @@ -319,7 +319,8 @@ void MeasurementExprLOFAR::makeForwardExpr(SourceDB &sourceDB, if(config.useTEC()) { exprDIE[i] = compose(exprDIE[i], - makeTECExpr(itsScope, instrument->station(i))); + makeTECExpr(itsScope, instrument->station(i), + config.getTECConfig())); } // Direction independent polarization rotation. @@ -439,7 +440,8 @@ void MeasurementExprLOFAR::makeInverseExpr(SourceDB &sourceDB, if(config.useTEC()) { stationExpr[i] = compose(stationExpr[i], - makeTECExpr(itsScope, instrument->station(i))); + makeTECExpr(itsScope, instrument->station(i), + config.getTECConfig())); } // Direction independent polarization rotation. diff --git a/CEP/Calibration/BBSKernel/src/MeasurementExprLOFARUtil.cc b/CEP/Calibration/BBSKernel/src/MeasurementExprLOFARUtil.cc index 992a9c52d237989b23ab98ba5cbe758743f4c6cf..9f08c6a77a61825e8dfb6f3006231a01ab1839bf 100644 --- a/CEP/Calibration/BBSKernel/src/MeasurementExprLOFARUtil.cc +++ b/CEP/Calibration/BBSKernel/src/MeasurementExprLOFARUtil.cc @@ -179,12 +179,22 @@ makeGainExpr(Scope &scope, Expr<JonesMatrix>::Ptr makeTECExpr(Scope &scope, - const Station::ConstPtr &station) + const Station::ConstPtr &station, + const TECConfig &config) { - ExprParm::Ptr tec = scope(INSTRUMENT, "TEC:" + station->name()); + if (config.splitTEC()) { + ExprParm::Ptr tec0 = scope(INSTRUMENT, "TEC:0:" + station->name()); + ExprParm::Ptr tec1 = scope(INSTRUMENT, "TEC:1:" + station->name()); - Expr<Scalar>::Ptr shift = Expr<Scalar>::Ptr(new TECU2Phase(tec)); - return Expr<JonesMatrix>::Ptr(new AsDiagonalMatrix(shift, shift)); + Expr<Scalar>::Ptr shift0 = Expr<Scalar>::Ptr(new TECU2Phase(tec0)); + Expr<Scalar>::Ptr shift1 = Expr<Scalar>::Ptr(new TECU2Phase(tec1)); + + return Expr<JonesMatrix>::Ptr(new AsDiagonalMatrix(shift0, shift1)); + } else { + ExprParm::Ptr tec = scope(INSTRUMENT, "TEC:" + station->name()); + Expr<Scalar>::Ptr shift = Expr<Scalar>::Ptr(new TECU2Phase(tec)); + return Expr<JonesMatrix>::Ptr(new AsDiagonalMatrix(shift, shift)); + } } Expr<JonesMatrix>::Ptr diff --git a/CEP/Calibration/BBSKernel/src/ModelConfig.cc b/CEP/Calibration/BBSKernel/src/ModelConfig.cc index 0f5bebd17325347328d961befa5314d3dc435252..ae79ed3c18f00b2c01089e26f9f18af457247fe9 100644 --- a/CEP/Calibration/BBSKernel/src/ModelConfig.cc +++ b/CEP/Calibration/BBSKernel/src/ModelConfig.cc @@ -50,6 +50,24 @@ bool ClockConfig::splitClock() const return itsSplitClock; } +// -------------------------------------------------------------------------- // +// - TECConfig implementation - // +// -------------------------------------------------------------------------- // +TECConfig::TECConfig() + : itsSplitTEC(false) +{ +} + +TECConfig::TECConfig(bool splitTEC) + : itsSplitTEC(splitTEC) +{ +} + +bool TECConfig::splitTEC() const +{ + return itsSplitTEC; +} + // -------------------------------------------------------------------------- // // - GainConfig implementation - // // -------------------------------------------------------------------------- // @@ -132,13 +150,15 @@ const string &BeamConfig::asString(Mode in) } BeamConfig::BeamConfig() - : itsMode(DEFAULT), + : notdef(0), + itsMode(DEFAULT), itsUseChannelFreq(false) { } BeamConfig::BeamConfig(Mode mode, bool useChannelFreq) - : itsMode(mode), + : notdef(0), + itsMode(mode), itsUseChannelFreq(useChannelFreq) { } @@ -190,13 +210,15 @@ const string &IonosphereConfig::asString(ModelType in) } IonosphereConfig::IonosphereConfig() - : itsModelType(N_ModelType), + : notdef(0), + itsModelType(N_ModelType), itsDegree(0) { } IonosphereConfig::IonosphereConfig(ModelType type, unsigned int degree = 0) - : itsModelType(type), + : notdef(0), + itsModelType(type), itsDegree(degree) { } @@ -267,6 +289,11 @@ bool ModelConfig::useTEC() const return itsModelOptions[TEC]; } +const TECConfig &ModelConfig::getTECConfig() const +{ + return itsConfigTEC; +} + bool ModelConfig::useCommonRotation() const { return itsModelOptions[COMMON_ROTATION]; @@ -369,6 +396,18 @@ void ModelConfig::clearClockConfig() itsModelOptions[CLOCK] = false; } +void ModelConfig::setTECConfig(const TECConfig &config) +{ + itsModelOptions[TEC] = true; + itsConfigTEC= config; +} + +void ModelConfig::clearTECConfig() +{ + itsConfigTEC= TECConfig(); + itsModelOptions[TEC] = false; +} + void ModelConfig::setGainConfig(const GainConfig &config) { itsModelOptions[GAIN] = true; @@ -381,11 +420,6 @@ void ModelConfig::clearGainConfig() itsConfigGain = GainConfig(); } -void ModelConfig::setTEC(bool value) -{ - itsModelOptions[TEC] = value; -} - void ModelConfig::setCommonRotation(bool value) { itsModelOptions[COMMON_ROTATION] = value; @@ -501,6 +535,13 @@ ostream &operator<<(ostream &out, const ClockConfig &obj) return out; } +ostream &operator<<(ostream &out, const TECConfig &obj) +{ + out << indent << "Split TEC: " << boolalpha << obj.splitTEC() + << noboolalpha; + return out; +} + ostream &operator<<(ostream &out, const GainConfig &obj) { out << indent << "Phasors: " << boolalpha << obj.phasors() << noboolalpha; @@ -570,6 +611,10 @@ ostream& operator<<(ostream &out, const ModelConfig &obj) out << endl << indent << "TEC enabled: " << boolalpha << obj.useTEC() << noboolalpha; + if (obj.useTEC()) { + Indent id; + out << endl << obj.getTECConfig(); + } out << endl << indent << "Common rotation enabled: " << boolalpha << obj.useCommonRotation() << noboolalpha; out << endl << indent << "Common scalar phase enabled: " << boolalpha diff --git a/CEP/Calibration/BBSKernel/src/StationExprLOFAR.cc b/CEP/Calibration/BBSKernel/src/StationExprLOFAR.cc index 6108c66b35398fbcb309ccf6ae02de372014e9bd..70cc0a141c8270db29e849f4f79f7331cd851644 100644 --- a/CEP/Calibration/BBSKernel/src/StationExprLOFAR.cc +++ b/CEP/Calibration/BBSKernel/src/StationExprLOFAR.cc @@ -97,7 +97,8 @@ void StationExprLOFAR::initialize(SourceDB &sourceDB, const BufferMap &buffers, if(config.useTEC()) { itsExpr[i] = compose(itsExpr[i], - makeTECExpr(itsScope, instrument->station(i))); + makeTECExpr(itsScope, instrument->station(i), + config.getTECConfig())); } // Direction independent polarization rotation. diff --git a/CEP/DP3/DPPP/src/ApplyCal.cc b/CEP/DP3/DPPP/src/ApplyCal.cc index 5ce4b9e6e3dccef537e2f325fc0f26724dd86ea9..24c2a593298d7d37c87a3052b374e9a001148e9c 100644 --- a/CEP/DP3/DPPP/src/ApplyCal.cc +++ b/CEP/DP3/DPPP/src/ApplyCal.cc @@ -146,7 +146,14 @@ namespace LOFAR { itsParmExprs.push_back("Gain:1:1:Imag"); } } else if (itsCorrectType == "tec") { - itsParmExprs.push_back("TEC"); + if (itsParmDB->getNames("TEC:0:*").empty() && + itsParmDB->getDefNames("TEC:0:*").empty() ) { + itsParmExprs.push_back("TEC"); + } + else { + itsParmExprs.push_back("TEC:0"); + itsParmExprs.push_back("TEC:1"); + } } else if (itsCorrectType == "clock") { if (itsParmDB->getNames("Clock:0:*").empty() && itsParmDB->getDefNames("Clock:0:*").empty() ) { @@ -364,8 +371,14 @@ namespace LOFAR { else if (itsCorrectType=="tec") { itsParms[0][ant][tf]=polar(1., parmvalues[0][ant][tf] * -8.44797245e9 / freq); - itsParms[1][ant][tf]=polar(1., - parmvalues[0][ant][tf] * -8.44797245e9 / freq); + if (itsParmExprs.size() == 1) { // No TEC:0, only TEC: + itsParms[1][ant][tf]=polar(1., + parmvalues[0][ant][tf] * -8.44797245e9 / freq); + } + else { // TEC:0 and TEC:1 + itsParms[1][ant][tf]=polar(1., + parmvalues[1][ant][tf] * -8.44797245e9 / freq); + } } else if (itsCorrectType=="clock") { itsParms[0][ant][tf]=polar(1.,