ATLAS Offline Software
Loading...
Searching...
No Matches
SSVWeightsAlg.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6#ifndef SSV_Weights_ALG_H
7#define SSV_Weights_ALG_H
8
9// Algorithm includes
15
16// Framework includes
19#include "xAODTracking/Vertex.h"
25
26// Additionally include
27
28#include <nlohmann/json.hpp>
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() 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 };
122
124 public:
125 EfficiencyMethodBJetBasedClass( const nlohmann::json & jsonConfig );
126 double getPIneff(
127 const int b_jet_count,
128 const int N_missed,
129 const double SF_eff) const;
130 private:
131 std::map<std::string, double> m_bjetEfficiencyMap{};
133 };
134
135
136 double m_SF_eff = -999.;
137 double m_SF_fake_low = -999.;
138 double m_SF_fake_high = -999.;
139
140 std::unique_ptr<nFMethodPileupBasedLinearFitClass> m_nFPileupBasedLinearFitPtr;
141 std::unique_ptr<nFMethodPileupBasedBinnedClass> m_nFPileupBasedBinnedPtr;
142 std::unique_ptr<nFMethodPileupBJetBasedClass> m_nFPileupBJetBasedPtr;
143 std::unique_ptr<EfficiencyMethodBhadronPtEtaBasedClass> m_EfficiencyMethodBhadronPtEtaBasedPtr;
144 std::unique_ptr<EfficiencyMethodBJetBasedClass> m_EfficiencyMethodBJetBasedPtr;
145
149
150 std::vector<const xAOD::Vertex*> create_good_SSVs(
151 const std::vector<const xAOD::Jet*> &jets,
152 const std::vector<const xAOD::Electron*> &electrons,
153 const std::vector<const xAOD::Muon*> &muons,
154 const std::vector<const xAOD::Vertex*> &SSVs)const;
155
156 std::vector<const xAOD::TruthParticle*> create_accepted_truthBhs(
157 const std::vector<const xAOD::TruthParticle*> &truthBhs,
158 const std::vector<const xAOD::Jet*> &jets)const;
159
161 const std::vector<const xAOD::TruthParticle*> &truthBhs,
162 const std::vector<const xAOD::Vertex*> &SSVs)const;
163
164 std::vector<bool> truthBh_to_SSV_matching(
165 const std::vector<const xAOD::TruthParticle*> &truthBhs,
166 const std::vector<const xAOD::Vertex*> &SSVs)const;
167
168 static const std::vector<const xAOD::TruthParticle*> construct_not_matched_vectors(
169 const std::vector<const xAOD::TruthParticle*> &truthBhs,
170 const std::vector<bool> &matched_vector);
171
173 const xAOD::Vertex* vtx,
174 const xAOD::IParticle * part) const;
175
176 static double poisson_pmf(
177 const int k,
178 const double lambda);
179
181 const std::vector<bool> &matching_vector)const;
182
184 const std::vector<bool> &matching_vector)const;
185
187 const xAOD::TruthParticle *part,
188 const int type) const;
189
191 const std::vector<const xAOD::TruthParticle*> &accepted_truthBh,
192 const std::vector<bool> &truthBh_to_SSV_matched,
193 double SF_eff) const;
194
196 const int b_jet_count,
197 const int N_missed,
198 const double SF_eff) const;
199
201 const double muactual,
202 const int b_jet_count,
203 const int N_fake,
204 const double SF_fake_low,
205 const double SF_fake_high) const;
206
208 const double muactual,
209 const int N_fake) const;
210
212 const double muactual,
213 const int N_fake,
214 const double SF_fake_low,
215 const double SF_fake_high) const;
216
219 this, "eventInfo", "EventInfo", "the EventInfo container"};
220
222 this, "TruthParticleContainer", "TruthParticles", "input TruthParticles container"};
223
225 this, "jets", "", "the jet container to use"};
226
228 this, "electrons", "", "the electron container to use"};
229
231 this, "muons", "", "the muon container to use"};
232
234 this, "NVSI_WP", "", "The NewVrtSecInclusiveTool output container to use (NewVrtSecInclusiveTool = algorithm that constructs the soft secondary vertices (SSVs))"};
235
237 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"};
238
240 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"};
241
243 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"};
244
245 static const SG::AuxElement::ConstAccessor<float> m_ssv_pt_accessor;
246 static const SG::AuxElement::ConstAccessor<float> m_ssv_m_accessor;
247 static const SG::AuxElement::ConstAccessor<float> m_ssv_eta_accessor;
248 static const SG::AuxElement::ConstAccessor<float> m_ssv_phi_accessor;
249
250 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"};
251
252 CP::SysWriteDecorHandle<float> 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"};
253 CP::SysWriteDecorHandle<float> 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"};
254 CP::SysWriteDecorHandle<float> 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"};
255
256 CP::SysWriteDecorHandle<float> m_P_eff_decor{this, "P_eff", "P_eff_%SYS%", "efficiency correction factor"};
257 CP::SysWriteDecorHandle<float> m_P_ineff_decor{this, "P_ineff", "P_ineff_%SYS%", "inefficiency correction factor"};
258 CP::SysWriteDecorHandle<float> m_P_fake_decor{this, "P_fake", "P_fake_%SYS%", "fake correction factor"};
259
260 CP::SysWriteDecorHandle<float> m_number_of_bjets_decor{this, "number_of_bjets", "number_of_bjets_%SYS%", "number of b-jets in an event"};
261 CP::SysWriteDecorHandle<float> 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"};
262 CP::SysWriteDecorHandle<float> m_number_of_good_SSVs_decor{this, "number_of_good_SSVs", "number_of_good_SSVs_%SYS%", "number of good SSVs in an event"};
263
264 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"};
265 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"};
266 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"};
267 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"};
268 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"};
269 };
270}
271#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)
static const SG::AuxElement::ConstAccessor< float > m_ssv_pt_accessor
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
int count_not_matched_objects(const std::vector< bool > &matching_vector) const
CP::SysWriteDecorHandle< float > m_number_of_good_SSVs_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
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 std::vector< const xAOD::Vertex * > &SSVs) const
std::unique_ptr< EfficiencyMethodBJetBasedClass > m_EfficiencyMethodBJetBasedPtr
CP::SysReadHandle< xAOD::MuonContainer > m_muonsHandle
virtual StatusCode initialize() override
double compute_DeltaR_between_SSV_and_particle(const xAOD::Vertex *vtx, const xAOD::IParticle *part) const
static const SG::AuxElement::ConstAccessor< float > m_ssv_phi_accessor
CP::SysWriteDecorHandle< float > m_P_fake_pileup_based_linearfit_decor
double calculate_P_ineff_bjet_based(const int b_jet_count, const int N_missed, const double SF_eff) const
double calculate_P_fake_pileup_based_binned(const double muactual, const int N_fake, const double SF_fake_low, const double SF_fake_high) const
static const std::vector< const xAOD::TruthParticle * > construct_not_matched_vectors(const std::vector< const xAOD::TruthParticle * > &truthBhs, const std::vector< bool > &matched_vector)
std::unique_ptr< EfficiencyMethodBhadronPtEtaBasedClass > m_EfficiencyMethodBhadronPtEtaBasedPtr
nlohmann::json m_jsonConfig_SSVWeightsAlg
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
double calculate_P_fake_pileup_bjet_based(const double muactual, const int b_jet_count, const int N_fake, const double SF_fake_low, const double SF_fake_high) const
double calculate_P_ineff_Bhadron_pt_eta_based(const std::vector< const xAOD::TruthParticle * > &accepted_truthBh, const std::vector< bool > &truthBh_to_SSV_matched, double SF_eff) const
CP::SysWriteDecorHandle< float > m_N_missed_decor
CP::SysWriteDecorHandle< float > m_number_of_accepted_Bhadrons_decor
CP::SysReadSelectionHandle m_electronSelection
static double poisson_pmf(const int k, const double lambda)
CP::SysWriteDecorHandle< float > m_number_of_bjets_decor
virtual StatusCode execute() override
int count_matched_objects(const std::vector< bool > &matching_vector) const
Gaudi::Property< std::string > m_jsonConfigPath_SSVWeightsAlg
nFMethodType m_nFMethodType
CP::SysWriteDecorHandle< float > m_N_matched_decor
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
double calculate_P_fake_pileup_based_linearfit(const double muactual, const int N_fake) const
static const SG::AuxElement::ConstAccessor< float > m_ssv_m_accessor
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
CP::SysWriteDecorHandle< float > m_N_fake_decor
CP::SysWriteDecorHandle< float > m_P_fake_decor
CP::SysReadHandle< xAOD::ElectronContainer > m_electronsHandle
static const SG::AuxElement::ConstAccessor< float > m_ssv_eta_accessor
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
Class providing the definition of the 4-vector interface.
Select isolated Photons, Electrons and Muons.
Vertex_v1 Vertex
Define the latest version of the vertex class.
TruthParticle_v1 TruthParticle
Typedef to implementation.