File indexing completed on 2025-01-22 07:34:23
0001
0002
0003
0004
0005
0006
0007 #include <RecoLocalMuon/CSCSegment/src/CSCSegmentBuilder.h>
0008 #include <Geometry/CSCGeometry/interface/CSCChamberSpecs.h>
0009 #include <Geometry/CSCGeometry/interface/CSCLayer.h>
0010 #include <Geometry/CSCGeometry/interface/CSCGeometry.h>
0011 #include <DataFormats/MuonDetId/interface/CSCDetId.h>
0012 #include <DataFormats/CSCRecHit/interface/CSCRecHit2D.h>
0013 #include <DataFormats/CSCRecHit/interface/CSCRangeMapAccessor.h>
0014
0015 #include <RecoLocalMuon/CSCSegment/src/CSCSegmentAlgorithm.h>
0016 #include <RecoLocalMuon/CSCSegment/src/CSCSegmentBuilderPluginFactory.h>
0017
0018 #include <FWCore/Utilities/interface/Exception.h>
0019 #include <FWCore/MessageLogger/interface/MessageLogger.h>
0020
0021 CSCSegmentBuilder::CSCSegmentBuilder(const edm::ParameterSet& ps) : geom_(nullptr) {
0022
0023 int chosenAlgo = ps.getParameter<int>("algo_type") - 1;
0024
0025
0026 std::vector<edm::ParameterSet> algoPSets = ps.getParameter<std::vector<edm::ParameterSet>>("algo_psets");
0027
0028
0029
0030 std::string algoName = algoPSets[chosenAlgo].getParameter<std::string>("algo_name");
0031
0032 LogDebug("CSCSegment|CSC") << "CSCSegmentBuilder algorithm name: " << algoName;
0033
0034
0035 std::vector<edm::ParameterSet> segAlgoPSet =
0036 algoPSets[chosenAlgo].getParameter<std::vector<edm::ParameterSet>>("algo_psets");
0037
0038
0039 std::vector<std::string> chType = algoPSets[chosenAlgo].getParameter<std::vector<std::string>>("chamber_types");
0040 LogDebug("CSCSegment|CSC") << "No. of chamber types to handle: " << chType.size();
0041
0042
0043 std::vector<int> algoToType = algoPSets[chosenAlgo].getParameter<std::vector<int>>("parameters_per_chamber_type");
0044
0045
0046 if (algoToType.size() != chType.size()) {
0047 throw cms::Exception("ParameterSetError")
0048 << "#dim algosToType=" << algoToType.size() << ", #dim chType=" << chType.size() << std::endl;
0049 }
0050
0051
0052
0053 for (size_t j = 0; j < chType.size(); ++j) {
0054 algoMap.emplace(chType[j], CSCSegmentBuilderPluginFactory::get()->create(algoName, segAlgoPSet[algoToType[j] - 1]));
0055 edm::LogVerbatim("CSCSegment|CSC") << "using algorithm #" << algoToType[j] << " for chamber type " << chType[j];
0056 }
0057 }
0058
0059 CSCSegmentBuilder::~CSCSegmentBuilder() = default;
0060
0061 void CSCSegmentBuilder::build(const CSCRecHit2DCollection* recHits, CSCSegmentCollection& oc) {
0062 LogDebug("CSCSegment|CSC") << "Total number of rechits in this event: " << recHits->size();
0063
0064 std::vector<CSCDetId> chambers;
0065 std::vector<CSCDetId>::const_iterator chIt;
0066
0067 for (CSCRecHit2DCollection::const_iterator it2 = recHits->begin(); it2 != recHits->end(); it2++) {
0068 bool insert = true;
0069 for (chIt = chambers.begin(); chIt != chambers.end(); ++chIt)
0070 if (((*it2).cscDetId().chamber() == (*chIt).chamber()) && ((*it2).cscDetId().station() == (*chIt).station()) &&
0071 ((*it2).cscDetId().ring() == (*chIt).ring()) && ((*it2).cscDetId().endcap() == (*chIt).endcap()))
0072 insert = false;
0073
0074 if (insert)
0075 chambers.push_back((*it2).cscDetId().chamberId());
0076 }
0077
0078 for (chIt = chambers.begin(); chIt != chambers.end(); ++chIt) {
0079 std::vector<const CSCRecHit2D*> cscRecHits;
0080 const CSCChamber* chamber = geom_->chamber(*chIt);
0081
0082 CSCRangeMapAccessor acc;
0083 CSCRecHit2DCollection::range range = recHits->get(acc.cscChamber(*chIt));
0084
0085 std::vector<int> hitPerLayer(6);
0086 for (CSCRecHit2DCollection::const_iterator rechit = range.first; rechit != range.second; rechit++) {
0087 hitPerLayer[(*rechit).cscDetId().layer() - 1]++;
0088 cscRecHits.push_back(&(*rechit));
0089 }
0090
0091 LogDebug("CSCSegment|CSC") << "found " << cscRecHits.size() << " rechits in chamber " << *chIt;
0092
0093
0094 std::vector<CSCSegment> segv = algoMap[chamber->specs()->chamberTypeName()]->run(chamber, cscRecHits);
0095
0096 LogDebug("CSCSegment|CSC") << "found " << segv.size() << " segments in chamber " << *chIt;
0097
0098
0099 oc.put((*chIt), segv.begin(), segv.end());
0100 }
0101 }
0102
0103 void CSCSegmentBuilder::setGeometry(const CSCGeometry* geom) { geom_ = geom; }
0104
0105 void CSCSegmentBuilder::fillPSetDescription(edm::ParameterSetDescription& desc) {
0106
0107 desc.add<int>("algo_type", 5)->setComment("Choice of the building algo: 1 SK, 2 TC, 3 DF, 4 ST, 5 RU, ...");
0108
0109
0110 edm::ParameterSetDescription innerPSet;
0111 innerPSet.setAllowAnything();
0112
0113
0114 desc.addVPSet("algo_psets", innerPSet, {})->setComment("Default empty VPSet, can contain anything");
0115 }