Back to home page

Project CMSSW displayed by LXR

 
 

    


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 }