ATLAS Offline Software
Loading...
Searching...
No Matches
BeamEffectsAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
5// class header
6#include "BeamEffectsAlg.h"
7
8// Athena headers
12
13// HepMC includes
14#include "AtlasHepMC/GenEvent.h"
16
17// CLHEP includes
18#include "CLHEP/Vector/LorentzVector.h"
19
20namespace Simulation
21{
22
23 BeamEffectsAlg::BeamEffectsAlg( const std::string& name, ISvcLocator* pSvcLocator )
24 : AthReentrantAlgorithm( name, pSvcLocator )
25 {
26 }
27
30 {
31 // the Tools for event manipulation
32 if (!m_genEventManipulators.empty()) {
34 }
35 // This will check that the properties were initialized
36 // properly by job configuration.
37 ATH_CHECK( m_inputMcEventCollection.initialize() );
39 ATH_CHECK( m_eventInfoKey.initialize() );
40 return StatusCode::SUCCESS;
41 }
42
43 StatusCode BeamEffectsAlg::execute(const EventContext& ctx) const
44 {
45 // Construct handles from the keys.
46 SG::ReadHandle<McEventCollection> h_inputMcEventCollection (m_inputMcEventCollection, ctx);
48 if(!h_inputMcEventCollection.isValid()) {
49 ATH_MSG_FATAL("No input McEventCollection called " << h_inputMcEventCollection.name() << " in " << h_inputMcEventCollection.store());
50 return StatusCode::FAILURE;
51 }
52 auto outputMcEventCollection = std::make_unique<McEventCollection>(*h_inputMcEventCollection);
53 ATH_CHECK( h_outputMcEventCollection.record ( std::move (outputMcEventCollection)) );
54 // loop over the events in the mc collection
55 for (HepMC::GenEvent* currentGenEvent : *h_outputMcEventCollection) {
56 // skip empty events
57 if ( !currentGenEvent ) continue;
58 ATH_CHECK(this->patchSignalProcessVertex(*currentGenEvent));
59 // manipulate the GenEvent if needed : validating, filtering, smearing, dispersion, ...
60 for (const auto& manipulator : m_genEventManipulators) {
61 // call manipulate(..) in the current GenEventManipulator
62 ATH_CHECK(manipulator->manipulate(*currentGenEvent, ctx));
63 }
64 }
65
66 return StatusCode::SUCCESS;
67 }
68
70 {
71 //Ensure that we have a valid signal_process_vertex
73 if(m_ISFRun) {
74 ATH_MSG_DEBUG("No signal_process_vertex found - creating a dummy GenVertex.");
75 HepMC::FourVector signalPos( 0.0, 0.0, 0.0, 0.0);
76 HepMC::GenVertexPtr signalVertex = HepMC::newGenVertexPtr( signalPos );
77 // ge will now take ownership of the signal process vertex
78 HepMC::set_signal_process_vertex(&ge, signalVertex );
79 }
80 else {
81 if (!ge.vertices().empty()) {
82 ATH_MSG_DEBUG("No signal_process_vertex found - using the first GenVertex in the event.");
83 HepMC::GenVertexPtr signalVertex = ge.vertices().front();
84 HepMC::set_signal_process_vertex(&ge,signalVertex );
85 }
86 }
87 if( !HepMC::signal_process_vertex(&ge) ) { // Insanity check
88 if (!ge.vertices().empty()) {
89 ATH_MSG_ERROR("Failed to set signal_process_vertex for GenEvent!!");
90 return StatusCode::FAILURE;
91 }
92 ATH_MSG_WARNING("No signal_process_vertex found. Empty GenEvent!");
93 }
94 }
95 else {
96 ATH_MSG_DEBUG("signal_process_vertex set by Generator.");
97 }
98 return StatusCode::SUCCESS;
99 }
100
101} // namespace Simulation
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
An algorithm that can be simultaneously executed in multiple threads.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
std::string store() const
Return the name of the store holding the object we are proxying.
const std::string & name() const
Return the StoreGate ID for the referenced object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
Gaudi::Property< bool > m_ISFRun
Temporary property so that we don't change the output in the initial switch to this code.
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
virtual StatusCode initialize() override final
Athena algorithm's interface method initialize().
virtual StatusCode execute(const EventContext &ctx) const override final
Athena algorithm's interface method execute().
ToolHandleArray< IGenEventManipulator > m_genEventManipulators
Event manipulator tools (executed in given order).
StatusCode patchSignalProcessVertex(HepMC::GenEvent &ge) const
Ensure that the GenEvent::signal_process_vertex has been set.
SG::ReadHandleKey< McEventCollection > m_inputMcEventCollection
SG::WriteHandleKey< McEventCollection > m_outputMcEventCollection
BeamEffectsAlg(const std::string &name, ISvcLocator *pSvcLocator)
HepMC3::FourVector FourVector
void set_signal_process_vertex(GenEvent *e, T &v)
Definition GenEvent.h:591
ConstGenVertexPtr signal_process_vertex(const GenEvent *e)
Definition GenEvent.h:597
GenVertexPtr newGenVertexPtr(const HepMC3::FourVector &pos=HepMC3::FourVector::ZERO_VECTOR(), const int i=0)
Definition GenVertex.h:25
HepMC3::GenVertexPtr GenVertexPtr
Definition GenVertex.h:23
HepMC3::GenEvent GenEvent
Definition GenEvent.h:39