Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4SDStructure.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//
28
29// G4SDStructure
30#include "G4SDStructure.hh"
31
32#include "G4ios.hh"
33
35{
36 pathName = aPath;
37 dirName = aPath;
38 auto i = dirName.length();
39 if (i > 1) {
40 dirName.erase(i - 1);
41 auto isl = dirName.rfind('/');
42 dirName.erase(0, isl + 1);
43 dirName += "/";
44 }
45}
46
48{
49 for (auto st : structure)
50 delete st;
51 structure.clear();
52 for (auto dt : detector)
53 delete dt;
54 detector.clear();
55}
56
57G4bool G4SDStructure::operator==(const G4SDStructure& right) const { return (this == &right); }
58
60{
61 G4String remainingPath = treeStructure;
62 remainingPath.erase(0, pathName.length());
63 if (! remainingPath.empty()) { // The detector should be kept in subdirectory.
64 // First, check if the subdirectoy exists.
65 G4String subD = ExtractDirName(remainingPath);
66 G4SDStructure* tgtSDS = FindSubDirectory(subD);
67 if (tgtSDS == nullptr) { // Subdirectory not found. Create a new directory.
68 subD.insert(0, pathName);
69 tgtSDS = new G4SDStructure(subD);
70 structure.push_back(tgtSDS);
71 }
72 tgtSDS->AddNewDetector(aSD, treeStructure);
73 }
74 else { // The sensitive detector should be kept in this directory.
75 G4VSensitiveDetector* tgtSD = GetSD(aSD->GetName());
76 if (tgtSD == nullptr) {
77 detector.push_back(aSD);
78 }
79 else if (tgtSD != aSD) {
80#ifdef G4VERBOSE
82 ed << aSD->GetName() << " had already been stored in " << pathName
83 << ". Object pointer is overwritten.\n";
84 ed << "It's users' responsibility to delete the old sensitive detector "
85 "object.";
86 G4Exception("G4SDStructure::AddNewDetector()", "DET1010", JustWarning, ed);
87#endif
88 RemoveSD(tgtSD);
89 detector.push_back(aSD);
90 }
91 }
92}
93
94G4SDStructure* G4SDStructure::FindSubDirectory(const G4String& subD)
95{
96 for (auto st : structure) {
97 if (subD == st->dirName) return st;
98 }
99 return nullptr;
100}
101
103{
104 for (auto det : detector) {
105 if (aSDName == det->GetName()) return det;
106 }
107 return nullptr;
108}
109
110void G4SDStructure::RemoveSD(G4VSensitiveDetector* sd)
111{
112 auto det = std::find(detector.begin(), detector.end(), sd);
113 if (det != detector.end()) detector.erase(det);
114}
115
116G4String G4SDStructure::ExtractDirName(const G4String& aName)
117{
118 G4String subD = aName;
119 auto i = aName.find('/');
120 if (i != G4String::npos) subD.erase(i + 1);
121 return subD;
122}
123
124void G4SDStructure::Activate(const G4String& aName, G4bool sensitiveFlag)
125{
126 G4String aPath = aName;
127 aPath.erase(0, pathName.length());
128 if (aPath.find('/') != std::string::npos) { // Command is ordered for a subdirectory.
129 G4String subD = ExtractDirName(aPath);
130 G4SDStructure* tgtSDS = FindSubDirectory(subD);
131 if (tgtSDS == nullptr) { // The subdirectory is not found
132 G4cout << subD << " is not found in " << pathName << G4endl;
133 }
134 else {
135 tgtSDS->Activate(aName, sensitiveFlag);
136 }
137 }
138 else if (aPath.empty()) { // Command is ordered for all detectors in this directory.
139 for (auto det : detector)
140 det->Activate(sensitiveFlag);
141 for (auto st : structure)
142 st->Activate(G4String("/"), sensitiveFlag);
143 }
144 else { // Command is ordered to a particular detector.
145 G4VSensitiveDetector* tgtSD = GetSD(aPath);
146 if (tgtSD == nullptr) { // The detector is not found.
147 G4cout << aPath << " is not found in " << pathName << G4endl;
148 }
149 else {
150 tgtSD->Activate(sensitiveFlag);
151 }
152 }
153}
154
156{
157 G4String aPath = aName;
158 aPath.erase(0, pathName.length());
159 if (aPath.find('/') != std::string::npos) { // SD exists in sub-directory
160 G4String subD = ExtractDirName(aPath);
161 G4SDStructure* tgtSDS = FindSubDirectory(subD);
162 if (tgtSDS == nullptr) { // The subdirectory is not found
163 if (warning) G4cout << subD << " is not found in " << pathName << G4endl;
164 return nullptr;
165 }
166
167 return tgtSDS->FindSensitiveDetector(aName, warning);
168 }
169
170 // SD must exist in this directory
171 G4VSensitiveDetector* tgtSD = GetSD(aPath);
172 if (tgtSD == nullptr) { // The detector is not found.
173 if (warning) G4cout << aPath << " is not found in " << pathName << G4endl;
174 }
175 return tgtSD;
176}
177
179{
180 // Broadcast to subdirectories.
181 for (auto st : structure) {
182 st->Initialize(HCE);
183 }
184 // Initialize all detectors in this directory.
185 for (auto dt : detector) {
186 if (dt->isActive()) dt->Initialize(HCE);
187 }
188}
189
191{
192 // Broadcast to subdirectories.
193 for (auto st : structure) {
194 st->Terminate(HCE);
195 }
196 // Terminate all detectors in this directory.
197 for (auto dt : detector) {
198 if (dt->isActive()) dt->EndOfEvent(HCE);
199 }
200}
201
203{
204 G4cout << pathName << G4endl;
205 for (auto sd : detector) {
206 G4cout << pathName << sd->GetName();
207 if (sd->isActive()) {
208 G4cout << " *** Active ";
209 }
210 else {
211 G4cout << " XXX Inactive ";
212 }
213 G4cout << G4endl;
214 }
215 for (auto st : structure)
216 st->ListTree();
217}
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
bool G4bool
Definition G4Types.hh:86
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
void Initialize(G4HCofThisEvent *HCE)
G4bool operator==(const G4SDStructure &right) const
G4VSensitiveDetector * GetSD(const G4String &aName)
void Activate(const G4String &aName, G4bool sensitiveFlag)
void Terminate(G4HCofThisEvent *HCE)
G4VSensitiveDetector * FindSensitiveDetector(const G4String &aName, G4bool warning=true)
G4SDStructure(const G4String &aPath)
void AddNewDetector(G4VSensitiveDetector *aSD, const G4String &treeStructure)
void Activate(G4bool activeFlag)