115 auto sdManager = G4SDManager::GetSDMpointer();
125 tlSDMap =
new std::map<std::string, GSensitiveDetector*>();
127 for (
auto& [name, sd] : *tlSDMap) {
133 std::unordered_map<std::string, GSensitiveDetector *> sensitiveDetectorsMap;
138 bool disable_all_fields =
false;
139 std::set<std::string> no_field_volumes;
142 if (no_field_value && !no_field_value->empty()) {
145 for (
auto& c : *no_field_value) {
if (c ==
',') { c =
' '; } }
147 no_field_volumes.insert(v);
156 if (no_system_selected && !disable_all_fields && is_unset_field_name(global_field_name)) {
157 std::vector<std::string> configured_fields;
159 if (!is_unset_field_name(field_definition.name)) {
160 configured_fields.push_back(field_definition.name);
163 if (configured_fields.size() == 1) {
164 global_field_name = configured_fields.front();
167 "No explicit global field selected: using the only configured field <%1> on the ROOT world "
168 "volume.", global_field_name);
171 const bool global_field_set = !disable_all_fields && !is_unset_field_name(global_field_name);
175 std::set<std::string> required_fields;
176 std::set<std::string> matched_no_field;
177 if (!disable_all_fields) {
178 for (
const auto &[systemName, gsystemPtr]: *gworld->getSystemsMap()) {
179 for (
const auto &[volumeName, gvolumePtr]: gsystemPtr->getGVolumesMap()) {
180 const auto &g4name = gvolumePtr->getG4Name();
181 const bool reset = no_field_volumes.count(volumeName) || no_field_volumes.count(g4name);
182 if (no_field_volumes.count(volumeName)) { matched_no_field.insert(volumeName); }
183 if (no_field_volumes.count(g4name)) { matched_no_field.insert(g4name); }
185 const auto &field_name = gvolumePtr->getEMField();
186 if (!field_name || reset) {
continue; }
187 required_fields.insert(*field_name);
190 for (
const auto &name: no_field_volumes) {
191 if (!matched_no_field.count(name)) {
196 if (global_field_set) { required_fields.insert(global_field_name); }
200 if (!required_fields.empty() && gmagneto ==
nullptr) { gmagneto =
new GMagneto(gopt, required_fields); }
203 for (
const auto &[systemName, gsystemPtr]: *gworld->getSystemsMap()) {
204 for (
const auto &[volumeName, gvolumePtr]: gsystemPtr->getGVolumesMap()) {
205 auto const &digitizationName = gvolumePtr->getDigitization();
206 auto const &g4name = gvolumePtr->getG4Name();
212 auto *g4volume = g4world->getG4Volume(g4name)->getLogical();
217 if (g4volume ==
nullptr) {
218 const auto& copyOf = gvolumePtr->getCopyOf();
220 auto gsystem = gvolumePtr->getSystem();
221 auto volume_copy =
gsystem +
"/" + *copyOf;
222 auto copyG4Volume = g4world->getG4Volume(volume_copy)->getLogical();
223 if (copyG4Volume !=
nullptr) { g4volume = copyG4Volume; }
else {
230 if (g4volume ==
nullptr) {
236 if (digitizationName) {
237 const std::string& digitization = *digitizationName;
245 if (!sensitiveDetectorsMap.contains(digitization)) {
250 auto tlIt = tlSDMap->find(digitization);
251 if (tlIt != tlSDMap->end()) {
253 2,
"Reusing existing sensitive detector <%1> for volume <%2>", digitization,
255 tlIt->second->resetTouchableMap();
256 tlIt->second->Activate(
true);
257 sensitiveDetectorsMap[digitization] = tlIt->second;
260 2,
"Creating new sensitive detector <%1> for volume <%2>", digitization, g4name);
262 sdManager->AddNewDetector(newSD);
263 sensitiveDetectorsMap[digitization] = newSD;
264 (*tlSDMap)[digitization] = newSD;
268 2,
"Sensitive detector <%1> is already created and available for volume <%2>",
269 digitization, g4name);
274 const auto &vdimensions = gvolumePtr->getDetectorDimensions();
275 const auto &identity = gvolumePtr->getGIdentity();
279 "Sensitive volume <%1> has digitization <%2> but no identifier.", g4name, digitization);
281 const auto &mass = g4volume->GetMass();
282 auto this_gtouchable = std::make_shared<
283 GTouchable>(gopt, digitization, *identity, vdimensions, mass);
284 sensitiveDetectorsMap[digitization]->registerGVolumeTouchable(g4name, this_gtouchable);
287 g4volume->SetSensitiveDetector(sensitiveDetectorsMap[digitization]);
294 2,
"Logical Volume <%1> has been successfully assigned to SD.%2", g4name,
295 sensitiveDetectorsMap[digitization]);
301 const auto &field_name = gvolumePtr->getEMField();
302 const bool volume_field_present = field_name.has_value();
303 const bool volume_field_reset = disable_all_fields ||
304 no_field_volumes.count(volumeName) || no_field_volumes.count(g4name);
305 if (volume_field_present && volume_field_reset) {
307 2,
"Volume <%1> field <%2> reset by -%3: no field installed.", volumeName, *field_name,
309 }
else if (volume_field_present) {
311 2,
"Volume <%1> has field: <%2>. Looking into field map definitions.", volumeName,
313 log->info(2,
"Setting field manager for volume <%1> with field <%2>", g4name, *field_name);
314 g4world->setFieldManagerForVolume(g4name, gmagneto->getFieldMgr(*field_name).get(),
true);
322 if (global_field_set) {
324 2,
"Setting global field manager for the ROOT world volume <%1> with field <%2>",
327 gmagneto->getFieldMgr(global_field_name).get(),
true);
328 }
else if (disable_all_fields && global_field_name !=
"" &&
329 !is_unset_field_name(global_field_name)) {
331 2,
"Global field <%1> reset by -%2=%3: none installed.", global_field_name,
336 const auto sdetectors = gworld->getSensitiveDetectorsList();
337 for (
auto &sdname: sdetectors) {
338 auto digitization_routine = digitization_routines_map->at(sdname);
340 sensitiveDetectorsMap[sdname]->assign_digi_routine(digitization_routine);
342 1,
"Digitization routine <%1> has been successfully assigned to SD.%2", sdname,
343 sensitiveDetectorsMap[sdname]);