/ElectroWeakAnalysis/ZMuMu/plugins/ZMuMu_efficiencyAnalyzer.cc

https://github.com/aivanov-cern/cmssw · C++ · 748 lines · 603 code · 92 blank · 53 comment · 199 complexity · 6f0e80ffb8853dab62778ac98ba06ef8 MD5 · raw file

  1. /* \class ZMuMu_efficieyAnalyzer
  2. *
  3. * author: Davide Piccolo
  4. *
  5. * ZMuMu efficiency analyzer:
  6. * check muon reco efficiencies from MC truth,
  7. *
  8. */
  9. #include "DataFormats/Common/interface/AssociationVector.h"
  10. #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
  11. #include "DataFormats/Candidate/interface/CandMatchMap.h"
  12. #include "FWCore/Framework/interface/EDAnalyzer.h"
  13. #include "DataFormats/Candidate/interface/Particle.h"
  14. #include "DataFormats/Candidate/interface/Candidate.h"
  15. #include "DataFormats/Candidate/interface/CandidateFwd.h"
  16. #include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
  17. #include "DataFormats/MuonReco/interface/Muon.h"
  18. #include "FWCore/ParameterSet/interface/ParameterSet.h"
  19. #include "FWCore/Framework/interface/Event.h"
  20. #include "FWCore/Framework/interface/EventSetup.h"
  21. #include "FWCore/Utilities/interface/InputTag.h"
  22. #include "DataFormats/Candidate/interface/OverlapChecker.h"
  23. #include "DataFormats/Math/interface/deltaR.h"
  24. #include "DataFormats/PatCandidates/interface/Muon.h"
  25. #include "DataFormats/PatCandidates/interface/GenericParticle.h"
  26. #include "DataFormats/PatCandidates/interface/TriggerObjectStandAlone.h"
  27. #include "DataFormats/Common/interface/AssociationVector.h"
  28. #include "DataFormats/PatCandidates/interface/PATObject.h"
  29. #include "TH1.h"
  30. #include "TH2.h"
  31. #include "TH3.h"
  32. #include <vector>
  33. using namespace edm;
  34. using namespace std;
  35. using namespace reco;
  36. class ZMuMu_efficiencyAnalyzer : public edm::EDAnalyzer {
  37. public:
  38. ZMuMu_efficiencyAnalyzer(const edm::ParameterSet& pset);
  39. private:
  40. virtual void analyze(const edm::Event& event, const edm::EventSetup& setup) override;
  41. bool check_ifZmumu(const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  42. float getParticlePt(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  43. float getParticleEta(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  44. float getParticlePhi(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  45. Particle::LorentzVector getParticleP4(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  46. virtual void endJob() override;
  47. edm::InputTag zMuMu_, zMuMuMatchMap_;
  48. edm::InputTag zMuStandAlone_, zMuStandAloneMatchMap_;
  49. edm::InputTag zMuTrack_, zMuTrackMatchMap_;
  50. edm::InputTag muons_, muonMatchMap_, muonIso_;
  51. edm::InputTag tracks_, trackIso_;
  52. edm::InputTag genParticles_, primaryVertices_;
  53. bool bothMuons_;
  54. double etamax_, ptmin_, massMin_, massMax_, isoMax_;
  55. // binning of entries array (at moment defined by hand and not in cfg file)
  56. unsigned int etaBins;
  57. unsigned int ptBins;
  58. double etaRange[7];
  59. double ptRange[5];
  60. reco::CandidateBaseRef globalMuonCandRef_, trackMuonCandRef_, standAloneMuonCandRef_;
  61. OverlapChecker overlap_;
  62. // general histograms
  63. TH1D *h_zmm_mass, *h_zmm2HLT_mass;
  64. TH1D *h_zmm1HLTplus_mass, *h_zmmNotIsoplus_mass, *h_zmsplus_mass, *h_zmtplus_mass;
  65. TH1D *h_zmm1HLTminus_mass, *h_zmmNotIsominus_mass, *h_zmsminus_mass, *h_zmtminus_mass;
  66. // global counters
  67. int nGlobalMuonsMatched_passed; // total number of global muons MC matched and passing cuts (and triggered)
  68. vector<TH1D *> hmumu2HLTplus_eta, hmumu1HLTplus_eta, hmustaplus_eta, hmutrackplus_eta, hmumuNotIsoplus_eta;
  69. vector<TH1D *> hmumu2HLTplus_pt, hmumu1HLTplus_pt, hmustaplus_pt, hmutrackplus_pt, hmumuNotIsoplus_pt;
  70. vector<TH1D *> hmumu2HLTminus_eta, hmumu1HLTminus_eta, hmustaminus_eta, hmutrackminus_eta, hmumuNotIsominus_eta;
  71. vector<TH1D *> hmumu2HLTminus_pt, hmumu1HLTminus_pt, hmustaminus_pt, hmutrackminus_pt, hmumuNotIsominus_pt;
  72. };
  73. #include "FWCore/ServiceRegistry/interface/Service.h"
  74. #include "CommonTools/UtilAlgos/interface/TFileService.h"
  75. #include "DataFormats/Common/interface/Handle.h"
  76. #include "DataFormats/Candidate/interface/Particle.h"
  77. #include "DataFormats/Candidate/interface/Candidate.h"
  78. #include "DataFormats/Common/interface/ValueMap.h"
  79. #include "DataFormats/Candidate/interface/CandAssociation.h"
  80. #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
  81. #include "DataFormats/Math/interface/LorentzVector.h"
  82. #include "DataFormats/TrackReco/interface/Track.h"
  83. #include <iostream>
  84. #include <iterator>
  85. #include <cmath>
  86. using namespace std;
  87. using namespace reco;
  88. using namespace edm;
  89. typedef edm::ValueMap<float> IsolationCollection;
  90. ZMuMu_efficiencyAnalyzer::ZMuMu_efficiencyAnalyzer(const ParameterSet& pset) :
  91. zMuMu_(pset.getParameter<InputTag>("zMuMu")),
  92. zMuMuMatchMap_(pset.getParameter<InputTag>("zMuMuMatchMap")),
  93. zMuStandAlone_(pset.getParameter<InputTag>("zMuStandAlone")),
  94. zMuStandAloneMatchMap_(pset.getParameter<InputTag>("zMuStandAloneMatchMap")),
  95. zMuTrack_(pset.getParameter<InputTag>("zMuTrack")),
  96. zMuTrackMatchMap_(pset.getParameter<InputTag>("zMuTrackMatchMap")),
  97. muons_(pset.getParameter<InputTag>("muons")),
  98. tracks_(pset.getParameter<InputTag>("tracks")),
  99. genParticles_(pset.getParameter<InputTag>( "genParticles" ) ),
  100. primaryVertices_(pset.getParameter<InputTag>( "primaryVertices" ) ),
  101. bothMuons_(pset.getParameter<bool>("bothMuons")),
  102. etamax_(pset.getUntrackedParameter<double>("etamax")),
  103. ptmin_(pset.getUntrackedParameter<double>("ptmin")),
  104. massMin_(pset.getUntrackedParameter<double>("zMassMin")),
  105. massMax_(pset.getUntrackedParameter<double>("zMassMax")),
  106. isoMax_(pset.getUntrackedParameter<double>("isomax")) {
  107. Service<TFileService> fs;
  108. // general histograms
  109. h_zmm_mass = fs->make<TH1D>("zmm_mass","zmumu mass",100,0.,200.);
  110. h_zmm2HLT_mass = fs->make<TH1D>("zmm2HLT_mass","zmumu 2HLT mass",100,0.,200.);
  111. h_zmm1HLTplus_mass = fs->make<TH1D>("zmm1HLTplus_mass","zmumu 1HLT plus mass",100,0.,200.);
  112. h_zmmNotIsoplus_mass = fs->make<TH1D>("zmmNotIsoplus_mass","zmumu a least One Not Iso plus mass",100,0.,200.);
  113. h_zmsplus_mass = fs->make<TH1D>("zmsplus_mass","zmusta plus mass",100,0.,200.);
  114. h_zmtplus_mass = fs->make<TH1D>("zmtplus_mass","zmutrack plus mass",100,0.,200.);
  115. h_zmm1HLTminus_mass = fs->make<TH1D>("zmm1HLTminus_mass","zmumu 1HLT minus mass",100,0.,200.);
  116. h_zmmNotIsominus_mass = fs->make<TH1D>("zmmNotIsominus_mass","zmumu a least One Not Iso minus mass",100,0.,200.);
  117. h_zmsminus_mass = fs->make<TH1D>("zmsminus_mass","zmusta minus mass",100,0.,200.);
  118. h_zmtminus_mass = fs->make<TH1D>("zmtminus_mass","zmutrack minus mass",100,0.,200.);
  119. cout << "primo" << endl;
  120. // creating histograms for each Pt, eta interval
  121. TFileDirectory etaDirectory = fs->mkdir("etaIntervals"); // in this directory will be saved all the histos of different eta intervals
  122. TFileDirectory ptDirectory = fs->mkdir("ptIntervals"); // in this directory will be saved all the histos of different pt intervals
  123. // binning of entries array (at moment defined by hand and not in cfg file)
  124. etaBins = 6;
  125. ptBins = 4;
  126. double etaRangeTmp[7] = {-2.,-1.2,-0.8,0.,0.8,1.2,2.};
  127. double ptRangeTmp[5] = {20.,40.,60.,80.,100.};
  128. for (unsigned int i=0;i<=etaBins;i++) etaRange[i] = etaRangeTmp[i];
  129. for (unsigned int i=0;i<=ptBins;i++) ptRange[i] = ptRangeTmp[i];
  130. // eta histograms creation
  131. cout << "eta istograms creation " << endl;
  132. for (unsigned int i=0;i<etaBins;i++) {
  133. cout << " bin eta plus " << i << endl;
  134. // muon plus
  135. double range0 = etaRange[i];
  136. double range1= etaRange[i+1];
  137. char ap[30], bp[50];
  138. sprintf(ap,"zmumu2HLTplus_etaRange%d",i);
  139. sprintf(bp,"zmumu2HLT plus mass eta Range %f to %f",range0,range1);
  140. cout << ap << " " << bp << endl;
  141. hmumu2HLTplus_eta.push_back(etaDirectory.make<TH1D>(ap,bp,200,0.,200.));
  142. sprintf(ap,"zmumu1HLTplus_etaRange%d",i);
  143. sprintf(bp,"zmumu1HLT plus mass eta Range %f to %f",range0,range1);
  144. cout << ap << " " << bp << endl;
  145. hmumu1HLTplus_eta.push_back(etaDirectory.make<TH1D>(ap,bp,200,0.,200.));
  146. sprintf(ap,"zmustaplus_etaRange%d",i);
  147. sprintf(bp,"zmusta plus mass eta Range %f to %f",range0,range1);
  148. cout << ap << " " << bp << endl;
  149. hmustaplus_eta.push_back(etaDirectory.make<TH1D>(ap,bp,50,0.,200.));
  150. sprintf(ap,"zmutrackplus_etaRange%d",i);
  151. sprintf(bp,"zmutrack plus mass eta Range %f to %f",range0,range1);
  152. cout << ap << " " << bp << endl;
  153. hmutrackplus_eta.push_back(etaDirectory.make<TH1D>(ap,bp,100,0.,200.));
  154. sprintf(ap,"zmumuNotIsoplus_etaRange%d",i);
  155. sprintf(bp,"zmumuNotIso plus mass eta Range %f to %f",range0,range1);
  156. cout << ap << " " << bp << endl;
  157. hmumuNotIsoplus_eta.push_back(etaDirectory.make<TH1D>(ap,bp,100,0.,200.));
  158. // muon minus
  159. cout << " bin eta minus " << i << endl;
  160. char am[30], bm[50];
  161. sprintf(am,"zmumu2HLTminus_etaRange%d",i);
  162. sprintf(bm,"zmumu2HLT minus mass eta Range %f to %f",range0,range1);
  163. cout << am << " " << bm << endl;
  164. hmumu2HLTminus_eta.push_back(etaDirectory.make<TH1D>(am,bm,200,0.,200.));
  165. sprintf(am,"zmumu1HLTminus_etaRange%d",i);
  166. sprintf(bm,"zmumu1HLT minus mass eta Range %f to %f",range0,range1);
  167. cout << am << " " << bm << endl;
  168. hmumu1HLTminus_eta.push_back(etaDirectory.make<TH1D>(am,bm,200,0.,200.));
  169. sprintf(am,"zmustaminus_etaRange%d",i);
  170. sprintf(bm,"zmusta minus mass eta Range %f to %f",range0,range1);
  171. cout << am << " " << bm << endl;
  172. hmustaminus_eta.push_back(etaDirectory.make<TH1D>(am,bm,50,0.,200.));
  173. sprintf(am,"zmutrackminus_etaRange%d",i);
  174. sprintf(bm,"zmutrack minus mass eta Range %f to %f",range0,range1);
  175. cout << am << " " << bm << endl;
  176. hmutrackminus_eta.push_back(etaDirectory.make<TH1D>(am,bm,100,0.,200.));
  177. sprintf(am,"zmumuNotIsominus_etaRange%d",i);
  178. sprintf(bm,"zmumuNotIso minus mass eta Range %f to %f",range0,range1);
  179. cout << am << " " << bm << endl;
  180. hmumuNotIsominus_eta.push_back(etaDirectory.make<TH1D>(am,bm,100,0.,200.));
  181. }
  182. // pt histograms creation
  183. cout << "pt istograms creation " << endl;
  184. for (unsigned int i=0;i<ptBins;i++) {
  185. double range0 = ptRange[i];
  186. double range1= ptRange[i+1];
  187. // muon plus
  188. cout << " bin pt plus " << i << endl;
  189. char ap1[30], bp1[50];
  190. sprintf(ap1,"zmumu2HLTplus_ptRange%d",i);
  191. sprintf(bp1,"zmumu2HLT plus mass pt Range %f to %f",range0,range1);
  192. cout << ap1 << " " << bp1 << endl;
  193. hmumu2HLTplus_pt.push_back(ptDirectory.make<TH1D>(ap1,bp1,200,0.,200.));
  194. sprintf(ap1,"zmumu1HLTplus_ptRange%d",i);
  195. sprintf(bp1,"zmumu1HLT plus mass pt Range %f to %f",range0,range1);
  196. cout << ap1 << " " << bp1 << endl;
  197. hmumu1HLTplus_pt.push_back(ptDirectory.make<TH1D>(ap1,bp1,200,0.,200.));
  198. sprintf(ap1,"zmustaplus_ptRange%d",i);
  199. sprintf(bp1,"zmusta plus mass pt Range %f to %f",range0,range1);
  200. cout << ap1 << " " << bp1 << endl;
  201. hmustaplus_pt.push_back(ptDirectory.make<TH1D>(ap1,bp1,50,0.,200.));
  202. sprintf(ap1,"zmutrackplus_ptRange%d",i);
  203. sprintf(bp1,"zmutrack plus mass pt Range %f to %f",range0,range1);
  204. cout << ap1 << " " << bp1 << endl;
  205. hmutrackplus_pt.push_back(ptDirectory.make<TH1D>(ap1,bp1,100,0.,200.));
  206. sprintf(ap1,"zmumuNotIsoplus_ptRange%d",i);
  207. sprintf(bp1,"zmumuNotIso plus mass pt Range %f to %f",range0,range1);
  208. cout << ap1 << " " << bp1 << endl;
  209. hmumuNotIsoplus_pt.push_back(ptDirectory.make<TH1D>(ap1,bp1,100,0.,200.));
  210. // muon minus
  211. cout << " bin pt minus " << i << endl;
  212. char am1[30], bm1[50];
  213. sprintf(am1,"zmumu2HLTminus_ptRange%d",i);
  214. sprintf(bm1,"zmumu2HLT minus mass pt Range %f to %f",range0,range1);
  215. cout << am1 << " " << bm1 << endl;
  216. hmumu2HLTminus_pt.push_back(ptDirectory.make<TH1D>(am1,bm1,200,0.,200.));
  217. sprintf(am1,"zmumu1HLTminus_ptRange%d",i);
  218. sprintf(bm1,"zmumu1HLT minus mass pt Range %f to %f",range0,range1);
  219. cout << am1 << " " << bm1 << endl;
  220. hmumu1HLTminus_pt.push_back(ptDirectory.make<TH1D>(am1,bm1,200,0.,200.));
  221. sprintf(am1,"zmustaminus_ptRange%d",i);
  222. sprintf(bm1,"zmusta minus mass pt Range %f to %f",range0,range1);
  223. cout << am1 << " " << bm1 << endl;
  224. hmustaminus_pt.push_back(ptDirectory.make<TH1D>(am1,bm1,50,0.,200.));
  225. sprintf(am1,"zmutrackminus_ptRange%d",i);
  226. sprintf(bm1,"zmutrack minus mass pt Range %f to %f",range0,range1);
  227. cout << am1 << " " << bm1 << endl;
  228. hmutrackminus_pt.push_back(ptDirectory.make<TH1D>(am1,bm1,100,0.,200.));
  229. sprintf(am1,"zmumuNotIsominus_ptRange%d",i);
  230. sprintf(bm1,"zmumuNotIso minus mass pt Range %f to %f",range0,range1);
  231. cout << am1 << " " << bm1 << endl;
  232. hmumuNotIsominus_pt.push_back(ptDirectory.make<TH1D>(am1,bm1,100,0.,200.));
  233. }
  234. // clear global counters
  235. nGlobalMuonsMatched_passed = 0;
  236. }
  237. void ZMuMu_efficiencyAnalyzer::analyze(const Event& event, const EventSetup& setup) {
  238. Handle<CandidateView> zMuMu;
  239. Handle<GenParticleMatch> zMuMuMatchMap; //Map of Z made by Mu global + Mu global
  240. Handle<CandidateView> zMuStandAlone;
  241. Handle<GenParticleMatch> zMuStandAloneMatchMap; //Map of Z made by Mu + StandAlone
  242. Handle<CandidateView> zMuTrack;
  243. Handle<GenParticleMatch> zMuTrackMatchMap; //Map of Z made by Mu + Track
  244. Handle<CandidateView> muons; //Collection of Muons
  245. Handle<CandidateView> tracks; //Collection of Tracks
  246. Handle<GenParticleCollection> genParticles; // Collection of Generatd Particles
  247. Handle<reco::VertexCollection> primaryVertices; // Collection of primary Vertices
  248. event.getByLabel(zMuMu_, zMuMu);
  249. event.getByLabel(zMuStandAlone_, zMuStandAlone);
  250. event.getByLabel(zMuTrack_, zMuTrack);
  251. event.getByLabel(genParticles_, genParticles);
  252. event.getByLabel(primaryVertices_, primaryVertices);
  253. event.getByLabel(muons_, muons);
  254. event.getByLabel(tracks_, tracks);
  255. /*
  256. cout << "********* zMuMu size : " << zMuMu->size() << endl;
  257. cout << "********* zMuStandAlone size : " << zMuStandAlone->size() << endl;
  258. cout << "********* zMuTrack size : " << zMuTrack->size() << endl;
  259. cout << "********* muons size : " << muons->size() << endl;
  260. cout << "********* tracks size : " << tracks->size() << endl;
  261. cout << "********* vertices size : " << primaryVertices->size() << endl;
  262. */
  263. // std::cout<<"Run-> "<<event.id().run()<<std::endl;
  264. // std::cout<<"Event-> "<<event.id().event()<<std::endl;
  265. bool zMuMu_found = false;
  266. // loop on ZMuMu
  267. if (zMuMu->size() > 0 ) {
  268. for(unsigned int i = 0; i < zMuMu->size(); ++i) { //loop on candidates
  269. const Candidate & zMuMuCand = (*zMuMu)[i]; //the candidate
  270. CandidateBaseRef zMuMuCandRef = zMuMu->refAt(i);
  271. const Candidate * lep0 = zMuMuCand.daughter( 0 );
  272. const Candidate * lep1 = zMuMuCand.daughter( 1 );
  273. const pat::Muon & muonDau0 = dynamic_cast<const pat::Muon &>(*lep0->masterClone());
  274. double trkiso0 = muonDau0.trackIso();
  275. const pat::Muon & muonDau1 = dynamic_cast<const pat::Muon &>(*lep1->masterClone());
  276. double trkiso1 = muonDau1.trackIso();
  277. // kinemtic variables
  278. double pt0 = zMuMuCand.daughter(0)->pt();
  279. double pt1 = zMuMuCand.daughter(1)->pt();
  280. double eta0 = zMuMuCand.daughter(0)->eta();
  281. double eta1 = zMuMuCand.daughter(1)->eta();
  282. double charge0 = zMuMuCand.daughter(0)->charge();
  283. double charge1 = zMuMuCand.daughter(1)->charge();
  284. double mass = zMuMuCand.mass();
  285. // HLT match
  286. const pat::TriggerObjectStandAloneCollection mu0HLTMatches =
  287. muonDau0.triggerObjectMatchesByPath( "HLT_Mu9" );
  288. const pat::TriggerObjectStandAloneCollection mu1HLTMatches =
  289. muonDau1.triggerObjectMatchesByPath( "HLT_Mu9" );
  290. bool trig0found = false;
  291. bool trig1found = false;
  292. if( mu0HLTMatches.size()>0 )
  293. trig0found = true;
  294. if( mu1HLTMatches.size()>0 )
  295. trig1found = true;
  296. // kinematic selection
  297. bool checkOppositeCharge = false;
  298. if (charge0 != charge1) checkOppositeCharge = true;
  299. if (pt0>ptmin_ && pt1>ptmin_ && abs(eta0)<etamax_ && abs(eta1)<etamax_ && mass>massMin_ && mass<massMax_ && checkOppositeCharge) {
  300. if (trig0found || trig1found) { // at least one muon match HLT
  301. zMuMu_found = true; // Z found as global-global (so don't check Zms and Zmt)
  302. if (trkiso0 < isoMax_ && trkiso1 < isoMax_) { // both muons are isolated
  303. if (trig0found && trig1found) {
  304. // ******************** category zmm 2 HLT ****************
  305. h_zmm2HLT_mass->Fill(mass);
  306. h_zmm_mass->Fill(mass);
  307. // check the cynematics to fill correct histograms
  308. for (unsigned int j=0;j<etaBins;j++) { // eta Bins loop
  309. double range0 = etaRange[j];
  310. double range1= etaRange[j+1];
  311. // eta histograms
  312. if (eta0>=range0 && eta0<range1)
  313. {
  314. if (charge0<0) hmumu2HLTminus_eta[j]->Fill(mass); // mu- in bin eta
  315. if (charge0>0) hmumu2HLTplus_eta[j]->Fill(mass); // mu+ in bin eta
  316. }
  317. if (eta1>=range0 && eta1<range1)
  318. {
  319. if (charge1<0) hmumu2HLTminus_eta[j]->Fill(mass); // mu- in bin eta
  320. if (charge1>0) hmumu2HLTplus_eta[j]->Fill(mass); // mu+ in bin eta
  321. }
  322. } // end loop etaBins
  323. for (unsigned int j=0;j<ptBins;j++) { // pt Bins loop
  324. double range0pt = ptRange[j];
  325. double range1pt = ptRange[j+1];
  326. // pt histograms
  327. if (pt0>=range0pt && pt0<range1pt)
  328. {
  329. if (charge0<0) hmumu2HLTminus_pt[j]->Fill(mass); // mu- in bin eta
  330. if (charge0>0) hmumu2HLTplus_pt[j]->Fill(mass); // mu+ in bin eta
  331. }
  332. if (pt1>=range0pt && pt1<range1pt)
  333. {
  334. if (charge1<0) hmumu2HLTminus_pt[j]->Fill(mass); // mu- in bin eta
  335. if (charge1>0) hmumu2HLTplus_pt[j]->Fill(mass); // mu+ in bin eta
  336. }
  337. } // end loop ptBins
  338. } // ******************* end category zmm 2 HLT ****************
  339. if (!trig0found || !trig1found) {
  340. // ****************** category zmm 1 HLT ******************
  341. h_zmm_mass->Fill(mass);
  342. double eta = 9999;
  343. double pt = 9999;
  344. double charge = 0;
  345. if (trig0found) {
  346. eta = eta1; // check muon not HLT matched
  347. pt = pt1;
  348. charge = charge1;
  349. } else {
  350. eta = eta0;
  351. pt =pt0;
  352. charge = charge0;
  353. }
  354. if (charge<0) h_zmm1HLTminus_mass->Fill(mass);
  355. if (charge>0) h_zmm1HLTplus_mass->Fill(mass);
  356. for (unsigned int j=0;j<etaBins;j++) { // eta Bins loop
  357. double range0 = etaRange[j];
  358. double range1= etaRange[j+1];
  359. // eta histograms fill the bin of the muon not HLT matched
  360. if (eta>=range0 && eta<range1)
  361. {
  362. if (charge<0) hmumu1HLTminus_eta[j]->Fill(mass);
  363. if (charge>0) hmumu1HLTplus_eta[j]->Fill(mass);
  364. }
  365. } // end loop etaBins
  366. for (unsigned int j=0;j<ptBins;j++) { // pt Bins loop
  367. double range0 = ptRange[j];
  368. double range1= ptRange[j+1];
  369. // pt histograms
  370. if (pt>=range0 && pt<range1)
  371. {
  372. if (charge<0) hmumu1HLTminus_pt[j]->Fill(mass);
  373. if (charge>0) hmumu1HLTplus_pt[j]->Fill(mass);
  374. }
  375. } // end loop ptBins
  376. } // ****************** end category zmm 1 HLT ***************
  377. } else { // one or both muons are not isolated
  378. // ***************** category zmumuNotIso **************** (per ora non studio iso vs eta e pt da capire meglio)
  379. } // end if both muons isolated
  380. } // end if at least 1 HLT trigger found
  381. } // end if kinematic selection
  382. } // end loop on ZMuMu cand
  383. } // end if ZMuMu size > 0
  384. // loop on ZMuSta
  385. bool zMuSta_found = false;
  386. if (!zMuMu_found && zMuStandAlone->size() > 0 ) {
  387. event.getByLabel(zMuStandAloneMatchMap_, zMuStandAloneMatchMap);
  388. for(unsigned int i = 0; i < zMuStandAlone->size(); ++i) { //loop on candidates
  389. const Candidate & zMuStandAloneCand = (*zMuStandAlone)[i]; //the candidate
  390. CandidateBaseRef zMuStandAloneCandRef = zMuStandAlone->refAt(i);
  391. GenParticleRef zMuStandAloneMatch = (*zMuStandAloneMatchMap)[zMuStandAloneCandRef];
  392. const Candidate * lep0 = zMuStandAloneCand.daughter( 0 );
  393. const Candidate * lep1 = zMuStandAloneCand.daughter( 1 );
  394. const pat::Muon & muonDau0 = dynamic_cast<const pat::Muon &>(*lep0->masterClone());
  395. double trkiso0 = muonDau0.trackIso();
  396. const pat::Muon & muonDau1 = dynamic_cast<const pat::Muon &>(*lep1->masterClone());
  397. double trkiso1 = muonDau1.trackIso();
  398. double pt0 = zMuStandAloneCand.daughter(0)->pt();
  399. double pt1 = zMuStandAloneCand.daughter(1)->pt();
  400. double eta0 = zMuStandAloneCand.daughter(0)->eta();
  401. double eta1 = zMuStandAloneCand.daughter(1)->eta();
  402. double charge0 = zMuStandAloneCand.daughter(0)->charge();
  403. double charge1 = zMuStandAloneCand.daughter(1)->charge();
  404. double mass = zMuStandAloneCand.mass();
  405. // HLT match
  406. const pat::TriggerObjectStandAloneCollection mu0HLTMatches =
  407. muonDau0.triggerObjectMatchesByPath( "HLT_Mu9" );
  408. const pat::TriggerObjectStandAloneCollection mu1HLTMatches =
  409. muonDau1.triggerObjectMatchesByPath( "HLT_Mu9" );
  410. bool trig0found = false;
  411. bool trig1found = false;
  412. if( mu0HLTMatches.size()>0 )
  413. trig0found = true;
  414. if( mu1HLTMatches.size()>0 )
  415. trig1found = true;
  416. // check HLT match of Global muon and save eta, pt of second muon (standAlone)
  417. bool trigGlbfound = false;
  418. double pt =999.;
  419. double eta = 999.;
  420. double charge = 0;
  421. if (muonDau0.isGlobalMuon()) {
  422. trigGlbfound = trig0found;
  423. pt = pt1;
  424. eta = eta1;
  425. charge = charge1;
  426. }
  427. if (muonDau1.isGlobalMuon()) {
  428. trigGlbfound = trig1found;
  429. pt = pt0;
  430. eta = eta0;
  431. charge = charge0;
  432. }
  433. bool checkOppositeCharge = false;
  434. if (charge0 != charge1) checkOppositeCharge = true;
  435. if (checkOppositeCharge && trigGlbfound && pt0>ptmin_ && pt1>ptmin_ && abs(eta0)<etamax_ && abs(eta1)<etamax_ && mass>massMin_ && mass<massMax_ && trkiso0<isoMax_ && trkiso1<isoMax_ ) { // global mu match HLT + kinematic cuts + opposite charge
  436. if (charge<0) h_zmsminus_mass->Fill(mass);
  437. if (charge>0) h_zmsplus_mass->Fill(mass);
  438. for (unsigned int j=0;j<etaBins;j++) { // eta Bins loop
  439. double range0 = etaRange[j];
  440. double range1= etaRange[j+1];
  441. // eta histograms
  442. if (eta>=range0 && eta<range1) {
  443. if (charge<0) hmustaminus_eta[j]->Fill(mass);
  444. if (charge>0) hmustaplus_eta[j]->Fill(mass);
  445. }
  446. } // end loop etaBins
  447. for (unsigned int j=0;j<ptBins;j++) { // pt Bins loop
  448. double range0 = ptRange[j];
  449. double range1= ptRange[j+1];
  450. // pt histograms
  451. if (pt>=range0 && pt<range1) {
  452. if (charge<0) hmustaminus_pt[j]->Fill(mass);
  453. if (charge>0) hmustaplus_pt[j]->Fill(mass);
  454. }
  455. } // end loop ptBins
  456. } // end if trigGlbfound + kinecuts + OppostieCharge
  457. } // end loop on ZMuStandAlone cand
  458. } // end if ZMuStandAlone size > 0
  459. // loop on ZMuTrack
  460. // bool zMuTrack_found = false;
  461. if (!zMuMu_found && !zMuSta_found && zMuTrack->size() > 0 ) {
  462. event.getByLabel(zMuTrackMatchMap_, zMuTrackMatchMap);
  463. for(unsigned int i = 0; i < zMuTrack->size(); ++i) { //loop on candidates
  464. const Candidate & zMuTrackCand = (*zMuTrack)[i]; //the candidate
  465. CandidateBaseRef zMuTrackCandRef = zMuTrack->refAt(i);
  466. const Candidate * lep0 = zMuTrackCand.daughter( 0 );
  467. const Candidate * lep1 = zMuTrackCand.daughter( 1 );
  468. const pat::Muon & muonDau0 = dynamic_cast<const pat::Muon &>(*lep0->masterClone());
  469. double trkiso0 = muonDau0.trackIso();
  470. const pat::GenericParticle & trackDau1 = dynamic_cast<const pat::GenericParticle &>(*lep1->masterClone());
  471. double trkiso1 = trackDau1.trackIso();
  472. double pt0 = zMuTrackCand.daughter(0)->pt();
  473. double pt1 = zMuTrackCand.daughter(1)->pt();
  474. double eta0 = zMuTrackCand.daughter(0)->eta();
  475. double eta1 = zMuTrackCand.daughter(1)->eta();
  476. double charge0 = zMuTrackCand.daughter(0)->charge();
  477. double charge1 = zMuTrackCand.daughter(1)->charge();
  478. double mass = zMuTrackCand.mass();
  479. // HLT match (check just dau0 the global)
  480. const pat::TriggerObjectStandAloneCollection mu0HLTMatches =
  481. muonDau0.triggerObjectMatchesByPath( "HLT_Mu9" );
  482. bool trig0found = false;
  483. if( mu0HLTMatches.size()>0 )
  484. trig0found = true;
  485. bool checkOppositeCharge = false;
  486. if (charge0 != charge1) checkOppositeCharge = true;
  487. if (checkOppositeCharge && trig0found && pt0>ptmin_ && pt1>ptmin_ && abs(eta0)<etamax_ && abs(eta1)<etamax_ && mass>massMin_ && mass<massMax_ && trkiso0<isoMax_ && trkiso1<isoMax_ ) { // global mu match HLT + kinematic cuts + opposite charge
  488. if (charge1<0) h_zmtminus_mass->Fill(mass);
  489. if (charge1>0) h_zmtplus_mass->Fill(mass);
  490. for (unsigned int j=0;j<etaBins;j++) { // eta Bins loop
  491. double range0 = etaRange[j];
  492. double range1= etaRange[j+1];
  493. // eta histograms
  494. if (eta1>=range0 && eta1<range1) {
  495. if (charge1<0) hmutrackminus_eta[j]->Fill(mass); // just check muon1 (mu0 is global by definition)
  496. if (charge1>0) hmutrackplus_eta[j]->Fill(mass); // just check muon1 (mu0 is global by definition)
  497. }
  498. } // end loop etaBins
  499. for (unsigned int j=0;j<ptBins;j++) { // pt Bins loop
  500. double range0 = ptRange[j];
  501. double range1= ptRange[j+1];
  502. // pt histograms
  503. if (pt1>=range0 && pt1<range1) {
  504. if (charge1<0) hmutrackminus_pt[j]->Fill(mass); // just check muon1 (mu0 is global by definition)
  505. if (charge1>0) hmutrackplus_pt[j]->Fill(mass); // just check muon1 (mu0 is global by definition)
  506. }
  507. } // end loop ptBins
  508. } // end if trig0found
  509. } // end loop on ZMuTrack cand
  510. } // end if ZMuTrack size > 0
  511. } // end analyze
  512. bool ZMuMu_efficiencyAnalyzer::check_ifZmumu(const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  513. {
  514. int partId0 = dauGen0->pdgId();
  515. int partId1 = dauGen1->pdgId();
  516. int partId2 = dauGen2->pdgId();
  517. bool muplusFound=false;
  518. bool muminusFound=false;
  519. bool ZFound=false;
  520. if (partId0==13 || partId1==13 || partId2==13) muminusFound=true;
  521. if (partId0==-13 || partId1==-13 || partId2==-13) muplusFound=true;
  522. if (partId0==23 || partId1==23 || partId2==23) ZFound=true;
  523. return muplusFound*muminusFound*ZFound;
  524. }
  525. float ZMuMu_efficiencyAnalyzer::getParticlePt(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  526. {
  527. int partId0 = dauGen0->pdgId();
  528. int partId1 = dauGen1->pdgId();
  529. int partId2 = dauGen2->pdgId();
  530. float ptpart=0.;
  531. if (partId0 == ipart) {
  532. for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
  533. const Candidate * dauMuGen = dauGen0->daughter(k);
  534. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  535. ptpart = dauMuGen->pt();
  536. }
  537. }
  538. }
  539. if (partId1 == ipart) {
  540. for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
  541. const Candidate * dauMuGen = dauGen1->daughter(k);
  542. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  543. ptpart = dauMuGen->pt();
  544. }
  545. }
  546. }
  547. if (partId2 == ipart) {
  548. for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
  549. const Candidate * dauMuGen = dauGen2->daughter(k);
  550. if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
  551. ptpart = dauMuGen->pt();
  552. }
  553. }
  554. }
  555. return ptpart;
  556. }
  557. float ZMuMu_efficiencyAnalyzer::getParticleEta(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  558. {
  559. int partId0 = dauGen0->pdgId();
  560. int partId1 = dauGen1->pdgId();
  561. int partId2 = dauGen2->pdgId();
  562. float etapart=0.;
  563. if (partId0 == ipart) {
  564. for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
  565. const Candidate * dauMuGen = dauGen0->daughter(k);
  566. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  567. etapart = dauMuGen->eta();
  568. }
  569. }
  570. }
  571. if (partId1 == ipart) {
  572. for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
  573. const Candidate * dauMuGen = dauGen1->daughter(k);
  574. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  575. etapart = dauMuGen->eta();
  576. }
  577. }
  578. }
  579. if (partId2 == ipart) {
  580. for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
  581. const Candidate * dauMuGen = dauGen2->daughter(k);
  582. if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
  583. etapart = dauMuGen->eta();
  584. }
  585. }
  586. }
  587. return etapart;
  588. }
  589. float ZMuMu_efficiencyAnalyzer::getParticlePhi(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  590. {
  591. int partId0 = dauGen0->pdgId();
  592. int partId1 = dauGen1->pdgId();
  593. int partId2 = dauGen2->pdgId();
  594. float phipart=0.;
  595. if (partId0 == ipart) {
  596. for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
  597. const Candidate * dauMuGen = dauGen0->daughter(k);
  598. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  599. phipart = dauMuGen->phi();
  600. }
  601. }
  602. }
  603. if (partId1 == ipart) {
  604. for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
  605. const Candidate * dauMuGen = dauGen1->daughter(k);
  606. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  607. phipart = dauMuGen->phi();
  608. }
  609. }
  610. }
  611. if (partId2 == ipart) {
  612. for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
  613. const Candidate * dauMuGen = dauGen2->daughter(k);
  614. if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
  615. phipart = dauMuGen->phi();
  616. }
  617. }
  618. }
  619. return phipart;
  620. }
  621. Particle::LorentzVector ZMuMu_efficiencyAnalyzer::getParticleP4(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  622. {
  623. int partId0 = dauGen0->pdgId();
  624. int partId1 = dauGen1->pdgId();
  625. int partId2 = dauGen2->pdgId();
  626. Particle::LorentzVector p4part(0.,0.,0.,0.);
  627. if (partId0 == ipart) {
  628. for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
  629. const Candidate * dauMuGen = dauGen0->daughter(k);
  630. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  631. p4part = dauMuGen->p4();
  632. }
  633. }
  634. }
  635. if (partId1 == ipart) {
  636. for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
  637. const Candidate * dauMuGen = dauGen1->daughter(k);
  638. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  639. p4part = dauMuGen->p4();
  640. }
  641. }
  642. }
  643. if (partId2 == ipart) {
  644. for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
  645. const Candidate * dauMuGen = dauGen2->daughter(k);
  646. if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
  647. p4part = dauMuGen->p4();
  648. }
  649. }
  650. }
  651. return p4part;
  652. }
  653. void ZMuMu_efficiencyAnalyzer::endJob() {
  654. }
  655. #include "FWCore/Framework/interface/MakerMacros.h"
  656. DEFINE_FWK_MODULE(ZMuMu_efficiencyAnalyzer);