15 #include "G4LogicalVolumeStore.hh"
16 #include "G4SDManager.hh"
38 static const std::string routineName(
"GGSScoringManager::RegisterSDClass");
39 std::pair<SDBuildersMap::iterator, bool> insertResult =
40 _buildersMap.insert(std::pair<G4String, G4VSensitiveDetector *(*)(G4String)>(className, sdBuilder));
41 if (!insertResult.second) {
42 COUT(WARNING) <<
"Sensitive detector class " << className <<
" is already present." <<
ENDL;
49 static const std::string routineName(
"GGSScoringManager::AddSDToLogVol");
51 G4VSensitiveDetector *sd =
nullptr;
54 G4String logVolName = logVolNameAndParams.substr(0, logVolNameAndParams.find_first_of(
' '));
55 auto separatorPos = logVolNameAndParams.find_first_of(
' ');
57 if (separatorPos != std::string::npos) {
58 params = logVolNameAndParams.substr(logVolNameAndParams.find_first_of(
' ') + 1);
60 for (G4LogicalVolumeStore::const_iterator logVol = G4LogicalVolumeStore::GetInstance()->begin();
61 logVol != G4LogicalVolumeStore::GetInstance()->end(); logVol++) {
62 if ((*logVol)->GetName() == logVolName) {
65 SDBuildersMap::iterator builder = _buildersMap.find(sdClassName);
66 if (builder == _buildersMap.end()) {
67 throw std::runtime_error(routineName +
": builder for sensitive detector class " + sdClassName +
71 G4String sdName = sdClassName;
73 sdName.append(
'.').append(params);
75 sd = builder->second(logVolName +
"." + sdName);
83 throw std::runtime_error(routineName +
": logical volume " + logVolName +
" not present. Sensitive detector " +
84 sdClassName +
" not added.");
93 if (logVol->GetSensitiveDetector() == NULL) {
95 logVol->SetSensitiveDetector(sd);
107 G4SDManager::GetSDMpointer()->AddNewDetector(multiSD);
108 logVol->SetSensitiveDetector(multiSD);
113 GGSSmartLog::MuteOutput();
114 if (G4SDManager::GetSDMpointer()->GetCollectionID(sd->GetName()) == -1) {
115 G4SDManager::GetSDMpointer()->AddNewDetector(sd);
117 GGSSmartLog::UnmuteOutput();
~GGSScoringManager()
Destructor.
static GGSScoringManager & GetInstance()
Singleton getter.
#define COUT(level)
Smart log macro. It writes on stdout only if the specified verbosity level is lesser than the maximum...
void RegisterSDClass(const G4String &className, G4VSensitiveDetector *(*sdBuilder)(G4String))
Class registration method (class factory approach).
A multiple sensitive detector.
Singleton for handling plugin scoring classes.
Messenger for the GGSScoringManager singleton.
void AddSensitiveDetector(G4VSensitiveDetector *sd)
Adds a new sensitive detector to the multidetector.
void AddSDToLogVol(const G4String &sdClassName, const G4String &logVolNameAndParams)
Adds a sensitive detector to a logical volume (class factory approach).