45 if (!
taus.isValid()) {
46 ATH_MSG_ERROR(
"evtStore() does not contain tau Collection with name "
48 return StatusCode::FAILURE;
53 const int lowerEtThreshold = 15;
54 const int higherEtThreshold = 75;
62 std::string tauid =
"";
71 auto panModeEt15Loose =
73 auto panModeSubstructure =
84 auto JetScoreSigTrans =
88 auto RNNEleScoreSigTrans =
92 auto NumTracksEt15Loose =
96 auto nHighPtTauCandidates =
99 auto nClustersEt15Loose =
163 auto numberOfTRTHighThresholdHits =
165 auto numberOfTRTHighThresholdOutliers =
168 auto numberOfTRTOutliers =
170 auto ipZ0SinThetaSigLeadTrk =
173 auto numberOfPixelSharedHits =
176 auto numberOfSCTSharedHits =
186 auto trackZ0SinthetaTJVA =
189 auto trackZ0sinthetaSigTJVA =
195 auto trackPtRatioSeedJet =
198 auto trackNInnermostPixHits =
202 auto trackeProbabilityHT =
204 auto trackeProbabilityNN =
206 auto trackeProbabilityHTorNN =
217 auto clusterSecondLambda =
219 auto clusterCenterLambda =
221 auto clusterFirstEngDens =
224 auto clustersMeanCenterLambda =
226 auto clustersMeanFirstEngDens =
228 auto clustersMeanEMProbability =
230 auto clustersMeanSecondLambda =
232 auto clustersMeanPresamplerFrac =
234 auto clustersPFOEngRelDiff =
258 for (
const auto tau : *shallowTaus) {
260 if (!passThinningAcc.
withDefault(*tau,
true))
continue;
264 tauEt = tau->pt() /
GeV;
265 tauCharge = tau->charge();
266 NumTracks = tau->nTracks();
276 jetSeedEta = tau->etaJetSeed();
277 jetSeedPhi = tau->phiJetSeed();
278 jetSeedPt = tau->ptJetSeed() /
GeV;
281 RNNEleScoreSigTrans =
290 JetScore = scoreAcc(*tau);
292 JetScoreSigTrans = trans_score(*tau);
294 tauLoose = tauid_loose.
isAvailable() ? tauid_loose(*tau) : -1234;
296 tauMedium = tauid_medium.
isAvailable() ? tauid_medium(*tau) : -1234;
298 tauTight = tauid_tight.
isAvailable() ? tauid_tight(*tau) : -1234;
316 panEta = tau->etaPanTauCellBased();
317 panPhi = tau->phiPanTauCellBased();
318 panPt = tau->ptPanTauCellBased() /
GeV;
322 EMFrac = EMFracFixedAcc(*tau);
326 nNeutPFO = tau->nProtoNeutralPFOs();
327 nShot = tau->nShotPFOs();
329 int panModeDummy = -1;
330 int panModeSubstructureDummy = -1;
334 if( tauEt > lowerEtThreshold) {
338 if (tauEt > higherEtThreshold) {
339 nHighPtTauCandidates += 1;
344 tauEt > lowerEtThreshold && tauLoose) {
346 tauPhiEt15Loose = tau->phi();
347 tauEtaEt15Loose = tau->eta();
348 tauEtEt15Loose = tau->pt() /
GeV;
351 NumTracksEt15Loose = tau->nTracks();
355 panModeEt15Loose = panModeDummy;
356 fill(tool, tauPhiEt15Loose, tauEtaEt15Loose,
357 nClustersEt15Loose, NumTracksEt15Loose, tauEtEt15Loose,
362 tauPhiLoose = tau->phi();
363 tauEtaLoose = tau->eta();
364 tauEtLoose = tau->pt() /
GeV;
365 NumTracksLoose = tau->nTracks();
367 fill(tool, tauPhiLoose, tauEtaLoose, NumTracksLoose,
372 tauPhiMedium = tau->phi();
373 tauEtaMedium = tau->eta();
374 tauEtMedium = tau->pt() /
GeV;
375 NumTracksMedium = tau->nTracks();
377 fill(tool, tauPhiMedium, tauEtaMedium, NumTracksMedium,
382 tauPhiTight = tau->phi();
383 tauEtaTight = tau->eta();
384 tauEtTight = tau->pt() /
GeV;
385 NumTracksTight = tau->nTracks();
387 fill(tool, tauPhiTight, tauEtaTight, NumTracksTight,
393 if (tau->nTracks() != 0) {
401 ipSigLeadTrk = tau->track(0)->d0SigTJVA();
407 if (z0sinthetaSigTJVAAcc.
isAvailable(*tau->track(0))) {
408 ipZ0SinThetaSigLeadTrk = tau->track(0)->z0sinthetaSigTJVA();
418 fill(tool, massTrkSys, etOverPtLeadTrack, trFlightPathSig,
419 ipSigLeadTrk, ipZ0SinThetaSigLeadTrk, leadTrkPt);
423 const Trk::Perigee perigee = track->perigeeParameters();
428 numberOfSCTSharedHits = dummy;
429 fill(tool, numberOfSCTSharedHits);
433 numberOfSCTHits = dummy;
434 fill(tool, numberOfSCTHits);
438 numberOfPixelSharedHits = dummy;
439 fill(tool, numberOfPixelSharedHits);
443 numberOfPixelHits = dummy;
444 fill(tool, numberOfPixelHits);
447 numberOfTRTHighThresholdHits = dummy;
448 fill(tool, numberOfTRTHighThresholdHits);
450 if (track->summaryValue(dummy,
452 numberOfTRTHighThresholdOutliers = dummy;
453 fill(tool, numberOfTRTHighThresholdOutliers);
456 numberOfTRTHits = dummy;
457 fill(tool, numberOfTRTHits);
460 numberOfTRTOutliers = dummy;
461 fill(tool, numberOfTRTOutliers);
464 d0 = perigee.parameters()[
Trk::d0];
465 z0 = perigee.parameters()[
Trk::z0];
467 phiTrack = perigee.parameters()[
Trk::phi];
468 etaTrack = perigee.
eta();
469 ptTrack = perigee.
pT() /
GeV;
471 fill(tool, d0, z0, phiTrack, etaTrack, ptTrack);
479 fill(tool, leadTrkPt);
485 double tauSeedPt = tau->ptJetSeed();
486 double logTauSeedPt = std::log(tauSeedPt);
487 trackLogSeedJetPt = logTauSeedPt;
489 fill(tool, trackLogSeedJetPt);
492 if (!trackAcc(*track)[0]) {
498 float d0TJVA = track->track()->d0();
499 trackZ0SinthetaTJVA = track->z0sinThetaTJVA(*tau);
500 trackD0SigTJVA = 999.;
501 trackZ0sinthetaSigTJVA = 999.;
503 float rConvII = 999.;
505 d0TJVA = track->d0TJVA();
506 trackZ0SinthetaTJVA = track->z0sinthetaTJVA();
507 trackD0SigTJVA = track->d0SigTJVA();
508 trackZ0sinthetaSigTJVA = track->z0sinthetaSigTJVA();
509 rConv = track->rConv();
510 rConvII = track->rConvII();
514 double qOverP = trackParticle->
qOverP();
515 double trackPt = trackParticle->
pt();
516 uint8_t nInnermostPixelLayerHits = 0;
519 uint8_t nPixelHits = 0;
521 uint8_t nPixelDeadSensors = 0;
524 uint8_t nSCTHits = 0;
526 uint8_t nSCTDeadSensors = 0;
529 uint8_t nTRTHighThresholdHits = 0;
532 uint8_t numberOfPixelHoles = 0;
535 uint8_t numberOfSCTHoles = 0;
537 float eProbabilityHT = 0.;
539 float eProbabilityNN = eProbabilityNNAcc.
withDefault(*trackParticle, -1);
542 trackeProbabilityHTorNN =
543 (trackPt > 2000.) ? eProbabilityNN : eProbabilityHT;
545 trackeProbabilityNN = eProbabilityNN;
546 trackeProbabilityHT = eProbabilityHT;
547 trackLogPt = std::log(trackPt);
548 trackEta = track->eta();
549 trackd0TJVA = std::tanh(d0TJVA / 10.);
550 trackCharge = trackParticle->
charge();
551 trackqOverP = qOverP * 1000.;
552 trackLogRConv = std::log(rConv);
553 trackTanhRConvII = std::tanh(rConvII / 500.0);
554 trackPtRatioSeedJet = trackPt / tauSeedPt;
555 trackNInnermostPixHits = nInnermostPixelLayerHits;
556 trackNPixHits = nPixelHits + nPixelDeadSensors;
558 nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
560 fill(tool, trackLogPt, trackEta, trackd0TJVA, trackZ0SinthetaTJVA,
561 trackD0SigTJVA, trackZ0sinthetaSigTJVA, trackCharge, trackqOverP,
562 trackLogRConv, trackTanhRConvII, trackPtRatioSeedJet,
563 trackdRJetSeedAxis, trackNInnermostPixHits,
566 trackeProbabilityHT, trackeProbabilityNN, trackeProbabilityHTorNN);
569 float chargedScore = acc_trackScoreCharged(*track);
570 float isolationScore = acc_trackScoreIso(*track);
571 float conversionScore = acc_trackScoreConv(*track);
572 float fakeScore = 1. - chargedScore - isolationScore - conversionScore;
574 fakeScore = std::max(0.f, fakeScore);
575 fakeScore = std::min(1.f, fakeScore);
577 trackIdScoreCharged = chargedScore;
578 trackIdScoreIso = isolationScore;
579 trackIdScoreConv = conversionScore;
580 trackIdScoreFake = fakeScore;
582 fill(tool, trackIdScoreCharged, trackIdScoreIso, trackIdScoreConv,
588 std::vector<const xAOD::IParticle *> particleList = tau->clusters();
589 std::vector<xAOD::CaloVertexedTopoCluster> clusters;
591 if (tau->vertexLink().isValid())
592 vertex = tau->vertex();
608 return lhs.
p4().Et() > rhs.p4().Et();
610 std::sort(clusters.begin(), clusters.end(), et_cmp);
613 if (clusters.size() > 6) {
614 clusters.resize(6, clusters[0]);
618 for (
const auto& vertexedCluster : clusters) {
621 clusterLogEt = std::log10(vertexedCluster.p4().Et());
622 clusterEta = vertexedCluster.eta();
623 clusterPhi = vertexedCluster.phi();
626 clusterSecondR = std::log10(moment + 0.1);
630 clusterSecondLambda = std::log10(moment + 0.1);
634 clusterCenterLambda = std::log10(moment + 1e-6);
639 moment = std::log10(std::abs(moment));
640 clusterFirstEngDens = moment;
644 clusterEMproba = moment;
646 fill(tool, clusterLogEt, clusterEta, clusterPhi, clusterSecondR,
647 clusterSecondLambda, clusterCenterLambda, clusterFirstEngDens,
652 float avariable = 0.;
656 clustersMeanCenterLambda = avariable;
661 clustersMeanFirstEngDens = avariable;
666 clustersMeanEMProbability = avariable;
671 clustersMeanSecondLambda = avariable;
676 clustersMeanPresamplerFrac = avariable;
680 clustersPFOEngRelDiff = avariable;
682 fill(tool, clustersMeanCenterLambda, clustersMeanFirstEngDens,
683 clustersMeanEMProbability, clustersMeanSecondLambda,
684 clustersMeanPresamplerFrac, clustersPFOEngRelDiff);
686 for (
unsigned int np = 0; np < nNeutPFO; np++) {
687 const xAOD::PFO *npfo = tau->protoNeutralPFO(np);
689 fill(tool, BDTScoreAsP0);
692 if (tauEt > lowerEtThreshold) {
693 tauPhiEt15 = tau->phi();
694 tauEtaEt15 = tau->eta();
695 fill(tool, tauPhiEt15, tauEtaEt15);
698 fill(tool, tauPhi, tauEta, LB, tauEt, centFrac, isolFrac,etEMAtEMScale, etHadAtEMScale,
699 tauCharge, JetScore, JetScoreSigTrans, RNNEleScore, RNNEleScoreSigTrans,
700 muonVeto, tauLoose, tauMedium, tauTight, PSSFrac, EMFrac, EMFracTrk, nNeutPFO,
701 nShot, NumTracks, nClusters, jetSeedEta, jetSeedPhi, jetSeedPt,
702 dRmax, ptRatioEflowApprox, trkAvgDist);
705 panModeSubstructureDummy);
706 panModeSubstructure = panModeSubstructureDummy;
708 fill(tool, panModeSubstructure);
710 fill(tool, panEta, panPhi, panPt);
715 fill(tool, nHighPtTauCandidates, nTauCandidates, nHighPtTaus);
717 return StatusCode::SUCCESS;