48 if (!
taus.isValid()) {
49 ATH_MSG_ERROR(
"evtStore() does not contain tau Collection with name "
51 return StatusCode::FAILURE;
55 std::unique_ptr<xAOD::TauJetContainer> shallowTaus(shallowCopy.first);
56 std::unique_ptr<xAOD::ShallowAuxContainer> shallowTausAux(shallowCopy.second);
58 const int lowerEtThreshold = 15;
59 const int higherEtThreshold = 75;
67 std::string tauid =
"";
76 auto panModeEt15Loose =
78 auto panModeSubstructure =
89 auto JetScoreSigTrans =
93 auto RNNEleScoreSigTrans =
97 auto NumTracksEt15Loose =
101 auto nHighPtTauCandidates =
104 auto nClustersEt15Loose =
170 auto numberOfTRTHighThresholdHits =
172 auto numberOfTRTHighThresholdOutliers =
175 auto numberOfTRTOutliers =
177 auto ipZ0SinThetaSigLeadTrk =
180 auto numberOfPixelSharedHits =
183 auto numberOfSCTSharedHits =
193 auto trackZ0SinthetaTJVA =
196 auto trackZ0sinthetaSigTJVA =
202 auto trackPtRatioSeedJet =
205 auto trackNInnermostPixHits =
209 auto trackeProbabilityHT =
211 auto trackeProbabilityNN =
213 auto trackeProbabilityHTorNN =
224 auto clusterSecondLambda =
226 auto clusterCenterLambda =
228 auto clusterFirstEngDens =
231 auto clustersMeanCenterLambda =
233 auto clustersMeanFirstEngDens =
235 auto clustersMeanEMProbability =
237 auto clustersMeanSecondLambda =
239 auto clustersMeanPresamplerFrac =
241 auto clustersPFOEngRelDiff =
248 for (
const auto tau : *shallowTaus) {
250 if (!passThinningAcc.
withDefault(*tau,
true))
continue;
254 tauEt = tau->pt() /
GeV;
255 tauCharge = tau->charge();
256 NumTracks = tau->nTracks();
268 jetSeedEta = tau->etaJetSeed();
269 jetSeedPhi = tau->phiJetSeed();
270 jetSeedPt = tau->ptJetSeed() /
GeV;
273 RNNEleScoreSigTrans =
284 JetScore = score.isAvailable() ? score(*tau) : -1234;
286 JetScoreSigTrans = trans_score(*tau);
289 tauLoose = tauid_loose.
isAvailable() ? tauid_loose(*tau) : -1234;
292 tauMedium = tauid_medium.
isAvailable() ? tauid_medium(*tau) : -1234;
295 tauTight = tauid_tight.
isAvailable() ? tauid_tight(*tau) : -1234;
313 panEta = tau->etaPanTauCellBased();
314 panPhi = tau->phiPanTauCellBased();
315 panPt = tau->ptPanTauCellBased() /
GeV;
320 EMFrac = EMFracFixedAcc(*tau);
324 nNeutPFO = tau->nProtoNeutralPFOs();
325 nShot = tau->nShotPFOs();
327 int panModeDummy = -1;
328 int panModeSubstructureDummy = -1;
332 if( tauEt > lowerEtThreshold) {
336 if (tauEt > higherEtThreshold) {
337 nHighPtTauCandidates += 1;
342 tauEt > lowerEtThreshold && tauLoose) {
344 tauPhiEt15Loose = tau->phi();
345 tauEtaEt15Loose = tau->eta();
346 tauEtEt15Loose = tau->pt() /
GeV;
349 NumTracksEt15Loose = tau->nTracks();
353 panModeEt15Loose = panModeDummy;
354 fill(tool, tauPhiEt15Loose, tauEtaEt15Loose,
355 nClustersEt15Loose, NumTracksEt15Loose, tauEtEt15Loose,
360 tauPhiLoose = tau->phi();
361 tauEtaLoose = tau->eta();
362 tauEtLoose = tau->pt() /
GeV;
363 NumTracksLoose = tau->nTracks();
365 fill(tool, tauPhiLoose, tauEtaLoose, NumTracksLoose,
370 tauPhiMedium = tau->phi();
371 tauEtaMedium = tau->eta();
372 tauEtMedium = tau->pt() /
GeV;
373 NumTracksMedium = tau->nTracks();
375 fill(tool, tauPhiMedium, tauEtaMedium, NumTracksMedium,
380 tauPhiTight = tau->phi();
381 tauEtaTight = tau->eta();
382 tauEtTight = tau->pt() /
GeV;
383 NumTracksTight = tau->nTracks();
385 fill(tool, tauPhiTight, tauEtaTight, NumTracksTight,
391 if (tau->nTracks() != 0) {
399 if (d0SigTJVAAcc.isAvailable(*tau->track(0))) {
400 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);
500 trackAcc(
"trackLinks");
501 if (!trackAcc(*track)[0]) {
507 float d0TJVA = track->track()->d0();
508 trackZ0SinthetaTJVA = track->z0sinThetaTJVA(*tau);
509 trackD0SigTJVA = 999.;
510 trackZ0sinthetaSigTJVA = 999.;
512 float rConvII = 999.;
515 d0TJVA = track->d0TJVA();
516 trackZ0SinthetaTJVA = track->z0sinthetaTJVA();
517 trackD0SigTJVA = track->d0SigTJVA();
518 trackZ0sinthetaSigTJVA = track->z0sinthetaSigTJVA();
519 rConv = track->rConv();
520 rConvII = track->rConvII();
524 double qOverP = trackParticle->
qOverP();
525 double trackPt = trackParticle->
pt();
526 uint8_t nInnermostPixelLayerHits = 0;
529 uint8_t nPixelHits = 0;
531 uint8_t nPixelDeadSensors = 0;
534 uint8_t nSCTHits = 0;
536 uint8_t nSCTDeadSensors = 0;
539 uint8_t nTRTHighThresholdHits = 0;
542 uint8_t numberOfPixelHoles = 0;
545 uint8_t numberOfSCTHoles = 0;
547 float eProbabilityHT = 0.;
550 float eProbabilityNN = eProbabilityNNAcc.
withDefault(*trackParticle, -1);
553 trackeProbabilityHTorNN =
554 (trackPt > 2000.) ? eProbabilityNN : eProbabilityHT;
556 trackeProbabilityNN = eProbabilityNN;
557 trackeProbabilityHT = eProbabilityHT;
558 trackLogPt = std::log(trackPt);
559 trackEta = track->eta();
560 trackd0TJVA = std::tanh(d0TJVA / 10.);
561 trackCharge = trackParticle->
charge();
562 trackqOverP = qOverP * 1000.;
563 trackLogRConv = std::log(rConv);
564 trackTanhRConvII = std::tanh(rConvII / 500.0);
565 trackPtRatioSeedJet = trackPt / tauSeedPt;
566 trackNInnermostPixHits = nInnermostPixelLayerHits;
567 trackNPixHits = nPixelHits + nPixelDeadSensors;
569 nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
571 fill(tool, trackLogPt, trackEta, trackd0TJVA, trackZ0SinthetaTJVA,
572 trackD0SigTJVA, trackZ0sinthetaSigTJVA, trackCharge, trackqOverP,
573 trackLogRConv, trackTanhRConvII, trackPtRatioSeedJet,
574 trackdRJetSeedAxis, trackNInnermostPixHits,
577 trackeProbabilityHT, trackeProbabilityNN, trackeProbabilityHTorNN);
580 float chargedScore = acc_trackScoreCharged(*track);
581 float isolationScore = acc_trackScoreIso(*track);
582 float conversionScore = acc_trackScoreConv(*track);
583 float fakeScore = 1. - chargedScore - isolationScore - conversionScore;
585 fakeScore = std::max(0.f, fakeScore);
586 fakeScore = std::min(1.f, fakeScore);
588 trackIdScoreCharged = chargedScore;
589 trackIdScoreIso = isolationScore;
590 trackIdScoreConv = conversionScore;
591 trackIdScoreFake = fakeScore;
593 fill(tool, trackIdScoreCharged, trackIdScoreIso, trackIdScoreConv,
599 std::vector<const xAOD::IParticle *> particleList = tau->clusters();
600 std::vector<xAOD::CaloVertexedTopoCluster> clusters;
602 if (tau->vertexLink().isValid())
603 vertex = tau->vertex();
619 return lhs.
p4().Et() > rhs.p4().Et();
621 std::sort(clusters.begin(), clusters.end(), et_cmp);
624 if (clusters.size() > 6) {
625 clusters.resize(6, clusters[0]);
629 for (
const auto& vertexedCluster : clusters) {
632 clusterLogEt = std::log10(vertexedCluster.p4().Et());
633 clusterEta = vertexedCluster.eta();
634 clusterPhi = vertexedCluster.phi();
637 clusterSecondR = std::log10(moment + 0.1);
641 clusterSecondLambda = std::log10(moment + 0.1);
645 clusterCenterLambda = std::log10(moment + 1e-6);
650 moment = std::log10(std::abs(moment));
651 clusterFirstEngDens = moment;
655 clusterEMproba = moment;
657 fill(tool, clusterLogEt, clusterEta, clusterPhi, clusterSecondR,
658 clusterSecondLambda, clusterCenterLambda, clusterFirstEngDens,
663 float avariable = 0.;
667 clustersMeanCenterLambda = avariable;
672 clustersMeanFirstEngDens = avariable;
677 clustersMeanEMProbability = avariable;
682 clustersMeanSecondLambda = avariable;
687 clustersMeanPresamplerFrac = avariable;
691 clustersPFOEngRelDiff = avariable;
693 fill(tool, clustersMeanCenterLambda, clustersMeanFirstEngDens,
694 clustersMeanEMProbability, clustersMeanSecondLambda,
695 clustersMeanPresamplerFrac, clustersPFOEngRelDiff);
697 for (
unsigned int np = 0; np < nNeutPFO; np++) {
698 const xAOD::PFO *npfo = tau->protoNeutralPFO(np);
700 fill(tool, BDTScoreAsP0);
703 if (tauEt > lowerEtThreshold) {
704 tauPhiEt15 = tau->phi();
705 tauEtaEt15 = tau->eta();
706 fill(tool, tauPhiEt15, tauEtaEt15);
709 fill(tool, tauPhi, tauEta, LB, tauEt, centFrac, isolFrac, EMRadius,
710 hadRadius, etEMAtEMScale, etHadAtEMScale,
711 tauCharge, JetScore, JetScoreSigTrans, RNNEleScore, RNNEleScoreSigTrans,
712 muonVeto, tauLoose, tauMedium, tauTight, PSSFrac, EMFrac, EMFracTrk, nNeutPFO,
713 nShot, NumTracks, nClusters, jetSeedEta, jetSeedPhi, jetSeedPt,
714 dRmax, ptRatioEflowApprox, trkAvgDist);
717 panModeSubstructureDummy);
718 panModeSubstructure = panModeSubstructureDummy;
720 fill(tool, panModeSubstructure);
722 fill(tool, panEta, panPhi, panPt);
727 fill(tool, nHighPtTauCandidates, nTauCandidates, nHighPtTaus);
729 return StatusCode::SUCCESS;