ATLAS Offline Software
Loading...
Searching...
No Matches
MergeTruthParticlesTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6
9
10#include "GaudiKernel/SystemOfUnits.h"
11
13 const std::string& name,
14 const IInterface* parent)
15 : PileUpToolBase(type, name, parent)
16{
17}
18
20{
21 ATH_MSG_DEBUG ( "Initializing " << name());
22 ATH_CHECK(m_pMergeSvc.retrieve());
23 return StatusCode::SUCCESS;
24}
25
26StatusCode MergeTruthParticlesTool::prepareEvent(const EventContext& /*ctx*/, unsigned int nInputEvents)
27{
28 ATH_MSG_VERBOSE ( "prepareEvent()" );
29 ATH_MSG_DEBUG ( "prepareEvent: there are " << nInputEvents << " subevents in this event." );
30 m_first_event = true;
33 return StatusCode::SUCCESS;
34}
35
37 SubEventIterator bSubEvents,
38 SubEventIterator eSubEvents)
39{
40 ATH_MSG_VERBOSE ( "processBunchXing()" );
41 SubEventIterator iEvt(bSubEvents);
42 while (iEvt != eSubEvents) {
43 const xAOD::TruthParticleContainer* inputTruthParticleContainer{};
44 if (m_pMergeSvc->retrieveSingleSubEvtData(m_inputTruthParticleCollKey.value(), inputTruthParticleContainer,
45 bunchXing, iEvt).isSuccess()) {
46 ATH_MSG_VERBOSE("Found an xAOD::TruthParticleContainer in storeGate.");
47 if ( !inputTruthParticleContainer ) {
48 ATH_MSG_ERROR("Unable to retrieve input xAOD::TruthParticleContainer: " << m_inputTruthParticleCollKey);
49 return StatusCode::FAILURE;
50 }
51 ATH_MSG_DEBUG ( "processBunchXing: bunch Crossing = " << bunchXing << " xAOD::TruthParticleContainer size = " << inputTruthParticleContainer->size());
52 const int eventNumber{iEvt->index()};
53 // const float timeOfBCID{static_cast<float>(iEvt->time())};
55 ATH_CHECK(this->processTruthParticleContainer(&(*inputTruthParticleContainer), m_inTimeOutputTruthParticleContainer, eventNumber));
56 }
57 }
58 else {
59 ATH_MSG_DEBUG ( "processBunchXing: No TruthParticleContainer found." );
60 }
61 m_first_event=false;
62 ++iEvt;
63 }
64 //signal is always the first event, so even if we didn't see
65 //anything should set this to false here.
66 if(m_first_event) {m_first_event=false;}
67 return StatusCode::SUCCESS;
68}
69
70StatusCode MergeTruthParticlesTool::mergeEvent(const EventContext& /*ctx*/)
71{
72 ATH_MSG_VERBOSE ( "mergeEvent" );
73
74 if(this->record(m_inTimeOutputTruthParticleContainer, m_inTimeOutputTruthParticleCollKey).isFailure()) { // This call also records the xAOD::TruthParticleAuxContainer.
75 ATH_MSG_ERROR("mergeEvent: Failed to record InTimeOutputTruthParticleContainer");
76 return StatusCode::FAILURE;
77 }
78 else {
79 ATH_MSG_DEBUG ( "mergeEvent: Recorded " << m_inTimeOutputTruthParticleCollKey << " TruthParticleContainer with "
80 << m_inTimeOutputTruthParticleContainer->size() <<" entries." );
81 }
82 return StatusCode::SUCCESS;
83}
84
85StatusCode MergeTruthParticlesTool::record(const xAOD::TruthParticleContainer* pTruthParticles, const std::string& truthParticleContainerName) const
86{
87 const xAOD::TruthParticleAuxContainer* pTruthParticlesAux =
88 dynamic_cast<const xAOD::TruthParticleAuxContainer*>(pTruthParticles->getConstStore());
89 ATH_MSG_DEBUG("Check Aux store: " << pTruthParticles << " ... " << &pTruthParticles->auxbase() << " ... " << pTruthParticlesAux );
90 if ( !pTruthParticlesAux ) {
91 ATH_MSG_ERROR("Unable to retrieve xAOD::TruthParticleAuxContainer");
92 return StatusCode::FAILURE;
93 }
94 ATH_MSG_VERBOSE("Recording new xAOD::TruthParticleAuxContainer.");
95 if ( evtStore()->record(pTruthParticlesAux, truthParticleContainerName+"Aux.").isFailure() ) {
96 ATH_MSG_ERROR("Unable to write new xAOD::TruthParticleAuxContainer to event store: " << truthParticleContainerName);
97 return StatusCode::FAILURE;
98 }
99 ATH_MSG_VERBOSE("Recording new xAOD::TruthParticleContainer.");
100 if ( evtStore()->record(pTruthParticles, truthParticleContainerName).isFailure() ) {
101 ATH_MSG_ERROR("Unable to write new xAOD::TruthParticleContainer to event store: " << truthParticleContainerName);
102 return StatusCode::FAILURE;
103 }
104 ATH_MSG_DEBUG("Created new xAOD::TruthParticleContainer in event store: " << truthParticleContainerName);
105 return StatusCode::SUCCESS;
106}
107
108
109StatusCode MergeTruthParticlesTool::processAllSubEvents(const EventContext& /*ctx*/)
110{
111 ATH_MSG_VERBOSE ( "processAllSubEvents()" );
112
113 m_first_event = true;
116
118 TruthParticleList truthList;
119 if ( (m_pMergeSvc->retrieveSubEvtsData(m_inputTruthParticleCollKey.value(), truthList)).isSuccess() ) {
120 if (!truthList.empty()) {
121 //now merge all collections into one
122 TruthParticleList::const_iterator truthParticleColl_iter(truthList.begin());
123 const TruthParticleList::const_iterator endOfTruthParticleColls(truthList.end());
124 while (truthParticleColl_iter!=endOfTruthParticleColls) {
125 const int eventNumber{static_cast<int>((truthParticleColl_iter)->first.index())}; // casting from long unsigned int to int
126 //const float timeOfBCID(static_cast<float>((truthParticleColl_iter)->first.time()));
127 if( static_cast<int>((truthParticleColl_iter)->first.time())!=0 || !m_first_event || m_includeSignalTruthParticles ) {
128 ATH_CHECK(this->processTruthParticleContainer(&(*((truthParticleColl_iter)->second)), m_inTimeOutputTruthParticleContainer, eventNumber));
129 }
130 //signal is always the first event, so if the first event
131 //wasn't in-time, then the signal collection was missing and
132 //we should skip further checks.
133 if(m_first_event) {m_first_event=false;}
134 ++truthParticleColl_iter;
135 }
136 }
137 else {
138 ATH_MSG_DEBUG ( "processAllSubEvents: TruthParticleList is empty" );
139 }
140 }
141 else {
142 ATH_MSG_ERROR ( "processAllSubEvents: Can not find TruthParticleList" );
143 }
144
145 if( this->record(m_inTimeOutputTruthParticleContainer, m_inTimeOutputTruthParticleCollKey).isFailure() ) { // This call also records the xAOD::TruthParticleAuxContainer.
146 ATH_MSG_ERROR ( "processAllSubEvents: Failed to record InTimeOutputTruthParticleContainer" );
147 return StatusCode::FAILURE;
148 }
149 else {
150 ATH_MSG_DEBUG ( "processAllSubEvents: Recorded " << m_inTimeOutputTruthParticleCollKey << " xAOD::TruthParticleContainer with "
151 << m_inTimeOutputTruthParticleContainer->size() <<" entries." );
152 }
153
154 return StatusCode::SUCCESS;
155}
156
157//use a float for timeOfBCID as TruthParticle moments are stored as floats.
158StatusCode MergeTruthParticlesTool::processTruthParticleContainer(const xAOD::TruthParticleContainer* inputTruthParticleContainer, xAOD::TruthParticleContainer *outputTruthParticleContainer, int eventNumber)
159{
160 if (!inputTruthParticleContainer || !outputTruthParticleContainer) { return StatusCode::FAILURE; }
161
162 // Set up decorators
163 const static SG::AuxElement::Accessor< int > eventNumberAccessor("pileupEventNumber");
164
165 for (const xAOD::TruthParticle *theParticle : *inputTruthParticleContainer) {
166 xAOD::TruthParticle* xTruthParticle = new xAOD::TruthParticle();
167 outputTruthParticleContainer->push_back(xTruthParticle);
168 *xTruthParticle = *theParticle; // deep-copy
169 // add the pile-up event number
170 eventNumberAccessor(*xTruthParticle) = eventNumber;
171 }
172 return StatusCode::SUCCESS;
173}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
std::vector< xAOD::EventInfo::SubEvent >::const_iterator SubEventIterator
Definition IPileUpTool.h:22
const SG::AuxVectorBase & auxbase() const
Convert to AuxVectorBase.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
StatusCode record(const xAOD::TruthParticleContainer *pTruthParticles, const std::string &truthParticleContainerName) const
Gaudi::Property< std::string > m_inTimeOutputTruthParticleCollKey
Gaudi::Property< std::string > m_inputTruthParticleCollKey
virtual StatusCode processTruthParticleContainer(const xAOD::TruthParticleContainer *inputTruthParticleContainer, xAOD::TruthParticleContainer *outputTruthParticleContainer, int eventNumber)
TruthParticleContainer Loop.
virtual StatusCode mergeEvent(const EventContext &ctx) override final
called at the end of the subevts loop.
xAOD::TruthParticleContainer * m_inTimeOutputTruthParticleContainer
virtual StatusCode prepareEvent(const EventContext &ctx, unsigned int nInputEvents) override final
called before the subevts loop.
MergeTruthParticlesTool(const std::string &type, const std::string &name, const IInterface *parent)
StatusCode initialize() override final
Initialize.
ServiceHandle< PileUpMergeSvc > m_pMergeSvc
virtual StatusCode processBunchXing(int bunchXing, SubEventIterator bSubEvents, SubEventIterator eSubEvents) override final
called for each active bunch-crossing to process current SubEvents bunchXing is in ns
virtual StatusCode processAllSubEvents(const EventContext &ctx) override final
Merge the Truth TruthParticleContainers using the PileUpMergeSvc.
Gaudi::Property< bool > m_includeSignalTruthParticles
PileUpToolBase(const std::string &type, const std::string &name, const IInterface *parent)
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
TruthParticleAuxContainer_v2 TruthParticleAuxContainer
Declare the latest version of the truth particle auxiliary container.
TruthParticle_v1 TruthParticle
Typedef to implementation.
TruthParticleContainer_v1 TruthParticleContainer
Declare the latest version of the truth particle container.
std::list< value_t > type
type of the collection of timed data object