/ElectroWeakAnalysis/Skimming/plugins/ZMuMuTrackUserData.cc

https://github.com/aivanov-cern/cmssw · C++ · 175 lines · 134 code · 34 blank · 7 comment · 2 complexity · 1ef77217be26d978ca6d09d17c6420a0 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/GenericParticle.h"
  7. #include "FWCore/Utilities/interface/EDMException.h"
  8. #include "DataFormats/RecoCandidate/interface/IsoDeposit.h"
  9. #include "DataFormats/RecoCandidate/interface/IsoDepositFwd.h"
  10. #include "DataFormats/PatCandidates/interface/Isolation.h"
  11. #include "DataFormats/RecoCandidate/interface/IsoDepositVetos.h"
  12. #include "DataFormats/RecoCandidate/interface/IsoDepositDirection.h"
  13. #include "DataFormats/BeamSpot/interface/BeamSpot.h"
  14. #include "DataFormats/VertexReco/interface/VertexFwd.h"
  15. #include "DataFormats/VertexReco/interface/Vertex.h"
  16. #include <vector>
  17. using namespace edm;
  18. using namespace std;
  19. using namespace reco;
  20. using namespace isodeposit;
  21. //using namespace pat;
  22. class ZMuMuTrackUserData : public edm::EDProducer {
  23. public:
  24. ZMuMuTrackUserData( const edm::ParameterSet & );
  25. private:
  26. void produce( edm::Event &, const edm::EventSetup & ) override;
  27. InputTag src_,beamSpot_, primaryVertices_;
  28. double ptThreshold_, etEcalThreshold_, etHcalThreshold_ ,dRVetoTrk_, dRTrk_, dREcal_ , dRHcal_;
  29. double alpha_, beta_;
  30. template<typename T>
  31. vector<double> isolation(const T & t, double ptThreshold, double etEcalThreshold, double etHcalThreshold , double dRVetoTrk, double dRTrk, double dREcal , double dRHcal, double alpha, double beta);
  32. };
  33. template<typename T>
  34. vector<double> ZMuMuTrackUserData::isolation(const T & t, double ptThreshold, double etEcalThreshold, double etHcalThreshold , double dRVetoTrk, double dRTrk, double dREcal , double dRHcal, double alpha, double beta) {
  35. vector<double> iso;
  36. const pat::IsoDeposit * trkIso = t.isoDeposit(pat::TrackIso);
  37. const pat::IsoDeposit * ecalIso = t.isoDeposit(pat::EcalIso);
  38. const pat::IsoDeposit * hcalIso = t.isoDeposit(pat::HcalIso);
  39. Direction dir = Direction(t.eta(), t.phi());
  40. pat::IsoDeposit::AbsVetos vetosTrk;
  41. vetosTrk.push_back(new ConeVeto( dir, dRVetoTrk ));
  42. vetosTrk.push_back(new ThresholdVeto( ptThreshold ));
  43. pat::IsoDeposit::AbsVetos vetosEcal;
  44. vetosEcal.push_back(new ConeVeto( dir, 0.));
  45. vetosEcal.push_back(new ThresholdVeto( etEcalThreshold ));
  46. pat::IsoDeposit::AbsVetos vetosHcal;
  47. vetosHcal.push_back(new ConeVeto( dir, 0. ));
  48. vetosHcal.push_back(new ThresholdVeto( etHcalThreshold ));
  49. double isovalueTrk = (trkIso->sumWithin(dRTrk,vetosTrk));
  50. double isovalueEcal = (ecalIso->sumWithin(dREcal,vetosEcal));
  51. double isovalueHcal = (hcalIso->sumWithin(dRHcal,vetosHcal));
  52. iso.push_back(isovalueTrk);
  53. iso.push_back(isovalueEcal);
  54. iso.push_back(isovalueHcal);
  55. //double iso = isovalueTrk + isovalueEcal + isovalueHcal;
  56. double combIso = alpha*( ((1+beta)/2*isovalueEcal) + ((1-beta)/2*isovalueHcal) ) + ((1-alpha)*isovalueTrk);
  57. iso.push_back(combIso);
  58. double relIso = combIso /= t.pt();
  59. iso.push_back(relIso);
  60. return iso;
  61. }
  62. ZMuMuTrackUserData::ZMuMuTrackUserData( const ParameterSet & cfg ):
  63. src_( cfg.getParameter<InputTag>( "src" ) ),
  64. beamSpot_(cfg.getParameter<InputTag>( "beamSpot" ) ),
  65. primaryVertices_(cfg.getParameter<InputTag>( "primaryVertices" ) ),
  66. ptThreshold_(cfg.getParameter<double >("ptThreshold") ),
  67. etEcalThreshold_(cfg.getParameter<double >("etEcalThreshold") ),
  68. etHcalThreshold_(cfg.getParameter<double >("etHcalThreshold") ),
  69. dRVetoTrk_(cfg.getParameter<double >("dRVetoTrk") ),
  70. dRTrk_(cfg.getParameter<double >("dRTrk") ),
  71. dREcal_(cfg.getParameter<double >("dREcal") ),
  72. dRHcal_(cfg.getParameter<double >("dRHcal") ),
  73. alpha_(cfg.getParameter<double>("alpha") ),
  74. beta_(cfg.getParameter<double>("beta") ){
  75. produces<std::vector<pat::GenericParticle> >();
  76. }
  77. void ZMuMuTrackUserData::produce( Event & evt, const EventSetup & ) {
  78. Handle<vector<pat::GenericParticle> > tracks;
  79. evt.getByLabel(src_,tracks);
  80. Handle<BeamSpot> beamSpotHandle;
  81. evt.getByLabel(beamSpot_, beamSpotHandle);
  82. Handle<VertexCollection> primaryVertices; // Collection of primary Vertices
  83. evt.getByLabel(primaryVertices_, primaryVertices);
  84. auto_ptr<vector<pat::GenericParticle> > tkColl( new vector<pat::GenericParticle> (*tracks) );
  85. for (unsigned int i = 0; i< tkColl->size();++i){
  86. pat::GenericParticle & tk = (*tkColl)[i];
  87. vector<double> iso = isolation(tk,ptThreshold_, etEcalThreshold_, etHcalThreshold_ ,dRVetoTrk_, dRTrk_, dREcal_ , dRHcal_, alpha_, beta_);
  88. tk.setIsolation(pat::User1Iso, iso[0]);
  89. // cout << "track User1Iso " << iso[0] << endl;
  90. tk.setIsolation(pat::User2Iso, iso[1]);
  91. //cout << "track User2Iso " << iso[1] << endl;
  92. tk.setIsolation(pat::User3Iso, iso[2]);
  93. //cout << "track User3Iso " << iso[2] << endl;
  94. tk.setIsolation(pat::User4Iso, iso[3]);
  95. //cout << "track User4Iso " << iso[3] << endl;
  96. tk.setIsolation(pat::User5Iso, iso[4]);
  97. //cout << "track User5Iso " << iso[4] << endl;
  98. float zDaudxyFromBS = -1 ;
  99. float zDaudzFromBS = -1;
  100. float zDaudxyFromPV = -1;
  101. float zDaudzFromPV = -1;
  102. float zDauNofMuChambers = -1;
  103. float zDauNofMuMatches = -1;
  104. float zDauChi2 = -1;
  105. float zDauTrkChi2 = -1;
  106. float zDauSaChi2 = -1;
  107. float zDauNofMuonHits =- 1;
  108. float zDauNofStripHits = -1;
  109. float zDauNofPixelHits = -1;
  110. float zDauMuEnergyEm = -1;
  111. float zDauMuEnergyHad = -1;
  112. TrackRef muTrkRef = tk.track();
  113. if (muTrkRef.isNonnull()){
  114. zDaudxyFromBS = muTrkRef->dxy(beamSpotHandle->position());
  115. zDaudzFromBS = muTrkRef->dz(beamSpotHandle->position());
  116. zDaudxyFromPV = muTrkRef->dxy(primaryVertices->begin()->position() );
  117. zDaudzFromPV = muTrkRef->dz(primaryVertices->begin()->position() );
  118. zDauChi2 = muTrkRef->normalizedChi2();
  119. zDauTrkChi2 = muTrkRef->normalizedChi2();
  120. zDauNofStripHits = muTrkRef->hitPattern().numberOfValidStripHits();
  121. zDauNofPixelHits = muTrkRef->hitPattern().numberOfValidPixelHits();
  122. }
  123. tk.addUserFloat("zDau_dxyFromBS", zDaudxyFromBS);
  124. tk.addUserFloat("zDau_dzFromBS", zDaudzFromBS);
  125. tk.addUserFloat("zDau_dxyFromPV", zDaudxyFromPV);
  126. tk.addUserFloat("zDau_dzFromPV", zDaudzFromPV);
  127. tk.addUserFloat("zDau_NofMuonHits" , zDauNofMuonHits );
  128. tk.addUserFloat("zDau_TrkNofStripHits" , zDauNofStripHits );
  129. tk.addUserFloat("zDau_TrkNofPixelHits" , zDauNofPixelHits );
  130. tk.addUserFloat("zDau_NofMuChambers", zDauNofMuChambers);
  131. tk.addUserFloat("zDau_NofMuMatches", zDauNofMuMatches);
  132. tk.addUserFloat("zDau_Chi2", zDauChi2);
  133. tk.addUserFloat("zDau_TrkChi2", zDauTrkChi2);
  134. tk.addUserFloat("zDau_SaChi2", zDauSaChi2);
  135. tk.addUserFloat("zDau_MuEnergyEm", zDauMuEnergyEm);
  136. tk.addUserFloat("zDau_MuEnergyHad", zDauMuEnergyHad);
  137. }
  138. evt.put( tkColl);
  139. }
  140. #include "FWCore/Framework/interface/MakerMacros.h"
  141. DEFINE_FWK_MODULE( ZMuMuTrackUserData );