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
17
18// Framework includes
21#include "xAODTracking/Vertex.h"
27
28// Additionally include
29
30#include <nlohmann/json.hpp>
31
32namespace CP{
33 class SSVWeightsAlg final : public EL::AnaAlgorithm{
34
35 public:
36 SSVWeightsAlg(const std::string &name, ISvcLocator *pSvcLocator);
37 virtual StatusCode initialize() override;
38 virtual StatusCode execute() override;
39
40 private:
41 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"};
42 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"};
43 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'"};
44 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'"};
45 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'"};
46
48
54
61
69
71 public:
72 nFMethodPileupBasedLinearFitClass( const nlohmann::json & jsonConfig );
73 double getPFake(
74 const double muactual,
75 const int N_fake) const;
76 private:
77 double m_slopeUnscaled = -999.;
78 double m_interceptUnscaled = -999.;
79 double m_slopeScaled = -999.;
80 double m_interceptScaled = -999.;
81 };
82
84 public:
85 nFMethodPileupBasedBinnedClass( const nlohmann::json & jsonConfig );
86 double getPFake(
87 const double muactual,
88 const int N_fake,
89 const double SF_fake_low,
90 const double SF_fake_high) const;
91 private:
92 std::vector<double> m_muactualBins{};
93 std::vector<double> m_nFBins{};
95 };
96
98 public:
99 nFMethodPileupBJetBasedClass( const nlohmann::json & jsonConfig );
100 double getPFake(
101 const double muactual,
102 const int b_jet_count,
103 const int N_fake,
104 const double SF_fake_low,
105 const double SF_fake_high) const;
106 private:
107 std::map<std::string, std::map<std::string, double>> m_nFPileupBJetMap{};
110 };
111
113 public:
114 EfficiencyMethodBhadronPtEtaBasedClass( const nlohmann::json & jsonConfig );
115 double getPIneff(
116 const std::vector<const xAOD::TruthParticle*> &accepted_truthBh,
117 const std::vector<bool> &truthBh_to_SSV_matched,
118 double SF_eff) const;
119 private:
120 std::vector<double> m_ptbins{};
121 std::map<std::string, std::map<std::string, std::vector<double>>> m_BhadronPtEtaEfficiencyMap{};
122 double m_upperboundpT = -999;
123 };
124
126 public:
127 EfficiencyMethodBJetBasedClass( const nlohmann::json & jsonConfig );
128 double getPIneff(
129 const int b_jet_count,
130 const int N_missed,
131 const double SF_eff) const;
132 private:
133 std::map<std::string, double> m_bjetEfficiencyMap{};
135 };
136
137
138 double m_SF_eff = -999.;
139 double m_SF_fake_low = -999.;
140 double m_SF_fake_high = -999.;
141
142 std::unique_ptr<nFMethodPileupBasedLinearFitClass> m_nFPileupBasedLinearFitPtr;
143 std::unique_ptr<nFMethodPileupBasedBinnedClass> m_nFPileupBasedBinnedPtr;
144 std::unique_ptr<nFMethodPileupBJetBasedClass> m_nFPileupBJetBasedPtr;
145 std::unique_ptr<EfficiencyMethodBhadronPtEtaBasedClass> m_EfficiencyMethodBhadronPtEtaBasedPtr;
146 std::unique_ptr<EfficiencyMethodBJetBasedClass> m_EfficiencyMethodBJetBasedPtr;
147
151
152 std::vector<const xAOD::Vertex*> create_good_SSVs(
153 const std::vector<const xAOD::Jet*> &jets,
154 const std::vector<const xAOD::Electron*> &electrons,
155 const std::vector<const xAOD::Muon*> &muons,
156 const std::vector<const xAOD::Vertex*> &SSVs)const;
157
158 std::vector<const xAOD::TruthParticle*> create_accepted_truthBhs(
159 const std::vector<const xAOD::TruthParticle*> &truthBhs,
160 const std::vector<const xAOD::Jet*> &jets)const;
161
163 const std::vector<const xAOD::TruthParticle*> &truthBhs,
164 const std::vector<const xAOD::Vertex*> &SSVs)const;
165
166 std::vector<bool> truthBh_to_SSV_matching(
167 const std::vector<const xAOD::TruthParticle*> &truthBhs,
168 const std::vector<const xAOD::Vertex*> &SSVs)const;
169
170 static const std::vector<const xAOD::TruthParticle*> construct_not_matched_vectors(
171 const std::vector<const xAOD::TruthParticle*> &truthBhs,
172 const std::vector<bool> &matched_vector);
173
175 const xAOD::Vertex* vtx,
176 const xAOD::IParticle * part) const;
177
178 static double poisson_pmf(
179 const int k,
180 const double lambda);
181
183 const std::vector<bool> &matching_vector)const;
184
186 const std::vector<bool> &matching_vector)const;
187
189 const xAOD::TruthParticle *part,
190 const int type) const;
191
193 const std::vector<const xAOD::TruthParticle*> &accepted_truthBh,
194 const std::vector<bool> &truthBh_to_SSV_matched,
195 double SF_eff) const;
196
198 const int b_jet_count,
199 const int N_missed,
200 const double SF_eff) const;
201
203 const double muactual,
204 const int b_jet_count,
205 const int N_fake,
206 const double SF_fake_low,
207 const double SF_fake_high) const;
208
210 const double muactual,
211 const int N_fake) const;
212
214 const double muactual,
215 const int N_fake,
216 const double SF_fake_low,
217 const double SF_fake_high) const;
218
221 this, "eventInfo", "EventInfo", "the EventInfo container"};
222
224 this, "TruthParticleContainer", "TruthParticles", "input TruthParticles container"};
225
227 this, "jets", "", "the jet container to use"};
228
230 this, "electrons", "", "the electron container to use"};
231
233 this, "muons", "", "the muon container to use"};
234
236 this, "NVSI_WP", "", "The NewVrtSecInclusiveTool output container to use (NewVrtSecInclusiveTool = algorithm that constructs the soft secondary vertices (SSVs))"};
237
239 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"};
240
242 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"};
243
245 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"};
246
251
252 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"};
253
254 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"};
255 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"};
256 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"};
257
258 CP::SysWriteDecorHandle<float> m_P_eff_decor{this, "P_eff", "P_eff_%SYS%", "efficiency correction factor"};
259 CP::SysWriteDecorHandle<float> m_P_ineff_decor{this, "P_ineff", "P_ineff_%SYS%", "inefficiency correction factor"};
260 CP::SysWriteDecorHandle<float> m_P_fake_decor{this, "P_fake", "P_fake_%SYS%", "fake correction factor"};
261
262 CP::SysWriteDecorHandle<float> m_number_of_bjets_decor{this, "number_of_bjets", "number_of_bjets_%SYS%", "number of b-jets in an event"};
263 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"};
264 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"};
265
266 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"};
267 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"};
268 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"};
269 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"};
270 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"};
271 };
272}
273#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
SG::ConstAccessor< T, ALLOC > ConstAccessor
Definition AuxElement.h:570
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.