13 |
|
#include "DataFormats/TrackReco/interface/Track.h" |
14 |
|
|
15 |
|
#include "UserCode/L1RpcTriggerAnalysis/interface/Utilities.h" |
16 |
+ |
#include "DataFormats/Math/interface/deltaR.h" |
17 |
+ |
#include "DataFormats/Math/interface/deltaPhi.h" |
18 |
|
#include "TObjArray.h" |
19 |
|
#include "TH1D.h" |
20 |
|
#include "TH2D.h" |
22 |
|
//TH2D* hMuHitsCSCvsEta; |
23 |
|
|
24 |
|
BestMuonFinder::BestMuonFinder(const edm::ParameterSet& cfg) |
25 |
< |
: lastEvent(0), lastRun(0), theConfig(cfg), theUnique(true), theMuon(0), |
25 |
> |
: lastEvent(0), lastRun(0), theConfig(cfg), theUnique(true), theAllMuons(0), theMuon(0), |
26 |
> |
theTrackerHits(0), theRPCHits(0), theDTHits(0), theCSCHits(0), |
27 |
|
hMuChi2Tk(0), hMuChi2Gl(0), hMuNHitsTk(0), |
28 |
< |
hMuPtVsEta(0), hMuHitsRPCvsCSC(0), hMuHitsRPCvsDT(0) |
28 |
> |
hMuPtVsEta(0), hMuHitsRPCvsCSC(0), hMuHitsRPCvsDT(0), |
29 |
> |
hMuonPt_BMF(0),hMuonEta_BMF (0),hMuonPhi_BMF(0) |
30 |
|
{} |
31 |
|
|
32 |
|
bool BestMuonFinder::run(const edm::Event &ev, const edm::EventSetup &es) |
38 |
|
theMuon = 0; |
39 |
|
theUnique = true; |
40 |
|
|
41 |
+ |
|
42 |
|
//getBeamSpot |
43 |
|
math::XYZPoint reference(0.,0.,0.); |
44 |
|
edm::InputTag beamSpot = theConfig.getParameter<edm::InputTag>("beamSpot"); |
48 |
|
|
49 |
|
//get Muon |
50 |
|
edm::Handle<reco::MuonCollection> muons; |
51 |
< |
ev.getByLabel( theConfig.getParameter<std::string>("muonColl"), muons); |
51 |
> |
static std::string muonCollName = theConfig.getParameter<std::string>("muonColl"); |
52 |
> |
static bool warnNoColl = theConfig.getUntrackedParameter<bool>("warnNoColl", true); |
53 |
> |
ev.getByLabel( muonCollName, muons); |
54 |
> |
if (!muons.isValid()) { |
55 |
> |
if (warnNoColl) std::cout <<"** WARNING - no collection labeled: "<<muonCollName<<std::endl; |
56 |
> |
return false; |
57 |
> |
} |
58 |
> |
theAllMuons = muons->size(); |
59 |
|
|
60 |
|
for (reco::MuonCollection::const_iterator im = muons->begin(); im != muons->end(); ++im) { |
61 |
|
|
62 |
< |
if (!im->isTrackerMuon() || !im->innerTrack().isNonnull()) continue; |
63 |
< |
if (hMuPtVsEta) hMuPtVsEta->Fill(im->innerTrack()->eta(), im->innerTrack()->pt()); |
64 |
< |
if (im->innerTrack()->pt() < theConfig.getParameter<double>("minPt")) continue; |
65 |
< |
if (fabs(im->innerTrack()->eta()) > theConfig.getParameter<double>("maxEta")) continue; |
66 |
< |
if (hMuChi2Tk) hMuChi2Tk->Fill(im->innerTrack()->normalizedChi2()); |
67 |
< |
if (im->innerTrack()->normalizedChi2() > theConfig.getParameter<double>("maxChi2Tk")) continue; |
68 |
< |
if (hMuChi2Gl && im->isGlobalMuon()) hMuChi2Gl->Fill(im->combinedMuon()->normalizedChi2()); |
62 |
> |
/* |
63 |
> |
if (ev.id().event() == 352597514) { |
64 |
> |
std::cout << "HERE Muon: matched stations:"<<im->numberOfMatchedStations() <<std::endl; |
65 |
> |
if (im->isGlobalMuon()) { |
66 |
> |
std::cout <<" GlobalMuon: " |
67 |
> |
<<" pt="<<im->combinedMuon()->pt() |
68 |
> |
<<" eta="<<im->combinedMuon()->eta() |
69 |
> |
<<" phi="<<im->combinedMuon()->phi() |
70 |
> |
<<" chi2: "<<im->combinedMuon()->normalizedChi2()<<std::endl; |
71 |
> |
} |
72 |
> |
if (im->isTrackerMuon() && im->innerTrack().isNonnull()) { |
73 |
> |
std::cout <<" TrackerMuon: " |
74 |
> |
<<" pt="<<im->innerTrack()->pt() |
75 |
> |
<<" eta="<<im->innerTrack()->eta() |
76 |
> |
<<" phi="<<im->innerTrack()->phi() |
77 |
> |
<< std::endl; |
78 |
> |
} |
79 |
> |
if (im->isStandAloneMuon()) std::cout <<" StandaloneMuon"<<std::endl; |
80 |
> |
} |
81 |
> |
*/ |
82 |
> |
if (im->bestTrack()->eta() > theConfig.getParameter<double>("maxEta")) continue; |
83 |
> |
if (im->bestTrack()->pt() < theConfig.getParameter<double>("minPt")) continue; |
84 |
|
if (im->numberOfMatchedStations() < theConfig.getParameter<int>("minNumberOfMatchedStations")) continue; |
85 |
|
|
86 |
+ |
if ( theConfig.getParameter<bool>("requireInnerTrack")) { |
87 |
+ |
if (!im->isTrackerMuon() || !im->innerTrack().isNonnull()) continue; |
88 |
+ |
if (im->innerTrack()->dxy(reference) > theConfig.getParameter<double>("maxTIP")) continue; |
89 |
+ |
if (im->innerTrack()->normalizedChi2() > theConfig.getParameter<double>("maxChi2Tk")) continue; |
90 |
+ |
if (hMuonPt_BMF) hMuonPt_BMF->Fill( im->innerTrack()->pt()); |
91 |
+ |
if (hMuonEta_BMF) hMuonEta_BMF->Fill( im->innerTrack()->eta()); |
92 |
+ |
if (hMuonPhi_BMF) hMuonPhi_BMF->Fill( im->innerTrack()->phi()); |
93 |
+ |
if (hMuChi2Tk) hMuChi2Tk->Fill(im->innerTrack()->normalizedChi2()); |
94 |
+ |
if (hMuPtVsEta) hMuPtVsEta->Fill(im->innerTrack()->eta(), im->innerTrack()->pt()); |
95 |
+ |
} |
96 |
+ |
if ( theConfig.getParameter<bool>("requireOuterTrack")){ |
97 |
+ |
if(!im->isStandAloneMuon() || !im->outerTrack().isNonnull())continue; |
98 |
+ |
if(im->standAloneMuon()->normalizedChi2() > theConfig.getParameter<double>("maxChi2Sa")) continue; |
99 |
+ |
} |
100 |
+ |
if ( theConfig.getParameter<bool>("requireGlobalTrack")) { |
101 |
+ |
if(!im->isGlobalMuon() || !im->globalTrack().isNonnull()) continue; |
102 |
+ |
if(im->combinedMuon()->normalizedChi2() > theConfig.getParameter<double>("maxChi2Mu")) continue; |
103 |
+ |
} |
104 |
+ |
|
105 |
+ |
if (hMuChi2Gl && im->isGlobalMuon()) hMuChi2Gl->Fill(im->combinedMuon()->normalizedChi2()); |
106 |
+ |
|
107 |
|
// |
108 |
|
// TMP TIGHT SELECTION FOR IVAN |
109 |
|
// if (! im->isGlobalMuon()) continue; |
120 |
|
int nRPCHits =0; |
121 |
|
int nDTHits =0; |
122 |
|
int nCSCHits =0; |
123 |
< |
if(im->isTrackerMuon()) { |
124 |
< |
const reco::HitPattern& hp = (im->innerTrack())->hitPattern(); |
77 |
< |
nTrackerHits = hp.numberOfValidTrackerHits(); |
78 |
< |
if (hMuNHitsTk) hMuNHitsTk->Fill(fabs(nTrackerHits)+1.e-3); |
79 |
< |
} |
80 |
< |
if(im->isGlobalMuon()){ |
123 |
> |
|
124 |
> |
if (im->isGlobalMuon()) { |
125 |
|
const reco::HitPattern& hp = (im->combinedMuon())->hitPattern(); |
126 |
+ |
nTrackerHits = hp.numberOfValidTrackerHits(); |
127 |
|
nRPCHits = hp.numberOfValidMuonRPCHits(); |
128 |
|
nDTHits = hp.numberOfValidMuonDTHits(); |
129 |
|
nCSCHits = hp.numberOfValidMuonCSCHits(); |
130 |
< |
if (nDTHits==0 && hMuHitsRPCvsCSC) hMuHitsRPCvsCSC->Fill(nCSCHits,nRPCHits); |
131 |
< |
if (nCSCHits==0 && hMuHitsRPCvsDT) hMuHitsRPCvsDT->Fill(nDTHits,nRPCHits); |
130 |
> |
if (hMuNHitsTk) hMuNHitsTk->Fill(fabs(nTrackerHits)+1.e-3); |
131 |
> |
if (nDTHits==0 && hMuHitsRPCvsCSC) hMuHitsRPCvsCSC->Fill(nCSCHits,nRPCHits); |
132 |
> |
if (nCSCHits==0 && hMuHitsRPCvsDT) hMuHitsRPCvsDT->Fill(nDTHits,nRPCHits); |
133 |
> |
} else { |
134 |
> |
if(im->isTrackerMuon()) { |
135 |
> |
const reco::HitPattern& hp = (im->innerTrack())->hitPattern(); |
136 |
> |
nTrackerHits = hp.numberOfValidTrackerHits(); |
137 |
> |
} |
138 |
> |
if (im->isStandAloneMuon()) { |
139 |
> |
const reco::HitPattern& hp = (im->standAloneMuon())->hitPattern(); |
140 |
> |
nRPCHits = hp.numberOfValidMuonRPCHits(); |
141 |
> |
nDTHits = hp.numberOfValidMuonDTHits(); |
142 |
> |
nCSCHits = hp.numberOfValidMuonCSCHits(); |
143 |
> |
} |
144 |
|
} |
145 |
< |
|
145 |
> |
|
146 |
|
if (nTrackerHits< theConfig.getParameter<int>("minNumberTrackerHits")) continue; |
147 |
|
if ( nRPCHits < theConfig.getParameter<int>("minNumberRpcHits")) continue; |
148 |
|
if ( nDTHits + nCSCHits < theConfig.getParameter<int>("minNumberDtCscHits") ) continue; |
149 |
|
|
150 |
< |
if (theMuon) theUnique = false; |
151 |
< |
if (!theMuon || (im->track()->pt() > theMuon->track()->pt()) ) theMuon = &(*im); |
150 |
> |
if (!theMuon || (im->bestTrack()->pt() > theMuon->bestTrack()->pt()) ) { |
151 |
> |
theMuon = &(*im); |
152 |
> |
theTrackerHits = nTrackerHits; |
153 |
> |
theRPCHits = nRPCHits; |
154 |
> |
theDTHits = nDTHits; |
155 |
> |
theCSCHits = nCSCHits; |
156 |
> |
} |
157 |
> |
} |
158 |
> |
|
159 |
> |
// |
160 |
> |
// check if muon is unigue |
161 |
> |
// |
162 |
> |
if (theMuon) { |
163 |
> |
double muonEta = theMuon->bestTrack()->eta(); |
164 |
> |
double muonPhi = theMuon->bestTrack()->phi(); |
165 |
> |
for (reco::MuonCollection::const_iterator im = muons->begin(); im != muons->end(); ++im) { |
166 |
> |
if (&(*im) == theMuon) continue; |
167 |
> |
if ( fabs(reco::deltaPhi(muonPhi, im->bestTrack()->phi())) > theConfig.getParameter<double>("deltaPhiUnique")) continue; |
168 |
> |
if ( fabs(muonEta-im->bestTrack()->eta()) > theConfig.getParameter<double>("deltaEtaUnique")) continue; |
169 |
> |
theUnique = false; |
170 |
> |
} |
171 |
|
} |
172 |
|
return true; |
173 |
|
} |
181 |
|
hMuHitsRPCvsCSC = new TH2D("hMuHitsRPCvsCSC","hMuHitsRPCvsCSC", 40,0.,40., 6,0.,6.); histos.Add(hMuHitsRPCvsCSC); |
182 |
|
hMuHitsRPCvsDT = new TH2D("hMuHitsRPCvsDT","hMuHitsRPCvsDT", 30,0.,60., 6,0.,6.); histos.Add(hMuHitsRPCvsDT); |
183 |
|
// hMuHitsCSCvsEta = new TH2D("hMuHitsCSCvsEta","hMuHitsCSCvsEta",17, 0.8,2.5, 40,0.,40); histos.Add(hMuHitsCSCvsEta); |
184 |
+ |
hMuonPt_BMF = new TH1D("hMuonPt_BMF","All global muons Pt;Glb.muon p_{T} [GeV];Muons / bin",L1PtScale::nPtBins,L1PtScale::ptBins); histos.Add(hMuonPt_BMF); |
185 |
+ |
hMuonEta_BMF = new TH1D("hMuonEta_BMF","All global muons Eta;Glb.muon #eta;Muons / bin",84, -2.1, 2.1); histos.Add(hMuonEta_BMF); |
186 |
+ |
hMuonPhi_BMF = new TH1D("hMuonPhi_BMF","All global muons Phi;Glb.muon #phi [rad];Muons / bin",90,-M_PI,M_PI); histos.Add(hMuonPhi_BMF); |
187 |
+ |
|
188 |
|
} |