File indexing completed on 2023-03-17 11:25:26
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
0108 DEFINE_FWK_MODULE(SimMuFilter);