ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/LeptonSelection/src/MuonSelection.cc
Revision: 1.10
Committed: Tue May 1 23:39:15 2012 UTC (13 years ago) by khahn
Content type: text/plain
Branch: MAIN
Changes since 1.9: +3 -3 lines
Log Message:
porting trigger stuff

File Contents

# Content
1 #include <math.h>
2 #include <iostream>
3
4 #include "MuonSelection.h"
5 #include "ParseArgs.h"
6 #include "SelectionStatus.h"
7
8 #include "Track.h"
9 #include "MuonTools.h"
10 #include "MuonQuality.h"
11 #include "MuonIDMVA.h"
12
13 mithep::MuonIDMVA * muIDMVA;
14 mithep::MuonTools muTools;
15
16 extern Float_t computePFMuonIso(const mithep::Muon *mu,
17 const mithep::Vertex & vtx,
18 const mithep::Array<mithep::PFCandidate> * pfCandidates,
19 const Double_t dRMax);
20
21 //--------------------------------------------------------------------------------------------------
22 SelectionStatus muonDummyVeto(ControlFlags &ctrl,
23 const mithep::Muon *muon,
24 const mithep::Vertex &vtx)
25 //--------------------------------------------------------------------------------------------------
26 {
27 SelectionStatus status;
28 status.setStatus(SelectionStatus::PRESELECTION);
29 return status;
30 }
31
32 //--------------------------------------------------------------------------------------------------
33 SelectionStatus muonCutBasedVeto(ControlFlags &ctrl,
34 const mithep::Muon *muon,
35 const mithep::Vertex &vtx)
36 //--------------------------------------------------------------------------------------------------
37 {
38 //
39 // Loose cut-based ID for isolation veto
40 //
41 bool ret = true;
42
43 if(!(muon->IsGlobalMuon() || muon->IsTrackerMuon())) ret = false;
44 if( muon->NValidHits() < 11 ) ret = false;
45 if( fabs(muon->Ip3dPVSignificance()) >= 4 ) ret = false;
46
47 SelectionStatus status;
48 if( ret ) status.setStatus(SelectionStatus::PRESELECTION);
49 return status;
50 }
51
52
53 //--------------------------------------------------------------------------------------------------
54 SelectionStatus noPreSelection( ControlFlags &ctrl, const mithep::Muon * mu )
55
56 //--------------------------------------------------------------------------------------------------
57 {
58 SelectionStatus status;
59 status.setStatus(SelectionStatus::PRESELECTION);
60 if(ctrl.debug) cout << "muon presel returning status : " << status.getStatus() << endl;
61 return status;
62 }
63
64 //--------------------------------------------------------------------------------------------------
65 SelectionStatus muonPreSelection( ControlFlags &ctrl,
66 const mithep::Muon * mu,
67 const mithep::Vertex & vtx,
68 const mithep::Array<mithep::PFCandidate> * pfCandidates )
69 //--------------------------------------------------------------------------------------------------
70 {
71 bool ret = true;
72 if(ctrl.debug) cout << "inside muonpresel ... " << endl;
73 // bool ret = isMuFO(mu,vtx,pfCandidates);
74 if(ctrl.debug) cout << "iS fo? ... " << ret << endl;
75 ret &= ( fabs(mu->Ip3dPVSignificance()) < 4 );
76 if(ctrl.debug) cout << "and pass IP (" << mu->Ip3dPVSignificance() << ") ? ... " << ret << endl;
77 ret &= ( mu->Pt() > 5 );
78 if(ctrl.debug) cout << "and >5 GeV (" << mu->Pt() << ") ? ... " << ret << endl;
79 ret &= ( fabs(mu->Eta()) <= 2.4 );
80 if(ctrl.debug) cout << "and < 2.4 eta (" << mu->Eta() << ")? ... " << ret << endl;
81 ret &= (mu->IsTrackerMuon() && mu->HasTrackerTrk() &&
82 (mu->Quality().QualityMask().Mask() & mithep::MuonQuality::AllArbitrated));
83 if(ctrl.debug) cout << "and isTrackerMuon ? ... " << ret << endl;
84 ret &= ( mu->BestTrk()->DzCorrected(vtx) < 0.1);
85 if( ctrl.debug ) cout << "elepresel : ret after dZcorr : " << ret << endl;
86
87
88 SelectionStatus status;
89 if( ret ) status.setStatus(SelectionStatus::PRESELECTION);
90 if(ctrl.debug) cout << "muon presel returning status : " << status.getStatus() << endl;
91 return status;
92 }
93
94
95 //--------------------------------------------------------------------------------------------------
96 bool isMuFO( const mithep::Muon * mu,
97 const mithep::Vertex & vtx,
98 const mithep::Array<mithep::PFCandidate> * pfCandidates )
99 //--------------------------------------------------------------------------------------------------
100 {
101 bool isgood=true;
102 float reliso = computePFMuonIso(mu,vtx,pfCandidates,0.3)/mu->Pt();
103
104 if( mu->Pt() < 5 ) isgood=false;
105 if ( fabs(mu->BestTrk()->DzCorrected(vtx)) > 0.2 ) isgood=false; // needed to remove cosmics in HF sample
106
107 //
108
109 // HF seems to not want tkquality, SS does
110 if( mu->Pt()>20 ) {
111 if ( !((mu->IsGlobalMuon()) && mu->NSegments()>0 ) ) isgood=false; //&& mu->nValidHits>0
112 } else {
113 if ( !((mu->IsGlobalMuon()) && mu->NSegments()>0 ) //&& //&& mu->nValidHits>0
114 && !( (mu->IsTrackerMuon()) && (mu->Quality().QualityMask().Mask() & muTools.kTMOneStationLoose)
115 )
116 ) isgood=false;
117 }
118
119
120 //
121 // for HF MC to agree w/ data, cannot put any Tk quality bits
122 // but to get to 5% closure in the SS test, we need at least Tk oneStationLoose
123
124 /*
125 && ( (mu->qualityBits & kTMOneStationLoose) ||
126 (mu->qualityBits & kTMLastStationOptimizedBarrelLowPtLoose) ||
127 (mu->qualityBits & kTMLastStationOptimizedLowPtLoose)
128 )
129 */
130
131
132 // comment for more stats for mu fake shape
133 if( mu->Pt() < 20 ) {
134 if( reliso > 3 ) isgood=false;
135 } else {
136 if( reliso > 5 ) isgood=false;
137 }
138
139 return isgood;
140 };
141
142 //--------------------------------------------------------------------------------------------------
143 SelectionStatus passSoftMuonSelection( ControlFlags &ctrl,
144 const mithep::Muon * mu ,
145 const mithep::Vertex & vtx)
146 //--------------------------------------------------------------------------------------------------
147 {
148
149 int level=0;
150 unsigned failmask=0x0;
151
152 // Use tracker track when available
153 const mithep::Track *muTrk=0;
154 if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
155 else if(mu->HasTrackerTrk()) { muTrk = mu->TrackerTrk(); }
156 else if(mu->HasGlobalTrk()) { muTrk = mu->GlobalTrk(); }
157 assert(muTrk);
158
159 if(mu->TrackerTrk()->NHits() < 11 )
160 failmask |= (1<<level);
161 level++;
162
163 if(fabs(muTrk->D0Corrected(vtx)) > 0.2)
164 failmask |= (1<<level);
165 level++;
166
167 if(fabs(muTrk->DzCorrected(vtx)) > 0.1)
168 failmask |= (1<<level);
169 level++;
170
171 if(!(mu->IsTrackerMuon()))
172 failmask |= (1<<level);
173 level++;
174
175 // if(!(mu->Quality().QualityMask().Mask() & muTools.kTMLastStationAngTight))
176 if(!(mu->Quality().QualityMask().Mask() & muTools.kTMLastStationTight))
177 failmask |= (1<<level);
178 level++;
179
180 Double_t iso = (mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt())/mu->Pt();
181 if(mu->Pt()>20 && iso<0.1)
182 failmask |= (1<<level);
183
184 bool passtight = !(failmask);
185 bool passloose = !(failmask);
186 return SelectionStatus( passtight | passloose );
187
188 }
189
190 //--------------------------------------------------------------------------------------------------
191 //unsigned passMuonSelectionZZ( const mithep::TMuon * mu ) {
192 SelectionStatus passMuonSelectionZZ( ControlFlags &ctrl, const mithep::Muon * mu )
193 //--------------------------------------------------------------------------------------------------
194 {
195 int level=0;
196 unsigned failmask=0x0;
197
198 if(mu->Pt() < 5) {
199 failmask |= (1<<level);
200 }
201
202 level++;
203 if(fabs(mu->Eta()) > 2.4) {
204 failmask |= (1<<level);
205 }
206
207 level++;
208 if(!(mu->IsGlobalMuon())) {
209 failmask |= (1<<level);
210 }
211
212 level++;
213 if(mu->TrackerTrk()->NHits() < 10) {
214 failmask |= (1<<level);
215 }
216
217
218 level++;
219 if( (mu->IsoR03SumPt()/mu->Pt()) > 0.7 ) {
220 failmask |= (1<<level);
221 }
222
223 // if(muon->nPixHits < 1) return false;
224 // if(muon->muNchi2 > 10) return false;
225 // if(muon->nMatch < 2) return false;
226 // if(muon->nValidHits < 1) return false;
227 // if(muon->pterr/muon->pt > 0.1) return false;
228 // if(fabs(muon->dz) > 0.1) return false;
229
230 SelectionStatus status;
231 if( !failmask ) status.orStatus(SelectionStatus::LOOSEID);
232 if( !failmask ) status.orStatus(SelectionStatus::TIGHTID);
233 return status;
234
235
236
237 };
238
239
240
241
242 //
243 // Kevin's WW selection
244 //
245 //--------------------------------------------------------------------------------------------------
246 SelectionStatus passMuonSelection( ControlFlags &ctrl,
247 const mithep::Muon * mu,
248 const mithep::Vertex & vtx )
249 //--------------------------------------------------------------------------------------------------
250 {
251 SelectionStatus status;
252 int level=0;
253 unsigned failmask=0x0;
254
255 // Use tracker track when available
256 const mithep::Track *muTrk=0;
257 if(mu->HasTrackerTrk()) { muTrk = mu->TrackerTrk(); }
258 else if(mu->HasGlobalTrk()) { muTrk = mu->GlobalTrk(); }
259 else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
260 assert(muTrk);
261
262
263
264 // 0x1
265 if(muTrk->Pt() < 5) {
266 failmask |= (1<<level);
267 }
268
269 // 0x2
270 level++;
271 if(fabs(muTrk->Eta()) > 2.4) {
272 failmask |= (1<<level);
273 }
274
275 // 0x4
276 level++;
277 if(muTrk->PtErr()/muTrk->Pt() > 0.1) {
278 failmask |= (1<<level);
279 }
280
281 // 0x8
282 level++;
283 if( fabs(muTrk->DzCorrected(vtx)) > 0.1 ) {
284 failmask |= (1<<level);
285 }
286
287 double muNchi2;
288 if(mu->HasStandaloneTrk()) { muNchi2 = mu->StandaloneTrk()->RChi2(); }
289 else if(mu->HasGlobalTrk()) { muNchi2 = mu->GlobalTrk()->RChi2(); }
290 else if(mu->HasTrackerTrk()) { muNchi2 = mu->TrackerTrk()->RChi2(); }
291
292 unsigned qualityBits = mu->Quality().QualityMask().Mask();
293
294 Bool_t isGlobal = (mu->IsGlobalMuon()) && (muNchi2 < 10) && (mu->NMatches() > 1) && (mu->NValidHits() > 0);
295 Bool_t isTracker = (mu->IsTrackerMuon() ) && (qualityBits & muTools.kTMLastStationTight);
296
297 // 0x10
298 level++;
299 if((!isGlobal && !isTracker) || !(mu->HasTrackerTrk())) {
300 failmask |= (1<<level);
301 status.setStatus(SelectionStatus::FAIL);
302 return status;
303 }
304
305 // 0x20
306 level++;
307 assert(mu->HasTrackerTrk());
308 assert(mu->TrackerTrk());
309 if( mu->TrackerTrk()->NHits() < 10 ) {
310 failmask |= (1<<level);
311 }
312
313 level++;
314 if(muTrk->NPixelHits() < 1) {
315 failmask |= (1<<level);
316 }
317
318
319 level++;
320 if(fabs(muTrk->D0Corrected(vtx))>0.02) {
321 failmask |= (1<<level);
322 }
323
324 /*
325 if(mu->pt>20) {
326 if(fabs(mu->d0)>0.02) {
327 failmask |= (1<<level);
328 }
329 } else {
330 if(fabs(mu->d0)>0.01) {
331 failmask |= (1<<level);
332 }
333 }
334 */
335
336 if( !failmask ) status.orStatus(SelectionStatus::LOOSEID);
337 if( !failmask ) status.orStatus(SelectionStatus::TIGHTID);
338 return status;
339
340
341 };
342
343
344 //--------------------------------------------------------------------------------------------------
345 SelectionStatus muonIDMVASelection(ControlFlags &ctrl,
346 const mithep::Muon *mu,
347 const mithep::Vertex & vtx )
348 //--------------------------------------------------------------------------------------------------
349 {
350 assert(mu->IsTrackerMuon()); // must be
351 assert(mu->HasTrackerTrk());
352 assert(mu->TrackerTrk());
353
354 /*
355 cerr << "TrackerTrk: " << mu->TrackerTrk() << endl;
356 flush(cerr);
357 cerr << "Rchi2: " << mu->TrackerTrk()->RChi2() << endl;
358 flush(cerr);
359
360 cerr << "calling MVa ... "<< endl;
361 flush(cerr);
362 */
363
364 double global_rchi2 = (mu->IsGlobalMuon()) ? mu->GlobalTrk()->RChi2() : 0.;
365
366 double mvaval = muIDMVA->MVAValue_ID(mu->Pt(),
367 mu->Eta(),
368 mu->IsGlobalMuon(),
369 mu->IsTrackerMuon(),
370 mu->TrackerTrk()->RChi2(),
371 global_rchi2,
372 (Double_t)(mu->NValidHits()),
373 (Double_t)(mu->TrackerTrk()->NHits()),
374 (Double_t)(mu->TrackerTrk()->NPixelHits()),
375 (Double_t)(mu->NMatches()),
376 mu->TrkKink(),
377 muTools.GetSegmentCompatability(mu),
378 muTools.GetCaloCompatability(mu,true,true),
379 mu->HadEnergy(),
380 mu->EmEnergy(),
381 mu->HadS9Energy(),
382 mu->EmS9Energy(),
383 (Bool_t)(ctrl.debug) );
384
385
386 SelectionStatus status;
387 bool pass = false;
388
389 if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
390 && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_IDMVA_CUT_BIN0) pass = true;
391 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
392 && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_IDMVA_CUT_BIN1) pass = true;
393 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
394 && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_IDMVA_CUT_BIN2) pass = true;
395 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
396 && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_IDMVA_CUT_BIN3) pass = true;
397 else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon()
398 && (mu->Quality().QualityMask().Mask() & mithep::MuonQuality::AllArbitrated) && mvaval >= MUON_IDMVA_CUT_BIN4)
399 pass = true;
400
401
402 if( pass ) {
403 status.orStatus(SelectionStatus::LOOSEID);
404 status.orStatus(SelectionStatus::TIGHTID);
405 }
406
407 return status;
408 }
409
410 //--------------------------------------------------------------------------------------------------
411 void initMuonIDMVA()
412 //--------------------------------------------------------------------------------------------------
413 {
414 muIDMVA = new mithep::MuonIDMVA();
415 vector<string> weightFiles;
416 weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_barrel_lowpt_V2.weights.xml");
417 weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_barrel_highpt_V2.weights.xml");
418 weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_endcap_lowpt_V2.weights.xml");
419 weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_endcap_highpt_V2.weights.xml");
420 weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_tracker_V2.weights.xml");
421 weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_global_V2.weights.xml");
422 muIDMVA->Initialize( "MuonIDMVA",
423 mithep::MuonIDMVA::kIDV0,
424 kTRUE, weightFiles);
425 }
426
427 //--------------------------------------------------------------------------------------------------
428 SelectionStatus muonIDPFSelection(ControlFlags &ctrl,
429 const mithep::Muon *mu,
430 const mithep::Vertex & vtx,
431 const mithep::Array<mithep::PFCandidate> * pfCandidates )
432 //--------------------------------------------------------------------------------------------------
433 {
434 bool pass = false;
435 SelectionStatus status; // init'ed to FAIL
436
437 // check that muon is tracker
438 if( !(mu->IsTrackerMuon()) ) return status;
439
440 // check that it matches to a PF muon
441 for( int i=0; i<pfCandidates->GetEntries(); i++ ) {
442 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*pfCandidates)[i]);
443 if( pf->HasTrackerTrk() ) {
444 if( pf->TrackerTrk() == mu->TrackerTrk() && abs(pf->PFType()) == mithep::PFCandidate::eMuon ) {
445 pass = true;
446 break;
447 }
448 }
449 }
450
451 if( pass ) {
452 status.orStatus(SelectionStatus::LOOSEID);
453 status.orStatus(SelectionStatus::TIGHTID);
454 }
455
456 return status;
457 }