diff --git a/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/InDetTrackSystematicsTools/InDetTrackSmearingTool.h b/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/InDetTrackSystematicsTools/InDetTrackSmearingTool.h index e9b231a4f35446e549e55b039c4dafb4053a86d9..60f9afd514678192585265106ff76bf00ed3c903 100644 --- a/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/InDetTrackSystematicsTools/InDetTrackSmearingTool.h +++ b/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/InDetTrackSystematicsTools/InDetTrackSmearingTool.h @@ -64,6 +64,10 @@ namespace InDet { virtual CP::SystematicCode applySystematicVariation( const CP::SystematicSet& ); private: + + StatusCode initHistograms(int runNumber); + StatusCode firstCall(); + /// Get smearing widths to add to IPs float GetSmearD0Sigma(const xAOD::TrackParticle&); float GetSmearZ0Sigma(const xAOD::TrackParticle&); @@ -100,8 +104,9 @@ namespace InDet { std::string m_calibFileZ0Dead; std::string m_calibFileIP_lowpt; - std::string m_calibFileIP_highpt; - std::string m_MCSubcampaign; + std::string m_calibFileIP_highpt_Data16; + std::string m_calibFileIP_highpt_Data17; + uint32_t m_runNumber = 0; }; /// class InDetTrackSmearingTool diff --git a/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/Root/InDetTrackSmearingTool.cxx b/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/Root/InDetTrackSmearingTool.cxx index 0d5ff79cff54dcae909495f61d5252b0241efdf7..ea31ddcbbe72dfc7ff8d1586a5cf04f80f99b155 100644 --- a/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/Root/InDetTrackSmearingTool.cxx +++ b/PhysicsAnalysis/TrackingID/InDetTrackSystematicsTools/Root/InDetTrackSmearingTool.cxx @@ -62,8 +62,9 @@ namespace InDet { declareProperty("calibFileZ0Dead", m_calibFileZ0Dead = "InDetTrackSystematicsTools/CalibData_21.2_2018-v18/res_diff_z0_vs_pt.hist.root"); declareProperty("calibFileIP_lowpt", m_calibFileIP_lowpt = "InDetTrackSystematicsTools/CalibData_21.2_2018-v18/trackIPAlign_dec2017.root"); - declareProperty("calibFileIP_highpt", m_calibFileIP_highpt = ""); - declareProperty("MCSubcampaign", m_MCSubcampaign = "MC16a"); + declareProperty("calibFileIP_highpt_Data16", m_calibFileIP_highpt_Data16 = "InDetTrackSystematicsTools/CalibData_21.2_2018-v18/trackIPAlignTight.root"); + declareProperty("calibFileIP_highpt_Data17", m_calibFileIP_highpt_Data17 = "InDetTrackSystematicsTools/CalibData_21.2_2018-v19/trackIPAlignTight_data2017.root"); + declareProperty("runNumber", m_runNumber); } @@ -71,35 +72,6 @@ namespace InDet { // Greet the user: ATH_MSG_INFO( "Initializing..." ); - - // use a different highpt smearing map depending on the MC sub-campaign - if (m_MCSubcampaign == "MC16a" && m_calibFileIP_highpt == "") { - ATH_MSG_INFO( "Using default MC16a smearing map configuration for pT > 15 GeV" ); - m_calibFileIP_highpt = "InDetTrackSystematicsTools/CalibData_21.2_2018-v18/trackIPAlignTight.root"; - } else if ((m_MCSubcampaign == "MC16c" || m_MCSubcampaign == "MC16d") && m_calibFileIP_highpt == "") { - ATH_MSG_INFO( "Using default MC16c/d smearing map configuration for pT > 15 GeV" ); - m_calibFileIP_highpt = "InDetTrackSystematicsTools/CalibData_21.2_2018-v19/trackIPAlignTight_data2017.root"; - } else { - ATH_MSG_ERROR( "Unrecognized MCSubcampaign" ); - return StatusCode::FAILURE; - } - - ATH_CHECK( initObject<TH1>(m_smearD0Dead, m_calibFileD0Dead, "res_pt_d0_0") ); - ATH_CHECK( initObject<TH1>(m_smearZ0Dead, m_calibFileZ0Dead, "res_pt_z0_0") ); - - ATH_CHECK( initObject<TH2>(m_smearD0_lowpt, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta" ) ); - ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta" ) ); - ATH_CHECK( initObject<TH2>(m_smearD0_lowpt_sys_up, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta_sys_up" ) ); - ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt_sys_up, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta_sys_up" ) ); - ATH_CHECK( initObject<TH2>(m_smearD0_lowpt_sys_dw, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta_sys_dw" ) ); - ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt_sys_dw, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta_sys_dw" ) ); - - ATH_CHECK( initObject<TH2>(m_smearD0_highpt, m_calibFileIP_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta" ) ); - ATH_CHECK( initObject<TH2>(m_smearZ0_highpt, m_calibFileIP_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta" ) ); - ATH_CHECK( initObject<TH2>(m_smearD0_highpt_sys_up, m_calibFileIP_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta_sys_up" ) ); - ATH_CHECK( initObject<TH2>(m_smearZ0_highpt_sys_up, m_calibFileIP_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta_sys_up" ) ); - ATH_CHECK( initObject<TH2>(m_smearD0_highpt_sys_dw, m_calibFileIP_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta_sys_dw" ) ); - ATH_CHECK( initObject<TH2>(m_smearZ0_highpt_sys_dw, m_calibFileIP_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta_sys_dw" ) ); ATH_MSG_INFO( "Using seed of " << m_seed << " to initialize RNG" ); m_rnd = make_unique<TRandom3>(m_seed); @@ -107,7 +79,8 @@ namespace InDet { ATH_MSG_INFO( "Using for TRK_RES_D0_DEAD case the calibration file " << PathResolverFindCalibFile(m_calibFileD0Dead) ); ATH_MSG_INFO( "Using for TRK_RES_Z0_DEAD case the calibration file " << PathResolverFindCalibFile(m_calibFileZ0Dead) ); ATH_MSG_INFO( "Using for all other cases the low pT (< 15 GeV) calibration file " << PathResolverFindCalibFile(m_calibFileIP_lowpt) ); - ATH_MSG_INFO( "Using for all other cases the high pT (> 15 GeV) calibration file " << PathResolverFindCalibFile(m_calibFileIP_highpt) ); + ATH_MSG_INFO( "Using for all other cases the high pT (> 15 GeV) Data16 calibration file " << PathResolverFindCalibFile(m_calibFileIP_highpt_Data16) ); + ATH_MSG_INFO( "Using for all other cases the high pT (> 15 GeV) Data17 calibration file " << PathResolverFindCalibFile(m_calibFileIP_highpt_Data17) ); // do common initialization (at time of writing, register affecting systematics) ATH_CHECK( InDetTrackSystematicsTool::initialize() ); @@ -257,6 +230,15 @@ namespace InDet { } CP::CorrectionCode InDetTrackSmearingTool::applyCorrection( xAOD::TrackParticle& track ) { + + static bool firstTime = true; + if (firstTime) { + firstTime = false; // don't try to do this again + if ( ! firstCall().isSuccess() ) { // this will check the run number + return CP::CorrectionCode::Error; + } + } + float sigmaD0 = GetSmearD0Sigma( track ); float sigmaZ0 = GetSmearZ0Sigma( track ); @@ -270,6 +252,69 @@ namespace InDet { return CP::CorrectionCode::Ok; } + StatusCode InDetTrackSmearingTool::initHistograms(int runNumber) + { + + // For now, the Dead and lowpt histograms can be initialized without knowing the run number + ATH_CHECK( initObject<TH1>(m_smearD0Dead, m_calibFileD0Dead, "res_pt_d0_0") ); + ATH_CHECK( initObject<TH1>(m_smearZ0Dead, m_calibFileZ0Dead, "res_pt_z0_0") ); + + ATH_CHECK( initObject<TH2>(m_smearD0_lowpt, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta" ) ); + ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta" ) ); + ATH_CHECK( initObject<TH2>(m_smearD0_lowpt_sys_up, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta_sys_up" ) ); + ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt_sys_up, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta_sys_up" ) ); + ATH_CHECK( initObject<TH2>(m_smearD0_lowpt_sys_dw, m_calibFileIP_lowpt, "d0quaddiff_comb_Pt_Eta_sys_dw" ) ); + ATH_CHECK( initObject<TH2>(m_smearZ0_lowpt_sys_dw, m_calibFileIP_lowpt, "z0quaddiff_comb_Pt_Eta_sys_dw" ) ); + + string rootfileName_highpt; + if (runNumber <= 0) { + ATH_MSG_WARNING( "Run number not set." ); + } + if (runNumber >= 311481 && runNumber <= 341649) { + ATH_MSG_INFO( "Using the Data17 smearing maps for highpt" ); + rootfileName_highpt = m_calibFileIP_highpt_Data17; + } else { + ATH_MSG_INFO( "Using the Data16 smearing maps for highpt" ); + rootfileName_highpt = m_calibFileIP_highpt_Data16; + } + + ATH_CHECK( initObject<TH2>(m_smearD0_highpt, rootfileName_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta" ) ); + ATH_CHECK( initObject<TH2>(m_smearZ0_highpt, rootfileName_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta" ) ); + ATH_CHECK( initObject<TH2>(m_smearD0_highpt_sys_up, rootfileName_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta_sys_up" ) ); + ATH_CHECK( initObject<TH2>(m_smearZ0_highpt_sys_up, rootfileName_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta_sys_up" ) ); + ATH_CHECK( initObject<TH2>(m_smearD0_highpt_sys_dw, rootfileName_highpt, "quad_diff/d0quaddiff_comb_Pt_Eta_sys_dw" ) ); + ATH_CHECK( initObject<TH2>(m_smearZ0_highpt_sys_dw, rootfileName_highpt, "quad_diff/z0quaddiff_comb_Pt_Eta_sys_dw" ) ); + + return StatusCode::SUCCESS; + } + + StatusCode InDetTrackSmearingTool::firstCall() + { + + const xAOD::EventInfo* ei = nullptr; + auto sc = evtStore()->retrieve( ei, "EventInfo" ); + if ( ! sc.isSuccess() ) { + if (m_runNumber <= 0) { + ATH_MSG_ERROR( "Unable to retrieve from event store. Manually set run number." ); + return CP::CorrectionCode::Error; + } + } + + auto runNumber = ei->runNumber(); + if (m_runNumber > 0) { + if ( m_runNumber != runNumber ) { + ATH_MSG_WARNING( "Manually-set run number (" << m_runNumber << + ") does not match that from the event store (" << runNumber << ")." ); + ATH_MSG_WARNING( "Will use the manually set run number, but you must make sure this is the desired behaviour!" ); + } + runNumber = m_runNumber; + } + if ( ! initHistograms( runNumber ).isSuccess() ) { + return StatusCode::FAILURE; + } + return StatusCode::SUCCESS; + } + CP::CorrectionCode InDetTrackSmearingTool::correctedCopy( const xAOD::TrackParticle& in, xAOD::TrackParticle*& out ) {