ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/MuonIDMod.cc
Revision: 1.36
Committed: Fri Oct 29 16:20:07 2010 UTC (14 years, 6 months ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_017, Mit_017pre3, Mit_017pre2, Mit_017pre1, Mit_016
Changes since 1.35: +11 -8 lines
Log Message:
new cuts

File Contents

# User Rev Content
1 ceballos 1.36 // $Id: MuonIDMod.cc,v 1.35 2010/10/20 02:44:16 ceballos Exp $
2 loizides 1.1
3     #include "MitPhysics/Mods/interface/MuonIDMod.h"
4 loizides 1.6 #include "MitCommon/MathTools/interface/MathUtils.h"
5 loizides 1.23 #include "MitAna/DataTree/interface/MuonCol.h"
6     #include "MitAna/DataTree/interface/VertexCol.h"
7 loizides 1.6 #include "MitPhysics/Init/interface/ModNames.h"
8 loizides 1.1
9     using namespace mithep;
10    
11     ClassImp(mithep::MuonIDMod)
12    
13     //--------------------------------------------------------------------------------------------------
14     MuonIDMod::MuonIDMod(const char *name, const char *title) :
15     BaseMod(name,title),
16 loizides 1.6 fMuonBranchName(Names::gkMuonBrn),
17     fCleanMuonsName(ModNames::gkCleanMuonsName),
18 ceballos 1.35 fVertexName(ModNames::gkGoodVertexesName),
19 ceballos 1.36 fMuonIDType("WWMuId"),
20 loizides 1.8 fMuonIsoType("TrackCaloSliding"),
21 loizides 1.6 fMuonClassType("Global"),
22 ceballos 1.2 fTrackIsolationCut(3.0),
23     fCaloIsolationCut(3.0),
24 loizides 1.8 fCombIsolationCut(5.0),
25 ceballos 1.3 fMuonPtMin(10),
26 loizides 1.21 fApplyD0Cut(kTRUE),
27 ceballos 1.30 fD0Cut(0.020),
28     fEtaCut(2.4),
29 loizides 1.20 fReverseIsoCut(kFALSE),
30 ceballos 1.22 fReverseD0Cut(kFALSE),
31 loizides 1.15 fMuIDType(kIdUndef),
32     fMuIsoType(kIsoUndef),
33     fMuClassType(kClassUndef),
34 ceballos 1.14 fMuons(0),
35 loizides 1.15 fVertices(0),
36 loizides 1.20 fMuonTools(0)
37 loizides 1.1 {
38     // Constructor.
39     }
40    
41     //--------------------------------------------------------------------------------------------------
42     void MuonIDMod::Process()
43     {
44     // Process entries of the tree.
45    
46 loizides 1.21 LoadEventObject(fMuonBranchName, fMuons);
47 loizides 1.1
48 loizides 1.7 MuonOArr *CleanMuons = new MuonOArr;
49     CleanMuons->SetName(fCleanMuonsName);
50 loizides 1.1
51     for (UInt_t i=0; i<fMuons->GetEntries(); ++i) {
52 loizides 1.8 const Muon *mu = fMuons->At(i);
53 loizides 1.6
54     Bool_t pass = kFALSE;
55 ceballos 1.30 Double_t pt = 0; // make sure pt is taken from the correct track!
56     Double_t eta = 0; // make sure eta is taken from the correct track!
57 loizides 1.6 switch (fMuClassType) {
58     case kAll:
59     pass = kTRUE;
60 ceballos 1.30 if (mu->HasTrk()) {
61     pt = mu->Pt();
62     eta = TMath::Abs(mu->Eta());
63     }
64 loizides 1.6 break;
65     case kGlobal:
66 ceballos 1.31 pass = mu->HasGlobalTrk() && mu->IsTrackerMuon();
67 ceballos 1.32 if (pass && mu->TrackerTrk()) {
68 ceballos 1.30 pt = mu->TrackerTrk()->Pt();
69     eta = TMath::Abs(mu->TrackerTrk()->Eta());
70     }
71 ceballos 1.32 else {
72     pt = mu->Pt();
73     eta = TMath::Abs(mu->Eta());
74     }
75 ceballos 1.30 break;
76 loizides 1.6 case kSta:
77 loizides 1.19 pass = mu->HasStandaloneTrk();
78 ceballos 1.30 if (pass) {
79     pt = mu->StandaloneTrk()->Pt();
80     eta = TMath::Abs(mu->StandaloneTrk()->Eta());
81     }
82 loizides 1.6 break;
83 loizides 1.24 case kTrackerMuon:
84 ceballos 1.28 pass = mu->HasTrackerTrk() && mu->IsTrackerMuon() &&
85     mu->Quality().Quality(MuonQuality::TrackerMuonArbitrated);
86 ceballos 1.30 if (pass) {
87     pt = mu->TrackerTrk()->Pt();
88     eta = TMath::Abs(mu->TrackerTrk()->Eta());
89     }
90 loizides 1.24 break;
91     case kCaloMuon:
92     pass = mu->HasTrackerTrk() && mu->IsCaloMuon();
93 ceballos 1.30 if (pass) {
94     pt = mu->TrackerTrk()->Pt();
95     eta = TMath::Abs(mu->TrackerTrk()->Eta());
96     }
97 loizides 1.24 break;
98     case kTrackerBased:
99 loizides 1.19 pass = mu->HasTrackerTrk();
100 ceballos 1.30 if (pass) {
101     pt = mu->TrackerTrk()->Pt();
102     eta = TMath::Abs(mu->TrackerTrk()->Eta());
103     }
104 loizides 1.6 break;
105     default:
106     break;
107 ceballos 1.5 }
108 loizides 1.6
109     if (!pass)
110     continue;
111    
112     if (pt <= fMuonPtMin)
113     continue;
114    
115 ceballos 1.30 if (eta >= fEtaCut)
116     continue;
117    
118 ceballos 1.34 Double_t RChi2 = 0.0;
119     if (mu->HasGlobalTrk()) {
120     RChi2 = mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof();
121     }
122     else if(mu->BestTrk() != 0){
123     RChi2 = mu->BestTrk()->Chi2()/mu->BestTrk()->Ndof();
124     }
125 loizides 1.6 Bool_t idpass = kFALSE;
126     switch (fMuIDType) {
127 ceballos 1.34 case kWMuId:
128     idpass = mu->BestTrk() != 0 &&
129     mu->BestTrk()->NHits() > 10 &&
130     RChi2 < 10.0 &&
131 ceballos 1.36 (mu->NSegments() > 1 || mu->NMatches() > 1) &&
132 ceballos 1.34 mu->BestTrk()->NPixelHits() > 0 &&
133     mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
134     break;
135     case kZMuId:
136     idpass = mu->BestTrk() != 0 &&
137     mu->BestTrk()->NHits() > 10 &&
138 ceballos 1.36 (mu->NSegments() > 1 || mu->NMatches() > 1) &&
139 ceballos 1.34 mu->BestTrk()->NPixelHits() > 0 &&
140     mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
141     break;
142 loizides 1.6 case kLoose:
143 ceballos 1.32 idpass = mu->BestTrk() != 0 &&
144     mu->Quality().Quality(MuonQuality::TMOneStationLoose) &&
145 ceballos 1.28 mu->Quality().Quality(MuonQuality::TM2DCompatibilityLoose) &&
146 ceballos 1.29 mu->BestTrk()->NHits() > 10 &&
147 ceballos 1.34 RChi2 < 10.0 &&
148 ceballos 1.30 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
149 loizides 1.6 break;
150     case kTight:
151 ceballos 1.32 idpass = mu->BestTrk() != 0 &&
152     mu->Quality().Quality(MuonQuality::TMOneStationTight) &&
153 ceballos 1.28 mu->Quality().Quality(MuonQuality::TM2DCompatibilityTight) &&
154 ceballos 1.29 mu->BestTrk()->NHits() > 10 &&
155 ceballos 1.34 RChi2 < 10.0 &&
156 ceballos 1.30 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
157 ceballos 1.28 break;
158 ceballos 1.36 case kWWMuId:
159 ceballos 1.32 idpass = mu->BestTrk() != 0 &&
160     mu->BestTrk()->NHits() > 10 &&
161 ceballos 1.34 RChi2 < 10.0 &&
162 ceballos 1.36 (mu->NSegments() > 1 || mu->NMatches() > 1) &&
163     mu->BestTrk()->NPixelHits() > 0 &&
164     mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight) &&
165     mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1;
166 loizides 1.6 break;
167 loizides 1.18 case kNoId:
168     idpass = kTRUE;
169     break;
170 loizides 1.6 default:
171     break;
172 ceballos 1.4 }
173 loizides 1.6
174     if (!idpass)
175     continue;
176    
177 ceballos 1.22 Bool_t isocut = kFALSE;
178 loizides 1.6 switch (fMuIsoType) {
179     case kTrackCalo:
180 ceballos 1.22 isocut = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
181 loizides 1.6 (mu->IsoR03EmEt() + mu->IsoR03HadEt() < fCaloIsolationCut);
182     break;
183     case kTrackCaloCombined:
184 ceballos 1.22 isocut = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
185 ceballos 1.28 1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
186 loizides 1.6 break;
187     case kTrackCaloSliding:
188     {
189     Double_t totalIso = 1.0 * mu->IsoR03SumPt() +
190     1.0 * mu->IsoR03EmEt() +
191     1.0 * mu->IsoR03HadEt();
192 ceballos 1.29 if (totalIso < (mu->Pt()*0.15) )
193 ceballos 1.22 isocut = kTRUE;
194    
195     if (fReverseIsoCut == kTRUE &&
196     isocut == kFALSE && totalIso < 10)
197     isocut = kTRUE;
198     else if(fReverseIsoCut == kTRUE)
199     isocut = kFALSE;
200     }
201 loizides 1.6 break;
202 loizides 1.13 case kNoIso:
203 ceballos 1.22 isocut = kTRUE;
204 loizides 1.13 break;
205 loizides 1.6 case kCustomIso:
206     default:
207     break;
208 ceballos 1.4 }
209 ceballos 1.3
210 ceballos 1.22 if (isocut == kFALSE)
211 loizides 1.6 continue;
212    
213 loizides 1.21 if (fApplyD0Cut) {
214 ceballos 1.35 fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
215 ceballos 1.31 Bool_t passD0cut = MuonTools::PassD0Cut(mu, fVertices, fD0Cut, fReverseD0Cut);
216     if (!passD0cut)
217 loizides 1.21 continue;
218 ceballos 1.14 }
219    
220 loizides 1.6 // add good muon
221     CleanMuons->Add(mu);
222 loizides 1.1 }
223    
224 loizides 1.10 // sort according to pt
225     CleanMuons->Sort();
226    
227 loizides 1.6 // add objects for other modules to use
228 loizides 1.7 AddObjThisEvt(CleanMuons);
229 loizides 1.1 }
230    
231     //--------------------------------------------------------------------------------------------------
232     void MuonIDMod::SlaveBegin()
233     {
234     // Run startup code on the computer (slave) doing the actual analysis. Here,
235 loizides 1.6 // we just request the muon collection branch.
236    
237 loizides 1.21 ReqEventObject(fMuonBranchName, fMuons, kTRUE);
238    
239 loizides 1.6 fMuonTools = new MuonTools;
240 loizides 1.1
241 ceballos 1.34 if (fMuonIDType.CompareTo("WMuId") == 0)
242     fMuIDType = kWMuId;
243     else if (fMuonIDType.CompareTo("ZMuId") == 0)
244     fMuIDType = kZMuId;
245     else if (fMuonIDType.CompareTo("Tight") == 0)
246 loizides 1.6 fMuIDType = kTight;
247     else if (fMuonIDType.CompareTo("Loose") == 0)
248     fMuIDType = kLoose;
249 ceballos 1.36 else if (fMuonIDType.CompareTo("WWMuId") == 0)
250     fMuIDType = kWWMuId;
251 loizides 1.12 else if (fMuonIDType.CompareTo("NoId") == 0)
252     fMuIDType = kNoId;
253 loizides 1.6 else if (fMuonIDType.CompareTo("Custom") == 0) {
254     fMuIDType = kCustomId;
255     SendError(kWarning, "SlaveBegin",
256     "Custom muon identification is not yet implemented.");
257     } else {
258     SendError(kAbortAnalysis, "SlaveBegin",
259     "The specified muon identification %s is not defined.",
260     fMuonIDType.Data());
261     return;
262     }
263 loizides 1.1
264 loizides 1.6 if (fMuonIsoType.CompareTo("TrackCalo") == 0)
265     fMuIsoType = kTrackCalo;
266     else if (fMuonIsoType.CompareTo("TrackCaloCombined") == 0)
267     fMuIsoType = kTrackCaloCombined;
268     else if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0)
269     fMuIsoType = kTrackCaloSliding;
270     else if (fMuonIsoType.CompareTo("NoIso") == 0)
271     fMuIsoType = kNoIso;
272     else if (fMuonIsoType.CompareTo("Custom") == 0) {
273     fMuIsoType = kCustomIso;
274     SendError(kWarning, "SlaveBegin",
275     "Custom muon isolation is not yet implemented.");
276     } else {
277     SendError(kAbortAnalysis, "SlaveBegin",
278     "The specified muon isolation %s is not defined.",
279     fMuonIsoType.Data());
280     return;
281     }
282 loizides 1.1
283 loizides 1.6 if (fMuonClassType.CompareTo("All") == 0)
284     fMuClassType = kAll;
285     else if (fMuonClassType.CompareTo("Global") == 0)
286     fMuClassType = kGlobal;
287     else if (fMuonClassType.CompareTo("Standalone") == 0)
288     fMuClassType = kSta;
289 loizides 1.24 else if (fMuonClassType.CompareTo("TrackerMuon") == 0)
290     fMuClassType = kTrackerMuon;
291     else if (fMuonClassType.CompareTo("CaloMuon") == 0)
292     fMuClassType = kCaloMuon;
293     else if (fMuonClassType.CompareTo("TrackerBased") == 0)
294     fMuClassType = kTrackerBased;
295 loizides 1.6 else {
296     SendError(kAbortAnalysis, "SlaveBegin",
297     "The specified muon class %s is not defined.",
298     fMuonClassType.Data());
299     return;
300     }
301 loizides 1.1 }