ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.105
Committed: Sun Sep 25 18:14:03 2011 UTC (13 years, 7 months ago) by sixie
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_025pre2
Changes since 1.104: +6 -6 lines
Log Message:
update MVA to version trained using only even event numbers

File Contents

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