ATLAS Offline Software
Loading...
Searching...
No Matches
xAODTruthParticleSlimmerGen.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
19
21
23
24xAODTruthParticleSlimmerGen::xAODTruthParticleSlimmerGen(const std::string &name, ISvcLocator *svcLoc)
25 : AthAlgorithm(name, svcLoc)
26{
27}
28
30{
32 ATH_MSG_INFO("xAOD output TruthParticleContainerGen name = " << m_xaodTruthParticleContainerNameGen.key());
34 ATH_CHECK(m_classif.retrieve());
35
36 return StatusCode::SUCCESS;
37}
38
40{
41 const EventContext& ctx = Gaudi::Hive::currentContext(); // As not re-entrant
42 // Create new output container
44 ATH_CHECK(xTruthParticleContainerGen.record(std::make_unique<xAOD::TruthParticleContainer>(),
45 std::make_unique<xAOD::TruthParticleAuxContainer>()));
46 ATH_MSG_DEBUG("Recorded TruthParticleContainerGen with key: " << m_xaodTruthParticleContainerNameGen.key());
47
48 // Retrieve full TruthEventContainer container
50 if ( !xTruthEventContainer.isValid() )
51 {
52 ATH_MSG_ERROR("No TruthEvent collection with name " << m_xaodTruthEventContainerName << " found in StoreGate!");
53 return StatusCode::FAILURE;
54 }
55
56 // Loop over full TruthParticle container
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
65 for (unsigned int iPart = 0; iPart < nPart; ++iPart) {
66 const xAOD::TruthParticle* theParticle = (*itr)->truthParticle(iPart);
67
68 const int my_uniqueID = HepMC::uniqueID(theParticle);
69 if (my_uniqueID == HepMC::UNDEFINED_ID ) {
70 zero_uniqueID++;
71 continue;
72 }
73 bool found = false;
74 if (uniqueID_list.size() > 0){
75 found = (std::find(uniqueID_list.begin(), uniqueID_list.end(), my_uniqueID) != uniqueID_list.end());
76 if(found) {
77 dup_uniqueID++;
78 continue;}
79 }
80 uniqueID_list.push_back(my_uniqueID);
81
82
83
84 xAOD::TruthParticle *xTruthParticle = new xAOD::TruthParticle();
85 xTruthParticleContainerGen->push_back( xTruthParticle );
86 // Fill with numerical content
87 *xTruthParticle=*theParticle;
88
89 }
90 if (zero_uniqueID != 0 || dup_uniqueID != 0) ATH_MSG_DEBUG("Found " << zero_uniqueID << " uniqueID=0 particles and " << dup_uniqueID << " duplicated");
91 }
92
93 return StatusCode::SUCCESS;
94}
95
96
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(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_xaodTruthParticleContainerNameGen
The key for the output xAOD truth containers.
virtual StatusCode initialize()
Function initialising the algorithm.
xAODTruthParticleSlimmerGen(const std::string &name, ISvcLocator *svcLoc)
Regular algorithm constructor.
PublicToolHandle< IMCTruthClassifier > m_classif
virtual StatusCode execute()
Function executing the algorithm.
int uniqueID(const T &p)
constexpr int UNDEFINED_ID
TruthParticle_v1 TruthParticle
Typedef to implementation.