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.40 by ceballos, Mon Mar 7 12:45:52 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 >  fTrackName(Names::gkTrackBrn),
23 >  fPFCandidatesName(Names::gkPFCandidatesBrn),
24 >  fMuonIDType("WWMuId"),
25 >  fMuonIsoType("TrackCaloSliding"),
26    fMuonClassType("Global"),  
27    fTrackIsolationCut(3.0),
28    fCaloIsolationCut(3.0),
29 <  fCombIsolationCut(5.0),
29 >  fCombIsolationCut(0.15),
30    fMuonPtMin(10),
31 <  fMuons(0)
31 >  fApplyD0Cut(kTRUE),
32 >  fD0Cut(0.020),
33 >  fEtaCut(2.4),
34 >  fReverseIsoCut(kFALSE),
35 >  fReverseD0Cut(kFALSE),
36 >  fMuIDType(kIdUndef),
37 >  fMuIsoType(kIsoUndef),
38 >  fMuClassType(kClassUndef),
39 >  fMuons(0),
40 >  fVertices(0),
41 >  fTracks(0),
42 >  fPFCandidates(0),
43 >  fNonIsolatedMuons(0),
44 >  fNonIsolatedElectrons(0)
45   {
46    // Constructor.
47   }
# Line 30 | Line 51 | void MuonIDMod::Process()
51   {
52    // Process entries of the tree.
53  
54 <  LoadBranch(fMuonBranchName);
54 >  if(fMuIsoType != kPFIsoNoL) {
55 >    LoadEventObject(fMuonBranchName, fMuons);
56 >  }
57 >  else {
58 >    fMuons = GetObjThisEvt<MuonOArr>(fMuonBranchName);
59 >  }
60 >  LoadEventObject(fTrackName, fTracks);
61 >  LoadEventObject(fPFCandidatesName, fPFCandidates);
62  
63    MuonOArr *CleanMuons = new MuonOArr;
64    CleanMuons->SetName(fCleanMuonsName);
65  
66 +  fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
67 +
68    for (UInt_t i=0; i<fMuons->GetEntries(); ++i) {
69      const Muon *mu = fMuons->At(i);
70  
71      Bool_t pass = kFALSE;
72 <    Double_t pt = -1; // make sure pt is taken from the correct track!
72 >    Double_t pt = 0;  // make sure pt is taken from the correct track!
73 >    Double_t eta = 0; // make sure eta is taken from the correct track!
74      switch (fMuClassType) {
75        case kAll:
76          pass = kTRUE;
77 <        pt = mu->Pt();
77 >        if (mu->HasTrk()) {
78 >          pt  = mu->Pt();
79 >          eta = TMath::Abs(mu->Eta());
80 >        }
81          break;
82        case kGlobal:
83 <        pass = (mu->GlobalTrk() != 0);
84 <        if (pass)
85 <          pt = mu->GlobalTrk()->Pt();
86 <        break;
83 >        pass = mu->HasGlobalTrk() && mu->IsTrackerMuon();
84 >        if (pass && mu->TrackerTrk()) {
85 >          pt  = mu->TrackerTrk()->Pt();
86 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
87 >        }
88 >        else {
89 >          pt  = mu->Pt();
90 >          eta = TMath::Abs(mu->Eta());
91 >        }
92 >        break;
93        case kSta:
94 <        pass = (mu->StandaloneTrk() != 0);
95 <        if (pass)
96 <          pt = mu->StandaloneTrk()->Pt();
97 <        break;
98 <      case kTrackerOnly:
99 <        pass = (mu->TrackerTrk() != 0);
100 <        if (pass)
101 <          pt = mu->TrackerTrk()->Pt();
94 >        pass = mu->HasStandaloneTrk();
95 >        if (pass) {
96 >          pt  = mu->StandaloneTrk()->Pt();
97 >          eta = TMath::Abs(mu->StandaloneTrk()->Eta());
98 >        }
99 >        break;
100 >      case kTrackerMuon:
101 >        pass = mu->HasTrackerTrk() && mu->IsTrackerMuon() &&
102 >               mu->Quality().Quality(MuonQuality::TrackerMuonArbitrated);
103 >        if (pass) {
104 >          pt  = mu->TrackerTrk()->Pt();
105 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
106 >        }
107 >        break;
108 >      case kCaloMuon:
109 >        pass = mu->HasTrackerTrk() && mu->IsCaloMuon();
110 >        if (pass) {
111 >          pt  = mu->TrackerTrk()->Pt();
112 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
113 >        }
114 >        break;
115 >      case kTrackerBased:
116 >        pass = mu->HasTrackerTrk();
117 >        if (pass) {
118 >          pt  = mu->TrackerTrk()->Pt();
119 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
120 >        }
121          break;
122        default:
123          break;
# Line 70 | Line 129 | void MuonIDMod::Process()
129      if (pt <= fMuonPtMin)
130        continue;
131  
132 +    if (eta >= fEtaCut)
133 +      continue;
134 +
135 +    Double_t RChi2 = 0.0;
136 +    if     (mu->HasGlobalTrk()) {
137 +      RChi2 = mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof();
138 +    }
139 +    else if(mu->BestTrk() != 0){
140 +      RChi2 = mu->BestTrk()->Chi2()/mu->BestTrk()->Ndof();
141 +    }
142      Bool_t idpass = kFALSE;
143      switch (fMuIDType) {
144 +      case kWMuId:
145 +        idpass = mu->BestTrk() != 0 &&
146 +                 mu->BestTrk()->NHits() > 10 &&
147 +                 RChi2 < 10.0 &&
148 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
149 +                 mu->BestTrk()->NPixelHits() > 0 &&
150 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
151 +        break;
152 +      case kZMuId:
153 +        idpass = mu->BestTrk() != 0 &&
154 +                 mu->BestTrk()->NHits() > 10 &&
155 +                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
156 +                 mu->BestTrk()->NPixelHits() > 0 &&
157 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
158 +        break;
159        case kLoose:
160 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationLoose) &&
161 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityLoose);
160 >        idpass = mu->BestTrk() != 0 &&
161 >                 mu->Quality().Quality(MuonQuality::TMOneStationLoose) &&
162 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityLoose) &&
163 >                 mu->BestTrk()->NHits() > 10 &&
164 >                 RChi2 < 10.0 &&
165 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
166          break;
167        case kTight:
168 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationTight) &&
169 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityTight);
168 >        idpass = mu->BestTrk() !=  0 &&
169 >                 mu->Quality().Quality(MuonQuality::TMOneStationTight) &&
170 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityTight) &&
171 >                 mu->BestTrk()->NHits() > 10 &&
172 >                 RChi2 < 10.0 &&
173 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
174 >        break;
175 >      case kWWMuId:
176 >        idpass = mu->BestTrk() != 0 &&
177 >                 mu->BestTrk()->NHits() > 10 &&
178 >                 RChi2 < 10.0 &&
179 >                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
180 >                 mu->BestTrk()->NPixelHits() > 0 &&
181 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight) &&
182 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1;
183 >        break;
184 >      case kNoId:
185 >        idpass = kTRUE;
186          break;
187        default:
188          break;
# Line 87 | Line 191 | void MuonIDMod::Process()
191      if (!idpass)
192        continue;
193  
194 <    Bool_t isopass = kFALSE;
194 >    Bool_t isocut = kFALSE;
195      switch (fMuIsoType) {
196        case kTrackCalo:
197 <        isopass = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
197 >        isocut = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
198            (mu->IsoR03EmEt() + mu->IsoR03HadEt() < fCaloIsolationCut);
199          break;
200        case kTrackCaloCombined:
201 <        isopass = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
202 <                   1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
201 >        isocut = (1.0 * mu->IsoR03SumPt() +
202 >                  1.0 * mu->IsoR03EmEt()  +
203 >                  1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
204          break;
205        case kTrackCaloSliding:
206          {
207 <          Double_t totalIso = 1.0 * mu->IsoR03SumPt() +
208 <                              1.0 * mu->IsoR03EmEt() +
209 <                              1.0 * mu->IsoR03HadEt();
210 <          if ((totalIso < (mu->Pt()-10.0)*5.0/15.0 && mu->Pt() <= 25) ||
211 <              (totalIso < 5.0 && mu->Pt() > 25) ||
212 <               totalIso <= 0)
213 <            isopass = kTRUE;
214 <        }
207 >          Double_t beta = IsolationTools::BetaM(fTracks, mu, fVertices->At(0), 0.0, 0.2, 0.3, 0.02);
208 >          if(beta == 0) beta = 1.0;
209 >          Double_t totalIso =  1.0 * mu->IsoR03SumPt() +
210 >                              (1.0 * mu->IsoR03EmEt()  +
211 >                               1.0 * mu->IsoR03HadEt()) * beta;
212 >          if (totalIso < (mu->Pt()*fCombIsolationCut) )
213 >            isocut = kTRUE;
214 >
215 >          if     (fReverseIsoCut == kTRUE &&
216 >                  isocut == kFALSE && totalIso < 10)
217 >            isocut = kTRUE;
218 >          else if(fReverseIsoCut == kTRUE)
219 >            isocut = kFALSE;
220 >        }
221 >        break;
222 >      case kTrackCaloSlidingNoBeta:
223 >        {
224 >          Double_t beta = 1.0;
225 >          Double_t totalIso =  1.0 * mu->IsoR03SumPt() +
226 >                              (1.0 * mu->IsoR03EmEt()  +
227 >                               1.0 * mu->IsoR03HadEt()) * beta;
228 >          if (totalIso < (mu->Pt()*fCombIsolationCut) )
229 >            isocut = kTRUE;
230 >        }
231 >        break;
232 >      case kPFIso:
233 >        {
234 >          Double_t beta = IsolationTools::BetaM(fTracks, mu, fVertices->At(0), 0.0, 0.2, 0.3, 0.02);
235 >          if(beta == 0) beta = 1.0;
236 >          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.2, 0.5, 0.3, 0.02, 0, beta, fNonIsolatedMuons, fNonIsolatedElectrons);
237 >          if (totalIso < (mu->Pt()*fCombIsolationCut) )
238 >            isocut = kTRUE;
239 >        }
240 >        break;
241 >      case kPFIsoNoL:
242 >        {
243 >          fNonIsolatedMuons     = GetObjThisEvt<MuonCol>(fNonIsolatedMuonsName);
244 >          fNonIsolatedElectrons = GetObjThisEvt<ElectronCol>(fNonIsolatedElectronsName);
245 >
246 >          Double_t beta = IsolationTools::BetaM(fTracks, mu, fVertices->At(0), 0.0, 0.2, 0.3, 0.02);
247 >          if(beta == 0) beta = 1.0;
248 >          Double_t totalIso =  IsolationTools::PFMuonIsolation(mu, fPFCandidates, fVertices->At(0), 0.2, 0.5, 0.3, 0.02, 3, beta, fNonIsolatedMuons, fNonIsolatedElectrons);
249 >          if (totalIso < (mu->Pt()*fCombIsolationCut) )
250 >            isocut = kTRUE;
251 >        }
252          break;
253        case kNoIso:
254 <        isopass = kTRUE;
254 >        isocut = kTRUE;
255          break;
256        case kCustomIso:
257        default:
258          break;
259      }
260  
261 <    if (!isopass)
261 >    if (isocut == kFALSE)
262        continue;
263  
264 +    if (fApplyD0Cut) {
265 +      Bool_t passD0cut = MuonTools::PassD0Cut(mu, fVertices, fD0Cut);
266 +      if (!passD0cut)
267 +        continue;
268 +    }
269 +
270      // add good muon
271      CleanMuons->Add(mu);
272    }
# Line 136 | Line 284 | void MuonIDMod::SlaveBegin()
284    // Run startup code on the computer (slave) doing the actual analysis. Here,
285    // we just request the muon collection branch.
286  
287 <  ReqBranch(fMuonBranchName, fMuons);
288 <
289 <  fMuonTools = new MuonTools;
287 >   // In this case we cannot have a branch
288 >  if (fMuonIsoType.CompareTo("PFIsoNoL") != 0) {
289 >    ReqEventObject(fMuonBranchName, fMuons, kTRUE);
290 >  }
291 >  ReqEventObject(fTrackName, fTracks, kTRUE);
292 >  ReqEventObject(fPFCandidatesName, fPFCandidates, kTRUE);
293  
294 <  if (fMuonIDType.CompareTo("Tight") == 0)
294 >  if (fMuonIDType.CompareTo("WMuId") == 0)
295 >    fMuIDType = kWMuId;
296 >  else if (fMuonIDType.CompareTo("ZMuId") == 0)
297 >    fMuIDType = kZMuId;
298 >  else if (fMuonIDType.CompareTo("Tight") == 0)
299      fMuIDType = kTight;
300    else if (fMuonIDType.CompareTo("Loose") == 0)
301      fMuIDType = kLoose;
302 +  else if (fMuonIDType.CompareTo("WWMuId") == 0)
303 +    fMuIDType = kWWMuId;
304    else if (fMuonIDType.CompareTo("NoId") == 0)
305      fMuIDType = kNoId;
306    else if (fMuonIDType.CompareTo("Custom") == 0) {
# Line 163 | Line 320 | void MuonIDMod::SlaveBegin()
320      fMuIsoType = kTrackCaloCombined;
321    else if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0)
322      fMuIsoType = kTrackCaloSliding;
323 +  else if (fMuonIsoType.CompareTo("TrackCaloSlidingNoBeta") == 0)
324 +    fMuIsoType = kTrackCaloSlidingNoBeta;
325 +  else if (fMuonIsoType.CompareTo("PFIso") == 0)
326 +    fMuIsoType = kPFIso;
327 +  else if (fMuonIsoType.CompareTo("PFIsoNoL") == 0)
328 +    fMuIsoType = kPFIsoNoL;
329    else if (fMuonIsoType.CompareTo("NoIso") == 0)
330      fMuIsoType = kNoIso;
331    else if (fMuonIsoType.CompareTo("Custom") == 0) {
# Line 182 | Line 345 | void MuonIDMod::SlaveBegin()
345      fMuClassType = kGlobal;
346    else if (fMuonClassType.CompareTo("Standalone") == 0)
347      fMuClassType = kSta;
348 <  else if (fMuonClassType.CompareTo("TrackerOnly") == 0)
349 <    fMuClassType = kTrackerOnly;
348 >  else if (fMuonClassType.CompareTo("TrackerMuon") == 0)
349 >    fMuClassType = kTrackerMuon;
350 >  else if (fMuonClassType.CompareTo("CaloMuon") == 0)
351 >    fMuClassType = kCaloMuon;
352 >  else if (fMuonClassType.CompareTo("TrackerBased") == 0)
353 >    fMuClassType = kTrackerBased;
354    else {
355      SendError(kAbortAnalysis, "SlaveBegin",
356                "The specified muon class %s is not defined.",

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines