/ElectroWeakAnalysis/ZMuMu/plugins/ZMuMu_radiative_analysis.cc

https://github.com/aivanov-cern/cmssw · C++ · 558 lines · 476 code · 59 blank · 23 comment · 79 complexity · cd7c36f24c1efd326ae42582bcc49626 MD5 · raw file

  1. /* \class ZMuMu_Radiative_analyzer
  2. *
  3. * author: Pasquale Noli
  4. *
  5. * ZMuMu Radiative analyzer
  6. *
  7. *
  8. */
  9. #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
  10. #include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
  11. #include "DataFormats/MuonReco/interface/Muon.h"
  12. #include "DataFormats/Common/interface/AssociationVector.h"
  13. #include "DataFormats/Candidate/interface/CandMatchMap.h"
  14. #include "DataFormats/Candidate/interface/Particle.h"
  15. #include "DataFormats/Candidate/interface/Candidate.h"
  16. #include "DataFormats/Candidate/interface/CandidateFwd.h"
  17. #include "DataFormats/Candidate/interface/OverlapChecker.h"
  18. #include "DataFormats/PatCandidates/interface/Muon.h"
  19. #include "DataFormats/PatCandidates/interface/Lepton.h"
  20. #include "DataFormats/PatCandidates/interface/GenericParticle.h"
  21. #include "DataFormats/PatCandidates/interface/TriggerObjectStandAlone.h"
  22. #include "DataFormats/PatCandidates/interface/PATObject.h"
  23. #include "DataFormats/RecoCandidate/interface/IsoDepositVetos.h"
  24. #include "DataFormats/RecoCandidate/interface/IsoDepositDirection.h"
  25. #include "DataFormats/RecoCandidate/interface/IsoDeposit.h"
  26. #include "DataFormats/RecoCandidate/interface/IsoDepositFwd.h"
  27. #include "DataFormats/PatCandidates/interface/Isolation.h"
  28. #include "DataFormats/Common/interface/Handle.h"
  29. #include "DataFormats/Common/interface/ValueMap.h"
  30. #include "DataFormats/Candidate/interface/CandAssociation.h"
  31. #include "FWCore/Framework/interface/EDAnalyzer.h"
  32. #include "FWCore/ParameterSet/interface/ParameterSet.h"
  33. #include "FWCore/Framework/interface/Event.h"
  34. #include "FWCore/Framework/interface/EventSetup.h"
  35. #include "FWCore/Utilities/interface/InputTag.h"
  36. #include "FWCore/ServiceRegistry/interface/Service.h"
  37. #include "CommonTools/UtilAlgos/interface/TFileService.h"
  38. #include <iostream>
  39. #include <iterator>
  40. #include <cmath>
  41. #include <vector>
  42. #include "TH1.h"
  43. #include "TH2.h"
  44. #include "TH3.h"
  45. using namespace edm;
  46. using namespace std;
  47. using namespace reco;
  48. using namespace isodeposit;
  49. class ZMuMu_Radiative_analyzer : public edm::EDAnalyzer {
  50. public:
  51. ZMuMu_Radiative_analyzer(const edm::ParameterSet& pset);
  52. private:
  53. virtual void analyze(const edm::Event& event, const edm::EventSetup& setup) override;
  54. virtual void endJob() override;
  55. edm::InputTag zMuMu_, zMuMuMatchMap_, zMuTk_, zMuTkMatchMap_,zMuSa_, zMuSaMatchMap_;
  56. double dRVeto_, dRTrk_, ptThreshold_;
  57. //histograms
  58. TH1D *h_zmass_FSR,*h_zmass_no_FSR;
  59. TH1D *h_zMuSamass_FSR,*h_zMuSamass_no_FSR;
  60. TH1D *h_zMuTkmass_FSR,*h_zMuTkmass_no_FSR;
  61. TH1D *h_Iso_,*h_Iso_FSR_ ;
  62. TH3D *h_Iso_3D_, *h_Iso_FSR_3D_;
  63. TH2D *h_staProbe_pt_eta_no_FSR_, *h_staProbe_pt_eta_FSR_, *h_ProbeOk_pt_eta_no_FSR_, *h_ProbeOk_pt_eta_FSR_;
  64. TH1D *h_trackProbe_eta_no_FSR, *h_trackProbe_pt_no_FSR, *h_staProbe_eta_no_FSR, *h_staProbe_pt_no_FSR, *h_ProbeOk_eta_no_FSR, *h_ProbeOk_pt_no_FSR;
  65. TH1D *h_trackProbe_eta_FSR, *h_trackProbe_pt_FSR, *h_staProbe_eta_FSR, *h_staProbe_pt_FSR, *h_ProbeOk_eta_FSR, *h_ProbeOk_pt_FSR;
  66. //boolean
  67. bool FSR_mu, FSR_tk, FSR_mu0, FSR_mu1;
  68. bool trig0found, trig1found;
  69. //counter
  70. int zmmcounter , zmscounter, zmtcounter, evntcounter;
  71. };
  72. typedef edm::ValueMap<float> IsolationCollection;
  73. ZMuMu_Radiative_analyzer::ZMuMu_Radiative_analyzer(const ParameterSet& pset) :
  74. zMuMu_(pset.getParameter<InputTag>("zMuMu")),
  75. zMuMuMatchMap_(pset.getParameter<InputTag>("zMuMuMatchMap")),
  76. zMuTk_(pset.getParameter<InputTag>("zMuTk")),
  77. zMuTkMatchMap_(pset.getParameter<InputTag>("zMuTkMatchMap")),
  78. zMuSa_(pset.getParameter<InputTag>("zMuSa")),
  79. zMuSaMatchMap_(pset.getParameter<InputTag>("zMuSaMatchMap")),
  80. dRVeto_(pset.getUntrackedParameter<double>("veto")),
  81. dRTrk_(pset.getUntrackedParameter<double>("deltaRTrk")),
  82. ptThreshold_(pset.getUntrackedParameter<double>("ptThreshold")){
  83. zmmcounter=0;
  84. zmscounter=0;
  85. zmtcounter=0;
  86. evntcounter=0;
  87. Service<TFileService> fs;
  88. // general histograms
  89. h_zmass_FSR= fs->make<TH1D>("h_zmass_FRS","Invariant Z mass distribution",200,0,200);
  90. h_zmass_no_FSR= fs->make<TH1D>("h_zmass_no_FSR","Invariant Z mass distribution",200,0,200);
  91. h_zMuSamass_FSR= fs->make<TH1D>("h_zMuSamass_FRS","Invariant Z mass distribution",200,0,200);
  92. h_zMuSamass_no_FSR= fs->make<TH1D>("h_zMuSamass_no_FSR","Invariant Z mass distribution",200,0,200);
  93. h_zMuTkmass_FSR= fs->make<TH1D>("h_zMuTkmass_FRS","Invariant Z mass distribution",200,0,200);
  94. h_zMuTkmass_no_FSR= fs->make<TH1D>("h_zMuTkmass_no_FSR","Invariant Z mass distribution",200,0,200);
  95. h_Iso_= fs->make<TH1D>("h_iso","Isolation distribution of muons without FSR",100,0,20);
  96. h_Iso_FSR_= fs->make<TH1D>("h_iso_FSR","Isolation distribution of muons with FSR ",100,0,20);
  97. h_Iso_3D_= fs->make<TH3D>("h_iso_3D","Isolation distribution of muons without FSR",100,20,100,100,-2.0,2.0,100,0,20);
  98. h_Iso_FSR_3D_= fs->make<TH3D>("h_iso_FSR_3D","Isolation distribution of muons with FSR ",100,20,100,100,-2.0,2.0,100,0,20);
  99. h_staProbe_pt_eta_no_FSR_= fs->make<TH2D>("h_staProbe_pt_eta_no_FSR","Pt vs Eta StandAlone without FSR ",100,20,100,100,-2.0,2.0);
  100. h_staProbe_pt_eta_FSR_= fs->make<TH2D>("h_staProbe_pt_eta_FSR","Pt vs Eta StandAlone with FSR ",100,20,100,100,-2.0,2.0);
  101. h_ProbeOk_pt_eta_no_FSR_= fs->make<TH2D>("h_ProbeOk_pt_eta_no_FSR","Pt vs Eta probeOk without FSR ",100,20,100,100,-2.0,2.0);
  102. h_ProbeOk_pt_eta_FSR_= fs->make<TH2D>("h_ProbeOk_pt_eta_FSR","Pt vs Eta probeOk with FSR ",100,20,100,100,-2.0,2.0);
  103. h_trackProbe_eta_no_FSR = fs->make<TH1D>("trackProbeEta_no_FSR","Eta of tracks",100,-2.0,2.0);
  104. h_trackProbe_pt_no_FSR = fs->make<TH1D>("trackProbePt_no_FSR","Pt of tracks",100,0,100);
  105. h_staProbe_eta_no_FSR = fs->make<TH1D>("standAloneProbeEta_no_FSR","Eta of standAlone",100,-2.0,2.0);
  106. h_staProbe_pt_no_FSR = fs->make<TH1D>("standAloneProbePt_no_FSR","Pt of standAlone",100,0,100);
  107. h_ProbeOk_eta_no_FSR = fs->make<TH1D>("probeOkEta_no_FSR","Eta of probe Ok",100,-2.0,2.0);
  108. h_ProbeOk_pt_no_FSR = fs->make<TH1D>("probeOkPt_no_FSR","Pt of probe ok",100,0,100);
  109. h_trackProbe_eta_FSR = fs->make<TH1D>("trackProbeEta_FSR","Eta of tracks",100,-2.0,2.0);
  110. h_trackProbe_pt_FSR = fs->make<TH1D>("trackProbePt_FSR","Pt of tracks",100,0,100);
  111. h_staProbe_eta_FSR = fs->make<TH1D>("standAloneProbeEta_FSR","Eta of standAlone",100,-2.0,2.0);
  112. h_staProbe_pt_FSR = fs->make<TH1D>("standAloneProbePt_FSR","Pt of standAlone",100,0,100);
  113. h_ProbeOk_eta_FSR = fs->make<TH1D>("probeOkEta_FSR","Eta of probe Ok",100,-2.0,2.0);
  114. h_ProbeOk_pt_FSR = fs->make<TH1D>("probeOkPt_FSR","Pt of probe ok",100,0,100);
  115. }
  116. void ZMuMu_Radiative_analyzer::analyze(const Event& event, const EventSetup& setup) {
  117. evntcounter++;
  118. Handle<CandidateView> zMuMu; //Collection of Z made by Mu global + Mu global
  119. Handle<GenParticleMatch> zMuMuMatchMap; //Map of Z made by Mu global + Mu global with MC
  120. event.getByLabel(zMuMu_, zMuMu);
  121. Handle<CandidateView> zMuTk; //Collection of Z made by Mu global + Track
  122. Handle<GenParticleMatch> zMuTkMatchMap;
  123. event.getByLabel(zMuTk_, zMuTk);
  124. Handle<CandidateView> zMuSa; //Collection of Z made by Mu global + Sa
  125. Handle<GenParticleMatch> zMuSaMatchMap;
  126. event.getByLabel(zMuSa_, zMuSa);
  127. cout << "********** New Event ***********"<<endl;
  128. // ZMuMu
  129. if (zMuMu->size() > 0 ) {
  130. event.getByLabel(zMuMuMatchMap_, zMuMuMatchMap);
  131. for(unsigned int i = 0; i < zMuMu->size(); ++i) { //loop on candidates
  132. const Candidate & zMuMuCand = (*zMuMu)[i]; //the candidate
  133. CandidateBaseRef zMuMuCandRef = zMuMu->refAt(i);
  134. CandidateBaseRef dau0 = zMuMuCand.daughter(0)->masterClone();
  135. CandidateBaseRef dau1 = zMuMuCand.daughter(1)->masterClone();
  136. const pat::Muon& mu0 = dynamic_cast<const pat::Muon&>(*dau0);//cast in patMuon
  137. const pat::Muon& mu1 = dynamic_cast<const pat::Muon&>(*dau1);
  138. double zmass= zMuMuCand.mass();
  139. double pt0 = mu0.pt();
  140. double pt1 = mu1.pt();
  141. double eta0 = mu0.eta();
  142. double eta1 = mu1.eta();
  143. if(pt0>20 && pt1 > 20 && abs(eta0)<2 && abs(eta1)<2 && zmass > 20 && zmass < 200){
  144. GenParticleRef zMuMuMatch = (*zMuMuMatchMap)[zMuMuCandRef];
  145. if(zMuMuMatch.isNonnull()) { // ZMuMu matched
  146. zmmcounter++;
  147. cout<<" Zmumu cuts && matched" <<endl;
  148. FSR_mu0 = false;
  149. FSR_mu1 = false;
  150. //Isodeposit
  151. const pat::IsoDeposit * mu0TrackIso =mu0.isoDeposit(pat::TrackIso);
  152. const pat::IsoDeposit * mu1TrackIso =mu1.isoDeposit(pat::TrackIso);
  153. Direction mu0Dir = Direction(mu0.eta(),mu0.phi());
  154. Direction mu1Dir = Direction(mu1.eta(),mu1.phi());
  155. reco::IsoDeposit::AbsVetos vetos_mu0;
  156. vetos_mu0.push_back(new ConeVeto( mu0Dir, dRVeto_ ));
  157. vetos_mu0.push_back(new ThresholdVeto( ptThreshold_ ));
  158. reco::IsoDeposit::AbsVetos vetos_mu1;
  159. vetos_mu1.push_back(new ConeVeto( mu1Dir, dRVeto_ ));
  160. vetos_mu1.push_back(new ThresholdVeto( ptThreshold_ ));
  161. double Tracker_isovalue_mu0 = mu0TrackIso->sumWithin(dRTrk_,vetos_mu0);
  162. double Tracker_isovalue_mu1 = mu1TrackIso->sumWithin(dRTrk_,vetos_mu1);
  163. //trigger study
  164. trig0found = false;
  165. trig1found = false;
  166. const pat::TriggerObjectStandAloneCollection mu0HLTMatches =
  167. mu0.triggerObjectMatchesByPath( "HLT_Mu9" );
  168. const pat::TriggerObjectStandAloneCollection mu1HLTMatches =
  169. mu1.triggerObjectMatchesByPath( "HLT_Mu9" );
  170. if( mu0HLTMatches.size()>0 )
  171. trig0found = true;
  172. if( mu1HLTMatches.size()>0 )
  173. trig1found = true;
  174. //MonteCarlo Study
  175. const reco::GenParticle * muMc0 = mu0.genLepton();
  176. const reco::GenParticle * muMc1 = mu1.genLepton();
  177. const Candidate * motherMu0 = muMc0->mother();
  178. int num_dau_muon0 = motherMu0->numberOfDaughters();
  179. const Candidate * motherMu1 = muMc1->mother();
  180. int num_dau_muon1 = motherMu1->numberOfDaughters();
  181. cout<<" muone0"<<endl;
  182. cout<<" num di daughters = "<< num_dau_muon0 <<endl;
  183. if( num_dau_muon0 > 1 ){
  184. for(int j = 0; j < num_dau_muon0; ++j){
  185. int id =motherMu0 ->daughter(j)->pdgId();
  186. cout<<" dauther["<<j<<"] pdgId = "<<id<<endl;
  187. if(id == 22) FSR_mu0=true;
  188. }
  189. }//end check of gamma
  190. cout<<" muone1"<<endl;
  191. cout<<" num di daughters = "<< num_dau_muon1 <<endl;
  192. if( num_dau_muon1 > 1 ){
  193. for(int j = 0; j < num_dau_muon1; ++j){
  194. int id = motherMu1->daughter(j)->pdgId();
  195. cout<<" dauther["<<j<<"] pdgId = "<<id<<endl;
  196. if(id == 22) FSR_mu1=true;
  197. }
  198. }//end check of gamma
  199. if(FSR_mu0 || FSR_mu1 )h_zmass_FSR->Fill(zmass);
  200. else h_zmass_no_FSR->Fill(zmass);
  201. if (trig1found) { // check efficiency of muon0 not imposing the trigger on it
  202. cout<<"muon 1 is triggered "<<endl;
  203. if(FSR_mu0){
  204. cout<< "and muon 0 does FSR"<<endl;
  205. h_trackProbe_eta_FSR->Fill(eta0);
  206. h_trackProbe_pt_FSR->Fill(pt0);
  207. h_staProbe_eta_FSR->Fill(eta0);
  208. h_staProbe_pt_FSR->Fill(pt0);
  209. h_staProbe_pt_eta_FSR_->Fill(pt0,eta0);
  210. h_ProbeOk_eta_FSR->Fill(eta0);
  211. h_ProbeOk_pt_FSR->Fill(pt0);
  212. h_ProbeOk_pt_eta_FSR_->Fill(pt0,eta0);
  213. }else{
  214. cout<<"and muon 0 doesn't FSR"<<endl;
  215. h_trackProbe_eta_no_FSR->Fill(eta0);
  216. h_trackProbe_pt_no_FSR->Fill(pt0);
  217. h_staProbe_eta_no_FSR->Fill(eta0);
  218. h_staProbe_pt_no_FSR->Fill(pt0);
  219. h_staProbe_pt_eta_no_FSR_->Fill(pt0,eta0);
  220. h_ProbeOk_eta_no_FSR->Fill(eta0);
  221. h_ProbeOk_pt_no_FSR->Fill(pt0);
  222. h_ProbeOk_pt_eta_no_FSR_->Fill(pt0,eta0);
  223. }
  224. if(FSR_mu0){
  225. h_Iso_FSR_->Fill(Tracker_isovalue_mu0);
  226. h_Iso_FSR_3D_->Fill(pt0,eta0,Tracker_isovalue_mu0);
  227. }
  228. else{
  229. h_Iso_->Fill(Tracker_isovalue_mu0);
  230. h_Iso_3D_->Fill(pt0,eta0,Tracker_isovalue_mu0);
  231. }
  232. }
  233. if (trig0found) { // check efficiency of muon1 not imposing the trigger on it
  234. cout<<"muon 0 is triggered"<<endl;
  235. if(FSR_mu1){
  236. cout<<"and muon 1 does FSR"<<endl;
  237. h_trackProbe_eta_FSR->Fill(eta1);
  238. h_staProbe_eta_FSR->Fill(eta1);
  239. h_trackProbe_pt_FSR->Fill(pt1);
  240. h_staProbe_pt_FSR->Fill(pt1);
  241. h_ProbeOk_eta_FSR->Fill(eta1);
  242. h_ProbeOk_pt_FSR->Fill(pt1);
  243. h_staProbe_pt_eta_FSR_->Fill(pt1,eta1);
  244. h_ProbeOk_pt_eta_FSR_->Fill(pt1,eta1);
  245. }else{
  246. cout<<"and muon 1 doesn't FSR"<<endl;
  247. h_trackProbe_eta_no_FSR->Fill(eta1);
  248. h_staProbe_eta_no_FSR->Fill(eta1);
  249. h_trackProbe_pt_no_FSR->Fill(pt1);
  250. h_staProbe_pt_no_FSR->Fill(pt1);
  251. h_ProbeOk_eta_no_FSR->Fill(eta1);
  252. h_ProbeOk_pt_no_FSR->Fill(pt1);
  253. h_staProbe_pt_eta_no_FSR_->Fill(pt1,eta1);
  254. h_ProbeOk_pt_eta_no_FSR_->Fill(pt1,eta1);
  255. }
  256. if(FSR_mu1){
  257. h_Iso_FSR_->Fill(Tracker_isovalue_mu1);
  258. h_Iso_FSR_3D_->Fill(pt1,eta1,Tracker_isovalue_mu1);
  259. }else{
  260. h_Iso_->Fill(Tracker_isovalue_mu1);
  261. h_Iso_3D_->Fill(pt1,eta1,Tracker_isovalue_mu1);
  262. }
  263. }
  264. }// end MC match
  265. }//end of cuts
  266. }// end loop on ZMuMu cand
  267. }// end if ZMuMu size > 0
  268. // ZMuSa
  269. if (zMuSa->size() > 0 ) {
  270. event.getByLabel(zMuSaMatchMap_, zMuSaMatchMap);
  271. for(unsigned int i = 0; i < zMuSa->size(); ++i) { //loop on candidates
  272. const Candidate & zMuSaCand = (*zMuSa)[i]; //the candidate
  273. CandidateBaseRef zMuSaCandRef = zMuSa->refAt(i);
  274. const Candidate * lep0 =zMuSaCand.daughter(0);
  275. const Candidate * lep1 =zMuSaCand.daughter(1);
  276. CandidateBaseRef dau0 = lep0->masterClone();
  277. CandidateBaseRef dau1 = lep1->masterClone();
  278. const pat::Muon& mu0 = dynamic_cast<const pat::Muon&>(*dau0);//cast in patMuon
  279. const pat::Muon& mu1 = dynamic_cast<const pat::Muon&>(*dau1);
  280. double zmass= zMuSaCand.mass();
  281. double pt0 = mu0.pt();
  282. double pt1 = mu1.pt();
  283. double eta0 = mu0.eta();
  284. double eta1 = mu1.eta();
  285. if(pt0>20 && pt1 > 20 && abs(eta0)<2 && abs(eta1)<2 && zmass > 20 && zmass < 200){
  286. GenParticleRef zMuSaMatch = (*zMuSaMatchMap)[zMuSaCandRef];
  287. if(zMuSaMatch.isNonnull()) { // ZMuSa matched
  288. cout<<" Zmusa cuts && matched" <<endl;
  289. FSR_mu0 = false;
  290. FSR_mu1 = false;
  291. zmscounter++;
  292. //Isodeposit
  293. const pat::IsoDeposit * mu0TrackIso =mu0.isoDeposit(pat::TrackIso);
  294. const pat::IsoDeposit * mu1TrackIso =mu1.isoDeposit(pat::TrackIso);
  295. Direction mu0Dir = Direction(mu0.eta(),mu0.phi());
  296. Direction mu1Dir = Direction(mu1.eta(),mu1.phi());
  297. reco::IsoDeposit::AbsVetos vetos_mu0;
  298. vetos_mu0.push_back(new ConeVeto( mu0Dir, dRVeto_ ));
  299. vetos_mu0.push_back(new ThresholdVeto( ptThreshold_ ));
  300. reco::IsoDeposit::AbsVetos vetos_mu1;
  301. vetos_mu1.push_back(new ConeVeto( mu1Dir, dRVeto_ ));
  302. vetos_mu1.push_back(new ThresholdVeto( ptThreshold_ ));
  303. double Tracker_isovalue_mu0 = mu0TrackIso->sumWithin(dRTrk_,vetos_mu0);
  304. double Tracker_isovalue_mu1 = mu1TrackIso->sumWithin(dRTrk_,vetos_mu1);
  305. // HLT match (check just dau0 the global)
  306. const pat::TriggerObjectStandAloneCollection mu0HLTMatches =
  307. mu0.triggerObjectMatchesByPath( "HLT_Mu9" );
  308. const pat::TriggerObjectStandAloneCollection mu1HLTMatches =
  309. mu1.triggerObjectMatchesByPath( "HLT_Mu9" );
  310. trig0found = false;
  311. trig1found = false;
  312. if( mu0HLTMatches.size()>0 )
  313. trig0found = true;
  314. if( mu1HLTMatches.size()>0 )
  315. trig1found = true;
  316. //MonteCarlo Study
  317. const reco::GenParticle * muMc0 = mu0.genLepton();
  318. const reco::GenParticle * muMc1 = mu1.genLepton();
  319. const Candidate * motherMu0 = muMc0->mother();
  320. const Candidate * motherMu1 = muMc1->mother();
  321. int num_dau_muon0 = motherMu0->numberOfDaughters();
  322. int num_dau_muon1 = motherMu1->numberOfDaughters();
  323. cout<<" muone0"<<endl;
  324. cout<<" num di daughters = "<< num_dau_muon0 <<endl;
  325. if( num_dau_muon0 > 1 ){
  326. for(int j = 0; j < num_dau_muon0; ++j){
  327. int id =motherMu0 ->daughter(j)->pdgId();
  328. cout<<" dauther["<<j<<"] pdgId = "<<id<<endl;
  329. if(id == 22) FSR_mu0=true;
  330. }
  331. }//end check of gamma
  332. cout<<" muone1"<<endl;
  333. cout<<" num di daughters = "<< num_dau_muon1 <<endl;
  334. if( num_dau_muon1 > 1 ){
  335. for(int j = 0; j < num_dau_muon1; ++j){
  336. int id = motherMu1->daughter(j)->pdgId();
  337. cout<<" dauther["<<j<<"] pdgId = "<<id<<endl;
  338. if(id == 22) FSR_mu1=true;
  339. }
  340. }//end check of gamma
  341. if(FSR_mu0 || FSR_mu1 )h_zMuSamass_FSR->Fill(zmass);
  342. else h_zMuSamass_no_FSR->Fill(zmass);
  343. if(lep0->isGlobalMuon() && trig0found){
  344. if(FSR_mu1){
  345. h_staProbe_eta_FSR->Fill(eta1);
  346. h_staProbe_pt_FSR->Fill(pt1);
  347. h_staProbe_pt_eta_FSR_->Fill(pt1,eta1);
  348. }else{
  349. h_staProbe_eta_no_FSR->Fill(eta1);
  350. h_staProbe_pt_no_FSR->Fill(pt1);
  351. h_staProbe_pt_eta_no_FSR_->Fill(pt1,eta1);
  352. }
  353. if(FSR_mu1){
  354. h_Iso_FSR_->Fill(Tracker_isovalue_mu1);
  355. h_Iso_FSR_3D_->Fill(pt1,eta1,Tracker_isovalue_mu1);
  356. }
  357. else{
  358. h_Iso_->Fill(Tracker_isovalue_mu1);
  359. h_Iso_3D_->Fill(pt1,eta1,Tracker_isovalue_mu1);
  360. }
  361. }
  362. if(lep1->isGlobalMuon() && trig1found){
  363. if(FSR_mu0){
  364. h_staProbe_eta_FSR->Fill(eta0);
  365. h_staProbe_pt_FSR->Fill(pt0);
  366. h_staProbe_pt_eta_FSR_->Fill(pt0,eta0);
  367. }else{
  368. h_staProbe_eta_no_FSR->Fill(eta0);
  369. h_staProbe_pt_no_FSR->Fill(pt0);
  370. h_staProbe_pt_eta_FSR_->Fill(pt0,eta0);
  371. }
  372. if(FSR_mu0){
  373. h_Iso_FSR_->Fill(Tracker_isovalue_mu0);
  374. h_Iso_FSR_3D_->Fill(pt0,eta0,Tracker_isovalue_mu0);
  375. }
  376. else{
  377. h_Iso_->Fill(Tracker_isovalue_mu0);
  378. h_Iso_3D_->Fill(pt0,eta0,Tracker_isovalue_mu0);
  379. }
  380. }
  381. }// end MC match
  382. }//end of cuts
  383. }// end loop on ZMuSa cand
  384. }// end if ZMuSa size > 0
  385. //ZMuTk
  386. if (zMuTk->size() > 0 ) {
  387. event.getByLabel(zMuTkMatchMap_, zMuTkMatchMap);
  388. for(unsigned int i = 0; i < zMuTk->size(); ++i) { //loop on candidates
  389. const Candidate & zMuTkCand = (*zMuTk)[i]; //the candidate
  390. CandidateBaseRef zMuTkCandRef = zMuTk->refAt(i);
  391. CandidateBaseRef dau0 = zMuTkCand.daughter(0)->masterClone();
  392. CandidateBaseRef dau1 = zMuTkCand.daughter(1)->masterClone();
  393. const pat::Muon& mu0 = dynamic_cast<const pat::Muon&>(*dau0);//cast in patMuon
  394. const pat::GenericParticle& mu1 = dynamic_cast<const pat::GenericParticle &>(*dau1);
  395. double zmass= zMuTkCand.mass();
  396. double pt0 = mu0.pt();
  397. double pt1 = mu1.pt();
  398. double eta0 = mu0.eta();
  399. double eta1 = mu1.eta();
  400. if(pt0>20 && pt1 > 20 && abs(eta0)<2 && abs(eta1)<2 && zmass > 20 && zmass < 200){//kinematical cuts
  401. GenParticleRef zMuTkMatch = (*zMuTkMatchMap)[zMuTkCandRef];
  402. if(zMuTkMatch.isNonnull()) { // ZMuTk matched
  403. FSR_mu = false;
  404. FSR_tk = false;
  405. cout<<" ZmuTk cuts && matched"<<endl;
  406. zmtcounter++;
  407. //Isodeposit
  408. const pat::IsoDeposit * muTrackIso =mu0.isoDeposit(pat::TrackIso);
  409. const pat::IsoDeposit * tkTrackIso =mu1.isoDeposit(pat::TrackIso);
  410. Direction muDir = Direction(mu0.eta(),mu0.phi());
  411. Direction tkDir = Direction(mu1.eta(),mu1.phi());
  412. IsoDeposit::AbsVetos vetos_mu;
  413. vetos_mu.push_back(new ConeVeto( muDir, dRVeto_ ));
  414. vetos_mu.push_back(new ThresholdVeto( ptThreshold_ ));
  415. reco::IsoDeposit::AbsVetos vetos_tk;
  416. vetos_tk.push_back(new ConeVeto( tkDir, dRVeto_ ));
  417. vetos_tk.push_back(new ThresholdVeto( ptThreshold_ ));
  418. double Tracker_isovalue_mu = muTrackIso->sumWithin(dRTrk_,vetos_mu);
  419. double Tracker_isovalue_tk = tkTrackIso->sumWithin(dRTrk_,vetos_tk);
  420. //MonteCarlo Study
  421. const reco::GenParticle * muMc0 = mu0.genLepton();
  422. const reco::GenParticle * muMc1 = mu1.genParticle() ;
  423. const Candidate * motherMu0 = muMc0->mother();
  424. const Candidate * motherMu1 = muMc1->mother();
  425. int num_dau_muon0 = motherMu0->numberOfDaughters();
  426. int num_dau_muon1 = motherMu1->numberOfDaughters();
  427. cout<<"numero di figli muone0 = " << num_dau_muon0 <<endl;
  428. cout<<"numero di figli muone1 = " << num_dau_muon1 <<endl;
  429. cout<<" muon"<<endl;
  430. cout<<" num di daughters = "<< num_dau_muon0 <<endl;
  431. if( num_dau_muon0 > 1 ){
  432. for(int j = 0; j < num_dau_muon0; ++j){
  433. int id = motherMu0->daughter(j)->pdgId();
  434. cout<<" dau["<<j<<"] pdg ID = "<<id<<endl;
  435. if(id == 22) {
  436. FSR_mu=true;
  437. }
  438. }
  439. }//end check of gamma
  440. else cout<<" dau[0] pdg ID = "<<motherMu0->daughter(0)->pdgId()<<endl;
  441. cout<<" traccia"<<endl;
  442. cout<<" num di daughters = "<< num_dau_muon1 <<endl;
  443. if( num_dau_muon1 > 1 ){
  444. for(int j = 0; j < num_dau_muon1; ++j){
  445. int id = motherMu1->daughter(j)->pdgId();
  446. cout<<" dau["<<j<<"] pdg ID = "<<id<<endl;
  447. if(id == 22) {
  448. FSR_tk=true;
  449. }
  450. }
  451. }//end check of gamma
  452. else cout<<" dau[0] pdg ID = "<<motherMu1->daughter(0)->pdgId()<<endl;
  453. cout<<"Mu Isolation = "<< Tracker_isovalue_mu <<endl;
  454. cout<<"Track Isolation = "<< Tracker_isovalue_tk <<endl;
  455. if(FSR_mu){
  456. h_Iso_FSR_->Fill(Tracker_isovalue_mu);
  457. h_Iso_FSR_3D_->Fill(pt0,eta0,Tracker_isovalue_mu);
  458. }
  459. else{
  460. h_Iso_->Fill( Tracker_isovalue_mu);
  461. h_Iso_3D_->Fill(pt0,eta0,Tracker_isovalue_mu);
  462. }
  463. if(FSR_tk){
  464. h_Iso_FSR_->Fill(Tracker_isovalue_tk);
  465. h_Iso_FSR_3D_->Fill(pt1,eta1,Tracker_isovalue_tk);
  466. h_trackProbe_eta_FSR->Fill(eta1);
  467. h_trackProbe_pt_FSR->Fill(pt1);
  468. }
  469. else{
  470. h_Iso_->Fill( Tracker_isovalue_tk);
  471. h_Iso_3D_->Fill(pt1,eta1,Tracker_isovalue_tk);
  472. h_trackProbe_eta_no_FSR->Fill(eta1);
  473. h_trackProbe_pt_no_FSR->Fill(pt1);
  474. }
  475. }// end MC match
  476. }//end Kine-cuts
  477. }// end loop on ZMuTk cand
  478. }// end if ZMuTk size > 0
  479. }// end analyze
  480. void ZMuMu_Radiative_analyzer::endJob() {
  481. cout<<" ============= Summary =========="<<endl;
  482. cout <<" Numero di eventi "<< evntcounter << endl;
  483. cout <<" 1)Numero di ZMuMu matched dopo i tagli cinematici = "<< zmmcounter << endl;
  484. cout <<" 2)Numero di ZMuSa matched dopo i tagli cinematici = "<< zmscounter << endl;
  485. cout <<" 3)Numero di ZMuTk matched dopo i tagli cinematici = "<< zmtcounter << endl;
  486. double n1= h_Iso_FSR_->Integral();
  487. double icut1= h_Iso_FSR_->Integral(0,15);
  488. double eff_iso_FSR = (double)icut1/(double)n1;
  489. double err_iso_FSR = sqrt(eff_iso_FSR*(1-eff_iso_FSR)/n1);
  490. double n2= h_Iso_->Integral();
  491. double icut2= h_Iso_->Integral(0,15);
  492. double eff_iso= (double)icut2/(double)n2;
  493. double err_iso = sqrt(eff_iso*(1-eff_iso)/n2);
  494. cout<<" ============= Isolation Efficiecy =========="<<endl;
  495. cout<<"Isolation Efficiency = "<< eff_iso <<" +/- "<< err_iso <<endl;
  496. cout<<"Isolation Efficiency with FSR = "<< eff_iso_FSR <<" +/- "<< err_iso_FSR <<endl;
  497. }
  498. #include "FWCore/Framework/interface/MakerMacros.h"
  499. DEFINE_FWK_MODULE(ZMuMu_Radiative_analyzer);