ATLAS Offline Software
FastSimulationBase.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 // Geant4 includes used in functions
8 #include "G4RegionStore.hh"
9 #include "G4FastSimulationManager.hh"
10 
11 FastSimulationBase::FastSimulationBase(const std::string& type, const std::string& name, const IInterface* parent)
12  : base_class(type,name,parent)
13 {
14 }
15 
17 {
19 }
20 
21 
22 // Athena method, used to get out the G4 geometry and set up the Fast Simulation Models
24  ATH_MSG_VERBOSE( name() << "::initializeFastSim()" );
25 
26  // Make sure Fast Simulation Model isn't already registered
27  if(getFastSimModel()){
28  ATH_MSG_ERROR("Trying to create a Fast Simulation Model which already exists!");
29  return StatusCode::FAILURE;
30  }
31 
32  // Make the FastSimModel stored by this tool
33  auto* fastsimmodel = makeFastSimModel();
34  setFastSimModel(fastsimmodel);
35 
36  // Set the verbosity information on this thing - this will have to go into the makeFastSimModel methods...
37  //if(msgLvl(MSG::VERBOSE)) m_FastSimModel->SetVerboseLevel(10);
38  //else if(msgLvl(MSG::DEBUG)) m_FastSimModel->SetVerboseLevel(5);
39 
40  // Go through the regions and hook the fast simulation up
41  G4RegionStore* regionStore = G4RegionStore::GetInstance();
42  bool missedOne = false;
43  for (const auto& myreg : m_regionNames.value()){
44  int found=0; // Regions with more than one name...
45  for (auto* areg : *regionStore){
46  if (myreg.data()==areg->GetName()){
47  ++found;
48  G4FastSimulationManager* theFastSimulationManager = areg->GetFastSimulationManager();
49 
50  // Build a new fast sim manager if necessary
51  if ( theFastSimulationManager == 0 ) theFastSimulationManager = new G4FastSimulationManager(areg);
52  theFastSimulationManager->AddFastSimulationModel(getFastSimModel());
53  theFastSimulationManager->ActivateFastSimulationModel(getFastSimModel()->GetName());
54  }
55  } // Loop over regions
56  if (0==found){
57  ATH_MSG_ERROR( "Region " << myreg << " not found." );
58  missedOne=true;
59  } else {
60  ATH_MSG_VERBOSE( found << " copies of region " << myreg << " found; fast simulation " << name() << " assigned." );
61  }
62  } // Loop over regions I want
63 
64  // Crash out if we have failed to assign a volume - this is bad news!
65  if (missedOne && !m_noRegions){
66  ATH_MSG_ERROR( "Failed to assign at least one volume to Fast Simulation Model " << name() );
67  return StatusCode::FAILURE;
68  }
69 
70  return StatusCode::SUCCESS;
71 }
72 
73 G4VFastSimulationModel* FastSimulationBase::getFastSimModel()
74 {
75 #ifdef G4MULTITHREADED
76  // Get current thread-ID
77  const auto tid = std::this_thread::get_id();
78  // Retrieve it from the FastSimModel map
79  auto fastsimmodelPair = m_fastsimmodelThreadMap.find(tid);
80  if(fastsimmodelPair == m_fastsimmodelThreadMap.end()) return nullptr;
81  return fastsimmodelPair->second;
82 #else
83  return m_FastSimModel;
84 #endif
85 }
86 
87 void FastSimulationBase::setFastSimModel(G4VFastSimulationModel* fastsimmodel)
88 {
89 #ifdef G4MULTITHREADED
90  // Make sure one isn't already assigned
91  const auto tid = std::this_thread::get_id();
92  ATH_MSG_DEBUG("Creating and registering FastSimModel " << fastsimmodel << " in thread " << tid);
93  m_fastsimmodelThreadMap.insert( std::make_pair(tid, fastsimmodel) );
94 #else
95  m_FastSimModel = fastsimmodel;
96 #endif
97 }
98 
100 {
101 #ifdef G4MULTITHREADED
102  for(auto& threadMapPair : m_fastsimmodelThreadMap)
103  {
104  auto fastSimModel = threadMapPair.second;
105  if (fastSimModel)
106  delete fastSimModel;
107  }
108  m_fastsimmodelThreadMap.clear();
109 #else
110  if(m_FastSimModel)
111  {
112  delete m_FastSimModel;
113  m_FastSimModel = 0;
114  }
115 #endif
116 }
FastSimulationBase.h
FastSimulationBase::deleteFastSimModel
void deleteFastSimModel()
Delete the current model.
Definition: FastSimulationBase.cxx:99
FastSimulationBase::m_FastSimModel
G4VFastSimulationModel * m_FastSimModel
The Fast Simulation Model to which this thing corresponds.
Definition: FastSimulationBase.h:74
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
FastSimulationBase::~FastSimulationBase
virtual ~FastSimulationBase()
Definition: FastSimulationBase.cxx:16
FastSimulationBase::m_noRegions
Gaudi::Property< bool > m_noRegions
This Fast Simulation has no regions associated with it.
Definition: FastSimulationBase.h:55
FastSimulationBase::setFastSimModel
void setFastSimModel(G4VFastSimulationModel *)
Set the current model. In hive, this gets assigned as the thread-local model.
Definition: FastSimulationBase.cxx:87
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
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
FastSimulationBase::FastSimulationBase
FastSimulationBase(const std::string &type, const std::string &name, const IInterface *parent)
Definition: FastSimulationBase.cxx:11
test_pyathena.parent
parent
Definition: test_pyathena.py:15
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
FastSimulationBase::m_regionNames
Gaudi::Property< std::vector< std::string > > m_regionNames
All the regions to which this fast sim is assigned.
Definition: FastSimulationBase.h:53
FastSimulationBase::getFastSimModel
G4VFastSimulationModel * getFastSimModel()
Retrieve the current Fast Simulation Model.
Definition: FastSimulationBase.cxx:73
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
FastSimulationBase::initializeFastSim
StatusCode initializeFastSim() override
Construct and setup the fast simulation model.
Definition: FastSimulationBase.cxx:23