184 std::vector<float> cluster_et_log, cluster_dEta, cluster_dPhi;
185 std::vector<float> cluster_log_SECOND_R, cluster_SECOND_LAMBDA, cluster_CENTER_LAMBDA;
190 auto mon_cluster_SECOND_LAMBDA =
Monitored::Collection(
"cluster_SECOND_LAMBDA", cluster_SECOND_LAMBDA);
191 auto mon_cluster_CENTER_LAMBDA =
Monitored::Collection(
"cluster_CENTER_LAMBDA", cluster_CENTER_LAMBDA);
192 std::vector<unsigned char> calo_errors;
214 std::vector<float> track_pt_log, track_dEta, track_dPhi;
215 std::vector<float> track_d0_abs_log, track_z0sinthetaTJVA_abs_log;
216 std::vector<float> track_nPixelHitsPlusDeadSensors, track_nSCTHitsPlusDeadSensors;
221 auto mon_track_z0sinthetaTJVA_abs_log =
Monitored::Collection(
"track_z0sinthetaTJVA_abs_log", track_z0sinthetaTJVA_abs_log);
222 auto mon_track_nPixelHitsPlusDeadSensors =
Monitored::Collection(
"track_nPixelHitsPlusDeadSensors", track_nPixelHitsPlusDeadSensors);
223 auto mon_track_nSCTHitsPlusDeadSensors =
Monitored::Collection(
"track_nSCTHitsPlusDeadSensors", track_nSCTHitsPlusDeadSensors);
224 std::vector<unsigned char> track_errors;
227 std::map<std::string, Monitored::Scalar<float>> monitoredIdVariables;
230 monitoredIdVariables.emplace(key +
"_TauJetScoreTrans_0p",
Monitored::Scalar<float>(key +
"_TauJetScoreTrans_0p", -1));
232 monitoredIdVariables.emplace(key +
"_TauJetScoreTrans_1p",
Monitored::Scalar<float>(key +
"_TauJetScoreTrans_1p", -1));
234 monitoredIdVariables.emplace(key +
"_TauJetScoreTrans_mp",
Monitored::Scalar<float>(key +
"_TauJetScoreTrans_mp", -1));
239 std::vector<float> hit_z, hit_dPhi;
243 std::map<std::string, Monitored::Scalar<float>> monitoredHitZVariables;
249 std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>> monVars = {
251 std::ref(pT), std::ref(
eta), std::ref(
phi),
252 std::ref(etaRoI), std::ref(phiRoI), std::ref(dEta_RoI), std::ref(dPhi_RoI),
253 std::ref(mEflowApprox), std::ref(ptRatioEflowApprox), std::ref(pt_jetseed_log),
254 std::ref(etaDetectorAxis), std::ref(ptDetectorAxis), std::ref(ptDetectorAxis_log),
256 std::ref(EtHad), std::ref(EtEm), std::ref(EMFrac), std::ref(IsoFrac), std::ref(CentFrac),
257 std::ref(clustersMeanCenterLambda), std::ref(clustersMeanFirstEngDens), std::ref(clustersMeanEMProbability),
258 std::ref(clustersMeanSecondLambda), std::ref(clustersMeanPresamplerFrac),
259 std::ref(n_clusters), std::ref(mon_cluster_et_log), std::ref(mon_cluster_dEta), std::ref(mon_cluster_dPhi),
260 std::ref(mon_cluster_log_SECOND_R), std::ref(mon_cluster_SECOND_LAMBDA), std::ref(mon_cluster_CENTER_LAMBDA),
261 std::ref(mon_calo_errors),
262 std::ref(n_tracks), std::ref(n_iso_tracks),
263 std::ref(ipSigLeadTrk), std::ref(trFlightPathSig), std::ref(massTrkSys), std::ref(dRmax), std::ref(trkAvgDist), std::ref(innerTrkAvgDist),
264 std::ref(etovPtLead), std::ref(PSSFraction), std::ref(EMPOverTrkSysP), std::ref(ChPiEMEOverCaloEME),
265 std::ref(vertex_x), std::ref(vertex_y), std::ref(vertex_z),
266 std::ref(n_all_tracks), std::ref(mon_track_pt_log), std::ref(mon_track_dEta), std::ref(mon_track_dPhi),
267 std::ref(mon_track_d0_abs_log), std::ref(mon_track_z0sinthetaTJVA_abs_log),
268 std::ref(mon_track_nPixelHitsPlusDeadSensors), std::ref(mon_track_nSCTHitsPlusDeadSensors),
269 std::ref(mon_track_errors),
270 std::ref(n_hits), std::ref(mon_hit_z), std::ref(mon_hit_dPhi)
272 for(
auto& [key, var] : monitoredIdVariables) monVars.push_back(std::ref(var));
273 for(
auto& [key, var] : monitoredHitZVariables) monVars.push_back(std::ref(var));
285 std::vector<ROOT::Math::XYZVector> tauHits;
294 return StatusCode::FAILURE;
297 if(roisHandle->empty()) {
299 return StatusCode::FAILURE;
308 return StatusCode::FAILURE;
317 std::unique_ptr<xAOD::TauJetContainer> outputContainer = std::make_unique<xAOD::TauJetContainer>();
318 std::unique_ptr<xAOD::TauJetAuxContainer> outputAuxContainer = std::make_unique<xAOD::TauJetAuxContainer>();
319 outputContainer->setStore(outputAuxContainer.get());
322 ATH_CHECK(outputTauHandle.
record(std::move(outputContainer), std::move(outputAuxContainer)));
325 std::unique_ptr<xAOD::TauTrackContainer> outputTrackContainer = std::make_unique<xAOD::TauTrackContainer>();
326 std::unique_ptr<xAOD::TauTrackAuxContainer> outputTrackAuxContainer = std::make_unique<xAOD::TauTrackAuxContainer>();
327 outputTrackContainer->setStore(outputTrackAuxContainer.get());
330 ATH_CHECK(tauTrackHandle.
record(std::move(outputTrackContainer), std::move(outputTrackAuxContainer)));
349 if(RoICaloClusterContainer) {
350 ATH_MSG_DEBUG(
"CaloCluster container found of size: " << RoICaloClusterContainer->
size());
357 return StatusCode::FAILURE;
361 std::unique_ptr<xAOD::JetContainer> jetContainer{std::make_unique<xAOD::JetContainer>()};
362 std::unique_ptr<xAOD::JetAuxContainer> jetAuxContainer{std::make_unique<xAOD::JetAuxContainer>()};
363 jetContainer->setStore(jetAuxContainer.get());
366 ATH_CHECK(outputTauSeedJetHandle.
record(std::move(jetContainer), std::move(jetAuxContainer)));
369 outputTauSeedJetHandle->push_back(std::make_unique<xAOD::Jet>());
377 TLorentzVector cluster_p4, barycenter;
379 ATH_MSG_DEBUG(
"Cluster (e, eta, phi): (" << cluster->e() <<
", " << cluster->eta() <<
", " << cluster->phi() <<
")");
381 if(cluster->e() < 0) {
386 cluster_p4.SetPtEtaPhiE(cluster->pt(), cluster->eta(), cluster->phi(), cluster->e());
387 jet->addConstituent(cluster);
389 barycenter += cluster_p4;
392 jet->setJetP4(
xAOD::JetFourMom_t(barycenter.Pt(), barycenter.Eta(), barycenter.Phi(), barycenter.M()));
393 ATH_MSG_DEBUG(
"Built jet with eta: " <<
jet->eta() <<
", phi: " <<
jet->phi() <<
", pT: " <<
jet->pt() <<
", E: "<<
jet->e() );
398 outputTauHandle->push_back(std::make_unique<xAOD::TauJet>());
399 tau = outputTauHandle->back();
407 ATH_MSG_DEBUG(
"Changing (eta, phi) back to the RoI center due to negative energy: " <<
jet->e());
408 tau->
setP4(tau->
pt(), roiDescriptor->
eta(), roiDescriptor->
phi(), tau->
m());
431 ATH_CHECK(hitsInputDecorHandle.isValid());
433 ATH_CHECK(hitsOutputDecorHandle.isValid());
440 static const SG::AuxElement::ConstAccessor<float>
x(
"HitsXRelToBeamspot");
441 static const SG::AuxElement::ConstAccessor<float>
y(
"HitsYRelToBeamspot");
442 static const SG::AuxElement::ConstAccessor<float>
z(
"HitsZRelToBeamspot");
444 for(
size_t i = 0; i < inputTauContainer->
size(); ++i) {
446 const auto& inputHits = hitsInputDecorHandle(*inputTau);
450 tauHits.push_back(ROOT::Math::XYZVector(
x(**el),
y(**el),
z(**el)));
455 hitsOutputDecorHandle(*outputTau) = inputHits;
467 for(
size_t j = 0; j < inputTauContainer->
size(); ++j) {
468 outputDecorHandle(*outputTauHandle->at(j)) = inputDecorHandle(*inputTauContainer->
at(j));
485 if(!outputTauHandle->empty()) {
486 tau = outputTauHandle->back();
506 if(!VertexContainerHandle.
isValid()) {
507 ATH_MSG_DEBUG(
"No VertexContainer retrieved for the trigger element");
510 RoIVxContainer = VertexContainerHandle.
get();
522 StatusCode processStatus = StatusCode::SUCCESS;
529 processStatus = tool->executeVertexFinder(*tau, RoIVxContainer);
531 if(!processStatus.isFailure()) {
532 ATH_MSG_DEBUG(
" " << tool->name() <<
" executed successfully");
540 if(!processStatus.isFailure())
ATH_MSG_DEBUG(
"Starting Tool: " << tool->name());
543 processStatus = tool->execute(*tau);
545 if(!processStatus.isFailure()) {
546 ATH_MSG_DEBUG(
" " << tool->name() <<
" executed successfully");
554 if(!processStatus.isFailure())
ATH_MSG_DEBUG(
"Starting Tool: " << tool->name());
557 processStatus = tool->executeTrackFinder(*tau, *tauTrackHandle);
559 if(!processStatus.isFailure()) {
560 ATH_MSG_DEBUG(
" " << tool->name() <<
" executed successfully");
568 if(!processStatus.isFailure())
ATH_MSG_DEBUG(
"Starting Tool: " << tool->name());
571 processStatus = tool->execute(*tau);
573 if(!processStatus.isFailure()) {
574 ATH_MSG_DEBUG(
" " << tool->name() <<
" executed successfully");
584 if(!processStatus.isFailure())
ATH_MSG_DEBUG(
"Starting Tool: " << tool->name());
587 processStatus = tool->executeVertexVariables(*tau, dummyVxCont);
589 if(!processStatus.isFailure()) {
590 ATH_MSG_DEBUG(
" " << tool->name() <<
" executed successfully");
598 if(!processStatus.isFailure())
ATH_MSG_DEBUG(
"Starting Tool: " << tool->name());
601 processStatus = tool->execute(*tau);
603 if(!processStatus.isFailure()) {
604 ATH_MSG_DEBUG(
" " << tool->name() <<
" executed successfully");
615 if(!processStatus.isSuccess()) {
616 ATH_MSG_DEBUG(
"The tau object has NOT been registered in the tau container");
620 tauTrackHandle->erase(tauTrackHandle->end() - bad_tau->
nAllTracks(), tauTrackHandle->end());
622 outputTauHandle->pop_back();
629 float fJetEnergy = (*tau->
jetLink())->e();
632 if(fJetEnergy < 0.00001) {
633 ATH_MSG_DEBUG(
"Changing tau's (eta,phi) to RoI ones due to negative energy (PxPyPzE flips eta and phi)");
634 ATH_MSG_DEBUG(
"This is probably not needed anymore, method PxPyPzE has been corrected");
637 tau->
setP4(tau->
pt(), roiDescriptor->
eta(), roiDescriptor->
phi(), tau->
m());
639 ATH_MSG_DEBUG(
"Roi: " << roiDescriptor->
roiId() <<
", Tau eta: " << tau->
eta() <<
", phi: " << tau->
phi() <<
", pT: " << tau->
pt());
649 const float vtx_z = beamSpot->beamPos()[
Amg::z];
658 outputDecorHandle(*tau) = inputDecorHandle(*tau) + vtx_z;
667 pT = tau->
pt()/Gaudi::Units::GeV;
672 etaRoI = roiDescriptor->
eta();
673 phiRoI = roiDescriptor->
phi();
674 dEta_RoI =
eta - roiDescriptor->
eta();
675 dPhi_RoI =
phi - roiDescriptor->
phi();
676 if(dPhi_RoI < -
M_PI) dPhi_RoI += 2.0*
M_PI;
677 if(dPhi_RoI >
M_PI) dPhi_RoI -= 2.0*
M_PI;
680 float pre_mEflowApprox;
682 mEflowApprox = std::log10(std::max(pre_mEflowApprox, 140.0f));
684 float pre_ptRatioEflowApprox;
686 ptRatioEflowApprox = std::min(pre_ptRatioEflowApprox, 4.0f);
688 pt_jetseed_log = std::log10(tau->
ptJetSeed());
690 ptDetectorAxis = std::min(tau->
ptDetectorAxis()/Gaudi::Units::GeV, 10000.0);
691 ptDetectorAxis_log = std::log10(std::min(tau->
ptDetectorAxis()/Gaudi::Units::GeV, 10000.0));
696 EtHad /= Gaudi::Units::GeV;
698 EtEm /= Gaudi::Units::GeV;
700 float Et_raw = EtEm + EtHad;
701 if(Et_raw != 0) EMFrac = EtEm / Et_raw;
710 if(test) clustersMeanCenterLambda = tmp;
712 if(test) clustersMeanFirstEngDens = tmp;
714 if(test) clustersMeanEMProbability = tmp;
716 if(test) clustersMeanSecondLambda = tmp;
718 if(test) clustersMeanPresamplerFrac = tmp;
722 n_clusters = tau->
clusters().size();
723 for(
const auto& cluster : tau->
clusters()) {
726 cluster_et_log.push_back(std::log10(cls->et()));
727 cluster_dEta.push_back(cls->eta() - tau->
eta());
728 cluster_dPhi.push_back(cls->p4().DeltaPhi(tau->
p4()));
730 double log_second_R = -999;
732 if(success_SECOND_R) log_second_R = std::log10(log_second_R + 0.1);
733 cluster_log_SECOND_R.push_back(log_second_R);
735 double second_lambda = -999;
737 if(success_SECOND_LAMBDA) second_lambda = std::log10(second_lambda + 0.1);
738 cluster_SECOND_LAMBDA.push_back(second_lambda);
740 double center_lambda = -999;
742 if(success_CENTER_LAMBDA) center_lambda = std::log10(center_lambda + 1e-6);
743 cluster_CENTER_LAMBDA.push_back(center_lambda);
754 massTrkSys /= Gaudi::Units::GeV;
773 track_pt_log.push_back(std::log10(track->pt()));
774 track_dEta.push_back(track->eta() - tau->
eta());
775 track_dPhi.push_back(track->p4().DeltaPhi(tau->
p4()));
776 track_d0_abs_log.push_back(std::log10(std::abs(track->track()->d0()) + 1e-6));
777 track_z0sinthetaTJVA_abs_log.push_back(track->z0sinthetaTJVA());
779 uint8_t pixel_hits, pixel_dead;
782 float nPixelHitsPlusDeadSensor = -999;
783 if(success1_pixel_hits && success2_pixel_dead) nPixelHitsPlusDeadSensor = pixel_hits + pixel_dead;
784 track_nPixelHitsPlusDeadSensors.push_back(nPixelHitsPlusDeadSensor);
786 uint8_t sct_hits, sct_dead;
789 float nSCTHitsPlusDeadSensors = -999;
790 if(success1_sct_hits && success2_sct_dead) nSCTHitsPlusDeadSensors = sct_hits + sct_dead;
791 track_nSCTHitsPlusDeadSensors.push_back(nSCTHitsPlusDeadSensors);
797 n_hits = tauHits.size();
798 for(
const ROOT::Math::XYZVector& hit : tauHits) {
799 hit_z.push_back(hit.z());
809 if(score.isAvailable(*tau)) {
811 monitoredIdVariables.at(key +
"_TauJetScore_0p") = score(*tau);
812 }
else if(tau->
nTracks() == 1) {
813 monitoredIdVariables.at(key +
"_TauJetScore_1p") = score(*tau);
815 monitoredIdVariables.at(key +
"_TauJetScore_mp") = score(*tau);
819 if(scoreTrans.isAvailable(*tau)) {
821 monitoredIdVariables.at(key +
"_TauJetScoreTrans_0p") = scoreTrans(*tau);
822 }
else if(tau->
nTracks() == 1) {
823 monitoredIdVariables.at(key +
"_TauJetScoreTrans_1p") = scoreTrans(*tau);
825 monitoredIdVariables.at(key +
"_TauJetScoreTrans_mp") = scoreTrans(*tau);
835 if(z0.isAvailable(*tau)) {
836 monitoredHitZVariables.at(key +
"_z0") = z0(*tau);
838 if(sigma.isAvailable(*tau)) {
839 monitoredHitZVariables.at(key +
"_z0_sigma") = sigma(*tau);
848 <<
", Tau pT (GeV): " << pT <<
", Tau eta: " <<
eta <<
", Tau phi: " <<
phi
849 <<
", wrt RoI dEta: " << dEta_RoI <<
", dPhi: " << dPhi_RoI);
856 ATH_MSG_DEBUG(
"Output TauJetContainer size: " << outputTauHandle->size());
857 ATH_MSG_DEBUG(
"Output TauJetTrackContainer size: " << tauTrackHandle->size());
859 return StatusCode::SUCCESS;