File indexing completed on 2025-07-03 00:42:46
0001
0002
0003
0004
0005
0006 #include "DataFormats/CSCRecHit/interface/CSCSegmentCollection.h"
0007 #include "DataFormats/DTRecHit/interface/DTRecSegment4DCollection.h"
0008 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
0009 #include "DataFormats/MuonDetId/interface/DTChamberId.h"
0010 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
0011 #include "DataFormats/MuonReco/interface/Muon.h"
0012 #include "DataFormats/MuonReco/interface/MuonFwd.h"
0013 #include "DataFormats/MuonReco/interface/MuonSelectors.h"
0014 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0015 #include "DataFormats/TrackReco/interface/Track.h"
0016 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0017 #include "Geometry/Records/interface/TrackerTopologyRcd.h"
0018 #include "FWCore/Framework/interface/Event.h"
0019 #include "FWCore/Framework/interface/global/EDProducer.h"
0020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0021 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0022
0023 #include <algorithm>
0024 #include <sstream>
0025 #include <memory>
0026
0027 class MuonTrackProducer : public edm::global::EDProducer<> {
0028 public:
0029 explicit MuonTrackProducer(const edm::ParameterSet &);
0030
0031 private:
0032 void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override;
0033
0034 edm::EDGetTokenT<reco::MuonCollection> muonsToken;
0035 edm::EDGetTokenT<DTRecSegment4DCollection> inputDTRecSegment4DToken_;
0036 edm::EDGetTokenT<CSCSegmentCollection> inputCSCSegmentToken_;
0037 edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> ttopoToken_;
0038
0039 std::vector<std::string> selectionTags;
0040 std::string trackType;
0041 bool ignoreMissingMuonCollection;
0042 };
0043
0044 MuonTrackProducer::MuonTrackProducer(const edm::ParameterSet &parset)
0045 : muonsToken(consumes<reco::MuonCollection>(parset.getParameter<edm::InputTag>("muonsTag"))),
0046 inputDTRecSegment4DToken_(
0047 consumes<DTRecSegment4DCollection>(parset.getParameter<edm::InputTag>("inputDTRecSegment4DCollection"))),
0048 inputCSCSegmentToken_(
0049 consumes<CSCSegmentCollection>(parset.getParameter<edm::InputTag>("inputCSCSegmentCollection"))),
0050 ttopoToken_(esConsumes<TrackerTopology, TrackerTopologyRcd>()),
0051 selectionTags(parset.getParameter<std::vector<std::string>>("selectionTags")),
0052 trackType(parset.getParameter<std::string>("trackType")),
0053 ignoreMissingMuonCollection(parset.getUntrackedParameter<bool>("ignoreMissingMuonCollection", false)) {
0054 edm::LogVerbatim("MuonTrackProducer") << "constructing MuonTrackProducer" << parset.dump();
0055 produces<reco::TrackCollection>();
0056 produces<reco::TrackExtraCollection>();
0057 produces<TrackingRecHitCollection>();
0058 }
0059
0060 void MuonTrackProducer::produce(edm::StreamID, edm::Event &iEvent, const edm::EventSetup &iSetup) const {
0061 edm::Handle<reco::MuonCollection> muonCollectionH = iEvent.getHandle(muonsToken);
0062
0063 std::unique_ptr<reco::TrackCollection> selectedTracks(new reco::TrackCollection);
0064 std::unique_ptr<reco::TrackExtraCollection> selectedTrackExtras(new reco::TrackExtraCollection());
0065 std::unique_ptr<TrackingRecHitCollection> selectedTrackHits(new TrackingRecHitCollection());
0066
0067 if (ignoreMissingMuonCollection && !muonCollectionH.isValid()) {
0068 edm::LogVerbatim("MuonTrackProducer") << "\n ignoring missing muon collection.";
0069
0070 iEvent.put(std::move(selectedTracks));
0071 iEvent.put(std::move(selectedTrackExtras));
0072 iEvent.put(std::move(selectedTrackHits));
0073
0074 } else {
0075 const DTRecSegment4DCollection &dtSegmentCollection = iEvent.get(inputDTRecSegment4DToken_);
0076 const CSCSegmentCollection &cscSegmentCollection = iEvent.get(inputCSCSegmentToken_);
0077
0078 const TrackerTopology &ttopo = iSetup.getData(ttopoToken_);
0079
0080
0081 reco::TrackExtraRefProd rTrackExtras = iEvent.getRefBeforePut<reco::TrackExtraCollection>();
0082 TrackingRecHitRefProd rHits = iEvent.getRefBeforePut<TrackingRecHitCollection>();
0083
0084 edm::Ref<reco::TrackExtraCollection>::key_type idx = 0;
0085 edm::Ref<reco::TrackExtraCollection>::key_type hidx = 0;
0086
0087 edm::LogVerbatim("MuonTrackProducer") << "\nThere are " << dtSegmentCollection.size() << " DT segments.";
0088 unsigned int index_dt_segment = 0;
0089 for (DTRecSegment4DCollection::const_iterator segment = dtSegmentCollection.begin();
0090 segment != dtSegmentCollection.end();
0091 ++segment, index_dt_segment++) {
0092 LocalPoint segmentLocalPosition = segment->localPosition();
0093 LocalVector segmentLocalDirection = segment->localDirection();
0094 LocalError segmentLocalPositionError = segment->localPositionError();
0095 LocalError segmentLocalDirectionError = segment->localDirectionError();
0096 DetId geoid = segment->geographicalId();
0097 DTChamberId dtdetid = DTChamberId(geoid);
0098 int wheel = dtdetid.wheel();
0099 int station = dtdetid.station();
0100 int sector = dtdetid.sector();
0101
0102 float segmentX = segmentLocalPosition.x();
0103 float segmentY = segmentLocalPosition.y();
0104 float segmentdXdZ = segmentLocalDirection.x() / segmentLocalDirection.z();
0105 float segmentdYdZ = segmentLocalDirection.y() / segmentLocalDirection.z();
0106 float segmentXerr = sqrt(segmentLocalPositionError.xx());
0107 float segmentYerr = sqrt(segmentLocalPositionError.yy());
0108 float segmentdXdZerr = sqrt(segmentLocalDirectionError.xx());
0109 float segmentdYdZerr = sqrt(segmentLocalDirectionError.yy());
0110
0111 edm::LogVerbatim("MuonTrackProducer")
0112 << "\nDT segment index :" << index_dt_segment << "\nchamber Wh:" << wheel << ",St:" << station
0113 << ",Se:" << sector << "\nLocal Position (X,Y)=(" << segmentX << "," << segmentY << ") +/- (" << segmentXerr
0114 << "," << segmentYerr << "), "
0115 << "Local Direction (dXdZ,dYdZ)=(" << segmentdXdZ << "," << segmentdYdZ << ") +/- (" << segmentdXdZerr << ","
0116 << segmentdYdZerr << ")";
0117 }
0118
0119 edm::LogVerbatim("MuonTrackProducer") << "\nThere are " << cscSegmentCollection.size() << " CSC segments.";
0120 unsigned int index_csc_segment = 0;
0121 for (CSCSegmentCollection::const_iterator segment = cscSegmentCollection.begin();
0122 segment != cscSegmentCollection.end();
0123 ++segment, index_csc_segment++) {
0124 LocalPoint segmentLocalPosition = segment->localPosition();
0125 LocalVector segmentLocalDirection = segment->localDirection();
0126 LocalError segmentLocalPositionError = segment->localPositionError();
0127 LocalError segmentLocalDirectionError = segment->localDirectionError();
0128
0129 DetId geoid = segment->geographicalId();
0130 CSCDetId cscdetid = CSCDetId(geoid);
0131 int endcap = cscdetid.endcap();
0132 int station = cscdetid.station();
0133 int ring = cscdetid.ring();
0134 int chamber = cscdetid.chamber();
0135
0136 float segmentX = segmentLocalPosition.x();
0137 float segmentY = segmentLocalPosition.y();
0138 float segmentdXdZ = segmentLocalDirection.x() / segmentLocalDirection.z();
0139 float segmentdYdZ = segmentLocalDirection.y() / segmentLocalDirection.z();
0140 float segmentXerr = sqrt(segmentLocalPositionError.xx());
0141 float segmentYerr = sqrt(segmentLocalPositionError.yy());
0142 float segmentdXdZerr = sqrt(segmentLocalDirectionError.xx());
0143 float segmentdYdZerr = sqrt(segmentLocalDirectionError.yy());
0144
0145 edm::LogVerbatim("MuonTrackProducer")
0146 << "\nCSC segment index :" << index_csc_segment << "\nchamber Endcap:" << endcap << ",St:" << station
0147 << ",Ri:" << ring << ",Ch:" << chamber << "\nLocal Position (X,Y)=(" << segmentX << "," << segmentY
0148 << ") +/- (" << segmentXerr << "," << segmentYerr << "), "
0149 << "Local Direction (dXdZ,dYdZ)=(" << segmentdXdZ << "," << segmentdYdZ << ") +/- (" << segmentdXdZerr << ","
0150 << segmentdYdZerr << ")";
0151 }
0152
0153 edm::LogVerbatim("MuonTrackProducer") << "\nThere are " << muonCollectionH->size() << " reco::Muons.";
0154 unsigned int muon_index = 0;
0155 for (reco::MuonCollection::const_iterator muon = muonCollectionH->begin(); muon != muonCollectionH->end();
0156 ++muon, muon_index++) {
0157 edm::LogVerbatim("MuonTrackProducer") << "\n******* muon index : " << muon_index;
0158
0159 const bool isGoodResult =
0160 std::all_of(selectionTags.begin(), selectionTags.end(), [&muon](const std::string &name) {
0161 muon::SelectionType muonType = muon::selectionTypeFromString(name);
0162 return muon::isGoodMuon(*muon, muonType);
0163 });
0164
0165 if (isGoodResult) {
0166
0167 reco::TrackRef trackref;
0168 bool addMatchedMuonSegments = false;
0169
0170 if (trackType == "innerTrack") {
0171 if (muon->innerTrack().isNonnull())
0172 trackref = muon->innerTrack();
0173 else
0174 continue;
0175 } else if (trackType == "outerTrack") {
0176 if (muon->outerTrack().isNonnull())
0177 trackref = muon->outerTrack();
0178 else
0179 continue;
0180 } else if (trackType == "globalTrack") {
0181 if (muon->globalTrack().isNonnull())
0182 trackref = muon->globalTrack();
0183 else
0184 continue;
0185 } else if (trackType == "innerTrackPlusSegments") {
0186 if (muon->innerTrack().isNonnull()) {
0187 trackref = muon->innerTrack();
0188 addMatchedMuonSegments = true;
0189 } else
0190 continue;
0191 } else if (trackType == "rpcMuonTrack") {
0192 if (muon->innerTrack().isNonnull() && muon->isRPCMuon()) {
0193 trackref = muon->innerTrack();
0194 } else
0195 continue;
0196 } else if (trackType == "gemMuonTrack") {
0197 if (muon->innerTrack().isNonnull() && muon->isGEMMuon()) {
0198 trackref = muon->innerTrack();
0199 } else
0200 continue;
0201 } else if (trackType == "me0MuonTrack") {
0202 if (muon->innerTrack().isNonnull() && muon->isME0Muon()) {
0203 trackref = muon->innerTrack();
0204 } else
0205 continue;
0206 } else if (trackType == "tunepTrack") {
0207 if (muon->isGlobalMuon() && muon->tunePMuonBestTrack().isNonnull())
0208 trackref = muon->tunePMuonBestTrack();
0209 else
0210 continue;
0211 } else if (trackType == "pfTrack") {
0212 if (muon->isPFMuon() && muon->muonBestTrack().isNonnull())
0213 trackref = muon->muonBestTrack();
0214 else
0215 continue;
0216 } else if (trackType == "recomuonTrack") {
0217 if (muon->muonBestTrackType() != muon->tunePMuonBestTrackType())
0218 edm::LogVerbatim("MuonTrackProducer") << "\n *** PF != TuneP *** \n" << std::endl;
0219
0220 edm::LogVerbatim("MuonTrackProducer") << "isGlobal ? " << muon->isGlobalMuon() << std::endl;
0221 edm::LogVerbatim("MuonTrackProducer")
0222 << "isTracker ? " << muon->isTrackerMuon() << ", isRPC ? " << muon->isRPCMuon() << ", isGEM ? "
0223 << muon->isGEMMuon() << ", isME0 ? " << muon->isME0Muon() << std::endl;
0224 edm::LogVerbatim("MuonTrackProducer") << "isStandAlone ? " << muon->isStandAloneMuon() << std::endl;
0225 edm::LogVerbatim("MuonTrackProducer") << "isCalo ? " << muon->isCaloMuon() << std::endl;
0226 edm::LogVerbatim("MuonTrackProducer") << "isPF ? " << muon->isPFMuon() << std::endl << std::endl;
0227
0228 edm::LogVerbatim("MuonTrackProducer")
0229 << " enum MuonTrackType {None, InnerTrack, OuterTrack, CombinedTrack, TPFMS, Picky, DYT }" << std::endl;
0230
0231 edm::LogVerbatim("MuonTrackProducer")
0232 << "(muon) pt = " << muon->pt() << ", eta = " << muon->eta() << ", phi = " << muon->phi() << std::endl;
0233
0234 if (muon->muonBestTrack().isNonnull())
0235 edm::LogVerbatim("MuonTrackProducer")
0236 << "(best) pt = " << muon->muonBestTrack()->pt() << ", eta = " << muon->muonBestTrack()->eta()
0237 << ", phi = " << muon->muonBestTrack()->phi()
0238 << ", N mu hits = " << muon->muonBestTrack()->hitPattern().numberOfValidMuonHits()
0239 << ", N trk hits = " << muon->muonBestTrack()->hitPattern().numberOfValidTrackerHits()
0240 << ", MuonTrackType = " << muon->muonBestTrackType() << std::endl;
0241 if (muon->tunePMuonBestTrack().isNonnull())
0242 edm::LogVerbatim("MuonTrackProducer")
0243 << "(tuneP) pt = " << muon->tunePMuonBestTrack()->pt()
0244 << ", eta = " << muon->tunePMuonBestTrack()->eta() << ", phi = " << muon->tunePMuonBestTrack()->phi()
0245 << ", N mu hits = " << muon->tunePMuonBestTrack()->hitPattern().numberOfValidMuonHits()
0246 << ", N trk hits = " << muon->tunePMuonBestTrack()->hitPattern().numberOfValidTrackerHits()
0247 << ", MuonTrackType = " << muon->tunePMuonBestTrackType() << std::endl;
0248 if (muon->innerTrack().isNonnull())
0249 edm::LogVerbatim("MuonTrackProducer")
0250 << "(inner) pt = " << muon->innerTrack()->pt() << ", eta = " << muon->innerTrack()->eta()
0251 << ", phi = " << muon->innerTrack()->phi()
0252 << ", N trk hits = " << muon->innerTrack()->hitPattern().numberOfValidTrackerHits() << std::endl;
0253 if (muon->globalTrack().isNonnull())
0254 edm::LogVerbatim("MuonTrackProducer")
0255 << "(global) pt = " << muon->globalTrack()->pt() << ", eta = " << muon->globalTrack()->eta()
0256 << ", phi = " << muon->globalTrack()->phi()
0257 << ", N mu hits = " << muon->globalTrack()->hitPattern().numberOfValidMuonHits()
0258 << ", N trk hits = " << muon->globalTrack()->hitPattern().numberOfValidTrackerHits() << std::endl;
0259 if (muon->outerTrack().isNonnull())
0260 edm::LogVerbatim("MuonTrackProducer")
0261 << "(outer) pt = " << muon->outerTrack()->pt() << ", eta = " << muon->outerTrack()->eta()
0262 << ", phi = " << muon->outerTrack()->phi()
0263 << ", N mu hits = " << muon->outerTrack()->hitPattern().numberOfValidMuonHits() << std::endl;
0264 if (muon->tpfmsTrack().isNonnull())
0265 edm::LogVerbatim("MuonTrackProducer")
0266 << "(tpfms) pt = " << muon->tpfmsTrack()->pt() << ", eta = " << muon->tpfmsTrack()->eta()
0267 << ", phi = " << muon->tpfmsTrack()->phi()
0268 << ", N mu hits = " << muon->tpfmsTrack()->hitPattern().numberOfValidMuonHits()
0269 << ", N trk hits = " << muon->tpfmsTrack()->hitPattern().numberOfValidTrackerHits() << std::endl;
0270 if (muon->pickyTrack().isNonnull())
0271 edm::LogVerbatim("MuonTrackProducer")
0272 << "(picky) pt = " << muon->pickyTrack()->pt() << ", eta = " << muon->pickyTrack()->eta()
0273 << ", phi = " << muon->pickyTrack()->phi()
0274 << ", N mu hits = " << muon->pickyTrack()->hitPattern().numberOfValidMuonHits()
0275 << ", N trk hits = " << muon->pickyTrack()->hitPattern().numberOfValidTrackerHits() << std::endl;
0276 if (muon->dytTrack().isNonnull())
0277 edm::LogVerbatim("MuonTrackProducer")
0278 << "(dyt) pt = " << muon->dytTrack()->pt() << ", eta = " << muon->dytTrack()->eta()
0279 << ", phi = " << muon->dytTrack()->phi()
0280 << ", N mu hits = " << muon->dytTrack()->hitPattern().numberOfValidMuonHits()
0281 << ", N trk hits = " << muon->dytTrack()->hitPattern().numberOfValidTrackerHits() << std::endl;
0282
0283 if (muon->isGlobalMuon() && muon->globalTrack()->hitPattern().numberOfValidMuonHits() > 0)
0284 trackref = muon->globalTrack();
0285 else if (muon->isTrackerMuon()) {
0286 trackref = muon->innerTrack();
0287 addMatchedMuonSegments = true;
0288 } else if (muon->isPFMuon())
0289 trackref = muon->muonBestTrack();
0290 else if (muon->isStandAloneMuon())
0291 trackref = muon->outerTrack();
0292 else if (muon->isRPCMuon())
0293 trackref = muon->innerTrack();
0294 else if (muon->isGEMMuon())
0295 trackref = muon->innerTrack();
0296 else if (muon->isME0Muon())
0297 trackref = muon->innerTrack();
0298 else
0299 trackref = muon->muonBestTrack();
0300 }
0301
0302 edm::LogVerbatim("MuonTrackProducer") << "\t *** Selected *** ";
0303 const reco::Track *trk = &(*trackref);
0304
0305 std::unique_ptr<reco::Track> newTrk(new reco::Track(*trk));
0306
0307 newTrk->setExtra(reco::TrackExtraRef(rTrackExtras, idx++));
0308 PropagationDirection seedDir = trk->seedDirection();
0309
0310 std::unique_ptr<reco::TrackExtra> newExtra(new reco::TrackExtra(trk->outerPosition(),
0311 trk->outerMomentum(),
0312 trk->outerOk(),
0313 trk->innerPosition(),
0314 trk->innerMomentum(),
0315 trk->innerOk(),
0316 trk->outerStateCovariance(),
0317 trk->outerDetId(),
0318 trk->innerStateCovariance(),
0319 trk->innerDetId(),
0320 seedDir));
0321
0322
0323
0324
0325
0326
0327 unsigned int nHitsToAdd = 0;
0328 for (trackingRecHit_iterator iHit = trk->recHitsBegin(); iHit != trk->recHitsEnd(); iHit++) {
0329 TrackingRecHit *hit = (*iHit)->clone();
0330 selectedTrackHits->push_back(hit);
0331 ++nHitsToAdd;
0332 }
0333
0334 if (addMatchedMuonSegments) {
0335 int wheel, station, sector;
0336 int endcap, ring, chamber;
0337
0338 edm::LogVerbatim("MuonTrackProducer")
0339 << "Number of chambers: " << muon->matches().size()
0340 << ", arbitrated: " << muon->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
0341 unsigned int index_chamber = 0;
0342
0343 for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = muon->matches().begin();
0344 chamberMatch != muon->matches().end();
0345 ++chamberMatch, index_chamber++) {
0346 std::stringstream chamberStr;
0347 chamberStr << "\nchamber index: " << index_chamber;
0348
0349 int subdet = chamberMatch->detector();
0350 DetId did = chamberMatch->id;
0351
0352 if (subdet == MuonSubdetId::DT) {
0353 DTChamberId dtdetid = DTChamberId(did);
0354 wheel = dtdetid.wheel();
0355 station = dtdetid.station();
0356 sector = dtdetid.sector();
0357 chamberStr << ", DT chamber Wh:" << wheel << ",St:" << station << ",Se:" << sector;
0358 } else if (subdet == MuonSubdetId::CSC) {
0359 CSCDetId cscdetid = CSCDetId(did);
0360 endcap = cscdetid.endcap();
0361 station = cscdetid.station();
0362 ring = cscdetid.ring();
0363 chamber = cscdetid.chamber();
0364 chamberStr << ", CSC chamber End:" << endcap << ",St:" << station << ",Ri:" << ring << ",Ch:" << chamber;
0365 }
0366
0367 chamberStr << ", Number of segments: " << chamberMatch->segmentMatches.size();
0368 edm::LogVerbatim("MuonTrackProducer") << chamberStr.str();
0369
0370 unsigned int index_segment = 0;
0371
0372 for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch =
0373 chamberMatch->segmentMatches.begin();
0374 segmentMatch != chamberMatch->segmentMatches.end();
0375 ++segmentMatch, index_segment++) {
0376 float segmentX = segmentMatch->x;
0377 float segmentY = segmentMatch->y;
0378 float segmentdXdZ = segmentMatch->dXdZ;
0379 float segmentdYdZ = segmentMatch->dYdZ;
0380 float segmentXerr = segmentMatch->xErr;
0381 float segmentYerr = segmentMatch->yErr;
0382 float segmentdXdZerr = segmentMatch->dXdZErr;
0383 float segmentdYdZerr = segmentMatch->dYdZErr;
0384
0385 CSCSegmentRef segmentCSC = segmentMatch->cscSegmentRef;
0386 DTRecSegment4DRef segmentDT = segmentMatch->dtSegmentRef;
0387
0388 bool segment_arbitrated_Ok = (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
0389 segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR));
0390
0391 std::string ARBITRATED(" ***Arbitrated Off*** ");
0392 if (segment_arbitrated_Ok)
0393 ARBITRATED = " ***ARBITRATED OK*** ";
0394
0395 if (subdet == MuonSubdetId::DT) {
0396 edm::LogVerbatim("MuonTrackProducer")
0397 << "\n\t segment index: " << index_segment << ARBITRATED << "\n\t Local Position (X,Y)=("
0398 << segmentX << "," << segmentY << ") +/- (" << segmentXerr << "," << segmentYerr << "), "
0399 << "\n\t Local Direction (dXdZ,dYdZ)=(" << segmentdXdZ << "," << segmentdYdZ << ") +/- ("
0400 << segmentdXdZerr << "," << segmentdYdZerr << ")";
0401
0402 if (!segment_arbitrated_Ok)
0403 continue;
0404
0405 if (segmentDT.get() != nullptr) {
0406 const DTRecSegment4D *segment = segmentDT.get();
0407
0408 edm::LogVerbatim("MuonTrackProducer")
0409 << "\t ===> MATCHING with DT segment with index = " << segmentDT.key();
0410
0411 if (segment->hasPhi()) {
0412 const DTChamberRecSegment2D *phiSeg = segment->phiSegment();
0413 std::vector<const TrackingRecHit *> phiHits = phiSeg->recHits();
0414 for (std::vector<const TrackingRecHit *>::const_iterator ihit = phiHits.begin();
0415 ihit != phiHits.end();
0416 ++ihit) {
0417 TrackingRecHit *seghit = (*ihit)->clone();
0418 newTrk->appendHitPattern(*seghit, ttopo);
0419
0420
0421
0422
0423 selectedTrackHits->push_back(seghit);
0424 ++nHitsToAdd;
0425 }
0426 }
0427
0428 if (segment->hasZed()) {
0429 const DTSLRecSegment2D *zSeg = (*segment).zSegment();
0430 std::vector<const TrackingRecHit *> zedHits = zSeg->recHits();
0431 for (std::vector<const TrackingRecHit *>::const_iterator ihit = zedHits.begin();
0432 ihit != zedHits.end();
0433 ++ihit) {
0434 TrackingRecHit *seghit = (*ihit)->clone();
0435 newTrk->appendHitPattern(*seghit, ttopo);
0436
0437
0438
0439
0440 selectedTrackHits->push_back(seghit);
0441 ++nHitsToAdd;
0442 }
0443 }
0444 } else
0445 edm::LogWarning("MuonTrackProducer") << "\n***WARNING: UNMATCHED DT segment ! \n";
0446 }
0447
0448 else if (subdet == MuonSubdetId::CSC) {
0449 edm::LogVerbatim("MuonTrackProducer")
0450 << "\n\t segment index: " << index_segment << ARBITRATED << "\n\t Local Position (X,Y)=("
0451 << segmentX << "," << segmentY << ") +/- (" << segmentXerr << "," << segmentYerr << "), "
0452 << "\n\t Local Direction (dXdZ,dYdZ)=(" << segmentdXdZ << "," << segmentdYdZ << ") +/- ("
0453 << segmentdXdZerr << "," << segmentdYdZerr << ")";
0454
0455 if (!segment_arbitrated_Ok)
0456 continue;
0457
0458 if (segmentCSC.get() != nullptr) {
0459 const CSCSegment *segment = segmentCSC.get();
0460
0461 edm::LogVerbatim("MuonTrackProducer")
0462 << "\t ===> MATCHING with CSC segment with index = " << segmentCSC.key();
0463
0464 std::vector<const TrackingRecHit *> hits = segment->recHits();
0465 for (std::vector<const TrackingRecHit *>::const_iterator ihit = hits.begin(); ihit != hits.end();
0466 ++ihit) {
0467 TrackingRecHit *seghit = (*ihit)->clone();
0468 newTrk->appendHitPattern(*seghit, ttopo);
0469
0470
0471
0472
0473 selectedTrackHits->push_back(seghit);
0474 ++nHitsToAdd;
0475 }
0476 } else
0477 edm::LogWarning("MuonTrackProducer") << "\n***WARNING: UNMATCHED CSC segment ! \n";
0478 }
0479
0480 }
0481 }
0482 }
0483
0484
0485
0486
0487 newExtra->setHits(rHits, hidx, nHitsToAdd);
0488 hidx += nHitsToAdd;
0489
0490 selectedTracks->push_back(*newTrk);
0491 selectedTrackExtras->push_back(*newExtra);
0492
0493 }
0494 }
0495
0496 iEvent.put(std::move(selectedTracks));
0497 iEvent.put(std::move(selectedTrackExtras));
0498 iEvent.put(std::move(selectedTrackHits));
0499 }
0500 }
0501
0502 #include "FWCore/Framework/interface/MakerMacros.h"
0503 #include "FWCore/PluginManager/interface/ModuleDef.h"
0504 DEFINE_FWK_MODULE(MuonTrackProducer);