48 if (!
taus.isValid()) {
49 ATH_MSG_ERROR(
"evtStore() does not contain tau Collection with name "
51 return StatusCode::FAILURE;
56 const int lowerEtThreshold = 15;
57 const int higherEtThreshold = 75;
65 std::string tauid =
"";
74 auto panModeEt15Loose =
76 auto panModeSubstructure =
87 auto JetScoreSigTrans =
91 auto RNNEleScoreSigTrans =
95 auto NumTracksEt15Loose =
99 auto nHighPtTauCandidates =
102 auto nClustersEt15Loose =
166 auto numberOfTRTHighThresholdHits =
168 auto numberOfTRTHighThresholdOutliers =
171 auto numberOfTRTOutliers =
173 auto ipZ0SinThetaSigLeadTrk =
176 auto numberOfPixelSharedHits =
179 auto numberOfSCTSharedHits =
189 auto trackZ0SinthetaTJVA =
192 auto trackZ0sinthetaSigTJVA =
198 auto trackPtRatioSeedJet =
201 auto trackNInnermostPixHits =
205 auto trackeProbabilityHT =
207 auto trackeProbabilityNN =
209 auto trackeProbabilityHTorNN =
220 auto clusterSecondLambda =
222 auto clusterCenterLambda =
224 auto clusterFirstEngDens =
227 auto clustersMeanCenterLambda =
229 auto clustersMeanFirstEngDens =
231 auto clustersMeanEMProbability =
233 auto clustersMeanSecondLambda =
235 auto clustersMeanPresamplerFrac =
237 auto clustersPFOEngRelDiff =
244 for (
const auto tau : *shallowTaus) {
246 if (!passThinningAcc.
withDefault(*tau,
true))
continue;
250 tauEt = tau->pt() /
GeV;
251 tauCharge = tau->charge();
252 NumTracks = tau->nTracks();
262 jetSeedEta = tau->etaJetSeed();
263 jetSeedPhi = tau->phiJetSeed();
264 jetSeedPt = tau->ptJetSeed() /
GeV;
267 RNNEleScoreSigTrans =
278 JetScore = score.isAvailable() ? score(*tau) : -1234;
280 JetScoreSigTrans = trans_score(*tau);
283 tauLoose = tauid_loose.
isAvailable() ? tauid_loose(*tau) : -1234;
286 tauMedium = tauid_medium.
isAvailable() ? tauid_medium(*tau) : -1234;
289 tauTight = tauid_tight.
isAvailable() ? tauid_tight(*tau) : -1234;
307 panEta = tau->etaPanTauCellBased();
308 panPhi = tau->phiPanTauCellBased();
309 panPt = tau->ptPanTauCellBased() /
GeV;
314 EMFrac = EMFracFixedAcc(*tau);
318 nNeutPFO = tau->nProtoNeutralPFOs();
319 nShot = tau->nShotPFOs();
321 int panModeDummy = -1;
322 int panModeSubstructureDummy = -1;
326 if( tauEt > lowerEtThreshold) {
330 if (tauEt > higherEtThreshold) {
331 nHighPtTauCandidates += 1;
336 tauEt > lowerEtThreshold && tauLoose) {
338 tauPhiEt15Loose = tau->phi();
339 tauEtaEt15Loose = tau->eta();
340 tauEtEt15Loose = tau->pt() /
GeV;
343 NumTracksEt15Loose = tau->nTracks();
347 panModeEt15Loose = panModeDummy;
348 fill(tool, tauPhiEt15Loose, tauEtaEt15Loose,
349 nClustersEt15Loose, NumTracksEt15Loose, tauEtEt15Loose,
354 tauPhiLoose = tau->phi();
355 tauEtaLoose = tau->eta();
356 tauEtLoose = tau->pt() /
GeV;
357 NumTracksLoose = tau->nTracks();
359 fill(tool, tauPhiLoose, tauEtaLoose, NumTracksLoose,
364 tauPhiMedium = tau->phi();
365 tauEtaMedium = tau->eta();
366 tauEtMedium = tau->pt() /
GeV;
367 NumTracksMedium = tau->nTracks();
369 fill(tool, tauPhiMedium, tauEtaMedium, NumTracksMedium,
374 tauPhiTight = tau->phi();
375 tauEtaTight = tau->eta();
376 tauEtTight = tau->pt() /
GeV;
377 NumTracksTight = tau->nTracks();
379 fill(tool, tauPhiTight, tauEtaTight, NumTracksTight,
385 if (tau->nTracks() != 0) {
393 if (d0SigTJVAAcc.isAvailable(*tau->track(0))) {
394 ipSigLeadTrk = tau->track(0)->d0SigTJVA();
401 if (z0sinthetaSigTJVAAcc.
isAvailable(*tau->track(0))) {
402 ipZ0SinThetaSigLeadTrk = tau->track(0)->z0sinthetaSigTJVA();
412 fill(tool, massTrkSys, etOverPtLeadTrack, trFlightPathSig,
413 ipSigLeadTrk, ipZ0SinThetaSigLeadTrk, leadTrkPt);
417 const Trk::Perigee perigee = track->perigeeParameters();
422 numberOfSCTSharedHits = dummy;
423 fill(tool, numberOfSCTSharedHits);
427 numberOfSCTHits = dummy;
428 fill(tool, numberOfSCTHits);
432 numberOfPixelSharedHits = dummy;
433 fill(tool, numberOfPixelSharedHits);
437 numberOfPixelHits = dummy;
438 fill(tool, numberOfPixelHits);
441 numberOfTRTHighThresholdHits = dummy;
442 fill(tool, numberOfTRTHighThresholdHits);
444 if (track->summaryValue(dummy,
446 numberOfTRTHighThresholdOutliers = dummy;
447 fill(tool, numberOfTRTHighThresholdOutliers);
450 numberOfTRTHits = dummy;
451 fill(tool, numberOfTRTHits);
454 numberOfTRTOutliers = dummy;
455 fill(tool, numberOfTRTOutliers);
458 d0 = perigee.parameters()[
Trk::d0];
459 z0 = perigee.parameters()[
Trk::z0];
461 phiTrack = perigee.parameters()[
Trk::phi];
462 etaTrack = perigee.
eta();
463 ptTrack = perigee.
pT() /
GeV;
465 fill(tool, d0, z0, phiTrack, etaTrack, ptTrack);
473 fill(tool, leadTrkPt);
479 double tauSeedPt = tau->ptJetSeed();
480 double logTauSeedPt = std::log(tauSeedPt);
481 trackLogSeedJetPt = logTauSeedPt;
483 fill(tool, trackLogSeedJetPt);
494 trackAcc(
"trackLinks");
495 if (!trackAcc(*track)[0]) {
501 float d0TJVA = track->track()->d0();
502 trackZ0SinthetaTJVA = track->z0sinThetaTJVA(*tau);
503 trackD0SigTJVA = 999.;
504 trackZ0sinthetaSigTJVA = 999.;
506 float rConvII = 999.;
509 d0TJVA = track->d0TJVA();
510 trackZ0SinthetaTJVA = track->z0sinthetaTJVA();
511 trackD0SigTJVA = track->d0SigTJVA();
512 trackZ0sinthetaSigTJVA = track->z0sinthetaSigTJVA();
513 rConv = track->rConv();
514 rConvII = track->rConvII();
518 double qOverP = trackParticle->
qOverP();
519 double trackPt = trackParticle->
pt();
520 uint8_t nInnermostPixelLayerHits = 0;
523 uint8_t nPixelHits = 0;
525 uint8_t nPixelDeadSensors = 0;
528 uint8_t nSCTHits = 0;
530 uint8_t nSCTDeadSensors = 0;
533 uint8_t nTRTHighThresholdHits = 0;
536 uint8_t numberOfPixelHoles = 0;
539 uint8_t numberOfSCTHoles = 0;
541 float eProbabilityHT = 0.;
544 float eProbabilityNN = eProbabilityNNAcc.
withDefault(*trackParticle, -1);
547 trackeProbabilityHTorNN =
548 (trackPt > 2000.) ? eProbabilityNN : eProbabilityHT;
550 trackeProbabilityNN = eProbabilityNN;
551 trackeProbabilityHT = eProbabilityHT;
552 trackLogPt = std::log(trackPt);
553 trackEta = track->eta();
554 trackd0TJVA = std::tanh(d0TJVA / 10.);
555 trackCharge = trackParticle->
charge();
556 trackqOverP = qOverP * 1000.;
557 trackLogRConv = std::log(rConv);
558 trackTanhRConvII = std::tanh(rConvII / 500.0);
559 trackPtRatioSeedJet = trackPt / tauSeedPt;
560 trackNInnermostPixHits = nInnermostPixelLayerHits;
561 trackNPixHits = nPixelHits + nPixelDeadSensors;
563 nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
565 fill(tool, trackLogPt, trackEta, trackd0TJVA, trackZ0SinthetaTJVA,
566 trackD0SigTJVA, trackZ0sinthetaSigTJVA, trackCharge, trackqOverP,
567 trackLogRConv, trackTanhRConvII, trackPtRatioSeedJet,
568 trackdRJetSeedAxis, trackNInnermostPixHits,
571 trackeProbabilityHT, trackeProbabilityNN, trackeProbabilityHTorNN);
574 float chargedScore = acc_trackScoreCharged(*track);
575 float isolationScore = acc_trackScoreIso(*track);
576 float conversionScore = acc_trackScoreConv(*track);
577 float fakeScore = 1. - chargedScore - isolationScore - conversionScore;
579 fakeScore = std::max(0.f, fakeScore);
580 fakeScore = std::min(1.f, fakeScore);
582 trackIdScoreCharged = chargedScore;
583 trackIdScoreIso = isolationScore;
584 trackIdScoreConv = conversionScore;
585 trackIdScoreFake = fakeScore;
587 fill(tool, trackIdScoreCharged, trackIdScoreIso, trackIdScoreConv,
593 std::vector<const xAOD::IParticle *> particleList = tau->clusters();
594 std::vector<xAOD::CaloVertexedTopoCluster> clusters;
596 if (tau->vertexLink().isValid())
597 vertex = tau->vertex();
613 return lhs.
p4().Et() > rhs.p4().Et();
615 std::sort(clusters.begin(), clusters.end(), et_cmp);
618 if (clusters.size() > 6) {
619 clusters.resize(6, clusters[0]);
623 for (
const auto& vertexedCluster : clusters) {
626 clusterLogEt = std::log10(vertexedCluster.p4().Et());
627 clusterEta = vertexedCluster.eta();
628 clusterPhi = vertexedCluster.phi();
631 clusterSecondR = std::log10(moment + 0.1);
635 clusterSecondLambda = std::log10(moment + 0.1);
639 clusterCenterLambda = std::log10(moment + 1e-6);
644 moment = std::log10(std::abs(moment));
645 clusterFirstEngDens = moment;
649 clusterEMproba = moment;
651 fill(tool, clusterLogEt, clusterEta, clusterPhi, clusterSecondR,
652 clusterSecondLambda, clusterCenterLambda, clusterFirstEngDens,
657 float avariable = 0.;
661 clustersMeanCenterLambda = avariable;
666 clustersMeanFirstEngDens = avariable;
671 clustersMeanEMProbability = avariable;
676 clustersMeanSecondLambda = avariable;
681 clustersMeanPresamplerFrac = avariable;
685 clustersPFOEngRelDiff = avariable;
687 fill(tool, clustersMeanCenterLambda, clustersMeanFirstEngDens,
688 clustersMeanEMProbability, clustersMeanSecondLambda,
689 clustersMeanPresamplerFrac, clustersPFOEngRelDiff);
691 for (
unsigned int np = 0; np < nNeutPFO; np++) {
692 const xAOD::PFO *npfo = tau->protoNeutralPFO(np);
694 fill(tool, BDTScoreAsP0);
697 if (tauEt > lowerEtThreshold) {
698 tauPhiEt15 = tau->phi();
699 tauEtaEt15 = tau->eta();
700 fill(tool, tauPhiEt15, tauEtaEt15);
703 fill(tool, tauPhi, tauEta, LB, tauEt, centFrac, isolFrac,etEMAtEMScale, etHadAtEMScale,
704 tauCharge, JetScore, JetScoreSigTrans, RNNEleScore, RNNEleScoreSigTrans,
705 muonVeto, tauLoose, tauMedium, tauTight, PSSFrac, EMFrac, EMFracTrk, nNeutPFO,
706 nShot, NumTracks, nClusters, jetSeedEta, jetSeedPhi, jetSeedPt,
707 dRmax, ptRatioEflowApprox, trkAvgDist);
710 panModeSubstructureDummy);
711 panModeSubstructure = panModeSubstructureDummy;
713 fill(tool, panModeSubstructure);
715 fill(tool, panEta, panPhi, panPt);
720 fill(tool, nHighPtTauCandidates, nTauCandidates, nHighPtTaus);
722 return StatusCode::SUCCESS;