ATLAS Offline Software
Loading...
Searching...
No Matches
SSVWeightsAlg.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6#ifndef F_TAG_ANALYSIS_ALGORITHMS__SSV_WEIGHTS_ALG_H
7#define F_TAG_ANALYSIS_ALGORITHMS__SSV_WEIGHTS_ALG_H
8
9// Algorithm includes
14
15// Framework includes
18#include "xAODTracking/Vertex.h"
24
25// Additionally include
26
27#include <nlohmann/json.hpp>
28#include <optional>
29
30namespace CP{
31 class SSVWeightsAlg final : public EL::AnaAlgorithm{
32
33 public:
34 SSVWeightsAlg(const std::string &name, ISvcLocator *pSvcLocator);
35 virtual StatusCode initialize() override;
36 virtual StatusCode execute(const EventContext& ctx) override;
37
38 private:
39 Gaudi::Property<std::string> m_jsonConfigPath_SSVWeightsAlg {this, "JsonConfigFile_SSVWeightsAlg","", "Path to the JSON config file that contains the SSV calibration results which are needed to calculate the SSV weights"};
40 Gaudi::Property<std::string> m_BTaggingWP {this, "BTaggingWP", "", "b-tagging working point that is used to count the number of b-jets in the event for b-jet based SSV weight calculation"};
41 Gaudi::Property<std::string> m_EfficiencyMethod {this, "EfficiencyMethod", "", "efficiency definition that will be used to calculate the SSV weights, string can be 'Bhadron_pT_eta_based' or 'bjet_based'"};
42 Gaudi::Property<std::string> m_nFMethod {this, "nFMethod", "", "average number of fake SSV definition that will be used to calculate the SSV weights, string can be 'pileup_bjet_based','pileup_based_linearfit' or 'pileup_based_binned'"};
43 Gaudi::Property<std::string> m_OutputVariableSize {this, "OutputVariableSize", "", "number of variables that will be saved to the output, string can be 'standard','extended','additional' or 'all'"};
44
46
52
59
67
69 public:
70 nFMethodPileupBasedLinearFitClass( const nlohmann::json & jsonConfig );
71 double getPFake(
72 const double muactual,
73 const int N_fake) const;
74 private:
75 double m_slopeUnscaled = -999.;
76 double m_interceptUnscaled = -999.;
77 double m_slopeScaled = -999.;
78 double m_interceptScaled = -999.;
79 };
80
82 public:
83 nFMethodPileupBasedBinnedClass( const nlohmann::json & jsonConfig );
84 double getPFake(
85 const double muactual,
86 const int N_fake,
87 const double SF_fake_low,
88 const double SF_fake_high) const;
89 private:
90 std::vector<double> m_muactualBins{};
91 std::vector<double> m_nFBins{};
93 };
94
96 public:
97 nFMethodPileupBJetBasedClass( const nlohmann::json & jsonConfig );
98 double getPFake(
99 const double muactual,
100 const int b_jet_count,
101 const int N_fake,
102 const double SF_fake_low,
103 const double SF_fake_high) const;
104 private:
105 std::map<std::string, std::map<std::string, double>> m_nFPileupBJetMap{};
108 };
109
111 public:
112 EfficiencyMethodBhadronPtEtaBasedClass( const nlohmann::json & jsonConfig );
113 double getPIneff(
114 const std::vector<const xAOD::TruthParticle*> &accepted_truthBh,
115 const std::vector<bool> &truthBh_to_SSV_matched,
116 double SF_eff) const;
117 private:
118 std::vector<double> m_ptbins{};
119 std::map<std::string, std::map<std::string, std::vector<double>>> m_BhadronPtEtaEfficiencyMap{};
120 double m_upperboundpT = -999;
121 std::string m_overflowPtBinKey{};
122 };
123
125 public:
126 EfficiencyMethodBJetBasedClass( const nlohmann::json & jsonConfig );
127 double getPIneff(
128 const int b_jet_count,
129 const int N_missed,
130 const double SF_eff) const;
131 private:
132 std::map<std::string, double> m_bjetEfficiencyMap{};
134 };
135
136
137 double m_SF_eff = -999.;
138 double m_SF_fake_low = -999.;
139 double m_SF_fake_high = -999.;
140
141 std::unique_ptr<nFMethodPileupBasedLinearFitClass> m_nFPileupBasedLinearFitPtr;
142 std::unique_ptr<nFMethodPileupBasedBinnedClass> m_nFPileupBasedBinnedPtr;
143 std::unique_ptr<nFMethodPileupBJetBasedClass> m_nFPileupBJetBasedPtr;
144 std::unique_ptr<EfficiencyMethodBhadronPtEtaBasedClass> m_EfficiencyMethodBhadronPtEtaBasedPtr;
145 std::unique_ptr<EfficiencyMethodBJetBasedClass> m_EfficiencyMethodBJetBasedPtr;
146
147 std::optional<SG::AuxElement::ConstAccessor<char>> m_jetBTagAccessor;
148
152
153 std::vector<const xAOD::Vertex*> create_good_SSVs(
154 const std::vector<const xAOD::Jet*> &jets,
155 const std::vector<const xAOD::Electron*> &electrons,
156 const std::vector<const xAOD::Muon*> &muons,
157 const xAOD::VertexContainer &SSVs)const;
158
159 std::vector<const xAOD::TruthParticle*> create_accepted_truthBhs(
160 const std::vector<const xAOD::TruthParticle*> &truthBhs,
161 const std::vector<const xAOD::Jet*> &jets)const;
162
164 const std::vector<const xAOD::TruthParticle*> &truthBhs,
165 const std::vector<const xAOD::Vertex*> &SSVs)const;
166
167 std::vector<bool> truthBh_to_SSV_matching(
168 const std::vector<const xAOD::TruthParticle*> &truthBhs,
169 const std::vector<const xAOD::Vertex*> &SSVs)const;
170
171 static std::vector<const xAOD::TruthParticle*> construct_not_matched_vectors(
172 const std::vector<const xAOD::TruthParticle*> &truthBhs,
173 const std::vector<bool> &matched_vector);
174
176 const xAOD::Vertex* vtx,
177 const xAOD::IParticle * part) const;
178
179 static double poisson_pmf(
180 const int k,
181 const double lambda);
182
184 const xAOD::TruthParticle *part,
185 const int type) const;
186
189 this, "eventInfo", "EventInfo", "the EventInfo container"};
190
192 this, "TruthParticleContainer", "TruthParticles", "input TruthParticles container"};
193
195 this, "jets", "", "the jet container to use"};
196
198 this, "electrons", "", "the electron container to use"};
199
201 this, "muons", "", "the muon container to use"};
202
204 this, "NVSI_WP", "", "The NewVrtSecInclusiveTool output container to use (NewVrtSecInclusiveTool = algorithm that constructs the soft secondary vertices (SSVs))"};
205
207 this, "jetSelection", "", "the jet selection to apply on the jets that are used to check if they overlap with a SSV or a b-hadron"};
208
210 this, "electronSelection", "", "the electron selection to apply on the electrons that are used to check if they overlap with a SSV or a b-hadron"};
211
213 this, "muonSelection", "", "the muon selection to apply on the muons that are used to check if they overlap with a SSV or a b-hadron"};
214
215 CP::SysWriteDecorHandle<float> m_SSV_weight_decor{this, "SSV_weight", "SSV_weight_%SYS%", "SSV weight defined as a product of the correction factors: SSV_weight = P_eff * P_ineff * P_fake"};
216
217 CP::SysWriteDecorHandle<int> m_N_matched_decor{this, "N_matched", "N_matched_%SYS%", "number of matched b-hadrons in an event; so number of b-hadrons in acceptance that satisfy ΔR(b-hadron in acceptance, good SSV)<0.3"};
218 CP::SysWriteDecorHandle<int> m_N_missed_decor{this, "N_missed", "N_missed_%SYS%", "number of missed b-hadrons in an event; so number of b-hadrons that do not satisfy ΔR(b-hadron in acceptance, good SSV)<0.3"};
219 CP::SysWriteDecorHandle<int> m_N_fake_decor{this, "N_fake", "N_fake_%SYS%", "number of fake SSVs in an event; so number of good SSVs in acceptance that do not satisfy ΔR(b-hadron in acceptance, good SSV)<0.3"};
220
221 CP::SysWriteDecorHandle<float> m_P_eff_decor{this, "P_eff", "P_eff_%SYS%", "efficiency correction factor"};
222 CP::SysWriteDecorHandle<float> m_P_ineff_decor{this, "P_ineff", "P_ineff_%SYS%", "inefficiency correction factor"};
223 CP::SysWriteDecorHandle<float> m_P_fake_decor{this, "P_fake", "P_fake_%SYS%", "fake correction factor"};
224
225 CP::SysWriteDecorHandle<int> m_number_of_bjets_decor{this, "number_of_bjets", "number_of_bjets_%SYS%", "number of b-jets in an event"};
226 CP::SysWriteDecorHandle<int> m_number_of_accepted_Bhadrons_decor{this, "number_of_accepted_Bhadrons", "number_of_accepted_Bhadrons_%SYS%", "number of b-hadrons in acceptance in an event"};
227 CP::SysWriteDecorHandle<int> m_number_of_good_SSVs_decor{this, "number_of_good_SSVs", "number_of_good_SSVs_%SYS%", "number of good SSVs in an event"};
228
229 CP::SysWriteDecorHandle<float> m_P_ineff_bjet_based_decor{this, "P_ineff_bjet_based", "P_ineff_bjet_based_%SYS%", "inefficiency correction factor calculated according to the 'bjet_based' EfficiencyMethod"};
230 CP::SysWriteDecorHandle<float> m_P_ineff_pt_eta_based_decor{this, "P_ineff_pt_eta_based", "P_ineff_pt_eta_based_%SYS%", "inefficiency correction factor calculated according to the 'Bhadron_pT_eta_based' EfficiencyMethod"};
231 CP::SysWriteDecorHandle<float> m_P_fake_pileup_bjet_based_decor{this, "P_fake_pileup_bjet_based", "P_fake_pileup_bjet_based_%SYS%", "fake correction factor calculated according to the 'pileup_bjet_based' nFMethod"};
232 CP::SysWriteDecorHandle<float> m_P_fake_pileup_based_linearfit_decor{this, "P_fake_pileup_based_linearfit", "P_fake_pileup_based_linearfit_%SYS%", "fake correction factor calculated according to the 'pileup_based_linearfit' nFMethod"};
233 CP::SysWriteDecorHandle<float> m_P_fake_pileup_based_binned_decor{this, "P_fake_pileup_based_binned", "P_fake_pileup_based_binned_%SYS%", "fake correction factor calculated accoring to the 'pileup_based_binned' nFMethod"};
234 };
235}
236#endif
EfficiencyMethodBJetBasedClass(const nlohmann::json &jsonConfig)
double getPIneff(const int b_jet_count, const int N_missed, const double SF_eff) const
std::map< std::string, double > m_bjetEfficiencyMap
EfficiencyMethodBhadronPtEtaBasedClass(const nlohmann::json &jsonConfig)
std::map< std::string, std::map< std::string, std::vector< double > > > m_BhadronPtEtaEfficiencyMap
double getPIneff(const std::vector< const xAOD::TruthParticle * > &accepted_truthBh, const std::vector< bool > &truthBh_to_SSV_matched, double SF_eff) const
double getPFake(const double muactual, const int b_jet_count, const int N_fake, const double SF_fake_low, const double SF_fake_high) const
nFMethodPileupBJetBasedClass(const nlohmann::json &jsonConfig)
std::map< std::string, std::map< std::string, double > > m_nFPileupBJetMap
double getPFake(const double muactual, const int N_fake, const double SF_fake_low, const double SF_fake_high) const
nFMethodPileupBasedBinnedClass(const nlohmann::json &jsonConfig)
double getPFake(const double muactual, const int N_fake) const
nFMethodPileupBasedLinearFitClass(const nlohmann::json &jsonConfig)
std::optional< SG::AuxElement::ConstAccessor< char > > m_jetBTagAccessor
CP::SysReadSelectionHandle m_muonSelection
std::vector< bool > truthBh_to_SSV_matching(const std::vector< const xAOD::TruthParticle * > &truthBhs, const std::vector< const xAOD::Vertex * > &SSVs) const
CP::SysWriteDecorHandle< int > m_N_fake_decor
CP::SysReadHandle< xAOD::JetContainer > m_jetsHandle
OutputVariableSizeType m_OutputVariableSizeType
CP::SysReadHandle< xAOD::VertexContainer > m_ssvHandle
std::unique_ptr< nFMethodPileupBasedLinearFitClass > m_nFPileupBasedLinearFitPtr
CP::SysWriteDecorHandle< float > m_SSV_weight_decor
CP::SysWriteDecorHandle< int > m_number_of_accepted_Bhadrons_decor
std::unique_ptr< EfficiencyMethodBJetBasedClass > m_EfficiencyMethodBJetBasedPtr
CP::SysReadHandle< xAOD::MuonContainer > m_muonsHandle
virtual StatusCode initialize() override
CP::SysWriteDecorHandle< int > m_N_matched_decor
double compute_DeltaR_between_SSV_and_particle(const xAOD::Vertex *vtx, const xAOD::IParticle *part) const
CP::SysWriteDecorHandle< float > m_P_fake_pileup_based_linearfit_decor
std::unique_ptr< EfficiencyMethodBhadronPtEtaBasedClass > m_EfficiencyMethodBhadronPtEtaBasedPtr
nlohmann::json m_jsonConfig_SSVWeightsAlg
CP::SysWriteDecorHandle< int > m_number_of_good_SSVs_decor
bool isHFHadronFinalState(const xAOD::TruthParticle *part, const int type) const
std::vector< const xAOD::TruthParticle * > create_accepted_truthBhs(const std::vector< const xAOD::TruthParticle * > &truthBhs, const std::vector< const xAOD::Jet * > &jets) const
CP::SysReadSelectionHandle m_electronSelection
static double poisson_pmf(const int k, const double lambda)
Gaudi::Property< std::string > m_jsonConfigPath_SSVWeightsAlg
nFMethodType m_nFMethodType
CP::SysWriteDecorHandle< float > m_P_fake_pileup_bjet_based_decor
Gaudi::Property< std::string > m_nFMethod
Gaudi::Property< std::string > m_EfficiencyMethod
CP::SysReadHandle< xAOD::TruthParticleContainer > m_truthParticlesHandle
std::unique_ptr< nFMethodPileupBJetBasedClass > m_nFPileupBJetBasedPtr
CP::SysWriteDecorHandle< float > m_P_ineff_bjet_based_decor
CP::SysWriteDecorHandle< float > m_P_ineff_decor
SSVWeightsAlg(const std::string &name, ISvcLocator *pSvcLocator)
CP::SysReadSelectionHandle m_jetSelection
int count_number_of_fake_SSVs(const std::vector< const xAOD::TruthParticle * > &truthBhs, const std::vector< const xAOD::Vertex * > &SSVs) const
CP::SysReadHandle< xAOD::EventInfo > m_eventInfoHandle
CP::SysListHandle m_systematicsList
Gaudi::Property< std::string > m_OutputVariableSize
std::vector< const xAOD::Vertex * > create_good_SSVs(const std::vector< const xAOD::Jet * > &jets, const std::vector< const xAOD::Electron * > &electrons, const std::vector< const xAOD::Muon * > &muons, const xAOD::VertexContainer &SSVs) const
CP::SysWriteDecorHandle< int > m_number_of_bjets_decor
CP::SysWriteDecorHandle< int > m_N_missed_decor
Gaudi::Property< std::string > m_BTaggingWP
CP::SysWriteDecorHandle< float > m_P_ineff_pt_eta_based_decor
CP::SysWriteDecorHandle< float > m_P_fake_pileup_based_binned_decor
static std::vector< const xAOD::TruthParticle * > construct_not_matched_vectors(const std::vector< const xAOD::TruthParticle * > &truthBhs, const std::vector< bool > &matched_vector)
CP::SysWriteDecorHandle< float > m_P_fake_decor
CP::SysReadHandle< xAOD::ElectronContainer > m_electronsHandle
CP::SysWriteDecorHandle< float > m_P_eff_decor
EfficiencyMethodType m_EfficiencyMethodType
std::unique_ptr< nFMethodPileupBasedBinnedClass > m_nFPileupBasedBinnedPtr
a class managing the property to configure the list of systematics to process
a data handle for reading systematics varied input data
a data handle for reading systematically varied selection properties from objects
a data handle for reading systematics varied input data
the (new) base class for EventLoop algorithms
virtual::StatusCode execute()
execute this algorithm
Class providing the definition of the 4-vector interface.
Select isolated Photons, Electrons and Muons.
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TruthParticle_v1 TruthParticle
Typedef to implementation.