ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.84
Committed: Tue Apr 5 06:37:07 2011 UTC (14 years, 1 month ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_020d, TMit_020d, Mit_020c, Mit_021pre1, Mit_020b
Changes since 1.83: +1 -6 lines
Log Message:
new

File Contents

# Content
1 // $Id: ElectronIDMod.cc,v 1.83 2011/04/05 04:57:48 ceballos Exp $
2
3 #include "MitPhysics/Mods/interface/ElectronIDMod.h"
4 #include "MitAna/DataTree/interface/StableData.h"
5 #include "MitAna/DataTree/interface/ElectronFwd.h"
6 #include "MitAna/DataTree/interface/MuonFwd.h"
7 #include "MitAna/DataTree/interface/VertexCol.h"
8 #include "MitAna/DataTree/interface/TriggerObjectCol.h"
9 #include "MitAna/DataTree/interface/DecayParticleCol.h"
10 #include "MitPhysics/Init/interface/ModNames.h"
11
12 using namespace mithep;
13
14 ClassImp(mithep::ElectronIDMod)
15
16 //--------------------------------------------------------------------------------------------------
17 ElectronIDMod::ElectronIDMod(const char *name, const char *title) :
18 BaseMod(name,title),
19 fElectronBranchName(Names::gkElectronBrn),
20 fConversionBranchName(Names::gkMvfConversionBrn),
21 fGoodElectronsName(ModNames::gkGoodElectronsName),
22 fNonIsolatedMuonsName("random"),
23 fNonIsolatedElectronsName("random"),
24 fVertexName(ModNames::gkGoodVertexesName),
25 fBeamSpotName(Names::gkBeamSpotBrn),
26 fTrackName(Names::gkTrackBrn),
27 fPFCandidatesName(Names::gkPFCandidatesBrn),
28 fElectronIDType("CustomTight"),
29 fElectronIsoType("TrackJuraSliding"),
30 fTrigObjectsName("HLTModTrigObjs"),
31 fElectronPtMin(10),
32 fElectronEtMin(0.0),
33 fElectronEtaMax(2.5),
34 fIDLikelihoodCut(0.75),
35 fTrackIsolationCut(5.0),
36 fCaloIsolationCut(5.0),
37 fEcalJuraIsoCut(5.0),
38 fHcalIsolationCut(5.0),
39 fCombIsolationCut(0.10),
40 fApplyConvFilterType1(kTRUE),
41 fApplyConvFilterType2(kFALSE),
42 fNWrongHitsMax(0),
43 fNExpectedHitsInnerCut(999),
44 fCombinedIdCut(kFALSE),
45 fApplySpikeRemoval(kTRUE),
46 fApplyD0Cut(kTRUE),
47 fApplyDZCut(kTRUE),
48 fChargeFilter(kTRUE),
49 fD0Cut(0.020),
50 fDZCut(0.20),
51 fWhichVertex(-1),
52 fApplyTriggerMatching(kFALSE),
53 fApplyEcalSeeded(kFALSE),
54 fApplyCombinedIso(kTRUE),
55 fApplyEcalFiducial(kFALSE),
56 fElectronsFromBranch(kTRUE),
57 fElIdType(ElectronTools::kIdUndef),
58 fElIsoType(ElectronTools::kIsoUndef),
59 fElectrons(0),
60 fConversions(0),
61 fVertices(0),
62 fBeamSpot(0),
63 fTracks(0),
64 fPFCandidates(0),
65 fNonIsolatedMuons(0),
66 fNonIsolatedElectrons(0),
67 fLH(0),
68 fPileupEnergyDensityName(Names::gkPileupEnergyDensityBrn),
69 fPileupEnergyDensity(0)
70 {
71 // Constructor.
72 }
73
74 //--------------------------------------------------------------------------------------------------
75 Bool_t ElectronIDMod::Likelihood(const Electron *ele) const
76 {
77 LikelihoodMeasurements measurements;
78 measurements.pt = ele->Pt();
79 measurements.subdet = (fabs(ele->Eta())<1.479) ? 0 : 1;
80 measurements.deltaPhi = TMath::Abs(ele->DeltaPhiSuperClusterTrackAtVtx());
81 measurements.deltaEta = TMath::Abs(ele->DeltaEtaSuperClusterTrackAtVtx());
82 measurements.eSeedClusterOverPout = ele->ESeedClusterOverPout();
83 measurements.eSuperClusterOverP = ele->ESuperClusterOverP();
84 measurements.hadronicOverEm = ele->HadronicOverEm();
85 measurements.sigmaIEtaIEta = ele->CoviEtaiEta();
86 measurements.sigmaIPhiIPhi = TMath::Sqrt(ele->SCluster()->Seed()->CoviPhiiPhi());
87 measurements.fBrem = ele->FBrem();
88 measurements.nBremClusters = ele->NumberOfClusters() - 1;
89 double likelihood = fLH->result(measurements);
90
91 if(likelihood > fIDLikelihoodCut) return kTRUE;
92 return kFALSE;
93 }
94
95 //--------------------------------------------------------------------------------------------------
96 Bool_t ElectronIDMod::PassIDCut(const Electron *ele, ElectronTools::EElIdType idType) const
97 {
98
99 Bool_t idcut = kFALSE;
100 switch (idType) {
101 case ElectronTools::kTight:
102 idcut = ele->PassTightID();
103 break;
104 case ElectronTools::kLoose:
105 idcut = ele->PassLooseID();
106 break;
107 case ElectronTools::kLikelihood:
108 idcut = Likelihood(ele);
109 break;
110 case ElectronTools::kNoId:
111 idcut = kTRUE;
112 break;
113 case ElectronTools::kCustomIdLoose:
114 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdLoose);
115 break;
116 case ElectronTools::kCustomIdTight:
117 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdTight);
118 break;
119 case ElectronTools::kVBTFWorkingPoint95Id:
120 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint95Id);
121 break;
122 case ElectronTools::kVBTFWorkingPoint90Id:
123 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint90Id);
124 break;
125 case ElectronTools::kVBTFWorkingPoint85Id:
126 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint85Id);
127 break;
128 case ElectronTools::kVBTFWorkingPoint80Id:
129 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint80Id);
130 break;
131 case ElectronTools::kVBTFWorkingPointLowPtId:
132 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPointLowPtId);
133 break;
134 case ElectronTools::kVBTFWorkingPoint70Id:
135 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint70Id);
136 break;
137 default:
138 break;
139 }
140
141 return idcut;
142 }
143
144 //--------------------------------------------------------------------------------------------------
145 Bool_t ElectronIDMod::PassIsolationCut(const Electron *ele, ElectronTools::EElIsoType isoType,
146 const TrackCol *tracks, const Vertex *vertex,
147 const Double_t rho) const
148 {
149
150 Bool_t isocut = kFALSE;
151 switch (isoType) {
152 case ElectronTools::kTrackCalo:
153 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
154 (ele->CaloIsolation() < fCaloIsolationCut);
155 break;
156 case ElectronTools::kTrackJura:
157 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
158 (ele->EcalRecHitIsoDr03() < fEcalJuraIsoCut) &&
159 (ele->HcalTowerSumEtDr03() < fHcalIsolationCut);
160 break;
161 case ElectronTools::kTrackJuraCombined:
162 isocut = (ele->TrackIsolationDr03() + ele->EcalRecHitIsoDr03()
163 - 1.5 < fCombIsolationCut);
164 break;
165 case ElectronTools::kTrackJuraSliding:
166 {
167 Double_t totalIso = ele->TrackIsolationDr03() + TMath::Max(ele->EcalRecHitIsoDr03() + ele->HcalTowerSumEtDr03() - rho * TMath::Pi() * 0.3 * 0.3, 0.0);
168 if(ele->SCluster()->AbsEta() < 1.479) totalIso = ele->TrackIsolationDr03() + TMath::Max(TMath::Max(ele->EcalRecHitIsoDr03() - 1.0, 0.0) + ele->HcalTowerSumEtDr03() - rho * TMath::Pi() * 0.3 * 0.3, 0.0);
169 if (totalIso < (ele->Pt()*fCombIsolationCut) )
170 isocut = kTRUE;
171 }
172 break;
173 case ElectronTools::kTrackJuraSlidingNoCorrection:
174 {
175 Double_t totalIso = ele->TrackIsolationDr03() + (ele->EcalRecHitIsoDr03() + ele->HcalTowerSumEtDr03());
176 if(ele->SCluster()->AbsEta() < 1.479) totalIso = ele->TrackIsolationDr03() + (TMath::Max(ele->EcalRecHitIsoDr03() - 1.0, 0.0) + ele->HcalTowerSumEtDr03());
177 if (totalIso < (ele->Pt()*fCombIsolationCut) )
178 isocut = kTRUE;
179 }
180 break;
181 case ElectronTools::kPFIso:
182 {
183 Double_t beta = IsolationTools::BetaE(tracks, ele, vertex, 0.0, 0.2, 0.3, 0.02);
184 if(beta == 0) beta = 1.0;
185 Double_t totalIso = IsolationTools::PFElectronIsolation(ele, fPFCandidates, vertex, 0.2, 0.5, 0.3, 0.02, 0, beta, fNonIsolatedMuons, fNonIsolatedElectrons);
186 if (totalIso < (ele->Pt()*fCombIsolationCut) )
187 isocut = kTRUE;
188 }
189 break;
190 case ElectronTools::kPFIsoNoL:
191 {
192 Double_t beta = IsolationTools::BetaE(tracks, ele, vertex, 0.0, 0.2, 0.3, 0.02);
193 if(beta == 0) beta = 1.0;
194 Double_t totalIso = IsolationTools::PFElectronIsolation(ele, fPFCandidates, vertex, 0.2, 0.5, 0.3, 0.02, 3, beta, fNonIsolatedMuons, fNonIsolatedElectrons);
195 if (totalIso < (ele->Pt()*fCombIsolationCut) )
196 isocut = kTRUE;
197 }
198 break;
199 case ElectronTools::kVBTFWorkingPoint95Iso:
200 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint95Iso, fApplyCombinedIso);
201 break;
202 case ElectronTools::kVBTFWorkingPoint90Iso:
203 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint90Iso, fApplyCombinedIso);
204 break;
205 case ElectronTools::kVBTFWorkingPoint85Iso:
206 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint85Iso, fApplyCombinedIso);
207 break;
208 case ElectronTools::kVBTFWorkingPoint80Iso:
209 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint80Iso, fApplyCombinedIso);
210 break;
211 case ElectronTools::kVBTFWorkingPoint70Iso:
212 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint70Iso, fApplyCombinedIso);
213 break;
214 case ElectronTools::kNoIso:
215 isocut = kTRUE;
216 break;
217 case ElectronTools::kCustomIso:
218 default:
219 break;
220 }
221
222 return isocut;
223 }
224
225
226 //--------------------------------------------------------------------------------------------------
227 void ElectronIDMod::Process()
228 {
229 // Process entries of the tree.
230
231 if(fElIsoType != ElectronTools::kPFIsoNoL) {
232 LoadEventObject(fElectronBranchName, fElectrons);
233 }
234 else {
235 fElectrons = GetObjThisEvt<ElectronOArr>(fElectronBranchName);
236 fNonIsolatedMuons = GetObjThisEvt<MuonCol>(fNonIsolatedMuonsName);
237 fNonIsolatedElectrons = GetObjThisEvt<ElectronCol>(fNonIsolatedElectronsName);
238 }
239 LoadEventObject(fBeamSpotName, fBeamSpot);
240 LoadEventObject(fTrackName, fTracks);
241 LoadEventObject(fPFCandidatesName, fPFCandidates);
242 if(fElIsoType == ElectronTools::kTrackJuraSliding) {
243 LoadEventObject(fPileupEnergyDensityName, fPileupEnergyDensity);
244 }
245 fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
246
247 //get trigger object collection if trigger matching is enabled
248 const TriggerObjectCol *trigObjs = 0;
249 if (fApplyTriggerMatching) {
250 trigObjs = GetHLTObjects(fTrigObjectsName);
251 }
252
253 ElectronOArr *GoodElectrons = new ElectronOArr;
254 GoodElectrons->SetName(fGoodElectronsName);
255
256 for (UInt_t i=0; i<fElectrons->GetEntries(); ++i) {
257 const Electron *e = fElectrons->At(i);
258
259 if (e->SCluster() == 0)
260 continue;
261
262 if (e->Pt() < fElectronPtMin)
263 continue;
264
265 if (e->SCluster()->Et() < fElectronEtMin)
266 continue;
267
268 if (e->AbsEta() > fElectronEtaMax)
269 continue;
270
271 if (fApplyEcalFiducial && ( (e->SCluster()->AbsEta()>1.4442 && e->SCluster()->AbsEta()<1.5666) || e->SCluster()->AbsEta()>2.5 )) {
272 continue;
273 }
274
275 if (fApplyEcalSeeded && !e->IsEcalDriven()) {
276 continue;
277 }
278
279 //apply trigger matching
280 Bool_t matchTrigger = fApplyTriggerMatching && ElectronTools::PassTriggerMatching(e,trigObjs);
281 if (fApplyTriggerMatching && !matchTrigger)
282 continue;
283
284 //apply ECAL spike removal
285 Bool_t spikecut = ElectronTools::PassSpikeRemovalFilter(e);
286 if (fApplySpikeRemoval && !spikecut)
287 continue;
288
289 //apply id cut
290 Bool_t idcut = PassIDCut(e, fElIdType);
291 if (!idcut)
292 continue;
293
294 //apply Isolation Cut
295 Double_t Rho = 0.0;
296 if(fElIsoType == ElectronTools::kTrackJuraSliding) {
297 Rho = fPileupEnergyDensity->At(0)->Rho();
298 }
299 Bool_t isocut = PassIsolationCut(e, fElIsoType, fTracks, fVertices->At(0), Rho);
300 if (!isocut)
301 continue;
302
303 // apply conversion filters
304 Bool_t passConvVetoType1 = kFALSE;
305 if (fApplyConvFilterType1) {
306 LoadEventObject(fConversionBranchName, fConversions);
307 passConvVetoType1 = ElectronTools::PassConversionFilter(e, fConversions,
308 fBeamSpot->At(0), 0, 1e-6, 2.0, kTRUE, kFALSE);
309 }
310 else {
311 passConvVetoType1 = kTRUE;
312 }
313
314 if (passConvVetoType1 == kFALSE) continue;
315
316 Bool_t passConvVetoType2 = kFALSE;
317 if (fApplyConvFilterType2) {
318 passConvVetoType2 = TMath::Abs(e->ConvPartnerDCotTheta()) >= 0.02 ||
319 TMath::Abs(e->ConvPartnerDist()) >= 0.02;
320 }
321 else {
322 passConvVetoType2 = kTRUE;
323 }
324
325 if (passConvVetoType2 == kFALSE) continue;
326
327 // apply NExpectedHitsInner Cut
328 if(fNExpectedHitsInnerCut < 999 &&
329 e->CorrectedNExpectedHitsInner() > fNExpectedHitsInnerCut) continue;
330
331 // apply d0 cut
332 if (fApplyD0Cut) {
333 Bool_t passD0cut = kTRUE;
334 if(fWhichVertex >= -1) passD0cut = ElectronTools::PassD0Cut(e, fVertices, fD0Cut, fWhichVertex);
335 else passD0cut = ElectronTools::PassD0Cut(e, fBeamSpot, fD0Cut);
336 if (!passD0cut)
337 continue;
338 }
339
340 // apply dz cut
341 if (fApplyDZCut) {
342 Bool_t passDZcut = ElectronTools::PassDZCut(e, fVertices, fDZCut, fWhichVertex);
343 if (!passDZcut)
344 continue;
345 }
346
347 // apply charge filter
348 if(fChargeFilter == kTRUE) {
349 Bool_t passChargeFilter = ElectronTools::PassChargeFilter(e);
350 if (!passChargeFilter) continue;
351 }
352
353 // apply full combined id, using Tight cuts
354 if(fCombinedIdCut == kTRUE) {
355 fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
356 LoadEventObject(fConversionBranchName, fConversions);
357 Int_t result = ElectronTools::PassTightId(e, *&fVertices, fConversions, 2);
358 if(result != 15) continue;
359 }
360
361 // add good electron
362 GoodElectrons->Add(e);
363 }
364
365 // sort according to pt
366 GoodElectrons->Sort();
367
368 // add to event for other modules to use
369 AddObjThisEvt(GoodElectrons);
370 }
371
372 //--------------------------------------------------------------------------------------------------
373 void ElectronIDMod::SlaveBegin()
374 {
375 // Run startup code on the computer (slave) doing the actual analysis. Here,
376 // we just request the electron collection branch.
377
378 // In this case we cannot have a branch
379 if (fElectronIsoType.CompareTo("PFIsoNoL") != 0 ) {
380 ReqEventObject(fElectronBranchName, fElectrons,fElectronsFromBranch);
381 }
382 ReqEventObject(fBeamSpotName, fBeamSpot, kTRUE);
383 ReqEventObject(fTrackName, fTracks, kTRUE);
384 ReqEventObject(fPFCandidatesName, fPFCandidates, kTRUE);
385 if (fElectronIsoType.CompareTo("TrackJuraSliding") == 0 ) {
386 ReqEventObject(fPileupEnergyDensityName, fPileupEnergyDensity, kTRUE);
387 }
388
389 if(fCombinedIdCut == kTRUE) {
390 fElectronIDType = "NoId";
391 fElectronIsoType = "NoIso";
392 fApplyConvFilterType1 = kFALSE;
393 fApplyConvFilterType2 = kFALSE;
394 fApplyD0Cut = kFALSE;
395 fApplyDZCut = kFALSE;
396 }
397
398 if (fApplyConvFilterType1 || fCombinedIdCut == kTRUE)
399 ReqEventObject(fConversionBranchName, fConversions, kTRUE);
400
401 Setup();
402 }
403
404 //--------------------------------------------------------------------------------------------------
405 void ElectronIDMod::Setup()
406 {
407 // Set all options properly before execution.
408
409 if (fElectronIDType.CompareTo("Tight") == 0)
410 fElIdType = ElectronTools::kTight;
411 else if (fElectronIDType.CompareTo("Loose") == 0)
412 fElIdType = ElectronTools::kLoose;
413 else if (fElectronIDType.CompareTo("Likelihood") == 0)
414 fElIdType = ElectronTools::kLikelihood;
415 else if (fElectronIDType.CompareTo("NoId") == 0)
416 fElIdType = ElectronTools::kNoId;
417 else if (fElectronIDType.CompareTo("ZeeId") == 0)
418 fElIdType = ElectronTools::kZeeId;
419 else if (fElectronIDType.CompareTo("CustomLoose") == 0)
420 fElIdType = ElectronTools::kCustomIdLoose;
421 else if (fElectronIDType.CompareTo("CustomTight") == 0)
422 fElIdType = ElectronTools::kCustomIdTight;
423 else if (fElectronIDType.CompareTo("VBTFWorkingPoint95Id") == 0)
424 fElIdType = ElectronTools::kVBTFWorkingPoint95Id;
425 else if (fElectronIDType.CompareTo("VBTFWorkingPoint90Id") == 0)
426 fElIdType = ElectronTools::kVBTFWorkingPoint90Id;
427 else if (fElectronIDType.CompareTo("VBTFWorkingPoint80Id") == 0)
428 fElIdType = ElectronTools::kVBTFWorkingPoint80Id;
429 else if (fElectronIDType.CompareTo("VBTFWorkingPointLowPtId") == 0)
430 fElIdType = ElectronTools::kVBTFWorkingPointLowPtId;
431 else if (fElectronIDType.CompareTo("VBTFWorkingPoint85Id") == 0)
432 fElIdType = ElectronTools::kVBTFWorkingPoint85Id;
433 else if (fElectronIDType.CompareTo("VBTFWorkingPoint70Id") == 0)
434 fElIdType = ElectronTools::kVBTFWorkingPoint70Id;
435
436 else {
437 SendError(kAbortAnalysis, "SlaveBegin",
438 "The specified electron identification %s is not defined.",
439 fElectronIDType.Data());
440 return;
441 }
442
443 if (fElectronIsoType.CompareTo("TrackCalo") == 0 )
444 fElIsoType = ElectronTools::kTrackCalo;
445 else if (fElectronIsoType.CompareTo("TrackJura") == 0)
446 fElIsoType = ElectronTools::kTrackJura;
447 else if(fElectronIsoType.CompareTo("TrackJuraCombined") == 0)
448 fElIsoType = ElectronTools::kTrackJuraCombined;
449 else if(fElectronIsoType.CompareTo("TrackJuraSliding") == 0)
450 fElIsoType = ElectronTools::kTrackJuraSliding;
451 else if(fElectronIsoType.CompareTo("TrackJuraSlidingNoCorrection") == 0)
452 fElIsoType = ElectronTools::kTrackJuraSlidingNoCorrection;
453 else if (fElectronIsoType.CompareTo("PFIso") == 0 )
454 fElIsoType = ElectronTools::kPFIso;
455 else if (fElectronIsoType.CompareTo("PFIsoNoL") == 0 )
456 fElIsoType = ElectronTools::kPFIsoNoL;
457 else if (fElectronIsoType.CompareTo("NoIso") == 0 )
458 fElIsoType = ElectronTools::kNoIso;
459 else if (fElectronIsoType.CompareTo("ZeeIso") == 0 )
460 fElIsoType = ElectronTools::kZeeIso;
461 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint95Iso") == 0 )
462 fElIsoType = ElectronTools::kVBTFWorkingPoint95Iso;
463 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint90Iso") == 0 )
464 fElIsoType = ElectronTools::kVBTFWorkingPoint90Iso;
465 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint85Iso") == 0 )
466 fElIsoType = ElectronTools::kVBTFWorkingPoint85Iso;
467 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint80Iso") == 0 )
468 fElIsoType = ElectronTools::kVBTFWorkingPoint80Iso;
469 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint70Iso") == 0 )
470 fElIsoType = ElectronTools::kVBTFWorkingPoint70Iso;
471 else if (fElectronIsoType.CompareTo("Custom") == 0 ) {
472 fElIsoType = ElectronTools::kCustomIso;
473 SendError(kWarning, "SlaveBegin",
474 "Custom electron isolation is not yet implemented.");
475 } else {
476 SendError(kAbortAnalysis, "SlaveBegin",
477 "The specified electron isolation %s is not defined.",
478 fElectronIsoType.Data());
479 return;
480 }
481
482
483 }
484
485 //--------------------------------------------------------------------------------------------------
486 void ElectronIDMod::Terminate()
487 {
488 // Run finishing code on the computer (slave) that did the analysis
489 }