PageRenderTime 35ms CodeModel.GetById 11ms app.highlight 20ms RepoModel.GetById 1ms app.codeStats 1ms

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