ATLAS Offline Software
MuonTruthClassifierFallback.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // MuonTruthClassifierFallback.cxx, (c) ATLAS Detector software
8 // Runs on muons without a truth particle link.
9 // Finds the nearest stable truth particle and adds its info to the muon.
11 
14 #include "xAODMuon/MuonContainer.h"
15 
16 namespace {
17  static const SG::AuxElement::Decorator<float> decorator_dR("MCTFallback_dR");
18  static const SG::AuxElement::Decorator<int> decorator_type("MCTFallback_truthType");
19  static const SG::AuxElement::Decorator<int> decorator_origin("MCTFallback_truthOrigin");
20 
21  static const SG::AuxElement::Decorator<float> decorator_pu_dR("MCTFallbackPU_dR");
22  static const SG::AuxElement::Decorator<int> decorator_pu_type("MCTFallbackPU_truthType");
23  static const SG::AuxElement::Decorator<int> decorator_pu_origin("MCTFallbackPU_truthOrigin");
24 
25  static const SG::AuxElement::Accessor<int> acc_tT("truthType");
26  static const SG::AuxElement::Accessor<int> acc_tO("truthOrigin");
27 
28 } // namespace
29 // Constructor
31  const IInterface* p) :
32  AthAlgTool(t, n, p) {
33  declareInterface<DerivationFramework::IAugmentationTool>(this);
34 }
35 
36 // Athena initialize and finalize
38  ATH_MSG_VERBOSE("initialize() ...");
39  ATH_CHECK(m_mcTruthClassifier.retrieve());
40 
41  ATH_CHECK(m_containerKey.initialize());
42  ATH_CHECK(m_truthSGKey.initialize());
43  ATH_CHECK(m_truthPileupSGKey.initialize());
44  ATH_CHECK(m_truthMuonSGKey.initialize());
45 
47  m_Truth_dR_Key = m_containerKey.key() + ".MCTFallback_dR";
48  m_Truth_type_Key = m_containerKey.key() + ".MCTFallback_truthType";
49  m_Truth_origin_Key = m_containerKey.key() + ".MCTFallback_truthOrigin";
50  ATH_CHECK(m_Truth_dR_Key.initialize());
51  ATH_CHECK(m_Truth_type_Key.initialize());
52  ATH_CHECK(m_Truth_origin_Key.initialize());
53 
54  m_Truth_PU_dR_Key = m_containerKey.key() + ".MCTFallbackPU_dR";
55  m_Truth_PU_type_Key = m_containerKey.key() + ".MCTFallbackPU_truthType";
56  m_Truth_PU_origin_Key = m_containerKey.key() + ".MCTFallbackPU_truthOrigin";
57  ATH_CHECK(m_Truth_PU_dR_Key.initialize());
58  ATH_CHECK(m_Truth_PU_type_Key.initialize());
59  ATH_CHECK(m_Truth_PU_origin_Key.initialize());
60 
61  return StatusCode::SUCCESS;
62 }
63 
65  // Retrieve main particle collection
66  const EventContext& ctx = Gaudi::Hive::currentContext();
67 
69  if (!parts.isValid()) {
70  ATH_MSG_ERROR("No Muon collection with name " << m_containerKey.fullKey() << " found in StoreGate!");
71  return StatusCode::FAILURE;
72  }
73  SG::ReadHandle<xAOD::TruthEventContainer> tec{m_truthSGKey, ctx};
74  if (!tec.isValid()) {
75  ATH_MSG_ERROR("No truth collection with name " << m_truthSGKey.fullKey() << " found in StoreGate!");
76  return StatusCode::FAILURE;
77  }
78  SG::ReadHandle<xAOD::TruthPileupEventContainer> tpec{m_truthPileupSGKey, ctx};
79  if (!tpec.isValid()) {
80  ATH_MSG_DEBUG("No truth pileup collection with name " << m_truthPileupSGKey.fullKey() << " found in StoreGate. Pile-up information will not be filled");
81  }
82 
83  SG::ReadHandle<xAOD::TruthParticleContainer> truthMuons{m_truthMuonSGKey, ctx};
84  if (!truthMuons.isValid()) {
85  ATH_MSG_ERROR("No truth muon collection with name " << m_truthMuonSGKey.fullKey() << " found in StoreGate!");
86  return StatusCode::FAILURE;
87  }
88 
89  // Set up the decorator
90 
91  for (const xAOD::IParticle* part : *parts) {
92  const xAOD::TruthParticle* closest = nullptr;
93  float minDR{FLT_MAX};
94  for (const xAOD::TruthParticle* muTruth : *truthMuons) {
95  const float dR = xAOD::P4Helpers::deltaR2(muTruth, part);
96  if (dR > minDR) continue;
97  closest = muTruth;
98  minDR = dR;
99  }
100 
101  for (const xAOD::TruthEvent* event : *tec) {
102  for (size_t parti = 0; parti < event->nTruthParticles(); parti++) {
103  const xAOD::TruthParticle* tpart = event->truthParticle(parti);
104  if (!tpart || !MC::isStable(tpart) || HepMC::is_simulation_particle(tpart) || !tpart->charge() || tpart->isMuon() ||
105  tpart->pt() < m_minPt)
106  continue;
107  const float dR = xAOD::P4Helpers::deltaR2(tpart, part);
108  if (dR > minDR) continue;
109  closest = tpart;
110  minDR = dR;
111  }
112  }
113 
114  decorator_dR(*part) = closest ? std::sqrt(minDR) : -1;
115 
116  int newType{-1}, newOrigin{-1};
117  if (closest && closest->isMuon()) {
118  newType = acc_tT(*closest);
119  newOrigin = acc_tO(*closest);
120  } else if (closest) {
121  auto res = m_mcTruthClassifier->particleTruthClassifier(closest);
122  newType = res.first;
123  newOrigin = res.second;
124  }
125  decorator_type(*part) = newType;
126  decorator_origin(*part) = newOrigin;
127 
128  decorator_pu_dR(*part) = -1;
129  decorator_pu_type(*part) = -1;
130  decorator_pu_origin(*part) = -1;
131 
132  minDR = FLT_MAX;
133 
134  if (tpec.isValid()) {
135  const xAOD::TruthParticle* closestPileup = nullptr;
136  for (auto event : *tpec) {
137  for (size_t parti = 0; parti < event->nTruthParticles(); parti++) {
138  const xAOD::TruthParticle* tpart = event->truthParticle(parti);
139  if (!tpart || !MC::isStable(tpart) || HepMC::is_simulation_particle(tpart) || !tpart->charge() || tpart->isMuon() ||
140  tpart->pt() < m_minPt)
141  continue;
142  const float dR = xAOD::P4Helpers::deltaR2(tpart, part);
143  if (dR > minDR) continue;
144  closestPileup = tpart;
145  minDR = dR;
146  }
147  }
148  decorator_pu_dR(*part) = (closestPileup ? std::sqrt(minDR) : -1);
149  int newPileupType{-1}, newPileupOrigin{-1};
150  if (closestPileup) {
151  auto res = m_mcTruthClassifier->particleTruthClassifier(closestPileup);
152  newPileupType = res.first;
153  newPileupOrigin = res.second;
154  }
155  decorator_pu_type(*part) = newPileupType;
156  decorator_pu_origin(*part) = newPileupOrigin;
157  }
158  }
159 
160  return StatusCode::SUCCESS;
161 }
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:66
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
xAODP4Helpers.h
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
xAOD::P4Helpers::deltaR2
double deltaR2(double rapidity1, double phi1, double rapidity2, double phi2)
from bare rapidity,phi
Definition: xAODP4Helpers.h:111
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:40
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
DerivationFramework::MuonTruthClassifierFallback::addBranches
virtual StatusCode addBranches() const override
Pass the thinning service
Definition: MuonTruthClassifierFallback.cxx:64
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
SG::Decorator
Helper class to provide type-safe access to aux data.
Definition: Decorator.h:58
HepMC::is_simulation_particle
bool is_simulation_particle(const T &p)
Method to establish if a particle (or barcode) was created during the simulation (TODO update to be s...
Definition: MagicNumbers.h:299
beamspotman.n
n
Definition: beamspotman.py:731
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
DerivationFramework::MuonTruthClassifierFallback::initialize
StatusCode initialize() override
Definition: MuonTruthClassifierFallback.cxx:37
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
res
std::pair< std::vector< unsigned int >, bool > res
Definition: JetGroupProductTest.cxx:14
DerivationFramework::MuonTruthClassifierFallback::MuonTruthClassifierFallback
MuonTruthClassifierFallback(const std::string &t, const std::string &n, const IInterface *p)
Constructor with parameters.
Definition: MuonTruthClassifierFallback.cxx:30
xAOD::TruthEvent_v1
Class describing a signal truth event in the MC record.
Definition: TruthEvent_v1.h:35
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonTruthClassifierFallback.h
MuonContainer.h
MC::isStable
bool isStable(const T &p)
Definition: HepMCHelpers.h:30
xAOD::TruthParticle_v1::isMuon
bool isMuon() const
Whether the particle is a muon (or antimuon)
xAOD::TruthParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TruthParticle_v1.cxx:166
doL1CaloHVCorrections.parts
parts
Definition: doL1CaloHVCorrections.py:334
AthAlgTool
Definition: AthAlgTool.h:26
xAOD::TruthParticle_v1::charge
double charge() const
Physical charge.
HepMCHelpers.h