76 if (!
taus.isValid()) {
77 ATH_MSG_ERROR(
"evtStore() does not contain tau Collection with name "
79 return StatusCode::FAILURE;
84 const int lowerEtThreshold = 15;
85 const int higherEtThreshold = 75;
93 std::string tauid =
"";
102 auto panModeEt15Loose =
104 auto panModeSubstructure =
115 auto JetScoreSigTrans =
119 auto RNNEleScoreSigTrans =
123 auto NumTracksEt15Loose =
127 auto nHighPtTauCandidates =
130 auto nClustersEt15Loose =
194 auto numberOfTRTHighThresholdHits =
196 auto numberOfTRTHighThresholdOutliers =
199 auto numberOfTRTOutliers =
201 auto ipZ0SinThetaSigLeadTrk =
204 auto numberOfPixelSharedHits =
207 auto numberOfSCTSharedHits =
217 auto trackZ0SinthetaTJVA =
220 auto trackZ0sinthetaSigTJVA =
226 auto trackPtRatioSeedJet =
229 auto trackNInnermostPixHits =
233 auto trackeProbabilityHT =
235 auto trackeProbabilityNN =
237 auto trackeProbabilityHTorNN =
248 auto clusterSecondLambda =
250 auto clusterCenterLambda =
252 auto clusterFirstEngDens =
255 auto clustersMeanCenterLambda =
257 auto clustersMeanFirstEngDens =
259 auto clustersMeanEMProbability =
261 auto clustersMeanSecondLambda =
263 auto clustersMeanPresamplerFrac =
265 auto clustersPFOEngRelDiff =
286 for (
const auto tau : *shallowTaus) {
288 if (!passThinning.
withDefault(*tau,
true))
continue;
292 tauEt = tau->pt() /
GeV;
293 tauCharge = tau->charge();
294 NumTracks = tau->nTracks();
304 jetSeedEta = tau->etaJetSeed();
305 jetSeedPhi = tau->phiJetSeed();
306 jetSeedPt = tau->ptJetSeed() /
GeV;
309 RNNEleScoreSigTrans =
318 JetScore = score.isAvailable() ? score(*tau) : -1234;
320 JetScoreSigTrans = trans_score(*tau);
322 tauLoose = tauid_loose.
isAvailable() ? tauid_loose(*tau) : -1234;
324 tauMedium = tauid_medium.
isAvailable() ? tauid_medium(*tau) : -1234;
326 tauTight = tauid_tight.
isAvailable() ? tauid_tight(*tau) : -1234;
344 panEta = tau->etaPanTauCellBased();
345 panPhi = tau->phiPanTauCellBased();
346 panPt = tau->ptPanTauCellBased() /
GeV;
350 EMFrac = EMFracFixed(*tau);
354 nNeutPFO = tau->nProtoNeutralPFOs();
355 nShot = tau->nShotPFOs();
357 int panModeDummy = -1;
358 int panModeSubstructureDummy = -1;
362 if( tauEt > lowerEtThreshold) {
366 if (tauEt > higherEtThreshold) {
367 nHighPtTauCandidates += 1;
372 tauEt > lowerEtThreshold && tauLoose) {
374 tauPhiEt15Loose = tau->phi();
375 tauEtaEt15Loose = tau->eta();
376 tauEtEt15Loose = tau->pt() /
GeV;
379 NumTracksEt15Loose = tau->nTracks();
383 panModeEt15Loose = panModeDummy;
384 fill(tool, tauPhiEt15Loose, tauEtaEt15Loose,
385 nClustersEt15Loose, NumTracksEt15Loose, tauEtEt15Loose,
390 tauPhiLoose = tau->phi();
391 tauEtaLoose = tau->eta();
392 tauEtLoose = tau->pt() /
GeV;
393 NumTracksLoose = tau->nTracks();
395 fill(tool, tauPhiLoose, tauEtaLoose, NumTracksLoose,
400 tauPhiMedium = tau->phi();
401 tauEtaMedium = tau->eta();
402 tauEtMedium = tau->pt() /
GeV;
403 NumTracksMedium = tau->nTracks();
405 fill(tool, tauPhiMedium, tauEtaMedium, NumTracksMedium,
410 tauPhiTight = tau->phi();
411 tauEtaTight = tau->eta();
412 tauEtTight = tau->pt() /
GeV;
413 NumTracksTight = tau->nTracks();
415 fill(tool, tauPhiTight, tauEtaTight, NumTracksTight,
421 if (tau->nTracks() != 0) {
428 if (d0SigTJVA.isAvailable()){
429 ipSigLeadTrk = tau->track(0)->d0SigTJVA();
435 if (z0sinthetaSigTJVA.isAvailable()) {
436 ipZ0SinThetaSigLeadTrk = tau->track(0)->z0sinthetaSigTJVA();
446 fill(tool, massTrkSys, etOverPtLeadTrack, trFlightPathSig,
447 ipSigLeadTrk, ipZ0SinThetaSigLeadTrk, leadTrkPt);
451 const Trk::Perigee perigee = track->perigeeParameters();
456 numberOfSCTSharedHits = dummy;
457 fill(tool, numberOfSCTSharedHits);
461 numberOfSCTHits = dummy;
462 fill(tool, numberOfSCTHits);
466 numberOfPixelSharedHits = dummy;
467 fill(tool, numberOfPixelSharedHits);
471 numberOfPixelHits = dummy;
472 fill(tool, numberOfPixelHits);
475 numberOfTRTHighThresholdHits = dummy;
476 fill(tool, numberOfTRTHighThresholdHits);
478 if (track->summaryValue(dummy,
480 numberOfTRTHighThresholdOutliers = dummy;
481 fill(tool, numberOfTRTHighThresholdOutliers);
484 numberOfTRTHits = dummy;
485 fill(tool, numberOfTRTHits);
488 numberOfTRTOutliers = dummy;
489 fill(tool, numberOfTRTOutliers);
492 d0 = perigee.parameters()[
Trk::d0];
493 z0 = perigee.parameters()[
Trk::z0];
495 phiTrack = perigee.parameters()[
Trk::phi];
496 etaTrack = perigee.
eta();
497 ptTrack = perigee.
pT() /
GeV;
499 fill(tool, d0, z0, phiTrack, etaTrack, ptTrack);
507 fill(tool, leadTrkPt);
513 double tauSeedPt = tau->ptJetSeed();
514 double logTauSeedPt = std::log(tauSeedPt);
515 trackLogSeedJetPt = logTauSeedPt;
517 fill(tool, trackLogSeedJetPt);
523 trackAcc(
"trackLinks");
524 if (!trackAcc(*track)[0]) {
530 float d0TJVA = track->track()->d0();
531 trackZ0SinthetaTJVA = track->z0sinThetaTJVA(*tau);
532 trackD0SigTJVA = 999.;
533 trackZ0sinthetaSigTJVA = 999.;
535 float rConvII = 999.;
536 if (z0sinthetaTJVA.isAvailable()) {
537 d0TJVA = track->d0TJVA();
538 trackZ0SinthetaTJVA = track->z0sinthetaTJVA();
539 trackD0SigTJVA = track->d0SigTJVA();
540 trackZ0sinthetaSigTJVA = track->z0sinthetaSigTJVA();
541 rConv = track->rConv();
542 rConvII = track->rConvII();
546 double qOverP = trackParticle->
qOverP();
547 double trackPt = trackParticle->
pt();
548 uint8_t nInnermostPixelLayerHits = 0;
551 uint8_t nPixelHits = 0;
553 uint8_t nPixelDeadSensors = 0;
556 uint8_t nSCTHits = 0;
558 uint8_t nSCTDeadSensors = 0;
561 uint8_t nTRTHighThresholdHits = 0;
564 uint8_t numberOfPixelHoles = 0;
567 uint8_t numberOfSCTHoles = 0;
569 float eProbabilityHT = 0.;
572 float eProbabilityNN = eProbabilityNNAcc.
withDefault(*trackParticle, -1);
575 trackeProbabilityHTorNN =
576 (trackPt > 2000.) ? eProbabilityNN : eProbabilityHT;
578 trackeProbabilityNN = eProbabilityNN;
579 trackeProbabilityHT = eProbabilityHT;
580 trackLogPt = std::log(trackPt);
581 trackEta = track->eta();
582 trackd0TJVA = std::tanh(d0TJVA / 10.);
583 trackCharge = trackParticle->
charge();
584 trackqOverP = qOverP * 1000.;
585 trackLogRConv = std::log(rConv);
586 trackTanhRConvII = std::tanh(rConvII / 500.0);
587 trackPtRatioSeedJet = trackPt / tauSeedPt;
588 trackNInnermostPixHits = nInnermostPixelLayerHits;
589 trackNPixHits = nPixelHits + nPixelDeadSensors;
591 nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
593 fill(tool, trackLogPt, trackEta, trackd0TJVA, trackZ0SinthetaTJVA,
594 trackD0SigTJVA, trackZ0sinthetaSigTJVA, trackCharge, trackqOverP,
595 trackLogRConv, trackTanhRConvII, trackPtRatioSeedJet,
596 trackdRJetSeedAxis, trackNInnermostPixHits,
599 trackeProbabilityHT, trackeProbabilityNN, trackeProbabilityHTorNN);
602 float chargedScore = rnn_chargedScore(*track);
603 float isolationScore = rnn_isolationScore(*track);
604 float conversionScore = rnn_conversionScore(*track);
605 float fakeScore = 1. - chargedScore - isolationScore - conversionScore;
607 fakeScore = std::max(0.f, fakeScore);
608 fakeScore = std::min(1.f, fakeScore);
610 trackIdScoreCharged = chargedScore;
611 trackIdScoreIso = isolationScore;
612 trackIdScoreConv = conversionScore;
613 trackIdScoreFake = fakeScore;
615 fill(tool, trackIdScoreCharged, trackIdScoreIso, trackIdScoreConv,
621 std::vector<const xAOD::IParticle *> particleList = tau->clusters();
622 std::vector<xAOD::CaloVertexedTopoCluster> clusters;
624 if (tau->vertexLink().isValid())
625 vertex = tau->vertex();
641 return lhs.
p4().Et() > rhs.p4().Et();
643 std::sort(clusters.begin(), clusters.end(), et_cmp);
646 if (clusters.size() > 6) {
647 clusters.resize(6, clusters[0]);
651 for (
const auto& vertexedCluster : clusters) {
654 clusterLogEt = std::log10(vertexedCluster.p4().Et());
655 clusterEta = vertexedCluster.eta();
656 clusterPhi = vertexedCluster.phi();
659 clusterSecondR = std::log10(moment + 0.1);
663 clusterSecondLambda = std::log10(moment + 0.1);
667 clusterCenterLambda = std::log10(moment + 1e-6);
672 moment = std::log10(std::abs(moment));
673 clusterFirstEngDens = moment;
677 clusterEMproba = moment;
679 fill(tool, clusterLogEt, clusterEta, clusterPhi, clusterSecondR,
680 clusterSecondLambda, clusterCenterLambda, clusterFirstEngDens,
685 float avariable = 0.;
689 clustersMeanCenterLambda = avariable;
694 clustersMeanFirstEngDens = avariable;
699 clustersMeanEMProbability = avariable;
704 clustersMeanSecondLambda = avariable;
709 clustersMeanPresamplerFrac = avariable;
713 clustersPFOEngRelDiff = avariable;
715 fill(tool, clustersMeanCenterLambda, clustersMeanFirstEngDens,
716 clustersMeanEMProbability, clustersMeanSecondLambda,
717 clustersMeanPresamplerFrac, clustersPFOEngRelDiff);
719 for (
unsigned int np = 0; np < nNeutPFO; np++) {
720 const xAOD::PFO *npfo = tau->protoNeutralPFO(np);
722 fill(tool, BDTScoreAsP0);
725 if (tauEt > lowerEtThreshold) {
726 tauPhiEt15 = tau->phi();
727 tauEtaEt15 = tau->eta();
728 fill(tool, tauPhiEt15, tauEtaEt15);
731 fill(tool, tauPhi, tauEta, LB, tauEt, centFrac, isolFrac,etEMAtEMScale, etHadAtEMScale,
732 tauCharge, JetScore, JetScoreSigTrans, RNNEleScore, RNNEleScoreSigTrans,
733 muonVeto, tauLoose, tauMedium, tauTight, PSSFrac, EMFrac, EMFracTrk, nNeutPFO,
734 nShot, NumTracks, nClusters, jetSeedEta, jetSeedPhi, jetSeedPt,
735 dRmax, ptRatioEflowApprox, trkAvgDist);
738 panModeSubstructureDummy);
739 panModeSubstructure = panModeSubstructureDummy;
741 fill(tool, panModeSubstructure);
743 fill(tool, panEta, panPhi, panPt);
748 fill(tool, nHighPtTauCandidates, nTauCandidates, nHighPtTaus);
750 return StatusCode::SUCCESS;