/ElectroWeakAnalysis/Skimming/plugins/ZMuMuUserData.cc

https://github.com/aivanov-cern/cmssw · C++ · 175 lines · 131 code · 32 blank · 12 comment · 9 complexity · ff9cc7d8e172bef910fbfeb577d1b3e4 MD5 · raw file

  1. #include "FWCore/Framework/interface/EDProducer.h"
  2. #include "FWCore/Utilities/interface/InputTag.h"
  3. #include "DataFormats/Common/interface/Handle.h"
  4. #include "FWCore/Framework/interface/Event.h"
  5. #include "FWCore/ParameterSet/interface/ParameterSet.h"
  6. #include "DataFormats/PatCandidates/interface/Muon.h"
  7. #include "DataFormats/PatCandidates/interface/CompositeCandidate.h"
  8. #include "FWCore/Utilities/interface/EDMException.h"
  9. #include "CommonTools/UtilAlgos/interface/TFileService.h"
  10. #include "DataFormats/RecoCandidate/interface/IsoDeposit.h"
  11. #include "DataFormats/RecoCandidate/interface/IsoDepositFwd.h"
  12. #include "DataFormats/PatCandidates/interface/Isolation.h"
  13. #include "DataFormats/RecoCandidate/interface/IsoDepositVetos.h"
  14. #include "DataFormats/RecoCandidate/interface/IsoDepositDirection.h"
  15. #include "DataFormats/BeamSpot/interface/BeamSpot.h"
  16. #include "DataFormats/VertexReco/interface/VertexFwd.h"
  17. #include "DataFormats/VertexReco/interface/Vertex.h"
  18. #include <vector>
  19. using namespace edm;
  20. using namespace std;
  21. using namespace reco;
  22. using namespace isodeposit;
  23. //using namespace pat;
  24. class ZMuMuUserData : public edm::EDProducer {
  25. public:
  26. ZMuMuUserData( const edm::ParameterSet & );
  27. typedef math::XYZVector Vector;
  28. private:
  29. void produce( edm::Event &, const edm::EventSetup & ) override;
  30. InputTag src_,beamSpot_, primaryVertices_, zGenParticlesMatch_;
  31. double alpha_, beta_;
  32. string hltPath_;
  33. int counter;
  34. };
  35. ZMuMuUserData::ZMuMuUserData( const ParameterSet & cfg ):
  36. src_( cfg.getParameter<InputTag>( "src" ) ),
  37. beamSpot_(cfg.getParameter<InputTag>( "beamSpot" ) ),
  38. primaryVertices_(cfg.getParameter<InputTag>( "primaryVertices" ) ),
  39. zGenParticlesMatch_(cfg.getParameter<InputTag>( "zGenParticlesMatch" ) ),
  40. alpha_(cfg.getParameter<double>("alpha") ),
  41. beta_(cfg.getParameter<double>("beta") ),
  42. hltPath_(cfg.getParameter<std::string >("hltPath") ){
  43. produces<vector<pat::CompositeCandidate> >();
  44. }
  45. void ZMuMuUserData::produce( Event & evt, const EventSetup & ) {
  46. Handle<std::vector<reco::CompositeCandidate> > dimuons;
  47. evt.getByLabel(src_,dimuons);
  48. Handle<BeamSpot> beamSpotHandle;
  49. evt.getByLabel(beamSpot_, beamSpotHandle);
  50. Handle<VertexCollection> primaryVertices; // Collection of primary Vertices
  51. evt.getByLabel(primaryVertices_, primaryVertices);
  52. bool isMCMatchTrue=false;
  53. Handle<GenParticleMatch> zGenParticlesMatch;
  54. if(evt.getByLabel( zGenParticlesMatch_, zGenParticlesMatch )){
  55. isMCMatchTrue=true;
  56. }
  57. //cout<<"isMCMatchTrue"<<isMCMatchTrue <<endl;
  58. auto_ptr<vector<pat::CompositeCandidate> > dimuonColl( new vector<pat::CompositeCandidate> () );
  59. for (unsigned int i = 0; i< dimuons->size();++i){
  60. const CompositeCandidate & z = (*dimuons)[i];
  61. //CandidateBaseRef zRef = dimuons ->refAt(i);
  62. edm::Ref<std::vector<reco::CompositeCandidate> > zRef(dimuons, i);
  63. pat::CompositeCandidate dimuon(z);
  64. float trueMass,truePt,trueEta,truePhi,trueY;
  65. if (isMCMatchTrue){
  66. GenParticleRef trueZRef = (*zGenParticlesMatch)[zRef];
  67. //CandidateRef trueZRef = trueZIter->val;
  68. if( trueZRef.isNonnull() ) {
  69. const Candidate & z = * trueZRef;
  70. trueMass = z.mass();
  71. truePt = z.pt();
  72. trueEta = z.eta();
  73. truePhi = z.phi();
  74. trueY = z.rapidity();
  75. } else {
  76. trueMass = -100;
  77. truePt = -100;
  78. trueEta = -100;
  79. truePhi = -100;
  80. trueY = -100;
  81. }
  82. dimuon.addUserFloat("TrueMass",trueMass);
  83. dimuon.addUserFloat("TruePt",truePt);
  84. dimuon.addUserFloat("TrueEta",trueEta);
  85. dimuon.addUserFloat("TruePhi",truePhi);
  86. dimuon.addUserFloat("TrueY",trueY);
  87. }
  88. const Candidate * dau1 = z.daughter(0);
  89. const Candidate * dau2 = z.daughter(1);
  90. const pat::Muon & mu1 = dynamic_cast<const pat::Muon&>(*dau1->masterClone());
  91. const pat::Muon & mu2 = dynamic_cast<const pat::Muon&>(*dau2->masterClone());
  92. /*cout<<"mu1 is null? "<<mu1.isMuon()<<endl;
  93. cout<<"mu2 is null? "<<mu2.isMuon()<<endl;
  94. cout<<"mu1 is global?"<<mu1.isGlobalMuon()<<endl;
  95. cout<<"mu2 is global?"<<mu2.isGlobalMuon()<<endl;
  96. */
  97. if(mu1.isGlobalMuon()==true && mu2.isGlobalMuon()==true){
  98. TrackRef stAloneTrack1;
  99. TrackRef stAloneTrack2;
  100. Vector momentum;
  101. Candidate::PolarLorentzVector p4_1;
  102. double mu_mass;
  103. stAloneTrack1 = dau1->get<TrackRef,reco::StandAloneMuonTag>();
  104. stAloneTrack2 = dau2->get<TrackRef,reco::StandAloneMuonTag>();
  105. float zDau1SaEta = stAloneTrack1->eta();
  106. float zDau2SaEta = stAloneTrack2->eta();
  107. float zDau1SaPhi = stAloneTrack1->phi();
  108. float zDau2SaPhi = stAloneTrack2->phi();
  109. float zDau1SaPt,zDau2SaPt;
  110. if(counter % 2 == 0) {
  111. momentum = stAloneTrack1->momentum();
  112. p4_1 = dau2->polarP4();
  113. mu_mass = dau1->mass();
  114. /// I fill the dau1 with positive and dau2 with negatove values for the pt, in order to flag the muons used for building zMassSa
  115. zDau1SaPt = stAloneTrack1->pt();
  116. zDau2SaPt = - stAloneTrack2->pt();
  117. }else{
  118. momentum = stAloneTrack2->momentum();
  119. p4_1= dau1->polarP4();
  120. mu_mass = dau2->mass();
  121. /// I fill the dau1 with negatove and dau2 with positive values for the pt
  122. zDau1SaPt = - stAloneTrack1->pt();
  123. zDau2SaPt = stAloneTrack2->pt();
  124. }
  125. Candidate::PolarLorentzVector p4_2(momentum.rho(), momentum.eta(),momentum.phi(), mu_mass);
  126. double mass = (p4_1+p4_2).mass();
  127. float zMassSa = mass;
  128. //cout<<"zMassSa "<<zMassSa;
  129. dimuon.addUserFloat("MassSa",zMassSa);
  130. dimuon.addUserFloat("Dau1SaPt",zDau1SaPt);
  131. dimuon.addUserFloat("Dau2SaPt",zDau2SaPt);
  132. dimuon.addUserFloat("Dau1SaPhi",zDau1SaPhi);
  133. dimuon.addUserFloat("Dau2SaPhi",zDau2SaPhi);
  134. dimuon.addUserFloat("Dau1SaEta",zDau1SaEta);
  135. dimuon.addUserFloat("Dau2SaEta",zDau2SaEta);
  136. ++counter;
  137. }
  138. dimuonColl->push_back(dimuon);
  139. }
  140. evt.put( dimuonColl);
  141. }
  142. #include "FWCore/Framework/interface/MakerMacros.h"
  143. DEFINE_FWK_MODULE( ZMuMuUserData );