CMS 3D CMS Logo

AlCaLowPUHBHEMuonFilter.cc
Go to the documentation of this file.
1 // system include files
2 #include <atomic>
3 #include <memory>
4 #include <cmath>
5 #include <iostream>
6 #include <sstream>
7 #include <fstream>
8 
9 // user include files
21 
28 
31 
36 
37 //#define EDM_ML_DEBUG
38 //
39 // class declaration
40 //
41 
42 namespace AlCaLowPUHBHEMuons {
43  struct Counters {
44  Counters() : nAll_(0), nGood_(0) {}
45  mutable std::atomic<unsigned int> nAll_, nGood_;
46  };
47 } // namespace AlCaLowPUHBHEMuons
48 
49 class AlCaLowPUHBHEMuonFilter : public edm::stream::EDFilter<edm::GlobalCache<AlCaLowPUHBHEMuons::Counters> > {
50 public:
52  ~AlCaLowPUHBHEMuonFilter() override;
53 
54  static std::unique_ptr<AlCaLowPUHBHEMuons::Counters> initializeGlobalCache(edm::ParameterSet const&) {
55  return std::make_unique<AlCaLowPUHBHEMuons::Counters>();
56  }
57 
58  bool filter(edm::Event&, edm::EventSetup const&) override;
59  void endStream() override;
60  static void globalEndJob(const AlCaLowPUHBHEMuons::Counters* counters);
61  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
62 
63 private:
64  void beginRun(edm::Run const&, edm::EventSetup const&) override;
65  void endRun(edm::Run const&, edm::EventSetup const&) override;
66 
67  // ----------member data ---------------------------
69  std::vector<std::string> trigNames_, HLTNames_;
71  bool pfCut_;
72  double trackIsoCut_, caloIsoCut_, pfIsoCut_, minimumMuonpT_, minimumMuoneta_;
73  int preScale_;
74  unsigned int nRun_, nAll_, nGood_;
79 };
80 
81 //
82 // constants, enums and typedefs
83 //
84 
85 //
86 // static data member definitions
87 //
88 
89 //
90 // constructors and destructor
91 //
94  : nRun_(0), nAll_(0), nGood_(0) {
95  //now do what ever initialization is needed
96  trigNames_ = iConfig.getParameter<std::vector<std::string> >("triggers");
97  processName_ = iConfig.getParameter<std::string>("processName");
98  triggerResults_ = iConfig.getParameter<edm::InputTag>("triggerResultLabel");
99  labelMuon_ = iConfig.getParameter<edm::InputTag>("muonLabel");
100  pfIsoCut_ = iConfig.getParameter<double>("pfIsolationCut");
101  minimumMuonpT_ = iConfig.getParameter<double>("minimumMuonpT");
102  minimumMuoneta_ = iConfig.getParameter<double>("minimumMuoneta");
103  // define tokens for access
104  tok_trigRes_ = consumes<edm::TriggerResults>(triggerResults_);
105  tok_Muon_ = consumes<reco::MuonCollection>(labelMuon_);
106  edm::LogInfo("LowPUHBHEMuon") << "Parameters read from config file \n"
107  << "Process " << processName_ << " PF Isolation Cuts " << pfIsoCut_
108  << " minimum Muon pT cut " << minimumMuonpT_ << " minimum Muon eta cut "
109  << minimumMuoneta_;
110  for (unsigned int k = 0; k < trigNames_.size(); ++k)
111  edm::LogInfo("LowPUHBHEMuon") << "Trigger[" << k << "] " << trigNames_[k];
112 } // AlCaLowPUHBHEMuonFilter::AlCaLowPUHBHEMuonFilter constructor
113 
115 
116 //
117 // member functions
118 //
119 
120 // ------------ method called on each new Event ------------
122  bool accept(false);
123  ++nAll_;
124 #ifdef EDM_ML_DEBUG
125  edm::LogInfo("LowPUHBHEMuon") << "AlCaLowPUHBHEMuonFilter::Run " << iEvent.id().run() << " Event "
126  << iEvent.id().event() << " Luminosity " << iEvent.luminosityBlock() << " Bunch "
127  << iEvent.bunchCrossing();
128 #endif
129  //Step1: Find if the event passes one of the chosen triggers
132  iEvent.getByToken(tok_trigRes_, triggerResults);
133  if (triggerResults.isValid()) {
134  bool ok(false);
135  std::vector<std::string> modules;
136  const edm::TriggerNames& triggerNames = iEvent.triggerNames(*triggerResults);
137  const std::vector<std::string>& triggerNames_ = triggerNames.triggerNames();
138  for (unsigned int iHLT = 0; iHLT < triggerResults->size(); iHLT++) {
139  int hlt = triggerResults->accept(iHLT);
140  //std::cout << "trigger names: "<<iHLT<<" "<<triggerNames_[iHLT]<<std::endl;
141  for (auto const& trigName : trigNames_) {
142  if (triggerNames_[iHLT].find(trigName) != std::string::npos) {
143  //std::cout << "find trigger names: "<<trigName <<std::endl;
144  if (hlt > 0)
145  ok = true;
146 #ifdef EDM_ML_DEBUG
147  edm::LogInfo("LowPUHBHEMuon") << "AlCaLowPUHBHEMuonFilter::Trigger " << triggerNames_[iHLT] << " Flag " << hlt
148  << ":" << ok;
149 #endif
150  }
151  }
152  }
153  if (ok) {
154  //Step2: Get geometry/B-field information
155  //Get magnetic field
157  iSetup.get<IdealMagneticFieldRecord>().get(bFieldH);
158  const MagneticField* bField = bFieldH.product();
159  // get handles to calogeometry
161  iSetup.get<CaloGeometryRecord>().get(pG);
162  const CaloGeometry* geo = pG.product();
163 
164  // Relevant blocks from iEvent
166  iEvent.getByToken(tok_Muon_, _Muon);
167 #ifdef EDM_ML_DEBUG
168  edm::LogInfo("LowPUHBHEMuon") << "AlCaLowPUHBHEMuonFilter::Muon Handle " << _Muon.isValid();
169 #endif
170  if (_Muon.isValid()) {
171  for (reco::MuonCollection::const_iterator RecMuon = _Muon->begin(); RecMuon != _Muon->end(); ++RecMuon) {
172 #ifdef EDM_ML_DEBUG
173  edm::LogInfo("LowPUHBHEMuon") << "AlCaLowPUHBHEMuonFilter::Muon:Track " << RecMuon->track().isNonnull()
174  << " innerTrack " << RecMuon->innerTrack().isNonnull() << " outerTrack "
175  << RecMuon->outerTrack().isNonnull() << " globalTrack "
176  << RecMuon->globalTrack().isNonnull();
177 #endif
178  if ((RecMuon->pt() < minimumMuonpT_) || fabs(RecMuon->eta() < minimumMuoneta_))
179  continue;
180  if ((RecMuon->track().isNonnull()) && (RecMuon->innerTrack().isNonnull()) &&
181  (RecMuon->outerTrack().isNonnull()) && (RecMuon->globalTrack().isNonnull())) {
182  const reco::Track* pTrack = (RecMuon->innerTrack()).get();
183  spr::propagatedTrackID trackID = spr::propagateCALO(pTrack, geo, bField, false);
184 #ifdef EDM_ML_DEBUG
185  edm::LogInfo("LowPUHBHEMuon")
186  << "AlCaLowPUHBHEMuonFilter::Propagate: ECAL " << trackID.okECAL << " to HCAL " << trackID.okHCAL;
187 #endif
188  double isolR04 =
189  ((RecMuon->pfIsolationR04().sumChargedHadronPt +
190  std::max(0.,
191  RecMuon->pfIsolationR04().sumNeutralHadronEt + RecMuon->pfIsolationR04().sumPhotonEt -
192  (0.5 * RecMuon->pfIsolationR04().sumPUPt))) /
193  RecMuon->pt());
194  bool isoCut = (isolR04 < pfIsoCut_);
195  if ((trackID.okECAL) && (trackID.okHCAL) && isoCut) {
196  accept = true;
197  break;
198  }
199  }
200  }
201  }
202  }
203  }
204  // Step 4: Return the acceptance flag
205  if (accept) {
206  ++nGood_;
207  }
208  return accept;
209 
210 } // AlCaLowPUHBHEMuonFilter::filter
211 
212 // ------------ method called once each job just after ending the event loop ------------
214  globalCache()->nAll_ += nAll_;
215  globalCache()->nGood_ += nGood_;
216 }
217 
219  edm::LogInfo("LowPUHBHEMuon") << "Selects " << count->nGood_ << " good events out of " << count->nAll_
220  << " total # of events";
221 }
222 
223 // ------------ method called when starting to processes a run ------------
225  bool changed(false);
226  bool flag = hltConfig_.init(iRun, iSetup, processName_, changed);
227  edm::LogInfo("LowPUHBHEMuon") << "Run[" << nRun_ << "] " << iRun.run() << " hltconfig.init " << flag;
228 }
229 
230 // ------------ method called when ending the processing of a run ------------
232  edm::LogInfo("LowPUHBHEMuon") << "endRun[" << nRun_ << "] " << iRun.run();
233  nRun_++;
234 }
235 
236 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
239  std::vector<std::string> triggers = {"HLT_L1DoubleMu", "HLT_L1SingleMu"};
240  desc.add<std::string>("processName", "HLT");
241  desc.add<edm::InputTag>("triggerResultLabel", edm::InputTag("TriggerResults", "", "HLT"));
242  desc.add<edm::InputTag>("muonLabel", edm::InputTag("muons"));
243  desc.add<double>("minimumMuonpT", 10.0);
244  desc.add<double>("minimumMuoneta", 1.305);
245  desc.add<std::vector<std::string> >("triggers", triggers);
246  desc.add<double>("pfIsolationCut", 0.15);
247  descriptions.add("alcaLowPUHBHEMuonFilter", desc);
248 }
249 
250 //define this as a plug-in
RunNumber_t run() const
Definition: EventID.h:39
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
std::vector< spr::propagatedTrackID > propagateCALO(edm::Handle< reco::TrackCollection > &trkCollection, const CaloGeometry *geo, const MagneticField *bField, const std::string &theTrackQuality, bool debug=false)
RunNumber_t run() const
Definition: RunBase.h:40
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
bool filter(edm::Event &, edm::EventSetup const &) override
bool accept() const
Has at least one path accepted the event?
int bunchCrossing() const
Definition: EventBase.h:64
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:61
edm::EDGetTokenT< edm::TriggerResults > tok_trigRes_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
void beginRun(edm::Run const &, edm::EventSetup const &) override
Strings const & triggerNames() const
Definition: TriggerNames.cc:20
AlCaLowPUHBHEMuonFilter(edm::ParameterSet const &, const AlCaLowPUHBHEMuons::Counters *count)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static void globalEndJob(const AlCaLowPUHBHEMuons::Counters *counters)
unsigned int size() const
Get number of paths stored.
std::vector< std::string > trigNames_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
static std::string const triggerResults
Definition: EdmProvDump.cc:45
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:74
int k[5][pyjets_maxn]
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
static std::unique_ptr< AlCaLowPUHBHEMuons::Counters > initializeGlobalCache(edm::ParameterSet const &)
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
std::atomic< unsigned int > nAll_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::EDGetTokenT< trigger::TriggerEvent > tok_trigEvt
edm::EventID id() const
Definition: EventBase.h:59
T get() const
Definition: EventSetup.h:71
std::atomic< unsigned int > nGood_
T const * product() const
Definition: ESHandle.h:86
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:256
Definition: Run.h:45
edm::EDGetTokenT< reco::MuonCollection > tok_Muon_
void endRun(edm::Run const &, edm::EventSetup const &) override