22 return StatusCode::SUCCESS;
28 std::vector<std::shared_ptr<xAOD::TruthParticle>> true_taus_1p;
29 std::vector<std::shared_ptr<xAOD::TruthParticle>> true_taus_3p;
35 return {true_taus_1p, true_taus_3p};
39 for(
const auto xTruthParticle : *truth_cont) {
40 if(xTruthParticle->isTau()) {
41 ATH_MSG_DEBUG(
"Tau with status " << xTruthParticle->status() <<
" and charge " << xTruthParticle->charge());
44 std::shared_ptr xTruthTau = std::make_shared<xAOD::TruthParticle>();
45 xTruthTau->makePrivateStore(*xTruthParticle);
52 if(IsLeptonicTauAcc(*xTruthTau))
continue;
56 float pt = pt_visAcc(*xTruthTau);
57 float eta = eta_visAcc(*xTruthTau);
64 if(nTracksAcc(*xTruthTau) == 1) true_taus_1p.push_back(xTruthTau);
65 else if(nTracksAcc(*xTruthTau) == 3) true_taus_3p.push_back(xTruthTau);
69 return {true_taus_1p, true_taus_3p};
75 if(!xTruthTau->
hasDecayVtx())
return StatusCode::FAILURE;
78 IsLeptonicTauDec(*xTruthTau) =
false;
80 TLorentzVector VisSumTLV;
87 pt_visDec(*xTruthTau) = 0;
88 eta_visDec(*xTruthTau) = 0;
89 phi_visDec(*xTruthTau) = 0;
90 mvisDec(*xTruthTau) = 0;
91 childChargeSumDec(*xTruthTau) = 0;
92 nTracksDec(*xTruthTau) = 0;
97 for(std::size_t iChild = 0; iChild != nChildren; ++iChild) {
104 VisSumTLV += child->
p4();
105 childChargeSumDec(*xTruthTau) += child->
charge();
106 nTracksDec(*xTruthTau) += std::abs(child->
charge());
111 pt_visDec(*xTruthTau) = VisSumTLV.Pt();
112 eta_visDec(*xTruthTau) = VisSumTLV.Eta();
113 phi_visDec(*xTruthTau) = VisSumTLV.Phi();
114 mvisDec(*xTruthTau) = VisSumTLV.M();
116 if(childChargeSumDec(*xTruthTau) != xTruthTau->
charge() || nTracksDec(*xTruthTau)%2 == 0) {
117 ATH_MSG_WARNING(
"Strange tau: charge " << childChargeSumDec(*xTruthTau) <<
" and " << nTracksDec(*xTruthTau) <<
" tracks");
119 for(std::size_t iChild = 0; iChild != nChildren; ++iChild) {
125 return StatusCode::SUCCESS;
133 std::vector<std::shared_ptr<xAOD::TruthParticle>> true_taus_1p = true_taus.first;
134 std::vector<std::shared_ptr<xAOD::TruthParticle>> true_taus_3p = true_taus.second;
140 if(
info.isHLTTandP() ||
info.isHLTDiTau())
continue;
146 if(!true_taus_1p.empty()) {
151 if(!true_taus_3p.empty()) {
157 return StatusCode::SUCCESS;
176 bool hlt_fires =
m_trigDecTool->isPassed(
trigger, TrigDefs::Physics | TrigDefs::allowResurrectedDecision);
180 for(
const std::shared_ptr<xAOD::TruthParticle>& true_tau : true_taus) {
182 eta_vis = eta_visAcc(*true_tau);
183 phi_vis = phi_visAcc(*true_tau);
185 HLT_truth_match =
matchObjects(true_tau.get(), online_tau_vec, 0.2) && hlt_fires;
187 bool is_highPt =
false;
188 if(
info.isHLTSingleTau()) is_highPt = pt_vis >
info.getHLTTauThreshold() + 20.0;
190 fill(
monGroup, pt_vis, eta_vis, phi_vis, HLT_truth_match);
193 HLT_truth_match_highPt =
static_cast<bool>(HLT_truth_match);
194 fill(
monGroup, eta_vis, phi_vis, HLT_truth_match_highPt);
207 std::vector<float>
ratio, ptvis, etavis, phivis, mvis;
215 float matchedRatio = -999, matchedptvis = -999, matchedetavis = 999, matchedphivis = 999, matchedmvis = -999;
222 for(
auto& HLTTau : ef_taus) {
223 for(
const std::shared_ptr<xAOD::TruthParticle>& true_tau : true_taus) {
224 TLorentzVector true_tau4V;
225 true_tau4V.SetPtEtaPhiM(pt_visAcc(*true_tau),
226 eta_visAcc(*true_tau),
227 phi_visAcc(*true_tau),
229 if(true_tau4V.DeltaR(HLTTau->p4()) < 0.2) {
231 matchedetavis = eta_visAcc(*true_tau);
232 matchedphivis = phi_visAcc(*true_tau);
233 matchedmvis = mvisAcc(*true_tau);
234 matchedRatio = (HLTTau->p4().Pt() - pt_visAcc(*true_tau))/pt_visAcc(*true_tau);
238 if(matchedptvis > 0) {
239 ptvis.push_back(matchedptvis);
240 etavis.push_back(matchedetavis);
241 phivis.push_back(matchedphivis);
242 mvis.push_back(matchedmvis);
243 ratio.push_back(matchedRatio);
247 fill(
monGroup, pt_vis, eta_vis, phi_vis, mass_vis, PtRatio);