File indexing completed on 2021-03-09 04:50:31
0001 #include "RecoLocalMuon/GEMSegment/plugins/GEMSegmentBuilder.h"
0002 #include "DataFormats/MuonDetId/interface/GEMDetId.h"
0003 #include "DataFormats/GEMRecHit/interface/GEMRecHit.h"
0004 #include "Geometry/GEMGeometry/interface/GEMGeometry.h"
0005 #include "Geometry/GEMGeometry/interface/GEMEtaPartition.h"
0006 #include "RecoLocalMuon/GEMSegment/plugins/GEMSegmentAlgorithmBase.h"
0007 #include "RecoLocalMuon/GEMSegment/plugins/GEMSegmentBuilderPluginFactory.h"
0008
0009 #include "FWCore/Utilities/interface/Exception.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011
0012 GEMSegmentBuilder::GEMSegmentBuilder(const edm::ParameterSet& ps) : geom_(nullptr) {
0013
0014 segAlgoName = ps.getParameter<std::string>("algo_name");
0015 ge0AlgoName = ps.getParameter<std::string>("ge0_name");
0016
0017 edm::LogVerbatim("GEMSegmentBuilder") << "GEMSegmentBuilder algorithm : ge0 name : " << ge0AlgoName
0018 << " name: " << segAlgoName;
0019
0020
0021 segAlgoPSet = ps.getParameter<edm::ParameterSet>("algo_pset");
0022 ge0AlgoPSet = ps.getParameter<edm::ParameterSet>("ge0_pset");
0023
0024
0025 segAlgo = GEMSegmentBuilderPluginFactory::get()->create(segAlgoName, segAlgoPSet);
0026 ge0Algo = GEMSegmentBuilderPluginFactory::get()->create(ge0AlgoName, ge0AlgoPSet);
0027 }
0028 GEMSegmentBuilder::~GEMSegmentBuilder() {}
0029
0030 void GEMSegmentBuilder::build(const GEMRecHitCollection* recHits, GEMSegmentCollection& oc) {
0031 edm::LogVerbatim("GEMSegmentBuilder") << "[GEMSegmentBuilder::build] Total number of rechits in this event: "
0032 << recHits->size();
0033
0034
0035
0036
0037 std::map<uint32_t, std::vector<const GEMRecHit*> > ensembleRH;
0038
0039
0040 for (GEMRecHitCollection::const_iterator it2 = recHits->begin(); it2 != recHits->end(); ++it2) {
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 GEMDetId id(it2->gemId().superChamberId());
0053
0054 ensembleRH[id.rawId()].push_back(&(*it2));
0055 }
0056
0057
0058 for (auto enIt = ensembleRH.begin(); enIt != ensembleRH.end(); ++enIt) {
0059 std::vector<const GEMRecHit*> gemRecHits;
0060 std::map<uint32_t, const GEMEtaPartition*> ens;
0061
0062
0063 const GEMSuperChamber* chamber = geom_->superChamber(enIt->first);
0064 for (auto rechit = enIt->second.begin(); rechit != enIt->second.end(); ++rechit) {
0065 gemRecHits.push_back(*rechit);
0066 ens[(*rechit)->gemId()] = geom_->etaPartition((*rechit)->gemId());
0067 }
0068
0069 #ifdef EDM_ML_DEBUG
0070 LogTrace("GEMSegmentBuilder")
0071 << "[GEMSegmentBuilder::build] -----------------------------------------------------------------------------";
0072 LogTrace("GEMSegmentBuilder") << "[GEMSegmentBuilder::build] found " << gemRecHits.size()
0073 << " rechits in GEM Super Chamber " << chamber->id() << " ::";
0074 for (auto rh = gemRecHits.begin(); rh != gemRecHits.end(); ++rh) {
0075 auto gemid = (*rh)->gemId();
0076
0077 auto rhLP = (*rh)->localPosition();
0078
0079
0080
0081 LogTrace("GEMSegmentBuilder") << "[RecHit :: Loc x = " << std::showpos << std::setw(9)
0082 << rhLP.x()
0083 << " BX = " << (*rh)->BunchX() << " -- " << gemid.rawId() << " = " << gemid << " ]";
0084 }
0085 #endif
0086
0087 GEMSegmentAlgorithmBase::GEMEnsemble ensemble(
0088 std::pair<const GEMSuperChamber*, std::map<uint32_t, const GEMEtaPartition*> >(chamber, ens));
0089
0090 #ifdef EDM_ML_DEBUG
0091 LogTrace("GEMSegmentBuilder") << "[GEMSegmentBuilder::build] run the segment reconstruction algorithm now";
0092 #endif
0093
0094
0095 std::vector<GEMSegment> segv;
0096 if (chamber->id().station() == 0)
0097 segv = ge0Algo->run(ensemble, gemRecHits);
0098 else
0099 segv = segAlgo->run(ensemble, gemRecHits);
0100 #ifdef EDM_ML_DEBUG
0101 LogTrace("GEMSegmentBuilder") << "[GEMSegmentBuilder::build] found " << segv.size();
0102 #endif
0103
0104 GEMDetId mid(enIt->first);
0105
0106 #ifdef EDM_ML_DEBUG
0107 LogTrace("GEMSegmentBuilder") << "[GEMSegmentBuilder::build] found " << segv.size()
0108 << " segments in GEM Super Chamber " << mid;
0109 LogTrace("GEMSegmentBuilder")
0110 << "[GEMSegmentBuilder::build] -----------------------------------------------------------------------------";
0111 #endif
0112
0113
0114 oc.put(mid, segv.begin(), segv.end());
0115 }
0116 }
0117
0118 void GEMSegmentBuilder::setGeometry(const GEMGeometry* geom) { geom_ = geom; }