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