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.9 by ceballos, Fri Nov 28 10:31:38 2008 UTC vs.
Revision 1.75 by ceballos, Fri May 4 21:47:03 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 >  fMuonMVAWeights_Subdet0Pt10To14p5(""),
58 >  fMuonMVAWeights_Subdet1Pt10To14p5(""),
59 >  fMuonMVAWeights_Subdet0Pt14p5To20(""),
60 >  fMuonMVAWeights_Subdet1Pt14p5To20(""),
61 >  fMuonMVAWeights_Subdet0Pt20ToInf(""),
62 >  fMuonMVAWeights_Subdet1Pt20ToInf(""),
63 >  fTheRhoType(RhoUtilities::DEFAULT)
64   {
65    // Constructor.
66   }
67  
28
68   //--------------------------------------------------------------------------------------------------
69   void MuonIDMod::Process()
70   {
71    // Process entries of the tree.
72  
73 <  LoadBranch(fMuonBranchName);
73 >  if(fMuIsoType != kPFIsoNoL) {
74 >    LoadEventObject(fMuonBranchName, fMuons);
75 >  }
76 >  else {
77 >    fMuons = GetObjThisEvt<MuonOArr>(fMuonBranchName);
78 >  }
79 >  LoadEventObject(fBeamSpotName, fBeamSpot);
80 >  LoadEventObject(fTrackName, fTracks);
81 >  LoadEventObject(fPFCandidatesName, fPFCandidates);
82 >  if(fMuIsoType == kTrackCaloSliding ||
83 >     fMuIsoType == kCombinedRelativeConeAreaCorrected ||
84 >     fMuIsoType == kPFIsoEffectiveAreaCorrected ||
85 >     fMuIsoType == kMVAIso_BDTG_IDIso ||
86 >     fMuIsoType == kIsoRingsV0_BDTG_Iso ||
87 >     fMuIsoType == kIsoDeltaR
88 >    ) {
89 >    LoadEventObject(fPileupEnergyDensityName, fPileupEnergyDensity);
90 >  }
91 >  if(fMuIsoType == kPFRadialIso || fMuIsoType == kIsoDeltaR){
92 >    // Name is hardcoded, can be changed if someone feels to do it
93 >    fPFNoPileUpCands = GetObjThisEvt<PFCandidateCol>("PFNoPileUp");    
94 >  }
95  
96    MuonOArr *CleanMuons = new MuonOArr;
97    CleanMuons->SetName(fCleanMuonsName);
98  
99 <  for (UInt_t i=0; i<fMuons->GetEntries(); ++i) {
99 >  fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
100 >
101 >  for (UInt_t i=0; i<fMuons->GetEntries() && fVertices->GetEntries() > 0 ; ++i) {
102      const Muon *mu = fMuons->At(i);
103  
104      Bool_t pass = kFALSE;
105 <    Double_t pt = -1; // make sure pt is taken from the correct track!
105 >    Double_t pt = 0;  // make sure pt is taken from the correct track!
106 >    Double_t eta = 0; // make sure eta is taken from the correct track!
107      switch (fMuClassType) {
108        case kAll:
109          pass = kTRUE;
110 <        pt = mu->Pt();
110 >        if (mu->HasTrk()) {
111 >          pt  = mu->Pt();
112 >          eta = TMath::Abs(mu->Eta());
113 >        }
114          break;
115        case kGlobal:
116 <        pass = (mu->GlobalTrk() != 0);
117 <        if (pass)
118 <          pt = mu->GlobalTrk()->Pt();
119 <        break;
116 >        pass = mu->HasGlobalTrk() && mu->IsTrackerMuon();
117 >        if (pass && mu->TrackerTrk()) {
118 >          pt  = mu->TrackerTrk()->Pt();
119 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
120 >        }
121 >        else {
122 >          pt  = mu->Pt();
123 >          eta = TMath::Abs(mu->Eta());
124 >        }
125 >        break;
126 >      case kGlobalTracker:
127 >        pass = (mu->HasGlobalTrk() && mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof() < 10 &&
128 >               (mu->NSegments() > 1 || mu->NMatches() > 1) && mu->NValidHits() > 0) ||
129 >               (mu->IsTrackerMuon() &&
130 >                mu->Quality().Quality(MuonQuality::TMLastStationTight));
131 >        if (pass) {
132 >          pt  = mu->TrackerTrk()->Pt();
133 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
134 >        }
135 >        else {
136 >          pt  = mu->Pt();
137 >          eta = TMath::Abs(mu->Eta());
138 >        }
139 >        break;
140        case kSta:
141 <        pass = (mu->StandaloneTrk() != 0);
142 <        if (pass)
143 <          pt = mu->StandaloneTrk()->Pt();
144 <        break;
145 <      case kTrackerOnly:
146 <        pass = (mu->TrackerTrk() != 0);
147 <        if (pass)
148 <          pt = mu->TrackerTrk()->Pt();
141 >        pass = mu->HasStandaloneTrk();
142 >        if (pass) {
143 >          pt  = mu->StandaloneTrk()->Pt();
144 >          eta = TMath::Abs(mu->StandaloneTrk()->Eta());
145 >        }
146 >        break;
147 >      case kTrackerMuon:
148 >        pass = mu->HasTrackerTrk() && mu->IsTrackerMuon() &&
149 >               mu->Quality().Quality(MuonQuality::TrackerMuonArbitrated);
150 >        if (pass) {
151 >          pt  = mu->TrackerTrk()->Pt();
152 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
153 >        }
154 >        break;
155 >      case kCaloMuon:
156 >        pass = mu->HasTrackerTrk() && mu->IsCaloMuon();
157 >        if (pass) {
158 >          pt  = mu->TrackerTrk()->Pt();
159 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
160 >        }
161 >        break;
162 >      case kTrackerBased:
163 >        pass = mu->HasTrackerTrk();
164 >        if (pass) {
165 >          pt  = mu->TrackerTrk()->Pt();
166 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
167 >        }
168          break;
169        default:
170          break;
# Line 71 | Line 176 | void MuonIDMod::Process()
176      if (pt <= fMuonPtMin)
177        continue;
178  
179 +    if (eta >= fEtaCut)
180 +      continue;
181 +
182 +
183 +    //***********************************************************************************************
184 +    //Debug Info For Lepton MVA
185 +    //***********************************************************************************************
186 +    if( fPrintMVADebugInfo &&
187 +        (fMuIsoType == kMVAIso_BDTG_IDIso || fMuIDType == kMVAID_BDTG_IDIso)
188 +      ) {
189 +      cout << "Event: " << GetEventHeader()->RunNum() << " " << GetEventHeader()->LumiSec() << " "
190 +           << GetEventHeader()->EvtNum() << " : Rho = " << fPileupEnergyDensity->At(0)->Rho()
191 +           << " : Muon " << i << " "
192 +           << endl;
193 +      fMuonIDMVA->MVAValue(mu,fVertices->At(0),fMuonTools,fPFCandidates,fPileupEnergyDensity,kTRUE);
194 +    }
195 +    //***********************************************************************************************
196 +
197 +
198 +    Double_t RChi2 = 0.0;
199 +    if     (mu->HasGlobalTrk()) {
200 +      RChi2 = mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof();
201 +    }
202 +    else if(mu->BestTrk() != 0){
203 +      RChi2 = mu->BestTrk()->Chi2()/mu->BestTrk()->Ndof();
204 +    }
205      Bool_t idpass = kFALSE;
206      switch (fMuIDType) {
207 +      case kWMuId:
208 +        idpass = mu->BestTrk() != 0 &&
209 +                 mu->BestTrk()->NHits() > 10 &&
210 +                 RChi2 < 10.0 &&
211 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
212 +                 mu->BestTrk()->NPixelHits() > 0 &&
213 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
214 +        break;
215 +      case kZMuId:
216 +        idpass = mu->BestTrk() != 0 &&
217 +                 mu->BestTrk()->NHits() > 10 &&
218 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
219 +                 mu->BestTrk()->NPixelHits() > 0 &&
220 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
221 +        break;
222        case kLoose:
223 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationLoose) &&
224 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityLoose);
223 >        idpass = mu->BestTrk() != 0 &&
224 >                 mu->Quality().Quality(MuonQuality::TMOneStationLoose) &&
225 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityLoose) &&
226 >                 mu->BestTrk()->NHits() > 10 &&
227 >                 RChi2 < 10.0 &&
228 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
229          break;
230        case kTight:
231 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationTight) &&
232 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityTight);
231 >        idpass = mu->BestTrk() !=  0 &&
232 >                 mu->Quality().Quality(MuonQuality::TMOneStationTight) &&
233 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityTight) &&
234 >                 mu->BestTrk()->NHits() > 10 &&
235 >                 RChi2 < 10.0 &&
236 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
237 >        break;
238 >      case kWWMuIdV1:
239 >        idpass = mu->BestTrk() != 0 &&
240 >                 mu->BestTrk()->NHits() > 10 &&
241 >                 mu->BestTrk()->NPixelHits() > 0 &&
242 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
243 >                 RChi2 < 10.0 &&
244 >                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
245 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
246 >        break;
247 >      case kWWMuIdV2:
248 >        idpass = mu->BestTrk() != 0 &&
249 >                 mu->BestTrk()->NHits() > 10 &&
250 >                 mu->BestTrk()->NPixelHits() > 0 &&
251 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1;
252 >        break;
253 >      case kWWMuIdV3:
254 >        idpass = mu->BestTrk() != 0 &&
255 >                 mu->BestTrk()->NHits() > 10 &&
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 88 | 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 kNoIso:
347 <          isopass = kTRUE;
346 >      case kCombinedRelativeConeAreaCorrected:
347 >        {
348 >          //const PileupEnergyDensity *rho =  fPileupEnergyDensity->At(0); // Fabian: made Rho customable
349 >          Double_t totalIso =  mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt() - Rho * TMath::Pi() * 0.3 * 0.3 ;
350 >          double theIsoCut = fCombRelativeIsolationCut;
351 >          if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
352 >        }
353 >        break;          
354 >    case kCombinedRelativeEffectiveAreaCorrected:
355 >      {
356 >        Double_t tmpRho = Rho;   // Fabian: made the Rho type customable.
357 >        //if (!(TMath::IsNaN(fPileupEnergyDensity->At(0)->Rho()) || std::isinf(fPileupEnergyDensity->At(0)->Rho())))
358 >        //tmpRho = fPileupEnergyDensity->At(0)->Rho();
359 >        
360 >          isocut = ( mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt()
361 >                     -  tmpRho*MuonTools::MuonEffectiveArea(MuonTools::kMuEMIso03, mu->Eta())
362 >                     -  tmpRho*MuonTools::MuonEffectiveArea(MuonTools::kMuHadIso03, mu->Eta())
363 >            ) < (mu->Pt()* 0.40);
364 >        }
365 >        break;          
366 >      case kPFIso:
367 >        {
368 >          Double_t pfIsoCutValue = 9999;
369 >          if(fPFIsolationCut > 0){
370 >            pfIsoCutValue = fPFIsolationCut;
371 >          } else {
372 >            if (mu->AbsEta() < 1.479) {
373 >              if (mu->Pt() > 20) {
374 >                pfIsoCutValue = 0.13;
375 >              } else {
376 >                pfIsoCutValue = 0.06;
377 >              }
378 >            } else {
379 >              if (mu->Pt() > 20) {
380 >                pfIsoCutValue = 0.09;
381 >              } else {
382 >                pfIsoCutValue = 0.05;
383 >              }
384 >            }
385 >          }
386 >          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
387 >          if (totalIso < (mu->Pt()*pfIsoCutValue) )
388 >            isocut = kTRUE;
389 >        }
390 >        break;
391 >      case kPFRadialIso:
392 >        {
393 >          Double_t pfIsoCutValue = 9999;
394 >          if(fPFIsolationCut > 0){
395 >            pfIsoCutValue = fPFIsolationCut;
396 >          } else {
397 >            if (mu->Pt() > 20) {
398 >              pfIsoCutValue = 0.10;
399 >            } else {
400 >              pfIsoCutValue = 0.05;
401 >            }
402 >          }
403 >          Double_t totalIso =  IsolationTools::PFRadialMuonIsolation(mu, fPFNoPileUpCands, 1.0, 0.3);
404 >          if (totalIso < (mu->Pt()*pfIsoCutValue) )
405 >            isocut = kTRUE;
406 >        }
407 >        break;
408 >      case kPFIsoEffectiveAreaCorrected:
409 >        {
410 >          Double_t pfIsoCutValue = 9999;
411 >          if(fPFIsolationCut > 0){
412 >            pfIsoCutValue = fPFIsolationCut;
413 >          } else {
414 >            pfIsoCutValue = fPFIsolationCut; //leave it like this for now
415 >          }
416 >          Double_t EffectiveAreaCorrectedPFIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius)
417 >            - Rho * MuonTools::MuonEffectiveArea(MuonTools::kMuNeutralIso03, mu->Eta());
418 >          //- fPileupEnergyDensity->At(0)->Rho() * MuonTools::MuonEffectiveArea(MuonTools::kMuNeutralIso03, mu->Eta());  // Fabian: made Rho-type customable
419 >          isocut = EffectiveAreaCorrectedPFIso < (mu->Pt() * pfIsoCutValue);
420            break;
421 +        }
422 +      case kPFIsoNoL:
423 +        {
424 +          fNonIsolatedMuons     = GetObjThisEvt<MuonCol>(fNonIsolatedMuonsName);
425 +          fNonIsolatedElectrons = GetObjThisEvt<ElectronCol>(fNonIsolatedElectronsName);
426 +
427 +          Double_t pfIsoCutValue = 9999;
428 +          if(fPFIsolationCut > 0){
429 +            pfIsoCutValue = fPFIsolationCut;
430 +          } else {
431 +            if (mu->AbsEta() < 1.479) {
432 +              if (mu->Pt() > 20) {
433 +                pfIsoCutValue = 0.13;
434 +              } else {
435 +                pfIsoCutValue = 0.06;
436 +              }
437 +            } else {
438 +              if (mu->Pt() > 20) {
439 +                pfIsoCutValue = 0.09;
440 +              } else {
441 +                pfIsoCutValue = 0.05;
442 +              }
443 +            }
444 +          }
445 +          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fNonIsolatedMuons, fNonIsolatedElectrons, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
446 +          if (totalIso < (mu->Pt()*pfIsoCutValue) )
447 +            isocut = kTRUE;
448 +        }
449 +        break;
450 +      case kMVAIso_BDTG_IDIso:
451 +      {
452 +
453 +        // **************************************************************************
454 +        // Don't use effective area correction denominator. Instead use the old one.
455 +        // **************************************************************************
456 +
457 +        //         Double_t tmpRho = 0;
458 +        //         if (!(TMath::IsNaN(fPileupEnergyDensity->At(0)->Rho()) || isinf(fPileupEnergyDensity->At(0)->Rho())))
459 +        //           tmpRho = fPileupEnergyDensity->At(0)->Rho();
460 +        
461 +        //         isocut = ( mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt()
462 +        //                    -  tmpRho*MuonTools::MuonEffectiveArea(MuonTools::kMuEMIso03, mu->Eta())
463 +        //                    -  tmpRho*MuonTools::MuonEffectiveArea(MuonTools::kMuHadIso03, mu->Eta())
464 +        //           ) < (mu->Pt()* 0.40);
465 +        
466 +        Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0, fIntRadius);
467 +        isocut = (totalIso < (mu->Pt()*0.4));
468 +
469 +      }
470 +        break;
471 +      case kIsoRingsV0_BDTG_Iso:
472 +      {
473 +        
474 +        isocut = PassMuonIsoRingsV0_BDTG_Iso(mu, fVertices->At(0), fPileupEnergyDensity);
475 +
476 +      }
477 +        break;
478 +      case kIsoDeltaR:
479 +      {
480 +        
481 +        isocut = PassMuonIsoDeltaR(mu, fVertices->At(0), fPileupEnergyDensity);
482 +
483 +      }
484 +        break;
485 +      case kNoIso:
486 +        isocut = kTRUE;
487 +        break;
488        case kCustomIso:
489        default:
490          break;
491      }
492  
493 <    if (!isopass)
493 >    if (isocut == kFALSE)
494        continue;
495  
496 +    // apply d0 cut
497 +    if (fApplyD0Cut) {
498 +      Bool_t passD0cut = kTRUE;
499 +      if(fD0Cut < 0.05) { // trick to change the signal region cut
500 +        if      (mu->Pt() >  20.0) fD0Cut = 0.02;
501 +        else if (mu->Pt() <= 20.0) fD0Cut = 0.01;
502 +      }
503 +      if(fWhichVertex >= -1) passD0cut = MuonTools::PassD0Cut(mu, fVertices, fD0Cut, fWhichVertex);
504 +      else                   passD0cut = MuonTools::PassD0Cut(mu, fBeamSpot, fD0Cut);
505 +      if (!passD0cut)
506 +        continue;
507 +    }
508 +
509 +    // apply dz cut
510 +    if (fApplyDZCut) {
511 +      Bool_t passDZcut = MuonTools::PassDZCut(mu, fVertices, fDZCut, fWhichVertex);
512 +      if (!passDZcut)
513 +        continue;
514 +    }
515 +
516      // add good muon
517      CleanMuons->Add(mu);
518    }
519  
520 +  // sort according to pt
521 +  CleanMuons->Sort();
522 +
523    // add objects for other modules to use
524    AddObjThisEvt(CleanMuons);  
525   }
526  
131
527   //--------------------------------------------------------------------------------------------------
528   void MuonIDMod::SlaveBegin()
529   {
530    // Run startup code on the computer (slave) doing the actual analysis. Here,
531    // we just request the muon collection branch.
532  
533 <  ReqBranch(fMuonBranchName, fMuons);
533 >   // In this case we cannot have a branch
534 >  if (fMuonIsoType.CompareTo("PFIsoNoL") != 0) {
535 >    ReqEventObject(fMuonBranchName, fMuons, kTRUE);
536 >  }
537 >  ReqEventObject(fBeamSpotName, fBeamSpot, kTRUE);
538 >  ReqEventObject(fTrackName, fTracks, kTRUE);
539 >  ReqEventObject(fPFCandidatesName, fPFCandidates, kTRUE);
540 >  if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0
541 >      || fMuonIsoType.CompareTo("CombinedRelativeConeAreaCorrected") == 0
542 >      || fMuonIsoType.CompareTo("CombinedRelativeEffectiveAreaCorrected") == 0
543 >      || fMuonIsoType.CompareTo("PFIsoEffectiveAreaCorrected") == 0
544 >      || fMuonIsoType.CompareTo("MVA_BDTG_IDIso") == 0
545 >      || fMuonIsoType.CompareTo("IsoRingsV0_BDTG_Iso") == 0
546 >      || fMuonIsoType.CompareTo("IsoDeltaR") == 0
547 >    ) {
548 >    ReqEventObject(fPileupEnergyDensityName, fPileupEnergyDensity, kTRUE);
549 >  }
550  
140  fMuonTools = new MuonTools;
551  
552 <  if (fMuonIDType.CompareTo("Tight") == 0)
552 >  if (fMuonIDType.CompareTo("WMuId") == 0)
553 >    fMuIDType = kWMuId;
554 >  else if (fMuonIDType.CompareTo("ZMuId") == 0)
555 >    fMuIDType = kZMuId;
556 >  else if (fMuonIDType.CompareTo("Tight") == 0)
557      fMuIDType = kTight;
558    else if (fMuonIDType.CompareTo("Loose") == 0)
559      fMuIDType = kLoose;
560 +  else if (fMuonIDType.CompareTo("WWMuIdV1") == 0)
561 +    fMuIDType = kWWMuIdV1;
562 +  else if (fMuonIDType.CompareTo("WWMuIdV2") == 0)
563 +    fMuIDType = kWWMuIdV2;
564 +  else if (fMuonIDType.CompareTo("WWMuIdV3") == 0)
565 +    fMuIDType = kWWMuIdV3;
566 +  else if (fMuonIDType.CompareTo("NoId") == 0)
567 +    fMuIDType = kNoId;
568    else if (fMuonIDType.CompareTo("Custom") == 0) {
569      fMuIDType = kCustomId;
570      SendError(kWarning, "SlaveBegin",
571                "Custom muon identification is not yet implemented.");
572 +  } else if (fMuonIDType.CompareTo("MVA_BDTG_IDIso") == 0) {
573 +    fMuIDType = kMVAID_BDTG_IDIso;
574    } else {
575      SendError(kAbortAnalysis, "SlaveBegin",
576                "The specified muon identification %s is not defined.",
# Line 160 | Line 584 | void MuonIDMod::SlaveBegin()
584      fMuIsoType = kTrackCaloCombined;
585    else if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0)
586      fMuIsoType = kTrackCaloSliding;
587 +  else if (fMuonIsoType.CompareTo("TrackCaloSlidingNoCorrection") == 0)
588 +    fMuIsoType = kTrackCaloSlidingNoCorrection;
589 +  else if (fMuonIsoType.CompareTo("CombinedRelativeConeAreaCorrected") == 0)
590 +    fMuIsoType = kCombinedRelativeConeAreaCorrected;
591 +  else if (fMuonIsoType.CompareTo("CombinedRelativeEffectiveAreaCorrected") == 0)
592 +    fMuIsoType = kCombinedRelativeEffectiveAreaCorrected;
593 +  else if (fMuonIsoType.CompareTo("PFIso") == 0)
594 +    fMuIsoType = kPFIso;
595 +  else if (fMuonIsoType.CompareTo("PFRadialIso") == 0)
596 +    fMuIsoType = kPFRadialIso;
597 +  else if (fMuonIsoType.CompareTo("PFIsoEffectiveAreaCorrected") == 0)
598 +    fMuIsoType = kPFIsoEffectiveAreaCorrected;
599 +  else if (fMuonIsoType.CompareTo("PFIsoNoL") == 0)
600 +    fMuIsoType = kPFIsoNoL;
601    else if (fMuonIsoType.CompareTo("NoIso") == 0)
602      fMuIsoType = kNoIso;
603    else if (fMuonIsoType.CompareTo("Custom") == 0) {
604      fMuIsoType = kCustomIso;
605      SendError(kWarning, "SlaveBegin",
606                "Custom muon isolation is not yet implemented.");
607 +  } else if (fMuonIsoType.CompareTo("MVA_BDTG_IDIso") == 0) {
608 +    fMuIsoType = kMVAIso_BDTG_IDIso;
609 +  } else if (fMuonIsoType.CompareTo("IsoRingsV0_BDTG_Iso") == 0) {
610 +    fMuIsoType = kIsoRingsV0_BDTG_Iso;
611 +  } else if (fMuonIsoType.CompareTo("IsoDeltaR") == 0) {
612 +    fMuIsoType = kIsoDeltaR;
613    } else {
614      SendError(kAbortAnalysis, "SlaveBegin",
615                "The specified muon isolation %s is not defined.",
# Line 177 | Line 621 | void MuonIDMod::SlaveBegin()
621      fMuClassType = kAll;
622    else if (fMuonClassType.CompareTo("Global") == 0)
623      fMuClassType = kGlobal;
624 +  else if (fMuonClassType.CompareTo("GlobalTracker") == 0)
625 +    fMuClassType = kGlobalTracker;
626    else if (fMuonClassType.CompareTo("Standalone") == 0)
627      fMuClassType = kSta;
628 <  else if (fMuonClassType.CompareTo("TrackerOnly") == 0)
629 <    fMuClassType = kTrackerOnly;
628 >  else if (fMuonClassType.CompareTo("TrackerMuon") == 0)
629 >    fMuClassType = kTrackerMuon;
630 >  else if (fMuonClassType.CompareTo("CaloMuon") == 0)
631 >    fMuClassType = kCaloMuon;
632 >  else if (fMuonClassType.CompareTo("TrackerBased") == 0)
633 >    fMuClassType = kTrackerBased;
634    else {
635      SendError(kAbortAnalysis, "SlaveBegin",
636                "The specified muon class %s is not defined.",
637                fMuonClassType.Data());
638      return;
639    }
640 +
641 +
642 +  //If we use MVA ID, need to load MVA weights
643 +  if     (fMuIsoType == kMVAIso_BDTG_IDIso || fMuIDType == kMVAID_BDTG_IDIso) {
644 +    fMuonTools = new MuonTools();
645 +    fMuonIDMVA = new MuonIDMVA();
646 +    fMuonIDMVA->Initialize("BDTG method",
647 +                           fMuonMVAWeights_Subdet0Pt10To14p5,
648 +                           fMuonMVAWeights_Subdet1Pt10To14p5,
649 +                           fMuonMVAWeights_Subdet0Pt14p5To20,
650 +                           fMuonMVAWeights_Subdet1Pt14p5To20,
651 +                           fMuonMVAWeights_Subdet0Pt20ToInf,
652 +                           fMuonMVAWeights_Subdet1Pt20ToInf,
653 +                           MuonIDMVA::kIDIsoCombinedDetIso);
654 +  }
655 +  else if(fMuIsoType == kIsoRingsV0_BDTG_Iso) {
656 +    std::vector<std::string> muonidiso_weightfiles;
657 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_barrel_lowpt.weights.xml"))));
658 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_barrel_highpt.weights.xml"))));
659 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_endcap_lowpt.weights.xml"))));
660 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_endcap_highpt.weights.xml"))));
661 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_tracker.weights.xml"))));
662 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_BDTG_V0_global.weights.xml"))));
663 +    fMuonTools = new MuonTools();
664 +    fMuonIDMVA = new MuonIDMVA();
665 +    fMuonIDMVA->Initialize("MuonIso_BDTG_IsoRings",
666 +                       MuonIDMVA::kIsoRingsV0,
667 +                       kTRUE,
668 +                       muonidiso_weightfiles);
669 +  }
670 +  else if(fMuIsoType == kIsoDeltaR) {
671 +    std::vector<std::string> muonidiso_weightfiles;
672 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_LB_BDT.weights.xml"))));
673 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_LE_BDT.weights.xml"))));
674 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_HB_BDT.weights.xml"))));
675 +    muonidiso_weightfiles.push_back(string((getenv("CMSSW_BASE")+string("/src/MitPhysics/data/MuonMVAWeights/MuonIsoMVA_santi-V1_HE_BDT.weights.xml"))));
676 +    fMuonTools = new MuonTools();
677 +    fMuonIDMVA = new MuonIDMVA();
678 +    fMuonIDMVA->Initialize("muonHZZ2012IsoDRMVA",
679 +                       MuonIDMVA::kIsoDeltaR,
680 +                       kTRUE,
681 +                       muonidiso_weightfiles);
682 +  }
683 +
684 + }
685 +
686 +
687 + //--------------------------------------------------------------------------------------------------
688 + Bool_t MuonIDMod::PassMuonMVA_BDTG_IdIso(const Muon *mu, const Vertex *vertex,
689 +                                         const PileupEnergyDensityCol *PileupEnergyDensity) const
690 + {
691 +
692 +  const Track *muTrk=0;
693 +  if(mu->HasTrackerTrk())         { muTrk = mu->TrackerTrk();    }
694 +  else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
695 +  
696 +  Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFCandidates,PileupEnergyDensity);
697 +
698 +  Int_t subdet = 0;
699 +  if (fabs(muTrk->Eta()) < 1.479) subdet = 0;
700 +  else subdet = 1;
701 +  Int_t ptBin = 0;
702 +  if (muTrk->Pt() > 14.5) ptBin = 1;
703 +  if (muTrk->Pt() > 20.0) ptBin = 2;
704 +
705 +  Int_t MVABin = -1;
706 +  if      (subdet == 0 && ptBin == 0) MVABin = 0;
707 +  else if (subdet == 1 && ptBin == 0) MVABin = 1;
708 +  else if (subdet == 0 && ptBin == 1) MVABin = 2;
709 +  else if (subdet == 1 && ptBin == 1) MVABin = 3;
710 +  else if (subdet == 0 && ptBin == 2) MVABin = 4;
711 +  else if (subdet == 1 && ptBin == 2) MVABin = 5;
712 +
713 +  Double_t MVACut = -999;
714 +  if      (MVABin == 0) MVACut = -0.5618;
715 +  else if (MVABin == 1) MVACut = -0.3002;
716 +  else if (MVABin == 2) MVACut = -0.4642;
717 +  else if (MVABin == 3) MVACut = -0.2478;
718 +  else if (MVABin == 4) MVACut =  0.1706;
719 +  else if (MVABin == 5) MVACut =  0.8146;
720 +
721 +  if (MVAValue > MVACut) return kTRUE;
722 +  return kFALSE;
723 + }
724 +
725 + //--------------------------------------------------------------------------------------------------
726 + Bool_t MuonIDMod::PassMuonIsoRingsV0_BDTG_Iso(const Muon *mu, const Vertex *vertex,
727 +                                              const PileupEnergyDensityCol *PileupEnergyDensity) const
728 + {
729 +
730 +  const Track *muTrk=0;
731 +  if(mu->HasTrackerTrk())         { muTrk = mu->TrackerTrk();    }
732 +  else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
733 +  
734 +  ElectronOArr *tempElectrons = new  ElectronOArr;
735 +  MuonOArr     *tempMuons     = new  MuonOArr;
736 +  Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFCandidates,
737 +                      PileupEnergyDensity,MuonTools::kMuEAFall11MC,tempElectrons,tempMuons,kFALSE);
738 +  delete tempElectrons;
739 +  delete tempMuons;
740 +
741 +  Int_t MVABin = fMuonIDMVA->GetMVABin(muTrk->Eta(), muTrk->Pt(), mu->IsGlobalMuon(), mu->IsTrackerMuon());
742 +
743 +  Double_t MVACut = -999;
744 +  if      (MVABin == 0) MVACut = -0.593;
745 +  else if (MVABin == 1) MVACut =  0.337;
746 +  else if (MVABin == 2) MVACut = -0.767;
747 +  else if (MVABin == 3) MVACut =  0.410;
748 +  else if (MVABin == 4) MVACut = -0.989;
749 +  else if (MVABin == 5) MVACut = -0.995;
750 +
751 +  if (MVAValue > MVACut) return kTRUE;
752 +  return kFALSE;
753 + }
754 +
755 + //--------------------------------------------------------------------------------------------------
756 + Bool_t MuonIDMod::PassMuonIsoDeltaR(const Muon *mu, const Vertex *vertex,
757 +                                    const PileupEnergyDensityCol *PileupEnergyDensity) const
758 + {
759 +
760 +  const Track *muTrk=0;
761 +  if(mu->HasTrackerTrk())         { muTrk = mu->TrackerTrk();    }
762 +  else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
763 +  
764 +  ElectronOArr *tempElectrons = new  ElectronOArr;
765 +  MuonOArr     *tempMuons     = new  MuonOArr;
766 +  Double_t MVAValue = fMuonIDMVA->MVAValue(mu,vertex,fMuonTools,fPFNoPileUpCands,
767 +                      PileupEnergyDensity,MuonTools::kMuEAFall11MC,tempElectrons,tempMuons,kFALSE);
768 +  delete tempElectrons;
769 +  delete tempMuons;
770 +
771 +  Int_t MVABin = fMuonIDMVA->GetMVABin(muTrk->Eta(), muTrk->Pt(), mu->IsGlobalMuon(), mu->IsTrackerMuon());
772 +
773 +  Double_t MVACut = -999;
774 +  if      (MVABin == 0) MVACut =  0.000;
775 +  else if (MVABin == 1) MVACut =  0.000;
776 +  else if (MVABin == 2) MVACut =  0.000;
777 +  else if (MVABin == 3) MVACut =  0.000;
778 +
779 +  if (MVAValue > MVACut) return kTRUE;
780 +  return kFALSE;
781 + }
782 +
783 + //--------------------------------------------------------------------------------------------------
784 + void MuonIDMod::Terminate()
785 + {
786 +  // Run finishing code on the computer (slave) that did the analysis
787 +  delete fMuonIDMVA;
788 +  
789 +  delete fMuonTools;
790   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines