Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:26:01

0001 
0002 /** \file CSCSegmentBuilder.cc
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   // The algo chosen for the segment building
0023   int chosenAlgo = ps.getParameter<int>("algo_type") - 1;
0024 
0025   // Find appropriate ParameterSets for each algo type
0026   std::vector<edm::ParameterSet> algoPSets = ps.getParameter<std::vector<edm::ParameterSet> >("algo_psets");
0027 
0028   // Now load the right parameter set
0029   // Algo name
0030   std::string algoName = algoPSets[chosenAlgo].getParameter<std::string>("algo_name");
0031 
0032   LogDebug("CSCSegment|CSC") << "CSCSegmentBuilder algorithm name: " << algoName;
0033 
0034   // SegAlgo parameter set
0035   std::vector<edm::ParameterSet> segAlgoPSet =
0036       algoPSets[chosenAlgo].getParameter<std::vector<edm::ParameterSet> >("algo_psets");
0037 
0038   // Chamber types to handle
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   // Algo to chamber type
0043   std::vector<int> algoToType = algoPSets[chosenAlgo].getParameter<std::vector<int> >("parameters_per_chamber_type");
0044 
0045   // Trap if we don't have enough parameter sets or haven't assigned an algo to every type
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   // Ask factory to build this algorithm, giving it appropriate ParameterSet
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     // given the chamber select the appropriate algo... and run it
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     // Add the segments to master collection
0099     oc.put((*chIt), segv.begin(), segv.end());
0100   }
0101 }
0102 
0103 void CSCSegmentBuilder::setGeometry(const CSCGeometry* geom) { geom_ = geom; }