ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/MuonIDMod.cc
(Generate patch)

Comparing UserCode/MitPhysics/Mods/src/MuonIDMod.cc (file contents):
Revision 1.22 by ceballos, Mon Jun 1 17:31:38 2009 UTC vs.
Revision 1.64 by sixie, Mon Jan 23 20:27:14 2012 UTC

# Line 2 | Line 2
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;
# Line 13 | Line 16 | ClassImp(mithep::MuonIDMod)
16    BaseMod(name,title),
17    fMuonBranchName(Names::gkMuonBrn),
18    fCleanMuonsName(ModNames::gkCleanMuonsName),  
19 <  fVertexName("PrimaryVertexesBeamSpot"),
20 <  fMuonIDType("Loose"),
21 <  fMuonIsoType("TrackCaloSliding"),  
19 >  fNonIsolatedMuonsName("random"),  
20 >  fNonIsolatedElectronsName("random"),  
21 >  fVertexName(ModNames::gkGoodVertexesName),
22 >  fBeamSpotName(Names::gkBeamSpotBrn),
23 >  fTrackName(Names::gkTrackBrn),
24 >  fPFCandidatesName(Names::gkPFCandidatesBrn),
25 >  fMuonIDType("WWMuIdV3"),
26 >  fMuonIsoType("PFIso"),
27    fMuonClassType("Global"),  
28    fTrackIsolationCut(3.0),
29    fCaloIsolationCut(3.0),
30 <  fCombIsolationCut(5.0),
30 >  fCombIsolationCut(0.15),
31 >  fCombRelativeIsolationCut(0.15),
32 >  fPFIsolationCut(-1.0),
33    fMuonPtMin(10),
34    fApplyD0Cut(kTRUE),
35 <  fD0Cut(0.025),
36 <  fReverseIsoCut(kFALSE),
37 <  fReverseD0Cut(kFALSE),
35 >  fApplyDZCut(kTRUE),
36 >  fD0Cut(0.020),
37 >  fDZCut(0.10),
38 >  fWhichVertex(-1),
39 >  fEtaCut(2.4),
40    fMuIDType(kIdUndef),
41    fMuIsoType(kIsoUndef),
42    fMuClassType(kClassUndef),
43    fMuons(0),
44    fVertices(0),
45 <  fMuonTools(0)
45 >  fBeamSpot(0),
46 >  fTracks(0),
47 >  fPFCandidates(0),
48 >  fIntRadius(0.0),
49 >  fNonIsolatedMuons(0),
50 >  fNonIsolatedElectrons(0),
51 >  fPileupEnergyDensityName(Names::gkPileupEnergyDensityBrn),
52 >  fPileupEnergyDensity(0),
53 >  fMuonTools(0),
54 >  fMuonIDMVA(0),
55 >  fMuonMVAWeights_Subdet0Pt10To14p5(""),
56 >  fMuonMVAWeights_Subdet1Pt10To14p5(""),
57 >  fMuonMVAWeights_Subdet0Pt14p5To20(""),
58 >  fMuonMVAWeights_Subdet1Pt14p5To20(""),
59 >  fMuonMVAWeights_Subdet0Pt20ToInf(""),
60 >  fMuonMVAWeights_Subdet1Pt20ToInf("")
61   {
62    // Constructor.
63   }
# Line 40 | Line 67 | void MuonIDMod::Process()
67   {
68    // Process entries of the tree.
69  
70 <  LoadEventObject(fMuonBranchName, fMuons);
71 <  LoadEventObject(fVertexName,     fVertices);
70 >  if(fMuIsoType != kPFIsoNoL) {
71 >    LoadEventObject(fMuonBranchName, fMuons);
72 >  }
73 >  else {
74 >    fMuons = GetObjThisEvt<MuonOArr>(fMuonBranchName);
75 >  }
76 >  LoadEventObject(fBeamSpotName, fBeamSpot);
77 >  LoadEventObject(fTrackName, fTracks);
78 >  LoadEventObject(fPFCandidatesName, fPFCandidates);
79 >  if(fMuIsoType == kTrackCaloSliding ||
80 >     fMuIsoType == kCombinedRelativeConeAreaCorrected ||
81 >     fMuIsoType == kPFIsoEffectiveAreaCorrected ||
82 >     fMuIsoType == kMVAIso_BDTG_IDIso  
83 >    ) {
84 >    LoadEventObject(fPileupEnergyDensityName, fPileupEnergyDensity);
85 >  }
86  
87    MuonOArr *CleanMuons = new MuonOArr;
88    CleanMuons->SetName(fCleanMuonsName);
89  
90 +  fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
91 +
92    for (UInt_t i=0; i<fMuons->GetEntries(); ++i) {
93      const Muon *mu = fMuons->At(i);
94  
95      Bool_t pass = kFALSE;
96 <    Double_t pt = 0; // make sure pt is taken from the correct track!
96 >    Double_t pt = 0;  // make sure pt is taken from the correct track!
97 >    Double_t eta = 0; // make sure eta is taken from the correct track!
98      switch (fMuClassType) {
99        case kAll:
100          pass = kTRUE;
101 <        if (mu->HasTrk())
102 <          pt = mu->Pt();
101 >        if (mu->HasTrk()) {
102 >          pt  = mu->Pt();
103 >          eta = TMath::Abs(mu->Eta());
104 >        }
105          break;
106        case kGlobal:
107 <        pass = mu->HasGlobalTrk();
108 <        if (pass)
109 <          pt = mu->GlobalTrk()->Pt();
110 <        break;
107 >        pass = mu->HasGlobalTrk() && mu->IsTrackerMuon();
108 >        if (pass && mu->TrackerTrk()) {
109 >          pt  = mu->TrackerTrk()->Pt();
110 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
111 >        }
112 >        else {
113 >          pt  = mu->Pt();
114 >          eta = TMath::Abs(mu->Eta());
115 >        }
116 >        break;
117 >      case kGlobalTracker:
118 >        pass = (mu->HasGlobalTrk() && mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof() < 10 &&
119 >               (mu->NSegments() > 1 || mu->NMatches() > 1) && mu->NValidHits() > 0) ||
120 >               (mu->IsTrackerMuon() &&
121 >                mu->Quality().Quality(MuonQuality::TMLastStationTight));
122 >        if (pass) {
123 >          pt  = mu->TrackerTrk()->Pt();
124 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
125 >        }
126 >        else {
127 >          pt  = mu->Pt();
128 >          eta = TMath::Abs(mu->Eta());
129 >        }
130 >        break;
131        case kSta:
132          pass = mu->HasStandaloneTrk();
133 <        if (pass)
134 <          pt = mu->StandaloneTrk()->Pt();
133 >        if (pass) {
134 >          pt  = mu->StandaloneTrk()->Pt();
135 >          eta = TMath::Abs(mu->StandaloneTrk()->Eta());
136 >        }
137 >        break;
138 >      case kTrackerMuon:
139 >        pass = mu->HasTrackerTrk() && mu->IsTrackerMuon() &&
140 >               mu->Quality().Quality(MuonQuality::TrackerMuonArbitrated);
141 >        if (pass) {
142 >          pt  = mu->TrackerTrk()->Pt();
143 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
144 >        }
145 >        break;
146 >      case kCaloMuon:
147 >        pass = mu->HasTrackerTrk() && mu->IsCaloMuon();
148 >        if (pass) {
149 >          pt  = mu->TrackerTrk()->Pt();
150 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
151 >        }
152          break;
153 <      case kTrackerOnly:
153 >      case kTrackerBased:
154          pass = mu->HasTrackerTrk();
155 <        if (pass)
156 <          pt = mu->TrackerTrk()->Pt();
155 >        if (pass) {
156 >          pt  = mu->TrackerTrk()->Pt();
157 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
158 >        }
159          break;
160        default:
161          break;
# Line 82 | Line 167 | void MuonIDMod::Process()
167      if (pt <= fMuonPtMin)
168        continue;
169  
170 +    if (eta >= fEtaCut)
171 +      continue;
172 +
173 +    Double_t RChi2 = 0.0;
174 +    if     (mu->HasGlobalTrk()) {
175 +      RChi2 = mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof();
176 +    }
177 +    else if(mu->BestTrk() != 0){
178 +      RChi2 = mu->BestTrk()->Chi2()/mu->BestTrk()->Ndof();
179 +    }
180      Bool_t idpass = kFALSE;
181      switch (fMuIDType) {
182 +      case kWMuId:
183 +        idpass = mu->BestTrk() != 0 &&
184 +                 mu->BestTrk()->NHits() > 10 &&
185 +                 RChi2 < 10.0 &&
186 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
187 +                 mu->BestTrk()->NPixelHits() > 0 &&
188 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
189 +        break;
190 +      case kZMuId:
191 +        idpass = mu->BestTrk() != 0 &&
192 +                 mu->BestTrk()->NHits() > 10 &&
193 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
194 +                 mu->BestTrk()->NPixelHits() > 0 &&
195 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
196 +        break;
197        case kLoose:
198 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationLoose) &&
199 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityLoose);
198 >        idpass = mu->BestTrk() != 0 &&
199 >                 mu->Quality().Quality(MuonQuality::TMOneStationLoose) &&
200 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityLoose) &&
201 >                 mu->BestTrk()->NHits() > 10 &&
202 >                 RChi2 < 10.0 &&
203 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
204          break;
205        case kTight:
206 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationTight) &&
207 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityTight);
206 >        idpass = mu->BestTrk() !=  0 &&
207 >                 mu->Quality().Quality(MuonQuality::TMOneStationTight) &&
208 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityTight) &&
209 >                 mu->BestTrk()->NHits() > 10 &&
210 >                 RChi2 < 10.0 &&
211 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
212 >        break;
213 >      case kWWMuIdV1:
214 >        idpass = mu->BestTrk() != 0 &&
215 >                 mu->BestTrk()->NHits() > 10 &&
216 >                 mu->BestTrk()->NPixelHits() > 0 &&
217 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
218 >                 RChi2 < 10.0 &&
219 >                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
220 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
221 >        break;
222 >      case kWWMuIdV2:
223 >        idpass = mu->BestTrk() != 0 &&
224 >                 mu->BestTrk()->NHits() > 10 &&
225 >                 mu->BestTrk()->NPixelHits() > 0 &&
226 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1;
227 >        break;
228 >      case kWWMuIdV3:
229 >        idpass = mu->BestTrk() != 0 &&
230 >                 mu->BestTrk()->NHits() > 10 &&
231 >                 mu->BestTrk()->NPixelHits() > 0 &&
232 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
233 >                 mu->TrkKink() < 20.0;
234 >        break;
235 >      case kMVAID_BDTG_IDIso:
236 >        {
237 >          Bool_t passDenominatorM2 = (mu->BestTrk() != 0 &&
238 >                                      mu->BestTrk()->NHits() > 10 &&
239 >                                      mu->BestTrk()->NPixelHits() > 0 &&
240 >                                      mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
241 >                                      MuonTools::PassD0Cut(mu, fVertices, 0.20, 0) &&
242 >                                      MuonTools::PassDZCut(mu, fVertices, 0.10, 0) &&
243 >                                      mu->TrkKink() < 20.0
244 >            );  
245 >          idpass =  passDenominatorM2;
246 >          //only evaluate MVA if muon passes M2 denominator to save time
247 >          if (idpass) idpass = PassMuonMVA_BDTG_IdIso(mu, fVertices->At(0), fPileupEnergyDensity);
248 >        }
249          break;
250        case kNoId:
251          idpass = kTRUE;
# Line 109 | Line 264 | void MuonIDMod::Process()
264            (mu->IsoR03EmEt() + mu->IsoR03HadEt() < fCaloIsolationCut);
265          break;
266        case kTrackCaloCombined:
267 <        isocut = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
268 <                   1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
267 >        isocut = (1.0 * mu->IsoR03SumPt() +
268 >                  1.0 * mu->IsoR03EmEt()  +
269 >                  1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
270          break;
271        case kTrackCaloSliding:
272          {
273 <          Double_t totalIso = 1.0 * mu->IsoR03SumPt() +
274 <                              1.0 * mu->IsoR03EmEt() +
275 <                              1.0 * mu->IsoR03HadEt();
276 <          if ((totalIso < (pt-10.0)*5.0/15.0 && pt <= 25) ||
277 <              (totalIso < 5.0 && mu->Pt() > 25) ||
278 <               totalIso <= 0)
273 >          const PileupEnergyDensity *rho =  fPileupEnergyDensity->At(0);
274 >          Double_t totalIso =  mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt() - rho->Rho() * TMath::Pi() * 0.3 * 0.3 ;
275 >          // trick to change the signal region cut
276 >          double theIsoCut = fCombIsolationCut;
277 >          if(theIsoCut < 0.20){
278 >            if(mu->Pt() >  20.0) theIsoCut = 0.15;
279 >            else                 theIsoCut = 0.10;
280 >          }
281 >          if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
282 >        }
283 >        break;
284 >      case kTrackCaloSlidingNoCorrection:
285 >        {
286 >          Double_t totalIso =  1.0 * mu->IsoR03SumPt() +
287 >                               1.0 * mu->IsoR03EmEt()  +
288 >                               1.0 * mu->IsoR03HadEt();
289 >          // trick to change the signal region cut
290 >          double theIsoCut = fCombIsolationCut;
291 >          if(theIsoCut < 0.20){
292 >            if(mu->Pt() >  20.0) theIsoCut = 0.15;
293 >            else                 theIsoCut = 0.10;
294 >          }
295 >          if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
296 >        }
297 >        break;
298 >      case kCombinedRelativeConeAreaCorrected:
299 >        {
300 >          const PileupEnergyDensity *rho =  fPileupEnergyDensity->At(0);
301 >          Double_t totalIso =  mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt() - rho->Rho() * TMath::Pi() * 0.3 * 0.3 ;
302 >          double theIsoCut = fCombRelativeIsolationCut;
303 >          if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
304 >        }
305 >        break;          
306 >      case kCombinedRelativeEffectiveAreaCorrected:
307 >        {
308 >          Double_t tmpRho = 0;
309 >          if (!(TMath::IsNaN(fPileupEnergyDensity->At(0)->Rho()) || isinf(fPileupEnergyDensity->At(0)->Rho())))
310 >            tmpRho = fPileupEnergyDensity->At(0)->Rho();
311 >          
312 >          isocut = ( mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt()
313 >                     -  tmpRho*MuonTools::MuonEffectiveArea(MuonTools::kMuEMIso03, mu->Eta())
314 >                     -  tmpRho*MuonTools::MuonEffectiveArea(MuonTools::kMuHadIso03, mu->Eta())
315 >            ) < (mu->Pt()* 0.40);
316 >        }
317 >        break;          
318 >      case kPFIso:
319 >        {
320 >          Double_t pfIsoCutValue = 9999;
321 >          if(fPFIsolationCut > 0){
322 >            pfIsoCutValue = fPFIsolationCut;
323 >          } else {
324 >            if (mu->AbsEta() < 1.479) {
325 >              if (mu->Pt() > 20) {
326 >                pfIsoCutValue = 0.13;
327 >              } else {
328 >                pfIsoCutValue = 0.06;
329 >              }
330 >            } else {
331 >              if (mu->Pt() > 20) {
332 >                pfIsoCutValue = 0.09;
333 >              } else {
334 >                pfIsoCutValue = 0.05;
335 >              }
336 >            }
337 >          }
338 >          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
339 >          if (totalIso < (mu->Pt()*pfIsoCutValue) )
340              isocut = kTRUE;
124
125          if     (fReverseIsoCut == kTRUE &&
126                  isocut == kFALSE && totalIso < 10)
127            isocut = kTRUE;
128          else if(fReverseIsoCut == kTRUE)
129            isocut = kFALSE;
341          }
342          break;
343 +      case kPFIsoEffectiveAreaCorrected:
344 +        {
345 +          Double_t pfIsoCutValue = 9999;
346 +          if(fPFIsolationCut > 0){
347 +            pfIsoCutValue = fPFIsolationCut;
348 +          } else {
349 +            pfIsoCutValue = fPFIsolationCut; //leave it like this for now
350 +          }
351 +          Double_t EffectiveAreaCorrectedPFIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius)
352 +            - fPileupEnergyDensity->At(0)->Rho() * MuonTools::MuonEffectiveArea(MuonTools::kMuNeutralIso03, mu->Eta());
353 +          isocut = EffectiveAreaCorrectedPFIso < (mu->Pt() * pfIsoCutValue);
354 +          break;
355 +        }
356 +      case kPFIsoNoL:
357 +        {
358 +          fNonIsolatedMuons     = GetObjThisEvt<MuonCol>(fNonIsolatedMuonsName);
359 +          fNonIsolatedElectrons = GetObjThisEvt<ElectronCol>(fNonIsolatedElectronsName);
360 +
361 +          Double_t pfIsoCutValue = 9999;
362 +          if(fPFIsolationCut > 0){
363 +            pfIsoCutValue = fPFIsolationCut;
364 +          } else {
365 +            if (mu->AbsEta() < 1.479) {
366 +              if (mu->Pt() > 20) {
367 +                pfIsoCutValue = 0.13;
368 +              } else {
369 +                pfIsoCutValue = 0.06;
370 +              }
371 +            } else {
372 +              if (mu->Pt() > 20) {
373 +                pfIsoCutValue = 0.09;
374 +              } else {
375 +                pfIsoCutValue = 0.05;
376 +              }
377 +            }
378 +          }
379 +          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fNonIsolatedMuons, fNonIsolatedElectrons, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
380 +          if (totalIso < (mu->Pt()*pfIsoCutValue) )
381 +            isocut = kTRUE;
382 +        }
383 +        break;
384 +      case kMVAIso_BDTG_IDIso:
385 +      {
386 +        Double_t tmpRho = 0;
387 +        if (!(TMath::IsNaN(fPileupEnergyDensity->At(0)->Rho()) || isinf(fPileupEnergyDensity->At(0)->Rho())))
388 +          tmpRho = fPileupEnergyDensity->At(0)->Rho();
389 +
390 +        isocut = ( mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt()
391 +                   -  tmpRho*MuonTools::MuonEffectiveArea(MuonTools::kMuEMIso03, mu->Eta())
392 +                   -  tmpRho*MuonTools::MuonEffectiveArea(MuonTools::kMuHadIso03, mu->Eta())
393 +          ) < (mu->Pt()* 0.40);
394 +      }
395 +        break;
396        case kNoIso:
397          isocut = kTRUE;
398          break;
# Line 140 | Line 404 | void MuonIDMod::Process()
404      if (isocut == kFALSE)
405        continue;
406  
407 +    // apply d0 cut
408      if (fApplyD0Cut) {
409 <      Bool_t d0cut = kFALSE;
410 <      const Track *mt = mu->BestTrk();
411 <      if (!mt)
412 <        continue;
148 <      Double_t d0_real = 1e30;
149 <      for(UInt_t i0 = 0; i0 < fVertices->GetEntries(); i0++) {
150 <        Double_t pD0 = mt->D0Corrected(*fVertices->At(i0));
151 <        if(TMath::Abs(pD0) < TMath::Abs(d0_real))
152 <          d0_real = TMath::Abs(pD0);
409 >      Bool_t passD0cut = kTRUE;
410 >      if(fD0Cut < 0.05) { // trick to change the signal region cut
411 >        if      (mu->Pt() >  20.0) fD0Cut = 0.02;
412 >        else if (mu->Pt() <= 20.0) fD0Cut = 0.01;
413        }
414 <      if(d0_real < fD0Cut) d0cut = kTRUE;
415 <
416 <      if     (fReverseD0Cut == kTRUE &&
417 <              d0cut == kFALSE && d0_real < 0.05)
418 <        d0cut = kTRUE;
159 <      else if(fReverseD0Cut == kTRUE)
160 <        d0cut = kFALSE;
414 >      if(fWhichVertex >= -1) passD0cut = MuonTools::PassD0Cut(mu, fVertices, fD0Cut, fWhichVertex);
415 >      else                   passD0cut = MuonTools::PassD0Cut(mu, fBeamSpot, fD0Cut);
416 >      if (!passD0cut)
417 >        continue;
418 >    }
419  
420 <      if (d0cut == kFALSE)
420 >    // apply dz cut
421 >    if (fApplyDZCut) {
422 >      Bool_t passDZcut = MuonTools::PassDZCut(mu, fVertices, fDZCut, fWhichVertex);
423 >      if (!passDZcut)
424          continue;
425      }
426  
# Line 180 | Line 441 | void MuonIDMod::SlaveBegin()
441    // Run startup code on the computer (slave) doing the actual analysis. Here,
442    // we just request the muon collection branch.
443  
444 <  ReqEventObject(fMuonBranchName, fMuons, kTRUE);
445 <
446 <  if (fApplyD0Cut)
447 <    ReqEventObject(fVertexName, fVertices, kTRUE);
444 >   // In this case we cannot have a branch
445 >  if (fMuonIsoType.CompareTo("PFIsoNoL") != 0) {
446 >    ReqEventObject(fMuonBranchName, fMuons, kTRUE);
447 >  }
448 >  ReqEventObject(fBeamSpotName, fBeamSpot, kTRUE);
449 >  ReqEventObject(fTrackName, fTracks, kTRUE);
450 >  ReqEventObject(fPFCandidatesName, fPFCandidates, kTRUE);
451 >  if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0
452 >      || fMuonIsoType.CompareTo("CombinedRelativeConeAreaCorrected") == 0
453 >      || fMuonIsoType.CompareTo("CombinedRelativeEffectiveAreaCorrected") == 0
454 >       || fMuonIsoType.CompareTo("PFIsoEffectiveAreaCorrected") == 0
455 >      || fMuonIsoType.CompareTo("MVA_BDTG_IDIso") == 0
456 >    ) {
457 >    ReqEventObject(fPileupEnergyDensityName, fPileupEnergyDensity, kTRUE);
458 >  }
459  
188  fMuonTools = new MuonTools;
460  
461 <  if (fMuonIDType.CompareTo("Tight") == 0)
461 >  if (fMuonIDType.CompareTo("WMuId") == 0)
462 >    fMuIDType = kWMuId;
463 >  else if (fMuonIDType.CompareTo("ZMuId") == 0)
464 >    fMuIDType = kZMuId;
465 >  else if (fMuonIDType.CompareTo("Tight") == 0)
466      fMuIDType = kTight;
467    else if (fMuonIDType.CompareTo("Loose") == 0)
468      fMuIDType = kLoose;
469 +  else if (fMuonIDType.CompareTo("WWMuIdV1") == 0)
470 +    fMuIDType = kWWMuIdV1;
471 +  else if (fMuonIDType.CompareTo("WWMuIdV2") == 0)
472 +    fMuIDType = kWWMuIdV2;
473 +  else if (fMuonIDType.CompareTo("WWMuIdV3") == 0)
474 +    fMuIDType = kWWMuIdV3;
475    else if (fMuonIDType.CompareTo("NoId") == 0)
476      fMuIDType = kNoId;
477    else if (fMuonIDType.CompareTo("Custom") == 0) {
478      fMuIDType = kCustomId;
479      SendError(kWarning, "SlaveBegin",
480                "Custom muon identification is not yet implemented.");
481 +  } else if (fMuonIDType.CompareTo("MVA_BDTG_IDIso") == 0) {
482 +    fMuIDType = kMVAID_BDTG_IDIso;
483    } else {
484      SendError(kAbortAnalysis, "SlaveBegin",
485                "The specified muon identification %s is not defined.",
# Line 210 | Line 493 | void MuonIDMod::SlaveBegin()
493      fMuIsoType = kTrackCaloCombined;
494    else if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0)
495      fMuIsoType = kTrackCaloSliding;
496 +  else if (fMuonIsoType.CompareTo("TrackCaloSlidingNoCorrection") == 0)
497 +    fMuIsoType = kTrackCaloSlidingNoCorrection;
498 +  else if (fMuonIsoType.CompareTo("CombinedRelativeConeAreaCorrected") == 0)
499 +    fMuIsoType = kCombinedRelativeConeAreaCorrected;
500 +  else if (fMuonIsoType.CompareTo("CombinedRelativeEffectiveAreaCorrected") == 0)
501 +    fMuIsoType = kCombinedRelativeEffectiveAreaCorrected;
502 +  else if (fMuonIsoType.CompareTo("PFIso") == 0)
503 +    fMuIsoType = kPFIso;
504 +  else if (fMuonIsoType.CompareTo("PFIsoEffectiveAreaCorrected") == 0)
505 +    fMuIsoType = kPFIsoEffectiveAreaCorrected;
506 +  else if (fMuonIsoType.CompareTo("PFIsoNoL") == 0)
507 +    fMuIsoType = kPFIsoNoL;
508    else if (fMuonIsoType.CompareTo("NoIso") == 0)
509      fMuIsoType = kNoIso;
510    else if (fMuonIsoType.CompareTo("Custom") == 0) {
511      fMuIsoType = kCustomIso;
512      SendError(kWarning, "SlaveBegin",
513                "Custom muon isolation is not yet implemented.");
514 +  } else if (fMuonIDType.CompareTo("MVA_BDTG_IDIso") == 0) {
515 +    fMuIsoType = kMVAIso_BDTG_IDIso;
516    } else {
517      SendError(kAbortAnalysis, "SlaveBegin",
518                "The specified muon isolation %s is not defined.",
# Line 227 | Line 524 | void MuonIDMod::SlaveBegin()
524      fMuClassType = kAll;
525    else if (fMuonClassType.CompareTo("Global") == 0)
526      fMuClassType = kGlobal;
527 +  else if (fMuonClassType.CompareTo("GlobalTracker") == 0)
528 +    fMuClassType = kGlobalTracker;
529    else if (fMuonClassType.CompareTo("Standalone") == 0)
530      fMuClassType = kSta;
531 <  else if (fMuonClassType.CompareTo("TrackerOnly") == 0)
532 <    fMuClassType = kTrackerOnly;
531 >  else if (fMuonClassType.CompareTo("TrackerMuon") == 0)
532 >    fMuClassType = kTrackerMuon;
533 >  else if (fMuonClassType.CompareTo("CaloMuon") == 0)
534 >    fMuClassType = kCaloMuon;
535 >  else if (fMuonClassType.CompareTo("TrackerBased") == 0)
536 >    fMuClassType = kTrackerBased;
537    else {
538      SendError(kAbortAnalysis, "SlaveBegin",
539                "The specified muon class %s is not defined.",
540                fMuonClassType.Data());
541      return;
542    }
543 +
544 +
545 +  //If we use MVA ID, need to load MVA weights
546 +  if(fMuIsoType == kMVAIso_BDTG_IDIso || fMuIDType == kMVAID_BDTG_IDIso) {
547 +    fMuonTools = new MuonTools();
548 +    fMuonIDMVA = new MuonIDMVA();
549 +    fMuonIDMVA->Initialize("BDTG method",
550 +                           fMuonMVAWeights_Subdet0Pt10To14p5,
551 +                           fMuonMVAWeights_Subdet1Pt10To14p5,
552 +                           fMuonMVAWeights_Subdet0Pt14p5To20,
553 +                           fMuonMVAWeights_Subdet1Pt14p5To20,
554 +                           fMuonMVAWeights_Subdet0Pt20ToInf,
555 +                           fMuonMVAWeights_Subdet1Pt20ToInf,
556 +                           MuonIDMVA::kIDIsoCombinedDetIso);
557 +  }
558 +
559 + }
560 +
561 +
562 + //--------------------------------------------------------------------------------------------------
563 + Bool_t MuonIDMod::PassMuonMVA_BDTG_IdIso(const Muon *mu, const Vertex *vertex,
564 +                                         const PileupEnergyDensityCol *PileupEnergyDensity) const
565 + {
566 +
567 +  const Track *muTrk=0;
568 +  if(mu->HasTrackerTrk())         { muTrk = mu->TrackerTrk();    }
569 +  else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
570 +  
571 +  Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFCandidates,PileupEnergyDensity);
572 +
573 +  Int_t subdet = 0;
574 +  if (fabs(muTrk->Eta()) < 1.479) subdet = 0;
575 +  else subdet = 1;
576 +  Int_t ptBin = 0;
577 +  if (muTrk->Pt() > 14.5) ptBin = 1;
578 +  if (muTrk->Pt() > 20.0) ptBin = 2;
579 +
580 +  Int_t MVABin = -1;
581 +  if (subdet == 0 && ptBin == 0) MVABin = 0;
582 +  if (subdet == 1 && ptBin == 0) MVABin = 1;
583 +  if (subdet == 0 && ptBin == 1) MVABin = 2;
584 +  if (subdet == 1 && ptBin == 1) MVABin = 3;
585 +  if (subdet == 0 && ptBin == 2) MVABin = 4;
586 +  if (subdet == 1 && ptBin == 2) MVABin = 5;
587 +
588 +  Double_t MVACut = -999;
589 +  if (MVABin == 0) MVACut = -0.5618;
590 +  if (MVABin == 1) MVACut = -0.3002;
591 +  if (MVABin == 2) MVACut = -0.4642;
592 +  if (MVABin == 3) MVACut = -0.2478;
593 +  if (MVABin == 4) MVACut = 0.1706;
594 +  if (MVABin == 5) MVACut = 0.8146;
595 +
596 +  if (MVAValue > MVACut) return kTRUE;
597 +  return kFALSE;
598   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines