30 for (
unsigned int i = 0;
43 for (
auto egammaTruth : egammaTruthContainer) {
58 ISvcLocator* pSvcLocator)
102 return StatusCode::SUCCESS;
108 return StatusCode::SUCCESS;
122 std::make_unique<xAOD::TruthParticleContainer>(),
123 std::make_unique<xAOD::TruthParticleAuxContainer>()));
130 if (!truthEvtContainer.
isValid() || truthEvtContainer->empty()) {
133 <<
" or container empty, returning");
134 return StatusCode::SUCCESS;
137 for (
const auto& truthParticleLink :
138 truthEvtContainer->front()->truthParticleLinks()) {
139 if (!truthParticleLink.isValid())
145 *egammaTruthContainer,
147 truthParticleLink.getDataPtr());
159 static const SG::AuxElement::Accessor<ClusterLink_t> accClusLink(
161 static const SG::AuxElement::Accessor<ElectronLink_t> accElLink(
163 static const SG::AuxElement::Accessor<PhotonLink_t> accPhLink(
172 egammaTruthContainer.
ptr()));
181 egammaTruthContainer.
ptr()));
190 egammaTruthContainer.
ptr()));
199 egammaTruthContainer.
ptr()));
202 return StatusCode::SUCCESS;
207 const EventContext& ctx,
211 if ((truth->
pdgId() != 22 && abs(truth->
pdgId()) != 11) ||
243 const EventContext& ctx,
248 auto *truthParticle = egammaTruthContainer.
push_back(std::make_unique<xAOD::TruthParticle>());
249 truthParticle->setPdgId(truth->
pdgId());
251 truthParticle->setStatus(truth->
status());
252 truthParticle->setPx(truth->
px());
253 truthParticle->setPy(truth->
py());
254 truthParticle->setPz(truth->
pz());
255 truthParticle->setE(truth->
e());
256 truthParticle->setM(truth->
m());
257 truthParticle->setProdVtxLink(truth->
prodVtxLink());
260 static const SG::AuxElement::Accessor<ClusterLink_t> accClusLink(
262 static const SG::AuxElement::Accessor<ElectronLink_t> accElLink(
264 static const SG::AuxElement::Accessor<PhotonLink_t> accPhLink(
266 static const SG::AuxElement::Accessor<TruthLink_t> accTruthLink(
267 "truthParticleLink");
268 static const SG::AuxElement::Accessor<int> accType(
"truthType");
269 static const SG::AuxElement::Accessor<int> accOrigin(
"truthOrigin");
270 static const SG::AuxElement::Accessor<unsigned int> accClassification(
"truthClassification");
277 accTruthLink(*truthParticle) =
TruthLink_t(truth, *oldContainer, ctx);
278 accTruthLink(*truthParticle).toPersistent();
281 accType(*truthParticle) =
static_cast<int>(info.first);
282 accOrigin(*truthParticle) =
static_cast<int>(info.second);
291 const std::string& name)
294 ATH_MSG_FATAL(
"The WriteDecorHandle should not be configured directly.");
295 return StatusCode::FAILURE;
298 keys.emplace_back(name +
".truthParticleLink");
299 keys.emplace_back(name +
".truthType");
300 keys.emplace_back(name +
".truthOrigin");
301 keys.emplace_back(name +
".truthClassification");
303 return StatusCode::SUCCESS;
310 const EventContext& ctx)
311 :
el(hkeys.at(0), ctx)
312 ,
type(hkeys.at(1), ctx)
313 ,
origin(hkeys.at(2), ctx)
320 const EventContext& ctx,
321 const T* particle)
const
324 std::tie(info.first, info.second, info.genPart, std::ignore) =
m_mcTruthClassifier->particleTruthClassifier_full(particle, ctx);
333 const EventContext& ctx,
336 MCTruthInfo_t info{};
340 electron->caloCluster()) {
341 ATH_MSG_DEBUG(
"Trying cluster-based truth classification for electron");
344 std::tie(info.first, info.second, info.genPart, std::ignore) = ret;
348template<
class T,
class L>
351 const EventContext& ctx,
354 const SG::AuxElement::Accessor<L>& linkAccess,
361 for (
auto particle : *decoHandles.
readHandle()) {
369 truthParticle, truthParticles, ctx);
371 "Decorating object with link to truth, index = " << link.index());
372 decoHandles.
el(*particle) = link;
376 decoHandles.
el(*particle).toPersistent();
378 <<
" truthOrigin = " << info.second);
379 decoHandles.
type(*particle) =
static_cast<int>(info.first);
380 decoHandles.
origin(*particle) =
static_cast<int>(info.second);
385 if (!egammaTruthContainer) {
387 return StatusCode::FAILURE;
393 getEgammaTruthParticle(truth, *egammaTruthContainer);
397 bool annotateLink =
true;
398 const auto& link = linkAccess(*truthEgamma);
399 if (link.isValid()) {
400 auto oldPart = *link;
401 if (oldPart && truthEgamma->
e() > 0 &&
402 std::abs(oldPart->e() / truthEgamma->
e() - 1) <
403 std::abs(particle->e() / truthEgamma->
e() - 1)) {
406 <<
" already set to a better matched particle: "
408 annotateLink =
false;
413 L link(particle, *decoHandles.
readHandle(), ctx);
414 linkAccess(*truthEgamma) = link;
415 linkAccess(*truthEgamma).toPersistent();
421 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define CHECK(...)
Evaluate an expression and check for errors.
ATLAS-specific HepMC functions.
ElementLink< xAOD::PhotonContainer > PhotonLink_t
ElementLink< xAOD::ElectronContainer > ElectronLink_t
Handle class for reading from StoreGate.
Handle class for adding a decoration to an object.
Handle class for recording to StoreGate.
ElementLink< xAOD::TruthParticleContainer > TruthLink_t
An algorithm that can be simultaneously executed in multiple threads.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
ElementLink implementation for ROOT usage.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
Gaudi::Property< bool > m_doEgammaTruthContainer
Create egamma truth container?
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_truthParticleContainerKey
Name of the truth particle container.
Gaudi::Property< std::string > m_electronDecName
The electron container name property used to initialize the WriteDecorHandleKeyArray.
Gaudi::Property< bool > m_matchElectrons
Match electrons?
SG::WriteDecorHandleKeyArray< xAOD::ElectronContainer > m_fwdElectronDecKeys
The fwd electron container decor handle key array.
SG::WriteDecorHandleKeyArray< xAOD::PhotonContainer > m_photonDecKeys
The photon container decor handle key array.
StatusCode initializeDecorKeys(SG::WriteDecorHandleKeyArray< T > &keys, const std::string &name)
A function that initializes the decor handles, but also checks the naming convention.
Gaudi::Property< bool > m_matchClusters
Match clusters?
StatusCode match(const EventContext &ctx, const xAOD::TruthParticleContainer &truthParticles, const SG::WriteDecorHandleKeyArray< T > &hkeys, const SG::AuxElement::Accessor< L > &linkAccess, xAOD::TruthParticleContainer *egammaTruthContainer) const
Loop over elements in the reco container, decorate them with truth info and decorate the truth partic...
Gaudi::Property< bool > m_matchPhotons
Match photons?
SG::WriteHandleKey< xAOD::TruthParticleContainer > m_egammaTruthParticleContainerKey
Name of the output egamma truth container.
virtual StatusCode execute(const EventContext &ctx) const override final
execute on container
SG::WriteDecorHandleKeyArray< xAOD::ElectronContainer > m_electronDecKeys
The electron container decor handle key array.
Gaudi::Property< std::string > m_photonDecName
The photon container name property used to initialize the WriteDecorHandleKeyArray.
void getNewTruthParticle(const EventContext &ctx, xAOD::TruthParticleContainer &egammaTruthContainer, const xAOD::TruthParticle *truth, const xAOD::TruthParticleContainer *oldContainer) const
Create a copy a truth particle, add it to the new getNewTruthParticle container and decorate it with ...
Gaudi::Property< float > m_minPt
Minimum Pt to enter egamma truth particle container.
Gaudi::Property< std::string > m_fwdElectronDecName
The fwd electron name property used to initialize the WriteDecorHandleKeyArray.
bool isPromptEgammaParticle(const EventContext &ctx, const xAOD::TruthParticle *truth) const
Return true if the truth particle is a prompt electron or photon.
Gaudi::Property< bool > m_matchForwardElectrons
Match fwd electrons?
Gaudi::Property< float > m_minPtFSR
Minimum Pt for FSR to enter egamma truth particle container.
Gaudi::Property< std::string > m_clusterDecName
The egamma cluster name property used to initialize the WriteDecorHandleKeyArray.
MCTruthInfo_t particleTruthClassifier(const EventContext &ctx, const T *) const
return the result of MCTruthClassifier::particleTruthClassifier or do a second pass for electrons bas...
SG::WriteDecorHandleKeyArray< xAOD::CaloClusterContainer > m_clusterDecKeys
The egamma cluster decor handle key array.
egammaTruthAssociationAlg(const std::string &name, ISvcLocator *pSvcLocator)
constructor
Gaudi::Property< bool > m_UPCmode
Allow electron from photon in egamma truth particle container.
ToolHandle< IMCTruthClassifier > m_mcTruthClassifier
MCTruthClassifier.
virtual StatusCode finalize() override final
finalize method
virtual StatusCode initialize() override final
initialize method
SG::ReadHandleKey< xAOD::TruthEventContainer > m_truthEventContainerKey
Name of the truth event container.
int status() const
Status code.
virtual double m() const override final
The mass of the particle.
int pdgId() const
PDG ID code.
const ElementLink< TruthVertexContainer > & decayVtxLink() const
The decay vertex link of this particle.
float px() const
The x component of the particle's momentum.
virtual double e() const override final
The total energy of the particle.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
float py() const
The y component of the particle's momentum.
float pz() const
The z component of the particle's momentum.
const ElementLink< TruthVertexContainer > & prodVtxLink() const
The production vertex link of this particle.
const TruthParticle_v1 * incomingParticle(size_t index) const
Get one of the incoming particles.
size_t nIncomingParticles() const
Get the number of incoming particles.
ElementLink< xAOD::CaloClusterContainer > ClusterLink_t
::StatusCode StatusCode
StatusCode definition for legacy code.
bool is_same_particle(const T1 &p1, const T2 &p2)
Method to establish if two particles in the GenEvent actually represent the same 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...
std::tuple< unsigned int, T > defOrigOfParticle(T thePart)
bool isDecayed(const T &p)
Identify if the particle decayed.
bool isPhysical(const T &p)
Identify if the particle is physical, i.e. is stable or decayed.
DecorHandleKeyArray< WriteDecorHandle< T, S >, WriteDecorHandleKey< T >, Gaudi::DataHandle::Writer > WriteDecorHandleKeyArray
bool isFwdElectron(const xAOD::Egamma *eg)
is the object a Fwd electron
const xAOD::TruthParticle * getTruthParticle(const xAOD::IParticle &p)
Return the truthParticle associated to the given IParticle (if any).
TruthParticle_v1 TruthParticle
Typedef to implementation.
TruthParticleContainer_v1 TruthParticleContainer
Declare the latest version of the truth particle container.
Electron_v1 Electron
Definition of the current "egamma version".
helper class to contain write decoration handles
writeDecorHandles(const SG::WriteDecorHandleKeyArray< T > &keys, const EventContext &ctx)
SG::ReadHandle< T > & readHandle()
SG::WriteDecorHandle< T, int > type
SG::WriteDecorHandle< T, unsigned int > classification
SG::WriteDecorHandle< T, int > origin
SG::WriteDecorHandle< T, ElementLink< xAOD::TruthParticleContainer > > el