File indexing completed on 2024-04-06 12:30:31
0001 #include "SimG4Core/SensitiveDetector/interface/SensitiveDetector.h"
0002 #include "SimG4Core/SensitiveDetector/interface/SensitiveTkDetector.h"
0003 #include "SimG4Core/SensitiveDetector/interface/SensitiveCaloDetector.h"
0004 #include "SimG4Core/SensitiveDetector/interface/AttachSD.h"
0005 #include "SimG4Core/SensitiveDetector/interface/sensitiveDetectorMakers.h"
0006
0007 #include "FWCore/Utilities/interface/Exception.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include <string>
0010 #include <sstream>
0011 #include <algorithm>
0012
0013 std::pair<std::vector<SensitiveTkDetector*>, std::vector<SensitiveCaloDetector*>> sim::attachSD(
0014 const std::unordered_map<std::string, std::unique_ptr<SensitiveDetectorMakerBase>>& makers,
0015 const edm::EventSetup& es,
0016 const SensitiveDetectorCatalog& clg,
0017 edm::ParameterSet const& p,
0018 const SimTrackManager* man,
0019 SimActivityRegistry& reg) {
0020 std::pair<std::vector<SensitiveTkDetector*>, std::vector<SensitiveCaloDetector*>> detList;
0021 const std::vector<std::string_view>& rouNames = clg.readoutNames();
0022
0023 edm::LogVerbatim("SimG4CoreSensitiveDetector") << " AttachSD: Initialising " << rouNames.size() << " SDs";
0024 for (auto& rname : rouNames) {
0025 std::string_view className = clg.className({rname.data(), rname.size()});
0026 auto makerItr = makers.find(std::string(className.data(), className.size()));
0027 if (makerItr == makers.end()) {
0028 throw cms::Exception("MissingSensitiveDetector")
0029 << "Asked to use " << className << " sensitive detector but it was not in the list of preloaded ones.";
0030 }
0031
0032 std::unique_ptr<SensitiveDetector> sd{makerItr->second->make({rname.data(), rname.size()}, es, clg, p, man, reg)};
0033
0034 std::stringstream ss;
0035 ss << " AttachSD: created a " << className << " with name " << rname;
0036
0037 if (sd->isCaloSD()) {
0038 detList.second.push_back(static_cast<SensitiveCaloDetector*>(sd.release()));
0039 ss << " is calo SD";
0040 } else {
0041 detList.first.push_back(static_cast<SensitiveTkDetector*>(sd.release()));
0042 ss << " is tracking SD";
0043 }
0044 edm::LogVerbatim("SimG4CoreSensitiveDetector") << ss.str();
0045 }
0046 return detList;
0047 }