ATLAS Offline Software
Loading...
Searching...
No Matches
JetForwardJvtToolBDT.cxx
Go to the documentation of this file.
1
2/*
3 Copyright (C) 2002-2026 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 if (!m_mvfjvtThresh)[[unlikely]]{
66 ATH_MSG_ERROR("'m_mvfjvtThresh' is nullptr" );
67 return StatusCode::FAILURE;
68 }
69 m_mvfjvtThresh->SetDirectory(nullptr);
70 m_wpFileIn->Close();
71 }
72
73 // -- Setup the tagger
74 m_MVreader = std::make_unique< TMVA::Reader > ( "Silent" );
75 float fjvt,width,time,cllambda2,cletawidth,cle,cliso,clemprob;
76 m_MVreader->AddVariable( "fjvtdist", &fjvt );
77 m_MVreader->AddVariable( "Width_jet", &width );
78 m_MVreader->AddVariable( "timedist", &time );
79 m_MVreader->AddVariable( "jet_LeadingClusterSecondLambda", &cllambda2 );
80 m_MVreader->AddVariable( "cl_etaWidthLead", &cletawidth );
81 m_MVreader->AddVariable( "clsum_e", &cle );
82 m_MVreader->AddVariable( "cl_ISOLATIONsumE", &cliso );
83 m_MVreader->AddVariable( "cl_EM_PROBABILITYsumE", &clemprob );
84 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)));
85
86 // "passMVfJVT" flag
88 ATH_CHECK(m_outMVKey.initialize());
89
90 // Moments values
92 ATH_CHECK(m_mvfjvtKey.initialize());
93
98 m_cleKey = m_jetContainerName + "." + m_cleKey.key();
99
100 ATH_CHECK(m_cllambda2Key.initialize());
101 ATH_CHECK(m_clwidthKey.initialize());
102 ATH_CHECK(m_clisoKey.initialize());
103 ATH_CHECK(m_clemprobKey.initialize());
104 ATH_CHECK(m_cleKey.initialize());
105
111 m_lcleKey = m_jetContainerName + "." + m_lcleKey.key();
112
113 ATH_CHECK(m_lcllambda2Key.initialize());
114 ATH_CHECK(m_lcllambda2NTKey.initialize());
115 ATH_CHECK(m_lclwidthKey.initialize());
116 ATH_CHECK(m_lclisoKey.initialize());
117 ATH_CHECK(m_lclemprobKey.initialize());
118 ATH_CHECK(m_lcleKey.initialize());
119
120 ATH_CHECK(m_eventInfoKey.initialize());
121 ATH_CHECK(m_vertexContainerKey.initialize());
123 ATH_CHECK(m_trkMetKey.initialize());
124
125 // Truth information
126 m_isHSKey = m_jetContainerName + "." + m_isHSKey.key();
127 m_isPUKey = m_jetContainerName + "." + m_isPUKey.key();
128
129 ATH_CHECK(m_isHSKey.initialize());
130 ATH_CHECK(m_isPUKey.initialize());
131
132 return StatusCode::SUCCESS;
133}
134
135
136StatusCode JetForwardJvtToolBDT::decorate(const xAOD::JetContainer& jetCont) const {
137
138 // -- Retrieve PV index if not provided by user
139 //pvind = (m_pvind.value()==-1) ? getPV() : m_pvind;
140 int pvind = m_pvind.value();
141 if(pvind == -1) pvind = getPV();
142
143 ATH_MSG_DEBUG("In JetForwardJvtToolBDT::modify: PV index = " << pvind);
144 if( pvind == -1 ){
145 ATH_MSG_WARNING( "Something went wrong with the HS primary vertex identification." );
146 return StatusCode::FAILURE;
147 }
148
151
157 std::vector<TVector2> pileupMomenta;
158 for(const xAOD::Jet *jetF : jetCont) {
159
160 float mvfjvt = -2;
161 outMVHandle(*jetF) = 1;
162 cllambda2Handle(*jetF) = 0;
163 clwidthHandle(*jetF) = 0;
164 cleHandle(*jetF) = 0;
165 clisoHandle(*jetF) = 0;
166 clemprobHandle(*jetF) = 0;
167
168 // -- Get PU vertices momenta sums, then compute tagger value for forward jets
169 if ( forwardJet(jetF) ){
170 if( pileupMomenta.empty() ) {
171 pileupMomenta = calculateVertexMomenta(&jetCont, pvind);
172 if( pileupMomenta.empty() ) {
173 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." );
174 mvfjvtHandle(*jetF) = 0;
175 continue;
176 }
177 }
178 mvfjvt = getMVfJVT(jetF, pvind, pileupMomenta);
179 if(m_isAna) outMVHandle(*jetF) = passMVfJVT( mvfjvt, jetF->pt()/(GeV), fabs(jetF->eta()) );
180 mvfjvtHandle(*jetF) = mvfjvt;
181 }
182 }
183 return StatusCode::SUCCESS;
184
185}
186
187
188float JetForwardJvtToolBDT::getFJVT(const xAOD::Jet *jet, int pvind, const std::vector<TVector2>& pileupMomenta) const {
189
190 TVector2 fjet(-jet->pt()*cos(jet->phi()),-jet->pt()*sin(jet->phi()));
191 double fjvt = 0;
192 ATH_MSG_DEBUG("In JetForwardJvtToolBDT::getFJVT -----> Starting looping on vertices (pileupMomenta.size() = "<<pileupMomenta.size());
193 for (size_t pui = 0; pui < pileupMomenta.size(); pui++) {
194 if (pui!=(size_t)pvind){
195 double projection = pileupMomenta[pui]*fjet/fjet.Mod();
196 if (projection>fjvt) fjvt = projection;
197 }
198 }
199 return fjvt;
200}
201
202
203float JetForwardJvtToolBDT::getMVfJVT(const xAOD::Jet *jet, int pvind, const std::vector<TVector2>& pileupMomenta) const {
204
205 static const SG::ConstAccessor<float> MVfJVTAcc ("MVfJVT");
206 if(m_isAna && !m_getTagger) return MVfJVTAcc(*jet);
207
208 StatusCode sc = getInputs(jet);
209 if( sc.isFailure() ) {
210 ATH_MSG_WARNING(" Could not calculate BDT inputs");
211 return -2;
212 }
213
215 if ( !eventInfoHandle.isValid() ) {
216 ATH_MSG_WARNING(" xAOD::EventInfo " << m_eventInfoKey.key() << "is invalid");
217 return -2;
218 }
219 float mu = eventInfoHandle->actualInteractionsPerCrossing();
220
221 if (!forwardJet(jet)) return -2;
222
228
229 std::vector<float> MVinputs;
230 MVinputs.push_back( getFJVT(jet, pvind, pileupMomenta)/jet->pt() );
231 MVinputs.push_back( jet->getAttribute<float>("Width") );
232 MVinputs.push_back( jet->getAttribute<float>("Timing") );
233 MVinputs.push_back( cllambda2Handle(*jet) );
234 MVinputs.push_back( clwidthHandle(*jet) );
235 MVinputs.push_back( cleHandle(*jet) );
236 MVinputs.push_back( clisoHandle(*jet) );
237 MVinputs.push_back( clemprobHandle(*jet) );
238
239 float pt = jet->pt()/(GeV);
240 float eta = fabs(jet->eta());
241
242 float score = -2.;
243 // TMVA::Reader::EvaluateMVA isn't thread-safe.
244 TMVA::Reader& reader ATLAS_THREAD_SAFE = *m_MVreader;
245 static std::mutex mutex;
246 std::lock_guard lock (mutex);
247 if ( pt < 30. && pt >= 20. && eta >= 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_1" ,1.);
248 else if ( pt < 30. && pt >= 20. && eta < 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_2" ,1.);
249 else if ( pt < 40. && pt >= 30. && eta >= 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_3" ,1.);
250 else if ( pt < 40. && pt >= 30. && eta < 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_4" ,1.);
251 else if ( pt < 50. && pt >= 40. && eta >= 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_5" ,1.);
252 else if ( pt < 50. && pt >= 40. && eta < 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_6" ,1.);
253 else if ( pt < 120. && pt >= 50. && eta >= 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_7" ,1.);
254 else if ( pt < 120. && pt >= 50. && eta < 3.2 && mu>=50. ) score = reader.EvaluateMVA( MVinputs, "BDT_8" ,1.);
255 else if ( pt < 30. && pt >= 20. && eta >= 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_9" ,1.);
256 else if ( pt < 30. && pt >= 20. && eta < 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_10" ,1.);
257 else if ( pt < 40. && pt >= 30. && eta >= 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_11" ,1.);
258 else if ( pt < 40. && pt >= 30. && eta < 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_12" ,1.);
259 else if ( pt < 50. && pt >= 40. && eta >= 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_13" ,1.);
260 else if ( pt < 50. && pt >= 40. && eta < 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_14" ,1.);
261 else if ( pt < 120. && pt >= 50. && eta >= 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_15" ,1.);
262 else if ( pt < 120. && pt >= 50. && eta < 3.2 && mu<50. ) score = reader.EvaluateMVA( MVinputs, "BDT_16" ,1.);
263
264 ATH_MSG_DEBUG("pt = " << pt << " | eta = " << eta << " | mu = " << mu << " || MVfJVT = " << score );
265
266 return score;
267}
268
269bool JetForwardJvtToolBDT::passMVfJVT( float mvfjvt, float pt, float eta ) const {
270
271 double mvfjvtThresh = -999.;
272
274 if ( !eventInfoHandle.isValid() ) {
275 ATH_MSG_WARNING(" xAOD::EventInfo " << m_eventInfoKey.key() << "is invalid");
276 return true;
277 }
278
279 float mu = eventInfoHandle->actualInteractionsPerCrossing();
280
281 // -- Grab WP from histogram
282 mvfjvtThresh = m_mvfjvtThresh->GetBinContent(m_mvfjvtThresh->GetXaxis()->FindBin(pt),
283 m_mvfjvtThresh->GetYaxis()->FindBin(eta),
284 m_mvfjvtThresh->GetZaxis()->FindBin(mu));
285
286 return mvfjvt==-2 || mvfjvt>mvfjvtThresh;
287
288}
289
296
297 if(!m_getTagger){
299 cllambda2Handle(*jet) = lcllambda2NTHandle(*jet);
300
301 // -- Additional variables computed from cluster information
303 if( !clustersHandle.isValid() ) {
304 ATH_MSG_ERROR(" xAOD::CaloClusterContainer " << m_caloClusterContainerKey.key() << "is invalid");
305 return StatusCode::FAILURE;
306 }
307
308 int ind = 0;
309 float maxpt = 0;
310 float cle1 = 0;
311 float cliso1 = 0;
312 float clemprob1 = 0;
313 float cle2 = 0;
314
315 // Loop over clusters within DeltaR<0.6 of the jet axis to compute the (energy-weighted) moment sums used in the BDT definitions
316 static const SG::ConstAccessor<float> ISOLATIONAcc ("ISOLATION");
317 static const SG::ConstAccessor<float> EM_PROBABILITYAcc ("EM_PROBABILITY");
318 for (const xAOD::CaloCluster *cl: *clustersHandle) {
319 if(cl->p4().DeltaR(jet->p4())>0.6) continue;
320 cle1 += cl->e();
321 cle2 += cl->e()*cl->e();
322 cliso1 += ISOLATIONAcc(*cl)*cl->e()*cl->e();
323 clemprob1 += EM_PROBABILITYAcc(*cl)*cl->e()*cl->e();
324 if(cl->rawE()/cosh(cl->rawEta()) > maxpt){
325 maxpt = cl->rawE()/cosh(cl->rawEta());
326 ind = cl->index();
327 }
328 }
329 const xAOD::CaloCluster *cl = clustersHandle->at(ind);
330 static const SG::ConstAccessor<float> SECOND_RAcc ("SECOND_R");
331 static const SG::ConstAccessor<float> CENTER_MAGAcc ("CENTER_MAG");
332 clwidthHandle(*jet) = TMath::CosH(cl->rawEta()) * TMath::ATan2( TMath::Sqrt(SECOND_RAcc(*cl)),
333 CENTER_MAGAcc(*cl));
334
335 cleHandle(*jet) = cle1;
336 if (cle2 == 0.f)[[unlikely]]{
337 ATH_MSG_ERROR("JetForwardJvtToolBDT::getMVfJVT: divide by zero.");
338 return StatusCode::FAILURE;
339 }
340 clisoHandle(*jet)= cliso1/cle2;
341 clemprobHandle(*jet) =clemprob1/cle2;
342
343 } else {
349
350 cllambda2Handle(*jet) = lcllambda2Handle(*jet);
351 clwidthHandle(*jet) = lclwidthHandle(*jet);
352 clisoHandle(*jet) = lclisoHandle(*jet);
353 clemprobHandle(*jet) = lclemprobHandle(*jet);
354 cleHandle(*jet) = lcleHandle(*jet);
355 }
356 return StatusCode::SUCCESS;
357}
358
359std::vector<TVector2> JetForwardJvtToolBDT::calculateVertexMomenta(const xAOD::JetContainer *jets, int pvind) const {
360
361 std::vector<TVector2> pileupMomenta;
362
364 if( !trkMetHandle.isValid() ) {
365 ATH_MSG_WARNING(" xAOD::MissingETContainer " << m_trkMetKey.key() << "is invalid");
366 return pileupMomenta;
367 }
369 if( !vxContHandle.isValid() ) {
370 ATH_MSG_WARNING(" xAOD::VertexContainer " << m_vertexContainerKey.key() << "is invalid");
371 return pileupMomenta;
372 }
373 ATH_MSG_DEBUG("In JetForwardJvtToolBDT::calculateVertexMomenta : Starting vertex loop ");
374 for(const xAOD::Vertex *vx : *vxContHandle) {
375 ATH_MSG_DEBUG(" --> VertexType="<<vx->vertexType());
376 if(vx->vertexType()!=xAOD::VxType::PriVtx && vx->vertexType()!=xAOD::VxType::PileUp) continue;
377 TString vname = "PVTrack_vx";
378 vname += vx->index();
379 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()));
380 }
381 for (const xAOD::Jet *jet : *jets) {
382 if (!centralJet(jet)) continue;
383 int jetvert = getJetVertex(jet);
384 if (jetvert>=0) pileupMomenta[jetvert] += TVector2(0.5*jet->pt()*cos(jet->phi()),0.5*jet->pt()*sin(jet->phi()));
385 }
386
387 return pileupMomenta;
388}
389
391
392 if (fabs(jet->eta())<m_etaThresh) return false;
393 if (jet->pt()<m_forwardMinPt || jet->pt()>m_forwardMaxPt) return false;
394 return true;
395}
396
398
399 if (fabs(jet->eta())>m_etaThresh) return false;
400 if (jet->pt()<m_centerMinPt || (m_centerMaxPt>0 && jet->pt()>m_centerMaxPt)) return false;
401 float jvt = 0;
402 jet->getAttribute<float>(m_jvtMomentName,jvt);
403 if (jvt>m_centerJvtThresh) return false;
404 if (jet->pt()<m_maxStochPt && getDrpt(jet)<m_centerDrptThresh) return false;
405 return true;
406}
407
409
410 std::vector<float> sumpts;
411 jet->getAttribute<std::vector<float> >("SumPtTrkPt500",sumpts);
412 double firstVal = 0;
413 int bestMatch = -1;
414 for (size_t i = 0; i < sumpts.size(); i++) {
415 if (sumpts[i]>firstVal) {
416 bestMatch = i;
417 firstVal = sumpts[i];
418 }
419 }
420 return bestMatch;
421}
422
424
425 std::vector<float> sumpts;
426 jet->getAttribute<std::vector<float> >("SumPtTrkPt500",sumpts);
427 if (sumpts.size()<2) return 0;
428
429 std::nth_element(sumpts.begin(),sumpts.begin()+sumpts.size()/2,sumpts.end(),std::greater<int>());
430 double median = sumpts[sumpts.size()/2];
431 std::nth_element(sumpts.begin(),sumpts.begin(),sumpts.end(),std::greater<int>());
432 double max = sumpts[0];
433 return (max-median)/jet->pt();
434}
435
437
439 if( !vxContHandle.isValid() ) {
440 ATH_MSG_WARNING(" xAOD::VertexContainer " << m_vertexContainerKey.key() << "is invalid");
441 return 0;
442 } else {
443 ATH_MSG_DEBUG("Successfully retrieved primary vertex container");
444 for(const xAOD::Vertex *vx : *vxContHandle) {
445 if(vx->vertexType()==xAOD::VxType::PriVtx) return vx->index();
446 }
447 }
448 ATH_MSG_DEBUG("Couldn't identify the hard-scatter primary vertex (no vertex with \"vx->vertexType()==xAOD::VxType::PriVtx\" in the container)!");
449 return 0;
450}
451
455
456 for(const xAOD::Jet *jet : *jets) {
457 bool ishs = false;
458 bool ispu = true;
459 for(const xAOD::Jet *tjet : *truthJets) {
460 if (tjet->p4().DeltaR(jet->p4())<0.3 && tjet->pt()>10e3) ishs = true;
461 if (tjet->p4().DeltaR(jet->p4())<0.6) ispu = false;
462 }
463 isHSHandle(*jet)=ishs;
464 isPUHandle(*jet)=ispu;
465 }
466 return StatusCode::SUCCESS;
467}
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.
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
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".
#define unlikely(x)