File indexing completed on 2024-04-06 12:27:01
0001 #include "RecoMuon/MuonIdentification/plugins/MuonReducedTrackExtraProducer.h"
0002 #include "DataFormats/MuonReco/interface/Muon.h"
0003 #include "DataFormats/TrackerRecHit2D/interface/TrackerSingleRecHit.h"
0004 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h"
0005
0006 MuonReducedTrackExtraProducer::MuonReducedTrackExtraProducer(const edm::ParameterSet& pset)
0007 : muonToken_(consumes<edm::View<reco::Muon>>(pset.getParameter<edm::InputTag>("muonTag"))),
0008 outputClusters_(pset.getParameter<bool>("outputClusters")),
0009 selector_(pset.getParameter<std::string>("cut")),
0010 trackExtraOutToken_(produces<reco::TrackExtraCollection>()),
0011 trackingRecHitsOutToken_(produces<TrackingRecHitCollection>()),
0012 associationOutToken_(produces<edm::Association<reco::TrackExtraCollection>>()) {
0013 std::vector<edm::InputTag> trackExtraTags = pset.getParameter<std::vector<edm::InputTag>>("trackExtraTags");
0014 for (edm::InputTag const& tag : trackExtraTags) {
0015 trackExtraTokens_.push_back(consumes<reco::TrackExtraCollection>(tag));
0016 }
0017
0018 std::vector<edm::InputTag> trackExtraAssocTags = pset.getParameter<std::vector<edm::InputTag>>("trackExtraAssocs");
0019 for (edm::InputTag const& tag : trackExtraAssocTags) {
0020 trackExtraAssocs_.push_back(consumes<edm::Association<reco::TrackExtraCollection>>(tag));
0021 }
0022
0023 if (outputClusters_) {
0024 pixelClusterToken_ =
0025 consumes<edmNew::DetSetVector<SiPixelCluster>>(pset.getParameter<edm::InputTag>("pixelClusterTag"));
0026 stripClusterToken_ =
0027 consumes<edmNew::DetSetVector<SiStripCluster>>(pset.getParameter<edm::InputTag>("stripClusterTag"));
0028
0029 pixelClusterOutToken_ = produces<edmNew::DetSetVector<SiPixelCluster>>();
0030 stripClusterOutToken_ = produces<edmNew::DetSetVector<SiStripCluster>>();
0031 }
0032 }
0033
0034 void MuonReducedTrackExtraProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0035 edm::ParameterSetDescription desc;
0036 desc.setComment(
0037 "Produces reduced set of TrackExtras and corresponding TrackingRecHits and (optionally) Pixe/Strip clusters "
0038 "associated to a muon track.");
0039 desc.add<edm::InputTag>("muonTag", edm::InputTag("muons"));
0040 desc.add<std::vector<edm::InputTag>>("trackExtraTags",
0041 {edm::InputTag("generalTracks"),
0042 edm::InputTag("globalMuons"),
0043 edm::InputTag("tevMuons", "firstHit"),
0044 edm::InputTag("tevMuons", "picky"),
0045 edm::InputTag("tevMuons", "dyt")});
0046 desc.add<std::vector<edm::InputTag>>("trackExtraAssocs", {});
0047 desc.add<edm::InputTag>("pixelClusterTag", edm::InputTag("siPixelClusters"));
0048 desc.add<edm::InputTag>("stripClusterTag", edm::InputTag("siStripClusters"));
0049 desc.add<std::string>("cut", "pt > 3.0");
0050 desc.add<bool>("outputClusters", true);
0051 descriptions.add("muonReducedTrackExtras", desc);
0052 }
0053
0054 void MuonReducedTrackExtraProducer::produce(edm::Event& event, const edm::EventSetup& eventSetup) {
0055 auto muons = event.getHandle(muonToken_);
0056
0057 std::vector<edm::Handle<reco::TrackExtraCollection>> trackExtrasV(trackExtraTokens_.size());
0058 for (unsigned int i = 0; i < trackExtraTokens_.size(); ++i) {
0059 event.getByToken(trackExtraTokens_[i], trackExtrasV[i]);
0060 }
0061
0062 std::vector<edm::Handle<edm::Association<reco::TrackExtraCollection>>> trackExtraAssocs(trackExtraAssocs_.size());
0063 for (unsigned int i = 0; i < trackExtraAssocs_.size(); ++i) {
0064 event.getByToken(trackExtraAssocs_[i], trackExtraAssocs[i]);
0065 }
0066
0067 std::map<edm::ProductID, std::vector<bool>> idxstokeep;
0068 for (auto const& trackExtras : trackExtrasV) {
0069 idxstokeep[trackExtras.id()].resize(trackExtras->size(), false);
0070 }
0071
0072
0073 for (auto const& muon : *muons) {
0074 if (!selector_(muon)) {
0075 continue;
0076 }
0077 reco::TrackExtraRef trackExtra = muon.bestTrack()->extra();
0078
0079 for (auto const& assoc : trackExtraAssocs) {
0080 if (!assoc->contains(trackExtra.id())) {
0081 continue;
0082 }
0083 reco::TrackExtraRef const& trackExtraOut = (*assoc)[trackExtra];
0084 if (trackExtraOut.isNonnull()) {
0085 trackExtra = trackExtraOut;
0086 }
0087 }
0088 auto idxs = idxstokeep.find(trackExtra.id());
0089 if (idxs != idxstokeep.end()) {
0090 idxs->second[trackExtra.key()] = true;
0091 }
0092 }
0093
0094
0095 reco::TrackExtraCollection trackExtrasOut;
0096 TrackingRecHitCollection trackingRecHitsOut;
0097 edm::Association<reco::TrackExtraCollection> association;
0098 edm::Association<reco::TrackExtraCollection>::Filler assocfiller(association);
0099
0100
0101 edm::RefProd<reco::TrackExtraCollection> trackExtraRefProd = event.getRefBeforePut(trackExtraOutToken_);
0102
0103 edm::RefProd<TrackingRecHitCollection> hitRefProd = event.getRefBeforePut(trackingRecHitsOutToken_);
0104
0105 association.setRef(trackExtraRefProd);
0106
0107 edm::Handle<edmNew::DetSetVector<SiPixelCluster>> pixelClusters;
0108 edm::Handle<edmNew::DetSetVector<SiStripCluster>> stripClusters;
0109
0110
0111 std::vector<bool> pixelClustersToKeep;
0112 std::vector<bool> stripClustersToKeep;
0113
0114 if (outputClusters_) {
0115 event.getByToken(pixelClusterToken_, pixelClusters);
0116 event.getByToken(stripClusterToken_, stripClusters);
0117
0118 pixelClustersToKeep.resize(pixelClusters->dataSize(), false);
0119 stripClustersToKeep.resize(stripClusters->dataSize(), false);
0120 }
0121
0122 using SiPixelClusterRef = edm::Ref<edmNew::DetSetVector<SiPixelCluster>, SiPixelCluster>;
0123 using SiStripClusterRef = edm::Ref<edmNew::DetSetVector<SiStripCluster>, SiStripCluster>;
0124
0125
0126
0127 for (auto const& trackExtras : trackExtrasV) {
0128 const std::vector<bool>& idxs = idxstokeep.at(trackExtras.id());
0129
0130 std::vector<int> associdxs(trackExtras->size(), -1);
0131 for (unsigned int i = 0; i < trackExtras->size(); ++i) {
0132 if (!idxs[i]) {
0133 continue;
0134 }
0135 const reco::TrackExtra& trackExtra = (*trackExtras)[i];
0136
0137
0138 associdxs[i] = trackExtrasOut.size();
0139
0140
0141 trackExtrasOut.emplace_back(trackExtra.outerPosition(),
0142 trackExtra.outerMomentum(),
0143 trackExtra.outerOk(),
0144 trackExtra.innerPosition(),
0145 trackExtra.innerMomentum(),
0146 trackExtra.innerOk(),
0147 trackExtra.outerStateCovariance(),
0148 trackExtra.outerDetId(),
0149 trackExtra.innerStateCovariance(),
0150 trackExtra.innerDetId(),
0151 trackExtra.seedDirection(),
0152 trackExtra.seedRef());
0153
0154
0155 reco::TrackExtra& trackExtraOut = trackExtrasOut.back();
0156 trackExtraOut.setHits(hitRefProd, trackingRecHitsOut.size(), trackExtra.recHitsSize());
0157 for (auto const& hit : trackExtra.recHits()) {
0158 if (outputClusters_) {
0159
0160 TrackerSingleRecHit const* singleHit = dynamic_cast<TrackerSingleRecHit const*>(&*hit);
0161 if (singleHit != nullptr) {
0162 SiPixelClusterRef const& pixelRef = singleHit->cluster_pixel();
0163 if (pixelRef.isNonnull() && pixelRef.id() == pixelClusters.id()) {
0164 pixelClustersToKeep[pixelRef.key()] = true;
0165 }
0166 SiStripClusterRef const& stripRef = singleHit->cluster_strip();
0167 if (stripRef.isNonnull() && stripRef.id() == stripClusters.id()) {
0168 stripClustersToKeep[stripRef.key()] = true;
0169 }
0170 SiStripMatchedRecHit2D const* matched2DHit = dynamic_cast<SiStripMatchedRecHit2D const*>(singleHit);
0171 if (matched2DHit != nullptr) {
0172 SiStripClusterRef const& monoRef = matched2DHit->monoClusterRef().cluster_strip();
0173 SiStripClusterRef const& stereoRef = matched2DHit->stereoClusterRef().cluster_strip();
0174 if (monoRef.isNonnull() && monoRef.id() == stripClusters.id()) {
0175 stripClustersToKeep[monoRef.key()] = true;
0176 }
0177 if (stereoRef.isNonnull() && stereoRef.id() == stripClusters.id()) {
0178 stripClustersToKeep[stereoRef.key()] = true;
0179 }
0180 }
0181 }
0182 }
0183
0184 trackingRecHitsOut.push_back(hit->clone());
0185 }
0186 }
0187 assocfiller.insert(trackExtras, associdxs.begin(), associdxs.end());
0188 }
0189
0190 assocfiller.fill();
0191
0192 if (outputClusters_) {
0193
0194 edmNew::DetSetVector<SiPixelCluster> pixelClustersOut;
0195 edmNew::DetSetVector<SiStripCluster> stripClustersOut;
0196
0197 std::unordered_map<unsigned int, unsigned int> pixelClusterIdxMap;
0198 std::unordered_map<unsigned int, unsigned int> stripClusterIdxMap;
0199
0200
0201
0202 unsigned int iIndex = 0;
0203
0204 for (auto setIter = pixelClusters->begin(), setIterEnd = pixelClusters->end(); setIter != setIterEnd; ++setIter) {
0205
0206 typename edmNew::DetSetVector<SiPixelCluster>::FastFiller ff(pixelClustersOut, setIter->detId());
0207 for (auto iter = setIter->begin(), iterEnd = setIter->end(); iter != iterEnd; ++iter, ++iIndex) {
0208 if (pixelClustersToKeep[iIndex]) {
0209 ff.push_back(*iter);
0210 const unsigned int oIndex = pixelClusterIdxMap.size();
0211 pixelClusterIdxMap[iIndex] = oIndex;
0212 }
0213 }
0214 }
0215
0216 iIndex = 0;
0217 for (auto setIter = stripClusters->begin(), setIterEnd = stripClusters->end(); setIter != setIterEnd; ++setIter) {
0218
0219 typename edmNew::DetSetVector<SiStripCluster>::FastFiller ff(stripClustersOut, setIter->detId());
0220 for (auto iter = setIter->begin(), iterEnd = setIter->end(); iter != iterEnd; ++iter, ++iIndex) {
0221 if (stripClustersToKeep[iIndex]) {
0222 ff.push_back(*iter);
0223 const unsigned int oIndex = stripClusterIdxMap.size();
0224 stripClusterIdxMap[iIndex] = oIndex;
0225 }
0226 }
0227 }
0228
0229 edm::OrphanHandle<edmNew::DetSetVector<SiPixelCluster>> pixelClustersOutH =
0230 event.emplace(pixelClusterOutToken_, std::move(pixelClustersOut));
0231 edm::OrphanHandle<edmNew::DetSetVector<SiStripCluster>> stripClustersOutH =
0232 event.emplace(stripClusterOutToken_, std::move(stripClustersOut));
0233
0234
0235 for (auto& hit : trackingRecHitsOut) {
0236 TrackerSingleRecHit* singleHit = dynamic_cast<TrackerSingleRecHit*>(&hit);
0237 if (singleHit != nullptr) {
0238 SiPixelClusterRef const& pixelRef = singleHit->cluster_pixel();
0239 if (pixelRef.isNonnull() && pixelRef.id() == pixelClusters.id()) {
0240 SiPixelClusterRef const pixelRefOut(pixelClustersOutH, pixelClusterIdxMap.at(pixelRef.key()));
0241 singleHit->setClusterPixelRef(pixelRefOut);
0242 }
0243 SiStripClusterRef const& stripRef = singleHit->cluster_strip();
0244 if (stripRef.isNonnull() && stripRef.id() == stripClusters.id()) {
0245 SiStripClusterRef const stripRefOut(stripClustersOutH, stripClusterIdxMap.at(stripRef.key()));
0246 singleHit->setClusterStripRef(stripRefOut);
0247 }
0248 SiStripMatchedRecHit2D* matched2DHit = dynamic_cast<SiStripMatchedRecHit2D*>(singleHit);
0249 if (matched2DHit != nullptr) {
0250 SiStripClusterRef const& monoRef = matched2DHit->monoClusterRef().cluster_strip();
0251 SiStripClusterRef const& stereoRef = matched2DHit->stereoClusterRef().cluster_strip();
0252 if (monoRef.isNonnull() && monoRef.id() == stripClusters.id()) {
0253 SiStripClusterRef const monoRefOut(stripClustersOutH, stripClusterIdxMap.at(monoRef.key()));
0254 matched2DHit->monoClusterRef() = OmniClusterRef(monoRefOut);
0255 }
0256 if (stereoRef.isNonnull() && stereoRef.id() == stripClusters.id()) {
0257 SiStripClusterRef const stereoRefOut(stripClustersOutH, stripClusterIdxMap.at(stereoRef.key()));
0258 matched2DHit->stereoClusterRef() = OmniClusterRef(stereoRefOut);
0259 }
0260 }
0261 }
0262 }
0263 }
0264
0265 event.emplace(trackExtraOutToken_, std::move(trackExtrasOut));
0266 event.emplace(trackingRecHitsOutToken_, std::move(trackingRecHitsOut));
0267 event.emplace(associationOutToken_, std::move(association));
0268 }