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.13 by loizides, Thu Dec 11 15:53:03 2008 UTC vs.
Revision 1.79 by ceballos, Sun May 6 12:27:41 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 11 | Line 14 | ClassImp(mithep::MuonIDMod)
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 <  fMuonIDType("Loose"),
21 <  fMuonIsoType("TrackCaloSliding"),  
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(5.0),
31 >  fCombIsolationCut(0.15),
32 >  fCombRelativeIsolationCut(0.15),
33 >  fPFIsolationCut(-1.0),
34    fMuonPtMin(10),
35 <  fMuons(0)
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   }
# Line 30 | Line 64 | void MuonIDMod::Process()
64   {
65    // Process entries of the tree.
66  
67 <  LoadBranch(fMuonBranchName);
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 <  for (UInt_t i=0; i<fMuons->GetEntries(); ++i) {
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 = -1; // make sure pt is taken from the correct track!
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 <        pt = mu->Pt();
102 >        if (mu->HasTrk()) {
103 >          pt  = mu->Pt();
104 >          eta = TMath::Abs(mu->Eta());
105 >        }
106          break;
107        case kGlobal:
108 <        pass = (mu->GlobalTrk() != 0);
109 <        if (pass)
110 <          pt = mu->GlobalTrk()->Pt();
111 <        break;
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->StandaloneTrk() != 0);
134 <        if (pass)
135 <          pt = mu->StandaloneTrk()->Pt();
136 <        break;
137 <      case kTrackerOnly:
138 <        pass = (mu->TrackerTrk() != 0);
139 <        if (pass)
140 <          pt = mu->TrackerTrk()->Pt();
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;
# Line 70 | Line 168 | void MuonIDMod::Process()
168      if (pt <= fMuonPtMin)
169        continue;
170  
171 +    if (eta >= fEtaCut)
172 +      continue;
173 +
174 +
175 +    //***********************************************************************************************
176 +    //Debug Info For Lepton MVA
177 +    //***********************************************************************************************
178 +    if( fPrintMVADebugInfo &&
179 +        (fMuIsoType == kMVAIso_BDTG_IDIso || fMuIDType == kMVAID_BDTG_IDIso)
180 +      ) {
181 +      cout << "Event: " << GetEventHeader()->RunNum() << " " << GetEventHeader()->LumiSec() << " "
182 +           << GetEventHeader()->EvtNum() << " : Rho = " << fPileupEnergyDensity->At(0)->Rho()
183 +           << " : Muon " << i << " "
184 +           << endl;
185 +      fMuonIDMVA->MVAValue(mu,fVertices->At(0),fMuonTools,fPFCandidates,fPileupEnergyDensity,kTRUE);
186 +    }
187 +    //***********************************************************************************************
188 +
189 +
190 +    Double_t RChi2 = 0.0;
191 +    if     (mu->HasGlobalTrk()) {
192 +      RChi2 = mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof();
193 +    }
194 +    else if(mu->BestTrk() != 0){
195 +      RChi2 = mu->BestTrk()->Chi2()/mu->BestTrk()->Ndof();
196 +    }
197      Bool_t idpass = kFALSE;
198      switch (fMuIDType) {
199 +      case kWMuId:
200 +        idpass = mu->BestTrk() != 0 &&
201 +                 mu->BestTrk()->NHits() > 10 &&
202 +                 RChi2 < 10.0 &&
203 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
204 +                 mu->BestTrk()->NPixelHits() > 0 &&
205 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
206 +        break;
207 +      case kZMuId:
208 +        idpass = mu->BestTrk() != 0 &&
209 +                 mu->BestTrk()->NHits() > 10 &&
210 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
211 +                 mu->BestTrk()->NPixelHits() > 0 &&
212 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
213 +        break;
214        case kLoose:
215 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationLoose) &&
216 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityLoose);
215 >        idpass = mu->BestTrk() != 0 &&
216 >                 mu->Quality().Quality(MuonQuality::TMOneStationLoose) &&
217 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityLoose) &&
218 >                 mu->BestTrk()->NHits() > 10 &&
219 >                 RChi2 < 10.0 &&
220 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
221          break;
222        case kTight:
223 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationTight) &&
224 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityTight);
223 >        idpass = mu->BestTrk() !=  0 &&
224 >                 mu->Quality().Quality(MuonQuality::TMOneStationTight) &&
225 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityTight) &&
226 >                 mu->BestTrk()->NHits() > 10 &&
227 >                 RChi2 < 10.0 &&
228 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
229 >        break;
230 >      case kWWMuIdV1:
231 >        idpass = mu->BestTrk() != 0 &&
232 >                 mu->BestTrk()->NHits() > 10 &&
233 >                 mu->BestTrk()->NPixelHits() > 0 &&
234 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
235 >                 RChi2 < 10.0 &&
236 >                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
237 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
238 >        break;
239 >      case kWWMuIdV2:
240 >        idpass = mu->BestTrk() != 0 &&
241 >                 mu->BestTrk()->NHits() > 10 &&
242 >                 mu->BestTrk()->NPixelHits() > 0 &&
243 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1;
244 >        break;
245 >      case kWWMuIdV3:
246 >        idpass = mu->BestTrk() != 0 &&
247 >                 mu->BestTrk()->NHits() > 10 &&
248 >                 mu->BestTrk()->NPixelHits() > 0 &&
249 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
250 >                 mu->TrkKink() < 20.0;
251 >        break;
252 >      case kWWMuIdV4:
253 >        idpass = mu->BestTrk() != 0 &&
254 >                 mu->NTrkLayersHit() > 5 &&
255 >                 mu->IsPFMuon() == kTRUE &&
256 >                 mu->BestTrk()->NPixelHits() > 0 &&
257 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
258 >                 mu->TrkKink() < 20.0;
259 >        break;
260 >      case kMVAID_BDTG_IDIso:
261 >        {
262 >          Bool_t passDenominatorM2 = (mu->BestTrk() != 0 &&
263 >                                      mu->BestTrk()->NHits() > 10 &&
264 >                                      mu->BestTrk()->NPixelHits() > 0 &&
265 >                                      mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
266 >                                      MuonTools::PassD0Cut(mu, fVertices, 0.20, 0) &&
267 >                                      MuonTools::PassDZCut(mu, fVertices, 0.10, 0) &&
268 >                                      mu->TrkKink() < 20.0
269 >            );  
270 >          idpass =  passDenominatorM2;
271 >          //only evaluate MVA if muon passes M2 denominator to save time
272 >          if (idpass) idpass = PassMuonMVA_BDTG_IdIso(mu, fVertices->At(0), fPileupEnergyDensity);
273 >        }
274 >        break;
275 >      case kNoId:
276 >        idpass = kTRUE;
277          break;
278        default:
279          break;
# Line 87 | Line 282 | void MuonIDMod::Process()
282      if (!idpass)
283        continue;
284  
285 <    Bool_t isopass = kFALSE;
285 >    Double_t Rho = 0.;
286 >    if(fPileupEnergyDensity){
287 >      const PileupEnergyDensity *rho =  fPileupEnergyDensity->At(0);
288 >
289 >      switch (fTheRhoType) {
290 >      case RhoUtilities::MIT_RHO_VORONOI_LOW_ETA:
291 >        Rho = rho->RhoLowEta();
292 >        break;
293 >      case RhoUtilities::MIT_RHO_VORONOI_HIGH_ETA:
294 >        Rho = rho->Rho();
295 >        break;
296 >      case RhoUtilities::MIT_RHO_RANDOM_LOW_ETA:
297 >        Rho = rho->RhoRandomLowEta();
298 >        break;
299 >      case RhoUtilities::MIT_RHO_RANDOM_HIGH_ETA:
300 >        Rho = rho->RhoRandom();
301 >        break;
302 >      default:
303 >        Rho = rho->Rho();
304 >      }
305 >
306 >      if ((TMath::IsNaN(fPileupEnergyDensity->At(0)->Rho()) || std::isinf(fPileupEnergyDensity->At(0)->Rho()))) Rho = 0.;
307 >    }
308 >
309 >    Bool_t isocut = kFALSE;
310      switch (fMuIsoType) {
311        case kTrackCalo:
312 <        isopass = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
312 >        isocut = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
313            (mu->IsoR03EmEt() + mu->IsoR03HadEt() < fCaloIsolationCut);
314          break;
315        case kTrackCaloCombined:
316 <        isopass = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
317 <                   1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
316 >        isocut = (1.0 * mu->IsoR03SumPt() +
317 >                  1.0 * mu->IsoR03EmEt()  +
318 >                  1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
319          break;
320        case kTrackCaloSliding:
321          {
322 <          Double_t totalIso = 1.0 * mu->IsoR03SumPt() +
323 <                              1.0 * mu->IsoR03EmEt() +
324 <                              1.0 * mu->IsoR03HadEt();
325 <          if ((totalIso < (mu->Pt()-10.0)*5.0/15.0 && mu->Pt() <= 25) ||
326 <              (totalIso < 5.0 && mu->Pt() > 25) ||
327 <               totalIso <= 0)
328 <            isopass = kTRUE;
329 <        }
322 >          Double_t totalIso =  mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt() - Rho * TMath::Pi() * 0.3 * 0.3 ;
323 >          // trick to change the signal region cut
324 >          double theIsoCut = fCombIsolationCut;
325 >          if(theIsoCut < 0.20){
326 >            if(mu->Pt() >  20.0) theIsoCut = 0.15;
327 >            else                 theIsoCut = 0.10;
328 >          }
329 >          if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
330 >        }
331 >        break;
332 >      case kTrackCaloSlidingNoCorrection:
333 >        {
334 >          Double_t totalIso =  1.0 * mu->IsoR03SumPt() +
335 >                               1.0 * mu->IsoR03EmEt()  +
336 >                               1.0 * mu->IsoR03HadEt();
337 >          // trick to change the signal region cut
338 >          double theIsoCut = fCombIsolationCut;
339 >          if(theIsoCut < 0.20){
340 >            if(mu->Pt() >  20.0) theIsoCut = 0.15;
341 >            else                 theIsoCut = 0.10;
342 >          }
343 >          if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
344 >        }
345 >        break;
346 >      case kPFIso:
347 >        {
348 >          Double_t pfIsoCutValue = 9999;
349 >          if(fPFIsolationCut > 0){
350 >            pfIsoCutValue = fPFIsolationCut;
351 >          } else {
352 >            if (mu->AbsEta() < 1.479) {
353 >              if (mu->Pt() > 20) {
354 >                pfIsoCutValue = 0.13;
355 >              } else {
356 >                pfIsoCutValue = 0.06;
357 >              }
358 >            } else {
359 >              if (mu->Pt() > 20) {
360 >                pfIsoCutValue = 0.09;
361 >              } else {
362 >                pfIsoCutValue = 0.05;
363 >              }
364 >            }
365 >          }
366 >          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
367 >          if (totalIso < (mu->Pt()*pfIsoCutValue) )
368 >            isocut = kTRUE;
369 >        }
370 >        break;
371 >      case kPFRadialIso:
372 >        {
373 >          Double_t pfIsoCutValue = 9999;
374 >          if(fPFIsolationCut > 0){
375 >            pfIsoCutValue = fPFIsolationCut;
376 >          } else {
377 >            if (mu->Pt() > 20) {
378 >              pfIsoCutValue = 0.10;
379 >            } else {
380 >              pfIsoCutValue = 0.05;
381 >            }
382 >          }
383 >          Double_t totalIso =  IsolationTools::PFRadialMuonIsolation(mu, fPFNoPileUpCands, 1.0, 0.3);
384 >          if (totalIso < (mu->Pt()*pfIsoCutValue) )
385 >            isocut = kTRUE;
386 >        }
387 >        break;
388 >      case kPFIsoNoL:
389 >        {
390 >          fNonIsolatedMuons     = GetObjThisEvt<MuonCol>(fNonIsolatedMuonsName);
391 >          fNonIsolatedElectrons = GetObjThisEvt<ElectronCol>(fNonIsolatedElectronsName);
392 >
393 >          Double_t pfIsoCutValue = 9999;
394 >          if(fPFIsolationCut > 0){
395 >            pfIsoCutValue = fPFIsolationCut;
396 >          } else {
397 >            if (mu->AbsEta() < 1.479) {
398 >              if (mu->Pt() > 20) {
399 >                pfIsoCutValue = 0.13;
400 >              } else {
401 >                pfIsoCutValue = 0.06;
402 >              }
403 >            } else {
404 >              if (mu->Pt() > 20) {
405 >                pfIsoCutValue = 0.09;
406 >              } else {
407 >                pfIsoCutValue = 0.05;
408 >              }
409 >            }
410 >          }
411 >          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fNonIsolatedMuons, fNonIsolatedElectrons, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
412 >          if (totalIso < (mu->Pt()*pfIsoCutValue) )
413 >            isocut = kTRUE;
414 >        }
415 >        break;
416 >      case kMVAIso_BDTG_IDIso:
417 >      {
418 >
419 >        Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
420 >        isocut = (totalIso < (mu->Pt()*0.4));
421 >
422 >      }
423 >        break;
424 >      case kIsoRingsV0_BDTG_Iso:
425 >      {
426 >        
427 >        isocut = PassMuonIsoRingsV0_BDTG_Iso(mu, fVertices->At(0), fPileupEnergyDensity);
428 >
429 >      }
430 >        break;
431 >      case kIsoDeltaR:
432 >      {
433 >        
434 >        isocut = PassMuonIsoDeltaR(mu, fVertices->At(0), fPileupEnergyDensity);
435 >
436 >      }
437          break;
438        case kNoIso:
439 <        isopass = kTRUE;
439 >        isocut = kTRUE;
440          break;
441        case kCustomIso:
442        default:
443          break;
444      }
445  
446 <    if (!isopass)
446 >    if (isocut == kFALSE)
447        continue;
448  
449 +    // apply d0 cut
450 +    if (fApplyD0Cut) {
451 +      Bool_t passD0cut = kTRUE;
452 +      if(fD0Cut < 0.05) { // trick to change the signal region cut
453 +        if      (mu->Pt() >  20.0) fD0Cut = 0.02;
454 +        else if (mu->Pt() <= 20.0) fD0Cut = 0.01;
455 +      }
456 +      if(fWhichVertex >= -1) passD0cut = MuonTools::PassD0Cut(mu, fVertices, fD0Cut, fWhichVertex);
457 +      else                   passD0cut = MuonTools::PassD0Cut(mu, fBeamSpot, fD0Cut);
458 +      if (!passD0cut)
459 +        continue;
460 +    }
461 +
462 +    // apply dz cut
463 +    if (fApplyDZCut) {
464 +      Bool_t passDZcut = MuonTools::PassDZCut(mu, fVertices, fDZCut, fWhichVertex);
465 +      if (!passDZcut)
466 +        continue;
467 +    }
468 +
469      // add good muon
470      CleanMuons->Add(mu);
471    }
# Line 136 | Line 483 | void MuonIDMod::SlaveBegin()
483    // Run startup code on the computer (slave) doing the actual analysis. Here,
484    // we just request the muon collection branch.
485  
486 <  ReqBranch(fMuonBranchName, fMuons);
486 >   // In this case we cannot have a branch
487 >  if (fMuonIsoType.CompareTo("PFIsoNoL") != 0) {
488 >    ReqEventObject(fMuonBranchName, fMuons, kTRUE);
489 >  }
490 >  ReqEventObject(fBeamSpotName, fBeamSpot, kTRUE);
491 >  ReqEventObject(fTrackName, fTracks, kTRUE);
492 >  ReqEventObject(fPFCandidatesName, fPFCandidates, kTRUE);
493 >  if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0
494 >      || fMuonIsoType.CompareTo("MVA_BDTG_IDIso") == 0
495 >      || fMuonIsoType.CompareTo("IsoRingsV0_BDTG_Iso") == 0
496 >      || fMuonIsoType.CompareTo("IsoDeltaR") == 0
497 >    ) {
498 >    ReqEventObject(fPileupEnergyDensityName, fPileupEnergyDensity, kTRUE);
499 >  }
500  
141  fMuonTools = new MuonTools;
501  
502 <  if (fMuonIDType.CompareTo("Tight") == 0)
502 >  if (fMuonIDType.CompareTo("WMuId") == 0)
503 >    fMuIDType = kWMuId;
504 >  else if (fMuonIDType.CompareTo("ZMuId") == 0)
505 >    fMuIDType = kZMuId;
506 >  else if (fMuonIDType.CompareTo("Tight") == 0)
507      fMuIDType = kTight;
508    else if (fMuonIDType.CompareTo("Loose") == 0)
509      fMuIDType = kLoose;
510 +  else if (fMuonIDType.CompareTo("WWMuIdV1") == 0)
511 +    fMuIDType = kWWMuIdV1;
512 +  else if (fMuonIDType.CompareTo("WWMuIdV2") == 0)
513 +    fMuIDType = kWWMuIdV2;
514 +  else if (fMuonIDType.CompareTo("WWMuIdV3") == 0)
515 +    fMuIDType = kWWMuIdV3;
516    else if (fMuonIDType.CompareTo("NoId") == 0)
517      fMuIDType = kNoId;
518    else if (fMuonIDType.CompareTo("Custom") == 0) {
519      fMuIDType = kCustomId;
520      SendError(kWarning, "SlaveBegin",
521                "Custom muon identification is not yet implemented.");
522 +  } else if (fMuonIDType.CompareTo("MVA_BDTG_IDIso") == 0) {
523 +    fMuIDType = kMVAID_BDTG_IDIso;
524    } else {
525      SendError(kAbortAnalysis, "SlaveBegin",
526                "The specified muon identification %s is not defined.",
# Line 163 | Line 534 | void MuonIDMod::SlaveBegin()
534      fMuIsoType = kTrackCaloCombined;
535    else if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0)
536      fMuIsoType = kTrackCaloSliding;
537 +  else if (fMuonIsoType.CompareTo("TrackCaloSlidingNoCorrection") == 0)
538 +    fMuIsoType = kTrackCaloSlidingNoCorrection;
539 +  else if (fMuonIsoType.CompareTo("PFIso") == 0)
540 +    fMuIsoType = kPFIso;
541 +  else if (fMuonIsoType.CompareTo("PFRadialIso") == 0)
542 +    fMuIsoType = kPFRadialIso;
543 +  else if (fMuonIsoType.CompareTo("PFIsoNoL") == 0)
544 +    fMuIsoType = kPFIsoNoL;
545    else if (fMuonIsoType.CompareTo("NoIso") == 0)
546      fMuIsoType = kNoIso;
547    else if (fMuonIsoType.CompareTo("Custom") == 0) {
548      fMuIsoType = kCustomIso;
549      SendError(kWarning, "SlaveBegin",
550                "Custom muon isolation is not yet implemented.");
551 +  } else if (fMuonIsoType.CompareTo("MVA_BDTG_IDIso") == 0) {
552 +    fMuIsoType = kMVAIso_BDTG_IDIso;
553 +  } else if (fMuonIsoType.CompareTo("IsoRingsV0_BDTG_Iso") == 0) {
554 +    fMuIsoType = kIsoRingsV0_BDTG_Iso;
555 +  } else if (fMuonIsoType.CompareTo("IsoDeltaR") == 0) {
556 +    fMuIsoType = kIsoDeltaR;
557    } else {
558      SendError(kAbortAnalysis, "SlaveBegin",
559                "The specified muon isolation %s is not defined.",
# Line 180 | Line 565 | void MuonIDMod::SlaveBegin()
565      fMuClassType = kAll;
566    else if (fMuonClassType.CompareTo("Global") == 0)
567      fMuClassType = kGlobal;
568 +  else if (fMuonClassType.CompareTo("GlobalTracker") == 0)
569 +    fMuClassType = kGlobalTracker;
570    else if (fMuonClassType.CompareTo("Standalone") == 0)
571      fMuClassType = kSta;
572 <  else if (fMuonClassType.CompareTo("TrackerOnly") == 0)
573 <    fMuClassType = kTrackerOnly;
572 >  else if (fMuonClassType.CompareTo("TrackerMuon") == 0)
573 >    fMuClassType = kTrackerMuon;
574 >  else if (fMuonClassType.CompareTo("CaloMuon") == 0)
575 >    fMuClassType = kCaloMuon;
576 >  else if (fMuonClassType.CompareTo("TrackerBased") == 0)
577 >    fMuClassType = kTrackerBased;
578    else {
579      SendError(kAbortAnalysis, "SlaveBegin",
580                "The specified muon class %s is not defined.",
581                fMuonClassType.Data());
582      return;
583    }
584 +
585 +
586 +  //If we use MVA ID, need to load MVA weights
587 +  if     (fMuIsoType == kMVAIso_BDTG_IDIso || fMuIDType == kMVAID_BDTG_IDIso) {
588 +    fMuonTools = new MuonTools();
589 +    fMuonIDMVA = new MuonIDMVA();
590 +    fMuonIDMVA->Initialize("BDTG method",
591 +                           string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/BarrelPtBin0_IDIsoCombined_BDTG.weights.xml"))),
592 +                           string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/EndcapPtBin0_IDIsoCombined_BDTG.weights.xml"))),
593 +                           string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/BarrelPtBin1_IDIsoCombined_BDTG.weights.xml"))),
594 +                           string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/EndcapPtBin1_IDIsoCombined_BDTG.weights.xml"))),
595 +                           string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/BarrelPtBin2_IDIsoCombined_BDTG.weights.xml"))),
596 +                           string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/EndcapPtBin2_IDIsoCombined_BDTG.weights.xml"))),
597 +                           MuonIDMVA::kIDIsoCombinedDetIso);
598 +  }
599 +  else if(fMuIsoType == kIsoRingsV0_BDTG_Iso) {
600 +    std::vector<std::string> muonidiso_weightfiles;
601 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_barrel_lowpt.weights.xml"))));
602 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_barrel_highpt.weights.xml"))));
603 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_endcap_lowpt.weights.xml"))));
604 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_endcap_highpt.weights.xml"))));
605 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_tracker.weights.xml"))));
606 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_global.weights.xml"))));
607 +    fMuonTools = new MuonTools();
608 +    fMuonIDMVA = new MuonIDMVA();
609 +    fMuonIDMVA->Initialize("MuonIso_BDTG_IsoRings",
610 +                       MuonIDMVA::kIsoRingsV0,
611 +                       kTRUE,
612 +                       muonidiso_weightfiles);
613 +  }
614 +  else if(fMuIsoType == kIsoDeltaR) {
615 +    std::vector<std::string> muonidiso_weightfiles;
616 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_LB_BDT.weights.xml"))));
617 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_LE_BDT.weights.xml"))));
618 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_HB_BDT.weights.xml"))));
619 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_HE_BDT.weights.xml"))));
620 +    fMuonTools = new MuonTools();
621 +    fMuonIDMVA = new MuonIDMVA();
622 +    fMuonIDMVA->Initialize("muonHZZ2012IsoDRMVA",
623 +                       MuonIDMVA::kIsoDeltaR,
624 +                       kTRUE,
625 +                       muonidiso_weightfiles);
626 +  }
627 +
628 + }
629 +
630 +
631 + //--------------------------------------------------------------------------------------------------
632 + Bool_t MuonIDMod::PassMuonMVA_BDTG_IdIso(const Muon *mu, const Vertex *vertex,
633 +                                         const PileupEnergyDensityCol *PileupEnergyDensity) const
634 + {
635 +
636 +  const Track *muTrk=0;
637 +  if(mu->HasTrackerTrk())         { muTrk = mu->TrackerTrk();    }
638 +  else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
639 +  
640 +  Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFCandidates,PileupEnergyDensity);
641 +
642 +  Int_t subdet = 0;
643 +  if (fabs(muTrk->Eta()) < 1.479) subdet = 0;
644 +  else subdet = 1;
645 +  Int_t ptBin = 0;
646 +  if (muTrk->Pt() > 14.5) ptBin = 1;
647 +  if (muTrk->Pt() > 20.0) ptBin = 2;
648 +
649 +  Int_t MVABin = -1;
650 +  if      (subdet == 0 && ptBin == 0) MVABin = 0;
651 +  else if (subdet == 1 && ptBin == 0) MVABin = 1;
652 +  else if (subdet == 0 && ptBin == 1) MVABin = 2;
653 +  else if (subdet == 1 && ptBin == 1) MVABin = 3;
654 +  else if (subdet == 0 && ptBin == 2) MVABin = 4;
655 +  else if (subdet == 1 && ptBin == 2) MVABin = 5;
656 +
657 +  Double_t MVACut = -999;
658 +  if      (MVABin == 0) MVACut = -0.5618;
659 +  else if (MVABin == 1) MVACut = -0.3002;
660 +  else if (MVABin == 2) MVACut = -0.4642;
661 +  else if (MVABin == 3) MVACut = -0.2478;
662 +  else if (MVABin == 4) MVACut =  0.1706;
663 +  else if (MVABin == 5) MVACut =  0.8146;
664 +
665 +  if (MVAValue > MVACut) return kTRUE;
666 +  return kFALSE;
667 + }
668 +
669 + //--------------------------------------------------------------------------------------------------
670 + Bool_t MuonIDMod::PassMuonIsoRingsV0_BDTG_Iso(const Muon *mu, const Vertex *vertex,
671 +                                              const PileupEnergyDensityCol *PileupEnergyDensity) const
672 + {
673 +
674 +  const Track *muTrk=0;
675 +  if(mu->HasTrackerTrk())         { muTrk = mu->TrackerTrk();    }
676 +  else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
677 +  
678 +  ElectronOArr *tempElectrons = new  ElectronOArr;
679 +  MuonOArr     *tempMuons     = new  MuonOArr;
680 +  Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFCandidates,
681 +                      PileupEnergyDensity,MuonTools::kMuEAFall11MC,tempElectrons,tempMuons,kFALSE);
682 +  delete tempElectrons;
683 +  delete tempMuons;
684 +
685 +  Int_t MVABin = fMuonIDMVA->GetMVABin(muTrk->Eta(), muTrk->Pt(), mu->IsGlobalMuon(), mu->IsTrackerMuon());
686 +
687 +  Double_t MVACut = -999;
688 +  if      (MVABin == 0) MVACut = -0.593;
689 +  else if (MVABin == 1) MVACut =  0.337;
690 +  else if (MVABin == 2) MVACut = -0.767;
691 +  else if (MVABin == 3) MVACut =  0.410;
692 +  else if (MVABin == 4) MVACut = -0.989;
693 +  else if (MVABin == 5) MVACut = -0.995;
694 +
695 +  if (MVAValue > MVACut) return kTRUE;
696 +  return kFALSE;
697 + }
698 +
699 + //--------------------------------------------------------------------------------------------------
700 + Bool_t MuonIDMod::PassMuonIsoDeltaR(const Muon *mu, const Vertex *vertex,
701 +                                    const PileupEnergyDensityCol *PileupEnergyDensity) const
702 + {
703 +
704 +  const Track *muTrk=0;
705 +  if(mu->HasTrackerTrk())         { muTrk = mu->TrackerTrk();    }
706 +  else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
707 +  
708 +  ElectronOArr *tempElectrons = new  ElectronOArr;
709 +  MuonOArr     *tempMuons     = new  MuonOArr;
710 +  Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFNoPileUpCands,
711 +                      PileupEnergyDensity,MuonTools::kMuEAFall11MC,tempElectrons,tempMuons,kTRUE);
712 +  delete tempElectrons;
713 +  delete tempMuons;
714 +
715 +  Int_t MVABin = fMuonIDMVA->GetMVABin(muTrk->Eta(), muTrk->Pt(), mu->IsGlobalMuon(), mu->IsTrackerMuon());
716 +
717 +  Double_t MVACut = -999;
718 +  if      (MVABin == 0) MVACut =  0.000;
719 +  else if (MVABin == 1) MVACut =  0.000;
720 +  else if (MVABin == 2) MVACut =  0.000;
721 +  else if (MVABin == 3) MVACut =  0.000;
722 +
723 +  if (MVAValue > MVACut) return kTRUE;
724 +  return kFALSE;
725 + }
726 +
727 + //--------------------------------------------------------------------------------------------------
728 + void MuonIDMod::Terminate()
729 + {
730 +  // Run finishing code on the computer (slave) that did the analysis
731 +  delete fMuonIDMVA;
732 +  
733 +  delete fMuonTools;
734   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines