GGS(GenericGEANT4Simulation)Software  2.6.0
 All Data Structures Namespaces Files Functions Variables Typedefs Macros
GGSScoringManager.cpp
Go to the documentation of this file.
1 /*
2  * GGSScoringManager.cpp
3  *
4  * Created on: 02 Aug 2013
5  * Author: Nicola Mori
6  */
7 
10 #include "utils/GGSSmartLog.h"
14 
15 #include "G4LogicalVolumeStore.hh"
16 #include "G4SDManager.hh"
17 
18 #include <iostream>
19 
20 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
21 
23  static GGSScoringManager instance;
24  return instance;
25 }
26 
27 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
28 
29 GGSScoringManager::GGSScoringManager() :
30  _messenger(new GGSScoringManagerMessenger) {
31 }
32 
33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
34 
36  delete _messenger;
37 }
38 
39 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
40 
41 void GGSScoringManager::RegisterSDClass(const G4String &className, G4VSensitiveDetector *(*sdBuilder)(G4String)) {
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;
47  }
48 }
49 
50 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
51 
52 void GGSScoringManager::AddSDToLogVol(const G4String &sdClassName, const G4String &logVolNameAndParams) {
53  static const std::string routineName("GGSScoringManager::AddSDToLogVol");
54 
55  G4VSensitiveDetector *sd = NULL;
56 
57  // Attach the sensitive detector to all the logical volumes
58  G4String logVolName = logVolNameAndParams.substr(0, logVolNameAndParams.find_first_of(' '));
59  auto separatorPos = logVolNameAndParams.find_first_of(' ');
60  G4String params;
61  if (separatorPos != std::string::npos) {
62  params = logVolNameAndParams.substr(logVolNameAndParams.find_first_of(' ') + 1);
63  }
64  for (G4LogicalVolumeStore::const_iterator logVol = G4LogicalVolumeStore::GetInstance()->begin();
65  logVol != G4LogicalVolumeStore::GetInstance()->end(); logVol++) {
66  if ((*logVol)->GetName() == logVolName) {
67  // Retrieve the sd builder
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.");
72  }
73  // Build the sd
74  G4String sdName = sdClassName;
75  if (params != "")
76  sdName.append('.').append(params);
77  auto detName { logVolName }; // detector name, i.e. logical volume name eventually stripped by the trailing part if it's an old standard XXXXH#E sensitive volume name
78  sd = builder->second(detName.append('.').append(sdName));
79  // Add sd to logvol
80  AddSDToLogVol(sd, *logVol);
81  break;
82  }
83  }
84 
85  if (!sd) {
86  throw std::runtime_error(
87  routineName + ": logical volume " + logVolName + " not present. Sensitive detector " + sdClassName
88  + " not added.");
89  return;
90  }
91 
92 }
93 
94 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
95 
96 void GGSScoringManager::AddSDToLogVol(G4VSensitiveDetector *sd, G4LogicalVolume *logVol) {
97 
98  // Add sd to logical volume
99  if (logVol->GetSensitiveDetector() == NULL) {
100  // Case 1: logical has not a sd. Add the newly built sd to it
101  G4SDManager::GetSDMpointer()->AddNewDetector(sd);
102  logVol->SetSensitiveDetector(sd);
103  }
104  else {
105  GGSMultiSensitiveDetector *multiSD = dynamic_cast<GGSMultiSensitiveDetector*>(logVol->GetSensitiveDetector());
106  if (multiSD) {
107  // Case 2: the current sd is a multisd. Add the newly built sd to it
108  G4SDManager::GetSDMpointer()->AddNewDetector(sd);
109  multiSD->AddSensitiveDetector(sd);
110  }
111  else {
112  // Case 3: the current sd is a standard sd. Replace it with a multisd and add it and the newly built sd to the multisd
113  multiSD = new GGSMultiSensitiveDetector(G4String(logVol->GetName()).append(".GGSMultiSD"));
114  multiSD->AddSensitiveDetector(logVol->GetSensitiveDetector());
115  G4SDManager::GetSDMpointer()->AddNewDetector(sd);
116  multiSD->AddSensitiveDetector(sd);
117  G4SDManager::GetSDMpointer()->AddNewDetector(multiSD);
118  logVol->SetSensitiveDetector(multiSD);
119  }
120  }
121 }
122 
123 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
~GGSScoringManager()
Destructor.
static GGSScoringManager & GetInstance()
Singleton getter.
#define ENDL
Definition: GGSSmartLog.h:93
#define COUT(level)
Smart log macro. It writes on stdout only if the specified verbosity level is lesser than the maximum...
Definition: GGSSmartLog.h:66
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).