ATLAS Offline Software
Loading...
Searching...
No Matches
PhysicsAnalysis/TruthParticleID/McParticleTools/src/GenAccessIO.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef TRUTHHELPER_GENACCESSIO_H
6#define TRUTHHELPER_GENACCESSIO_H
7
11
12#include "GaudiKernel/Bootstrap.h"
13#include "GaudiKernel/ISvcLocator.h"
15
16#include <vector>
17#include <string>
18
19typedef std::vector<HepMC::ConstGenParticlePtr> MCParticleCollection;
20typedef std::vector<HepMC::ConstGenParticlePtr>::const_iterator MCParticleCollectionCIter;
21
22namespace TruthHelper {
23
24class GenAccessIO {
25public:
26
28 if (m_sgSvc.retrieve().isFailure()) {
29 throw StatusCode::FAILURE;
30 }
31 }
32 StatusCode getMC(MCParticleCollection& mcParticles, const bool ifgen=false, const std::string& key="GEN_EVENT") const {
33 MsgStream log(Athena::getMessageSvc(), "GenAccessIO");
34
35 // Retrieve iterators for McEventCollections objects
38 if ( (m_sgSvc->retrieve(firstMEC, lastMEC)).isFailure() ) {
39 log << MSG::ERROR << "Could not retrieve iterators for McEventCollections" << endmsg;
40 }
41 const McEventCollection& mcColl = *firstMEC;
42 int icount = 0;
43 for ( ; firstMEC!= lastMEC; ++firstMEC) icount++;
44 log << MSG::DEBUG << "Number of McEventCollections= "<< icount << endmsg;
45
46 // If there is more than one then do the retrieve with the key
47 if (icount > 1) {
48 log << MSG::DEBUG << "Key = " << key << endmsg;
49 const McEventCollection* mcCollptr = nullptr;
50 return this->getDH(mcCollptr, key);
51 }
52
53 if (icount > 0) {
54 // Iterate over all McEvent records
56 for (itr = mcColl.begin(); itr!=mcColl.end(); ++itr) {
57 // Access the HepMC record which is wrapped within McEvent
58 const HepMC::GenEvent* genEvt = (*itr);
59 if (genEvt == 0) return StatusCode::FAILURE;
60 if (ifgen) {
61 for (auto it: *genEvt) {
62 if (!HepMC::is_simulation_particle(it)) mcParticles.push_back(std::move(it));
63 }
64 } else {
65 for (auto it: *genEvt) {
66 mcParticles.push_back(std::move(it));
67 }
68 }
69 }
70 }
71 return StatusCode::SUCCESS;
72 }
73 StatusCode getDH(const McEventCollection*& dh) const {
74 return m_sgSvc->retrieve(dh);
75 }
76 StatusCode getDH(const McEventCollection*& dh, const std::string& key) const {
77 return m_sgSvc->retrieve(dh, key);
78 }
79 StatusCode store (McEventCollection* storee, const std::string& key) const {
80 return m_sgSvc->record(storee, key);
81 }
82private:
83 ServiceHandle<StoreGateSvc> m_sgSvc{"StoreGateSvc", "GenAccessIO"};
84};
85}
86
87#endif
#define endmsg
std::vector< HepMC::ConstGenParticlePtr > MCParticleCollection
std::vector< HepMC::ConstGenParticlePtr >::const_iterator MCParticleCollectionCIter
ATLAS-specific HepMC functions.
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
a const_iterator facade to DataHandle.
Definition SGIterator.h:164
StatusCode getMC(MCParticleCollection &mcParticles, const bool ifgen=false, const std::string &key="GEN_EVENT") const
StatusCode getDH(const McEventCollection *&dh, const std::string &key) const
StatusCode store(McEventCollection *storee, const std::string &key) const
StatusCode getDH(const McEventCollection *&dh) const
IMessageSvc * getMessageSvc(bool quiet=false)
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...