File indexing completed on 2023-03-17 10:45:28
0001 #include "CommonTools/RecoAlgos/interface/MuonSelector.h"
0002
0003 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHit.h"
0004 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit1D.h"
0005 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
0006 #include "DataFormats/TrackerRecHit2D/interface/ProjectedSiStripRecHit2D.h"
0007 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h"
0008 #include "DataFormats/SiStripDetId/interface/SiStripDetId.h"
0009
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011
0012 using namespace reco;
0013
0014 namespace helper {
0015 MuonCollectionStoreManager::MuonCollectionStoreManager(const edm::Handle<reco::MuonCollection> &)
0016 : selMuons_(new reco::MuonCollection),
0017 selTracks_(new reco::TrackCollection),
0018 selTracksExtras_(new reco::TrackExtraCollection),
0019 selTracksHits_(new TrackingRecHitCollection),
0020 selGlobalMuonTracks_(new reco::TrackCollection),
0021 selGlobalMuonTracksExtras_(new reco::TrackExtraCollection),
0022 selGlobalMuonTracksHits_(new TrackingRecHitCollection),
0023 selStandAloneTracks_(new reco::TrackCollection),
0024 selStandAloneTracksExtras_(new reco::TrackExtraCollection),
0025 selStandAloneTracksHits_(new TrackingRecHitCollection),
0026 selStripClusters_(new edmNew::DetSetVector<SiStripCluster>),
0027 selPixelClusters_(new edmNew::DetSetVector<SiPixelCluster>),
0028 selPhase2OTClusters_(new edmNew::DetSetVector<Phase2TrackerCluster1D>),
0029 rMuons_(),
0030 rTracks_(),
0031 rTrackExtras_(),
0032 rHits_(),
0033 rGBTracks_(),
0034 rGBTrackExtras_(),
0035 rGBHits_(),
0036 rSATracks_(),
0037 rSATrackExtras_(),
0038 rSAHits_(),
0039 clusterStorer_(),
0040 id_(0),
0041 igbd_(0),
0042 isad_(0),
0043 idx_(0),
0044 igbdx_(0),
0045 isadx_(0),
0046 hidx_(0),
0047 higbdx_(0),
0048 hisadx_(0),
0049 cloneClusters_(true) {}
0050
0051
0052
0053
0054 void MuonCollectionStoreManager::processMuon(const Muon &mu) {
0055 if (this->cloneClusters() && ((mu.globalTrack().isNonnull() && !this->clusterRefsOK(*mu.globalTrack())) ||
0056 (mu.innerTrack().isNonnull() && !this->clusterRefsOK(*mu.innerTrack()))
0057
0058 )) {
0059
0060
0061
0062
0063 edm::LogError("BadRef") << "@SUB=MuonCollectionStoreManager::processMuon"
0064 << "Skip muon: One of its tracks references "
0065 << "non-available clusters!";
0066 return;
0067 }
0068
0069 selMuons_->push_back(Muon(mu));
0070
0071 selMuons_->back().setInnerTrack(TrackRef(rTracks_, id_++));
0072 TrackRef trkRef = mu.track();
0073 if (trkRef.isNonnull()) {
0074 selTracks_->push_back(Track(*trkRef));
0075
0076 Track &trk = selTracks_->back();
0077
0078 selTracksExtras_->push_back(TrackExtra(trk.outerPosition(),
0079 trk.outerMomentum(),
0080 trk.outerOk(),
0081 trk.innerPosition(),
0082 trk.innerMomentum(),
0083 trk.innerOk(),
0084 trk.outerStateCovariance(),
0085 trk.outerDetId(),
0086 trk.innerStateCovariance(),
0087 trk.innerDetId(),
0088 trk.seedDirection()));
0089
0090 TrackExtra &tx = selTracksExtras_->back();
0091
0092 auto const firstHitIndex = hidx_;
0093 unsigned int nHitsAdded = 0;
0094 for (trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++hit, ++hidx_) {
0095 selTracksHits_->push_back((*hit)->clone());
0096 TrackingRecHit *newHit = &(selTracksHits_->back());
0097 ++nHitsAdded;
0098 if (cloneClusters() && newHit->isValid() && ((*hit)->geographicalId().det() == DetId::Tracker)) {
0099 clusterStorer_.addCluster(*selTracksHits_, hidx_);
0100 }
0101 }
0102 tx.setHits(rHits_, firstHitIndex, nHitsAdded);
0103
0104 trk.setExtra(TrackExtraRef(rTrackExtras_, idx_++));
0105
0106 }
0107
0108
0109 selMuons_->back().setGlobalTrack(TrackRef(rGBTracks_, igbd_++));
0110 trkRef = mu.combinedMuon();
0111 if (trkRef.isNonnull()) {
0112 selGlobalMuonTracks_->push_back(Track(*trkRef));
0113 Track &trk = selGlobalMuonTracks_->back();
0114
0115 selGlobalMuonTracksExtras_->push_back(TrackExtra(trk.outerPosition(),
0116 trk.outerMomentum(),
0117 trk.outerOk(),
0118 trk.innerPosition(),
0119 trk.innerMomentum(),
0120 trk.innerOk(),
0121 trk.outerStateCovariance(),
0122 trk.outerDetId(),
0123 trk.innerStateCovariance(),
0124 trk.innerDetId(),
0125 trk.seedDirection()));
0126 TrackExtra &tx = selGlobalMuonTracksExtras_->back();
0127 auto const firstHitIndex = higbdx_;
0128 unsigned int nHitsAdded = 0;
0129 for (trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++hit, ++higbdx_) {
0130 selGlobalMuonTracksHits_->push_back((*hit)->clone());
0131 TrackingRecHit *newHit = &(selGlobalMuonTracksHits_->back());
0132 ++nHitsAdded;
0133 if (cloneClusters() && newHit->isValid() && ((*hit)->geographicalId().det() == DetId::Tracker)) {
0134 clusterStorer_.addCluster(*selGlobalMuonTracksHits_, higbdx_);
0135 }
0136 }
0137 tx.setHits(rGBHits_, firstHitIndex, nHitsAdded);
0138
0139 trk.setExtra(TrackExtraRef(rGBTrackExtras_, igbdx_++));
0140
0141 }
0142
0143
0144 selMuons_->back().setOuterTrack(TrackRef(rSATracks_, isad_++));
0145 trkRef = mu.standAloneMuon();
0146 if (trkRef.isNonnull()) {
0147 selStandAloneTracks_->push_back(Track(*trkRef));
0148 Track &trk = selStandAloneTracks_->back();
0149
0150 selStandAloneTracksExtras_->push_back(TrackExtra(trk.outerPosition(),
0151 trk.outerMomentum(),
0152 trk.outerOk(),
0153 trk.innerPosition(),
0154 trk.innerMomentum(),
0155 trk.innerOk(),
0156 trk.outerStateCovariance(),
0157 trk.outerDetId(),
0158 trk.innerStateCovariance(),
0159 trk.innerDetId(),
0160 trk.seedDirection()));
0161 TrackExtra &tx = selStandAloneTracksExtras_->back();
0162 auto const firstHitIndex = hisadx_;
0163 unsigned int nHitsAdded = 0;
0164 for (trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++hit) {
0165 selStandAloneTracksHits_->push_back((*hit)->clone());
0166 ++nHitsAdded;
0167 hisadx_++;
0168 }
0169 tx.setHits(rSAHits_, firstHitIndex, nHitsAdded);
0170 trk.setExtra(TrackExtraRef(rSATrackExtras_, isadx_++));
0171
0172 }
0173 }
0174
0175
0176
0177
0178 bool MuonCollectionStoreManager::clusterRefsOK(const reco::Track &track) const {
0179 for (trackingRecHit_iterator hitIt = track.recHitsBegin(); hitIt != track.recHitsEnd(); ++hitIt) {
0180 const TrackingRecHit &hit = **hitIt;
0181 if (!hit.isValid() || hit.geographicalId().det() != DetId::Tracker)
0182 continue;
0183
0184
0185 const std::type_info &hit_type = typeid(hit);
0186 if (hit_type == typeid(SiPixelRecHit)) {
0187 if (!static_cast<const SiPixelRecHit &>(hit).cluster().isAvailable())
0188 return false;
0189 } else if (hit_type == typeid(SiStripRecHit2D)) {
0190 if (!static_cast<const SiStripRecHit2D &>(hit).cluster().isAvailable())
0191 return false;
0192 } else if (hit_type == typeid(SiStripRecHit1D)) {
0193 if (!static_cast<const SiStripRecHit1D &>(hit).cluster().isAvailable())
0194 return false;
0195 } else if (hit_type == typeid(SiStripMatchedRecHit2D)) {
0196 const SiStripMatchedRecHit2D &mHit = static_cast<const SiStripMatchedRecHit2D &>(hit);
0197 if (!mHit.monoHit().cluster().isAvailable())
0198 return false;
0199 if (!mHit.stereoHit().cluster().isAvailable())
0200 return false;
0201 } else if (hit_type == typeid(ProjectedSiStripRecHit2D)) {
0202 const ProjectedSiStripRecHit2D &pHit = static_cast<const ProjectedSiStripRecHit2D &>(hit);
0203 if (!pHit.originalHit().cluster().isAvailable())
0204 return false;
0205 } else if (hit_type == typeid(Phase2TrackerRecHit1D)) {
0206 if (!static_cast<const Phase2TrackerRecHit1D &>(hit).cluster().isAvailable())
0207 return false;
0208 } else {
0209
0210
0211 }
0212 }
0213
0214
0215 return true;
0216 }
0217
0218
0219
0220
0221 edm::OrphanHandle<reco::MuonCollection> MuonCollectionStoreManager::put(edm::Event &evt) {
0222 edm::OrphanHandle<reco::MuonCollection> h;
0223 h = evt.put(std::move(selMuons_), "SelectedMuons");
0224 evt.put(std::move(selTracks_), "TrackerOnly");
0225 evt.put(std::move(selTracksExtras_), "TrackerOnly");
0226 evt.put(std::move(selTracksHits_), "TrackerOnly");
0227 evt.put(std::move(selGlobalMuonTracks_), "GlobalMuon");
0228 evt.put(std::move(selGlobalMuonTracksExtras_), "GlobalMuon");
0229 evt.put(std::move(selGlobalMuonTracksHits_), "GlobalMuon");
0230 evt.put(std::move(selStandAloneTracks_), "StandAlone");
0231 evt.put(std::move(selStandAloneTracksExtras_), "StandAlone");
0232 evt.put(std::move(selStandAloneTracksHits_), "StandAlone");
0233 if (cloneClusters()) {
0234 evt.put(std::move(selStripClusters_));
0235 evt.put(std::move(selPixelClusters_));
0236 evt.put(std::move(selPhase2OTClusters_));
0237 }
0238 return h;
0239 }
0240
0241 }