File indexing completed on 2024-12-20 03:14:17
0001 #include "TauAnalysis/MCEmbeddingTools/plugins/TrackerCleaner.h"
0002
0003 #include "DataFormats/TrackerRecHit2D/interface/ProjectedSiStripRecHit2D.h"
0004 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h"
0005 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit1D.h"
0006 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
0007
0008 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0009 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHit.h"
0010
0011 typedef TrackerCleaner<SiPixelCluster> PixelColCleaner;
0012 typedef TrackerCleaner<SiStripCluster> StripColCleaner;
0013
0014 template <typename T>
0015 TrackerCleaner<T>::TrackerCleaner(const edm::ParameterSet &iConfig)
0016 : mu_input_(consumes<edm::View<pat::Muon>>(iConfig.getParameter<edm::InputTag>("MuonCollection")))
0017
0018 {
0019 std::vector<edm::InputTag> inCollections = iConfig.getParameter<std::vector<edm::InputTag>>("oldCollection");
0020 for (const auto &inCollection : inCollections) {
0021 inputs_[inCollection.instance()] = consumes<TrackClusterCollection>(inCollection);
0022 produces<TrackClusterCollection>(inCollection.instance());
0023 }
0024 }
0025
0026 template <typename T>
0027 TrackerCleaner<T>::~TrackerCleaner() {
0028
0029 }
0030
0031 template <typename T>
0032 void TrackerCleaner<T>::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) {
0033 using namespace edm;
0034
0035 edm::Handle<edm::View<pat::Muon>> muonHandle;
0036 iEvent.getByToken(mu_input_, muonHandle);
0037 edm::View<pat::Muon> muons = *muonHandle;
0038
0039 for (const auto &input_ : inputs_) {
0040 edm::Handle<TrackClusterCollection> inputClusters;
0041 iEvent.getByToken(input_.second, inputClusters);
0042
0043 std::vector<bool> vetodClusters;
0044
0045 vetodClusters.resize(inputClusters->dataSize(), false);
0046
0047 for (edm::View<pat::Muon>::const_iterator iMuon = muons.begin(); iMuon != muons.end(); ++iMuon) {
0048 if (!iMuon->isGlobalMuon())
0049 continue;
0050 const reco::Track *mutrack = iMuon->globalTrack().get();
0051 for (trackingRecHit_iterator hitIt = mutrack->recHitsBegin(); hitIt != mutrack->recHitsEnd(); ++hitIt) {
0052 const TrackingRecHit &murechit = **hitIt;
0053 if (!(murechit).isValid())
0054 continue;
0055
0056 if (match_rechit_type(murechit)) {
0057 auto &thit = reinterpret_cast<BaseTrackerRecHit const &>(murechit);
0058 auto const &cluster = thit.firstClusterRef();
0059 vetodClusters[cluster.key()] = true;
0060 }
0061 auto &thit = reinterpret_cast<BaseTrackerRecHit const &>(murechit);
0062 if (trackerHitRTTI::isMatched(thit)) {
0063 vetodClusters[reinterpret_cast<SiStripMatchedRecHit2D const &>(murechit).stereoClusterRef().key()] = true;
0064 }
0065 }
0066 }
0067 std::unique_ptr<TrackClusterCollection> output(new TrackClusterCollection());
0068
0069 int idx = 0;
0070 for (typename TrackClusterCollection::const_iterator clustSet = inputClusters->begin();
0071 clustSet != inputClusters->end();
0072 ++clustSet) {
0073 DetId detIdObject(clustSet->detId());
0074 typename TrackClusterCollection::FastFiller spc(*output, detIdObject);
0075 for (typename edmNew::DetSet<T>::const_iterator clustIt = clustSet->begin(); clustIt != clustSet->end();
0076 ++clustIt) {
0077 idx++;
0078 if (vetodClusters[idx - 1])
0079 continue;
0080 spc.push_back(*clustIt);
0081 }
0082 }
0083 iEvent.put(std::move(output), input_.first);
0084 }
0085 }
0086
0087
0088
0089
0090
0091 template <typename T>
0092 bool TrackerCleaner<T>::match_rechit_type(const TrackingRecHit &murechit) {
0093 assert(0);
0094
0095 return false;
0096 }
0097
0098 template <>
0099 bool TrackerCleaner<SiStripCluster>::match_rechit_type(const TrackingRecHit &murechit) {
0100 const std::type_info &hit_type = typeid(murechit);
0101 if (hit_type == typeid(SiStripRecHit2D))
0102 return true;
0103 else if (hit_type == typeid(SiStripRecHit1D))
0104 return true;
0105 else if (hit_type == typeid(SiStripMatchedRecHit2D))
0106 return true;
0107 else if (hit_type == typeid(ProjectedSiStripRecHit2D))
0108 return true;
0109
0110 return false;
0111 }
0112
0113 template <>
0114 bool TrackerCleaner<SiPixelCluster>::match_rechit_type(const TrackingRecHit &murechit) {
0115 const std::type_info &hit_type = typeid(murechit);
0116 if (hit_type == typeid(SiPixelRecHit))
0117 return true;
0118
0119 return false;
0120 }
0121
0122 DEFINE_FWK_MODULE(PixelColCleaner);
0123 DEFINE_FWK_MODULE(StripColCleaner);