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
51 if (!vertexInHandle.isValid()) {
52 ATH_MSG_ERROR ("Could not retrieve HiveDataObj with key " << vertexInHandle.key());
53 return StatusCode::FAILURE;
54 }
55 const xAOD::VertexContainer* vertexContainer = vertexInHandle.cptr();
56
57 std::vector<xAOD::TauTrack*> vTracks = xAOD::TauHelpers::allTauTracksNonConst(&xTau, &tauTrackCon);
58
59 for (xAOD::TauTrack* xTrack : vTracks) {
60 // reset all track flags and set status to unclassified
61 xTrack->setFlag(xAOD::TauJetParameters::classifiedCharged, false);
63 xTrack->setFlag(xAOD::TauJetParameters::classifiedIsolation, false);
64 xTrack->setFlag(xAOD::TauJetParameters::classifiedFake, false);
65 xTrack->setFlag(xAOD::TauJetParameters::unclassified, true);
66 }
67
68 // Collect the associated tracks from TauTrackFinder and either classify
69 // with dedicated TC or not at all
70 if (!m_classifyLRT) {
71 std::vector<xAOD::TauTrack*> vLRTs;
72 std::vector<xAOD::TauTrack*>::iterator it = vTracks.begin();
73 while(it != vTracks.end()) {
75 vLRTs.push_back(*it);
76 it = vTracks.erase(it);
77 }
78 else {
79 ++it;
80 }
81 }
82
83 // decorate LRTs with default RNN scores
84 for (auto classifier : m_vClassifier) {
85 ATH_CHECK(classifier->classifyTracks(vLRTs, xTau, vertexContainer, tauTrackCon, true));
86 }
87 }
88
89 // With this options, RNN track classifier will only be applied to tracks passing the track quality
90 // requirements currently settled in the TauTrack association step. This option is currently applied only
91 // for Run4 sample production, since towards we might skip completely the track association step and just
92 // use the tracks passing the quality requirements without caring about if the track is in the core
93 // region or in the isolation region
95 std::vector<xAOD::TauTrack*> excludedBadTracks;
96 std::vector<xAOD::TauTrack*>::iterator it = vTracks.begin();
97 while(it != vTracks.end()) {
99 excludedBadTracks.push_back(*it);
100 it = vTracks.erase(it);
101 } else {
102 ++it;
103 }
104 }
105 // decorate excludedTracks with default RNN scores
106 for (auto classifier : m_vClassifier) {
107 ATH_CHECK(classifier->classifyTracks(excludedBadTracks, xTau, vertexContainer, tauTrackCon, true));
108 }
109 }
110
111 // With this options, RNN track classifier will only be applied to a unique set of tracks
112 // without any duplication between different taus (see the dedicated protection in the TauTrackFinder).
113 // This option is currently NOT applied as default, since this will change AODs in R22+ reconstruction
114 // and also can lead to reconstruction inefficiency when compared to current reconstruction.
115 // Put here as this can used for Run4 studies
117 std::vector<xAOD::TauTrack*> excludedTracks;
118 std::vector<xAOD::TauTrack*>::iterator it = vTracks.begin();
119 while(it != vTracks.end()) {
121
122 excludedTracks.push_back(*it);
123 it = vTracks.erase(it);
124 }
125 else {
126 ++it;
127 }
128 }
129 // decorate excludedTracks with default RNN scores
130 for (auto classifier : m_vClassifier) {
131 ATH_CHECK(classifier->classifyTracks(excludedTracks, xTau, vertexContainer, tauTrackCon, true));
132 }
133 }
134
135 // classify tracks
137 ATH_CHECK(classifyLRTTracks(vTracks, xTau));
138 } else {
139 for (auto classifier : m_vClassifier) {
140 ATH_CHECK(classifier->classifyTracks(vTracks, xTau, vertexContainer, tauTrackCon));
141 }
142 }
143
144 std::vector< ElementLink< xAOD::TauTrackContainer > >& tauTrackLinks(xTau.allTauTrackLinksNonConst());
145 std::sort(tauTrackLinks.begin(), tauTrackLinks.end(), sortTracks);
146 float charge=0.0;
148 charge += trk->track()->charge();
149 }
150 xTau.setCharge(charge);
151 xTau.setDetail(xAOD::TauJetParameters::nChargedTracks, static_cast<int>(xTau.nTracks()));
153
154 // decorations for now, may be turned into Aux
155 static const SG::Accessor<int> nTrkConv("nConversionTracks");
156 static const SG::Accessor<int> nTrkFake("nFakeTracks");
157 nTrkConv(xTau) = static_cast<int>(xTau.nTracks(xAOD::TauJetParameters::classifiedConversion));
158 nTrkFake(xTau) = static_cast<int>(xTau.nTracks(xAOD::TauJetParameters::classifiedFake));
159
160 //set modifiedIsolationTrack
161 for (xAOD::TauTrack* xTrack : vTracks) {
164 }
165 else {
167 }
168 }
170
171 return StatusCode::SUCCESS;
172}
173
174//______________________________________________________________________________
175
176StatusCode TauTrackRNNClassifier::classifyLRTTracks(std::vector<xAOD::TauTrack*>& vTracks, xAOD::TauJet& xTau) const {
177 static const SG::Accessor<float> idScoreCharged("rnn_chargedScore");
178 static const SG::Accessor<float> idScoreIso("rnn_isolationScore");
179 static const SG::Accessor<float> idScoreConv("rnn_conversionScore");
180 static const SG::Accessor<float> idScoreFake("rnn_fakeScore");
181 for(xAOD::TauTrack* xTrack : vTracks) {
182 idScoreCharged(*xTrack) = 0.;
183 idScoreConv(*xTrack) = 0.;
184 idScoreIso(*xTrack) = 0.;
185 idScoreFake(*xTrack) = 0.;
186
187 double dR = xTau.p4().DeltaR(xTrack->p4());
188
189 float weight = (xTrack->d0TJVA() ? xTrack->d0SigTJVA() / xTrack->d0TJVA(): 0);
190
191 // Cut values taken from a cut optimisation study
192 bool passed = (xTrack->pt() > 1000.0) && (dR < 0.2) && (weight > 40.);
193
194 ANA_MSG_DEBUG("xTrack: " << xTrack->pt() << " dR: " << dR << " weight: " << weight << " passed: " << passed);
195
196 if (passed) {
197 xTrack->setFlag(xAOD::TauJetParameters::classifiedCharged, true);
198 xTrack->setFlag(xAOD::TauJetParameters::classifiedFake, false);
199 } else {
200 xTrack->setFlag(xAOD::TauJetParameters::classifiedCharged, false);
201 xTrack->setFlag(xAOD::TauJetParameters::classifiedFake, true);
202 }
203 xTrack->setFlag(xAOD::TauJetParameters::classifiedConversion, false);
204 xTrack->setFlag(xAOD::TauJetParameters::classifiedIsolation, false);
205 xTrack->setFlag(xAOD::TauJetParameters::unclassified, false);
206 }
207 return StatusCode::SUCCESS;
208}
209
210//==============================================================================
211// class TrackRNN
212//==============================================================================
213
214//______________________________________________________________________________
215TrackRNN::TrackRNN(const std::string& name)
216 : TauRecToolBase(name)
217{
218}
219
220//______________________________________________________________________________
224
225//______________________________________________________________________________
227{
228 std::string inputWeightsPath = find_file(m_inputWeightsPath);
229 ATH_MSG_INFO("Using calibration file: " << inputWeightsPath);
230
231 std::ifstream nn_config_istream(inputWeightsPath);
232
233 lwtDev::GraphConfig NNconfig = lwtDev::parse_json_graph(nn_config_istream);
234
235 m_RNNClassifier = std::make_unique<lwtDev::LightweightGraph>(NNconfig, NNconfig.outputs.begin()->first);
236 if(!m_RNNClassifier) {
237 ATH_MSG_FATAL("Couldn't configure neural network!");
238 return StatusCode::FAILURE;
239 }
240
241 return StatusCode::SUCCESS;
242}
243
244//______________________________________________________________________________
245StatusCode TrackRNN::classifyTracks(std::vector<xAOD::TauTrack*>& vTracks,
246 xAOD::TauJet& xTau,
247 const xAOD::VertexContainer* vertexContainer,
248 const xAOD::TauTrackContainer& tauTrackCon,
249 bool skipTracks) const
250{
251 if(vTracks.empty()) {
252 return StatusCode::SUCCESS;
253 }
254
255 static const SG::Accessor<float> idScoreCharged("rnn_chargedScore");
256 static const SG::Accessor<float> idScoreIso("rnn_isolationScore");
257 static const SG::Accessor<float> idScoreConv("rnn_conversionScore");
258 static const SG::Accessor<float> idScoreFake("rnn_fakeScore");
259
260 // don't classify tracks, set default decorations
261 if(skipTracks) {
262 for(xAOD::TauTrack* track : vTracks) {
263 idScoreCharged(*track) = 0.;
264 idScoreConv(*track) = 0.;
265 idScoreIso(*track) = 0.;
266 idScoreFake(*track) = 0.;
267 }
268 return StatusCode::SUCCESS;
269 }
270
271 std::sort(vTracks.begin(), vTracks.end(), [](const xAOD::TauTrack * a, const xAOD::TauTrack * b) {return a->pt() > b->pt();});
272
273 VectorMap valueMap;
274 ATH_CHECK(calculateVars(vTracks, xTau, vertexContainer, valueMap));
275
276 SeqNodeMap seqInput;
277 NodeMap nodeInput;
278
279 seqInput["input_1"] = valueMap;
280
281 VectorMap mValue = m_RNNClassifier->scan(nodeInput, seqInput, "time_distributed_2");
282
283 std::vector<double> vClassProb(5);
284
285 for (unsigned int i = 0; i < vTracks.size(); ++i){
286
287 if(i >= m_nMaxNtracks && m_nMaxNtracks > 0){
288 vClassProb[0] = 0.0;
289 vClassProb[1] = 0.0;
290 vClassProb[2] = 0.0;
291 vClassProb[3] = 0.0;
292 vClassProb[4] = 1.0;
293 }else{
294 vClassProb[0] = mValue["type_0"][i];
295 vClassProb[1] = mValue["type_1"][i];
296 vClassProb[2] = mValue["type_2"][i];
297 vClassProb[3] = mValue["type_3"][i];
298 vClassProb[4] = 0.0;
299 }
300
301 idScoreCharged(*vTracks[i]) = vClassProb[0];
302 idScoreConv(*vTracks[i]) = vClassProb[1];
303 idScoreIso(*vTracks[i]) = vClassProb[2];
304 idScoreFake(*vTracks[i]) = vClassProb[3];
305
306 int iMaxIndex = 0;
307 for (unsigned int j = 1; j < vClassProb.size(); ++j){
308 if(vClassProb[j] > vClassProb[iMaxIndex]) iMaxIndex = j;
309 }
310
311 if(iMaxIndex < 4) {
312 vTracks[i]->setFlag(xAOD::TauJetParameters::unclassified, false);
313 }
314
315 if(iMaxIndex == 3){
316 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedFake, true);
317 }else if(iMaxIndex == 0){
318 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedCharged, true);
319 }else if(iMaxIndex == 1){
320 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedConversion, true);
321 }else if(iMaxIndex == 2){
322 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedIsolation, true);
323 }
324 }
325
327 bool alreadyUsed = false;
328 for (unsigned int i = 0; i < vTracks.size(); ++i){
329 alreadyUsed = false;
330 //loop over all up-to-now charged tracks
331 for( const xAOD::TauTrack* tau_trk : tauTrackCon ) {
332 if(!(vTracks[i]->flag(xAOD::TauJetParameters::TauTrackFlag::classifiedCharged))) continue;
333 if( vTracks[i]->track() == tau_trk->track()) alreadyUsed = true;
334 }
335 //if this track has already been used by another tau, don't consider
336 if (alreadyUsed) {
337 ATH_MSG_INFO( "Found Already Used charged track new, now putting it as unclassified" );
338 vTracks[i]->setFlag(xAOD::TauJetParameters::classifiedCharged, false);
340 } else {
341 ++i;
342 }
343 }
344 }
345
346
347 return StatusCode::SUCCESS;
348}
349
350
351//______________________________________________________________________________
352StatusCode TrackRNN::calculateVars(const std::vector<xAOD::TauTrack*>& vTracks,
353 const xAOD::TauJet& xTau,
354 const xAOD::VertexContainer* vertexContainer,
355 tauRecTools::VectorMap& valueMap) const
356{
357 // initialize map with values
358 valueMap.clear();
359 unsigned int n_timeSteps = vTracks.size();
360 if(m_nMaxNtracks > 0 && n_timeSteps > m_nMaxNtracks) {
361 n_timeSteps = m_nMaxNtracks;
362 }
363
364 valueMap["log(trackPt)"] = std::vector<double>(n_timeSteps);
365 valueMap["log(jetSeedPt)"] = std::vector<double>(n_timeSteps);
366 valueMap["trackPt/tauPtIntermediateAxis"] = std::vector<double>(n_timeSteps);
367 valueMap["trackEta"] = std::vector<double>(n_timeSteps);
368 valueMap["z0sinthetaTJVA"] = std::vector<double>(n_timeSteps);
369 valueMap["z0sinthetaSigTJVA"] = std::vector<double>(n_timeSteps);
370 valueMap["log(rConv)"] = std::vector<double>(n_timeSteps);
371 valueMap["tanh(rConvII/500)"] = std::vector<double>(n_timeSteps);
372 valueMap["dRJetSeedAxis"] = std::vector<double>(n_timeSteps);
373 valueMap["dRIntermediateAxis"] = std::vector<double>(n_timeSteps);
374 valueMap["tanh(d0SigTJVA/10)"] = std::vector<double>(n_timeSteps);
375 valueMap["tanh(d0TJVA/10)"] = std::vector<double>(n_timeSteps);
376 valueMap["qOverP*1000"] = std::vector<double>(n_timeSteps);
377 valueMap["numberOfInnermostPixelLayerHits"] = std::vector<double>(n_timeSteps);
378 valueMap["numberOfPixelSharedHits"] = std::vector<double>(n_timeSteps);
379 valueMap["numberOfSCTSharedHits"] = std::vector<double>(n_timeSteps);
380 valueMap["numberOfTRTHits"] = std::vector<double>(n_timeSteps);
381 valueMap["eProbabilityHT"] = std::vector<double>(n_timeSteps);
382 valueMap["nPixHits"] = std::vector<double>(n_timeSteps);
383 valueMap["nSCTHits"] = std::vector<double>(n_timeSteps);
384 valueMap["dz0_TV_PV0"] = std::vector<double>(n_timeSteps);
385 valueMap["log_sumpt_TV"] = std::vector<double>(n_timeSteps);
386 valueMap["log_sumpt2_TV"] = std::vector<double>(n_timeSteps);
387 valueMap["log_sumpt_PV0"] = std::vector<double>(n_timeSteps);
388 valueMap["log_sumpt2_PV0"] = std::vector<double>(n_timeSteps);
389 valueMap["charge"] = std::vector<double>(n_timeSteps);
390 // used by RNN track classifier for upgrade
391 valueMap["(trackPt/jetSeedPt)"] = std::vector<double>(n_timeSteps);
392 valueMap["numberOfInnermostPixelLayerEndcapHits"] = std::vector<double>(n_timeSteps);
393 valueMap["nSiHits"] = std::vector<double>(n_timeSteps);
394
395 // tau variable
396 double log_ptJetSeed = std::log( xTau.ptJetSeed() );
397
398 // vertex variables
399 double dz0_TV_PV0 = 0., sumpt_TV = 0., sumpt2_TV = 0., sumpt_PV0 = 0., sumpt2_PV0 = 0.;
400 if(vertexContainer != nullptr && !vertexContainer->empty() && xTau.vertex()!=nullptr) {
401 dz0_TV_PV0 = xTau.vertex()->z() - vertexContainer->at(0)->z();
402
403 for (const ElementLink<xAOD::TrackParticleContainer>& trk : vertexContainer->at(0)->trackParticleLinks()) {
404 sumpt_PV0 += (*trk)->pt();
405 sumpt2_PV0 += pow((*trk)->pt(), 2.);
406 }
408 sumpt_TV += (*trk)->pt();
409 sumpt2_TV += pow((*trk)->pt(), 2.);
410 }
411 }
412 //these are false positives
413 //cppcheck-suppress invalidFunctionArg
414 double log_sumpt_TV = (sumpt_TV>0.) ? std::log(sumpt_TV) : 0.;
415 //cppcheck-suppress invalidFunctionArg
416 double log_sumpt2_TV = (sumpt2_TV>0.) ? std::log(sumpt2_TV) : 0.;
417 //cppcheck-suppress invalidFunctionArg
418 double log_sumpt_PV0 = (sumpt_PV0>0.) ? std::log(sumpt_PV0) : 0.;
419 //cppcheck-suppress invalidFunctionArg
420 double log_sumpt2_PV0 = (sumpt2_PV0>0.) ? std::log(sumpt2_PV0) : 0.;
421
422 // track variables
423 unsigned int i = 0;
424
425 for(xAOD::TauTrack* xTrack : vTracks)
426 {
427 const xAOD::TrackParticle* xTrackParticle = xTrack->track();
428
429 uint8_t numberOfInnermostPixelLayerHits = 0; ATH_CHECK( xTrackParticle->summaryValue(numberOfInnermostPixelLayerHits, xAOD::numberOfInnermostPixelLayerHits) );
430 uint8_t nPixelHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nPixelHits, xAOD::numberOfPixelHits) );
431 uint8_t nPixelSharedHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nPixelSharedHits, xAOD::numberOfPixelSharedHits) );
432 uint8_t nPixelDeadSensors = 0; ATH_CHECK( xTrackParticle->summaryValue(nPixelDeadSensors, xAOD::numberOfPixelDeadSensors) );
433 uint8_t nSCTHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nSCTHits, xAOD::numberOfSCTHits) );
434 uint8_t nSCTSharedHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nSCTSharedHits, xAOD::numberOfSCTSharedHits) );
435 uint8_t nSCTDeadSensors = 0; ATH_CHECK( xTrackParticle->summaryValue(nSCTDeadSensors, xAOD::numberOfSCTDeadSensors) );
436 uint8_t nTRTHits = 0; ATH_CHECK( xTrackParticle->summaryValue(nTRTHits, xAOD::numberOfTRTHits) );
437 float eProbabilityHT; ATH_CHECK( xTrackParticle->summaryValue( eProbabilityHT, xAOD::eProbabilityHT) );
438
439 // used by RNN track classifier for upgrade
440 uint8_t numberOfInnermostPixelLayerEndcapHits = 0;
441 uint8_t tmp_var = 0;
442 if(xTrackParticle->summaryValue(tmp_var, xAOD::numberOfInnermostPixelLayerEndcapHits) ){
443 numberOfInnermostPixelLayerEndcapHits = tmp_var;
444 }
445 uint8_t nSiHits = nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
446
447 valueMap["log(trackPt)"][i] = std::log( xTrackParticle->pt() );
448 valueMap["log(jetSeedPt)"][i] = log_ptJetSeed;
449 valueMap["trackPt/tauPtIntermediateAxis"][i] = xTrackParticle->pt()/xTau.ptIntermediateAxis();
450 valueMap["trackEta"][i] = xTrackParticle->eta();
451 valueMap["z0sinthetaTJVA"][i] = xTrack->z0sinthetaTJVA();
452 valueMap["z0sinthetaSigTJVA"][i] = xTrack->z0sinthetaSigTJVA();
453 valueMap["log(rConv)"][i] = std::log( xTrack->rConv() );
454 valueMap["tanh(rConvII/500)"][i] = std::tanh( xTrack->rConvII()/500. );
455 // there is no seed jets in AOD so dRJetSeedAxis wont work
456 valueMap["dRJetSeedAxis"][i] = xTrack->p4().DeltaR(xTau.p4(xAOD::TauJetParameters::JetSeed));
457 valueMap["dRIntermediateAxis"][i] = xTrack->p4().DeltaR( xTau.p4(xAOD::TauJetParameters::IntermediateAxis) );
458 valueMap["tanh(d0SigTJVA/10)"][i] = std::tanh( xTrack->d0SigTJVA()/10. );
459 valueMap["tanh(d0TJVA/10)"][i] = std::tanh( xTrack->d0TJVA()/10. );
460 valueMap["qOverP*1000"][i] = xTrackParticle->qOverP()*1000.;
461 valueMap["numberOfInnermostPixelLayerHits"][i] = numberOfInnermostPixelLayerHits;
462 valueMap["numberOfPixelSharedHits"][i] = nPixelSharedHits;
463 valueMap["numberOfSCTSharedHits"][i] = nSCTSharedHits;
464 valueMap["numberOfTRTHits"][i] = nTRTHits;
465 valueMap["eProbabilityHT"][i] = eProbabilityHT;
466 valueMap["nPixHits"][i] = nPixelHits + nPixelDeadSensors;
467 valueMap["nSCTHits"][i] = nSCTHits + nSCTDeadSensors;
468 valueMap["dz0_TV_PV0"][i] = dz0_TV_PV0;
469 valueMap["log_sumpt_TV"][i] = log_sumpt_TV;
470 valueMap["log_sumpt2_TV"][i] = log_sumpt2_TV;
471 valueMap["log_sumpt_PV0"][i] = log_sumpt_PV0;
472 valueMap["log_sumpt2_PV0"][i] = log_sumpt2_PV0;
473 valueMap["charge"][i] = xTrackParticle->charge();
474 // used by RNN track classifier for upgrade
475 valueMap["(trackPt/jetSeedPt)"][i] = xTrackParticle->pt()/xTau.ptJetSeed();
476 valueMap["numberOfInnermostPixelLayerEndcapHits"][i] = numberOfInnermostPixelLayerEndcapHits;
477 valueMap["nSiHits"][i] = nSiHits;
478
479 ++i;
480 if(m_nMaxNtracks > 0 && i >= m_nMaxNtracks) {
481 break;
482 }
483 }
484
485 return StatusCode::SUCCESS;
486}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
Handle class for reading from StoreGate.
double charge(const T &p)
Definition AtlasPID.h:997
#define ANA_MSG_DEBUG(xmsg)
Macro printing debug messages.
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 executeTrackClassifier(xAOD::TauJet &pTau, xAOD::TauTrackContainer &tauTrackContainer) const override
virtual StatusCode initialize() override
Tool initializer.
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".
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