Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:30:47

0001 #include "FWCore/Framework/interface/MakerMacros.h"
0002 #include "FWCore/Framework/interface/stream/EDFilter.h"
0003 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
0004 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
0005 
0006 class SimMuFilter : public edm::stream::EDFilter<> {
0007 public:
0008   explicit SimMuFilter(const edm::ParameterSet &);
0009   ~SimMuFilter() override;
0010 
0011 private:
0012   virtual void beginJob();
0013   virtual void endJob();
0014   bool filter(edm::Event &, const edm::EventSetup &) override;
0015 
0016 private:
0017   edm::EDGetTokenT<std::vector<SimTrack>> simTracksToken_;
0018   edm::EDGetTokenT<edm::PSimHitContainer> simHitsMuonRPCToken_;
0019   edm::EDGetTokenT<edm::PSimHitContainer> simHitsMuonCSCToken_;
0020   edm::EDGetTokenT<edm::PSimHitContainer> simHitsMuonDTToken_;
0021 
0022   edm::Handle<std::vector<SimTrack>> simTracksHandle;
0023   edm::Handle<edm::PSimHitContainer> simHitsMuonRPCHandle;
0024   edm::Handle<edm::PSimHitContainer> simHitsMuonCSCHandle;
0025   edm::Handle<edm::PSimHitContainer> simHitsMuonDTHandle;
0026 
0027   int nMuSel_;
0028 };
0029 
0030 SimMuFilter::SimMuFilter(const edm::ParameterSet &iConfig) {
0031   simTracksToken_ = consumes<std::vector<SimTrack>>(iConfig.getParameter<edm::InputTag>("simTracksInput"));
0032   simHitsMuonRPCToken_ = consumes<edm::PSimHitContainer>(iConfig.getParameter<edm::InputTag>("simHitsMuonRPCInput"));
0033   simHitsMuonCSCToken_ = consumes<edm::PSimHitContainer>(iConfig.getParameter<edm::InputTag>("simHitsMuonCSCInput"));
0034   simHitsMuonDTToken_ = consumes<edm::PSimHitContainer>(iConfig.getParameter<edm::InputTag>("simHitsMuonDTInput"));
0035   nMuSel_ = iConfig.getParameter<int>("nMuSel");
0036 }
0037 
0038 SimMuFilter::~SimMuFilter() {}
0039 
0040 bool SimMuFilter::filter(edm::Event &iEvent, const edm::EventSetup &iSetup) {
0041   using namespace edm;
0042 
0043   iEvent.getByToken(simTracksToken_, simTracksHandle);
0044   iEvent.getByToken(simHitsMuonRPCToken_, simHitsMuonRPCHandle);
0045   iEvent.getByToken(simHitsMuonCSCToken_, simHitsMuonCSCHandle);
0046   iEvent.getByToken(simHitsMuonDTToken_, simHitsMuonDTHandle);
0047 
0048   const std::vector<SimTrack> &simTracks = *simTracksHandle.product();
0049 
0050   int nTracks = simTracks.size();
0051 
0052   int nPass = 0;
0053 
0054   for (int it = 0; it < nTracks; it++) {
0055     SimTrack simTrk = simTracks[it];
0056 
0057     int pdgId = simTrk.type();
0058     float pt = simTrk.momentum().pt();
0059 
0060     if (abs(pdgId) != 13)
0061       continue;
0062     if (pt < 3.)
0063       continue;
0064 
0065     int nSimHitRPC = 0;
0066     int nSimHitCSC = 0;
0067     int nSimHitDT = 0;
0068 
0069     for (PSimHitContainer::const_iterator simHitIt = simHitsMuonRPCHandle->begin();
0070          simHitIt != simHitsMuonRPCHandle->end();
0071          simHitIt++) {
0072       if (simHitIt->trackId() != simTrk.trackId())
0073         continue;
0074 
0075       nSimHitRPC++;
0076     }
0077 
0078     for (PSimHitContainer::const_iterator simHitIt = simHitsMuonCSCHandle->begin();
0079          simHitIt != simHitsMuonCSCHandle->end();
0080          simHitIt++) {
0081       if (simHitIt->trackId() != simTrk.trackId())
0082         continue;
0083 
0084       nSimHitCSC++;
0085     }
0086 
0087     for (PSimHitContainer::const_iterator simHitIt = simHitsMuonDTHandle->begin();
0088          simHitIt != simHitsMuonDTHandle->end();
0089          simHitIt++) {
0090       if (simHitIt->trackId() != simTrk.trackId())
0091         continue;
0092 
0093       nSimHitDT++;
0094     }
0095 
0096     if (nSimHitRPC + nSimHitCSC + nSimHitDT > 0)
0097       nPass++;
0098   }
0099 
0100   return (nPass >= nMuSel_);
0101 }
0102 
0103 void SimMuFilter::beginJob() {}
0104 
0105 void SimMuFilter::endJob() {}
0106 
0107 // define this as a plug-in
0108 DEFINE_FWK_MODULE(SimMuFilter);