ATLAS Offline Software
Loading...
Searching...
No Matches
TauTrackRNNClassifier.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
7
10
14
15#include <fstream>
16
17using namespace tauRecTools;
18
19//==============================================================================
20// class TauTrackRNNClassifier
21//==============================================================================
22
23//______________________________________________________________________________
25 : TauRecToolBase(name) {
26}
27
28//______________________________________________________________________________
32
33//______________________________________________________________________________
35{
36 for (const auto& classifier : m_vClassifier){
37 ATH_MSG_INFO("Intialize TauTrackRNNClassifier tool : " << classifier );
38 ATH_CHECK(classifier.retrieve());
39 }
40
41 ATH_CHECK( m_vertexContainerKey.initialize() );
42
43 return StatusCode::SUCCESS;
44}
45
46
47//______________________________________________________________________________
49 const EventContext& ctx,
50 xAOD::TauTrackContainer& tauTrackCon) const {
51
53 if (!vertexInHandle.isValid()) {
54 ATH_MSG_ERROR ("Could not retrieve HiveDataObj with key " << vertexInHandle.key());
55 return StatusCode::FAILURE;
56 }
57 const xAOD::VertexContainer* vertexContainer = vertexInHandle.cptr();
58
59 std::vector<xAOD::TauTrack*> vTracks = xAOD::TauHelpers::allTauTracksNonConst(&xTau, &tauTrackCon);
60
61 for (xAOD::TauTrack* xTrack : vTracks) {
62 // reset all track flags and set status to unclassified
63 xTrack->setFlag(xAOD::TauJetParameters::classifiedCharged, false);
65 xTrack->setFlag(xAOD::TauJetParameters::classifiedIsolation, false);
66 xTrack->setFlag(xAOD::TauJetParameters::classifiedFake, false);
67 xTrack->setFlag(xAOD::TauJetParameters::unclassified, true);
68 }
69
70 // Collect the associated tracks from TauTrackFinder and either classify
71 // with dedicated TC or not at all
72 if (!m_classifyLRT) {
73 std::vector<xAOD::TauTrack*> vLRTs;
74 std::vector<xAOD::TauTrack*>::iterator it = vTracks.begin();
75 while(it != vTracks.end()) {
77 vLRTs.push_back(*it);
78 it = vTracks.erase(it);
79 }
80 else {
81 ++it;
82 }
83 }
84
85 // decorate LRTs with default RNN scores
86 for (auto classifier : m_vClassifier) {
87 ATH_CHECK(classifier->classifyTracks(vLRTs, xTau, vertexContainer, tauTrackCon, true));
88 }
89 }
90
91 // With this options, RNN track classifier will only be applied to tracks passing the track quality
92 // requirements currently settled in the TauTrack association step. This option is currently applied only
93 // for Run4 sample production, since towards we might skip completely the track association step and just
94 // use the tracks passing the quality requirements without caring about if the track is in the core
95 // region or in the isolation region
97 std::vector<xAOD::TauTrack*> excludedBadTracks;
98 std::vector<xAOD::TauTrack*>::iterator it = vTracks.begin();
99 while(it != vTracks.end()) {
100 if(!((*it)->flag(xAOD::TauJetParameters::passTrkSelector))){
101 excludedBadTracks.push_back(*it);
102 it = vTracks.erase(it);
103 } else {
104 ++it;
105 }
106 }
107 // decorate excludedTracks with default RNN scores
108 for (auto classifier : m_vClassifier) {
109 ATH_CHECK(classifier->classifyTracks(excludedBadTracks, xTau, vertexContainer, tauTrackCon, true));
110 }
111 }
112
113 // With this options, RNN track classifier will only be applied to a unique set of tracks
114 // without any duplication between different taus (see the dedicated protection in the TauTrackFinder).
115 // This option is currently NOT applied as default, since this will change AODs in R22+ reconstruction
116 // and also can lead to reconstruction inefficiency when compared to current reconstruction.
117 // Put here as this can used for Run4 studies
119 std::vector<xAOD::TauTrack*> excludedTracks;
120 std::vector<xAOD::TauTrack*>::iterator it = vTracks.begin();
121 while(it != vTracks.end()) {
123
124 excludedTracks.push_back(*it);
125 it = vTracks.erase(it);
126 }
127 else {
128 ++it;
129 }
130 }
131 // decorate excludedTracks with default RNN scores
132 for (auto classifier : m_vClassifier) {
133 ATH_CHECK(classifier->classifyTracks(excludedTracks, xTau, vertexContainer, tauTrackCon, true));
134 }
135 }
136
137 // classify tracks
139 ATH_CHECK(classifyLRTTracks(vTracks, xTau));
140 } else {
141 for (auto classifier : m_vClassifier) {
142 ATH_CHECK(classifier->classifyTracks(vTracks, xTau, vertexContainer, tauTrackCon));
143 }
144 }
145
146 std::vector< ElementLink< xAOD::TauTrackContainer > >& tauTrackLinks(xTau.allTauTrackLinksNonConst());
147 std::sort(tauTrackLinks.begin(), tauTrackLinks.end(), sortTracks);
148 float charge=0.0;
150 charge += trk->track()->charge();
151 }
152 xTau.setCharge(charge);
153 xTau.setDetail(xAOD::TauJetParameters::nChargedTracks, static_cast<int>(xTau.nTracks()));
155
156 // decorations for now, may be turned into Aux
157 static const SG::Accessor<int> nTrkConv("nConversionTracks");
158 static const SG::Accessor<int> nTrkFake("nFakeTracks");
159 nTrkConv(xTau) = static_cast<int>(xTau.nTracks(xAOD::TauJetParameters::classifiedConversion));
160 nTrkFake(xTau) = static_cast<int>(xTau.nTracks(xAOD::TauJetParameters::classifiedFake));
161
162 //set modifiedIsolationTrack
163 for (xAOD::TauTrack* xTrack : vTracks) {
166 }
167 else {
169 }
170 }
172
173 return StatusCode::SUCCESS;
174}
175
176//______________________________________________________________________________
177
178StatusCode TauTrackRNNClassifier::classifyLRTTracks(std::vector<xAOD::TauTrack*>& vTracks, xAOD::TauJet& xTau) const {
179 static const SG::Accessor<float> idScoreCharged("rnn_chargedScore");
180 static const SG::Accessor<float> idScoreIso("rnn_isolationScore");
181 static const SG::Accessor<float> idScoreConv("rnn_conversionScore");
182 static const SG::Accessor<float> idScoreFake("rnn_fakeScore");
183 for(xAOD::TauTrack* xTrack : vTracks) {
184 idScoreCharged(*xTrack) = 0.;
185 idScoreConv(*xTrack) = 0.;
186 idScoreIso(*xTrack) = 0.;
187 idScoreFake(*xTrack) = 0.;
188
189 double d0_weight = (xTrack->d0TJVA() ? xTrack->d0SigTJVA() / xTrack->d0TJVA(): 0);
190 double log10_pt_ratio = std::log10(xTrack->pt() / xTau.ptJetSeed());
191 double log10_abs_d0_sig = std::log10(std::abs(xTrack->d0SigTJVA()));
192 double dR = xTau.p4().DeltaR(xTrack->p4());
193 double log10_rConv = std::log10(xTrack->rConv());
194
195 // Cut values taken from a trained decision tree classifier
196 bool passed = false;
197 if (dR <= 0.20) {
198 if (d0_weight <= 33.61) {
199 // Captures high d0 tracks
200 if (log10_pt_ratio >= -1.40 && log10_abs_d0_sig >= 2.0) {
201 passed = true;
202 }
203 } else {
204 if (log10_pt_ratio >= -1.40 || log10_rConv >= 1.49) {
205 passed = true;
206 }
207 }
208 }
209
210 if (passed) {
211 xTrack->setFlag(xAOD::TauJetParameters::classifiedCharged, true);
212 xTrack->setFlag(xAOD::TauJetParameters::classifiedFake, false);
213 } else {
214 xTrack->setFlag(xAOD::TauJetParameters::classifiedCharged, false);
215 xTrack->setFlag(xAOD::TauJetParameters::classifiedFake, true);
216 }
217 xTrack->setFlag(xAOD::TauJetParameters::classifiedConversion, false);
218 xTrack->setFlag(xAOD::TauJetParameters::classifiedIsolation, false);
219 xTrack->setFlag(xAOD::TauJetParameters::unclassified, false);
220 }
221 return StatusCode::SUCCESS;
222}
223
224//==============================================================================
225// class TrackRNN
226//==============================================================================
227
228//______________________________________________________________________________
229TrackRNN::TrackRNN(const std::string& name)
230 : TauRecToolBase(name)
231{
232}
233
234//______________________________________________________________________________
238
239//______________________________________________________________________________
241{
242 std::string inputWeightsPath = find_file(m_inputWeightsPath);
243 ATH_MSG_INFO("Using calibration file: " << inputWeightsPath);
244
245 std::ifstream nn_config_istream(inputWeightsPath);
246
247 lwtDev::GraphConfig NNconfig = lwtDev::parse_json_graph(nn_config_istream);
248
249 m_RNNClassifier = std::make_unique<lwtDev::LightweightGraph>(NNconfig, NNconfig.outputs.begin()->first);
250 if(!m_RNNClassifier) {
251 ATH_MSG_FATAL("Couldn't configure neural network!");
252 return StatusCode::FAILURE;
253 }
254
255 return StatusCode::SUCCESS;
256}
257
258//______________________________________________________________________________
259StatusCode TrackRNN::classifyTracks(std::vector<xAOD::TauTrack*>& vTracks,
260 xAOD::TauJet& xTau,
261 const xAOD::VertexContainer* vertexContainer,
262 const xAOD::TauTrackContainer& tauTrackCon,
263 bool skipTracks) const
264{
265 if(vTracks.empty()) {
266 return StatusCode::SUCCESS;
267 }
268
269 static const SG::Accessor<float> idScoreCharged("rnn_chargedScore");
270 static const SG::Accessor<float> idScoreIso("rnn_isolationScore");
271 static const SG::Accessor<float> idScoreConv("rnn_conversionScore");
272 static const SG::Accessor<float> idScoreFake("rnn_fakeScore");
273
274 // don't classify tracks, set default decorations
275 if(skipTracks) {
276 for(xAOD::TauTrack* track : vTracks) {
277 idScoreCharged(*track) = 0.;
278 idScoreConv(*track) = 0.;
279 idScoreIso(*track) = 0.;
280 idScoreFake(*track) = 0.;
281 }
282 return StatusCode::SUCCESS;
283 }
284
285 std::sort(vTracks.begin(), vTracks.end(), [](const xAOD::TauTrack * a, const xAOD::TauTrack * b) {return a->pt() > b->pt();});
286
287 VectorMap valueMap;
288 ATH_CHECK(calculateVars(vTracks, xTau, vertexContainer, valueMap));
289
290 SeqNodeMap seqInput;
291 NodeMap nodeInput;
292
293 seqInput["input_1"] = std::move(valueMap);
294
295 VectorMap mValue = m_RNNClassifier->scan(nodeInput, seqInput, "time_distributed_2");
296
297 std::vector<double> vClassProb(5);
298
299 for (unsigned int i = 0; i < vTracks.size(); ++i){
300
301 if(i >= m_nMaxNtracks && m_nMaxNtracks > 0){
302 vClassProb[0] = 0.0;
303 vClassProb[1] = 0.0;
304 vClassProb[2] = 0.0;
305 vClassProb[3] = 0.0;
306 vClassProb[4] = 1.0;
307 }else{
308 vClassProb[0] = mValue["type_0"][i];
309 vClassProb[1] = mValue["type_1"][i];
310 vClassProb[2] = mValue["type_2"][i];
311 vClassProb[3] = mValue["type_3"][i];
312 vClassProb[4] = 0.0;
313 }
314
315 idScoreCharged(*vTracks[i]) = vClassProb[0];
316 idScoreConv(*vTracks[i]) = vClassProb[1];
317 idScoreIso(*vTracks[i]) = vClassProb[2];
318 idScoreFake(*vTracks[i]) = vClassProb[3];
319
320 int iMaxIndex = 0;
321 for (unsigned int j = 1; j < vClassProb.size(); ++j){
322 if(vClassProb[j] > vClassProb[iMaxIndex]) iMaxIndex = j;
323 }
324
325 if(iMaxIndex < 4) {
326 vTracks[i]->setFlag(xAOD::TauJetParameters::unclassified, false);
327 }
328
329 if(iMaxIndex == 3){
330 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedFake, true);
331 }else if(iMaxIndex == 0){
332 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedCharged, true);
333 }else if(iMaxIndex == 1){
334 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedConversion, true);
335 }else if(iMaxIndex == 2){
336 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedIsolation, true);
337 }
338 }
339
341 bool alreadyUsed = false;
342 for (unsigned int i = 0; i < vTracks.size(); ++i){
343 alreadyUsed = false;
344 //loop over all up-to-now charged tracks
345 for( const xAOD::TauTrack* tau_trk : tauTrackCon ) {
346 if(!(vTracks[i]->flag(xAOD::TauJetParameters::TauTrackFlag::classifiedCharged))) continue;
347 if( vTracks[i]->track() == tau_trk->track()) alreadyUsed = true;
348 }
349 //if this track has already been used by another tau, don't consider
350 if (alreadyUsed) {
351 ATH_MSG_INFO( "Found Already Used charged track new, now putting it as unclassified" );
352 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedCharged, false);
354 } else {
355 ++i;
356 }
357 }
358 }
359
360
361 return StatusCode::SUCCESS;
362}
363
364
365//______________________________________________________________________________
366StatusCode TrackRNN::calculateVars(const std::vector<xAOD::TauTrack*>& vTracks,
367 const xAOD::TauJet& xTau,
368 const xAOD::VertexContainer* vertexContainer,
369 tauRecTools::VectorMap& valueMap) const
370{
371 // initialize map with values
372 valueMap.clear();
373 unsigned int n_timeSteps = vTracks.size();
374 if(m_nMaxNtracks > 0 && n_timeSteps > m_nMaxNtracks) {
375 n_timeSteps = m_nMaxNtracks;
376 }
377
378 valueMap["log(trackPt)"] = std::vector<double>(n_timeSteps);
379 valueMap["log(jetSeedPt)"] = std::vector<double>(n_timeSteps);
380 valueMap["trackPt/tauPtIntermediateAxis"] = std::vector<double>(n_timeSteps);
381 valueMap["trackEta"] = std::vector<double>(n_timeSteps);
382 valueMap["z0sinthetaTJVA"] = std::vector<double>(n_timeSteps);
383 valueMap["z0sinthetaSigTJVA"] = std::vector<double>(n_timeSteps);
384 valueMap["log(rConv)"] = std::vector<double>(n_timeSteps);
385 valueMap["tanh(rConvII/500)"] = std::vector<double>(n_timeSteps);
386 valueMap["dRJetSeedAxis"] = std::vector<double>(n_timeSteps);
387 valueMap["dRIntermediateAxis"] = std::vector<double>(n_timeSteps);
388 valueMap["tanh(d0SigTJVA/10)"] = std::vector<double>(n_timeSteps);
389 valueMap["tanh(d0TJVA/10)"] = std::vector<double>(n_timeSteps);
390 valueMap["qOverP*1000"] = std::vector<double>(n_timeSteps);
391 valueMap["numberOfInnermostPixelLayerHits"] = std::vector<double>(n_timeSteps);
392 valueMap["numberOfPixelSharedHits"] = std::vector<double>(n_timeSteps);
393 valueMap["numberOfSCTSharedHits"] = std::vector<double>(n_timeSteps);
394 valueMap["numberOfTRTHits"] = std::vector<double>(n_timeSteps);
395 valueMap["eProbabilityHT"] = std::vector<double>(n_timeSteps);
396 valueMap["nPixHits"] = std::vector<double>(n_timeSteps);
397 valueMap["nSCTHits"] = std::vector<double>(n_timeSteps);
398 valueMap["dz0_TV_PV0"] = std::vector<double>(n_timeSteps);
399 valueMap["log_sumpt_TV"] = std::vector<double>(n_timeSteps);
400 valueMap["log_sumpt2_TV"] = std::vector<double>(n_timeSteps);
401 valueMap["log_sumpt_PV0"] = std::vector<double>(n_timeSteps);
402 valueMap["log_sumpt2_PV0"] = std::vector<double>(n_timeSteps);
403 valueMap["charge"] = std::vector<double>(n_timeSteps);
404 // used by RNN track classifier for upgrade
405 valueMap["(trackPt/jetSeedPt)"] = std::vector<double>(n_timeSteps);
406 valueMap["numberOfInnermostPixelLayerEndcapHits"] = std::vector<double>(n_timeSteps);
407 valueMap["nSiHits"] = std::vector<double>(n_timeSteps);
408
409 // tau variable
410 double log_ptJetSeed = std::log( xTau.ptJetSeed() );
411
412 // vertex variables
413 double dz0_TV_PV0 = 0., sumpt_TV = 0., sumpt2_TV = 0., sumpt_PV0 = 0., sumpt2_PV0 = 0.;
414 if(vertexContainer != nullptr && !vertexContainer->empty() && xTau.vertex()!=nullptr) {
415 dz0_TV_PV0 = xTau.vertex()->z() - vertexContainer->at(0)->z();
416
417 // Some AODs reconstructed before 22.0.48 contain rare cases of tracks with only dead sensors instead of hits
418 // due to an edge case in the Si Hit definitions see e.g https://its.cern.ch/jira/browse/ATLIDTRKCP-395
419 // These could be used in the primary vertexing but then were thinned away by the TRT Standalone thinning
420 // this only checked for nHits < 4 rather than the TRT Standalone bit pattern specifically, removing these only dead sensor tracks
421 // we guard against this unresolved track link issue by counting and skipping invalid links
422 // should be extremely rare, but prevents crashes
423 unsigned int nUnresolved = 0;
424 for (const ElementLink<xAOD::TrackParticleContainer>& trk : vertexContainer->at(0)->trackParticleLinks()) {
425 if (!trk.isValid()) { ++nUnresolved; continue; }
426 sumpt_PV0 += (*trk)->pt();
427 sumpt2_PV0 += pow((*trk)->pt(), 2.);
428 }
430 if (!trk.isValid()) { ++nUnresolved; continue; }
431 sumpt_TV += (*trk)->pt();
432 sumpt2_TV += pow((*trk)->pt(), 2.);
433 }
434 if (nUnresolved > 0) {
435 ATH_MSG_WARNING(nUnresolved << " unresolvable track link(s) on the primary or tau "
436 << "vertex skipped: log_sumpt_PV0 / log_sumpt_TV inputs of "
437 << "the track RNN computed from remaining tracks");
438 }
439 }
440 //these are false positives
441 //cppcheck-suppress invalidFunctionArg
442 double log_sumpt_TV = (sumpt_TV>0.) ? std::log(sumpt_TV) : 0.;
443 //cppcheck-suppress invalidFunctionArg
444 double log_sumpt2_TV = (sumpt2_TV>0.) ? std::log(sumpt2_TV) : 0.;
445 //cppcheck-suppress invalidFunctionArg
446 double log_sumpt_PV0 = (sumpt_PV0>0.) ? std::log(sumpt_PV0) : 0.;
447 //cppcheck-suppress invalidFunctionArg
448 double log_sumpt2_PV0 = (sumpt2_PV0>0.) ? std::log(sumpt2_PV0) : 0.;
449
450 // track variables
451 unsigned int i = 0;
452
453 for(xAOD::TauTrack* xTrack : vTracks)
454 {
455 const xAOD::TrackParticle* xTrackParticle = xTrack->track();
456
457 uint8_t numberOfInnermostPixelLayerHits = 0; ATH_CHECK( xTrackParticle->summaryValue(numberOfInnermostPixelLayerHits, xAOD::numberOfInnermostPixelLayerHits) );
458 uint8_t nPixelHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nPixelHits, xAOD::numberOfPixelHits) );
459 uint8_t nPixelSharedHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nPixelSharedHits, xAOD::numberOfPixelSharedHits) );
460 uint8_t nPixelDeadSensors = 0; ATH_CHECK( xTrackParticle->summaryValue(nPixelDeadSensors, xAOD::numberOfPixelDeadSensors) );
461 uint8_t nSCTHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nSCTHits, xAOD::numberOfSCTHits) );
462 uint8_t nSCTSharedHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nSCTSharedHits, xAOD::numberOfSCTSharedHits) );
463 uint8_t nSCTDeadSensors = 0; ATH_CHECK( xTrackParticle->summaryValue(nSCTDeadSensors, xAOD::numberOfSCTDeadSensors) );
464 uint8_t nTRTHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nTRTHits, xAOD::numberOfTRTHits) );
465 float eProbabilityHT; ATH_CHECK( xTrackParticle->summaryValue( eProbabilityHT, xAOD::eProbabilityHT) );
466
467 // used by RNN track classifier for upgrade
468 uint8_t numberOfInnermostPixelLayerEndcapHits = 0;
469 uint8_t tmp_var = 0;
470 if(xTrackParticle->summaryValue(tmp_var, xAOD::numberOfInnermostPixelLayerEndcapHits) ){
471 numberOfInnermostPixelLayerEndcapHits = tmp_var;
472 }
473 uint8_t nSiHits = nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
474
475 valueMap["log(trackPt)"][i] = std::log( xTrackParticle->pt() );
476 valueMap["log(jetSeedPt)"][i] = log_ptJetSeed;
477 valueMap["trackPt/tauPtIntermediateAxis"][i] = xTrackParticle->pt()/xTau.ptIntermediateAxis();
478 valueMap["trackEta"][i] = xTrackParticle->eta();
479 valueMap["z0sinthetaTJVA"][i] = xTrack->z0sinthetaTJVA();
480 valueMap["z0sinthetaSigTJVA"][i] = xTrack->z0sinthetaSigTJVA();
481 valueMap["log(rConv)"][i] = std::log( xTrack->rConv() );
482 valueMap["tanh(rConvII/500)"][i] = std::tanh( xTrack->rConvII()/500. );
483 // there is no seed jets in AOD so dRJetSeedAxis wont work
484 valueMap["dRJetSeedAxis"][i] = xTrack->p4().DeltaR(xTau.p4(xAOD::TauJetParameters::JetSeed));
485 valueMap["dRIntermediateAxis"][i] = xTrack->p4().DeltaR( xTau.p4(xAOD::TauJetParameters::IntermediateAxis) );
486 valueMap["tanh(d0SigTJVA/10)"][i] = std::tanh( xTrack->d0SigTJVA()/10. );
487 valueMap["tanh(d0TJVA/10)"][i] = std::tanh( xTrack->d0TJVA()/10. );
488 valueMap["qOverP*1000"][i] = xTrackParticle->qOverP()*1000.;
489 valueMap["numberOfInnermostPixelLayerHits"][i] = numberOfInnermostPixelLayerHits;
490 valueMap["numberOfPixelSharedHits"][i] = nPixelSharedHits;
491 valueMap["numberOfSCTSharedHits"][i] = nSCTSharedHits;
492 valueMap["numberOfTRTHits"][i] = nTRTHits;
493 valueMap["eProbabilityHT"][i] = eProbabilityHT;
494 valueMap["nPixHits"][i] = nPixelHits + nPixelDeadSensors;
495 valueMap["nSCTHits"][i] = nSCTHits + nSCTDeadSensors;
496 valueMap["dz0_TV_PV0"][i] = dz0_TV_PV0;
497 valueMap["log_sumpt_TV"][i] = log_sumpt_TV;
498 valueMap["log_sumpt2_TV"][i] = log_sumpt2_TV;
499 valueMap["log_sumpt_PV0"][i] = log_sumpt_PV0;
500 valueMap["log_sumpt2_PV0"][i] = log_sumpt2_PV0;
501 valueMap["charge"][i] = xTrackParticle->charge();
502 // used by RNN track classifier for upgrade
503 valueMap["(trackPt/jetSeedPt)"][i] = xTrackParticle->pt()/xTau.ptJetSeed();
504 valueMap["numberOfInnermostPixelLayerEndcapHits"][i] = numberOfInnermostPixelLayerEndcapHits;
505 valueMap["nSiHits"][i] = nSiHits;
506
507 ++i;
508 if(m_nMaxNtracks > 0 && i >= m_nMaxNtracks) {
509 break;
510 }
511 }
512
513 return StatusCode::SUCCESS;
514}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
Handle class for reading from StoreGate.
double charge(const T &p)
Definition AtlasPID.h:1003
bool passed(DecisionID id, const DecisionIDContainer &)
checks if required decision ID is in the set of IDs in the container
static Double_t a
const T * at(size_type n) const
Access an element, as an rvalue.
bool empty() const noexcept
Returns true if the collection is empty.
Helper class to provide type-safe access to aux data.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
The base class for all tau tools.
TauRecToolBase(const std::string &name)
std::string find_file(const std::string &fname) const
ToolHandleArray< TrackRNN > m_vClassifier
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexContainerKey
TauTrackRNNClassifier(const std::string &name="TauTrackRNNClassifier")
Gaudi::Property< bool > m_classifyLRTWithDedicated
virtual StatusCode initialize() override
Tool initializer.
virtual StatusCode executeTool(xAOD::TauJet &pTau, const EventContext &ctx, xAOD::TauTrackContainer &tauTrackContainer) const override
StatusCode classifyLRTTracks(std::vector< xAOD::TauTrack * > &vTracks, xAOD::TauJet &xTau) const
Gaudi::Property< bool > m_classifyOnlyCoreTracks
Gaudi::Property< unsigned int > m_nMaxNtracks
Gaudi::Property< bool > m_removeDuplicateChargedTracks
virtual StatusCode initialize() override
Tool initializer.
Gaudi::Property< std::string > m_inputWeightsPath
StatusCode calculateVars(const std::vector< xAOD::TauTrack * > &vTracks, const xAOD::TauJet &xTau, const xAOD::VertexContainer *vertexContainer, VectorMap &valueMap) const
ASG_TOOL_CLASS2(TrackRNN, TauRecToolBase, ITauToolBase) public ~TrackRNN()
Create a proper constructor for Athena.
std::unique_ptr< lwtDev::LightweightGraph > m_RNNClassifier
StatusCode classifyTracks(std::vector< xAOD::TauTrack * > &vTracks, xAOD::TauJet &xTau, const xAOD::VertexContainer *vertexContainer, const xAOD::TauTrackContainer &tauTrackContainer, bool skipTracks=false) const
TauTrackLinks_t & allTauTrackLinksNonConst()
In order to sort track links.
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition TauJet_v3.cxx:96
void setCharge(float)
double ptIntermediateAxis() const
void setDetail(TauJetParameters::Detail detail, int value)
const Vertex * vertex() const
double ptJetSeed() const
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
std::vector< const TauTrack * > tracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
Get the v<const pointer> to a given tauTrack collection associated with this tau.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
float qOverP() const
Returns the parameter.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float charge() const
Returns the charge.
float z() const
Returns the z position.
const TrackParticleLinks_t & trackParticleLinks() const
Get all the particles associated with the vertex.
GraphConfig parse_json_graph(std::istream &json)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Implementation of a TrackClassifier based on an RNN.
Definition BDTHelper.cxx:12
std::map< std::string, std::vector< double > > VectorMap
bool sortTracks(const ElementLink< xAOD::TauTrackContainer > &l1, const ElementLink< xAOD::TauTrackContainer > &l2)
std::map< std::string, ValueMap > NodeMap
std::map< std::string, VectorMap > SeqNodeMap
std::vector< xAOD::TauTrack * > allTauTracksNonConst(const xAOD::TauJet *tau, xAOD::TauTrackContainer *trackCont)
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
TauTrack_v1 TauTrack
Definition of the current version.
Definition TauTrack.h:16
TauJet_v3 TauJet
Definition of the current "tau version".
Definition TauJet.h:17
TauTrackContainer_v1 TauTrackContainer
Definition of the current TauTrack container version.
@ numberOfInnermostPixelLayerEndcapHits
these are the hits in the 0th pixel layer endcap [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfSCTDeadSensors
number of dead SCT sensors crossed [unit8_t].
@ eProbabilityHT
Electron probability from High Threshold (HT) information [float].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
std::map< std::string, OutputNodeConfig > outputs