CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
UEDMultiLeptonFilter.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: UEDMultiLeptonFilter
4 // Class: UEDMultiLeptonFilter
5 //
13 //
14 // Original Author:
15 // Created: Sat Jul 10 10:32:40 BRT 2010
16 //
17 //
18 
19 
20 // system include files
21 #include <memory>
22 
23 // user include files
26 
29 
32 
33 #include <HepMC/GenEvent.h>
34 #include <HepMC/GenParticle.h>
35 
37 
38 //#include "SimDataFormats/HepMCProduct/interface/HepMCProduct.h"
39 
40 #include "TH1D.h"
41 #include "TFile.h"
42 
43 #include <map>
44 
45 //
46 // class declaration
47 //
48 
50  public:
51  explicit UEDMultiLeptonFilter(const edm::ParameterSet&);
53 
54  private:
55  virtual void beginJob() override ;
56  virtual bool filter(edm::Event&, const edm::EventSetup&) override;
57  virtual void endJob() override ;
58  bool isLepton(HepMC::GenVertex::particles_out_const_iterator part);
59  bool isLeptonPlus(HepMC::GenVertex::particles_out_const_iterator part);
60  bool isLeptonMinus(HepMC::GenVertex::particles_out_const_iterator part);
61  void nLeptons(const std::vector<int>&, int& e,int& mu);
62  void AllVetoedOff(bool inclusive_message);
63  bool AcceptEvent();
64  // ----------member data ---------------------------
65 
66  int UseFilter;
67 
70 
73 
76 
79 
84 
88 
91 
93 
95  int nDimumu;
96  int nDiee;
97  int nDiemu;
98 
100  int nSSmumu;
101  int nSSee;
102  int nSSemu;
103 
105  int nTri3mu;
108  int nTri3e;
110  int nFour4mu;
111  int nFour4e;
113 };
114 
115 //
116 // constants, enums and typedefs
117 //
118 
119 //
120 // static data member definitions
121 //
122 
123 //
124 // constructors and destructor
125 //
127 UseFilter(iConfig.getUntrackedParameter("UseFilter",0)),
128 SSDiMuFilter(iConfig.getUntrackedParameter("SSDiMuFilter",0)),
129 SSDiMuVetoedFilter(iConfig.getUntrackedParameter("SSDiMuVetoedFilter",0)),
130 SSDiEFilter(iConfig.getUntrackedParameter("SSDiEFilter",0)),
131 SSDiEVetoedFilter(iConfig.getUntrackedParameter("SSDiEVetoedFilter",0)),
132 SSDiEMuFilter(iConfig.getUntrackedParameter("SSDiEMuFilter",0)),
133 SSDiEMuVetoedFilter(iConfig.getUntrackedParameter("SSDiEMuVetoedFilter",0)),
134 SSDiLepFilter(iConfig.getUntrackedParameter("SSDiLepFilter",0)),
135 SSDiLepVetoedFilter(iConfig.getUntrackedParameter("SSDiLepVetoedFilter",0)),
136 Vetoed3muFilter(iConfig.getUntrackedParameter("Vetoed3muFilter",0)),
137 Vetoed2mu1eFilter(iConfig.getUntrackedParameter("Vetoed2mu1eFilter",0)),
138 Vetoed1mu2eFilter(iConfig.getUntrackedParameter("Vetoed1mu2eFilter",0)),
139 Vetoed3eFilter(iConfig.getUntrackedParameter("Vetoed3eFilter",0)),
140 Vetoed4muFilter(iConfig.getUntrackedParameter("Vetoed4muFilter",0)),
141 Vetoed2mu2eFilter(iConfig.getUntrackedParameter("Vetoed2mu2eFilter",0)),
142 Vetoed4eFilter(iConfig.getUntrackedParameter("Vetoed4eFilter",0))
143 {
144  //now do what ever initialization is needed
145 
146  if(UseFilter==0){//std::cout << "************ No Filter ************" << std::endl;
147  }else{
148 // std::cout <<"Filters On" << std::endl;
150 // std::cout << "Bad configuration: more than one non-vetoed filter is On" << std::endl;
151 // std::cout << "You should use only one inclusive filter" << std::endl;
152 // std::cout << "All events will pass: UseFilter=0"<< std::endl;
153  UseFilter=0;
154  }
155  }
156 
157  if(UseFilter==1){
158  if(SSDiLepFilter==1){
159 // std::cout << "SSDiLepFilter: On " << std::endl;
160  //To avoid multiple counting
161  AllVetoedOff(true);
162  }
163  if(SSDiLepVetoedFilter==1){
167  }
168  if(SSDiMuFilter==1){
169 // std::cout <<"SSDiMuFilter: On" << std::endl;
170  AllVetoedOff(true);
172  Vetoed3muFilter=1;
173  Vetoed4muFilter=1;
174  }
175  if(SSDiEFilter==1){
176 // std::cout <<"SSDiEFilter: On" << std::endl;
177  AllVetoedOff(true);
179  Vetoed3eFilter=1;
180  Vetoed4eFilter=1;
181  }
182  if(SSDiEMuFilter==1){
183 // std::cout <<"SSDiEMuFilter: On" << std::endl;
184  AllVetoedOff(true);
189  }
190  }
191 
192 
193  nFilteredEvents = 0;
194  nProcessed = 0;
195 
196  nDileptons = 0;
197 
198  nDimumu = 0;
199  nDiee = 0;
200  nDiemu = 0;
201 
202  nSSdileptons = 0;
203 
204  nSSmumu = 0;
205  nSSee = 0;
206  nSSemu = 0;
207 
208  nTrileptons = 0;
209 
210  nTri3mu = 0;
211  nTri2mu1e = 0;
212  nTri1mu2e = 0;
213  nTri3e = 0;
214 
215  nFourleptons = 0;
216 
217  nFour4mu = 0;
218  nFour4e = 0;
219  nFour2mu2e = 0;
220 
221 }
222 
223 void
224 UEDMultiLeptonFilter::AllVetoedOff(bool inclusive_message){
225 
226 // if(inclusive_message)std::cout << "All Vetoed Filters Off" << std::endl;
227 
232 
233  Vetoed3muFilter=0;
236  Vetoed3eFilter=0;
237 
238  Vetoed4muFilter=0;
240  Vetoed4eFilter=0;
241 
242 }
243 
245 {
246 
247  // do anything here that needs to be done at desctruction time
248  // (e.g. close files, deallocate resources etc.)
249 
250 /*
251 
252  std::cout << "nProcessed: " << nProcessed << std::endl;
253  std::cout << "nFilteredEvents: " << nFilteredEvents << std::endl;
254 
255  std::cout << "nDileptons: " << nDileptons << std::endl;
256 
257  std::cout << "nDimumu: " << nDimumu << std::endl;
258  std::cout << "nDiemu: " << nDiemu << std::endl;
259  std::cout << "nDiee: " << nDiee << std::endl;
260 
261 
262  std::cout << "nSSdileptons: " << nSSdileptons << std::endl;
263 
264  std::cout << "nSSmumu: " << nSSmumu << std::endl;
265  std::cout << "nSSemu: " << nSSemu << std::endl;
266  std::cout << "nSSee: " << nSSee << std::endl;
267 
268  std::cout << "nTrileptons: " << nTrileptons << std::endl;
269 
270  std::cout << "nTri3mu: " << nTri3mu << std::endl;
271  std::cout << "nTri2mu1e: " << nTri2mu1e << std::endl;
272  std::cout << "nTri1mu2e: " << nTri1mu2e << std::endl;
273  std::cout << "nTri3e: " << nTri3e <<std::endl;
274 
275  std::cout << "nFourleptons: " << nFourleptons << std::endl;
276  std::cout << "nFour4mu: " << nFour4mu << std::endl;
277  std::cout << "nFour4e: " << nFour4e << std::endl;
278  std::cout << "nFour2mu2e: " << nFour2mu2e << std::endl;
279 
280 */
281 
282 }
283 
284 
285 //
286 // member functions
287 //
288 
289 // ------------ method called on each new Event ------------
290 bool
292 {
293 
294  using namespace edm;
295 
296  std::map<std::string, int> accept;
297 
298 // std::cout << "===================== New event ========================: " << nFilteredEvents << std::endl;
299 
300  nProcessed++;
301  if(UseFilter==0){
302  nFilteredEvents++;
303  //std::cout << "Event accepted" << std::endl;
304  return true;
305  }
306  std::vector<int> leptonIDminus;
307  std::vector<int> leptonIDplus;
308 
309  Handle<HepMCProduct> mcEventHandle;
310 
311  iEvent.getByLabel("generator","unsmeared",mcEventHandle);
312 
313  const HepMC::GenEvent* mcEvent = mcEventHandle->GetEvent() ;
314 
315  HepMC::GenEvent::particle_const_iterator i;
316  for(i = mcEvent->particles_begin(); i!= mcEvent->particles_end(); i++){
317 
318  bool D_part = (fabs((*i)->pdg_id())-5100000>0 && fabs((*i)->pdg_id())-5100000<40);
319  bool S_part = (fabs((*i)->pdg_id())-6100000>0 && fabs((*i)->pdg_id())-6100000<40 );
320  if(D_part || S_part){
321 
322  //debug std::cout << "UED particle ID: " << (*i)->pdg_id() << " status: "<< (*i)->status()<< std::endl;
323  HepMC::GenVertex* vertex = (*i)->end_vertex();
324  if(vertex!=0){
325  for(HepMC::GenVertex::particles_out_const_iterator part = vertex->particles_out_const_begin();
326  part != vertex->particles_out_const_end(); part++ ){
327  //debug std::cout << " Outgoing particle id :"<< (*part)->pdg_id() << " status: " << (*part)->status() << std::endl;
328  if(isLepton(part)){
329  if((*part)->status()==1){//debug std::cout << "Final State Lepton " << std::endl;
330  }
331  HepMC::GenVertex* lepton_vertex = (*part)->end_vertex();
332  if(lepton_vertex!=0){
333  for(HepMC::GenVertex::particles_out_const_iterator lepton_part = lepton_vertex->particles_out_const_begin();
334  lepton_part != lepton_vertex->particles_out_const_end(); lepton_part++ ){
335  //debug std::cout << " Part Id: "<< (*lepton_part)->pdg_id() << " status: "<< (*lepton_part)->status()<< std::endl;
336  if((*part)->pdg_id() == (*lepton_part)->pdg_id()){//debug std::cout << " Part pt: " << (*part)->momentum().perp() << " mu 1: " << (*lepton_part)->momentum().perp() << std::endl;
337  }
338  //std::cout << " Part px: " << (*part)->momentum().px() << " end_vtx px: " << (*mu_part)->momentum().px() << std::endl;
339  if((*part)->pdg_id() == (*lepton_part)->pdg_id() && (*lepton_part)->status()==1){
340  if(isLeptonPlus(lepton_part))leptonIDplus.push_back((*lepton_part)->pdg_id());
341  if(isLeptonMinus(lepton_part))leptonIDminus.push_back((*lepton_part)->pdg_id());
342  }
343  }
344  }
345  }
346  }
347  }
348  }
349  }
350 
351  if((leptonIDplus.size()==1 && leptonIDminus.size()==1) || (leptonIDplus.size()==1 && leptonIDminus.size()==1)){
352  //Opposite sign only
353  nDileptons++;
354  int e=0;
355  int mu=0;
356 
357  nLeptons(leptonIDplus,e,mu);
358  nLeptons(leptonIDminus,e,mu);
359  if(mu==2 && e==0)nDimumu++;
360  if(mu==1 && e==1)nDiemu++;
361  if(mu==0 && e==2)nDiee++;
362 
363  }
364 
365 
366  if(leptonIDplus.size()>1 || leptonIDminus.size()>1){
367 // std::cout << "SS dilepton" << std::endl;
368  //Check dimuon inclusive filter
369  nSSdileptons++;
370  if(SSDiLepFilter==1)return AcceptEvent();
371  //Vetoed decays
372  if((leptonIDplus.size()==2 && leptonIDminus.size()==0) || (leptonIDplus.size()==0 && leptonIDminus.size()==2)){
373 
374  int e=0;
375  int mu=0;
376 
377  nLeptons(leptonIDplus,e,mu);
378  if(mu==2 && e==0){
379  nSSmumu++;
380  if(SSDiMuVetoedFilter==1)return AcceptEvent();
381  }
382  if(mu==1 && e==1){
383  nSSemu++;
384  if(SSDiEMuVetoedFilter==1)return AcceptEvent();
385  }
386  if(mu==0 && e==2){
387  nSSee++;
388  if(SSDiEVetoedFilter==1)return AcceptEvent();
389  }
390 
391  e=0;
392  mu=0;
393 
394  nLeptons(leptonIDminus,e,mu);
395  if(mu==2 && e==0){
396  nSSmumu++;
397  if(SSDiMuVetoedFilter==1)return AcceptEvent();
398  }
399  if(mu==1 && e==1){
400  nSSemu++;
401  if(SSDiEMuVetoedFilter==1)return AcceptEvent();
402  }
403  if(mu==0 && e==2){
404  nSSee++;
405  if(SSDiEVetoedFilter==1)return AcceptEvent();
406  }
407  }
408 
409  }
410 
411  if(leptonIDplus.size()+leptonIDminus.size()==4){
412 // std::cout << "Four lepton" << std::endl;
413  nFourleptons++;
414  int e=0;
415  int mu=0;
416  nLeptons(leptonIDplus,e,mu);
417  nLeptons(leptonIDminus,e,mu);
418  if(mu==4 && e==0){
419  nFour4mu++;
420  if(Vetoed4muFilter==1)return AcceptEvent();
421  }
422  if(mu==2 && e==2){
423  nFour2mu2e++;
424  if(Vetoed2mu2eFilter==1)return AcceptEvent();
425  }
426  if(mu==0 && e==4){
427  nFour4e++;
428  if(Vetoed4eFilter==1)return AcceptEvent();
429  }
430 
431  }
432  if(leptonIDplus.size()+leptonIDminus.size()==3){
433 // std::cout << "Three lepton " << std::endl;
434  nTrileptons++;
435  int e=0;
436  int mu=0;
437  nLeptons(leptonIDplus,e,mu);
438  nLeptons(leptonIDminus,e,mu);
439  if(mu==3 && e==0){
440  nTri3mu++;
441  if(Vetoed3muFilter==1)return AcceptEvent();
442  }
443  if(mu==2 && e==1){
444  nTri2mu1e++;
445  if(Vetoed2mu1eFilter==1)return AcceptEvent();
446  }
447  if(mu==1 && e==2){
448  nTri1mu2e++;
449  if(Vetoed1mu2eFilter==1)return AcceptEvent();
450  }
451  if(mu==0 && e==3){
452  nTri3e++;
453  if(Vetoed3eFilter==1)return AcceptEvent();
454  }
455  }
456 
457 
458 
459 
460 #ifdef THIS_IS_AN_EVENT_EXAMPLE
462  iEvent.getByLabel("example",pIn);
463 #endif
464 
465 #ifdef THIS_IS_AN_EVENTSETUP_EXAMPLE
466  ESHandle<SetupData> pSetup;
467  iSetup.get<SetupRecord>().get(pSetup);
468 #endif
469  return false;
470 }
471 
472 // ------------ method called once each job just before starting event loop ------------
473 void
475 {
476 }
477 
478 // ------------ method called once each job just after ending the event loop ------------
479 void
481 }
482 
483 bool
484 UEDMultiLeptonFilter::isLepton(HepMC::GenVertex::particles_out_const_iterator part){
485 
486  return (fabs((*part)->pdg_id())==13 || fabs((*part)->pdg_id())==11);
487 
488 }
489 
490 bool
491 UEDMultiLeptonFilter::isLeptonPlus(HepMC::GenVertex::particles_out_const_iterator part){
492  return ((*part)->pdg_id()==-13 || (*part)->pdg_id()==-11);
493 }
494 
495 bool
496 UEDMultiLeptonFilter::isLeptonMinus(HepMC::GenVertex::particles_out_const_iterator part){
497  return ((*part)->pdg_id()==13 || (*part)->pdg_id()==11);
498 }
499 
500 void
501 UEDMultiLeptonFilter::nLeptons(const std::vector<int>& leptons_id, int& e,int& mu){
502  int nentries = (int)leptons_id.size();
503  for(int i=0; i<nentries; i++){
504  if(abs(leptons_id.at(i))==11)e++;
505  if(abs(leptons_id.at(i))==13)mu++;
506  }
507 
508 // std::cout <<"mu "<< mu << std::endl;
509 // std::cout <<"e "<< e <<std::endl;
510 }
511 
512 bool
514  nFilteredEvents++;
515 // std::cout << "Event accepted" << std::endl;
516  return true;
517 }
518 //define this as a plug-in
bool isLepton(HepMC::GenVertex::particles_out_const_iterator part)
int i
Definition: DBlmapReader.cc:9
void nLeptons(const std::vector< int > &, int &e, int &mu)
bool isLeptonPlus(HepMC::GenVertex::particles_out_const_iterator part)
UEDMultiLeptonFilter(const edm::ParameterSet &)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
virtual bool filter(edm::Event &, const edm::EventSetup &) override
bool isLeptonMinus(HepMC::GenVertex::particles_out_const_iterator part)
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:24
int iEvent
Definition: GenABIO.cc:230
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual void endJob() override
const int mu
Definition: Constants.h:22
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:420
void AllVetoedOff(bool inclusive_message)
part
Definition: HCALResponse.h:20
const T & get() const
Definition: EventSetup.h:56
virtual void beginJob() override