109 auto sdManager = G4SDManager::GetSDMpointer();
119 tlSDMap =
new std::map<std::string, GSensitiveDetector*>();
121 for (
auto& [name, sd] : *tlSDMap) {
127 std::unordered_map<std::string, GSensitiveDetector *> sensitiveDetectorsMap;
132 bool disable_all_fields =
false;
133 std::set<std::string> no_field_volumes;
137 if (no_field_value ==
NO_FIELD_ALL) { disable_all_fields =
true; }
139 for (
auto &c : no_field_value) {
if (c ==
',') { c =
' '; } }
141 no_field_volumes.insert(v);
150 if (no_system_selected && !disable_all_fields && is_unset_field_name(global_field_name)) {
151 std::vector<std::string> configured_fields;
153 if (!is_unset_field_name(field_definition.name) && field_definition.name !=
goptions::NODFLT) {
154 configured_fields.push_back(field_definition.name);
157 if (configured_fields.size() == 1) {
158 global_field_name = configured_fields.front();
159 log->
info(1,
"No explicit global field selected: using the only configured field <",
160 global_field_name,
"> on the ROOT world volume.");
163 const bool global_field_set = !disable_all_fields && !is_unset_field_name(global_field_name);
167 std::set<std::string> required_fields;
168 std::set<std::string> matched_no_field;
169 if (!disable_all_fields) {
170 for (
const auto &[systemName, gsystemPtr]: *gworld->
getSystemsMap()) {
171 for (
const auto &[volumeName, gvolumePtr]: gsystemPtr->getGVolumesMap()) {
172 const auto &g4name = gvolumePtr->getG4Name();
173 const bool reset = no_field_volumes.count(volumeName) || no_field_volumes.count(g4name);
174 if (no_field_volumes.count(volumeName)) { matched_no_field.insert(volumeName); }
175 if (no_field_volumes.count(g4name)) { matched_no_field.insert(g4name); }
177 const auto &field_name = gvolumePtr->getEMField();
178 if (is_unset_field_name(field_name) || reset) {
continue; }
179 required_fields.insert(field_name);
182 for (
const auto &name: no_field_volumes) {
183 if (!matched_no_field.count(name)) {
188 if (global_field_set) { required_fields.insert(global_field_name); }
192 if (!required_fields.empty() && gmagneto ==
nullptr) { gmagneto =
new GMagneto(gopt, required_fields); }
195 for (
const auto &[systemName, gsystemPtr]: *gworld->
getSystemsMap()) {
196 for (
const auto &[volumeName, gvolumePtr]: gsystemPtr->getGVolumesMap()) {
197 auto const &digitizationName = gvolumePtr->getDigitization();
198 auto const &g4name = gvolumePtr->getG4Name();
209 if (g4volume ==
nullptr) {
210 std::string copyOf = gvolumePtr->getCopyOf();
212 auto gsystem = gvolumePtr->getSystem();
213 auto volume_copy =
gsystem +
"/" + copyOf;
215 if (copyG4Volume !=
nullptr) { g4volume = copyG4Volume; }
else {
217 " Logical volume copy <" + volume_copy +
"> not found.");
221 if (g4volume ==
nullptr) {
233 if (sensitiveDetectorsMap.find(digitizationName) == sensitiveDetectorsMap.end()) {
238 auto tlIt = tlSDMap->find(digitizationName);
239 if (tlIt != tlSDMap->end()) {
240 log->
info(2,
"Reusing existing sensitive detector <", digitizationName,
"> for volume <", g4name,
">");
241 tlIt->second->resetTouchableMap();
242 tlIt->second->Activate(
true);
243 sensitiveDetectorsMap[digitizationName] = tlIt->second;
245 log->
info(2,
"Creating new sensitive detector <", digitizationName,
"> for volume <", g4name,
">");
247 sdManager->AddNewDetector(newSD);
248 sensitiveDetectorsMap[digitizationName] = newSD;
249 (*tlSDMap)[digitizationName] = newSD;
252 log->
info(2,
"Sensitive detector <", digitizationName,
253 "> is already created and available for volume <", g4name,
">");
258 const auto &vdimensions = gvolumePtr->getDetectorDimensions();
259 const auto &identity = gvolumePtr->getGIdentity();
260 const auto &mass = g4volume->GetMass();
261 auto this_gtouchable = std::make_shared<
262 GTouchable>(gopt, digitizationName, identity, vdimensions, mass);
263 sensitiveDetectorsMap[digitizationName]->registerGVolumeTouchable(g4name, this_gtouchable);
266 g4volume->SetSensitiveDetector(sensitiveDetectorsMap[digitizationName]);
272 log->
info(2,
"Logical Volume <" + g4name +
"> has been successfully assigned to SD.",
273 sensitiveDetectorsMap[digitizationName]);
279 const auto &field_name = gvolumePtr->getEMField();
280 const bool volume_field_present = !is_unset_field_name(field_name);
281 const bool volume_field_reset = disable_all_fields ||
282 no_field_volumes.count(volumeName) || no_field_volumes.count(g4name);
283 if (volume_field_present && volume_field_reset) {
284 log->
info(2,
"Volume <", volumeName,
"> field <", field_name,
"> reset by -",
286 }
else if (volume_field_present) {
287 log->
info(2,
"Volume <", volumeName,
"> has field: <", field_name,
288 ">. Looking into field map definitions.");
289 log->
info(2,
"Setting field manager for volume <", g4name,
"> with field <", field_name,
">");
298 if (global_field_set) {
300 "> with field <", global_field_name,
">");
302 gmagneto->
getFieldMgr(global_field_name).get(),
true);
303 }
else if (disable_all_fields && global_field_name !=
"" &&
304 !is_unset_field_name(global_field_name)) {
313 if (G4Threading::IsMasterThread() && digiplugins_need_reload) {
314 loadDigitizationPlugins();
315 digiplugins_need_reload =
false;
320 for (
auto &sdname: sdetectors) {
321 auto digitization_routine = digitization_routines_map->at(sdname);
322 double maxStep = digitization_routine->readoutSpecs->getMaxStep();
324 sensitiveDetectorsMap[sdname]->assign_digi_routine(digitization_routine);
325 log->
info(1,
"Digitization routine <" + sdname +
"> has been successfully assigned to SD.",
326 sensitiveDetectorsMap[sdname]);
330 for (
const auto &[systemName, gsystemPtr]: *gworld->
getSystemsMap()) {
331 for (
const auto &[volumeName, gvolumePtr]: gsystemPtr->getGVolumesMap()) {
332 auto const &digitizationName = gvolumePtr->getDigitization();
333 if (digitizationName == sdname) {
334 auto const &g4name = gvolumePtr->getG4Name();
339 g4volume->SetUserLimits(
new G4UserLimits(maxStep));
341 log->
info(1,
"Setting G4UserLimits for volume <", g4name,
"> with maxStep <", maxStep,
">");