ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/MuonIDMod.cc
Revision: 1.41
Committed: Fri Mar 11 15:13:09 2011 UTC (14 years, 1 month ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_020pre1
Changes since 1.40: +19 -14 lines
Log Message:
new

File Contents

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