Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
TrigTauMonitorTruthAlgorithm.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
9 
10 TrigTauMonitorTruthAlgorithm::TrigTauMonitorTruthAlgorithm(const std::string& name, ISvcLocator* pSvcLocator)
11  : TrigTauMonitorBaseAlgorithm(name, pSvcLocator)
12 {}
13 
14 
17 
19 
20  return StatusCode::SUCCESS;
21 }
22 
23 
24 std::pair<std::vector<std::shared_ptr<xAOD::TruthParticle>>, std::vector<std::shared_ptr<xAOD::TruthParticle>>> TrigTauMonitorTruthAlgorithm::getTruthTaus(const EventContext& ctx, const float threshold) const
25 {
26  std::vector<std::shared_ptr<xAOD::TruthParticle>> true_taus_1p;
27  std::vector<std::shared_ptr<xAOD::TruthParticle>> true_taus_3p;
28 
29  // Truth Taus distributions
31  if(!truth_cont.isValid()) {
32  ATH_MSG_WARNING("Failed to retrieve truth Taus");
33  return {true_taus_1p, true_taus_3p};
34  }
35 
36  static const SG::ConstAccessor<double> acc_ptvis("pt_vis");
37  static const SG::ConstAccessor<double> acc_etavis("eta_vis");
38  static const SG::ConstAccessor<int> acc_ntracks("nTracks");
39  static const SG::ConstAccessor<char> acc_isleptonic("IsLeptonicTau");
40 
41  // Fill truth tau containers
42  for(const auto xTruthParticle : *truth_cont) {
43  if(xTruthParticle->isTau()) {
44  ATH_MSG_DEBUG("Tau with status " << xTruthParticle->status() << " and charge " << xTruthParticle->charge());
45 
46  // Create a copy of the original TruthParticle, to augment it with tau-specific properties
47  std::shared_ptr xTruthTau = std::make_shared<xAOD::TruthParticle>();
48  xTruthTau->makePrivateStore(*xTruthParticle);
49 
50  // Keep only truth taus
51  if(examineTruthTau(xTruthTau).isFailure()) continue;
52 
53  // Keep only the hadronic decay mode
54  if(acc_isleptonic(*xTruthTau)) continue;
55 
56  float pt = acc_ptvis(*xTruthTau);
57  float eta = acc_etavis(*xTruthTau);
58  ATH_MSG_DEBUG("True Tau visible pt: " << pt << ", eta: " << eta);
59 
60  // Keep only truth taus in the barrel region, with a pT > 20 GeV (offline minimum threshold)
61  if(pt < threshold || std::abs(eta) > 2.47) continue;
62 
63  int nTracks = acc_ntracks(*xTruthTau);
64  if(nTracks == 1) true_taus_1p.push_back(xTruthTau);
65  else if(nTracks == 3) true_taus_3p.push_back(xTruthTau);
66  }
67  }
68 
69  return {true_taus_1p, true_taus_3p};
70 }
71 
72 
73 StatusCode TrigTauMonitorTruthAlgorithm::examineTruthTau(const std::shared_ptr<xAOD::TruthParticle>& xTruthTau) const
74 {
75  if(!xTruthTau->hasDecayVtx()) return StatusCode::FAILURE;
76  static const SG::Accessor<double> acc_ptvis("pt_vis");
77  static const SG::Accessor<double> acc_etavis("eta_vis");
78  static const SG::Accessor<double> acc_phivis("phi_vis");
79  static const SG::Accessor<double> acc_mvis("mvis");
80  static const SG::Accessor<int> acc_childChargeSum("childChargeSum");
81  static const SG::Accessor<int> acc_ntracks("nTracks");
82  static const SG::Accessor<char> acc_isleptonic("IsLeptonicTau");
83 
84  acc_isleptonic(*xTruthTau) = false;
85 
86  TLorentzVector VisSumTLV;
87  acc_ptvis(*xTruthTau) = 0.;
88  acc_etavis(*xTruthTau) = 0.;
89  acc_phivis(*xTruthTau) = 0.;
90  acc_mvis(*xTruthTau) = 0.;
91  acc_childChargeSum(*xTruthTau) = 0;
92  acc_ntracks(*xTruthTau) = 0;
93 
94  const xAOD::TruthVertex* decayvtx = xTruthTau->decayVtx();
95  if(decayvtx) {
96  const std::size_t nChildren = decayvtx->nOutgoingParticles();
97  for(std::size_t iChild = 0; iChild != nChildren; ++iChild) {
98  const xAOD::TruthParticle* child = decayvtx->outgoingParticle(iChild);
99  if(child) {
100  if(MC::isSMNeutrino(child)) continue;
101  if(!MC::isPhysical(child)) continue;
102  ATH_MSG_DEBUG("Child " << child->pdgId() << ", status " << child->status() << ", charge " << child->charge());
103  if(MC::isSMLepton(child)) acc_isleptonic(*xTruthTau) = true; // Just selects charged SM Leptons as we have already skipped SM neutrinos
104  VisSumTLV += child->p4();
105  acc_childChargeSum(*xTruthTau) += child->charge();
106  acc_ntracks(*xTruthTau) += std::abs(child->charge());
107  }
108  }
109  }
110  acc_ptvis(*xTruthTau) = VisSumTLV.Pt();
111  acc_etavis(*xTruthTau) = VisSumTLV.Eta();
112  acc_phivis(*xTruthTau) = VisSumTLV.Phi();
113  acc_mvis(*xTruthTau) = VisSumTLV.M();
114 
115  if(acc_childChargeSum(*xTruthTau) != xTruthTau->charge() || acc_ntracks(*xTruthTau)%2 == 0) {
116  ATH_MSG_WARNING("Strange tau: charge " << acc_childChargeSum(*xTruthTau) << " and " << acc_ntracks(*xTruthTau) << " tracks");
117  const std::size_t nChildren = decayvtx->nOutgoingParticles();
118  for(std::size_t iChild = 0; iChild != nChildren; ++iChild) {
119  const xAOD::TruthParticle * child = decayvtx->outgoingParticle(iChild);
120  if(child) ATH_MSG_WARNING("Child "<< child->pdgId() << ", status "<< child->status() << ", charge "<< child->charge());
121  }
122  }
123 
124  return StatusCode::SUCCESS;
125 }
126 
127 
129 {
130  // Truth taus
131  auto true_taus = getTruthTaus(ctx, 20.0);
132  std::vector<std::shared_ptr<xAOD::TruthParticle>> true_taus_1p = true_taus.first;
133  std::vector<std::shared_ptr<xAOD::TruthParticle>> true_taus_3p = true_taus.second;
134 
135  for(const std::string& trigger : m_triggers) {
136 
137  // skip ditau and T&P chains:
138  const TrigTauInfo& info = getTrigInfo(trigger);
139  if( info.isHLTTandP() || info.isHLTDiTau()) continue;
140 
141  // Online taus
142  std::vector<const xAOD::TauJet*> hlt_taus = getOnlineTausAll(trigger, true);
143 
144  if(!true_taus_1p.empty()) {
145  if(m_do_variable_plots) fillTruthVars(hlt_taus, true_taus_1p, trigger, "1P");
146  if(m_do_efficiency_plots) fillTruthEfficiency(hlt_taus, true_taus_1p, trigger, "1P");
147  }
148 
149  if(!true_taus_3p.empty()) {
150  if(m_do_variable_plots) fillTruthVars(hlt_taus, true_taus_3p, trigger, "3P");
151  if(m_do_efficiency_plots) fillTruthEfficiency(hlt_taus, true_taus_3p, trigger, "3P");
152  }
153  }
154 
155  return StatusCode::SUCCESS;
156 }
157 
158 
159 void TrigTauMonitorTruthAlgorithm::fillTruthEfficiency(const std::vector<const xAOD::TauJet*>& online_tau_vec, const std::vector<std::shared_ptr<xAOD::TruthParticle>>& true_taus, const std::string& trigger, const std::string& nProng) const
160 {
161  ATH_MSG_DEBUG("Fill Truth Tau Matching to Offline and Online Taus efficiencies: " << trigger);
162 
163  const TrigTauInfo& info = getTrigInfo(trigger);
164 
165  auto monGroup = getGroup(trigger+"_Truth_Efficiency_"+nProng);
166 
167  // Truth Tau + HLT Tau / Truth Tau
168  auto pt_vis = Monitored::Scalar<float>("pt_vis", 0.0);
169  auto eta_vis = Monitored::Scalar<float>("eta_vis", 0.0);
170  auto phi_vis = Monitored::Scalar<float>("phi_vis", 0.0);
171  auto HLT_truth_match = Monitored::Scalar<bool>("HLT_pass", false);
172  auto HLT_truth_match_highPt = Monitored::Scalar<bool>("HLT_pass_highPt", false);
173 
174  bool hlt_fires = m_trigDecTool->isPassed(trigger, TrigDefs::Physics | TrigDefs::allowResurrectedDecision);
175 
176  static const SG::AuxElement::ConstAccessor<double> acc_ptvis("pt_vis");
177  static const SG::AuxElement::ConstAccessor<double> acc_etavis("eta_vis");
178  static const SG::AuxElement::ConstAccessor<double> acc_phivis("phi_vis");
179 
180  for(const std::shared_ptr<xAOD::TruthParticle>& true_tau : true_taus) {
181  pt_vis = acc_ptvis(*true_tau)/Gaudi::Units::GeV;
182  eta_vis = acc_etavis(*true_tau);
183  phi_vis = acc_phivis(*true_tau);
184 
185  HLT_truth_match = matchTruthObjects(true_tau.get(), online_tau_vec, 0.2) && hlt_fires;
186 
187  bool is_highPt = false;
188  if(info.isHLTSingleTau()) is_highPt = pt_vis > info.getHLTTauThreshold() + 20.0;
189 
190  fill(monGroup, pt_vis, eta_vis, phi_vis, HLT_truth_match);
191 
192  if(is_highPt) {
193  HLT_truth_match_highPt = static_cast<bool>(HLT_truth_match);
194  fill(monGroup, eta_vis, phi_vis, HLT_truth_match_highPt);
195  }
196  }
197  ATH_MSG_DEBUG("After fill Truth efficiencies");
198 }
199 
200 
201 void TrigTauMonitorTruthAlgorithm::fillTruthVars(const std::vector<const xAOD::TauJet*>& ef_taus, const std::vector<std::shared_ptr<xAOD::TruthParticle>>& true_taus, const std::string& trigger, const std::string& nProng) const
202 {
203  ATH_MSG_DEBUG("Fill Truth variables: " << trigger);
204 
205  auto monGroup = getGroup(trigger+"_TruthVars_"+nProng);
206 
207  std::vector<float> ratio, ptvis, etavis, phivis, mvis;
208 
209  auto PtRatio = Monitored::Collection("PtRatio", ratio);
210  auto pt_vis = Monitored::Collection("pt_vis", ptvis);
211  auto eta_vis = Monitored::Collection("eta_vis", etavis);
212  auto phi_vis = Monitored::Collection("phi_vis", phivis);
213  auto mass_vis = Monitored::Collection("mass_vis", mvis);
214 
215  float matchedRatio = -999, matchedptvis = -999, matchedetavis = 999, matchedphivis = 999, matchedmvis = -999;
216 
217  static const SG::AuxElement::ConstAccessor<double> acc_ptvis("pt_vis");
218  static const SG::AuxElement::ConstAccessor<double> acc_etavis("eta_vis");
219  static const SG::AuxElement::ConstAccessor<double> acc_phivis("phi_vis");
220  static const SG::AuxElement::ConstAccessor<double> acc_mvis("mvis");
221 
222  // Visible-Truth Tau matching to HLT Tau
223  static const SG::ConstAccessor<double> pt_visAcc("pt_vis");
224  static const SG::ConstAccessor<double> eta_visAcc("eta_vis");
225  static const SG::ConstAccessor<double> phi_visAcc("phi_vis");
226  static const SG::ConstAccessor<double> mvisAcc("mvis");
227  for(auto& HLTTau : ef_taus) {
228  for(const std::shared_ptr<xAOD::TruthParticle>& true_tau : true_taus) {
229  if(matchTruthObjects(true_tau.get(), {HLTTau}, 0.2)) {
230  double pt_vis = acc_ptvis(*true_tau);
231  matchedptvis = pt_vis/Gaudi::Units::GeV;
232  matchedetavis = acc_etavis(*true_tau);
233  matchedphivis = acc_phivis(*true_tau);
234  matchedmvis = acc_mvis(*true_tau);
235  matchedRatio = HLTTau->pt()/pt_vis - 1.;
236  }
237  }
238 
239  if(matchedptvis > 0) {
240  ptvis.push_back(matchedptvis);
241  etavis.push_back(matchedetavis);
242  phivis.push_back(matchedphivis);
243  mvis.push_back(matchedmvis);
244  ratio.push_back(matchedRatio);
245  }
246  }
247 
248  fill(monGroup, pt_vis, eta_vis, phi_vis, mass_vis, PtRatio);
249 
250  ATH_MSG_DEBUG("After fill Truth variables");
251 }
grepfile.info
info
Definition: grepfile.py:38
TrigTauMonitorTruthAlgorithm::TrigTauMonitorTruthAlgorithm
TrigTauMonitorTruthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TrigTauMonitorTruthAlgorithm.cxx:10
xAOD::TruthVertex_v1::nOutgoingParticles
size_t nOutgoingParticles() const
Get the number of outgoing particles.
python.TIDAMonTool.monGroup
def monGroup(analysis_chain)
Definition: TIDAMonTool.py:297
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:17
AthMonitorAlgorithm::m_trigDecTool
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecTool
Tool to tell whether a specific trigger is passed.
Definition: AthMonitorAlgorithm.h:340
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:68
TrigTauMonitorBaseAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: TrigTauMonitorBaseAlgorithm.cxx:16
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
SG::ReadHandle< xAOD::TruthParticleContainer >
test_pyathena.pt
pt
Definition: test_pyathena.py:11
SG::ConstAccessor< double >
TrigTauMonitorBaseAlgorithm::m_do_variable_plots
Gaudi::Property< bool > m_do_variable_plots
Definition: TrigTauMonitorBaseAlgorithm.h:41
TrigTauMonitorTruthAlgorithm.h
isSMLepton
bool isSMLepton(const T &p)
Definition: AtlasPID.h:183
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
MC::isPhysical
bool isPhysical(const T &p)
Identify if the particle is physical, i.e. is stable or decayed.
Definition: HepMCHelpers.h:51
TrigTauMonitorTruthAlgorithm::examineTruthTau
StatusCode examineTruthTau(const std::shared_ptr< xAOD::TruthParticle > &xTruthParticle) const
Definition: TrigTauMonitorTruthAlgorithm.cxx:73
TrigTauMonitorBaseAlgorithm::getOnlineTausAll
std::vector< const xAOD::TauJet * > getOnlineTausAll(const std::string &trigger, bool include_0P=true) const
Definition: TrigTauMonitorBaseAlgorithm.cxx:54
xAOD::TruthParticle_v1::hasDecayVtx
bool hasDecayVtx() const
Check for a decay vertex on this particle.
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:37
TrigTauMonitorBaseAlgorithm::matchTruthObjects
bool matchTruthObjects(const T1 *true_tau, const std::vector< const T2 * > &tau_vec, float threshold) const
Definition: TrigTauMonitorBaseAlgorithm.h:95
TrigTauMonitorTruthAlgorithm::fillTruthEfficiency
void fillTruthEfficiency(const std::vector< const xAOD::TauJet * > &online_tau_vec_all, const std::vector< std::shared_ptr< xAOD::TruthParticle >> &true_taus, const std::string &trigger, const std::string &nProng) const
Definition: TrigTauMonitorTruthAlgorithm.cxx:159
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AthMonitorAlgorithm::fill
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable >> &&variables) const
Fills a vector of variables to a group by reference.
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::TruthParticle_v1::decayVtx
const TruthVertex_v1 * decayVtx() const
The decay vertex of this particle.
xAOD::TruthVertex_v1
Class describing a truth vertex in the MC record.
Definition: TruthVertex_v1.h:37
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
TrigTauMonitorTruthAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: TrigTauMonitorTruthAlgorithm.cxx:15
threshold
Definition: chainparser.cxx:74
TrigTauMonitorBaseAlgorithm
Definition: TrigTauMonitorBaseAlgorithm.h:24
TrigTauMonitorBaseAlgorithm::m_do_efficiency_plots
Gaudi::Property< bool > m_do_efficiency_plots
Definition: TrigTauMonitorBaseAlgorithm.h:40
TrigTauInfo
Definition: TrigTauInfo.h:15
xAOD::TruthParticle_v1::status
int status() const
Status code.
TrigTauMonitorTruthAlgorithm::getTruthTaus
std::pair< std::vector< std::shared_ptr< xAOD::TruthParticle > >, std::vector< std::shared_ptr< xAOD::TruthParticle > > > getTruthTaus(const EventContext &ctx, const float threshold=20.0) const
Definition: TrigTauMonitorTruthAlgorithm.cxx:24
python.compareTCTs.ratio
ratio
Definition: compareTCTs.py:295
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
isSMNeutrino
bool isSMNeutrino(const T &p)
Definition: AtlasPID.h:204
TrigTauMonitorBaseAlgorithm::m_triggers
Gaudi::Property< std::vector< std::string > > m_triggers
Definition: TrigTauMonitorBaseAlgorithm.h:32
TrigTauMonitorBaseAlgorithm::getTrigInfo
const TrigTauInfo & getTrigInfo(const std::string &trigger) const
Definition: TrigTauMonitorBaseAlgorithm.h:45
xAOD::TruthParticle_v1::p4
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
Definition: TruthParticle_v1.cxx:196
ConstAccessor.h
Helper class to provide constant type-safe access to aux data.
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
xAOD::TruthParticle_v1::pdgId
int pdgId() const
PDG ID code.
TrigTauMonitorTruthAlgorithm::processEvent
virtual StatusCode processEvent(const EventContext &ctx) const override
Definition: TrigTauMonitorTruthAlgorithm.cxx:128
TrigTauMonitorTruthAlgorithm::fillTruthVars
void fillTruthVars(const std::vector< const xAOD::TauJet * > &tau_vec, const std::vector< std::shared_ptr< xAOD::TruthParticle >> &true_taus, const std::string &trigger, const std::string &nProng) const
Definition: TrigTauMonitorTruthAlgorithm.cxx:201
Decorator.h
Helper class to provide type-safe access to aux data.
xAOD::TruthVertex_v1::outgoingParticle
const TruthParticle_v1 * outgoingParticle(size_t index) const
Get one of the outgoing particles.
Definition: TruthVertex_v1.cxx:119
AthMonitorAlgorithm::getGroup
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
Definition: AthMonitorAlgorithm.cxx:164
xAOD::TruthParticle_v1::charge
double charge() const
Physical charge.
HepMCHelpers.h
TrigTauMonitorTruthAlgorithm::m_truthParticleKey
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_truthParticleKey
Definition: TrigTauMonitorTruthAlgorithm.h:32