/ElectroWeakAnalysis/ZMuMu/plugins/ZMuMuEfficiency.cc

https://github.com/aivanov-cern/cmssw · C++ · 723 lines · 601 code · 76 blank · 46 comment · 171 complexity · e167282e0fc44917350a41f57757cd1f MD5 · raw file

  1. /* \class ZMuMuEfficiency
  2. *
  3. * author: Pasquale Noli
  4. * revised by Salvatore di Guida
  5. * revised for CSA08 by Davide Piccolo
  6. *
  7. * Efficiency of reconstruction tracker and muon Chamber
  8. *
  9. */
  10. #include "DataFormats/Common/interface/AssociationVector.h"
  11. #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
  12. #include "DataFormats/Candidate/interface/CandMatchMap.h"
  13. #include "FWCore/Framework/interface/EDAnalyzer.h"
  14. #include "DataFormats/Candidate/interface/Candidate.h"
  15. #include "DataFormats/Candidate/interface/CandidateFwd.h"
  16. #include "FWCore/ParameterSet/interface/ParameterSet.h"
  17. #include "FWCore/Framework/interface/Event.h"
  18. #include "FWCore/Framework/interface/EventSetup.h"
  19. #include "FWCore/Utilities/interface/InputTag.h"
  20. #include "DataFormats/Candidate/interface/OverlapChecker.h"
  21. #include "TH1.h"
  22. #include <vector>
  23. using namespace edm;
  24. using namespace std;
  25. using namespace reco;
  26. class ZMuMuEfficiency : public edm::EDAnalyzer {
  27. public:
  28. ZMuMuEfficiency(const edm::ParameterSet& pset);
  29. private:
  30. virtual void analyze(const edm::Event& event, const edm::EventSetup& setup) override;
  31. bool check_ifZmumu(const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  32. float getParticlePt(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  33. float getParticleEta(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  34. float getParticlePhi(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  35. Particle::LorentzVector getParticleP4(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
  36. virtual void endJob() override;
  37. edm::InputTag zMuMu_, zMuMuMatchMap_;
  38. edm::InputTag zMuTrack_, zMuTrackMatchMap_;
  39. edm::InputTag zMuStandAlone_, zMuStandAloneMatchMap_;
  40. edm::InputTag muons_, muonMatchMap_, muonIso_;
  41. edm::InputTag tracks_, trackIso_;
  42. edm::InputTag standAlone_, standAloneIso_;
  43. edm::InputTag genParticles_;
  44. double zMassMin_, zMassMax_, ptmin_, etamax_, isomax_;
  45. unsigned int nbinsPt_, nbinsEta_;
  46. reco::CandidateBaseRef globalMuonCandRef_, trackMuonCandRef_, standAloneMuonCandRef_;
  47. OverlapChecker overlap_;
  48. //histograms for measuring tracker efficiency
  49. TH1D *h_etaStandAlone_, *h_etaMuonOverlappedToStandAlone_;
  50. TH1D *h_ptStandAlone_, *h_ptMuonOverlappedToStandAlone_;
  51. //histograms for measuring standalone efficiency
  52. TH1D *h_etaTrack_, *h_etaMuonOverlappedToTrack_;
  53. TH1D *h_ptTrack_, *h_ptMuonOverlappedToTrack_;
  54. //histograms for MC acceptance
  55. TH1D *h_nZMCfound_;
  56. TH1D *h_ZetaGen_, *h_ZptGen_, *h_ZmassGen_;
  57. TH1D *h_muetaGen_, *h_muptGen_, *h_muIsoGen_;
  58. TH1D *h_dimuonPtGen_, *h_dimuonMassGen_, *h_dimuonEtaGen_;
  59. TH1D *h_ZetaGenPassed_, *h_ZptGenPassed_, *h_ZmassGenPassed_;
  60. TH1D *h_muetaGenPassed_, *h_muptGenPassed_, *h_muIsoGenPassed_;
  61. TH1D *h_dimuonPtGenPassed_, *h_dimuonMassGenPassed_, *h_dimuonEtaGenPassed_;
  62. //histograms for invarian mass resolution
  63. TH1D *h_DELTA_ZMuMuMassReco_dimuonMassGen_, *h_DELTA_ZMuStaMassReco_dimuonMassGen_, *h_DELTA_ZMuTrackMassReco_dimuonMassGen_;
  64. int numberOfEventsWithZMuMufound, numberOfEventsWithZMuStafound;
  65. int numberOfMatchedZMuSta_,numberOfMatchedSelectedZMuSta_;
  66. int numberOfMatchedZMuMu_, numberOfMatchedSelectedZMuMu_;
  67. int numberOfOverlappedStandAlone_, numberOfOverlappedTracks_, numberOfMatchedZMuTrack_notOverlapped;
  68. int numberOfMatchedZMuTrack_exclusive ,numberOfMatchedSelectedZMuTrack_exclusive;
  69. int numberOfMatchedZMuTrack_matchedZMuMu, numberOfMatchedZMuTrack_matchedSelectedZMuMu ;
  70. int totalNumberOfevents, totalNumberOfZfound, totalNumberOfZPassed;
  71. int noMCmatching, ZMuTrack_exclusive_1match, ZMuTrack_exclusive_morematch;
  72. int ZMuTrackselected_exclusive_1match, ZMuTrackselected_exclusive_morematch;
  73. int ZMuTrack_ZMuMu_1match, ZMuTrack_ZMuMu_2match, ZMuTrack_ZMuMu_morematch;
  74. int n_zMuMufound_genZsele, n_zMuStafound_genZsele, n_zMuTrkfound_genZsele;
  75. };
  76. #include "FWCore/ServiceRegistry/interface/Service.h"
  77. #include "CommonTools/UtilAlgos/interface/TFileService.h"
  78. #include "DataFormats/Common/interface/Handle.h"
  79. #include "DataFormats/Candidate/interface/Particle.h"
  80. #include "DataFormats/Candidate/interface/Candidate.h"
  81. #include "DataFormats/Common/interface/ValueMap.h"
  82. #include "DataFormats/Candidate/interface/CandAssociation.h"
  83. #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
  84. #include <iostream>
  85. #include <iterator>
  86. #include <cmath>
  87. using namespace std;
  88. using namespace reco;
  89. using namespace edm;
  90. typedef edm::ValueMap<float> IsolationCollection;
  91. ZMuMuEfficiency::ZMuMuEfficiency(const ParameterSet& pset) :
  92. zMuMu_(pset.getParameter<InputTag>("zMuMu")),
  93. zMuMuMatchMap_(pset.getParameter<InputTag>("zMuMuMatchMap")),
  94. zMuTrack_(pset.getParameter<InputTag>("zMuTrack")),
  95. zMuTrackMatchMap_(pset.getParameter<InputTag>("zMuTrackMatchMap")),
  96. zMuStandAlone_(pset.getParameter<InputTag>("zMuStandAlone")),
  97. zMuStandAloneMatchMap_(pset.getParameter<InputTag>("zMuStandAloneMatchMap")),
  98. muons_(pset.getParameter<InputTag>("muons")),
  99. muonMatchMap_(pset.getParameter<InputTag>("muonMatchMap")),
  100. muonIso_(pset.getParameter<InputTag>("muonIso")),
  101. tracks_(pset.getParameter<InputTag>("tracks")),
  102. trackIso_(pset.getParameter<InputTag>("trackIso")),
  103. standAlone_(pset.getParameter<InputTag>("standAlone")),
  104. standAloneIso_(pset.getParameter<InputTag>("standAloneIso")),
  105. genParticles_(pset.getParameter<InputTag>( "genParticles" ) ),
  106. zMassMin_(pset.getUntrackedParameter<double>("zMassMin")),
  107. zMassMax_(pset.getUntrackedParameter<double>("zMassMax")),
  108. ptmin_(pset.getUntrackedParameter<double>("ptmin")),
  109. etamax_(pset.getUntrackedParameter<double>("etamax")),
  110. isomax_(pset.getUntrackedParameter<double>("isomax")),
  111. nbinsPt_(pset.getUntrackedParameter<unsigned int>("nbinsPt")),
  112. nbinsEta_(pset.getUntrackedParameter<unsigned int>("nbinsEta")) {
  113. Service<TFileService> fs;
  114. TFileDirectory trackEffDir = fs->mkdir("TrackEfficiency");
  115. // tracker efficiency distributions
  116. h_etaStandAlone_ = trackEffDir.make<TH1D>("StandAloneMuonEta",
  117. "StandAlone #eta for Z -> #mu + standalone",
  118. nbinsEta_, -etamax_, etamax_);
  119. h_etaMuonOverlappedToStandAlone_ = trackEffDir.make<TH1D>("MuonOverlappedToStandAloneEta",
  120. "Global muon overlapped to standAlone #eta for Z -> #mu + sa",
  121. nbinsEta_, -etamax_, etamax_);
  122. h_ptStandAlone_ = trackEffDir.make<TH1D>("StandAloneMuonPt",
  123. "StandAlone p_{t} for Z -> #mu + standalone",
  124. nbinsPt_, ptmin_, 100);
  125. h_ptMuonOverlappedToStandAlone_ = trackEffDir.make<TH1D>("MuonOverlappedToStandAlonePt",
  126. "Global muon overlapped to standAlone p_{t} for Z -> #mu + sa",
  127. nbinsPt_, ptmin_, 100);
  128. // StandAlone efficiency distributions
  129. TFileDirectory standaloneEffDir = fs->mkdir("StandaloneEfficiency");
  130. h_etaTrack_ = standaloneEffDir.make<TH1D>("TrackMuonEta",
  131. "Track #eta for Z -> #mu + track",
  132. nbinsEta_, -etamax_, etamax_);
  133. h_etaMuonOverlappedToTrack_ = standaloneEffDir.make<TH1D>("MuonOverlappedToTrackEta",
  134. "Global muon overlapped to track #eta for Z -> #mu + tk",
  135. nbinsEta_, -etamax_, etamax_);
  136. h_ptTrack_ = standaloneEffDir.make<TH1D>("TrackMuonPt",
  137. "Track p_{t} for Z -> #mu + track",
  138. nbinsPt_, ptmin_, 100);
  139. h_ptMuonOverlappedToTrack_ = standaloneEffDir.make<TH1D>("MuonOverlappedToTrackPt",
  140. "Global muon overlapped to track p_{t} for Z -> #mu + tk",
  141. nbinsPt_, ptmin_, 100);
  142. // inv. mass resolution studies
  143. TFileDirectory invMassResolutionDir = fs->mkdir("invriantMassResolution");
  144. h_DELTA_ZMuMuMassReco_dimuonMassGen_ = invMassResolutionDir.make<TH1D>("zMuMu_invMassResolution","zMuMu invariant Mass Resolution",50,-25,25);
  145. h_DELTA_ZMuStaMassReco_dimuonMassGen_ = invMassResolutionDir.make<TH1D>("zMuSta_invMassResolution","zMuSta invariant Mass Resolution",50,-25,25);
  146. h_DELTA_ZMuTrackMassReco_dimuonMassGen_ = invMassResolutionDir.make<TH1D>("zMuTrack_invMassResolution","zMuTrack invariant Mass Resolution",50,-25,25);
  147. // generator level histograms
  148. TFileDirectory genParticleDir = fs->mkdir("genParticle");
  149. h_nZMCfound_ = genParticleDir.make<TH1D>("NumberOfgeneratedZeta","n. of generated Z per event",4,-.5,3.5);
  150. h_ZetaGen_ = genParticleDir.make<TH1D>("generatedZeta","#eta of generated Z",100,-5.,5.);
  151. h_ZptGen_ = genParticleDir.make<TH1D>("generatedZpt","pt of generated Z",100,0.,200.);
  152. h_ZmassGen_ = genParticleDir.make<TH1D>("generatedZmass","mass of generated Z",100,0.,200.);
  153. h_muetaGen_ = genParticleDir.make<TH1D>("generatedMuonEta","#eta of generated muons from Z decay",100,-5.,5.);
  154. h_muptGen_ = genParticleDir.make<TH1D>("generatedMuonpt","pt of generated muons from Z decay",100,0.,200.);
  155. h_dimuonEtaGen_ = genParticleDir.make<TH1D>("generatedDimuonEta","#eta of generated dimuon",100,-5.,5.);
  156. h_dimuonPtGen_ = genParticleDir.make<TH1D>("generatedDimuonPt","pt of generated dimuon",100,0.,200.);
  157. h_dimuonMassGen_ = genParticleDir.make<TH1D>("generatedDimuonMass","mass of generated dimuon",100,0.,200.);
  158. h_ZetaGenPassed_ = genParticleDir.make<TH1D>("generatedZeta_passed","#eta of generated Z after cuts",100,-5.,5.);
  159. h_ZptGenPassed_ = genParticleDir.make<TH1D>("generatedZpt_passed","pt of generated Z after cuts",100,0.,200.);
  160. h_ZmassGenPassed_ = genParticleDir.make<TH1D>("generatedZmass_passed","mass of generated Z after cuts",100,0.,200.);
  161. h_muetaGenPassed_ = genParticleDir.make<TH1D>("generatedMuonEta_passed","#eta of generated muons from Z decay after cuts",100,-5.,5.);
  162. h_muptGenPassed_ = genParticleDir.make<TH1D>("generatedMuonpt_passed","pt of generated muons from Z decay after cuts",100,0.,200.);
  163. h_dimuonEtaGenPassed_ = genParticleDir.make<TH1D>("generatedDimuonEta_passed","#eta of generated dimuon after cuts",100,-5.,5.);
  164. h_dimuonPtGenPassed_ = genParticleDir.make<TH1D>("generatedDimuonPt_passed","pt of generated dimuon after cuts",100,0.,200.);
  165. h_dimuonMassGenPassed_ = genParticleDir.make<TH1D>("generatedDimuonMass_passed","mass of generated dimuon after cuts",100,0.,200.);
  166. // to insert isolation histograms ..............
  167. numberOfEventsWithZMuMufound = 0;
  168. numberOfEventsWithZMuStafound = 0;
  169. numberOfMatchedZMuMu_ = 0;
  170. numberOfMatchedSelectedZMuMu_ = 0;
  171. numberOfMatchedZMuSta_ = 0;
  172. numberOfMatchedSelectedZMuSta_ = 0;
  173. numberOfMatchedZMuTrack_matchedZMuMu = 0;
  174. numberOfMatchedZMuTrack_matchedSelectedZMuMu = 0;
  175. numberOfMatchedZMuTrack_exclusive = 0;
  176. numberOfMatchedSelectedZMuTrack_exclusive = 0;
  177. numberOfOverlappedStandAlone_ = 0;
  178. numberOfOverlappedTracks_ = 0;
  179. numberOfMatchedZMuTrack_notOverlapped = 0;
  180. noMCmatching = 0;
  181. ZMuTrack_exclusive_1match = 0;
  182. ZMuTrack_exclusive_morematch = 0;
  183. ZMuTrackselected_exclusive_1match = 0;
  184. ZMuTrackselected_exclusive_morematch = 0;
  185. ZMuTrack_ZMuMu_1match = 0;
  186. ZMuTrack_ZMuMu_2match = 0;
  187. ZMuTrack_ZMuMu_morematch = 0;
  188. n_zMuMufound_genZsele = 0;
  189. n_zMuStafound_genZsele = 0;
  190. n_zMuTrkfound_genZsele = 0;
  191. // generator counters
  192. totalNumberOfevents = 0;
  193. totalNumberOfZfound = 0;
  194. totalNumberOfZPassed = 0;
  195. }
  196. void ZMuMuEfficiency::analyze(const Event& event, const EventSetup& setup) {
  197. Handle<CandidateView> zMuMu;
  198. Handle<GenParticleMatch> zMuMuMatchMap; //Map of Z made by Mu global + Mu global
  199. Handle<CandidateView> zMuTrack;
  200. Handle<GenParticleMatch> zMuTrackMatchMap; //Map of Z made by Mu + Track
  201. Handle<CandidateView> zMuStandAlone;
  202. Handle<GenParticleMatch> zMuStandAloneMatchMap; //Map of Z made by Mu + StandAlone
  203. Handle<CandidateView> muons; //Collection of Muons
  204. Handle<GenParticleMatch> muonMatchMap;
  205. Handle<IsolationCollection> muonIso;
  206. Handle<CandidateView> tracks; //Collection of Tracks
  207. Handle<IsolationCollection> trackIso;
  208. Handle<CandidateView> standAlone; //Collection of StandAlone
  209. Handle<IsolationCollection> standAloneIso;
  210. Handle<GenParticleCollection> genParticles; // Collection of Generatd Particles
  211. event.getByLabel(zMuMu_, zMuMu);
  212. event.getByLabel(zMuTrack_, zMuTrack);
  213. event.getByLabel(zMuStandAlone_, zMuStandAlone);
  214. event.getByLabel(muons_, muons);
  215. event.getByLabel(tracks_, tracks);
  216. event.getByLabel(standAlone_, standAlone);
  217. event.getByLabel(genParticles_, genParticles);
  218. cout << "********* zMuMu size : " << zMuMu->size() << endl;
  219. cout << "********* zMuStandAlone size : " << zMuStandAlone->size() << endl;
  220. cout << "********* zMuTrack size : " << zMuTrack->size() << endl;
  221. cout << "********* muons size : " << muons->size()<< endl;
  222. cout << "********* standAlone size : " << standAlone->size()<< endl;
  223. cout << "********* tracks size : " << tracks->size()<< endl;
  224. cout << "********* generated size : " << genParticles->size()<< endl;
  225. // generator level distributions
  226. int nZMCfound = 0;
  227. totalNumberOfevents++;
  228. int ngen = genParticles->size();
  229. bool ZMuMuMatchedfound = false;
  230. bool ZMuMuMatchedSelectedfound = false;
  231. bool ZMuStaMatchedfound = false;
  232. //bool ZMuStaMatchedSelectedfound = false;
  233. int ZMuTrackMatchedfound = 0;
  234. int ZMuTrackMatchedSelected_exclusivefound = 0;
  235. double dimuonMassGen = 0;
  236. for (int i=0; i<ngen; i++) {
  237. const Candidate &genCand = (*genParticles)[i];
  238. // if((genCand.pdgId() == 23) && (genCand.status() == 2)) //this is an intermediate Z0
  239. // cout << ">>> intermediate Z0 found, with " << genCand.numberOfDaughters() << " daughters" << endl;
  240. if((genCand.pdgId() == 23)&&(genCand.status() == 3)) { //this is a Z0
  241. if(genCand.numberOfDaughters() == 3) { // possible Z0 decays in mu+ mu-, the 3rd daughter is the same Z0
  242. const Candidate * dauGen0 = genCand.daughter(0);
  243. const Candidate * dauGen1 = genCand.daughter(1);
  244. const Candidate * dauGen2 = genCand.daughter(2);
  245. if (check_ifZmumu(dauGen0, dauGen1, dauGen2)) { // Z0 in mu+ mu-
  246. totalNumberOfZfound++;
  247. nZMCfound++;
  248. bool checkpt = false;
  249. bool checketa = false;
  250. bool checkmass = false;
  251. float mupluspt, muminuspt, mupluseta, muminuseta;
  252. mupluspt = getParticlePt(-13,dauGen0,dauGen1,dauGen2);
  253. muminuspt = getParticlePt(13,dauGen0,dauGen1,dauGen2);
  254. mupluseta = getParticleEta(-13,dauGen0,dauGen1,dauGen2);
  255. muminuseta = getParticleEta(13,dauGen0,dauGen1,dauGen2);
  256. //float muplusphi = getParticlePhi(-13,dauGen0,dauGen1,dauGen2);
  257. //float muminusphi = getParticlePhi(13,dauGen0,dauGen1,dauGen2);
  258. Particle::LorentzVector pZ(0, 0, 0, 0);
  259. Particle::LorentzVector muplusp4 = getParticleP4(-13,dauGen0,dauGen1,dauGen2);
  260. Particle::LorentzVector muminusp4 = getParticleP4(13,dauGen0,dauGen1,dauGen2);
  261. pZ = muplusp4 + muminusp4;
  262. double dimuon_pt = sqrt(pZ.x()*pZ.x()+pZ.y()*pZ.y());
  263. double tan_theta_half = tan(atan(dimuon_pt/pZ.z())/2.);
  264. double dimuon_eta = 0.;
  265. if (tan_theta_half>0) dimuon_eta = -log(tan(tan_theta_half));
  266. if (tan_theta_half<=0) dimuon_eta = log(tan(-tan_theta_half));
  267. dimuonMassGen = pZ.mass(); // dimuon invariant Mass at Generator Level
  268. h_ZmassGen_->Fill(genCand.mass());
  269. h_ZetaGen_->Fill(genCand.eta());
  270. h_ZptGen_->Fill(genCand.pt());
  271. h_dimuonMassGen_->Fill(pZ.mass());
  272. h_dimuonEtaGen_->Fill(dimuon_eta);
  273. h_dimuonPtGen_->Fill(dimuon_pt);
  274. h_muetaGen_->Fill(mupluseta);
  275. h_muetaGen_->Fill(muminuseta);
  276. h_muptGen_->Fill(mupluspt);
  277. h_muptGen_->Fill(muminuspt);
  278. // dimuon 4-momentum
  279. // h_mDimuonMC->Fill(pZ.mass());
  280. // h_ZminusDimuonMassMC->Fill(genCand.mass()-pZ.mass());
  281. // h_DeltaPhiMC->Fill(deltaPhi(muplusphi,muminusphi));
  282. // if (dauGen2==23) float z_eta = dauGen2->eta();
  283. // if (dauGen2==23) float Zpt = dauGen2->pt();
  284. // h_DeltaPhivsZPtMC->Fill(DeltaPhi(muplusphi,muminusphi),ZPt);
  285. if (mupluspt > ptmin_ && muminuspt > ptmin_) checkpt = true;
  286. if (mupluseta < etamax_ && muminuseta < etamax_) checketa = true;
  287. if (genCand.mass()>zMassMin_ && genCand.mass()<zMassMax_) checkmass = true;
  288. if (checkpt && checketa && checkmass) {
  289. totalNumberOfZPassed++;
  290. h_ZmassGenPassed_->Fill(genCand.mass());
  291. h_ZetaGenPassed_->Fill(genCand.eta());
  292. h_ZptGenPassed_->Fill(genCand.pt());
  293. h_dimuonMassGenPassed_->Fill(pZ.mass());
  294. h_dimuonEtaGenPassed_->Fill(dimuon_eta);
  295. h_dimuonPtGenPassed_->Fill(dimuon_pt);
  296. h_muetaGenPassed_->Fill(mupluseta);
  297. h_muetaGenPassed_->Fill(muminuseta);
  298. h_muptGenPassed_->Fill(mupluspt);
  299. h_muptGenPassed_->Fill(muminuspt);
  300. if (zMuMu->size() > 0 ) {
  301. n_zMuMufound_genZsele++;
  302. }
  303. else if (zMuStandAlone->size() > 0 ) {
  304. n_zMuStafound_genZsele++;
  305. }
  306. else {
  307. n_zMuTrkfound_genZsele++;
  308. }
  309. }
  310. }
  311. }
  312. }
  313. }
  314. h_nZMCfound_->Fill(nZMCfound); // number of Z found in the event at generator level
  315. //TRACK efficiency (conto numero di eventi Zmumu global e ZmuSta (ricorda che sono due campioni esclusivi)
  316. if (zMuMu->size() > 0 ) {
  317. numberOfEventsWithZMuMufound++;
  318. event.getByLabel(zMuMuMatchMap_, zMuMuMatchMap);
  319. event.getByLabel(muonIso_, muonIso);
  320. event.getByLabel(standAloneIso_, standAloneIso);
  321. event.getByLabel(muonMatchMap_, muonMatchMap);
  322. for(unsigned int i = 0; i < zMuMu->size(); ++i) { //loop on candidates
  323. const Candidate & zMuMuCand = (*zMuMu)[i]; //the candidate
  324. CandidateBaseRef zMuMuCandRef = zMuMu->refAt(i);
  325. bool isMatched = false;
  326. GenParticleRef zMuMuMatch = (*zMuMuMatchMap)[zMuMuCandRef];
  327. if(zMuMuMatch.isNonnull()) { // ZMuMu matched
  328. isMatched = true;
  329. numberOfMatchedZMuMu_++;
  330. }
  331. CandidateBaseRef dau0 = zMuMuCand.daughter(0)->masterClone();
  332. CandidateBaseRef dau1 = zMuMuCand.daughter(1)->masterClone();
  333. if (isMatched) ZMuMuMatchedfound = true;
  334. // Cuts
  335. if((dau0->pt() > ptmin_) && (dau1->pt() > ptmin_) &&
  336. (fabs(dau0->eta()) < etamax_) && (fabs(dau1->eta()) < etamax_) &&
  337. (zMuMuCand.mass() > zMassMin_) && (zMuMuCand.mass() < zMassMax_) &&
  338. (isMatched)) {
  339. //The Z daughters are already matched!
  340. const double globalMuonIsolation0 = (*muonIso)[dau0];
  341. const double globalMuonIsolation1 = (*muonIso)[dau1];
  342. if((globalMuonIsolation0 < isomax_) && (globalMuonIsolation1 < isomax_)) { // ZMuMu matched and selected by cuts
  343. ZMuMuMatchedSelectedfound = true;
  344. numberOfMatchedSelectedZMuMu_++;
  345. h_etaStandAlone_->Fill(dau0->eta()); // StandAlone found dau0, eta
  346. h_etaStandAlone_->Fill(dau1->eta()); // StandAlone found dau1, eta
  347. h_etaMuonOverlappedToStandAlone_->Fill(dau0->eta()); // is global muon so dau0 is also found as a track, eta
  348. h_etaMuonOverlappedToStandAlone_->Fill(dau1->eta()); // is global muon so dau1 is also found as a track, eta
  349. h_ptStandAlone_->Fill(dau0->pt()); // StandAlone found dau0, pt
  350. h_ptStandAlone_->Fill(dau1->pt()); // StandAlone found dau1, pt
  351. h_ptMuonOverlappedToStandAlone_->Fill(dau0->pt()); // is global muon so dau0 is also found as a track, pt
  352. h_ptMuonOverlappedToStandAlone_->Fill(dau1->pt()); // is global muon so dau1 is also found as a track, pt
  353. h_etaTrack_->Fill(dau0->eta()); // Track found dau0, eta
  354. h_etaTrack_->Fill(dau1->eta()); // Track found dau1, eta
  355. h_etaMuonOverlappedToTrack_->Fill(dau0->eta()); // is global muon so dau0 is also found as a StandAlone, eta
  356. h_etaMuonOverlappedToTrack_->Fill(dau1->eta()); // is global muon so dau1 is also found as a StandAlone, eta
  357. h_ptTrack_->Fill(dau0->pt()); // Track found dau0, pt
  358. h_ptTrack_->Fill(dau1->pt()); // Track found dau1, pt
  359. h_ptMuonOverlappedToTrack_->Fill(dau0->pt()); // is global muon so dau0 is also found as a StandAlone, pt
  360. h_ptMuonOverlappedToTrack_->Fill(dau1->pt()); // is global muon so dau1 is also found as a StandAlone, pt
  361. h_DELTA_ZMuMuMassReco_dimuonMassGen_->Fill(zMuMuCand.mass()-dimuonMassGen);
  362. // check that the two muons are matched . .per ora è solo un mio controllo
  363. for(unsigned int j = 0; j < muons->size() ; ++j) {
  364. CandidateBaseRef muCandRef = muons->refAt(j);
  365. GenParticleRef muonMatch = (*muonMatchMap)[muCandRef];
  366. // if (muonMatch.isNonnull()) cout << "mu match n. " << j << endl;
  367. }
  368. }
  369. }
  370. }
  371. }
  372. if (zMuStandAlone->size() > 0) {
  373. numberOfEventsWithZMuStafound++;
  374. event.getByLabel(zMuStandAloneMatchMap_, zMuStandAloneMatchMap);
  375. event.getByLabel(muonIso_, muonIso);
  376. event.getByLabel(standAloneIso_, standAloneIso);
  377. event.getByLabel(muonMatchMap_, muonMatchMap);
  378. for(unsigned int i = 0; i < zMuStandAlone->size(); ++i) { //loop on candidates
  379. const Candidate & zMuStaCand = (*zMuStandAlone)[i]; //the candidate
  380. CandidateBaseRef zMuStaCandRef = zMuStandAlone->refAt(i);
  381. bool isMatched = false;
  382. GenParticleRef zMuStaMatch = (*zMuStandAloneMatchMap)[zMuStaCandRef];
  383. if(zMuStaMatch.isNonnull()) { // ZMuSta Macthed
  384. isMatched = true;
  385. ZMuStaMatchedfound = true;
  386. numberOfMatchedZMuSta_++;
  387. }
  388. CandidateBaseRef dau0 = zMuStaCand.daughter(0)->masterClone();
  389. CandidateBaseRef dau1 = zMuStaCand.daughter(1)->masterClone();
  390. // Cuts
  391. if((dau0->pt() > ptmin_) && (dau1->pt() > ptmin_) &&
  392. (fabs(dau0->eta()) < etamax_) && (fabs(dau1->eta()) < etamax_) &&
  393. (zMuStaCand.mass() > zMassMin_) && (zMuStaCand.mass() < zMassMax_) &&
  394. (isMatched)) {
  395. CandidateBaseRef standAloneMuonCandRef_, globalMuonCandRef_;
  396. if(dau0->isGlobalMuon()) {
  397. standAloneMuonCandRef_ = dau1;
  398. globalMuonCandRef_ = dau0;
  399. }
  400. if(dau1->isGlobalMuon()) {
  401. standAloneMuonCandRef_ = dau0;
  402. globalMuonCandRef_ = dau1;
  403. }
  404. const double globalMuonIsolation = (*muonIso)[globalMuonCandRef_];
  405. const double standAloneMuonIsolation = (*standAloneIso)[standAloneMuonCandRef_];
  406. if((globalMuonIsolation < isomax_) && (standAloneMuonIsolation < isomax_)) { // ZMuSta matched and selected
  407. //ZMuStaMatchedSelectedfound = true;
  408. numberOfMatchedSelectedZMuSta_++;
  409. h_etaStandAlone_->Fill(standAloneMuonCandRef_->eta()); //Denominator eta for measuring track efficiency
  410. h_ptStandAlone_->Fill(standAloneMuonCandRef_->pt()); //Denominator pt for measuring track eff
  411. h_DELTA_ZMuStaMassReco_dimuonMassGen_->Fill(zMuStaCand.mass()-dimuonMassGen); // differnce between ZMuSta reco and dimuon mass gen
  412. }
  413. }
  414. }
  415. } //end loop on Candidate
  416. //STANDALONE efficiency
  417. if (zMuTrack->size() > 0) {
  418. event.getByLabel(zMuTrackMatchMap_, zMuTrackMatchMap);
  419. event.getByLabel(muonIso_, muonIso);
  420. event.getByLabel(trackIso_, trackIso);
  421. event.getByLabel(muonMatchMap_, muonMatchMap);
  422. for(unsigned int i = 0; i < zMuTrack->size(); ++i) { //loop on candidates
  423. const Candidate & zMuTrkCand = (*zMuTrack)[i]; //the candidate
  424. CandidateBaseRef zMuTrkCandRef = zMuTrack->refAt(i);
  425. bool isMatched = false;
  426. GenParticleRef zMuTrkMatch = (*zMuTrackMatchMap)[zMuTrkCandRef];
  427. if(zMuTrkMatch.isNonnull()) {
  428. isMatched = true;
  429. }
  430. CandidateBaseRef dau0 = zMuTrkCand.daughter(0)->masterClone();
  431. CandidateBaseRef dau1 = zMuTrkCand.daughter(1)->masterClone();
  432. if (isMatched) {
  433. ZMuTrackMatchedfound++;
  434. if (ZMuMuMatchedfound) numberOfMatchedZMuTrack_matchedZMuMu++;
  435. if (ZMuMuMatchedSelectedfound) numberOfMatchedZMuTrack_matchedSelectedZMuMu++;
  436. if (!ZMuMuMatchedfound) numberOfMatchedZMuTrack_exclusive++;
  437. }
  438. // Cuts
  439. if ((dau0->pt() > ptmin_) && (dau1->pt() > ptmin_) &&
  440. (fabs(dau0->eta()) < etamax_) && (fabs(dau1->eta())< etamax_) &&
  441. (zMuTrkCand.mass() > zMassMin_) && (zMuTrkCand.mass() < zMassMax_) &&
  442. (isMatched) && !ZMuMuMatchedfound && !ZMuStaMatchedfound ) {
  443. // dau0 is always the global muon, dau1 is the track for ZMuTrack collection
  444. const double globalMuonIsolation = (*muonIso)[dau0];
  445. const double trackMuonIsolation = (*trackIso)[dau1];
  446. if((globalMuonIsolation < isomax_) && (trackMuonIsolation < isomax_)) { // ZMuTRack matched - selected without ZMuMu found (exclusive)
  447. numberOfMatchedSelectedZMuTrack_exclusive++;
  448. ZMuTrackMatchedSelected_exclusivefound++;
  449. h_etaTrack_->Fill(dau1->eta()); //Denominator eta Sta
  450. h_ptTrack_->Fill(dau1->pt()); //Denominator pt Sta
  451. h_DELTA_ZMuTrackMassReco_dimuonMassGen_->Fill(zMuTrkCand.mass()-dimuonMassGen);
  452. }
  453. }
  454. }
  455. } //end loop on Candidate
  456. if (!ZMuMuMatchedfound && !ZMuStaMatchedfound && ZMuTrackMatchedfound == 0) noMCmatching++;
  457. if (!ZMuMuMatchedfound && ZMuTrackMatchedfound == 1) ZMuTrack_exclusive_1match++;
  458. if (!ZMuMuMatchedfound && ZMuTrackMatchedfound > 1) ZMuTrack_exclusive_morematch++;
  459. if (!ZMuMuMatchedfound && ZMuTrackMatchedSelected_exclusivefound == 1) ZMuTrackselected_exclusive_1match++;
  460. if (!ZMuMuMatchedfound && ZMuTrackMatchedSelected_exclusivefound > 1) ZMuTrackselected_exclusive_morematch++;
  461. if (ZMuMuMatchedfound && ZMuTrackMatchedfound == 1) ZMuTrack_ZMuMu_1match++;
  462. if (ZMuMuMatchedfound && ZMuTrackMatchedfound == 2) ZMuTrack_ZMuMu_2match++;
  463. if (ZMuMuMatchedfound && ZMuTrackMatchedfound > 2) ZMuTrack_ZMuMu_morematch++;
  464. }
  465. bool ZMuMuEfficiency::check_ifZmumu(const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  466. {
  467. int partId0 = dauGen0->pdgId();
  468. int partId1 = dauGen1->pdgId();
  469. int partId2 = dauGen2->pdgId();
  470. bool muplusFound=false;
  471. bool muminusFound=false;
  472. bool ZFound=false;
  473. if (partId0==13 || partId1==13 || partId2==13) muminusFound=true;
  474. if (partId0==-13 || partId1==-13 || partId2==-13) muplusFound=true;
  475. if (partId0==23 || partId1==23 || partId2==23) ZFound=true;
  476. return muplusFound*muminusFound*ZFound;
  477. }
  478. float ZMuMuEfficiency::getParticlePt(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  479. {
  480. int partId0 = dauGen0->pdgId();
  481. int partId1 = dauGen1->pdgId();
  482. int partId2 = dauGen2->pdgId();
  483. float ptpart=0.;
  484. if (partId0 == ipart) {
  485. for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
  486. const Candidate * dauMuGen = dauGen0->daughter(k);
  487. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  488. ptpart = dauMuGen->pt();
  489. }
  490. }
  491. }
  492. if (partId1 == ipart) {
  493. for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
  494. const Candidate * dauMuGen = dauGen1->daughter(k);
  495. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  496. ptpart = dauMuGen->pt();
  497. }
  498. }
  499. }
  500. if (partId2 == ipart) {
  501. for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
  502. const Candidate * dauMuGen = dauGen2->daughter(k);
  503. if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
  504. ptpart = dauMuGen->pt();
  505. }
  506. }
  507. }
  508. return ptpart;
  509. }
  510. float ZMuMuEfficiency::getParticleEta(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  511. {
  512. int partId0 = dauGen0->pdgId();
  513. int partId1 = dauGen1->pdgId();
  514. int partId2 = dauGen2->pdgId();
  515. float etapart=0.;
  516. if (partId0 == ipart) {
  517. for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
  518. const Candidate * dauMuGen = dauGen0->daughter(k);
  519. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  520. etapart = dauMuGen->eta();
  521. }
  522. }
  523. }
  524. if (partId1 == ipart) {
  525. for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
  526. const Candidate * dauMuGen = dauGen1->daughter(k);
  527. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  528. etapart = dauMuGen->eta();
  529. }
  530. }
  531. }
  532. if (partId2 == ipart) {
  533. for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
  534. const Candidate * dauMuGen = dauGen2->daughter(k);
  535. if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
  536. etapart = dauMuGen->eta();
  537. }
  538. }
  539. }
  540. return etapart;
  541. }
  542. float ZMuMuEfficiency::getParticlePhi(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  543. {
  544. int partId0 = dauGen0->pdgId();
  545. int partId1 = dauGen1->pdgId();
  546. int partId2 = dauGen2->pdgId();
  547. float phipart=0.;
  548. if (partId0 == ipart) {
  549. for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
  550. const Candidate * dauMuGen = dauGen0->daughter(k);
  551. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  552. phipart = dauMuGen->phi();
  553. }
  554. }
  555. }
  556. if (partId1 == ipart) {
  557. for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
  558. const Candidate * dauMuGen = dauGen1->daughter(k);
  559. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  560. phipart = dauMuGen->phi();
  561. }
  562. }
  563. }
  564. if (partId2 == ipart) {
  565. for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
  566. const Candidate * dauMuGen = dauGen2->daughter(k);
  567. if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
  568. phipart = dauMuGen->phi();
  569. }
  570. }
  571. }
  572. return phipart;
  573. }
  574. Particle::LorentzVector ZMuMuEfficiency::getParticleP4(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
  575. {
  576. int partId0 = dauGen0->pdgId();
  577. int partId1 = dauGen1->pdgId();
  578. int partId2 = dauGen2->pdgId();
  579. Particle::LorentzVector p4part(0.,0.,0.,0.);
  580. if (partId0 == ipart) {
  581. for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
  582. const Candidate * dauMuGen = dauGen0->daughter(k);
  583. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  584. p4part = dauMuGen->p4();
  585. }
  586. }
  587. }
  588. if (partId1 == ipart) {
  589. for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
  590. const Candidate * dauMuGen = dauGen1->daughter(k);
  591. if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
  592. p4part = dauMuGen->p4();
  593. }
  594. }
  595. }
  596. if (partId2 == ipart) {
  597. for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
  598. const Candidate * dauMuGen = dauGen2->daughter(k);
  599. if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
  600. p4part = dauMuGen->p4();
  601. }
  602. }
  603. }
  604. return p4part;
  605. }
  606. void ZMuMuEfficiency::endJob() {
  607. // double efficiencySTA =(double)numberOfOverlappedStandAlone_/(double)numberOfMatchedZMuTrack_;
  608. // double errorEff_STA = sqrt( efficiencySTA*(1 - efficiencySTA)/(double)numberOfMatchedZMuTrack_);
  609. double myTrackEff = 2.*numberOfMatchedSelectedZMuMu_/(2.*numberOfMatchedSelectedZMuMu_+(double)numberOfMatchedSelectedZMuSta_);
  610. double myErrTrackEff = sqrt(myTrackEff*(1-myTrackEff)/(2.*numberOfMatchedSelectedZMuMu_+(double)numberOfMatchedSelectedZMuSta_));
  611. double myStaEff = 2.*numberOfMatchedSelectedZMuMu_/(2.*numberOfMatchedSelectedZMuMu_+(double)numberOfMatchedSelectedZMuTrack_exclusive);
  612. double myErrStaEff = sqrt(myTrackEff*(1-myTrackEff)/(2.*numberOfMatchedSelectedZMuMu_+(double)numberOfMatchedSelectedZMuTrack_exclusive));
  613. // double efficiencyTRACK =(double)numberOfOverlappedTracks_/(double)numberOfMatchedZMuSta_;
  614. // double errorEff_TRACK = sqrt( efficiencyTRACK*(1 - efficiencyTRACK)/(double)numberOfMatchedZMuSta_);
  615. cout << "------------------------------------ Counters for MC acceptance --------------------------------" << endl;
  616. cout << "totalNumberOfevents = " << totalNumberOfevents << endl;
  617. cout << "totalNumberOfZfound = " << totalNumberOfZfound << endl;
  618. cout << "totalNumberOfZpassed = " << totalNumberOfZPassed << endl;
  619. cout << "n. of events zMuMu found (gen level selected)" << n_zMuMufound_genZsele << endl;
  620. cout << "n. of events zMuSta found (gen level selected)" << n_zMuStafound_genZsele << endl;
  621. cout << "n. of events zMuTrk found (gen level selected)" << n_zMuTrkfound_genZsele << endl;
  622. cout << "---------------------------- Counter for MC truth efficiency calculation--------------------- " << endl;
  623. cout << "number of events with ZMuMu found = " << numberOfEventsWithZMuMufound << endl;
  624. cout << "number of events with ZMuSta found = " << numberOfEventsWithZMuStafound << endl;
  625. cout << "-------------------------------------------------------------------------------------- " << endl;
  626. cout << "number of events without MC maching = " << noMCmatching << endl;
  627. cout << "number of ZMuTrack exclsive 1 match = " << ZMuTrack_exclusive_1match << endl;
  628. cout << "number of ZMuTrack exclsive more match = " << ZMuTrack_exclusive_morematch << endl;
  629. cout << "number of ZMuTrack selected exclusive 1 match = " << ZMuTrackselected_exclusive_1match << endl;
  630. cout << "number of ZMuTrack selected exclusive more match = " << ZMuTrackselected_exclusive_morematch << endl;
  631. cout << "number of ZMuTrack ZMuMu 1 match = " << ZMuTrack_ZMuMu_1match << endl;
  632. cout << "number of ZMuTrack ZMuMu 2 match = " << ZMuTrack_ZMuMu_2match << endl;
  633. cout << "number of ZMuTrack ZMuMu more match = " << ZMuTrack_ZMuMu_morematch << endl;
  634. cout << "numberOfMatchedZMuMu = " << numberOfMatchedZMuMu_ << endl;
  635. cout << "numberOfMatchedSelectdZMuMu = " << numberOfMatchedSelectedZMuMu_ << endl;
  636. cout << "numberOfMatchedZMuSta = " << numberOfMatchedZMuSta_ << endl;
  637. cout << "numberOfMatchedSelectedZMuSta = " << numberOfMatchedSelectedZMuSta_ << endl;
  638. cout << "numberOfMatchedZMuTrack_matchedZMuMu = " << numberOfMatchedZMuTrack_matchedZMuMu << endl;
  639. cout << "numberOfMatchedZMuTrack_matchedSelectedZMuMu = " << numberOfMatchedZMuTrack_matchedSelectedZMuMu << endl;
  640. cout << "numberOfMatchedZMuTrack exclusive = " << numberOfMatchedZMuTrack_exclusive << endl;
  641. cout << "numberOfMatchedSelectedZMuTrack exclusive = " << numberOfMatchedSelectedZMuTrack_exclusive << endl;
  642. cout << " ----------------------------- Efficiency --------------------------------- " << endl;
  643. cout << "Efficiency StandAlone = " << myStaEff << " +/- " << myErrStaEff << endl;
  644. cout << "Efficiency Track = " << myTrackEff << " +/- " << myErrTrackEff << endl;
  645. }
  646. #include "FWCore/Framework/interface/MakerMacros.h"
  647. DEFINE_FWK_MODULE(ZMuMuEfficiency);