ATLAS Offline Software
G4AtlasAlg.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 // Local includes
6 #include "G4AtlasAlg.h"
7 #include "G4AtlasFluxRecorder.h"
9 
12 
13 // Can we safely include all of these?
18 
19 // Geant4 includes
20 #include "G4StateManager.hh"
21 #include "G4TransportationManager.hh"
22 #include "G4RunManagerKernel.hh"
23 #include "G4EventManager.hh"
24 #include "G4Navigator.hh"
25 #include "G4PropagatorInField.hh"
26 #include "G4TrackingManager.hh"
27 #include "G4StackManager.hh"
28 #include "G4UImanager.hh"
29 #include "G4ScoringManager.hh"
30 #include "G4VUserPhysicsList.hh"
31 #include "G4VModularPhysicsList.hh"
32 #include "G4ParallelWorldPhysics.hh"
33 #include "G4GDMLParser.hh"
34 
35 // CLHEP includes
36 #include "CLHEP/Random/RandomEngine.h"
37 
38 // Athena includes
39 #include "StoreGate/ReadHandle.h"
40 #include "StoreGate/WriteHandle.h"
43 #include "GaudiKernel/IThreadInitTool.h"
46 
47 
48 // call_once mutexes
49 #include <mutex>
50 static std::once_flag initializeOnceFlag;
51 static std::once_flag finalizeOnceFlag;
52 static std::once_flag releaseGeoModelOnceFlag;
53 
55 
56 
57 G4AtlasAlg::G4AtlasAlg(const std::string& name, ISvcLocator* pSvcLocator)
58  : AthAlgorithm(name, pSvcLocator)
59 {
60  // Verbosities
61  declareProperty("Verbosities", m_verbosities);
62 }
63 
64 
65 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
66 
68 {
69  ATH_MSG_DEBUG("Start of initialize()");
70 
71  // Read the simplified geometry for FastCaloSim track transportation if requested
72  if(!m_simplifiedGeoPath.empty()) {
73  std::string geoFile = PathResolverFindCalibFile(m_simplifiedGeoPath);
74 
75  if (geoFile.empty()) {
76  ATH_MSG_FATAL("Could not find simplified geometry file: " << m_simplifiedGeoPath);
77  return StatusCode::FAILURE;
78  }
79 
80  G4GDMLParser parser;
81  parser.Read(geoFile, false);
82  }
83 
84  // Create the scoring manager if requested
85  if (m_recordFlux) G4ScoringManager::GetScoringManager();
86 
87  ATH_CHECK( m_userActionSvc.retrieve() );
88 
89  // One-time initialization
90  try {
91  std::call_once(initializeOnceFlag, &G4AtlasAlg::initializeOnce, this);
92  }
93  catch(const std::exception& e) {
94  ATH_MSG_ERROR("Failure in G4AtlasAlg::initializeOnce: " << e.what());
95  return StatusCode::FAILURE;
96  }
97 
98  ATH_CHECK( m_rndmGenSvc.retrieve() );
99  ATH_CHECK(m_actionTools.retrieve());
100 
101  ATH_CHECK(m_senDetTool.retrieve());
102  ATH_CHECK(m_fastSimTool.retrieve());
103 
104  // Truth
105  ATH_CHECK( m_truthRecordSvc.retrieve() );
106  ATH_MSG_INFO( "- Using ISF TruthRecordSvc : " << m_truthRecordSvc.typeAndName() );
107  ATH_CHECK( m_geoIDSvc.retrieve() );
108  ATH_MSG_INFO( "- Using ISF GeoIDSvc : " << m_geoIDSvc.typeAndName() );
109 
110  TruthStrategyManager& sManager = TruthStrategyManager::GetStrategyManager_nc();
111  sManager.SetISFTruthSvc( &(*m_truthRecordSvc) );
112  sManager.SetISFGeoIDSvc( &(*m_geoIDSvc) );
113 
114  // I/O
115  ATH_CHECK( m_inputTruthCollectionKey.initialize());
116  ATH_CHECK( m_outputTruthCollectionKey.initialize());
117  ATH_CHECK( m_eventInfoKey.initialize() );
118 
119  ATH_CHECK(m_inputConverter.retrieve());
120  if ( not m_truthPreselectionTool.empty() ) {
121  ATH_CHECK(m_truthPreselectionTool.retrieve());
122  }
123 
124  if ( not m_qspatcher.empty() ) {
125  ATH_CHECK( m_qspatcher.retrieve() );
126  }
127 
128  ATH_MSG_DEBUG("End of initialize()");
129  return StatusCode::SUCCESS;
130 }
131 
132 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
134 {
135  // Assign physics list
136  if(m_physListSvc.retrieve().isFailure()) {
137  throw std::runtime_error("Could not initialize ATLAS PhysicsListSvc!");
138  }
139  for (const auto& action_tool : m_actionTools) {
140  if (m_userActionSvc->addActionTool(action_tool).isFailure()) {
141  throw std::runtime_error("Failed to add action tool "+action_tool.name());
142  }
143  }
144 
145  // Create the (master) run manager
146  if(m_useMT) {
147 #ifdef G4MULTITHREADED
148  auto* runMgr ATLAS_THREAD_SAFE = // protected by std::call_once above
149  G4AtlasMTRunManager::GetG4AtlasMTRunManager();
150  m_physListSvc->SetPhysicsList();
151  runMgr->SetDetGeoSvc( m_detGeoSvc.typeAndName() );
152  runMgr->SetFastSimMasterTool(m_fastSimTool.typeAndName() );
153  runMgr->SetPhysListSvc( m_physListSvc.typeAndName() );
154  runMgr->SetQuietMode( m_quietMode );
155  // Worker Thread initialization used to create worker run manager on demand.
156  std::unique_ptr<G4AtlasUserWorkerThreadInitialization> workerInit =
157  std::make_unique<G4AtlasUserWorkerThreadInitialization>();
158  workerInit->SetDetGeoSvc( m_detGeoSvc.typeAndName() );
159  workerInit->SetFastSimMasterTool( m_fastSimTool.typeAndName() );
160  workerInit->SetQuietMode( m_quietMode );
161  runMgr->SetUserInitialization( workerInit.release() );
162  std::unique_ptr<G4AtlasActionInitialization> actionInitialization =
163  std::make_unique<G4AtlasActionInitialization>(m_userActionSvc.get());
164  runMgr->SetUserInitialization(actionInitialization.release());
165 #else
166  throw std::runtime_error("Trying to use multi-threading in non-MT build!");
167 #endif
168  }
169  // Single-threaded run manager
170  else {
171  auto* runMgr ATLAS_THREAD_SAFE = // safe because single-threaded
172  G4AtlasRunManager::GetG4AtlasRunManager();
173  m_physListSvc->SetPhysicsList();
174  runMgr->SetRecordFlux( m_recordFlux, std::make_unique<G4AtlasFluxRecorder>() );
175  runMgr->SetLogLevel( int(msg().level()) ); // Synch log levels
176  runMgr->SetDetGeoSvc( m_detGeoSvc.typeAndName() );
177  runMgr->SetFastSimMasterTool(m_fastSimTool.typeAndName() );
178  runMgr->SetPhysListSvc(m_physListSvc.typeAndName() );
179  runMgr->SetQuietMode( m_quietMode );
180  std::unique_ptr<G4AtlasActionInitialization> actionInitialization =
181  std::make_unique<G4AtlasActionInitialization>(m_userActionSvc.get());
182  runMgr->SetUserInitialization(actionInitialization.release());
183  }
184 
185  // G4 user interface commands
186  G4UImanager *ui = G4UImanager::GetUIpointer();
187 
188  // Load custom libraries
189  if (!m_libList.empty()) {
190  ATH_MSG_INFO("G4AtlasAlg specific libraries requested ");
191  std::string temp="/load "+m_libList;
192  ui->ApplyCommand(temp);
193  }
194  // Load custom physics
195  if (!m_physList.empty()) {
196  ATH_MSG_INFO("requesting a specific physics list "<< m_physList);
197  std::string temp="/Physics/GetPhysicsList "+m_physList;
198  ui->ApplyCommand(temp);
199  }
200  // Load custom magnetic field
201  if (!m_fieldMap.empty()) {
202  ATH_MSG_INFO("requesting a specific field map "<< m_fieldMap);
203  ATH_MSG_INFO("the field is initialized straight away");
204  std::string temp="/MagneticField/Select "+m_fieldMap;
205  ui->ApplyCommand(temp);
206  ui->ApplyCommand("/MagneticField/Initialize");
207  }
208 
209  // Send UI commands
210  ATH_MSG_DEBUG("G4 Command: Trying at the end of initializeOnce()");
211  for (const auto& g4command : m_g4commands) {
212  int returnCode = ui->ApplyCommand( g4command );
213  commandLog(returnCode, g4command);
214  }
215 
216  // Code from G4AtlasSvc
217  auto* rm = G4RunManager::GetRunManager();
218  if(!rm) {
219  throw std::runtime_error("Run manager retrieval has failed");
220  }
221  rm->Initialize(); // Initialization differs slightly in multi-threading.
222  // TODO: add more details about why this is here.
223  if(!m_useMT && rm->ConfirmBeamOnCondition()) {
224  rm->RunInitialization();
225  }
226 
227  ATH_MSG_INFO( "retireving the Detector Geometry Service" );
228  if(m_detGeoSvc.retrieve().isFailure()) {
229  throw std::runtime_error("Could not initialize ATLAS DetectorGeometrySvc!");
230  }
231 
232  if(m_userLimitsSvc.retrieve().isFailure()) {
233  throw std::runtime_error("Could not initialize ATLAS UserLimitsSvc!");
234  }
235 
237  G4VModularPhysicsList* thePhysicsList=dynamic_cast<G4VModularPhysicsList*>(m_physListSvc->GetPhysicsList());
238  if (!thePhysicsList) {
239  throw std::runtime_error("Failed dynamic_cast!! this is not a G4VModularPhysicsList!");
240  }
241 #if G4VERSION_NUMBER >= 1010
242  std::vector<std::string>& parallelWorldNames=m_detGeoSvc->GetParallelWorldNames();
243  for (auto& it: parallelWorldNames) {
244  thePhysicsList->RegisterPhysics(new G4ParallelWorldPhysics(it,true));
245  }
246 #endif
247  }
248 
249  return;
250 }
251 
253 {
254  if (m_verbosities.size()>0) {
255  G4TransportationManager *tm = G4TransportationManager::GetTransportationManager();
256  G4RunManagerKernel *rmk = G4RunManagerKernel::GetRunManagerKernel();
257  G4EventManager *em = G4EventManager::GetEventManager();
258 
259  auto itr = m_verbosities.end();
260  if ((itr = m_verbosities.find("Navigator")) != m_verbosities.end()) {
261  tm->GetNavigatorForTracking()->SetVerboseLevel( atof(itr->second.data()) );
262  }
263  if ((itr = m_verbosities.find("Propagator")) != m_verbosities.end()) {
264  tm->GetPropagatorInField()->SetVerboseLevel( atof(itr->second.data()) );
265  }
266  if ((itr = m_verbosities.find("Tracking")) != m_verbosities.end()) {
267  rmk->GetTrackingManager()->SetVerboseLevel( atof(itr->second.data()) );
268  }
269  if ((itr = m_verbosities.find("Stepping")) != m_verbosities.end()) {
270  rmk->GetTrackingManager()->GetSteppingManager()->
271  SetVerboseLevel( atof(itr->second.data()) );
272  }
273  if ((itr = m_verbosities.find("Stacking")) != m_verbosities.end()) {
274  rmk->GetStackManager()->SetVerboseLevel( atof(itr->second.data()) );
275  }
276  if ((itr = m_verbosities.find("Event")) != m_verbosities.end()) {
277  em->SetVerboseLevel( atof(itr->second.data()) );
278  }
279  } // End of the setting of verbosities
280 
281 }
282 
283 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
284 
286 {
287  ATH_MSG_DEBUG(std::endl<<std::endl<<std::endl);
288  ATH_MSG_DEBUG("++++++++++++ G4AtlasAlg finalized ++++++++++++" <<std::endl<<std::endl);
289 
290  // One time finalization
291  try {
292  std::call_once(finalizeOnceFlag, &G4AtlasAlg::finalizeOnce, this);
293  }
294  catch(const std::exception& e) {
295  ATH_MSG_ERROR("Failure in G4AtlasAlg::finalizeOnce: " << e.what());
296  return StatusCode::FAILURE;
297  }
298 
299  return StatusCode::SUCCESS;
300 }
301 
302 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
304 {
305  ATH_MSG_DEBUG("\t terminating the current G4 run");
306  auto runMgr = G4RunManager::GetRunManager();
307  runMgr->RunTermination();
308 }
309 
310 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
311 
313 {
314  static std::atomic<unsigned int> n_Event=0;
315  ATH_MSG_DEBUG("++++++++++++ G4AtlasAlg execute ++++++++++++");
316 
317 #ifdef G4MULTITHREADED
318  // In some rare cases, TBB may create more physical worker threads than
319  // were requested via the pool size. This can happen at any time.
320  // In that case, those extra threads will not have had the thread-local
321  // initialization done, leading to a crash. Try to detect that and do
322  // the initialization now if needed.
323  if (G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking()->GetWorldVolume() == nullptr)
324  {
325  ToolHandle<IThreadInitTool> ti ("G4ThreadInitTool", nullptr);
326  ATH_CHECK( ti.retrieve() );
327  ti->initThread();
328  }
329 #endif
330 
331  n_Event += 1;
332 
333  if (n_Event<=10 || (n_Event%100) == 0) {
334  ATH_MSG_ALWAYS("G4AtlasAlg: Event num. " << n_Event << " start processing");
335  }
336 
337  // Release GeoModel Geometry if necessary
338  if (m_releaseGeoModel) {
339  try {
340  std::call_once(releaseGeoModelOnceFlag, &G4AtlasAlg::releaseGeoModel, this);
341  }
342  catch(const std::exception& e) {
343  ATH_MSG_ERROR("Failure in G4AtlasAlg::releaseGeoModel: " << e.what());
344  return StatusCode::FAILURE;
345  }
346  }
347 
348  const EventContext& ctx = Gaudi::Hive::currentContext();
349  // Set the RNG to use for this event. We need to reset it for MT jobs
350  // because of the mismatch between Gaudi slot-local and G4 thread-local RNG.
351  ATHRNG::RNGWrapper* rngWrapper = m_rndmGenSvc->getEngine(this, m_randomStreamName);
352  rngWrapper->setSeed( m_randomStreamName, ctx);
353  G4Random::setTheEngine(*rngWrapper);
354 
355  ATH_MSG_DEBUG("Calling SimulateG4Event");
356 
357  ATH_CHECK(m_senDetTool->BeginOfAthenaEvent());
358  ATH_CHECK(m_fastSimTool->BeginOfAthenaEvent());
359 
361  if (!inputTruthCollection.isValid()) {
362  ATH_MSG_FATAL("Unable to read input GenEvent collection " << inputTruthCollection.name() << " in store " << inputTruthCollection.store());
363  return StatusCode::FAILURE;
364  }
365  ATH_MSG_DEBUG("Found input GenEvent collection " << inputTruthCollection.name() << " in store " << inputTruthCollection.store());
366  // create the output Truth collection
368  std::unique_ptr<McEventCollection> shadowTruth{};
369  if (m_useShadowEvent) {
370  outputTruthCollection = std::make_unique<McEventCollection>();
371  // copy input Evgen collection to shadow Truth collection
372  shadowTruth = std::make_unique<McEventCollection>(*inputTruthCollection);
373  for (HepMC::GenEvent* currentGenEvent : *shadowTruth ) {
374  // Apply QS patch if required
375  if ( not m_qspatcher.empty() ) {
376  ATH_CHECK(m_qspatcher->applyWorkaround(*currentGenEvent));
377  }
378  // Copy GenEvent and remove daughters of quasi-stable particles to be simulated
379  std::unique_ptr<HepMC::GenEvent> outputEvent = m_truthPreselectionTool->filterGenEvent(*currentGenEvent);
380  outputTruthCollection->push_back(outputEvent.release());
381  }
382  }
383  else {
384  // copy input Evgen collection to output Truth collection
385  outputTruthCollection = std::make_unique<McEventCollection>(*inputTruthCollection);
386  // empty shadow Truth collection
387  shadowTruth = std::make_unique<McEventCollection>();
388  // Apply QS patch if required
389  if ( not m_qspatcher.empty() ) {
390  for (HepMC::GenEvent* currentGenEvent : *outputTruthCollection ) {
391  ATH_CHECK(m_qspatcher->applyWorkaround(*currentGenEvent));
392  }
393  }
394  }
395 
396  ATH_MSG_DEBUG("Recorded output GenEvent collection " << outputTruthCollection.name() << " in store " << outputTruthCollection.store());
397 
398  const int largestGeneratedParticleBC = (outputTruthCollection->empty()) ? HepMC::UNDEFINED_ID
399  : HepMC::maxGeneratedParticleBarcode(outputTruthCollection->at(0)); // TODO make this more robust
400  const int largestGeneratedVertexBC = (outputTruthCollection->empty()) ? HepMC::UNDEFINED_ID
401  : HepMC::maxGeneratedVertexBarcode(outputTruthCollection->at(0)); // TODO make this more robust
402  // tell TruthService we're starting a new event
403  ATH_CHECK( m_truthRecordSvc->initializeTruthCollection(largestGeneratedParticleBC, largestGeneratedVertexBC) );
404 
405  G4Event *inputEvent{};
406  ATH_CHECK( m_inputConverter->convertHepMCToG4Event(ctx, *outputTruthCollection, inputEvent, *shadowTruth) );
407 
408  bool abort = false;
409  // Worker run manager
410  // Custom class has custom method call: ProcessEvent.
411  // So, grab custom singleton class directly, rather than base.
412  // Maybe that should be changed! Then we can use a base pointer.
413  if(m_useMT) {
414 #ifdef G4MULTITHREADED
415  auto* workerRM = G4AtlasWorkerRunManager::GetG4AtlasWorkerRunManager();
416  abort = workerRM->ProcessEvent(inputEvent);
417 #else
418  ATH_MSG_ERROR("Trying to use multi-threading in non-MT build!");
419  return StatusCode::FAILURE;
420 #endif
421  }
422  else {
423  auto* workerRM ATLAS_THREAD_SAFE = // single-threaded case
424  G4AtlasRunManager::GetG4AtlasRunManager();
425  abort = workerRM->ProcessEvent(inputEvent);
426  }
427  if (abort) {
428  ATH_MSG_WARNING("Event was aborted !! ");
429  ATH_MSG_WARNING("Simulation will now go on to the next event ");
430  if (m_killAbortedEvents) {
431  ATH_MSG_WARNING("setFilterPassed is now False");
432  setFilterPassed(false);
433  }
434  if (m_flagAbortedEvents) {
436  if (!eventInfo.isValid()) {
437  ATH_MSG_FATAL( "Failed to retrieve xAOD::EventInfo while trying to update the error state!" );
438  return StatusCode::FAILURE;
439  }
440  else {
442  ATH_MSG_WARNING( "Set error state in xAOD::EventInfo!" );
443  }
444  }
445  }
446 
447  // Register all of the collections if there are any new-style SDs
448  ATH_CHECK(m_senDetTool->EndOfAthenaEvent());
449  ATH_CHECK(m_fastSimTool->EndOfAthenaEvent());
450 
451  ATH_CHECK( m_truthRecordSvc->releaseEvent() );
452 
453  // Remove QS patch if required
454  if(!m_qspatcher.empty()) {
455  for (HepMC::GenEvent* currentGenEvent : *outputTruthCollection ) {
456  ATH_CHECK(m_qspatcher->removeWorkaround(*currentGenEvent));
457  }
458  }
459 
460  return StatusCode::SUCCESS;
461 }
462 
463 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
464 
466 {
467  SmartIF<IGeoModelSvc> geoModel{Gaudi::svcLocator()->service("GeoModelSvc")};
468  if (!geoModel) {
469  ATH_MSG_WARNING( " ----> Unable to retrieve GeoModelSvc" );
470  }
471  else {
472  if (geoModel->clear().isFailure()) {
473  ATH_MSG_WARNING( " ----> GeoModelSvc::clear() failed" );
474  }
475  else {
476  ATH_MSG_INFO( " ----> GeoModelSvc::clear() succeeded " );
477  }
478  }
479  m_releaseGeoModel=false; // Don't do that again...
480  return;
481 }
482 
483 void G4AtlasAlg::commandLog(int returnCode, const std::string& commandString) const
484 {
485  switch(returnCode) {
486  case 0: { ATH_MSG_DEBUG("G4 Command: " << commandString << " - Command Succeeded"); } break;
487  case 100: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Command Not Found!"); } break;
488  case 200: {
489  auto* stateManager = G4StateManager::GetStateManager();
490  ATH_MSG_DEBUG("G4 Command: " << commandString << " - Illegal Application State (" <<
491  stateManager->GetStateString(stateManager->GetCurrentState()) << ")!");
492  } break;
493  case 300: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Parameter Out of Range!"); } break;
494  case 400: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Parameter Unreadable!"); } break;
495  case 500: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Parameter Out of Candidates!"); } break;
496  case 600: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Alias Not Found!"); } break;
497  default: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Unknown Status!"); } break;
498  }
499 
500 }
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
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
python.CaloScaleNoiseConfig.parser
parser
Definition: CaloScaleNoiseConfig.py:75
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
G4AtlasAlg::m_flagAbortedEvents
Gaudi::Property< bool > m_flagAbortedEvents
Definition: G4AtlasAlg.h:103
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
G4AtlasAlg::m_eventInfoKey
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
Definition: G4AtlasAlg.h:106
G4AtlasMTRunManager.h
TruthStrategyManager::SetISFTruthSvc
void SetISFTruthSvc(ISF::ITruthSvc *truthSvc)
Define which ISF TruthService to use.
Definition: TruthStrategyManager.cxx:53
SG::ReadHandle< McEventCollection >
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
SG::VarHandleBase::name
const std::string & name() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:75
G4AtlasAlg::finalize
StatusCode finalize() override
Finalize the algorithm and invoke G4 run termination.
Definition: G4AtlasAlg.cxx:285
initialize
void initialize()
Definition: run_EoverP.cxx:894
G4AtlasActionInitialization.h
G4AtlasAlg::m_senDetTool
PublicToolHandle< ISensitiveDetectorMasterTool > m_senDetTool
Sensitive Detector Master Tool.
Definition: G4AtlasAlg.h:153
ATLAS_NOT_THREAD_SAFE
StatusCode G4AtlasAlg::initialize ATLAS_NOT_THREAD_SAFE()
Install fatal handler with default options.
Definition: G4AtlasAlg.cxx:67
G4AtlasAlg::m_fieldMap
Gaudi::Property< std::string > m_fieldMap
Definition: G4AtlasAlg.h:121
skel.it
it
Definition: skel.GENtoEVGEN.py:396
HepMC::maxGeneratedVertexBarcode
int maxGeneratedVertexBarcode(const HepMC::GenEvent *genEvent)
Get the maximal absolute value of barcode of vertex present in the event. Returns a negative number.
Definition: MagicNumbers.h:445
G4AtlasAlg::m_recordFlux
Gaudi::Property< bool > m_recordFlux
Definition: G4AtlasAlg.h:124
TruthStrategyManager.h
G4AtlasAlg::m_detGeoSvc
ServiceHandle< IDetectorGeometrySvc > m_detGeoSvc
Detector Geometry Service (builds G4 Geometry)
Definition: G4AtlasAlg.h:141
G4AtlasAlg::m_releaseGeoModel
Gaudi::Property< bool > m_releaseGeoModel
Definition: G4AtlasAlg.h:123
G4AtlasAlg::m_physListSvc
ServiceHandle< IPhysicsListSvc > m_physListSvc
Physics List Tool.
Definition: G4AtlasAlg.h:151
G4AtlasAlg::m_randomStreamName
Gaudi::Property< std::string > m_randomStreamName
Random Stream Name.
Definition: G4AtlasAlg.h:135
G4AtlasUserWorkerThreadInitialization.h
G4AtlasAlg::commandLog
void commandLog(int returnCode, const std::string &commandString) const
This command prints a message about a G4Command depending on its returnCode.
Definition: G4AtlasAlg.cxx:483
python.iconfTool.models.loaders.level
level
Definition: loaders.py:20
xAOD::EventInfo_v1::Error
@ Error
The sub-detector issued an error.
Definition: EventInfo_v1.h:349
G4AtlasAlg::m_userLimitsSvc
ServiceHandle< IUserLimitsSvc > m_userLimitsSvc
Definition: G4AtlasAlg.h:137
G4AtlasRunManager.h
G4AtlasAlg::m_truthPreselectionTool
ToolHandle< ISF::IGenEventFilter > m_truthPreselectionTool
Definition: G4AtlasAlg.h:146
WriteHandle.h
Handle class for recording to StoreGate.
G4AtlasAlg::m_inputTruthCollectionKey
SG::ReadHandleKey< McEventCollection > m_inputTruthCollectionKey
input hard scatter collection
Definition: G4AtlasAlg.h:104
TruthStrategyManager::SetISFGeoIDSvc
void SetISFGeoIDSvc(ISF::IGeoIDSvc *geoIDSvc)
Define which ISF GeoIDSvc to use.
Definition: TruthStrategyManager.cxx:59
G4AtlasAlg::m_inputConverter
ServiceHandle< ISF::IInputConverter > m_inputConverter
Service to convert ISF_Particles into a G4Event.
Definition: G4AtlasAlg.h:149
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
G4AtlasAlg::m_fastSimTool
PublicToolHandle< IFastSimulationMasterTool > m_fastSimTool
Fast Simulation Master Tool.
Definition: G4AtlasAlg.h:155
G4AtlasAlg::finalizeOnce
void finalizeOnce()
G4 finalization called only by the first alg instance.
Definition: G4AtlasAlg.cxx:303
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
G4AtlasAlg::execute
StatusCode execute() override
Simulate one Athena event.
Definition: G4AtlasAlg.cxx:312
G4AtlasWorkerRunManager.h
G4AtlasAlg::m_useShadowEvent
BooleanProperty m_useShadowEvent
Definition: G4AtlasAlg.h:131
SG::VarHandleBase::store
std::string store() const
Return the name of the store holding the object we are proxying.
Definition: StoreGate/src/VarHandleBase.cxx:376
calibdata.exception
exception
Definition: calibdata.py:496
TruthStrategyManager
Singleton class for creating truth incidents.
Definition: TruthStrategyManager.h:23
G4AtlasAlg::initializeG4
void initializeG4()
Poorly named possibly unused method which sets some verbosities.
Definition: G4AtlasAlg.cxx:252
ATH_MSG_ALWAYS
#define ATH_MSG_ALWAYS(x)
Definition: AthMsgStreamMacros.h:35
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AthAlgorithm
Definition: AthAlgorithm.h:47
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
CxxUtils::atof
double atof(std::string_view str)
Converts a string into a double / float.
Definition: Control/CxxUtils/Root/StringUtils.cxx:91
HepMC::UNDEFINED_ID
constexpr int UNDEFINED_ID
Definition: MagicNumbers.h:56
G4AtlasAlg::m_g4commands
Gaudi::Property< std::vector< std::string > > m_g4commands
Commands to send to the G4 UI.
Definition: G4AtlasAlg.h:127
PathResolver.h
G4AtlasAlg.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
ATHRNG::RNGWrapper
A wrapper class for event-slot-local random engines.
Definition: RNGWrapper.h:56
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
G4AtlasAlg::releaseGeoModel
void releaseGeoModel()
Releases the GeoModel geometry from memory once it has been used to build the G4 geometry and is no-l...
Definition: G4AtlasAlg.cxx:465
G4AtlasAlg::m_physList
Gaudi::Property< std::string > m_physList
Definition: G4AtlasAlg.h:120
RNGWrapper.h
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
SG::WriteHandle< McEventCollection >
G4AtlasAlg::m_useMT
Gaudi::Property< bool > m_useMT
Activate multi-threading configuration.
Definition: G4AtlasAlg.h:129
G4AtlasAlg::m_truthRecordSvc
ServiceHandle< ISF::ITruthSvc > m_truthRecordSvc
Central Truth Service.
Definition: G4AtlasAlg.h:109
G4AtlasAlg::m_actionTools
PublicToolHandleArray< G4UA::IUserActionTool > m_actionTools
Definition: G4AtlasAlg.h:157
G4AtlasAlg::G4AtlasAlg
G4AtlasAlg(const std::string &name, ISvcLocator *pSvcLocator)
Standard algorithm constructor.
Definition: G4AtlasAlg.cxx:57
HepMC::maxGeneratedParticleBarcode
int maxGeneratedParticleBarcode(const HepMC::GenEvent *genEvent)
Get the maximal value of barcode of particle present in the event.
Definition: MagicNumbers.h:428
G4AtlasAlg::m_quietMode
Gaudi::Property< bool > m_quietMode
Definition: G4AtlasAlg.h:125
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
G4AtlasAlg::m_verbosities
std::map< std::string, std::string > m_verbosities
Verbosity settings for Geant4.
Definition: G4AtlasAlg.h:114
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
G4AtlasAlg::m_userActionSvc
ServiceHandle< G4UA::IUserActionSvc > m_userActionSvc
User Action Service.
Definition: G4AtlasAlg.h:139
G4AtlasAlg::m_qspatcher
ServiceHandle< Simulation::IZeroLifetimePatcher > m_qspatcher
Quasi-Stable Particle Simulation Patcher.
Definition: G4AtlasAlg.h:144
xAOD::EventInfo_v1::updateErrorState
bool updateErrorState(const EventFlagSubDet subDet, const EventFlagErrorState state) const
Update the error state for one particular sub-detector.
Definition: EventInfo_v1.cxx:856
G4AtlasAlg::m_killAbortedEvents
Gaudi::Property< bool > m_killAbortedEvents
Definition: G4AtlasAlg.h:102
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
DataVector::at
const T * at(size_type n) const
Access an element, as an rvalue.
ReadHandle.h
Handle class for reading from StoreGate.
G4AtlasAlg::m_rndmGenSvc
ServiceHandle< IAthRNGSvc > m_rndmGenSvc
Random number service.
Definition: G4AtlasAlg.h:133
G4AtlasAlg::m_libList
Gaudi::Property< std::string > m_libList
Definition: G4AtlasAlg.h:119
checker_macros.h
Define macros for attributes used to control the static checker.
IGeoModelSvc.h
G4AtlasAlg::m_outputTruthCollectionKey
SG::WriteHandleKey< McEventCollection > m_outputTruthCollectionKey
output hard scatter truth collection
Definition: G4AtlasAlg.h:105
xAOD::EventInfo_v1::Core
@ Core
Core flags describing the event.
Definition: EventInfo_v1.h:339
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
G4AtlasAlg::m_activateParallelGeometries
Gaudi::Property< bool > m_activateParallelGeometries
Definition: G4AtlasAlg.h:130
G4AtlasAlg::initializeOnce
void initializeOnce()
G4 initialization called only by the first alg instance.
Definition: G4AtlasAlg.cxx:133
G4AtlasFluxRecorder.h