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.55 by sixie, Fri Jul 22 15:45:38 2011 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 <  fMuonIDType("Loose"),
20 <  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("WWMuIdV1"),
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 <  fMuons(0)
34 >  fApplyD0Cut(kTRUE),
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 >  fBeamSpot(0),
46 >  fTracks(0),
47 >  fPFCandidates(0),
48 >  fNonIsolatedMuons(0),
49 >  fNonIsolatedElectrons(0),
50 >  fPileupEnergyDensityName(Names::gkPileupEnergyDensityBrn),
51 >  fPileupEnergyDensity(0)
52   {
53    // Constructor.
54   }
# Line 30 | Line 58 | void MuonIDMod::Process()
58   {
59    // Process entries of the tree.
60  
61 <  LoadBranch(fMuonBranchName);
62 <
61 >  if(fMuIsoType != kPFIsoNoL) {
62 >    LoadEventObject(fMuonBranchName, fMuons);
63 >  }
64 >  else {
65 >    fMuons = GetObjThisEvt<MuonOArr>(fMuonBranchName);
66 >  }
67 >  LoadEventObject(fBeamSpotName, fBeamSpot);
68 >  LoadEventObject(fTrackName, fTracks);
69 >  LoadEventObject(fPFCandidatesName, fPFCandidates);
70 >  if(fMuIsoType == kTrackCaloSliding || fMuIsoType == kCombinedRelativeConeAreaCorrected) {
71 >    LoadEventObject(fPileupEnergyDensityName, fPileupEnergyDensity);
72 >  }
73    MuonOArr *CleanMuons = new MuonOArr;
74    CleanMuons->SetName(fCleanMuonsName);
75  
76 +  fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
77 +
78    for (UInt_t i=0; i<fMuons->GetEntries(); ++i) {
79      const Muon *mu = fMuons->At(i);
80  
81      Bool_t pass = kFALSE;
82 <    Double_t pt = -1; // make sure pt is taken from the correct track!
82 >    Double_t pt = 0;  // make sure pt is taken from the correct track!
83 >    Double_t eta = 0; // make sure eta is taken from the correct track!
84      switch (fMuClassType) {
85        case kAll:
86          pass = kTRUE;
87 <        pt = mu->Pt();
87 >        if (mu->HasTrk()) {
88 >          pt  = mu->Pt();
89 >          eta = TMath::Abs(mu->Eta());
90 >        }
91          break;
92        case kGlobal:
93 <        pass = (mu->GlobalTrk() != 0);
94 <        if (pass)
95 <          pt = mu->GlobalTrk()->Pt();
96 <        break;
93 >        pass = mu->HasGlobalTrk() && mu->IsTrackerMuon();
94 >        if (pass && mu->TrackerTrk()) {
95 >          pt  = mu->TrackerTrk()->Pt();
96 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
97 >        }
98 >        else {
99 >          pt  = mu->Pt();
100 >          eta = TMath::Abs(mu->Eta());
101 >        }
102 >        break;
103 >      case kGlobalTracker:
104 >        pass = (mu->HasGlobalTrk() && mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof() < 10 &&
105 >               (mu->NSegments() > 1 || mu->NMatches() > 1) && mu->NValidHits() > 0) ||
106 >               (mu->IsTrackerMuon() &&
107 >                mu->Quality().Quality(MuonQuality::TMLastStationTight));
108 >        if (pass) {
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 kSta:
118 <        pass = (mu->StandaloneTrk() != 0);
119 <        if (pass)
120 <          pt = mu->StandaloneTrk()->Pt();
121 <        break;
122 <      case kTrackerOnly:
123 <        pass = (mu->TrackerTrk() != 0);
124 <        if (pass)
125 <          pt = mu->TrackerTrk()->Pt();
118 >        pass = mu->HasStandaloneTrk();
119 >        if (pass) {
120 >          pt  = mu->StandaloneTrk()->Pt();
121 >          eta = TMath::Abs(mu->StandaloneTrk()->Eta());
122 >        }
123 >        break;
124 >      case kTrackerMuon:
125 >        pass = mu->HasTrackerTrk() && mu->IsTrackerMuon() &&
126 >               mu->Quality().Quality(MuonQuality::TrackerMuonArbitrated);
127 >        if (pass) {
128 >          pt  = mu->TrackerTrk()->Pt();
129 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
130 >        }
131 >        break;
132 >      case kCaloMuon:
133 >        pass = mu->HasTrackerTrk() && mu->IsCaloMuon();
134 >        if (pass) {
135 >          pt  = mu->TrackerTrk()->Pt();
136 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
137 >        }
138 >        break;
139 >      case kTrackerBased:
140 >        pass = mu->HasTrackerTrk();
141 >        if (pass) {
142 >          pt  = mu->TrackerTrk()->Pt();
143 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
144 >        }
145          break;
146        default:
147          break;
# Line 70 | Line 153 | void MuonIDMod::Process()
153      if (pt <= fMuonPtMin)
154        continue;
155  
156 +    if (eta >= fEtaCut)
157 +      continue;
158 +
159 +    Double_t RChi2 = 0.0;
160 +    if     (mu->HasGlobalTrk()) {
161 +      RChi2 = mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof();
162 +    }
163 +    else if(mu->BestTrk() != 0){
164 +      RChi2 = mu->BestTrk()->Chi2()/mu->BestTrk()->Ndof();
165 +    }
166      Bool_t idpass = kFALSE;
167      switch (fMuIDType) {
168 +      case kWMuId:
169 +        idpass = mu->BestTrk() != 0 &&
170 +                 mu->BestTrk()->NHits() > 10 &&
171 +                 RChi2 < 10.0 &&
172 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
173 +                 mu->BestTrk()->NPixelHits() > 0 &&
174 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
175 +        break;
176 +      case kZMuId:
177 +        idpass = mu->BestTrk() != 0 &&
178 +                 mu->BestTrk()->NHits() > 10 &&
179 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
180 +                 mu->BestTrk()->NPixelHits() > 0 &&
181 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
182 +        break;
183        case kLoose:
184 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationLoose) &&
185 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityLoose);
184 >        idpass = mu->BestTrk() != 0 &&
185 >                 mu->Quality().Quality(MuonQuality::TMOneStationLoose) &&
186 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityLoose) &&
187 >                 mu->BestTrk()->NHits() > 10 &&
188 >                 RChi2 < 10.0 &&
189 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
190          break;
191        case kTight:
192 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationTight) &&
193 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityTight);
192 >        idpass = mu->BestTrk() !=  0 &&
193 >                 mu->Quality().Quality(MuonQuality::TMOneStationTight) &&
194 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityTight) &&
195 >                 mu->BestTrk()->NHits() > 10 &&
196 >                 RChi2 < 10.0 &&
197 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
198 >        break;
199 >      case kWWMuIdV1:
200 >        idpass = mu->BestTrk() != 0 &&
201 >                 mu->BestTrk()->NHits() > 10 &&
202 >                 mu->BestTrk()->NPixelHits() > 0 &&
203 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1 &&
204 >                 RChi2 < 10.0 &&
205 >                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
206 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
207 >        break;
208 >      case kWWMuIdV2:
209 >        idpass = mu->BestTrk() != 0 &&
210 >                 mu->BestTrk()->NHits() > 10 &&
211 >                 mu->BestTrk()->NPixelHits() > 0 &&
212 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1;
213 >        break;
214 >
215 >      case kNoId:
216 >        idpass = kTRUE;
217          break;
218        default:
219          break;
# Line 87 | Line 222 | void MuonIDMod::Process()
222      if (!idpass)
223        continue;
224  
225 <    Bool_t isopass = kFALSE;
225 >    Bool_t isocut = kFALSE;
226      switch (fMuIsoType) {
227        case kTrackCalo:
228 <        isopass = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
228 >        isocut = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
229            (mu->IsoR03EmEt() + mu->IsoR03HadEt() < fCaloIsolationCut);
230          break;
231        case kTrackCaloCombined:
232 <        isopass = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
233 <                   1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
232 >        isocut = (1.0 * mu->IsoR03SumPt() +
233 >                  1.0 * mu->IsoR03EmEt()  +
234 >                  1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
235          break;
236        case kTrackCaloSliding:
237          {
238 <          Double_t totalIso = 1.0 * mu->IsoR03SumPt() +
239 <                              1.0 * mu->IsoR03EmEt() +
240 <                              1.0 * mu->IsoR03HadEt();
241 <          if ((totalIso < (mu->Pt()-10.0)*5.0/15.0 && mu->Pt() <= 25) ||
242 <              (totalIso < 5.0 && mu->Pt() > 25) ||
243 <               totalIso <= 0)
244 <            isopass = kTRUE;
238 >          const PileupEnergyDensity *rho =  fPileupEnergyDensity->At(0);
239 >          Double_t totalIso =  mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt() - rho->Rho() * TMath::Pi() * 0.3 * 0.3 ;
240 >          // trick to change the signal region cut
241 >          double theIsoCut = fCombIsolationCut;
242 >          if(theIsoCut < 0.20){
243 >            if(mu->Pt() >  20.0) theIsoCut = 0.15;
244 >            else                 theIsoCut = 0.10;
245 >          }
246 >          if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
247 >        }
248 >        break;
249 >      case kTrackCaloSlidingNoCorrection:
250 >        {
251 >          Double_t totalIso =  1.0 * mu->IsoR03SumPt() +
252 >                               1.0 * mu->IsoR03EmEt()  +
253 >                               1.0 * mu->IsoR03HadEt();
254 >          // trick to change the signal region cut
255 >          double theIsoCut = fCombIsolationCut;
256 >          if(theIsoCut < 0.20){
257 >            if(mu->Pt() >  20.0) theIsoCut = 0.15;
258 >            else                 theIsoCut = 0.10;
259 >          }
260 >          if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
261 >        }
262 >        break;
263 >      case kCombinedRelativeConeAreaCorrected:
264 >        {
265 >          const PileupEnergyDensity *rho =  fPileupEnergyDensity->At(0);
266 >          Double_t totalIso =  mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt() - rho->Rho() * TMath::Pi() * 0.3 * 0.3 ;
267 >          double theIsoCut = fCombRelativeIsolationCut;
268 >          if (totalIso < (mu->Pt()*theIsoCut)) isocut = kTRUE;
269          }
270 +        break;          
271 +      case kPFIso:
272 +      {
273 +          Double_t pfIsoCutValue = 9999;
274 +          if(fPFIsolationCut > 0){
275 +            pfIsoCutValue = fPFIsolationCut;
276 +          } else {
277 +            if (mu->AbsEta() < 1.479) {
278 +              if (mu->Pt() > 20) {
279 +                pfIsoCutValue = 0.13;
280 +              } else {
281 +                pfIsoCutValue = 0.06;
282 +              }
283 +            } else {
284 +              if (mu->Pt() > 20) {
285 +                pfIsoCutValue = 0.09;
286 +              } else {
287 +                pfIsoCutValue = 0.05;
288 +              }
289 +            }
290 +          }
291 +          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.1, 1.0, 0.3, 0.0);
292 +          if (totalIso < (mu->Pt()*pfIsoCutValue) )
293 +            isocut = kTRUE;
294 +        }
295 +        break;
296 +      case kPFIsoNoL:
297 +        {
298 +          fNonIsolatedMuons     = GetObjThisEvt<MuonCol>(fNonIsolatedMuonsName);
299 +          fNonIsolatedElectrons = GetObjThisEvt<ElectronCol>(fNonIsolatedElectronsName);
300 +
301 +          Double_t beta = IsolationTools::BetaM(fTracks, mu, fVertices->At(0), 0.0, 0.2, 0.3, 0.02);
302 +          if(beta == 0) beta = 1.0;
303 +          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), fNonIsolatedMuons, fNonIsolatedElectrons, 0.2, 1.0, 0.4, 0.0, 3);
304 +          if (totalIso < (mu->Pt()*fPFIsolationCut) )
305 +            isocut = kTRUE;
306 +        }
307          break;
308        case kNoIso:
309 <        isopass = kTRUE;
309 >        isocut = kTRUE;
310          break;
311        case kCustomIso:
312        default:
313          break;
314      }
315  
316 <    if (!isopass)
316 >    if (isocut == kFALSE)
317        continue;
318  
319 +    // apply d0 cut
320 +    if (fApplyD0Cut) {
321 +      Bool_t passD0cut = kTRUE;
322 +      if(fD0Cut < 0.05) { // trick to change the signal region cut
323 +        if      (mu->Pt() >  20.0) fD0Cut = 0.02;
324 +        else if (mu->Pt() <= 20.0) fD0Cut = 0.01;
325 +      }
326 +      if(fWhichVertex >= -1) passD0cut = MuonTools::PassD0Cut(mu, fVertices, fD0Cut, fWhichVertex);
327 +      else                   passD0cut = MuonTools::PassD0Cut(mu, fBeamSpot, fD0Cut);
328 +      if (!passD0cut)
329 +        continue;
330 +    }
331 +
332 +    // apply dz cut
333 +    if (fApplyDZCut) {
334 +      Bool_t passDZcut = MuonTools::PassDZCut(mu, fVertices, fDZCut, fWhichVertex);
335 +      if (!passDZcut)
336 +        continue;
337 +    }
338 +
339      // add good muon
340      CleanMuons->Add(mu);
341    }
# Line 136 | Line 353 | void MuonIDMod::SlaveBegin()
353    // Run startup code on the computer (slave) doing the actual analysis. Here,
354    // we just request the muon collection branch.
355  
356 <  ReqBranch(fMuonBranchName, fMuons);
357 <
358 <  fMuonTools = new MuonTools;
356 >   // In this case we cannot have a branch
357 >  if (fMuonIsoType.CompareTo("PFIsoNoL") != 0) {
358 >    ReqEventObject(fMuonBranchName, fMuons, kTRUE);
359 >  }
360 >  ReqEventObject(fBeamSpotName, fBeamSpot, kTRUE);
361 >  ReqEventObject(fTrackName, fTracks, kTRUE);
362 >  ReqEventObject(fPFCandidatesName, fPFCandidates, kTRUE);
363 >  if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0
364 >      || fMuonIsoType.CompareTo("CombinedRelativeConeAreaCorrected") == 0) {
365 >    ReqEventObject(fPileupEnergyDensityName, fPileupEnergyDensity, kTRUE);
366 >  }
367  
368 <  if (fMuonIDType.CompareTo("Tight") == 0)
368 >  if (fMuonIDType.CompareTo("WMuId") == 0)
369 >    fMuIDType = kWMuId;
370 >  else if (fMuonIDType.CompareTo("ZMuId") == 0)
371 >    fMuIDType = kZMuId;
372 >  else if (fMuonIDType.CompareTo("Tight") == 0)
373      fMuIDType = kTight;
374    else if (fMuonIDType.CompareTo("Loose") == 0)
375      fMuIDType = kLoose;
376 +  else if (fMuonIDType.CompareTo("WWMuIdV1") == 0)
377 +    fMuIDType = kWWMuIdV1;
378 +  else if (fMuonIDType.CompareTo("WWMuIdV2") == 0)
379 +    fMuIDType = kWWMuIdV2;
380    else if (fMuonIDType.CompareTo("NoId") == 0)
381      fMuIDType = kNoId;
382    else if (fMuonIDType.CompareTo("Custom") == 0) {
# Line 163 | Line 396 | void MuonIDMod::SlaveBegin()
396      fMuIsoType = kTrackCaloCombined;
397    else if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0)
398      fMuIsoType = kTrackCaloSliding;
399 +  else if (fMuonIsoType.CompareTo("TrackCaloSlidingNoCorrection") == 0)
400 +    fMuIsoType = kTrackCaloSlidingNoCorrection;
401 +  else if (fMuonIsoType.CompareTo("CombinedRelativeConeAreaCorrected") == 0)
402 +    fMuIsoType = kCombinedRelativeConeAreaCorrected;
403 +  else if (fMuonIsoType.CompareTo("PFIso") == 0)
404 +    fMuIsoType = kPFIso;
405 +  else if (fMuonIsoType.CompareTo("PFIsoNoL") == 0)
406 +    fMuIsoType = kPFIsoNoL;
407    else if (fMuonIsoType.CompareTo("NoIso") == 0)
408      fMuIsoType = kNoIso;
409    else if (fMuonIsoType.CompareTo("Custom") == 0) {
# Line 180 | Line 421 | void MuonIDMod::SlaveBegin()
421      fMuClassType = kAll;
422    else if (fMuonClassType.CompareTo("Global") == 0)
423      fMuClassType = kGlobal;
424 +  else if (fMuonClassType.CompareTo("GlobalTracker") == 0)
425 +    fMuClassType = kGlobalTracker;
426    else if (fMuonClassType.CompareTo("Standalone") == 0)
427      fMuClassType = kSta;
428 <  else if (fMuonClassType.CompareTo("TrackerOnly") == 0)
429 <    fMuClassType = kTrackerOnly;
428 >  else if (fMuonClassType.CompareTo("TrackerMuon") == 0)
429 >    fMuClassType = kTrackerMuon;
430 >  else if (fMuonClassType.CompareTo("CaloMuon") == 0)
431 >    fMuClassType = kCaloMuon;
432 >  else if (fMuonClassType.CompareTo("TrackerBased") == 0)
433 >    fMuClassType = kTrackerBased;
434    else {
435      SendError(kAbortAnalysis, "SlaveBegin",
436                "The specified muon class %s is not defined.",

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines