ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/MuonIDMod.cc
Revision: 1.80
Committed: Mon May 7 18:05:51 2012 UTC (13 years ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_028, Mit_027, Mit_027a
Changes since 1.79: +27 -29 lines
Log Message:
new rhos

File Contents

# Content
1 // $Id: MuonIDMod.cc,v 1.79 2012/05/06 12:27:41 ceballos Exp $
2
3 #include "MitPhysics/Mods/interface/MuonIDMod.h"
4 #include "MitCommon/MathTools/interface/MathUtils.h"
5 #include "MitAna/DataTree/interface/MuonFwd.h"
6 #include "MitAna/DataTree/interface/ElectronFwd.h"
7 #include "MitAna/DataTree/interface/VertexCol.h"
8 #include "MitPhysics/Init/interface/ModNames.h"
9
10 using namespace mithep;
11
12 ClassImp(mithep::MuonIDMod)
13
14 //--------------------------------------------------------------------------------------------------
15 MuonIDMod::MuonIDMod(const char *name, const char *title) :
16 BaseMod(name,title),
17 fPrintMVADebugInfo(kFALSE),
18 fMuonBranchName(Names::gkMuonBrn),
19 fCleanMuonsName(ModNames::gkCleanMuonsName),
20 fNonIsolatedMuonsName("random"),
21 fNonIsolatedElectronsName("random"),
22 fVertexName(ModNames::gkGoodVertexesName),
23 fBeamSpotName(Names::gkBeamSpotBrn),
24 fTrackName(Names::gkTrackBrn),
25 fPFCandidatesName(Names::gkPFCandidatesBrn),
26 fMuonIDType("WWMuIdV3"),
27 fMuonIsoType("PFIso"),
28 fMuonClassType("Global"),
29 fTrackIsolationCut(3.0),
30 fCaloIsolationCut(3.0),
31 fCombIsolationCut(0.15),
32 fCombRelativeIsolationCut(0.15),
33 fPFIsolationCut(-1.0),
34 fMuonPtMin(10),
35 fApplyD0Cut(kTRUE),
36 fApplyDZCut(kTRUE),
37 fD0Cut(0.020),
38 fDZCut(0.10),
39 fWhichVertex(-1),
40 fEtaCut(2.4),
41 fMuIDType(kIdUndef),
42 fMuIsoType(kIsoUndef),
43 fMuClassType(kClassUndef),
44 fMuons(0),
45 fVertices(0),
46 fBeamSpot(0),
47 fTracks(0),
48 fPFCandidates(0),
49 fPFNoPileUpCands(0),
50 fIntRadius(0.0),
51 fNonIsolatedMuons(0),
52 fNonIsolatedElectrons(0),
53 fPileupEnergyDensityName(Names::gkPileupEnergyDensityBrn),
54 fPileupEnergyDensity(0),
55 fMuonTools(0),
56 fMuonIDMVA(0),
57 fTheRhoType(RhoUtilities::DEFAULT)
58 {
59 // Constructor.
60 }
61
62 //--------------------------------------------------------------------------------------------------
63 void MuonIDMod::Process()
64 {
65 // Process entries of the tree.
66
67 if(fMuIsoType != kPFIsoNoL) {
68 LoadEventObject(fMuonBranchName, fMuons);
69 }
70 else {
71 fMuons = GetObjThisEvt<MuonOArr>(fMuonBranchName);
72 }
73 LoadEventObject(fBeamSpotName, fBeamSpot);
74 LoadEventObject(fTrackName, fTracks);
75 LoadEventObject(fPFCandidatesName, fPFCandidates);
76 if(fMuIsoType == kTrackCaloSliding ||
77 fMuIsoType == kMVAIso_BDTG_IDIso ||
78 fMuIsoType == kIsoRingsV0_BDTG_Iso ||
79 fMuIsoType == kIsoDeltaR
80 ) {
81 LoadEventObject(fPileupEnergyDensityName, fPileupEnergyDensity);
82 }
83 if(fMuIsoType == kPFRadialIso || fMuIsoType == kIsoDeltaR){
84 // Name is hardcoded, can be changed if someone feels to do it
85 fPFNoPileUpCands = GetObjThisEvt<PFCandidateCol>("PFNoPileUp");
86 }
87
88 MuonOArr *CleanMuons = new MuonOArr;
89 CleanMuons->SetName(fCleanMuonsName);
90
91 fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
92
93 for (UInt_t i=0; i<fMuons->GetEntries() && fVertices->GetEntries() > 0 ; ++i) {
94 const Muon *mu = fMuons->At(i);
95
96 Bool_t pass = kFALSE;
97 Double_t pt = 0; // make sure pt is taken from the correct track!
98 Double_t eta = 0; // make sure eta is taken from the correct track!
99 switch (fMuClassType) {
100 case kAll:
101 pass = kTRUE;
102 if (mu->HasTrk()) {
103 pt = mu->Pt();
104 eta = TMath::Abs(mu->Eta());
105 }
106 break;
107 case kGlobal:
108 pass = mu->HasGlobalTrk() && mu->IsTrackerMuon();
109 if (pass && mu->TrackerTrk()) {
110 pt = mu->TrackerTrk()->Pt();
111 eta = TMath::Abs(mu->TrackerTrk()->Eta());
112 }
113 else {
114 pt = mu->Pt();
115 eta = TMath::Abs(mu->Eta());
116 }
117 break;
118 case kGlobalTracker:
119 pass = (mu->HasGlobalTrk() && mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof() < 10 &&
120 (mu->NSegments() > 1 || mu->NMatches() > 1) && mu->NValidHits() > 0) ||
121 (mu->IsTrackerMuon() &&
122 mu->Quality().Quality(MuonQuality::TMLastStationTight));
123 if (pass) {
124 pt = mu->TrackerTrk()->Pt();
125 eta = TMath::Abs(mu->TrackerTrk()->Eta());
126 }
127 else {
128 pt = mu->Pt();
129 eta = TMath::Abs(mu->Eta());
130 }
131 break;
132 case kSta:
133 pass = mu->HasStandaloneTrk();
134 if (pass) {
135 pt = mu->StandaloneTrk()->Pt();
136 eta = TMath::Abs(mu->StandaloneTrk()->Eta());
137 }
138 break;
139 case kTrackerMuon:
140 pass = mu->HasTrackerTrk() && mu->IsTrackerMuon() &&
141 mu->Quality().Quality(MuonQuality::TrackerMuonArbitrated);
142 if (pass) {
143 pt = mu->TrackerTrk()->Pt();
144 eta = TMath::Abs(mu->TrackerTrk()->Eta());
145 }
146 break;
147 case kCaloMuon:
148 pass = mu->HasTrackerTrk() && mu->IsCaloMuon();
149 if (pass) {
150 pt = mu->TrackerTrk()->Pt();
151 eta = TMath::Abs(mu->TrackerTrk()->Eta());
152 }
153 break;
154 case kTrackerBased:
155 pass = mu->HasTrackerTrk();
156 if (pass) {
157 pt = mu->TrackerTrk()->Pt();
158 eta = TMath::Abs(mu->TrackerTrk()->Eta());
159 }
160 break;
161 default:
162 break;
163 }
164
165 if (!pass)
166 continue;
167
168 if (pt <= fMuonPtMin)
169 continue;
170
171 if (eta >= fEtaCut)
172 continue;
173
174 Double_t RChi2 = 0.0;
175 if (mu->HasGlobalTrk()) {
176 RChi2 = mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof();
177 }
178 else if(mu->BestTrk() != 0){
179 RChi2 = mu->BestTrk()->Chi2()/mu->BestTrk()->Ndof();
180 }
181 Bool_t idpass = kFALSE;
182 switch (fMuIDType) {
183 case kWMuId:
184 idpass = mu->BestTrk() != 0 &&
185 mu->BestTrk()->NHits() > 10 &&
186 RChi2 < 10.0 &&
187 (mu->NSegments() > 1 || mu->NMatches() > 1) &&
188 mu->BestTrk()->NPixelHits() > 0 &&
189 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
190 break;
191 case kZMuId:
192 idpass = mu->BestTrk() != 0 &&
193 mu->BestTrk()->NHits() > 10 &&
194 (mu->NSegments() > 1 || mu->NMatches() > 1) &&
195 mu->BestTrk()->NPixelHits() > 0 &&
196 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
197 break;
198 case kLoose:
199 idpass = mu->BestTrk() != 0 &&
200 mu->Quality().Quality(MuonQuality::TMOneStationLoose) &&
201 mu->Quality().Quality(MuonQuality::TM2DCompatibilityLoose) &&
202 mu->BestTrk()->NHits() > 10 &&
203 RChi2 < 10.0 &&
204 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
205 break;
206 case kTight:
207 idpass = mu->BestTrk() != 0 &&
208 mu->Quality().Quality(MuonQuality::TMOneStationTight) &&
209 mu->Quality().Quality(MuonQuality::TM2DCompatibilityTight) &&
210 mu->BestTrk()->NHits() > 10 &&
211 RChi2 < 10.0 &&
212 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
213 break;
214 case kWWMuIdV1:
215 idpass = mu->BestTrk() != 0 &&
216 mu->BestTrk()->NHits() > 10 &&
217 mu->BestTrk()->NPixelHits() > 0 &&
218 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
219 RChi2 < 10.0 &&
220 (mu->NSegments() > 1 || mu->NMatches() > 1) &&
221 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
222 break;
223 case kWWMuIdV2:
224 idpass = mu->BestTrk() != 0 &&
225 mu->BestTrk()->NHits() > 10 &&
226 mu->BestTrk()->NPixelHits() > 0 &&
227 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1;
228 break;
229 case kWWMuIdV3:
230 idpass = mu->BestTrk() != 0 &&
231 mu->BestTrk()->NHits() > 10 &&
232 mu->BestTrk()->NPixelHits() > 0 &&
233 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
234 mu->TrkKink() < 20.0;
235 break;
236 case kWWMuIdV4:
237 idpass = mu->BestTrk() != 0 &&
238 mu->NTrkLayersHit() > 5 &&
239 mu->IsPFMuon() == kTRUE &&
240 mu->BestTrk()->NPixelHits() > 0 &&
241 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
242 mu->TrkKink() < 20.0;
243 break;
244 case kMVAID_BDTG_IDIso:
245 {
246 Bool_t passDenominatorM2 = (mu->BestTrk() != 0 &&
247 mu->BestTrk()->NHits() > 10 &&
248 mu->BestTrk()->NPixelHits() > 0 &&
249 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
250 MuonTools::PassD0Cut(mu, fVertices, 0.20, 0) &&
251 MuonTools::PassDZCut(mu, fVertices, 0.10, 0) &&
252 mu->TrkKink() < 20.0
253 );
254 idpass = passDenominatorM2;
255 //only evaluate MVA if muon passes M2 denominator to save time
256 if (idpass) idpass = PassMuonMVA_BDTG_IdIso(mu, fVertices->At(0), fPileupEnergyDensity);
257 }
258 break;
259 case kNoId:
260 idpass = kTRUE;
261 break;
262 default:
263 break;
264 }
265
266 if (!idpass)
267 continue;
268
269 Double_t Rho = 0.;
270 if(fPileupEnergyDensity){
271 const PileupEnergyDensity *rho = fPileupEnergyDensity->At(0);
272
273 switch (fTheRhoType) {
274 case RhoUtilities::MIT_RHO_VORONOI_LOW_ETA:
275 Rho = rho->RhoLowEta();
276 break;
277 case RhoUtilities::MIT_RHO_VORONOI_HIGH_ETA:
278 Rho = rho->Rho();
279 break;
280 case RhoUtilities::MIT_RHO_RANDOM_LOW_ETA:
281 Rho = rho->RhoRandomLowEta();
282 break;
283 case RhoUtilities::MIT_RHO_RANDOM_HIGH_ETA:
284 Rho = rho->RhoRandom();
285 break;
286 case RhoUtilities::CMS_RHO_RHOKT6PFJETS:
287 Rho = rho->RhoKt6PFJets();
288 break;
289 default:
290 Rho = rho->Rho();
291 }
292
293 if ((TMath::IsNaN(fPileupEnergyDensity->At(0)->Rho()) || std::isinf(fPileupEnergyDensity->At(0)->Rho()))) Rho = 0.;
294 }
295
296 Bool_t isocut = kFALSE;
297 switch (fMuIsoType) {
298 case kTrackCalo:
299 isocut = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
300 (mu->IsoR03EmEt() + mu->IsoR03HadEt() < fCaloIsolationCut);
301 break;
302 case kTrackCaloCombined:
303 isocut = (1.0 * mu->IsoR03SumPt() +
304 1.0 * mu->IsoR03EmEt() +
305 1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
306 break;
307 case kTrackCaloSliding:
308 {
309 Double_t totalIso = mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt() - Rho * TMath::Pi() * 0.3 * 0.3 ;
310 // trick to change the signal region cut
311 double theIsoCut = fCombIsolationCut;
312 if(theIsoCut < 0.20){
313 if(mu->Pt() > 20.0) theIsoCut = 0.15;
314 else theIsoCut = 0.10;
315 }
316 if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
317 }
318 break;
319 case kTrackCaloSlidingNoCorrection:
320 {
321 Double_t totalIso = 1.0 * mu->IsoR03SumPt() +
322 1.0 * mu->IsoR03EmEt() +
323 1.0 * mu->IsoR03HadEt();
324 // trick to change the signal region cut
325 double theIsoCut = fCombIsolationCut;
326 if(theIsoCut < 0.20){
327 if(mu->Pt() > 20.0) theIsoCut = 0.15;
328 else theIsoCut = 0.10;
329 }
330 if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
331 }
332 break;
333 case kPFIso:
334 {
335 Double_t pfIsoCutValue = 9999;
336 if(fPFIsolationCut > 0){
337 pfIsoCutValue = fPFIsolationCut;
338 } else {
339 if (mu->AbsEta() < 1.479) {
340 if (mu->Pt() > 20) {
341 pfIsoCutValue = 0.13;
342 } else {
343 pfIsoCutValue = 0.06;
344 }
345 } else {
346 if (mu->Pt() > 20) {
347 pfIsoCutValue = 0.09;
348 } else {
349 pfIsoCutValue = 0.05;
350 }
351 }
352 }
353 Double_t totalIso = IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
354 if (totalIso < (mu->Pt()*pfIsoCutValue) )
355 isocut = kTRUE;
356 }
357 break;
358 case kPFRadialIso:
359 {
360 Double_t pfIsoCutValue = 9999;
361 if(fPFIsolationCut > 0){
362 pfIsoCutValue = fPFIsolationCut;
363 } else {
364 if (mu->Pt() > 20) {
365 pfIsoCutValue = 0.10;
366 } else {
367 pfIsoCutValue = 0.05;
368 }
369 }
370 Double_t totalIso = IsolationTools::PFRadialMuonIsolation(mu, fPFNoPileUpCands, 1.0, 0.3);
371 if (totalIso < (mu->Pt()*pfIsoCutValue) )
372 isocut = kTRUE;
373 }
374 break;
375 case kPFIsoNoL:
376 {
377 fNonIsolatedMuons = GetObjThisEvt<MuonCol>(fNonIsolatedMuonsName);
378 fNonIsolatedElectrons = GetObjThisEvt<ElectronCol>(fNonIsolatedElectronsName);
379
380 Double_t pfIsoCutValue = 9999;
381 if(fPFIsolationCut > 0){
382 pfIsoCutValue = fPFIsolationCut;
383 } else {
384 if (mu->AbsEta() < 1.479) {
385 if (mu->Pt() > 20) {
386 pfIsoCutValue = 0.13;
387 } else {
388 pfIsoCutValue = 0.06;
389 }
390 } else {
391 if (mu->Pt() > 20) {
392 pfIsoCutValue = 0.09;
393 } else {
394 pfIsoCutValue = 0.05;
395 }
396 }
397 }
398 Double_t totalIso = IsolationTools::PFMuonIsolation(mu, fPFCandidates, fNonIsolatedMuons, fNonIsolatedElectrons, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
399 if (totalIso < (mu->Pt()*pfIsoCutValue) )
400 isocut = kTRUE;
401 }
402 break;
403 case kMVAIso_BDTG_IDIso:
404 {
405
406 Double_t totalIso = IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
407 isocut = (totalIso < (mu->Pt()*0.4));
408
409 }
410 break;
411 case kIsoRingsV0_BDTG_Iso:
412 {
413
414 isocut = PassMuonIsoRingsV0_BDTG_Iso(mu, fVertices->At(0), fPileupEnergyDensity);
415
416 }
417 break;
418 case kIsoDeltaR:
419 {
420
421 isocut = PassMuonIsoDeltaR(mu, fVertices->At(0), fPileupEnergyDensity);
422
423 }
424 break;
425 case kNoIso:
426 isocut = kTRUE;
427 break;
428 case kCustomIso:
429 default:
430 break;
431 }
432
433 if (isocut == kFALSE)
434 continue;
435
436 // apply d0 cut
437 if (fApplyD0Cut) {
438 Bool_t passD0cut = kTRUE;
439 if(fD0Cut < 0.05) { // trick to change the signal region cut
440 if (mu->Pt() > 20.0) fD0Cut = 0.02;
441 else if (mu->Pt() <= 20.0) fD0Cut = 0.01;
442 }
443 if(fWhichVertex >= -1) passD0cut = MuonTools::PassD0Cut(mu, fVertices, fD0Cut, fWhichVertex);
444 else passD0cut = MuonTools::PassD0Cut(mu, fBeamSpot, fD0Cut);
445 if (!passD0cut)
446 continue;
447 }
448
449 // apply dz cut
450 if (fApplyDZCut) {
451 Bool_t passDZcut = MuonTools::PassDZCut(mu, fVertices, fDZCut, fWhichVertex);
452 if (!passDZcut)
453 continue;
454 }
455
456 // add good muon
457 CleanMuons->Add(mu);
458 }
459
460 // sort according to pt
461 CleanMuons->Sort();
462
463 // add objects for other modules to use
464 AddObjThisEvt(CleanMuons);
465 }
466
467 //--------------------------------------------------------------------------------------------------
468 void MuonIDMod::SlaveBegin()
469 {
470 // Run startup code on the computer (slave) doing the actual analysis. Here,
471 // we just request the muon collection branch.
472
473 // In this case we cannot have a branch
474 if (fMuonIsoType.CompareTo("PFIsoNoL") != 0) {
475 ReqEventObject(fMuonBranchName, fMuons, kTRUE);
476 }
477 ReqEventObject(fBeamSpotName, fBeamSpot, kTRUE);
478 ReqEventObject(fTrackName, fTracks, kTRUE);
479 ReqEventObject(fPFCandidatesName, fPFCandidates, kTRUE);
480 if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0
481 || fMuonIsoType.CompareTo("MVA_BDTG_IDIso") == 0
482 || fMuonIsoType.CompareTo("IsoRingsV0_BDTG_Iso") == 0
483 || fMuonIsoType.CompareTo("IsoDeltaR") == 0
484 ) {
485 ReqEventObject(fPileupEnergyDensityName, fPileupEnergyDensity, kTRUE);
486 }
487
488
489 if (fMuonIDType.CompareTo("WMuId") == 0)
490 fMuIDType = kWMuId;
491 else if (fMuonIDType.CompareTo("ZMuId") == 0)
492 fMuIDType = kZMuId;
493 else if (fMuonIDType.CompareTo("Tight") == 0)
494 fMuIDType = kTight;
495 else if (fMuonIDType.CompareTo("Loose") == 0)
496 fMuIDType = kLoose;
497 else if (fMuonIDType.CompareTo("WWMuIdV1") == 0)
498 fMuIDType = kWWMuIdV1;
499 else if (fMuonIDType.CompareTo("WWMuIdV2") == 0)
500 fMuIDType = kWWMuIdV2;
501 else if (fMuonIDType.CompareTo("WWMuIdV3") == 0)
502 fMuIDType = kWWMuIdV3;
503 else if (fMuonIDType.CompareTo("WWMuIdV4") == 0)
504 fMuIDType = kWWMuIdV4;
505 else if (fMuonIDType.CompareTo("NoId") == 0)
506 fMuIDType = kNoId;
507 else if (fMuonIDType.CompareTo("Custom") == 0) {
508 fMuIDType = kCustomId;
509 SendError(kWarning, "SlaveBegin",
510 "Custom muon identification is not yet implemented.");
511 } else if (fMuonIDType.CompareTo("MVA_BDTG_IDIso") == 0) {
512 fMuIDType = kMVAID_BDTG_IDIso;
513 } else {
514 SendError(kAbortAnalysis, "SlaveBegin",
515 "The specified muon identification %s is not defined.",
516 fMuonIDType.Data());
517 return;
518 }
519
520 if (fMuonIsoType.CompareTo("TrackCalo") == 0)
521 fMuIsoType = kTrackCalo;
522 else if (fMuonIsoType.CompareTo("TrackCaloCombined") == 0)
523 fMuIsoType = kTrackCaloCombined;
524 else if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0)
525 fMuIsoType = kTrackCaloSliding;
526 else if (fMuonIsoType.CompareTo("TrackCaloSlidingNoCorrection") == 0)
527 fMuIsoType = kTrackCaloSlidingNoCorrection;
528 else if (fMuonIsoType.CompareTo("PFIso") == 0)
529 fMuIsoType = kPFIso;
530 else if (fMuonIsoType.CompareTo("PFRadialIso") == 0)
531 fMuIsoType = kPFRadialIso;
532 else if (fMuonIsoType.CompareTo("PFIsoNoL") == 0)
533 fMuIsoType = kPFIsoNoL;
534 else if (fMuonIsoType.CompareTo("NoIso") == 0)
535 fMuIsoType = kNoIso;
536 else if (fMuonIsoType.CompareTo("Custom") == 0) {
537 fMuIsoType = kCustomIso;
538 SendError(kWarning, "SlaveBegin",
539 "Custom muon isolation is not yet implemented.");
540 } else if (fMuonIsoType.CompareTo("MVA_BDTG_IDIso") == 0) {
541 fMuIsoType = kMVAIso_BDTG_IDIso;
542 } else if (fMuonIsoType.CompareTo("IsoRingsV0_BDTG_Iso") == 0) {
543 fMuIsoType = kIsoRingsV0_BDTG_Iso;
544 } else if (fMuonIsoType.CompareTo("IsoDeltaR") == 0) {
545 fMuIsoType = kIsoDeltaR;
546 } else {
547 SendError(kAbortAnalysis, "SlaveBegin",
548 "The specified muon isolation %s is not defined.",
549 fMuonIsoType.Data());
550 return;
551 }
552
553 if (fMuonClassType.CompareTo("All") == 0)
554 fMuClassType = kAll;
555 else if (fMuonClassType.CompareTo("Global") == 0)
556 fMuClassType = kGlobal;
557 else if (fMuonClassType.CompareTo("GlobalTracker") == 0)
558 fMuClassType = kGlobalTracker;
559 else if (fMuonClassType.CompareTo("Standalone") == 0)
560 fMuClassType = kSta;
561 else if (fMuonClassType.CompareTo("TrackerMuon") == 0)
562 fMuClassType = kTrackerMuon;
563 else if (fMuonClassType.CompareTo("CaloMuon") == 0)
564 fMuClassType = kCaloMuon;
565 else if (fMuonClassType.CompareTo("TrackerBased") == 0)
566 fMuClassType = kTrackerBased;
567 else {
568 SendError(kAbortAnalysis, "SlaveBegin",
569 "The specified muon class %s is not defined.",
570 fMuonClassType.Data());
571 return;
572 }
573
574
575 //If we use MVA ID, need to load MVA weights
576 if (fMuIsoType == kMVAIso_BDTG_IDIso || fMuIDType == kMVAID_BDTG_IDIso) {
577 fMuonTools = new MuonTools();
578 fMuonIDMVA = new MuonIDMVA();
579 fMuonIDMVA->Initialize("BDTG method",
580 string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/BarrelPtBin0_IDIsoCombined_BDTG.weights.xml"))),
581 string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/EndcapPtBin0_IDIsoCombined_BDTG.weights.xml"))),
582 string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/BarrelPtBin1_IDIsoCombined_BDTG.weights.xml"))),
583 string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/EndcapPtBin1_IDIsoCombined_BDTG.weights.xml"))),
584 string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/BarrelPtBin2_IDIsoCombined_BDTG.weights.xml"))),
585 string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/EndcapPtBin2_IDIsoCombined_BDTG.weights.xml"))),
586 MuonIDMVA::kIDIsoCombinedDetIso,
587 fTheRhoType);
588 }
589 else if(fMuIsoType == kIsoRingsV0_BDTG_Iso) {
590 std::vector<std::string> muonidiso_weightfiles;
591 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_barrel_lowpt.weights.xml"))));
592 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_barrel_highpt.weights.xml"))));
593 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_endcap_lowpt.weights.xml"))));
594 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_endcap_highpt.weights.xml"))));
595 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_tracker.weights.xml"))));
596 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_global.weights.xml"))));
597 fMuonTools = new MuonTools();
598 fMuonIDMVA = new MuonIDMVA();
599 fMuonIDMVA->Initialize("MuonIso_BDTG_IsoRings",
600 MuonIDMVA::kIsoRingsV0,
601 kTRUE,
602 muonidiso_weightfiles,
603 fTheRhoType);
604 }
605 else if(fMuIsoType == kIsoDeltaR) {
606 std::vector<std::string> muonidiso_weightfiles;
607 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_LB_BDT.weights.xml"))));
608 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_LE_BDT.weights.xml"))));
609 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_HB_BDT.weights.xml"))));
610 muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_HE_BDT.weights.xml"))));
611 fMuonTools = new MuonTools();
612 fMuonIDMVA = new MuonIDMVA();
613 fMuonIDMVA->Initialize("muonHZZ2012IsoDRMVA",
614 MuonIDMVA::kIsoDeltaR,
615 kTRUE,
616 muonidiso_weightfiles,
617 fTheRhoType);
618 }
619
620 }
621
622
623 //--------------------------------------------------------------------------------------------------
624 Bool_t MuonIDMod::PassMuonMVA_BDTG_IdIso(const Muon *mu, const Vertex *vertex,
625 const PileupEnergyDensityCol *PileupEnergyDensity) const
626 {
627
628 const Track *muTrk=0;
629 if(mu->HasTrackerTrk()) { muTrk = mu->TrackerTrk(); }
630 else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
631
632 Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFCandidates,PileupEnergyDensity);
633
634 Int_t subdet = 0;
635 if (fabs(muTrk->Eta()) < 1.479) subdet = 0;
636 else subdet = 1;
637 Int_t ptBin = 0;
638 if (muTrk->Pt() > 14.5) ptBin = 1;
639 if (muTrk->Pt() > 20.0) ptBin = 2;
640
641 Int_t MVABin = -1;
642 if (subdet == 0 && ptBin == 0) MVABin = 0;
643 else if (subdet == 1 && ptBin == 0) MVABin = 1;
644 else if (subdet == 0 && ptBin == 1) MVABin = 2;
645 else if (subdet == 1 && ptBin == 1) MVABin = 3;
646 else if (subdet == 0 && ptBin == 2) MVABin = 4;
647 else if (subdet == 1 && ptBin == 2) MVABin = 5;
648
649 Double_t MVACut = -999;
650 if (MVABin == 0) MVACut = -0.5618;
651 else if (MVABin == 1) MVACut = -0.3002;
652 else if (MVABin == 2) MVACut = -0.4642;
653 else if (MVABin == 3) MVACut = -0.2478;
654 else if (MVABin == 4) MVACut = 0.1706;
655 else if (MVABin == 5) MVACut = 0.8146;
656
657 if (MVAValue > MVACut) return kTRUE;
658 return kFALSE;
659 }
660
661 //--------------------------------------------------------------------------------------------------
662 Bool_t MuonIDMod::PassMuonIsoRingsV0_BDTG_Iso(const Muon *mu, const Vertex *vertex,
663 const PileupEnergyDensityCol *PileupEnergyDensity) const
664 {
665
666 Bool_t isDebug = kFALSE;
667 const Track *muTrk=0;
668 if(mu->HasTrackerTrk()) { muTrk = mu->TrackerTrk(); }
669 else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
670
671 ElectronOArr *tempElectrons = new ElectronOArr;
672 MuonOArr *tempMuons = new MuonOArr;
673 Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFCandidates,
674 PileupEnergyDensity,MuonTools::kMuEAFall11MC,tempElectrons,tempMuons,isDebug);
675 delete tempElectrons;
676 delete tempMuons;
677
678 Int_t MVABin = fMuonIDMVA->GetMVABin(muTrk->Eta(), muTrk->Pt(), mu->IsGlobalMuon(), mu->IsTrackerMuon());
679
680 Double_t MVACut = -1.0;
681 Double_t eta = mu->AbsEta();
682 if (mu->Pt() < 20 && eta < 1.479) MVACut = 0.86;
683 else if(mu->Pt() < 20 && eta >= 1.479) MVACut = 0.82;
684 else if(mu->Pt() >= 20 && eta < 1.479) MVACut = 0.82;
685 else if(mu->Pt() >= 20 && eta >= 1.479) MVACut = 0.86;
686
687 if(isDebug == kTRUE){
688 printf("PassMuonIsoRingsV0_BDTG_IsoDebug: %d, pt, eta = %f, %f, rho = %f(%f) : RingsMVA = %f, bin: %d\n",
689 GetEventHeader()->EvtNum(),mu->Pt(), mu->Eta(),
690 fPileupEnergyDensity->At(0)->Rho(),fPileupEnergyDensity->At(0)->RhoKt6PFJets(),MVAValue,MVABin);
691 }
692
693 if (MVAValue > MVACut) return kTRUE;
694 return kFALSE;
695 }
696
697 //--------------------------------------------------------------------------------------------------
698 Bool_t MuonIDMod::PassMuonIsoDeltaR(const Muon *mu, const Vertex *vertex,
699 const PileupEnergyDensityCol *PileupEnergyDensity) const
700 {
701
702 const Track *muTrk=0;
703 if(mu->HasTrackerTrk()) { muTrk = mu->TrackerTrk(); }
704 else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
705
706 ElectronOArr *tempElectrons = new ElectronOArr;
707 MuonOArr *tempMuons = new MuonOArr;
708 Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFNoPileUpCands,
709 PileupEnergyDensity,MuonTools::kMuEAFall11MC,tempElectrons,tempMuons,kFALSE);
710 delete tempElectrons;
711 delete tempMuons;
712
713 Int_t MVABin = fMuonIDMVA->GetMVABin(muTrk->Eta(), muTrk->Pt(), mu->IsGlobalMuon(), mu->IsTrackerMuon());
714
715 Double_t MVACut = -999;
716 if (MVABin == 0) MVACut = 0.000;
717 else if (MVABin == 1) MVACut = 0.000;
718 else if (MVABin == 2) MVACut = 0.000;
719 else if (MVABin == 3) MVACut = 0.000;
720
721 if (MVAValue > MVACut) return kTRUE;
722 return kFALSE;
723 }
724
725 //--------------------------------------------------------------------------------------------------
726 void MuonIDMod::Terminate()
727 {
728 // Run finishing code on the computer (slave) that did the analysis
729 delete fMuonIDMVA;
730
731 delete fMuonTools;
732 }