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();
165 log->info(1,
"No explicit global field selected: using the only configured field <",
166 global_field_name,
"> on the ROOT world volume.");
169 const bool global_field_set = !disable_all_fields && !is_unset_field_name(global_field_name);
173 std::set<std::string> required_fields;
174 std::set<std::string> matched_no_field;
175 if (!disable_all_fields) {
176 for (
const auto &[systemName, gsystemPtr]: *gworld->getSystemsMap()) {
177 for (
const auto &[volumeName, gvolumePtr]: gsystemPtr->getGVolumesMap()) {
178 const auto &g4name = gvolumePtr->getG4Name();
179 const bool reset = no_field_volumes.count(volumeName) || no_field_volumes.count(g4name);
180 if (no_field_volumes.count(volumeName)) { matched_no_field.insert(volumeName); }
181 if (no_field_volumes.count(g4name)) { matched_no_field.insert(g4name); }
183 const auto &field_name = gvolumePtr->getEMField();
184 if (!field_name || reset) {
continue; }
185 required_fields.insert(*field_name);
188 for (
const auto &name: no_field_volumes) {
189 if (!matched_no_field.count(name)) {
194 if (global_field_set) { required_fields.insert(global_field_name); }
198 if (!required_fields.empty() && gmagneto ==
nullptr) { gmagneto =
new GMagneto(gopt, required_fields); }
201 for (
const auto &[systemName, gsystemPtr]: *gworld->getSystemsMap()) {
202 for (
const auto &[volumeName, gvolumePtr]: gsystemPtr->getGVolumesMap()) {
203 auto const &digitizationName = gvolumePtr->getDigitization();
204 auto const &g4name = gvolumePtr->getG4Name();
210 auto *g4volume = g4world->getG4Volume(g4name)->getLogical();
215 if (g4volume ==
nullptr) {
216 const auto& copyOf = gvolumePtr->getCopyOf();
218 auto gsystem = gvolumePtr->getSystem();
219 auto volume_copy =
gsystem +
"/" + *copyOf;
220 auto copyG4Volume = g4world->getG4Volume(volume_copy)->getLogical();
221 if (copyG4Volume !=
nullptr) { g4volume = copyG4Volume; }
else {
223 " Logical volume copy <" + volume_copy +
"> not found.");
227 if (g4volume ==
nullptr) {
232 if (digitizationName) {
233 const std::string& digitization = *digitizationName;
241 if (sensitiveDetectorsMap.find(digitization) == sensitiveDetectorsMap.end()) {
246 auto tlIt = tlSDMap->find(digitization);
247 if (tlIt != tlSDMap->end()) {
248 log->info(2,
"Reusing existing sensitive detector <", digitization,
"> for volume <", g4name,
">");
249 tlIt->second->resetTouchableMap();
250 tlIt->second->Activate(
true);
251 sensitiveDetectorsMap[digitization] = tlIt->second;
253 log->info(2,
"Creating new sensitive detector <", digitization,
"> for volume <", g4name,
">");
255 sdManager->AddNewDetector(newSD);
256 sensitiveDetectorsMap[digitization] = newSD;
257 (*tlSDMap)[digitization] = newSD;
260 log->info(2,
"Sensitive detector <", digitization,
261 "> is already created and available for volume <", g4name,
">");
266 const auto &vdimensions = gvolumePtr->getDetectorDimensions();
267 const auto &identity = gvolumePtr->getGIdentity();
270 "> has digitization <", digitization,
"> but no identifier.");
272 const auto &mass = g4volume->GetMass();
273 auto this_gtouchable = std::make_shared<
274 GTouchable>(gopt, digitization, *identity, vdimensions, mass);
275 sensitiveDetectorsMap[digitization]->registerGVolumeTouchable(g4name, this_gtouchable);
278 g4volume->SetSensitiveDetector(sensitiveDetectorsMap[digitization]);
284 log->info(2,
"Logical Volume <" + g4name +
"> has been successfully assigned to SD.",
285 sensitiveDetectorsMap[digitization]);
291 const auto &field_name = gvolumePtr->getEMField();
292 const bool volume_field_present = field_name.has_value();
293 const bool volume_field_reset = disable_all_fields ||
294 no_field_volumes.count(volumeName) || no_field_volumes.count(g4name);
295 if (volume_field_present && volume_field_reset) {
296 log->info(2,
"Volume <", volumeName,
"> field <", *field_name,
"> reset by -",
298 }
else if (volume_field_present) {
299 log->info(2,
"Volume <", volumeName,
"> has field: <", *field_name,
300 ">. Looking into field map definitions.");
301 log->info(2,
"Setting field manager for volume <", g4name,
"> with field <", *field_name,
">");
302 g4world->setFieldManagerForVolume(g4name, gmagneto->getFieldMgr(*field_name).get(),
true);
310 if (global_field_set) {
312 "> with field <", global_field_name,
">");
314 gmagneto->getFieldMgr(global_field_name).get(),
true);
315 }
else if (disable_all_fields && global_field_name !=
"" &&
316 !is_unset_field_name(global_field_name)) {
322 const auto sdetectors = gworld->getSensitiveDetectorsList();
323 for (
auto &sdname: sdetectors) {
324 auto digitization_routine = digitization_routines_map->at(sdname);
326 sensitiveDetectorsMap[sdname]->assign_digi_routine(digitization_routine);
327 log->info(1,
"Digitization routine <" + sdname +
"> has been successfully assigned to SD.",
328 sensitiveDetectorsMap[sdname]);