ATLAS Offline Software
Loading...
Searching...
No Matches
xAODTruthParticleSlimmerElectron.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include "AthLinks/ElementLink.h"
7
9
10#include "GaudiKernel/MsgStream.h"
11#include "GaudiKernel/DataSvc.h"
12#include "GaudiKernel/PhysicalConstants.h"
13
17
20
21xAODTruthParticleSlimmerElectron::xAODTruthParticleSlimmerElectron(const std::string &name, ISvcLocator *svcLoc)
22 : AthAlgorithm(name, svcLoc)
23{
24}
25
27{
29 ATH_MSG_INFO("xAOD output TruthParticleContainerElectron name = " << m_xaodTruthParticleContainerNameElectron.key());
31 ATH_MSG_INFO("xAOD input xAODTruthEventContainerName name = " << m_xaodTruthEventContainerName.key());
32 return StatusCode::SUCCESS;
33}
34
36{
37 // If the containers already exists then assume that nothing needs to be done
39 {
40 ATH_MSG_WARNING("xAOD Electron Truth Particles are already available in the event");
41 return StatusCode::SUCCESS;
42 }
43
44 // Create new output container
46 ATH_CHECK(xTruthParticleContainerElectron.record(std::make_unique<xAOD::TruthParticleContainer>(), std::make_unique<xAOD::TruthParticleAuxContainer>()));
47 ATH_MSG_INFO("Recorded TruthParticleContainerElectron with key: " << m_xaodTruthParticleContainerNameElectron.key());
48
49 // Retrieve full TruthEventContainer container
51 if ( !xTruthEventContainer.isValid() )
52 {
53 ATH_MSG_ERROR("No TruthEvent collection with name " << m_xaodTruthEventContainerName.key() << " found in StoreGate!");
54 return StatusCode::FAILURE;
55 }
56 // Set up decorators if needed
58 for (itr = xTruthEventContainer->begin(); itr!=xTruthEventContainer->end(); ++itr) {
59
60 unsigned int nPart = (*itr)->nTruthParticles();
61 std::vector<int> uniqueID_list;
62 int zero_uniqueID=0;
63 int dup_uniqueID=0;
64 for (unsigned int iPart = 0; iPart < nPart; ++iPart) {
65 const xAOD::TruthParticle* theParticle = (*itr)->truthParticle(iPart);
66 int my_uniqueID = HepMC::uniqueID(theParticle);
67 if (my_uniqueID == HepMC::UNDEFINED_ID ) {
68 zero_uniqueID++;
69 continue;
70 }
71 bool found = false;
72 if (uniqueID_list.size() > 0){
73 found = (std::find(uniqueID_list.begin(), uniqueID_list.end(), my_uniqueID) != uniqueID_list.end());
74 if(found) {
75 dup_uniqueID++;
76 continue;}
77 }
78 uniqueID_list.push_back(my_uniqueID);
79
80
81 //Save stable Electrons
82 if (MC::isStable(theParticle) && MC::isElectron(theParticle))
83 {
84 xAOD::TruthParticle *xTruthParticle = new xAOD::TruthParticle();
85 xTruthParticleContainerElectron->push_back( xTruthParticle );
86
87 // Fill with numerical content
88 *xTruthParticle=*theParticle;
89 }
90 }
91 if (zero_uniqueID!=0 || dup_uniqueID!=0) ATH_MSG_INFO("Found " << zero_uniqueID << " uniqueID=0 particles and " << dup_uniqueID <<" duplicated");
92 }
93
94 return StatusCode::SUCCESS;
95}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
Helpers for checking error return status codes and reporting errors.
ATLAS-specific HepMC functions.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
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.
SG::ReadHandleKey< xAOD::TruthEventContainer > m_xaodTruthEventContainerName
SG::WriteHandleKey< xAOD::TruthParticleContainer > m_xaodTruthParticleContainerNameElectron
The key for the output xAOD truth containers.
xAODTruthParticleSlimmerElectron(const std::string &name, ISvcLocator *svcLoc)
Regular algorithm constructor.
virtual StatusCode initialize()
Function initialising the algorithm.
virtual StatusCode execute()
Function executing the algorithm.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
int uniqueID(const T &p)
constexpr int UNDEFINED_ID
bool isElectron(const T &p)
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
TruthParticle_v1 TruthParticle
Typedef to implementation.