Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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)