37 ATH_MSG_INFO(
"Intialize TauTrackRNNClassifier tool : " << classifier );
43 return StatusCode::SUCCESS;
49 const EventContext& ctx,
53 if (!vertexInHandle.
isValid()) {
54 ATH_MSG_ERROR (
"Could not retrieve HiveDataObj with key " << vertexInHandle.
key());
55 return StatusCode::FAILURE;
73 std::vector<xAOD::TauTrack*> vLRTs;
74 std::vector<xAOD::TauTrack*>::iterator it = vTracks.begin();
75 while(it != vTracks.end()) {
78 it = vTracks.erase(it);
87 ATH_CHECK(classifier->classifyTracks(vLRTs, xTau, vertexContainer, tauTrackCon,
true));
97 std::vector<xAOD::TauTrack*> excludedBadTracks;
98 std::vector<xAOD::TauTrack*>::iterator it = vTracks.begin();
99 while(it != vTracks.end()) {
101 excludedBadTracks.push_back(*it);
102 it = vTracks.erase(it);
109 ATH_CHECK(classifier->classifyTracks(excludedBadTracks, xTau, vertexContainer, tauTrackCon,
true));
119 std::vector<xAOD::TauTrack*> excludedTracks;
120 std::vector<xAOD::TauTrack*>::iterator it = vTracks.begin();
121 while(it != vTracks.end()) {
124 excludedTracks.push_back(*it);
125 it = vTracks.erase(it);
133 ATH_CHECK(classifier->classifyTracks(excludedTracks, xTau, vertexContainer, tauTrackCon,
true));
142 ATH_CHECK(classifier->classifyTracks(vTracks, xTau, vertexContainer, tauTrackCon));
150 charge += trk->track()->charge();
173 return StatusCode::SUCCESS;
184 idScoreCharged(*xTrack) = 0.;
185 idScoreConv(*xTrack) = 0.;
186 idScoreIso(*xTrack) = 0.;
187 idScoreFake(*xTrack) = 0.;
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());
198 if (d0_weight <= 33.61) {
200 if (log10_pt_ratio >= -1.40 && log10_abs_d0_sig >= 2.0) {
204 if (log10_pt_ratio >= -1.40 || log10_rConv >= 1.49) {
221 return StatusCode::SUCCESS;
229TrackRNN::TrackRNN(
const std::string& name)
243 ATH_MSG_INFO(
"Using calibration file: " << inputWeightsPath);
245 std::ifstream nn_config_istream(inputWeightsPath);
252 return StatusCode::FAILURE;
255 return StatusCode::SUCCESS;
263 bool skipTracks)
const
265 if(vTracks.empty()) {
266 return StatusCode::SUCCESS;
277 idScoreCharged(*track) = 0.;
278 idScoreConv(*track) = 0.;
279 idScoreIso(*track) = 0.;
280 idScoreFake(*track) = 0.;
282 return StatusCode::SUCCESS;
293 seqInput[
"input_1"] = std::move(valueMap);
297 std::vector<double> vClassProb(5);
299 for (
unsigned int i = 0; i < vTracks.size(); ++i){
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];
315 idScoreCharged(*vTracks[i]) = vClassProb[0];
316 idScoreConv(*vTracks[i]) = vClassProb[1];
317 idScoreIso(*vTracks[i]) = vClassProb[2];
318 idScoreFake(*vTracks[i]) = vClassProb[3];
321 for (
unsigned int j = 1; j < vClassProb.size(); ++j){
322 if(vClassProb[j] > vClassProb[iMaxIndex]) iMaxIndex = j;
331 }
else if(iMaxIndex == 0){
333 }
else if(iMaxIndex == 1){
335 }
else if(iMaxIndex == 2){
341 bool alreadyUsed =
false;
342 for (
unsigned int i = 0; i < vTracks.size(); ++i){
347 if( vTracks[i]->track() == tau_trk->track()) alreadyUsed =
true;
351 ATH_MSG_INFO(
"Found Already Used charged track new, now putting it as unclassified" );
361 return StatusCode::SUCCESS;
373 unsigned int n_timeSteps = vTracks.size();
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);
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);
410 double log_ptJetSeed = std::log( xTau.
ptJetSeed() );
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();
423 unsigned int nUnresolved = 0;
425 if (!trk.isValid()) { ++nUnresolved;
continue; }
426 sumpt_PV0 += (*trk)->pt();
427 sumpt2_PV0 += pow((*trk)->pt(), 2.);
430 if (!trk.isValid()) { ++nUnresolved;
continue; }
431 sumpt_TV += (*trk)->pt();
432 sumpt2_TV += pow((*trk)->pt(), 2.);
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");
442 double log_sumpt_TV = (sumpt_TV>0.) ? std::log(sumpt_TV) : 0.;
444 double log_sumpt2_TV = (sumpt2_TV>0.) ? std::log(sumpt2_TV) : 0.;
446 double log_sumpt_PV0 = (sumpt_PV0>0.) ? std::log(sumpt_PV0) : 0.;
448 double log_sumpt2_PV0 = (sumpt2_PV0>0.) ? std::log(sumpt2_PV0) : 0.;
468 uint8_t numberOfInnermostPixelLayerEndcapHits = 0;
471 numberOfInnermostPixelLayerEndcapHits = tmp_var;
473 uint8_t nSiHits = nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
475 valueMap[
"log(trackPt)"][i] = std::log( xTrackParticle->
pt() );
476 valueMap[
"log(jetSeedPt)"][i] = log_ptJetSeed;
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. );
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();
503 valueMap[
"(trackPt/jetSeedPt)"][i] = xTrackParticle->
pt()/xTau.
ptJetSeed();
504 valueMap[
"numberOfInnermostPixelLayerEndcapHits"][i] = numberOfInnermostPixelLayerEndcapHits;
505 valueMap[
"nSiHits"][i] = nSiHits;
513 return StatusCode::SUCCESS;
#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,...)
double charge(const T &p)
const T * at(size_type n) const
Access an element, as an rvalue.
bool empty() const noexcept
Returns true if the collection is empty.
ElementLink implementation for ROOT usage.
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.
TauTrackLinks_t & allTauTrackLinksNonConst()
In order to sort track links.
virtual FourMom_t p4() const
The full 4-momentum of the particle.
double ptIntermediateAxis() const
void setDetail(TauJetParameters::Detail detail, int value)
const Vertex * vertex() 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.
std::vector< xAOD::TauTrack * > allTauTracksNonConst(const xAOD::TauJet *tau, xAOD::TauTrackContainer *trackCont)
@ nModifiedIsolationTracks
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.
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