ATLAS Offline Software
Loading...
Searching...
No Matches
JetForwardJvtToolBDT.cxx
Go to the documentation of this file.
1
2/*
3 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
4*/
5// JetForwardJvtToolBDT.cxx
6// Implementation file for class JetForwardJvtToolBDT
7// Author: Louis Portales <louis.portales@cern.ch>
9
10// JetForwardJvtToolBDT includes
12// Jet EDM
17#include <mutex>
18
19
20const double GeV = 1000.;
22// Public methods:
24
25// Constructors
28 asg::AsgTool(name)
29{
30}
31
32// Destructor
35
36// Athena algtool's Hooks
39{
40 ATH_MSG_INFO ("Initializing " << name() << "...");
41
42 if(m_isAna){
43 // -- Retrieve MVfJVT WP configFile ONLY if tool used in 'Analysis mode'
44 std::string filename = PathResolverFindCalibFile(std::string(m_configDir)+m_wpFile);
45 if (filename.empty()){
46 ATH_MSG_ERROR ( "Could NOT resolve file name " << m_wpFile);
47 return StatusCode::FAILURE;
48 } else{
49 ATH_MSG_INFO(" Config Files Path found = "<<filename);
50 }
51
52 // -- Retrieve WP histograms
53 m_wpFileIn = std::make_unique<TFile> (filename.c_str(),"read");
54
55 if ( m_OP=="TIGHTER") {
56 m_mvfjvtThresh = std::unique_ptr< TH3D >( dynamic_cast<TH3D*>( m_wpFileIn->Get( "MVfJVT_tighter" ) ) );
57 } else if ( m_OP=="TIGHT" ) {
58 m_mvfjvtThresh = std::unique_ptr< TH3D >( dynamic_cast<TH3D*>( m_wpFileIn->Get( "MVfJVT_tight" ) ) );
59 } else if ( m_OP=="DEFAULT" || m_OP=="LOOSE" ) {
60 m_mvfjvtThresh = std::unique_ptr< TH3D >( dynamic_cast<TH3D*>( m_wpFileIn->Get( "MVfJVT_loose" ) ) );
61 } else {
62 ATH_MSG_ERROR(m_OP << " working point doesn't exist." );
63 return StatusCode::FAILURE;
64 }
65 m_mvfjvtThresh->SetDirectory(nullptr);
66 m_wpFileIn->Close();
67 }
68
69 // -- Setup the tagger
70 m_MVreader = std::make_unique< TMVA::Reader > ( "Silent" );
71 float fjvt,width,time,cllambda2,cletawidth,cle,cliso,clemprob;
72 m_MVreader->AddVariable( "fjvtdist", &fjvt );
73 m_MVreader->AddVariable( "Width_jet", &width );
74 m_MVreader->AddVariable( "timedist", &time );
75 m_MVreader->AddVariable( "jet_LeadingClusterSecondLambda", &cllambda2 );
76 m_MVreader->AddVariable( "cl_etaWidthLead", &cletawidth );
77 m_MVreader->AddVariable( "clsum_e", &cle );
78 m_MVreader->AddVariable( "cl_ISOLATIONsumE", &cliso );
79 m_MVreader->AddVariable( "cl_EM_PROBABILITYsumE", &clemprob );
80 for(unsigned int i = 0; i<m_MVconfig.size(); ++i) m_MVreader->BookMVA(TString::Format("BDT_%i",i+1),PathResolverFindCalibFile(m_configDir+m_MVconfig.value().at(i)));
81
82 // "passMVfJVT" flag
84 ATH_CHECK(m_outMVKey.initialize());
85
86 // Moments values
88 ATH_CHECK(m_mvfjvtKey.initialize());
89
94 m_cleKey = m_jetContainerName + "." + m_cleKey.key();
95
96 ATH_CHECK(m_cllambda2Key.initialize());
97 ATH_CHECK(m_clwidthKey.initialize());
98 ATH_CHECK(m_clisoKey.initialize());
99 ATH_CHECK(m_clemprobKey.initialize());
100 ATH_CHECK(m_cleKey.initialize());
101
107 m_lcleKey = m_jetContainerName + "." + m_lcleKey.key();
108
109 ATH_CHECK(m_lcllambda2Key.initialize());
110 ATH_CHECK(m_lcllambda2NTKey.initialize());
111 ATH_CHECK(m_lclwidthKey.initialize());
112 ATH_CHECK(m_lclisoKey.initialize());
113 ATH_CHECK(m_lclemprobKey.initialize());
114 ATH_CHECK(m_lcleKey.initialize());
115
116 ATH_CHECK(m_eventInfoKey.initialize());
117 ATH_CHECK(m_vertexContainerKey.initialize());
119 ATH_CHECK(m_trkMetKey.initialize());
120
121 // Truth information
122 m_isHSKey = m_jetContainerName + "." + m_isHSKey.key();
123 m_isPUKey = m_jetContainerName + "." + m_isPUKey.key();
124
125 ATH_CHECK(m_isHSKey.initialize());
126 ATH_CHECK(m_isPUKey.initialize());
127
128 return StatusCode::SUCCESS;
129}
130
131
132StatusCode JetForwardJvtToolBDT::decorate(const xAOD::JetContainer& jetCont) const {
133
134 // -- Retrieve PV index if not provided by user
135 //pvind = (m_pvind.value()==-1) ? getPV() : m_pvind;
136 int pvind = m_pvind.value();
137 if(pvind == -1) pvind = getPV();
138
139 ATH_MSG_DEBUG("In JetForwardJvtToolBDT::modify: PV index = " << pvind);
140 if( pvind == -1 ){
141 ATH_MSG_WARNING( "Something went wrong with the HS primary vertex identification." );
142 return StatusCode::FAILURE;
143 }
144
147
153 std::vector<TVector2> pileupMomenta;
154 for(const xAOD::Jet *jetF : jetCont) {
155
156 float mvfjvt = -2;
157 outMVHandle(*jetF) = 1;
158 cllambda2Handle(*jetF) = 0;
159 clwidthHandle(*jetF) = 0;
160 cleHandle(*jetF) = 0;
161 clisoHandle(*jetF) = 0;
162 clemprobHandle(*jetF) = 0;
163
164 // -- Get PU vertices momenta sums, then compute tagger value for forward jets
165 if ( forwardJet(jetF) ){
166 if( pileupMomenta.empty() ) {
167 pileupMomenta = calculateVertexMomenta(&jetCont, pvind);
168 if( pileupMomenta.empty() ) {
169 ATH_MSG_DEBUG( "pileupMomenta is empty, this can happen for events with no PU vertices. fJVT won't be computed for this event and will be set to 0 instead." );
170 mvfjvtHandle(*jetF) = 0;
171 continue;
172 }
173 }
174 mvfjvt = getMVfJVT(jetF, pvind, pileupMomenta);
175 if(m_isAna) outMVHandle(*jetF) = passMVfJVT( mvfjvt, jetF->pt()/(GeV), fabs(jetF->eta()) );
176 mvfjvtHandle(*jetF) = mvfjvt;
177 }
178 }
179 return StatusCode::SUCCESS;
180
181}
182
183
184float JetForwardJvtToolBDT::getFJVT(const xAOD::Jet *jet, int pvind, const std::vector<TVector2>& pileupMomenta) const {
185
186 TVector2 fjet(-jet->pt()*cos(jet->phi()),-jet->pt()*sin(jet->phi()));
187 double fjvt = 0;
188 ATH_MSG_DEBUG("In JetForwardJvtToolBDT::getFJVT -----> Starting looping on vertices (pileupMomenta.size() = "<<pileupMomenta.size());
189 for (size_t pui = 0; pui < pileupMomenta.size(); pui++) {
190 if (pui!=(size_t)pvind){
191 double projection = pileupMomenta[pui]*fjet/fjet.Mod();
192 if (projection>fjvt) fjvt = projection;
193 }
194 }
195 return fjvt;
196}
197
198
199float JetForwardJvtToolBDT::getMVfJVT(const xAOD::Jet *jet, int pvind, const std::vector<TVector2>& pileupMomenta) const {
200
201 static const SG::ConstAccessor<float> MVfJVTAcc ("MVfJVT");
202 if(m_isAna && !m_getTagger) return MVfJVTAcc(*jet);
203
204 StatusCode sc = getInputs(jet);
205 if( sc.isFailure() ) {
206 ATH_MSG_WARNING(" Could not calculate BDT inputs");
207 return -2;
208 }
209
211 if ( !eventInfoHandle.isValid() ) {
212 ATH_MSG_WARNING(" xAOD::EventInfo " << m_eventInfoKey.key() << "is invalid");
213 return -2;
214 }
215 float mu = eventInfoHandle->actualInteractionsPerCrossing();
216
217 if (!forwardJet(jet)) return -2;
218
224
225 std::vector<float> MVinputs;
226 MVinputs.push_back( getFJVT(jet, pvind, pileupMomenta)/jet->pt() );
227 MVinputs.push_back( jet->getAttribute<float>("Width") );
228 MVinputs.push_back( jet->getAttribute<float>("Timing") );
229 MVinputs.push_back( cllambda2Handle(*jet) );
230 MVinputs.push_back( clwidthHandle(*jet) );
231 MVinputs.push_back( cleHandle(*jet) );
232 MVinputs.push_back( clisoHandle(*jet) );
233 MVinputs.push_back( clemprobHandle(*jet) );
234
235 float pt = jet->pt()/(GeV);
236 float eta = fabs(jet->eta());
237
238 float score = -2.;
239 // TMVA::Reader::EvaluateMVA isn't thread-safe.
240 TMVA::Reader& reader ATLAS_THREAD_SAFE = *m_MVreader;
241 static std::mutex mutex;
242 std::lock_guard lock (mutex);
243 if ( pt < 30. && pt >= 20. && eta >= 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_1" ,1.);
244 else if ( pt < 30. && pt >= 20. && eta < 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_2" ,1.);
245 else if ( pt < 40. && pt >= 30. && eta >= 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_3" ,1.);
246 else if ( pt < 40. && pt >= 30. && eta < 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_4" ,1.);
247 else if ( pt < 50. && pt >= 40. && eta >= 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_5" ,1.);
248 else if ( pt < 50. && pt >= 40. && eta < 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_6" ,1.);
249 else if ( pt < 120. && pt >= 50. && eta >= 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_7" ,1.);
250 else if ( pt < 120. && pt >= 50. && eta < 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_8" ,1.);
251 else if ( pt < 30. && pt >= 20. && eta >= 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_9" ,1.);
252 else if ( pt < 30. && pt >= 20. && eta < 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_10" ,1.);
253 else if ( pt < 40. && pt >= 30. && eta >= 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_11" ,1.);
254 else if ( pt < 40. && pt >= 30. && eta < 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_12" ,1.);
255 else if ( pt < 50. && pt >= 40. && eta >= 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_13" ,1.);
256 else if ( pt < 50. && pt >= 40. && eta < 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_14" ,1.);
257 else if ( pt < 120. && pt >= 50. && eta >= 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_15" ,1.);
258 else if ( pt < 120. && pt >= 50. && eta < 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_16" ,1.);
259
260 ATH_MSG_DEBUG("pt = " << pt << " | eta = " << eta << " | mu = " << mu << " || MVfJVT = " << score );
261
262 return score;
263}
264
265bool JetForwardJvtToolBDT::passMVfJVT( float mvfjvt, float pt, float eta ) const {
266
267 double mvfjvtThresh = -999.;
268
270 if ( !eventInfoHandle.isValid() ) {
271 ATH_MSG_WARNING(" xAOD::EventInfo " << m_eventInfoKey.key() << "is invalid");
272 return true;
273 }
274
275 float mu = eventInfoHandle->actualInteractionsPerCrossing();
276
277 // -- Grab WP from histogram
278 mvfjvtThresh = m_mvfjvtThresh->GetBinContent(m_mvfjvtThresh->GetXaxis()->FindBin(pt),
279 m_mvfjvtThresh->GetYaxis()->FindBin(eta),
280 m_mvfjvtThresh->GetZaxis()->FindBin(mu));
281
282 return mvfjvt==-2 || mvfjvt>mvfjvtThresh;
283
284}
285
292
293 if(!m_getTagger){
295 cllambda2Handle(*jet) = lcllambda2NTHandle(*jet);
296
297 // -- Additional variables computed from cluster information
299 if( !clustersHandle.isValid() ) {
300 ATH_MSG_ERROR(" xAOD::CaloClusterContainer " << m_caloClusterContainerKey.key() << "is invalid");
301 return StatusCode::FAILURE;
302 }
303
304 int ind = 0;
305 float maxpt = 0;
306 float cle1 = 0;
307 float cliso1 = 0;
308 float clemprob1 = 0;
309 float cle2 = 0;
310
311 // Loop over clusters within DeltaR<0.6 of the jet axis to compute the (energy-weighted) moment sums used in the BDT definitions
312 static const SG::ConstAccessor<float> ISOLATIONAcc ("ISOLATION");
313 static const SG::ConstAccessor<float> EM_PROBABILITYAcc ("EM_PROBABILITY");
314 for (const xAOD::CaloCluster *cl: *clustersHandle) {
315 if(cl->p4().DeltaR(jet->p4())>0.6) continue;
316 cle1 += cl->e();
317 cle2 += cl->e()*cl->e();
318 cliso1 += ISOLATIONAcc(*cl)*cl->e()*cl->e();
319 clemprob1 += EM_PROBABILITYAcc(*cl)*cl->e()*cl->e();
320 if(cl->rawE()/cosh(cl->rawEta()) > maxpt){
321 maxpt = cl->rawE()/cosh(cl->rawEta());
322 ind = cl->index();
323 }
324 }
325 const xAOD::CaloCluster *cl = clustersHandle->at(ind);
326 static const SG::ConstAccessor<float> SECOND_RAcc ("SECOND_R");
327 static const SG::ConstAccessor<float> CENTER_MAGAcc ("CENTER_MAG");
328 clwidthHandle(*jet) = TMath::CosH(cl->rawEta()) * TMath::ATan2( TMath::Sqrt(SECOND_RAcc(*cl)),
329 CENTER_MAGAcc(*cl));
330
331 cleHandle(*jet) = cle1;
332 clisoHandle(*jet)= cliso1/cle2;
333 clemprobHandle(*jet) =clemprob1/cle2;
334
335 } else {
341
342 cllambda2Handle(*jet) = lcllambda2Handle(*jet);
343 clwidthHandle(*jet) = lclwidthHandle(*jet);
344 clisoHandle(*jet) = lclisoHandle(*jet);
345 clemprobHandle(*jet) = lclemprobHandle(*jet);
346 cleHandle(*jet) = lcleHandle(*jet);
347 }
348 return StatusCode::SUCCESS;
349}
350
351std::vector<TVector2> JetForwardJvtToolBDT::calculateVertexMomenta(const xAOD::JetContainer *jets, int pvind) const {
352
353 std::vector<TVector2> pileupMomenta;
354
356 if( !trkMetHandle.isValid() ) {
357 ATH_MSG_WARNING(" xAOD::MissingETContainer " << m_trkMetKey.key() << "is invalid");
358 return pileupMomenta;
359 }
361 if( !vxContHandle.isValid() ) {
362 ATH_MSG_WARNING(" xAOD::VertexContainer " << m_vertexContainerKey.key() << "is invalid");
363 return pileupMomenta;
364 }
365 ATH_MSG_DEBUG("In JetForwardJvtToolBDT::calculateVertexMomenta : Starting vertex loop ");
366 for(const xAOD::Vertex *vx : *vxContHandle) {
367 ATH_MSG_DEBUG(" --> VertexType="<<vx->vertexType());
368 if(vx->vertexType()!=xAOD::VxType::PriVtx && vx->vertexType()!=xAOD::VxType::PileUp) continue;
369 TString vname = "PVTrack_vx";
370 vname += vx->index();
371 pileupMomenta.push_back((vx->index()==(size_t)pvind?0:-(1./m_jetScaleFactor))*TVector2(0.5*(*trkMetHandle)[vname.Data()]->mpx(),0.5*(*trkMetHandle)[vname.Data()]->mpy()));
372 }
373 for (const xAOD::Jet *jet : *jets) {
374 if (!centralJet(jet)) continue;
375 int jetvert = getJetVertex(jet);
376 if (jetvert>=0) pileupMomenta[jetvert] += TVector2(0.5*jet->pt()*cos(jet->phi()),0.5*jet->pt()*sin(jet->phi()));
377 }
378
379 return pileupMomenta;
380}
381
383
384 if (fabs(jet->eta())<m_etaThresh) return false;
385 if (jet->pt()<m_forwardMinPt || jet->pt()>m_forwardMaxPt) return false;
386 return true;
387}
388
390
391 if (fabs(jet->eta())>m_etaThresh) return false;
392 if (jet->pt()<m_centerMinPt || (m_centerMaxPt>0 && jet->pt()>m_centerMaxPt)) return false;
393 float jvt = 0;
394 jet->getAttribute<float>(m_jvtMomentName,jvt);
395 if (jvt>m_centerJvtThresh) return false;
396 if (jet->pt()<m_maxStochPt && getDrpt(jet)<m_centerDrptThresh) return false;
397 return true;
398}
399
401
402 std::vector<float> sumpts;
403 jet->getAttribute<std::vector<float> >("SumPtTrkPt500",sumpts);
404 double firstVal = 0;
405 int bestMatch = -1;
406 for (size_t i = 0; i < sumpts.size(); i++) {
407 if (sumpts[i]>firstVal) {
408 bestMatch = i;
409 firstVal = sumpts[i];
410 }
411 }
412 return bestMatch;
413}
414
416
417 std::vector<float> sumpts;
418 jet->getAttribute<std::vector<float> >("SumPtTrkPt500",sumpts);
419 if (sumpts.size()<2) return 0;
420
421 std::nth_element(sumpts.begin(),sumpts.begin()+sumpts.size()/2,sumpts.end(),std::greater<int>());
422 double median = sumpts[sumpts.size()/2];
423 std::nth_element(sumpts.begin(),sumpts.begin(),sumpts.end(),std::greater<int>());
424 double max = sumpts[0];
425 return (max-median)/jet->pt();
426}
427
429
431 if( !vxContHandle.isValid() ) {
432 ATH_MSG_WARNING(" xAOD::VertexContainer " << m_vertexContainerKey.key() << "is invalid");
433 return 0;
434 } else {
435 ATH_MSG_DEBUG("Successfully retrieved primary vertex container");
436 for(const xAOD::Vertex *vx : *vxContHandle) {
437 if(vx->vertexType()==xAOD::VxType::PriVtx) return vx->index();
438 }
439 }
440 ATH_MSG_DEBUG("Couldn't identify the hard-scatter primary vertex (no vertex with \"vx->vertexType()==xAOD::VxType::PriVtx\" in the container)!");
441 return 0;
442}
443
447
448 for(const xAOD::Jet *jet : *jets) {
449 bool ishs = false;
450 bool ispu = true;
451 for(const xAOD::Jet *tjet : *truthJets) {
452 if (tjet->p4().DeltaR(jet->p4())<0.3 && tjet->pt()>10e3) ishs = true;
453 if (tjet->p4().DeltaR(jet->p4())<0.6) ispu = false;
454 }
455 isHSHandle(*jet)=ishs;
456 isPUHandle(*jet)=ispu;
457 }
458 return StatusCode::SUCCESS;
459}
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Helper class to provide constant type-safe access to aux data.
Defines enum to access jet attribute and associated particles/objects.
static Double_t sc
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
const double width
#define max(a, b)
Definition cfImp.cxx:41
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_caloClusterContainerKey
Gaudi::Property< std::vector< std::string > > m_MVconfig
std::vector< TVector2 > calculateVertexMomenta(const xAOD::JetContainer *jets, int pvind) const
Gaudi::Property< std::string > m_jvtMomentName
SG::WriteDecorHandleKey< xAOD::JetContainer > m_cllambda2Key
std::unique_ptr< TH3D > m_mvfjvtThresh
SG::WriteDecorHandleKey< xAOD::JetContainer > m_clisoKey
SG::ReadDecorHandleKey< xAOD::JetContainer > m_lclwidthKey
Gaudi::Property< double > m_forwardMaxPt
SG::WriteDecorHandleKey< xAOD::JetContainer > m_clwidthKey
Gaudi::Property< double > m_centerMinPt
Gaudi::Property< std::string > m_OP
SG::WriteDecorHandleKey< xAOD::JetContainer > m_isPUKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_outMVKey
Gaudi::Property< std::string > m_jetContainerName
SG::ReadDecorHandleKey< xAOD::JetContainer > m_lcllambda2NTKey
Gaudi::Property< bool > m_getTagger
SG::WriteDecorHandleKey< xAOD::JetContainer > m_clemprobKey
Gaudi::Property< double > m_centerJvtThresh
SG::WriteDecorHandleKey< xAOD::JetContainer > m_isHSKey
float getDrpt(const xAOD::Jet *jet) const
Gaudi::Property< bool > m_isAna
SG::ReadDecorHandleKey< xAOD::JetContainer > m_lclisoKey
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
float getMVfJVT(const xAOD::Jet *jet, int pvind, const std::vector< TVector2 > &pileupMomenta) const
StatusCode tagTruth(const xAOD::JetContainer *jets, const xAOD::JetContainer *truthJets)
virtual ~JetForwardJvtToolBDT()
Destructor:
SG::WriteDecorHandleKey< xAOD::JetContainer > m_cleKey
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexContainerKey
Gaudi::Property< double > m_jetScaleFactor
Gaudi::Property< double > m_etaThresh
JetForwardJvtToolBDT(const std::string &name)
Constructor with parameters:
SG::ReadDecorHandleKey< xAOD::JetContainer > m_lcleKey
bool centralJet(const xAOD::Jet *jet) const
Gaudi::Property< double > m_centerMaxPt
Gaudi::Property< double > m_maxStochPt
Gaudi::Property< std::string > m_wpFile
Gaudi::Property< int > m_pvind
int getJetVertex(const xAOD::Jet *jet) const
std::unique_ptr< TMVA::Reader > m_MVreader
std::unique_ptr< TFile > m_wpFileIn
Gaudi::Property< std::string > m_configDir
SG::ReadHandleKey< xAOD::MissingETContainer > m_trkMetKey
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
StatusCode getInputs(const xAOD::Jet *jet) const
Gaudi::Property< double > m_centerDrptThresh
bool forwardJet(const xAOD::Jet *jet) const
virtual StatusCode decorate(const xAOD::JetContainer &jetCont) const override
Decorate a jet collection without otherwise modifying it.
SG::WriteDecorHandleKey< xAOD::JetContainer > m_mvfjvtKey
float getFJVT(const xAOD::Jet *jet, int pvind, const std::vector< TVector2 > &pileupMomenta) const
SG::ReadDecorHandleKey< xAOD::JetContainer > m_lcllambda2Key
Gaudi::Property< double > m_forwardMinPt
bool passMVfJVT(float mvfjvt, float pt, float eta) const
SG::ReadDecorHandleKey< xAOD::JetContainer > m_lclemprobKey
Helper class to provide constant type-safe access to aux data.
Handle class for reading a decoration on an object.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Handle class for adding a decoration to an object.
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
STL class.
@ PileUp
Pile-up vertex.
@ PriVtx
Primary vertex.
Jet_v1 Jet
Definition of the current "jet version".
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Vertex_v1 Vertex
Define the latest version of the vertex class.
JetContainer_v1 JetContainer
Definition of the current "jet container version".