ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.97
Committed: Tue Jun 14 11:08:36 2011 UTC (13 years, 10 months ago) by fabstoec
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_023, Mit_022a, Mit_022
Changes since 1.96: +8 -5 lines
Log Message:
fixed CombIso default value

File Contents

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