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