diff --git a/Reconstruction/Jet/JetCalibTools/JetCalibTools/CalibrationMethods/JMSCorrection.h b/Reconstruction/Jet/JetCalibTools/JetCalibTools/CalibrationMethods/JMSCorrection.h index c365c996d53b74e285d9a27660c0bb971ffe4a01..c8d0d30e19fead273f882179958861ed7f448b8e 100644 --- a/Reconstruction/Jet/JetCalibTools/JetCalibTools/CalibrationMethods/JMSCorrection.h +++ b/Reconstruction/Jet/JetCalibTools/JetCalibTools/CalibrationMethods/JMSCorrection.h @@ -75,6 +75,7 @@ class JMSCorrection bool m_pTfixed; // false: pT will be corrected (large-R), if true: the energy will be corrected and pT will be fixed (small-R) bool m_combination; // Mass Combination of calo mass with track-assisted mass + bool m_useCorrelatedWeights; //Private members set during initialization VecTH2F m_respFactorsMass; diff --git a/Reconstruction/Jet/JetCalibTools/JetCalibTools/JetCalibrationTool.h b/Reconstruction/Jet/JetCalibTools/JetCalibTools/JetCalibrationTool.h index a32f8be5faaa37baf6aa540ee4ab293c2dad078b..82bcc14d3842119edc2f487ed3d99fccf82c569d 100644 --- a/Reconstruction/Jet/JetCalibTools/JetCalibTools/JetCalibrationTool.h +++ b/Reconstruction/Jet/JetCalibTools/JetCalibTools/JetCalibrationTool.h @@ -52,17 +52,6 @@ public: /// Constructor with parameters: JetCalibrationTool(const std::string& name); - JetCalibrationTool(const std::string& name, - TString jetAlgo, - TString config = "", - TString calibSeq = "JetArea_Offset_AbsoluteEtaJES_Insitu", - bool isData = true, - bool mass = false, - TString rhoKey = "auto", - TString dir = "JetCalibTools/CalibrationConfigs/", - TString eInfoName = "EventInfo"); - - /// Destructor: virtual ~JetCalibrationTool(); @@ -106,12 +95,18 @@ private: bool m_devMode; bool m_isData; bool m_mass; + bool m_timeDependentCalib; + bool m_originCorrectedClusters; std::string m_rhoKey; std::string m_dir; std::string m_eInfoName; + std::vector<TString> m_timeDependentInsituConfigs; + std::vector<double> m_runBins; + bool m_doSetDetectorEta; //TEnv to hold the global text config TEnv * m_globalConfig; + std::vector<TEnv*> m_globalTimeDependentConfigs; //Bools/enums to avoid string comparisons at run time jetScale m_jetScale; @@ -126,6 +121,7 @@ private: EtaJESCorrection * m_etaJESCorr; GlobalSequentialCorrection * m_globalSequentialCorr; InsituDataCorrection * m_insituDataCorr; + std::vector<JetCalibrationToolBase*> m_insituTimeDependentCorr; JMSCorrection * m_jetMassCorr; }; diff --git a/Reconstruction/Jet/JetCalibTools/Root/JMSCorrection.cxx b/Reconstruction/Jet/JetCalibTools/Root/JMSCorrection.cxx index 48f337aa32a23e5ab6180ec689e500edb0408c9f..d92e888bdf2fba61a4faf5f0636192bfa84d7cd6 100644 --- a/Reconstruction/Jet/JetCalibTools/Root/JMSCorrection.cxx +++ b/Reconstruction/Jet/JetCalibTools/Root/JMSCorrection.cxx @@ -93,6 +93,7 @@ StatusCode JMSCorrection::initializeTool(const std::string&) { // Shoulb be applied the mass combination? m_combination = m_config->GetValue("Combination",false); // true: turn on combination of calo mass with track-assisted mass + m_useCorrelatedWeights = m_config->GetValue("UseCorrelatedWeights",false); // true: turn on combination of calo mass with track-assisted mass // Track-Assisted Jet Mass correction m_trackAssistedJetMassCorr = m_config->GetValue("TrackAssistedJetMassCorr",false); @@ -428,11 +429,13 @@ StatusCode JMSCorrection::calibrateImpl(xAOD::Jet& jet, JetEventInfo&) const { calibP4_ta.SetPxPyPzE( TLVjet_ta.Px(), TLVjet_ta.Py(), TLVjet_ta.Pz(), TLVjet_ta.E() ); jet.setAttribute<xAOD::JetFourMom_t>("JetJMSScaleMomentumTA",calibP4_ta); - float m_comb = m_calo; + float m_comb = m_calo; // combined mass double pT_comb = pT_calo; // if one of the mass is null, use the other one - if( (m_comb==0) || (mass_corr==0) ) { m_comb = mass_corr+m_comb; } + if( (m_comb==0) || (mass_corr==0) ) { + m_comb = mass_corr+m_comb; + } else { // Determine mass combination eta bin to use int etabin=-99; @@ -455,18 +458,21 @@ StatusCode JMSCorrection::calibrateImpl(xAOD::Jet& jet, JetEventInfo&) const { } const double relCalo = getRelCalo( pT_calo/m_GeV, m_calo/pT_calo, etabin ); const double relTA = getRelTA( pT_calo/m_GeV, m_ta/pT_calo, etabin ); - const double rho = getRho( pT_calo/m_GeV, m_calo/pT_calo, etabin); + const double rho = ( m_useCorrelatedWeights ? getRho( pT_calo/m_GeV, m_calo/pT_calo, etabin ) : 0); // Watch for division by zero - if (relCalo*relCalo + relTA*relTA - 2 * rho* relCalo * relTA == 0){ - ATH_MSG_FATAL("Encountered division by zero when calculating mass combination weight"); + if(m_useCorrelatedWeights && (relCalo*relCalo + relTA*relTA - 2 * rho* relCalo * relTA == 0)){ + ATH_MSG_ERROR("Encountered division by zero when calculating mass combination weight using correlated weights"); return StatusCode::FAILURE; } const double Weight = ( relTA*relTA - rho *relCalo*relTA ) / ( relCalo*relCalo + relTA*relTA - 2 * rho* relCalo * relTA ); - m_comb = ( m_calo * Weight ) + ( m_ta * ( 1 - Weight) ); - if(!m_pTfixed) pT_comb = sqrt(jetStartP4.e()*jetStartP4.e()-m_comb*m_comb)/cosh( jetStartP4.eta() ); + m_comb = ( m_calo * Weight ) + ( m_ta * ( 1 - Weight) ); + // Protection + if(m_comb>jetStartP4.e()) m_comb = m_calo; + else if(!m_pTfixed) pT_comb = sqrt(jetStartP4.e()*jetStartP4.e()-m_comb*m_comb)/cosh( jetStartP4.eta() ); } } + TLorentzVector TLVjet; TLVjet.SetPtEtaPhiM( pT_comb, jetStartP4.eta(), jetStartP4.phi(), m_comb ); calibP4.SetPxPyPzE( TLVjet.Px(), TLVjet.Py(), TLVjet.Pz(), TLVjet.E() ); diff --git a/Reconstruction/Jet/JetCalibTools/Root/JetCalibrationTool.cxx b/Reconstruction/Jet/JetCalibTools/Root/JetCalibrationTool.cxx index 8c022449ed14fe3add46fef391533a5f3c28586a..bfbd50d8e5ad3334d6c86dedf3ff4af64f6b44cd 100644 --- a/Reconstruction/Jet/JetCalibTools/Root/JetCalibrationTool.cxx +++ b/Reconstruction/Jet/JetCalibTools/Root/JetCalibrationTool.cxx @@ -17,27 +17,9 @@ // Constructors //////////////// -//Default constructor -- likely to be used by Athena based analyses -JetCalibrationTool::JetCalibrationTool() - : asg::AsgTool( "JetCalibrationTool::JetCalibrationTool" ), JetCalibrationToolBase::JetCalibrationToolBase(), - m_jetAlgo(""), m_config(""), m_calibSeq(""), m_calibAreaTag(""), m_devMode(false), m_isData(true), m_mass(false), m_rhoKey(""), m_dir(""), m_eInfoName(""), m_globalConfig(NULL), - m_doJetArea(true), m_doResidual(true), m_doOrigin(true), m_doGSC(true), - m_jetPileupCorr(NULL), m_etaJESCorr(NULL), m_globalSequentialCorr(NULL), m_insituDataCorr(NULL), m_jetMassCorr(NULL) -{ - - declareProperty( "JetCollection", m_jetAlgo = "AntiKt4LCTopo" ); - declareProperty( "RhoKey", m_rhoKey = "auto" ); - declareProperty( "ConfigFile", m_config = "" ); - declareProperty( "CalibSequence", m_calibSeq = "JetArea_Residual_AbsoluteEtaJES_Insitu" ); - declareProperty( "IsData", m_isData = true ); - declareProperty( "ConfigDir", m_dir = "JetCalibTools/CalibrationConfigs/" ); - declareProperty( "EventInfoName", m_eInfoName = "EventInfo" ); - -} - JetCalibrationTool::JetCalibrationTool(const std::string& name) : asg::AsgTool( name ), JetCalibrationToolBase::JetCalibrationToolBase( name ), - m_jetAlgo(""), m_config(""), m_calibSeq(""), m_calibAreaTag(""), m_devMode(false), m_isData(true), m_mass(false), m_rhoKey("auto"), m_dir(""), m_eInfoName(""), m_globalConfig(NULL), + m_jetAlgo(""), m_config(""), m_calibSeq(""), m_calibAreaTag(""), m_devMode(false), m_isData(true), m_mass(false), m_timeDependentCalib(false), m_rhoKey("auto"), m_dir(""), m_eInfoName(""), m_globalConfig(NULL), m_doJetArea(true), m_doResidual(true), m_doOrigin(true), m_doGSC(true), m_jetPileupCorr(NULL), m_etaJESCorr(NULL), m_globalSequentialCorr(NULL), m_insituDataCorr(NULL), m_jetMassCorr(NULL) { @@ -49,16 +31,7 @@ JetCalibrationTool::JetCalibrationTool(const std::string& name) declareProperty( "IsData", m_isData = true ); declareProperty( "ConfigDir", m_dir = "JetCalibTools/CalibrationConfigs/" ); declareProperty( "EventInfoName", m_eInfoName = "EventInfo"); - -} - -//Contructor for Root based analyses -JetCalibrationTool::JetCalibrationTool(const std::string& name, TString jetAlgo, TString config, TString calibSeq, bool isData, bool mass, TString rhoKey, TString dir, TString eInfoName) - : asg::AsgTool( name ), - m_jetAlgo(jetAlgo), m_config(config), m_calibSeq(calibSeq), m_calibAreaTag(""), m_devMode(false), m_isData(isData), m_mass(mass), m_rhoKey(rhoKey), m_dir(dir), m_eInfoName(eInfoName), m_globalConfig(NULL), - m_doJetArea(true), m_doResidual(true), m_doOrigin(true), m_doGSC(true), - m_jetPileupCorr(NULL), m_etaJESCorr(NULL), m_globalSequentialCorr(NULL), m_insituDataCorr(NULL), m_jetMassCorr(NULL) -{ + declareProperty( "DoSetDetectorEta", m_doSetDetectorEta=true); } @@ -110,7 +83,7 @@ StatusCode JetCalibrationTool::initializeTool(const std::string& name) { } if ( config.EqualTo("") || !config ) { ATH_MSG_FATAL("No configuration file specified."); return StatusCode::FAILURE; } - m_calibAreaTag.insert(0,"CalibArea-00-04-71/"); // Hard-coding the CalibArea tag + m_calibAreaTag.insert(0,"CalibArea-00-04-73/"); // Hard-coding the CalibArea tag if(calibSeq.Contains("DEV")){ m_devMode = true; ATH_MSG_WARNING("Dev Mode is ON!!! \n\n"); @@ -141,15 +114,24 @@ StatusCode JetCalibrationTool::initializeTool(const std::string& name) { //Set the default units to MeV, user can override by calling setUnitsGeV(true) setUnitsGeV(false); + // Origin-corrected clusters? (true for rel21 and/or 2.5.X) + m_originCorrectedClusters = m_globalConfig->GetValue("OriginCorrectedClusters",false); + //Make sure the residual correction is turned on if requested, protect against applying it without the jet area subtraction if ( !calibSeq.Contains("JetArea") && !calibSeq.Contains("Residual") ) { m_doJetArea = false; m_doResidual = false; } else if ( calibSeq.Contains("JetArea") ) { if ( m_rhoKey.compare("auto") == 0 ) { - if ( m_jetScale == EM ) m_rhoKey = "Kt4EMTopoEventShape"; - else if ( m_jetScale == LC ) m_rhoKey = "Kt4LCTopoEventShape"; - else if ( m_jetScale == PFLOW ) m_rhoKey = "Kt4EMPFlowEventShape"; + if(!m_originCorrectedClusters){ + if ( m_jetScale == EM ) m_rhoKey = "Kt4EMTopoEventShape"; + else if ( m_jetScale == LC ) m_rhoKey = "Kt4LCTopoEventShape"; + else if ( m_jetScale == PFLOW ) m_rhoKey = "Kt4EMPFlowEventShape"; + } else{ + if ( m_jetScale == EM ) m_rhoKey = "Kt4EMTopoOriginEventShape"; + else if ( m_jetScale == LC ) m_rhoKey = "Kt4LCTopoOriginEventShape"; + else if ( m_jetScale == PFLOW ) m_rhoKey = "Kt4EMPFlowEventShape"; + } } if ( !calibSeq.Contains("Residual") ) m_doResidual = false; } else if ( !calibSeq.Contains("JetArea") && calibSeq.Contains("Residual") ) { @@ -167,6 +149,30 @@ StatusCode JetCalibrationTool::initializeTool(const std::string& name) { return StatusCode::FAILURE; } + // Time-Dependent Insitu Calibration + m_timeDependentCalib = m_globalConfig->GetValue("TimeDependentInsituCalibration",false); + if(m_timeDependentCalib){ // Read Insitu Configs + m_timeDependentInsituConfigs = JetCalibUtils::Vectorize( m_globalConfig->GetValue("InsituTimeDependentConfigs","") ); + if(m_timeDependentInsituConfigs.size()==0) ATH_MSG_ERROR("Please check there are at least two insitu configs"); + m_runBins = JetCalibUtils::VectorizeD( m_globalConfig->GetValue("InsituRunBins","") ); + if(m_runBins.size()!=m_timeDependentInsituConfigs.size()+1) ATH_MSG_ERROR("Please check the insitu run bins"); + for(unsigned int i=0;i<m_timeDependentInsituConfigs.size();++i){ + //InsituDataCorrection *insituTemp = NULL; + //m_insituTimeDependentCorr.push_back(insituTemp); + + std::string configPath_insitu = dir+m_timeDependentInsituConfigs.at(i).Data(); // Full path + TString fn_insitu = PathResolverFindCalibFile(configPath_insitu); + + ATH_MSG_INFO("Reading time-dependent insitu settings from: " << m_timeDependentInsituConfigs.at(i)); + ATH_MSG_INFO("resolved in: " << fn_insitu); + + TEnv *m_globalConfig_insitu = new TEnv(); + int status = m_globalConfig_insitu->ReadFile(fn_insitu ,EEnvLevel(0)); + if (status!=0) { ATH_MSG_FATAL("Cannot read config file " << fn_insitu ); return StatusCode::FAILURE; } + m_globalTimeDependentConfigs.push_back(m_globalConfig_insitu); + } + } + //Loop over the request calib sequence //Initialize derived classes for applying the requested calibrations and add them to a vector std::vector<TString> vecCalibSeq = JetCalibUtils::Vectorize(calibSeq,"_"); @@ -253,16 +259,33 @@ StatusCode JetCalibrationTool::getCalibClass(const std::string&name, TString cal return StatusCode::SUCCESS; } } else if ( calibration.EqualTo("Insitu") ) { - ATH_MSG_INFO("Initializing Insitu correction."); - suffix="_Insitu"; - if(m_devMode) suffix+="_DEV"; - m_insituDataCorr = new InsituDataCorrection(name+suffix,m_globalConfig,jetAlgo,calibAreaTag,m_devMode); - m_insituDataCorr->msg().setLevel( this->msg().level() ); - if ( m_insituDataCorr->initializeTool(name+suffix).isFailure() ) { - ATH_MSG_FATAL("Couldn't initialize the In-situ data correction. Aborting"); - return StatusCode::FAILURE; - } else { - m_calibClasses.push_back(m_insituDataCorr); + if(!m_timeDependentCalib){ + ATH_MSG_INFO("Initializing Insitu correction."); + suffix="_Insitu"; + if(m_devMode) suffix+="_DEV"; + m_insituDataCorr = new InsituDataCorrection(name+suffix,m_globalConfig,jetAlgo,calibAreaTag,m_devMode); + m_insituDataCorr->msg().setLevel( this->msg().level() ); + if ( m_insituDataCorr->initializeTool(name+suffix).isFailure() ) { + ATH_MSG_FATAL("Couldn't initialize the In-situ data correction. Aborting"); + return StatusCode::FAILURE; + } else { + m_calibClasses.push_back(m_insituDataCorr); + return StatusCode::SUCCESS; + } + } else{ + ATH_MSG_INFO("Initializing Time-Dependent Insitu Corrections"); + for(unsigned int i=0;i<m_timeDependentInsituConfigs.size();++i){ + suffix="_Insitu"; suffix += "_"; suffix += std::to_string(i); + if(m_devMode) suffix+="_DEV"; + InsituDataCorrection *m_insituTimeDependentCorr_Tmp = new InsituDataCorrection(name+suffix,m_globalTimeDependentConfigs.at(i),jetAlgo,calibAreaTag,m_devMode); + m_insituTimeDependentCorr_Tmp->msg().setLevel( this->msg().level() ); + if ( m_insituTimeDependentCorr_Tmp->initializeTool(name+suffix).isFailure() ) { + ATH_MSG_FATAL("Couldn't initialize the In-situ data correction. Aborting"); + return StatusCode::FAILURE; + } else { + m_insituTimeDependentCorr.push_back(m_insituTimeDependentCorr_Tmp); + } + } return StatusCode::SUCCESS; } } @@ -494,9 +517,24 @@ StatusCode JetCalibrationTool::calibrateImpl(xAOD::Jet& jet, JetEventInfo& jetEv jet.setAttribute<int>("PileupCorrected",false); ATH_MSG_VERBOSE("Calibrating jet " << jet.index()); - xAOD::JetFourMom_t jetconstitP4 = jet.getAttribute<xAOD::JetFourMom_t>("JetConstitScaleMomentum"); - jet.setAttribute<float>("DetectorEta",jetconstitP4.eta()); //saving constituent scale eta for later use + if(m_doSetDetectorEta) { + xAOD::JetFourMom_t jetconstitP4 = jet.getAttribute<xAOD::JetFourMom_t>("JetConstitScaleMomentum"); + jet.setAttribute<float>("DetectorEta",jetconstitP4.eta()); //saving constituent scale eta for later use + } for (unsigned int i=0; i<m_calibClasses.size(); ++i) //Loop over requested calibations ATH_CHECK ( m_calibClasses[i]->calibrateImpl(jet,jetEventInfo) ); + TString CalibSeq = m_calibSeq; + if(CalibSeq.Contains("Insitu") && m_timeDependentCalib){ // Insitu Time-Dependent Correction + for(unsigned int i=0;i<m_timeDependentInsituConfigs.size();++i){ + // Retrive EventInfo container + const xAOD::EventInfo* eventInfo(nullptr); + if( evtStore()->retrieve(eventInfo,"EventInfo").isFailure() || !eventInfo ) { + ATH_MSG_ERROR(" JetCalibrationTool::calibrateImpl : Failed to retrieve EventInfo."); + } + // Run Number Dependent Correction + double runNumber = eventInfo->runNumber(); + if(runNumber>m_runBins.at(i) && runNumber<=m_runBins.at(i+1)){ ATH_CHECK ( m_insituTimeDependentCorr.at(i)->calibrateImpl(jet,jetEventInfo) );} + } + } return StatusCode::SUCCESS; }