ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.65
Committed: Fri Jun 18 06:08:46 2010 UTC (14 years, 10 months ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_014c, Mit_014b
Changes since 1.64: +3 -3 lines
Log Message:
bug im deltar

File Contents

# Content
1 // $Id: ElectronIDMod.cc,v 1.64 2010/06/17 13:25:04 ceballos Exp $
2
3 #include "MitPhysics/Mods/interface/ElectronIDMod.h"
4 #include "MitAna/DataTree/interface/StableData.h"
5 #include "MitAna/DataTree/interface/ElectronCol.h"
6 #include "MitAna/DataTree/interface/VertexCol.h"
7 #include "MitAna/DataTree/interface/TriggerObjectCol.h"
8 #include "MitAna/DataTree/interface/DecayParticleCol.h"
9 #include "MitPhysics/Init/interface/ModNames.h"
10
11 using namespace mithep;
12
13 ClassImp(mithep::ElectronIDMod)
14
15 //--------------------------------------------------------------------------------------------------
16 ElectronIDMod::ElectronIDMod(const char *name, const char *title) :
17 BaseMod(name,title),
18 fElectronBranchName(Names::gkElectronBrn),
19 fConversionBranchName(Names::gkMvfConversionBrn),
20 fGoodElectronsName(ModNames::gkGoodElectronsName),
21 fVertexName(string("PrimaryVertexes").c_str()),
22 fElectronIDType("CustomTight"),
23 fElectronIsoType("TrackJuraSliding"),
24 fTrigObjectsName("HLTModTrigObjs"),
25 fElectronPtMin(10),
26 fElectronEtaMax(2.5),
27 fIDLikelihoodCut(0.9),
28 fTrackIsolationCut(5.0),
29 fCaloIsolationCut(5.0),
30 fEcalJuraIsoCut(5.0),
31 fHcalIsolationCut(5.0),
32 fCombIsolationCut(5.0),
33 fApplyConvFilterType1(kTRUE),
34 fApplyConvFilterType2(kFALSE),
35 fWrongHitsRequirement(kTRUE),
36 fNExpectedHitsInnerCut(999),
37 fCombinedIdCut(kFALSE),
38 fApplySpikeRemoval(kTRUE),
39 fApplyD0Cut(kTRUE),
40 fChargeFilter(kTRUE),
41 fD0Cut(0.020),
42 fReverseIsoCut(kFALSE),
43 fReverseD0Cut(kFALSE),
44 fApplyTriggerMatching(kFALSE),
45 fElIdType(ElectronTools::kIdUndef),
46 fElIsoType(ElectronTools::kIsoUndef),
47 fElectrons(0),
48 fConversions(0),
49 fVertices(0)
50 {
51 // Constructor.
52 }
53
54 //--------------------------------------------------------------------------------------------------
55 Bool_t ElectronIDMod::PassIDCut(const Electron *ele, ElectronTools::EElIdType idType) const
56 {
57
58 Bool_t idcut = kFALSE;
59 switch (idType) {
60 case ElectronTools::kTight:
61 idcut = ele->PassTightID();
62 break;
63 case ElectronTools::kLoose:
64 idcut = ele->PassLooseID();
65 break;
66 case ElectronTools::kLikelihood:
67 idcut = (ele->IDLikelihood() > fIDLikelihoodCut);
68 break;
69 case ElectronTools::kNoId:
70 idcut = kTRUE;
71 break;
72 case ElectronTools::kCustomIdLoose:
73 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdLoose);
74 break;
75 case ElectronTools::kCustomIdTight:
76 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdTight);
77 break;
78 case ElectronTools::kVBTFWorkingPoint95Id:
79 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint95Id);
80 break;
81 case ElectronTools::kVBTFWorkingPoint90Id:
82 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint90Id);
83 break;
84 case ElectronTools::kVBTFWorkingPoint85Id:
85 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint85Id);
86 break;
87 case ElectronTools::kVBTFWorkingPoint80Id:
88 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint80Id);
89 break;
90 case ElectronTools::kVBTFWorkingPoint70Id:
91 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint70Id);
92 break;
93 default:
94 break;
95 }
96
97 return idcut;
98 }
99
100
101 //--------------------------------------------------------------------------------------------------
102 Bool_t ElectronIDMod::PassIsolationCut(const Electron *ele, ElectronTools::EElIsoType isoType) const
103 {
104
105 Bool_t isocut = kFALSE;
106 switch (isoType) {
107 case ElectronTools::kTrackCalo:
108 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
109 (ele->CaloIsolation() < fCaloIsolationCut);
110 break;
111 case ElectronTools::kTrackJura:
112 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
113 (ele->EcalRecHitIsoDr03() < fEcalJuraIsoCut) &&
114 (ele->HcalTowerSumEtDr03() < fHcalIsolationCut);
115 break;
116 case ElectronTools::kTrackJuraCombined:
117 isocut = (ele->TrackIsolationDr03() + ele->EcalRecHitIsoDr03()
118 - 1.5 < fCombIsolationCut);
119 break;
120 case ElectronTools::kTrackJuraSliding:
121 {
122 Double_t totalIso = ele->TrackIsolationDr03() +
123 TMath::Max(ele->EcalRecHitIsoDr03() - 1.0, 0.0) +
124 ele->HcalTowerSumEtDr03();
125 if (totalIso < (ele->Pt()*0.10) )
126 isocut = kTRUE;
127
128 if (fReverseIsoCut == kTRUE &&
129 isocut == kFALSE && totalIso < 10)
130 isocut = kTRUE;
131 else if(fReverseIsoCut == kTRUE)
132 isocut = kFALSE;
133 }
134 break;
135 case ElectronTools::kVBTFWorkingPoint95Iso:
136 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint95Iso);
137 break;
138 case ElectronTools::kVBTFWorkingPoint90Iso:
139 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint90Iso);
140 break;
141 case ElectronTools::kVBTFWorkingPoint85Iso:
142 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint85Iso);
143 break;
144 case ElectronTools::kVBTFWorkingPoint80Iso:
145 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint80Iso);
146 break;
147 case ElectronTools::kVBTFWorkingPoint70Iso:
148 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint70Iso);
149 break;
150 case ElectronTools::kNoIso:
151 isocut = kTRUE;
152 break;
153 case ElectronTools::kCustomIso:
154 default:
155 break;
156 }
157
158 return isocut;
159 }
160
161
162 //--------------------------------------------------------------------------------------------------
163 void ElectronIDMod::Process()
164 {
165 // Process entries of the tree.
166
167 LoadEventObject(fElectronBranchName, fElectrons);
168
169 //get trigger object collection if trigger matching is enabled
170 const TriggerObjectCol *trigObjs = 0;
171 if (fApplyTriggerMatching) {
172 trigObjs = GetHLTObjects(fTrigObjectsName);
173 }
174
175 ElectronOArr *GoodElectrons = new ElectronOArr;
176 GoodElectrons->SetName(fGoodElectronsName);
177
178 for (UInt_t i=0; i<fElectrons->GetEntries(); ++i) {
179 const Electron *e = fElectrons->At(i);
180
181 if (e->Pt() < fElectronPtMin)
182 continue;
183
184 if (e->AbsEta() > fElectronEtaMax)
185 continue;
186
187 //apply trigger matching
188 Bool_t matchTrigger = fApplyTriggerMatching && ElectronTools::PassTriggerMatching(e,trigObjs);
189 if (fApplyTriggerMatching && !matchTrigger)
190 continue;
191
192 //apply ECAL spike removal
193 Bool_t spikecut = ElectronTools::PassSpikeRemovalFilter(e);
194 if (fApplySpikeRemoval && !spikecut)
195 continue;
196
197 //apply id cut
198 Bool_t idcut = PassIDCut(e, fElIdType);
199 if (!idcut)
200 continue;
201
202 //apply Isolation Cut
203 Bool_t isocut = PassIsolationCut(e, fElIsoType);
204 if (!isocut)
205 continue;
206
207 // apply conversion filters
208 Bool_t passConvVetoType1 = kFALSE;
209 if (fApplyConvFilterType1) {
210 LoadEventObject(fConversionBranchName, fConversions);
211 passConvVetoType1 = ElectronTools::PassConversionFilter(e, fConversions,
212 fWrongHitsRequirement);
213 }
214 else {
215 passConvVetoType1 = kTRUE;
216 }
217
218 if (passConvVetoType1 == kFALSE) continue;
219
220 Bool_t passConvVetoType2 = kFALSE;
221 if (fApplyConvFilterType2) {
222 passConvVetoType2 = TMath::Abs(e->ConvPartnerDCotTheta()) >= 0.02 ||
223 TMath::Abs(e->ConvPartnerDist()) >= 0.02;
224 }
225 else {
226 passConvVetoType2 = kTRUE;
227 }
228
229 if (passConvVetoType2 == kFALSE) continue;
230
231 // apply NExpectedHitsInner Cut
232 if(fNExpectedHitsInnerCut < 999 &&
233 e->BestTrk()->NExpectedHitsInner() > fNExpectedHitsInnerCut) continue;
234
235 // apply d0 cut
236 if (fApplyD0Cut) {
237 LoadEventObject(fVertexName, fVertices);
238 Bool_t passD0cut = ElectronTools::PassD0Cut(e, fVertices, fD0Cut, fReverseD0Cut);
239 if (!passD0cut)
240 continue;
241 }
242
243 // apply charge filter
244 if(fChargeFilter == kTRUE) {
245 Bool_t passChargeFilter = ElectronTools::PassChargeFilter(e);
246 if (!passChargeFilter) continue;
247 }
248
249 // apply full combined id, using Tight cuts
250 if(fCombinedIdCut == kTRUE) {
251 LoadEventObject(fVertexName, fVertices);
252 LoadEventObject(fConversionBranchName, fConversions);
253 Int_t result = ElectronTools::PassTightId(e, *&fVertices, fConversions, 2);
254 if(result != 15) continue;
255 }
256
257 // add good electron
258 GoodElectrons->Add(e);
259 }
260
261 // sort according to pt
262 GoodElectrons->Sort();
263
264 // add to event for other modules to use
265 AddObjThisEvt(GoodElectrons);
266 }
267
268 //--------------------------------------------------------------------------------------------------
269 void ElectronIDMod::SlaveBegin()
270 {
271 // Run startup code on the computer (slave) doing the actual analysis. Here,
272 // we just request the electron collection branch.
273
274 ReqEventObject(fElectronBranchName, fElectrons, kTRUE);
275
276 if(fCombinedIdCut == kTRUE) {
277 fElectronIDType = "NoId";
278 fElectronIsoType = "NoIso";
279 fApplyConvFilterType1 = kFALSE;
280 fApplyConvFilterType2 = kFALSE;
281 fApplyD0Cut = kFALSE;
282 }
283
284 if (fApplyConvFilterType1 || fCombinedIdCut == kTRUE)
285 ReqEventObject(fConversionBranchName, fConversions, kTRUE);
286
287 if (fApplyD0Cut || fCombinedIdCut == kTRUE)
288 ReqEventObject(fVertexName, fVertices, kTRUE);
289
290 Setup();
291 }
292
293 //--------------------------------------------------------------------------------------------------
294 void ElectronIDMod::Setup()
295 {
296 // Set all options properly before execution.
297
298 if (fElectronIDType.CompareTo("Tight") == 0)
299 fElIdType = ElectronTools::kTight;
300 else if (fElectronIDType.CompareTo("Loose") == 0)
301 fElIdType = ElectronTools::kLoose;
302 else if (fElectronIDType.CompareTo("Likelihood") == 0)
303 fElIdType = ElectronTools::kLikelihood;
304 else if (fElectronIDType.CompareTo("NoId") == 0)
305 fElIdType = ElectronTools::kNoId;
306 else if (fElectronIDType.CompareTo("ZeeId") == 0)
307 fElIdType = ElectronTools::kZeeId;
308 else if (fElectronIDType.CompareTo("CustomLoose") == 0)
309 fElIdType = ElectronTools::kCustomIdLoose;
310 else if (fElectronIDType.CompareTo("CustomTight") == 0)
311 fElIdType = ElectronTools::kCustomIdTight;
312 else if (fElectronIDType.CompareTo("VBTFWorkingPoint95Id") == 0)
313 fElIdType = ElectronTools::kVBTFWorkingPoint95Id;
314 else if (fElectronIDType.CompareTo("VBTFWorkingPoint90Id") == 0)
315 fElIdType = ElectronTools::kVBTFWorkingPoint90Id;
316 else if (fElectronIDType.CompareTo("VBTFWorkingPoint80Id") == 0)
317 fElIdType = ElectronTools::kVBTFWorkingPoint80Id;
318 else if (fElectronIDType.CompareTo("VBTFWorkingPoint85Id") == 0)
319 fElIdType = ElectronTools::kVBTFWorkingPoint85Id;
320 else if (fElectronIDType.CompareTo("VBTFWorkingPoint70Id") == 0)
321 fElIdType = ElectronTools::kVBTFWorkingPoint70Id;
322
323 else {
324 SendError(kAbortAnalysis, "SlaveBegin",
325 "The specified electron identification %s is not defined.",
326 fElectronIDType.Data());
327 return;
328 }
329
330 if (fElectronIsoType.CompareTo("TrackCalo") == 0 )
331 fElIsoType = ElectronTools::kTrackCalo;
332 else if (fElectronIsoType.CompareTo("TrackJura") == 0)
333 fElIsoType = ElectronTools::kTrackJura;
334 else if(fElectronIsoType.CompareTo("TrackJuraCombined") == 0)
335 fElIsoType = ElectronTools::kTrackJuraCombined;
336 else if(fElectronIsoType.CompareTo("TrackJuraSliding") == 0)
337 fElIsoType = ElectronTools::kTrackJuraSliding;
338 else if (fElectronIsoType.CompareTo("NoIso") == 0 )
339 fElIsoType = ElectronTools::kNoIso;
340 else if (fElectronIsoType.CompareTo("ZeeIso") == 0 )
341 fElIsoType = ElectronTools::kZeeIso;
342 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint95Iso") == 0 )
343 fElIsoType = ElectronTools::kVBTFWorkingPoint95Iso;
344 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint90Iso") == 0 )
345 fElIsoType = ElectronTools::kVBTFWorkingPoint90Iso;
346 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint85Iso") == 0 )
347 fElIsoType = ElectronTools::kVBTFWorkingPoint85Iso;
348 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint80Iso") == 0 )
349 fElIsoType = ElectronTools::kVBTFWorkingPoint80Iso;
350 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint70Iso") == 0 )
351 fElIsoType = ElectronTools::kVBTFWorkingPoint70Iso;
352 else if (fElectronIsoType.CompareTo("Custom") == 0 ) {
353 fElIsoType = ElectronTools::kCustomIso;
354 SendError(kWarning, "SlaveBegin",
355 "Custom electron isolation is not yet implemented.");
356 } else {
357 SendError(kAbortAnalysis, "SlaveBegin",
358 "The specified electron isolation %s is not defined.",
359 fElectronIsoType.Data());
360 return;
361 }
362
363
364 }
365
366