CMS 3D CMS Logo

MuScleFitMuonSelector.h
Go to the documentation of this file.
1 #ifndef MUSCLEFITMUONSELECTOR
2 #define MUSCLEFITMUONSELECTOR
3 
15 
16 #include "HepMC/GenParticle.h"
17 #include "HepMC/GenEvent.h"
18 
19 #include "MuScleFitPlotter.h"
20 
21 #include <vector>
22 
28 
30 {
31  public:
32  MuScleFitMuonSelector(const edm::InputTag & muonLabel, const int muonType, const bool PATmuons,
33  const std::vector<int> & resfind,
34  const bool speedup, const std::string & genParticlesName,
35  const bool compareToSimTracks, const edm::InputTag & simTracksCollectionName,
36  const bool sherpa, const bool debug) :
37  muonLabel_(muonLabel),
38  muonType_(muonType),
39  PATmuons_(PATmuons),
40  resfind_(resfind),
41  speedup_(speedup),
42  genParticlesName_(genParticlesName),
43  compareToSimTracks_(compareToSimTracks),
44  simTracksCollectionName_(simTracksCollectionName),
45  sherpa_(sherpa),
46  debug_(debug)
47  {}
49 
50  //Method to get the muon after FSR (status 1 muon in PYTHIA6) starting from status 3 muon which is daughter of the Z
51  const reco::Candidate* getStatus1Muon(const reco::Candidate* status3Muon);
52 
53  //Method to get the muon before FSR (status 3 muon in PYTHIA6) starting from status 3 muon which is daughter of the Z
54  const reco::Candidate* getStatus3Muon(const reco::Candidate* status3Muon);
55 
57  void selectMuons(const edm::Event & event, std::vector<MuScleFitMuon> & muons,
58  std::vector<GenMuonPair> & genPair,
59  std::vector<std::pair<lorentzVector,lorentzVector> > & simPair,
61 
62 
63  protected:
65  bool selGlobalMuon(const pat::Muon* aMuon);
67  bool selTrackerMuon(const pat::Muon* aMuon);
68 
69  // Generator and simulation level information
72  std::pair<lorentzVector, lorentzVector> findSimMuFromRes( const edm::Handle<edm::HepMCProduct> & evtMC,
75  const std::vector<const pat::Muon*> & collMuSel,
76  std::vector<GenMuonPair> & genPair,
77  MuScleFitPlotter * plotter);
78  void selectGenSimMuons(const edm::Event & event,
79  std::vector<GenMuonPair> & genPair,
80  std::vector<std::pair<lorentzVector,lorentzVector> > & simPair,
81  MuScleFitPlotter * plotter);
82  // void selectGeneratedMuons(const edm::Event & event, std::vector<std::pair<lorentzVector,lorentzVector> > & genPair);
83  void selectSimulatedMuons(const edm::Event & event,
84  const bool ifHepMC, edm::Handle<edm::HepMCProduct> evtMC,
85  std::vector<std::pair<lorentzVector,lorentzVector> > & simPair,
86  MuScleFitPlotter * plotter);
87 
89  template<typename T>
90  std::vector<MuScleFitMuon> fillMuonCollection( const std::vector<T>& tracks )
91  {
92  std::vector<MuScleFitMuon> muons;
93  typename std::vector<T>::const_iterator track;
94  for( track = tracks.begin(); track != tracks.end(); ++track ) {
96  mu = reco::Particle::LorentzVector(track->px(),track->py(),track->pz(),
97  sqrt(track->p()*track->p() + mMu2));
98 
99  Double_t hitsTk(0), hitsMuon(0), ptError(0);
100  if ( const reco::Muon* myMu = dynamic_cast<const reco::Muon*>(&(*track)) ){
101  hitsTk = myMu->innerTrack()->hitPattern().numberOfValidTrackerHits();
102  hitsMuon = myMu->innerTrack()->hitPattern().numberOfValidMuonHits();
103  ptError = myMu->innerTrack()->ptError();
104  }
105  else if ( const pat::Muon* myMu = dynamic_cast<const pat::Muon*>(&(*track)) ) {
106  hitsTk = myMu->innerTrack()->hitPattern().numberOfValidTrackerHits();
107  hitsMuon = myMu->innerTrack()->hitPattern().numberOfValidMuonHits();
108  ptError = myMu->innerTrack()->ptError();
109  }
110  else if (const reco::Track* myMu = dynamic_cast<const reco::Track*>(&(*track))){
111  hitsTk = myMu->hitPattern().numberOfValidTrackerHits();
112  hitsMuon = myMu->hitPattern().numberOfValidMuonHits();
113  ptError = myMu->ptError();
114  }
115 
116  MuScleFitMuon muon(mu,track->charge(),ptError,hitsTk,hitsMuon);
117 
118  if (debug_>0) {
119  std::cout<<"[MuScleFitMuonSelector::fillMuonCollection] after MuScleFitMuon initialization"<<std::endl;
120  std::cout<<" muon = "<<muon<<std::endl;
121  }
122 
123  muons.push_back(muon);
124  }
125  return muons;
126  }
127 
129  template<typename T>
130  void takeSelectedMuonType(const T & muon, std::vector<reco::Track> & tracks)
131  {
132  // std::cout<<"muon "<<muon->isGlobalMuon()<<muon->isStandAloneMuon()<<muon->isTrackerMuon()<<std::endl;
133  //NNBB: one muon can be of many kinds at once but with the muonType_ we are sure
134  // to avoid double counting of the same muon
135  if(muon->isGlobalMuon() && muonType_==1)
136  tracks.push_back(*(muon->globalTrack()));
137  else if(muon->isStandAloneMuon() && muonType_==2)
138  tracks.push_back(*(muon->outerTrack()));
139  else if(muon->isTrackerMuon() && muonType_==3)
140  tracks.push_back(*(muon->innerTrack()));
141 
142  else if( muonType_ == 10 && !(muon->isStandAloneMuon()) ) //particular case!!
143  tracks.push_back(*(muon->innerTrack()));
144  else if( muonType_ == 11 && muon->isGlobalMuon() )
145  tracks.push_back(*(muon->innerTrack()));
146  else if( muonType_ == 13 && muon->isTrackerMuon() )
147  tracks.push_back(*(muon->innerTrack()));
148  }
149 
151  const int muonType_;
152  const bool PATmuons_;
153  const std::vector<int> resfind_;
154  const bool speedup_;
158  const bool sherpa_;
159  const bool debug_;
160  static const double mMu2;
161  static const unsigned int motherPdgIdArray[6];
162 };
163 
164 #endif
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
void selectGeneratedMuons(const edm::Handle< pat::CompositeCandidateCollection > &collAll, const std::vector< const pat::Muon * > &collMuSel, std::vector< GenMuonPair > &genPair, MuScleFitPlotter *plotter)
For PATmuons the generator information is read directly from the PAT object.
std::pair< lorentzVector, lorentzVector > findSimMuFromRes(const edm::Handle< edm::HepMCProduct > &evtMC, const edm::Handle< edm::SimTrackContainer > &simTracks)
const std::string genParticlesName_
void selectMuons(const edm::Event &event, std::vector< MuScleFitMuon > &muons, std::vector< GenMuonPair > &genPair, std::vector< std::pair< lorentzVector, lorentzVector > > &simPair, MuScleFitPlotter *plotter)
Main method used to select muons of type specified by muonType_ from the collection specified by muon...
std::vector< MuScleFitMuon > fillMuonCollection(const std::vector< T > &tracks)
Template function used to convert the muon collection to a vector of reco::LeafCandidate.
bool selTrackerMuon(const pat::Muon *aMuon)
Apply the Onia cuts to select trackerMuons.
void selectSimulatedMuons(const edm::Event &event, const bool ifHepMC, edm::Handle< edm::HepMCProduct > evtMC, std::vector< std::pair< lorentzVector, lorentzVector > > &simPair, MuScleFitPlotter *plotter)
MuScleFitMuonSelector(const edm::InputTag &muonLabel, const int muonType, const bool PATmuons, const std::vector< int > &resfind, const bool speedup, const std::string &genParticlesName, const bool compareToSimTracks, const edm::InputTag &simTracksCollectionName, const bool sherpa, const bool debug)
static const unsigned int motherPdgIdArray[6]
const edm::InputTag muonLabel_
static const double mMu2
T sqrt(T t)
Definition: SSEVec.h:18
const int mu
Definition: Constants.h:22
reco::Particle::LorentzVector lorentzVector
#define debug
Definition: HDRShower.cc:19
GenMuonPair findGenMuFromRes(const reco::GenParticleCollection *genParticles)
void selectGenSimMuons(const edm::Event &event, std::vector< GenMuonPair > &genPair, std::vector< std::pair< lorentzVector, lorentzVector > > &simPair, MuScleFitPlotter *plotter)
const edm::InputTag simTracksCollectionName_
bool selGlobalMuon(const pat::Muon *aMuon)
Apply the Onia cuts to select globalMuons.
void takeSelectedMuonType(const T &muon, std::vector< reco::Track > &tracks)
Template function used to extract the selected muon type from the muon collection.
const reco::Candidate * getStatus3Muon(const reco::Candidate *status3Muon)
long double T
const std::vector< int > resfind_
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Particle.h:21
Analysis-level muon class.
Definition: Muon.h:51
Definition: event.py:1
const reco::Candidate * getStatus1Muon(const reco::Candidate *status3Muon)