Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-02 05:10:04

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   // nothing to be done yet...
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 (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 // define 'buildRecHit' functions used for different types of recHits
0089 //-------------------------------------------------------------------------------
0090 
0091 template <typename T>
0092 bool TrackerCleaner<T>::match_rechit_type(const TrackingRecHit &murechit) {
0093   assert(0);  // CV: make sure general function never gets called;
0094               //     always use template specializations
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);