ATLAS Offline Software
Loading...
Searching...
No Matches
Photospp_i.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5
7
8#include "Photos/Photos.h"
9
10#ifdef HEPMC3
11#include "Photos/PhotosHepMC3Event.h"
12namespace Photospp {
13using PhotosHepMCEvent=PhotosHepMC3Event;
14}
15#else
16#include "Photos/PhotosHepMCEvent.h"
17#endif
18#include "Photos/Log.h"
19
22
23#include "CLHEP/Random/RandFlat.h"
26
27using namespace Photospp;
28
29// Pointer to random engine
30CLHEP::HepRandomEngine* Photospp_i::p_rndmEngine = nullptr;
31
33
34extern "C" double phoranc_(int *idum) {
36 return CLHEP::RandFlat::shoot(Photospp_i::p_rndmEngine);
37}
38
40Photospp_i::Photospp_i(const std::string& name, ISvcLocator* pSvcLocator) :
41 AthAlgorithm(name, pSvcLocator) {
42}
43
46 ATH_MSG_DEBUG("Photospp_i initializing");
47
48 ATH_CHECK(m_rndmSvc.retrieve());
50
52
53 return StatusCode::SUCCESS;
54}
55
57
58 Photos::initialize();
59 Photos::setAlphaQED(m_alphaQED);
60 Photos::setInterference(true);
61 Photos::setCorrectionWtForW(true);
62 Photos::maxWtInterference(m_maxWtInterference);
63 Photos::setMeCorrectionWtForW(m_WMECorrection);
64 Photos::setMeCorrectionWtForZ(m_ZMECorrection);
65 Photos::setPairEmission(m_photonSplitting);
66 Photos::forceMassFrom4Vector(true);
67 Photos::forceMassFromEventRecord(13);
68 Photos::forceMassFromEventRecord(15);
69 Photos::forceMass(11, ParticleConstants::electronMassInMeV); // The assumption that units are MEV will be checked later
70 Photos::forceMassFromEventRecord(211);
71 Photos::setTopProcessRadiation(false);
72#ifdef HEPMC3
73 Photos::createHistoryEntries(m_createHistory, 0);
74#else
75 Photos::createHistoryEntries(m_createHistory, 3);
76#endif
77
79 Photos::setExponentiation(true);
80 } else {
81 Photos::setInfraredCutOff(0.01);
82 Photos::setDoubleBrem(true);
83 Photos::setQuatroBrem(false);
84 phokey.iexp = 0;
85 }
86
87 // over-ride default IR cutoff if user has set a specific value
88 if(m_infraRedCutOff > 0.) {
89 Photos::setInfraredCutOff(m_infraRedCutOff);
90 }
91
92 Photospp::Log::LogWarning(false);
93 Photospp::Photos::setStopAtCriticalError(m_stopCritical);
94
95 Photos::iniInfo();
96
97 return;
98}
99
100
101void Photospp_i::reseedRandomEngine(const std::string& streamName, const EventContext& ctx)
102{
103 long seeds[7];
104 ATHRNG::calculateSeedsMC21(seeds, streamName, ctx.eventID().event_number(), m_dsid, m_randomSeed);
105 p_rndmEngine->setSeeds(seeds, 0); // NOT THREAD-SAFE
106}
107
108
109CLHEP::HepRandomEngine* Photospp_i::getRandomEngine(const std::string& streamName, unsigned long int randomSeedOffset,
110 const EventContext& ctx) const
111{
112 ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this, streamName);
113 rngWrapper->setSeed( streamName, ctx.slot(), randomSeedOffset, ctx.eventID().run_number() );
114 return rngWrapper->getEngine(ctx);
115}
116
117
118CLHEP::HepRandomEngine* Photospp_i::getRandomEngineDuringInitialize(const std::string& streamName, unsigned long int randomSeedOffset, unsigned int conditionsRun, unsigned int lbn) const
119{
120 const size_t slot=0;
121 EventContext ctx;
122 ctx.setSlot( slot );
123 ctx.setEventID (EventIDBase (conditionsRun,
124 EventIDBase::UNDEFEVT, // event
125 EventIDBase::UNDEFNUM, // timestamp
126 EventIDBase::UNDEFNUM, // timestamp ns
127 lbn));
129 Atlas::ExtendedEventContext( evtStore()->hiveProxyDict(),
130 conditionsRun) );
131 return getRandomEngine(streamName, randomSeedOffset, ctx);
132}
133
134
136
137 // initialise if not done already
138
140 setupPhotos();
141 m_delayInitialisation = false;
142 }
143
144 //Re-seed the random number stream
145 const EventContext& ctx = Gaudi::Hive::currentContext();
146 reseedRandomEngine("PHOTOSPP", ctx);
147
148 // Get the event collection
149 // FIXME should be using Read/WriteHandles here
150 McEventCollection* eventCollection = nullptr;
151 StatusCode sc = evtStore()->retrieve(eventCollection, m_genEventKey);
152 if (sc.isFailure() || eventCollection == 0) {
153 ATH_MSG_ERROR("Unable to retrieve event collection from StoreGate with key " << m_genEventKey);
154 return StatusCode::FAILURE;
155 } else {
156 ATH_MSG_DEBUG("Retrieved event collection from StoreGate with key " << m_genEventKey);
157 }
158
159 // Get the event most recently added to the event collection
160 HepMC::GenEvent *event = eventCollection->back();
161 if(event == 0) {
162 ATH_MSG_ERROR("Photospp_i received a null HepMC event");
163 return StatusCode::FAILURE;
164 }
165 switch(event->momentum_unit()) {
166#ifdef HEPMC3
167 case HepMC3::Units::MomentumUnit::GEV:
168 Photos::setMomentumUnit(Photos::GEV);
169 Photos::forceMass(11, ParticleConstants::electronMassInMeV/1000.); // Convert MeV to GeV
170 break;
171 case HepMC3::Units::MomentumUnit::MEV:
172 Photos::setMomentumUnit(Photos::MEV);
173 Photos::forceMass(11, ParticleConstants::electronMassInMeV);
174 break;
175#else
176 case HepMC::Units::GEV:
177 Photos::setMomentumUnit(Photos::GEV);
178 Photos::forceMass(11, ParticleConstants::electronMassInMeV/1000.); // Convert MeV to GeV
179 break;
180 case HepMC::Units::MEV:
181 Photos::setMomentumUnit(Photos::MEV);
182 Photos::forceMass(11, ParticleConstants::electronMassInMeV);
183 break;
184#endif
185 default:
186 ATH_MSG_ERROR("Photospp_i received a event with unknown units.");
187 Photos::setMomentumUnit(Photos::DEFAULT_MOMENTUM);
188 break;
189 };
190 PhotosHepMCEvent photosEvent(event);
191 photosEvent.process();
192
193 return StatusCode::SUCCESS;
194}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
static Double_t sc
A number of constexpr particle constants to avoid hardcoding them directly in various places.
void ignore_unused_variable_warning(int *)
double phoranc_(int *idum)
A wrapper class for event-slot-local random engines.
Definition RNGWrapper.h:56
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
Definition RNGWrapper.h:169
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Definition RNGWrapper.h:134
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
const T * back() const
Access the last element in the collection as an rvalue.
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
BooleanProperty m_createHistory
Whether to create history entries (default = yes)
Definition Photospp_i.h:66
BooleanProperty m_photonSplitting
Whether to include photon splitting.
Definition Photospp_i.h:81
StatusCode execute()
Run Photos on one event Will require a pre-existing HepMC event in Storegate.
void setupPhotos()
Set up the Photos class This may be called in the initialize method or directly before the generation...
BooleanProperty m_stopCritical
Whether to stop on critical error (default = no)
Definition Photospp_i.h:69
Photospp_i(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena algorithm constructor.
BooleanProperty m_delayInitialisation
Delay initialisation until just before first event execution (default = no)
Definition Photospp_i.h:72
ServiceHandle< IAthRNGSvc > m_rndmSvc
Definition Photospp_i.h:51
CLHEP::HepRandomEngine * getRandomEngineDuringInitialize(const std::string &streamName, unsigned long int randomSeedOffset, unsigned int conditionsRun=1, unsigned int lbn=1) const
BooleanProperty m_WMECorrection
Whether to apply ME correction to W decays (default = no, until validated)
Definition Photospp_i.h:78
IntegerProperty m_randomSeed
Seed for random number engine.
Definition Photospp_i.h:57
DoubleProperty m_maxWtInterference
Definition Photospp_i.h:86
void reseedRandomEngine(const std::string &streamName, const EventContext &ctx)
IntegerProperty m_dsid
Definition Photospp_i.h:54
CLHEP::HepRandomEngine * getRandomEngine(const std::string &streamName, unsigned long int randomSeedOffset, const EventContext &ctx) const
DoubleProperty m_infraRedCutOff
Definition Photospp_i.h:84
StringProperty m_genEventKey
The GenEvent StoreGate key - FIXME should be using Read/WriteHandles here.
Definition Photospp_i.h:60
BooleanProperty m_ZMECorrection
Whether to apply ME correction to Z decays (default = no, until validated)
Definition Photospp_i.h:75
static CLHEP::HepRandomEngine * p_rndmEngine
Definition Photospp_i.h:39
BooleanProperty m_exponentiation
Whether to use exponentiation mode (default = yes)
Definition Photospp_i.h:63
StatusCode initialize()
Initialise the Photospp_i algorithm and required services.
DoubleProperty m_alphaQED
Value of alpha_QED.
Definition Photospp_i.h:89
void calculateSeedsMC21(long *seeds, const std::string &algName, uint64_t ev, uint64_t run, uint64_t offset=0)
Set the random seed using a string (e.g.
void setExtendedEventContext(EventContext &ctx, ExtendedEventContext &&ectx)
Move an extended context into a context object.
constexpr double electronMassInMeV
the mass of the electron (in MeV)