15 #include "G4LogicalVolumeStore.hh"
16 #include "G4SDManager.hh"
29 GGSScoringManager::GGSScoringManager() :
42 static const std::string routineName(
"GGSScoringManager::RegisterSDClass");
43 std::pair<SDBuildersMap::iterator, bool> insertResult = _buildersMap.insert(
44 std::pair<G4String, G4VSensitiveDetector *(*)(G4String)>(className, sdBuilder));
45 if (!insertResult.second) {
46 COUT(WARNING) <<
"Sensitive detector class " << className <<
" is already present." <<
ENDL;
53 static const std::string routineName(
"GGSScoringManager::AddSDToLogVol");
55 G4VSensitiveDetector *sd = NULL;
58 G4String logVolName = logVolNameAndParams.substr(0, logVolNameAndParams.find_first_of(
' '));
59 auto separatorPos = logVolNameAndParams.find_first_of(
' ');
61 if (separatorPos != std::string::npos) {
62 params = logVolNameAndParams.substr(logVolNameAndParams.find_first_of(
' ') + 1);
64 for (G4LogicalVolumeStore::const_iterator logVol = G4LogicalVolumeStore::GetInstance()->begin();
65 logVol != G4LogicalVolumeStore::GetInstance()->end(); logVol++) {
66 if ((*logVol)->GetName() == logVolName) {
68 SDBuildersMap::iterator builder = _buildersMap.find(sdClassName);
69 if (builder == _buildersMap.end()) {
70 throw std::runtime_error(
71 routineName +
": builder for sensitive detector class " + sdClassName +
" is not present.");
74 G4String sdName = sdClassName;
76 sdName.append(
'.').append(params);
77 auto detName { logVolName };
78 sd = builder->second(detName.append(
'.').append(sdName));
86 throw std::runtime_error(
87 routineName +
": logical volume " + logVolName +
" not present. Sensitive detector " + sdClassName
99 if (logVol->GetSensitiveDetector() == NULL) {
101 G4SDManager::GetSDMpointer()->AddNewDetector(sd);
102 logVol->SetSensitiveDetector(sd);
108 G4SDManager::GetSDMpointer()->AddNewDetector(sd);
115 G4SDManager::GetSDMpointer()->AddNewDetector(sd);
117 G4SDManager::GetSDMpointer()->AddNewDetector(multiSD);
118 logVol->SetSensitiveDetector(multiSD);
~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).