11 #include "G4LogicalVolumeStore.hh"
12 #include "G4MultiSensitiveDetector.hh"
13 #include "G4SDManager.hh"
18 const std::string&
name,
33 << (
m_noVolumes?
"true" :
"false") <<
", but LogicalVolumeNames = "
35 return StatusCode::FAILURE;
42 return StatusCode::FAILURE;
50 return StatusCode::FAILURE;
58 return StatusCode::SUCCESS;
65 assignSD(G4VSensitiveDetector*
sd,
const std::vector<std::string>& volumes)
const
73 auto sdMgr = G4SDManager::GetSDMpointer();
74 sdMgr->AddNewDetector(
sd);
76 if(!volumes.empty()) {
78 auto logicalVolumeStore = G4LogicalVolumeStore::GetInstance();
79 for(
const auto& volumeName : volumes) {
85 for(
auto* logVol : *logicalVolumeStore) {
87 ATH_MSG_VERBOSE(
"Check whether "<<logVol->GetName()<<
" belongs to the set of sensitive detectors "<<volumeName);
88 if(
matchStrings( volumeName.data(), logVol->GetName() ) ){
97 " not found in G4LogicalVolumeStore.");
100 ATH_MSG_VERBOSE(
"Found " << numFound <<
" copies of LV " << volumeName <<
101 "; SD " <<
sd->GetName() <<
" assigned.");
110 " and expected at least one. Size of the volume store "<<G4LogicalVolumeStore::GetInstance()->
size() );
111 return StatusCode::FAILURE;
115 return StatusCode::SUCCESS;
120 #ifdef G4MULTITHREADED
122 const auto tid = std::this_thread::get_id();
124 auto sdPair = m_sdThreadMap.find(tid);
125 if(sdPair == m_sdThreadMap.end())
return nullptr;
126 return sdPair->second;
134 #ifdef G4MULTITHREADED
135 const auto tid = std::this_thread::get_id();
136 ATH_MSG_DEBUG(
"Creating and registering SD " <<
sd <<
" in thread " << tid);
137 m_sdThreadMap.insert( std::make_pair(tid,
sd) );
179 G4VSensitiveDetector* originalSD = logVol->GetSensitiveDetector();
180 if ( originalSD ==
nullptr )
182 logVol->SetSensitiveDetector(aSD);
186 G4MultiSensitiveDetector* msd =
dynamic_cast<G4MultiSensitiveDetector*
>(originalSD);
187 if ( msd !=
nullptr )
194 std::stringstream
ss;
195 ss << static_cast<const void*>(logVol);
196 const G4String msdname =
"/MultiSD_" + logVol->GetName() +
ss.str();
198 msd =
new G4MultiSensitiveDetector(msdname);
200 G4SDManager::GetSDMpointer()->AddNewDetector(msd);
201 msd->AddSD(originalSD);
203 logVol->SetSensitiveDetector(msd);