ATLAS Offline Software
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"
12 namespace Photospp {
13 using 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 
27 using namespace Photospp;
28 
29 // Pointer to random engine
30 CLHEP::HepRandomEngine* Photospp_i::p_rndmEngine = nullptr;
31 
33 
34 extern "C" double phoranc_(int *idum) {
36  return CLHEP::RandFlat::shoot(Photospp_i::p_rndmEngine);
37 }
38 
40 Photospp_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());
49  p_rndmEngine = getRandomEngineDuringInitialize("PHOTOSPP_INIT", m_randomSeed, m_dsid);
50 
51  if(!m_delayInitialisation) setupPhotos();
52 
53  return StatusCode::SUCCESS;
54 }
55 
57 
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 
78  if(m_exponentiation) {
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 
101 void 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 
109 CLHEP::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 
118 CLHEP::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 
139  if(m_delayInitialisation) {
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
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 }
Photospp_i::getRandomEngine
CLHEP::HepRandomEngine * getRandomEngine(const std::string &streamName, unsigned long int randomSeedOffset, const EventContext &ctx) const
Definition: Photospp_i.cxx:109
ATHRNG::RNGWrapper::setSeed
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
Definition: RNGWrapper.h:169
Photospp_i::getRandomEngineDuringInitialize
CLHEP::HepRandomEngine * getRandomEngineDuringInitialize(const std::string &streamName, unsigned long int randomSeedOffset, unsigned int conditionsRun=1, unsigned int lbn=1) const
Definition: Photospp_i.cxx:118
initialize
void initialize()
Definition: run_EoverP.cxx:894
McEventCollection
McEventCollection
Definition: GeneratorObjectsTPCnv.cxx:60
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
McEventCollection.h
ParticleConstants.h
Photospp_i::Photospp_i
Photospp_i(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena algorithm constructor.
Definition: Photospp_i.cxx:40
Atlas::ExtendedEventContext
Definition: ExtendedEventContext.h:23
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
GEV
#define GEV
Definition: PrintPhotonSF.cxx:25
Photospp_i.h
AthAlgorithm
Definition: AthAlgorithm.h:47
phoranc_
double phoranc_(int *idum)
Definition: Photospp_i.cxx:34
Photospp_i::initialize
StatusCode initialize()
Initialise the Photospp_i algorithm and required services.
Definition: Photospp_i.cxx:45
Photospp_i::reseedRandomEngine
void reseedRandomEngine(const std::string &streamName, const EventContext &ctx)
Definition: Photospp_i.cxx:101
WriteHiveWithMetaData.streamName
string streamName
Definition: WriteHiveWithMetaData.py:23
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
ATHRNG::RNGWrapper
A wrapper class for event-slot-local random engines.
Definition: RNGWrapper.h:56
Photospp_i::setupPhotos
void setupPhotos()
Set up the Photos class This may be called in the initialize method or directly before the generation...
Definition: Photospp_i.cxx:56
errorcheck.h
Helpers for checking error return status codes and reporting errors.
ATHRNG::RNGWrapper::getEngine
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Definition: RNGWrapper.h:134
RNGWrapper.h
Photospp_i::p_rndmEngine
static CLHEP::HepRandomEngine * p_rndmEngine
Definition: Photospp_i.h:39
Photospp_i::execute
StatusCode execute()
Run Photos on one event Will require a pre-existing HepMC event in Storegate.
Definition: Photospp_i.cxx:135
ATHRNG::calculateSeedsMC21
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.
Definition: RNGWrapper.cxx:37
ignore_unused_variable_warning
void ignore_unused_variable_warning(int *)
Definition: Photospp_i.cxx:32
Atlas::setExtendedEventContext
void setExtendedEventContext(EventContext &ctx, ExtendedEventContext &&ectx)
Move an extended context into a context object.
Definition: ExtendedEventContext.cxx:70
ParticleConstants::PDG2011::electronMassInMeV
constexpr double electronMassInMeV
the mass of the electron (in MeV)
Definition: ParticleConstants.h:26