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