ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.108
Committed: Fri Oct 7 14:03:21 2011 UTC (13 years, 7 months ago) by sixie
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_025c, Mit_025b, Mit_025a, Mit_025
Changes since 1.107: +27 -27 lines
Log Message:
update electron mva. change naming scheme to make it easier on users

File Contents

# Content
1 // $Id: ElectronIDMod.cc,v 1.107 2011/10/03 19:57:58 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 (idType == ElectronTools::kMVA_BDTG_NoIPInfo) {
143 if (MVABin == 0) MVACut = 0.133;
144 if (MVABin == 1) MVACut = 0.465;
145 if (MVABin == 2) MVACut = 0.518;
146 if (MVABin == 3) MVACut = 0.942;
147 if (MVABin == 4) MVACut = 0.947;
148 if (MVABin == 5) MVACut = 0.878 ;
149 } else if (idType == ElectronTools::kMVA_BDTG_WithIPInfo) {
150 if (MVABin == 0) MVACut = 0.139;
151 if (MVABin == 1) MVACut = 0.525;
152 if (MVABin == 2) MVACut = 0.543;
153 if (MVABin == 3) MVACut = 0.947;
154 if (MVABin == 4) MVACut = 0.950;
155 if (MVABin == 5) MVACut = 0.884;
156 }
157
158 if (MVAValue > MVACut) return kTRUE;
159 return kFALSE;
160 }
161
162 //--------------------------------------------------------------------------------------------------
163 Bool_t ElectronIDMod::PassIDCut(const Electron *ele, ElectronTools::EElIdType idType,
164 const Vertex *vertex) const
165 {
166
167 Bool_t idcut = kFALSE;
168 switch (idType) {
169 case ElectronTools::kTight:
170 idcut = ele->PassTightID();
171 break;
172 case ElectronTools::kLoose:
173 idcut = ele->PassLooseID();
174 break;
175 case ElectronTools::kLikelihood:
176 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPointFakeableId) &&
177 PassLikelihoodID(ele);
178 break;
179 case ElectronTools::kNoId:
180 idcut = kTRUE;
181 break;
182 case ElectronTools::kCustomIdLoose:
183 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdLoose);
184 break;
185 case ElectronTools::kCustomIdTight:
186 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdTight);
187 break;
188 case ElectronTools::kVBTFWorkingPointFakeableId:
189 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPointFakeableId);
190 break;
191 case ElectronTools::kVBTFWorkingPoint95Id:
192 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint95Id);
193 break;
194 case ElectronTools::kVBTFWorkingPoint90Id:
195 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint90Id);
196 break;
197 case ElectronTools::kVBTFWorkingPoint85Id:
198 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint85Id);
199 break;
200 case ElectronTools::kVBTFWorkingPoint80Id:
201 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint80Id);
202 break;
203 case ElectronTools::kVBTFWorkingPointLowPtId:
204 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPointLowPtId);
205 break;
206 case ElectronTools::kVBTFWorkingPoint70Id:
207 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint70Id);
208 break;
209 case ElectronTools::kMVA_BDTG_NoIPInfo:
210 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPointFakeableId) &&
211 PassMVAID(ele, ElectronTools::kMVA_BDTG_NoIPInfo, vertex);
212 break;
213 case ElectronTools::kMVA_BDTG_WithIPInfo:
214 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPointFakeableId) &&
215 PassMVAID(ele, ElectronTools::kMVA_BDTG_WithIPInfo, vertex);
216 break;
217 default:
218 break;
219 }
220
221 return idcut;
222 }
223
224 //--------------------------------------------------------------------------------------------------
225 Bool_t ElectronIDMod::PassIsolationCut(const Electron *ele, ElectronTools::EElIsoType isoType,
226 const TrackCol *tracks, const Vertex *vertex,
227 const Double_t rho) const
228 {
229
230 Bool_t isocut = kFALSE;
231 switch (isoType) {
232 case ElectronTools::kTrackCalo:
233 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
234 (ele->CaloIsolation() < fCaloIsolationCut);
235 break;
236 case ElectronTools::kTrackJura:
237 isocut = (ele->TrackIsolationDr03() < ele->Pt()*fTrackIsolationCut) &&
238 (ele->EcalRecHitIsoDr03() < ele->Pt()*fEcalJuraIsoCut) &&
239 (ele->HcalTowerSumEtDr03() < ele->Pt()*fHcalIsolationCut);
240 break;
241 case ElectronTools::kTrackJuraCombined:
242 isocut = (ele->TrackIsolationDr03() + ele->EcalRecHitIsoDr03()
243 - 1.5 < fCombIsolationCut);
244 break;
245 case ElectronTools::kTrackJuraSliding:
246 {
247 Double_t totalIso = ele->TrackIsolationDr03() + TMath::Max(ele->EcalRecHitIsoDr03() + ele->HcalTowerSumEtDr03() - rho * TMath::Pi() * 0.3 * 0.3, 0.0);
248 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);
249 if (totalIso < (ele->Pt()*fCombIsolationCut) )
250 isocut = kTRUE;
251 }
252 break;
253 case ElectronTools::kTrackJuraSlidingNoCorrection:
254 {
255 Double_t totalIso = ele->TrackIsolationDr03() + (ele->EcalRecHitIsoDr03() + ele->HcalTowerSumEtDr03());
256 if(ele->SCluster()->AbsEta() < 1.479) totalIso = ele->TrackIsolationDr03() + (TMath::Max(ele->EcalRecHitIsoDr03() - 1.0, 0.0) + ele->HcalTowerSumEtDr03());
257 if (totalIso < (ele->Pt()*fCombIsolationCut) )
258 isocut = kTRUE;
259 }
260 break;
261 case ElectronTools::kCombinedRelativeConeAreaCorrected:
262 {
263 Double_t totalIso = ele->TrackIsolationDr03() + ele->EcalRecHitIsoDr03() + ele->HcalTowerSumEtDr03() - rho * TMath::Pi() * 0.3 * 0.3;
264 if (totalIso < (ele->Pt()*fCombRelativeIsolationCut) )
265 isocut = kTRUE;
266 }
267 break;
268 case ElectronTools::kPFIso:
269 {
270 Double_t pfIsoCutValue = 9999;
271 if(fPFIsolationCut > 0){
272 pfIsoCutValue = fPFIsolationCut;
273 } else {
274 if (ele->SCluster()->AbsEta() < 1.479) {
275 if (ele->Pt() > 20) {
276 pfIsoCutValue = 0.13;
277 } else {
278 pfIsoCutValue = 0.13;
279 }
280 } else {
281 if (ele->Pt() > 20) {
282 pfIsoCutValue = 0.09;
283 } else {
284 pfIsoCutValue = 0.09;
285 }
286 }
287 }
288 Double_t totalIso = IsolationTools::PFElectronIsolation(ele, fPFCandidates, vertex, 0.1, 1.0, 0.4, fIntRadius);
289 if (totalIso < (ele->Pt()*pfIsoCutValue) )
290 isocut = kTRUE;
291 }
292 break;
293 case ElectronTools::kPFIsoNoL:
294 {
295 Double_t beta = IsolationTools::BetaE(tracks, ele, vertex, 0.0, 0.2, 0.3, 0.02);
296 if(beta == 0) beta = 1.0;
297 Double_t totalIso = IsolationTools::PFElectronIsolation(ele, fPFCandidates, vertex, fNonIsolatedMuons, fNonIsolatedElectrons, 0.1, 1.0, 0.4, 0.0, 3, beta);
298 if (totalIso < (ele->Pt()*fPFIsolationCut) )
299 isocut = kTRUE;
300 }
301 break;
302 case ElectronTools::kVBTFWorkingPoint95Iso:
303 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint95Iso, fApplyCombinedIso);
304 break;
305 case ElectronTools::kVBTFWorkingPoint90Iso:
306 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint90Iso, fApplyCombinedIso);
307 break;
308 case ElectronTools::kVBTFWorkingPoint85Iso:
309 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint85Iso, fApplyCombinedIso);
310 break;
311 case ElectronTools::kVBTFWorkingPoint80Iso:
312 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint80Iso, fApplyCombinedIso);
313 break;
314 case ElectronTools::kVBTFWorkingPoint70Iso:
315 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint70Iso, fApplyCombinedIso);
316 break;
317 case ElectronTools::kNoIso:
318 isocut = kTRUE;
319 break;
320 case ElectronTools::kCustomIso:
321 default:
322 break;
323 }
324
325 return isocut;
326 }
327
328
329 //--------------------------------------------------------------------------------------------------
330 void ElectronIDMod::Process()
331 {
332 // Process entries of the tree.
333
334 if(fElIsoType != ElectronTools::kPFIsoNoL) {
335 LoadEventObject(fElectronBranchName, fElectrons);
336 }
337 else {
338 fElectrons = GetObjThisEvt<ElectronOArr>(fElectronBranchName);
339 fNonIsolatedMuons = GetObjThisEvt<MuonCol>(fNonIsolatedMuonsName);
340 fNonIsolatedElectrons = GetObjThisEvt<ElectronCol>(fNonIsolatedElectronsName);
341 }
342 LoadEventObject(fBeamSpotName, fBeamSpot);
343 LoadEventObject(fTrackName, fTracks);
344 LoadEventObject(fPFCandidatesName, fPFCandidates);
345 if(fElIsoType == ElectronTools::kTrackJuraSliding ||
346 fElIsoType == ElectronTools::kCombinedRelativeConeAreaCorrected) {
347 LoadEventObject(fPileupEnergyDensityName, fPileupEnergyDensity);
348 }
349 fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
350
351 //get trigger object collection if trigger matching is enabled
352 const TriggerObjectCol *trigObjs = 0;
353 if (fApplyTriggerMatching) {
354 trigObjs = GetHLTObjects(fTrigObjectsName);
355 }
356
357 ElectronOArr *GoodElectrons = new ElectronOArr;
358 GoodElectrons->SetName(fGoodElectronsName);
359
360 for (UInt_t i=0; i<fElectrons->GetEntries(); ++i) {
361 const Electron *e = fElectrons->At(i);
362
363 if (e->SCluster() == 0)
364 continue;
365
366 if (e->Pt() < fElectronPtMin)
367 continue;
368
369 if (e->SCluster()->Et() < fElectronEtMin)
370 continue;
371
372 if (e->AbsEta() > fElectronEtaMax)
373 continue;
374
375 if (fApplyEcalFiducial && ( (e->SCluster()->AbsEta()>1.4442 && e->SCluster()->AbsEta()<1.5666) || e->SCluster()->AbsEta()>2.5 )) {
376 continue;
377 }
378
379 if (fApplyEcalSeeded && !e->IsEcalDriven()) {
380 continue;
381 }
382
383 //apply trigger matching
384 Bool_t matchTrigger = fApplyTriggerMatching && ElectronTools::PassTriggerMatching(e,trigObjs);
385 if (fApplyTriggerMatching && !matchTrigger)
386 continue;
387
388 //apply ECAL spike removal
389 Bool_t spikecut = ElectronTools::PassSpikeRemovalFilter(e);
390 if (fApplySpikeRemoval && !spikecut)
391 continue;
392
393 //apply Isolation Cut
394 Double_t Rho = 0.0;
395 if( fElIsoType == ElectronTools::kTrackJuraSliding
396 || fElIsoType == ElectronTools::kCombinedRelativeConeAreaCorrected ) {
397 Rho = fPileupEnergyDensity->At(0)->Rho();
398 }
399 Bool_t isocut = PassIsolationCut(e, fElIsoType, fTracks, fVertices->At(0), Rho);
400 if (!isocut)
401 continue;
402
403 // apply conversion filters
404 Bool_t passConvVetoType1 = kFALSE;
405 if (fApplyConvFilterType1) {
406 LoadEventObject(fConversionBranchName, fConversions);
407 passConvVetoType1 = ElectronTools::PassConversionFilter(e, fConversions,
408 fBeamSpot->At(0), 0, 1e-6, 2.0, kTRUE, kFALSE);
409 }
410 else {
411 passConvVetoType1 = kTRUE;
412 }
413
414 if (passConvVetoType1 == kFALSE) continue;
415
416 Bool_t passConvVetoType2 = kFALSE;
417 if (fApplyConvFilterType2) {
418 passConvVetoType2 = TMath::Abs(e->ConvPartnerDCotTheta()) >= 0.02 ||
419 TMath::Abs(e->ConvPartnerDist()) >= 0.02;
420 }
421 else {
422 passConvVetoType2 = kTRUE;
423 }
424
425 if (passConvVetoType2 == kFALSE) continue;
426
427 // apply NExpectedHitsInner Cut
428 if(fInvertNExpectedHitsInnerCut == kFALSE && fNExpectedHitsInnerCut < 999 &&
429 e->CorrectedNExpectedHitsInner() > fNExpectedHitsInnerCut) continue;
430
431 // apply NExpectedHitsInner inverted Cut
432 if(fInvertNExpectedHitsInnerCut == kTRUE && fNExpectedHitsInnerCut < 999 &&
433 e->CorrectedNExpectedHitsInner() <= fNExpectedHitsInnerCut) continue;
434
435 // apply d0 cut
436 if (fApplyD0Cut) {
437 Bool_t passD0cut = kTRUE;
438 if(fWhichVertex >= -1) passD0cut = ElectronTools::PassD0Cut(e, fVertices, fD0Cut, fWhichVertex);
439 else passD0cut = ElectronTools::PassD0Cut(e, fBeamSpot, fD0Cut);
440 if (!passD0cut)
441 continue;
442 }
443
444 // apply dz cut
445 if (fApplyDZCut) {
446 Bool_t passDZcut = ElectronTools::PassDZCut(e, fVertices, fDZCut, fWhichVertex);
447 if (!passDZcut)
448 continue;
449 }
450
451 //apply id cut
452 Bool_t idcut = PassIDCut(e, fElIdType, fVertices->At(0));
453 if (!idcut)
454 continue;
455
456 // apply charge filter
457 if(fChargeFilter == kTRUE) {
458 Bool_t passChargeFilter = ElectronTools::PassChargeFilter(e);
459 if (!passChargeFilter) continue;
460 }
461
462 // apply full combined id, using Tight cuts
463 if(fCombinedIdCut == kTRUE) {
464 fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
465 LoadEventObject(fConversionBranchName, fConversions);
466 Int_t result = ElectronTools::PassTightId(e, *&fVertices, fConversions, 2);
467 if(result != 15) continue;
468 }
469
470 // add good electron
471 GoodElectrons->Add(e);
472 }
473
474 // sort according to pt
475 GoodElectrons->Sort();
476
477 // add to event for other modules to use
478 AddObjThisEvt(GoodElectrons);
479 }
480
481 //--------------------------------------------------------------------------------------------------
482 void ElectronIDMod::SlaveBegin()
483 {
484 // Run startup code on the computer (slave) doing the actual analysis. Here,
485 // we just request the electron collection branch.
486
487 // In this case we cannot have a branch
488 if (fElectronIsoType.CompareTo("PFIsoNoL") != 0 ) {
489 ReqEventObject(fElectronBranchName, fElectrons,fElectronsFromBranch);
490 }
491 ReqEventObject(fBeamSpotName, fBeamSpot, kTRUE);
492 ReqEventObject(fTrackName, fTracks, kTRUE);
493 ReqEventObject(fPFCandidatesName, fPFCandidates, kTRUE);
494 if (fElectronIsoType.CompareTo("TrackJuraSliding") == 0
495 || fElectronIsoType.CompareTo("CombinedRelativeConeAreaCorrected") == 0 ) {
496 ReqEventObject(fPileupEnergyDensityName, fPileupEnergyDensity, kTRUE);
497 }
498
499 if(fCombinedIdCut == kTRUE) {
500 fElectronIDType = "NoId";
501 fElectronIsoType = "NoIso";
502 fApplyConvFilterType1 = kFALSE;
503 fApplyConvFilterType2 = kFALSE;
504 fApplyD0Cut = kFALSE;
505 fApplyDZCut = kFALSE;
506 }
507
508 if (fApplyConvFilterType1 || fCombinedIdCut == kTRUE)
509 ReqEventObject(fConversionBranchName, fConversions, kTRUE);
510
511 Setup();
512
513 }
514
515 //--------------------------------------------------------------------------------------------------
516 void ElectronIDMod::Setup()
517 {
518 // Set all options properly before execution.
519
520 if (fElectronIDType.CompareTo("Tight") == 0)
521 fElIdType = ElectronTools::kTight;
522 else if (fElectronIDType.CompareTo("Loose") == 0)
523 fElIdType = ElectronTools::kLoose;
524 else if (fElectronIDType.CompareTo("Likelihood") == 0) {
525 if (!fLH) { cout << "Error: Likelihood not initialized.\n"; assert(0); }
526 fElIdType = ElectronTools::kLikelihood;
527 } else if (fElectronIDType.CompareTo("NoId") == 0)
528 fElIdType = ElectronTools::kNoId;
529 else if (fElectronIDType.CompareTo("ZeeId") == 0)
530 fElIdType = ElectronTools::kZeeId;
531 else if (fElectronIDType.CompareTo("CustomLoose") == 0)
532 fElIdType = ElectronTools::kCustomIdLoose;
533 else if (fElectronIDType.CompareTo("CustomTight") == 0)
534 fElIdType = ElectronTools::kCustomIdTight;
535 else if (fElectronIDType.CompareTo("VBTFWorkingPointFakeableId") == 0)
536 fElIdType = ElectronTools::kVBTFWorkingPointFakeableId;
537 else if (fElectronIDType.CompareTo("VBTFWorkingPoint95Id") == 0)
538 fElIdType = ElectronTools::kVBTFWorkingPoint95Id;
539 else if (fElectronIDType.CompareTo("VBTFWorkingPoint90Id") == 0)
540 fElIdType = ElectronTools::kVBTFWorkingPoint90Id;
541 else if (fElectronIDType.CompareTo("VBTFWorkingPoint80Id") == 0)
542 fElIdType = ElectronTools::kVBTFWorkingPoint80Id;
543 else if (fElectronIDType.CompareTo("VBTFWorkingPointLowPtId") == 0)
544 fElIdType = ElectronTools::kVBTFWorkingPointLowPtId;
545 else if (fElectronIDType.CompareTo("VBTFWorkingPoint85Id") == 0)
546 fElIdType = ElectronTools::kVBTFWorkingPoint85Id;
547 else if (fElectronIDType.CompareTo("VBTFWorkingPoint70Id") == 0)
548 fElIdType = ElectronTools::kVBTFWorkingPoint70Id;
549 else if (fElectronIDType.CompareTo("MVA_BDTG_NoIPInfo") == 0)
550 fElIdType = ElectronTools::kMVA_BDTG_NoIPInfo;
551 else if (fElectronIDType.CompareTo("MVA_BDTG_WithIPInfo") == 0)
552 fElIdType = ElectronTools::kMVA_BDTG_WithIPInfo;
553 else {
554 SendError(kAbortAnalysis, "SlaveBegin",
555 "The specified electron identification %s is not defined.",
556 fElectronIDType.Data());
557 return;
558 }
559
560 if (fElectronIsoType.CompareTo("TrackCalo") == 0 )
561 fElIsoType = ElectronTools::kTrackCalo;
562 else if (fElectronIsoType.CompareTo("TrackJura") == 0)
563 fElIsoType = ElectronTools::kTrackJura;
564 else if(fElectronIsoType.CompareTo("TrackJuraCombined") == 0)
565 fElIsoType = ElectronTools::kTrackJuraCombined;
566 else if(fElectronIsoType.CompareTo("TrackJuraSliding") == 0)
567 fElIsoType = ElectronTools::kTrackJuraSliding;
568 else if(fElectronIsoType.CompareTo("TrackJuraSlidingNoCorrection") == 0)
569 fElIsoType = ElectronTools::kTrackJuraSlidingNoCorrection;
570 else if(fElectronIsoType.CompareTo("CombinedRelativeConeAreaCorrected") == 0)
571 fElIsoType = ElectronTools::kCombinedRelativeConeAreaCorrected;
572 else if (fElectronIsoType.CompareTo("PFIso") == 0 )
573 fElIsoType = ElectronTools::kPFIso;
574 else if (fElectronIsoType.CompareTo("PFIsoNoL") == 0 )
575 fElIsoType = ElectronTools::kPFIsoNoL;
576 else if (fElectronIsoType.CompareTo("NoIso") == 0 )
577 fElIsoType = ElectronTools::kNoIso;
578 else if (fElectronIsoType.CompareTo("ZeeIso") == 0 )
579 fElIsoType = ElectronTools::kZeeIso;
580 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint95Iso") == 0 )
581 fElIsoType = ElectronTools::kVBTFWorkingPoint95Iso;
582 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint90Iso") == 0 )
583 fElIsoType = ElectronTools::kVBTFWorkingPoint90Iso;
584 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint85Iso") == 0 )
585 fElIsoType = ElectronTools::kVBTFWorkingPoint85Iso;
586 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint80Iso") == 0 )
587 fElIsoType = ElectronTools::kVBTFWorkingPoint80Iso;
588 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint70Iso") == 0 )
589 fElIsoType = ElectronTools::kVBTFWorkingPoint70Iso;
590 else if (fElectronIsoType.CompareTo("Custom") == 0 ) {
591 fElIsoType = ElectronTools::kCustomIso;
592 SendError(kWarning, "SlaveBegin",
593 "Custom electron isolation is not yet implemented.");
594 } else {
595 SendError(kAbortAnalysis, "SlaveBegin",
596 "The specified electron isolation %s is not defined.",
597 fElectronIsoType.Data());
598 return;
599 }
600
601
602 //If we use MVA ID, need to load MVA weights
603 if (fElIdType == ElectronTools::kMVA_BDTG_NoIPInfo) {
604 fElectronIDMVA = new ElectronIDMVA();
605 fElectronIDMVA->Initialize("BDTG method",
606 fElectronMVAWeights_Subdet0Pt10To20,
607 fElectronMVAWeights_Subdet1Pt10To20,
608 fElectronMVAWeights_Subdet2Pt10To20,
609 fElectronMVAWeights_Subdet0Pt20ToInf,
610 fElectronMVAWeights_Subdet1Pt20ToInf,
611 fElectronMVAWeights_Subdet2Pt20ToInf,
612 ElectronIDMVA::kNoIPInfo);
613 }
614 if (fElIdType == ElectronTools::kMVA_BDTG_WithIPInfo) {
615 fElectronIDMVA = new ElectronIDMVA();
616 fElectronIDMVA->Initialize("BDTG method",
617 fElectronMVAWeights_Subdet0Pt10To20,
618 fElectronMVAWeights_Subdet1Pt10To20,
619 fElectronMVAWeights_Subdet2Pt10To20,
620 fElectronMVAWeights_Subdet0Pt20ToInf,
621 fElectronMVAWeights_Subdet1Pt20ToInf,
622 fElectronMVAWeights_Subdet2Pt20ToInf,
623 ElectronIDMVA::kWithIPInfo);
624 }
625
626 }
627
628 //--------------------------------------------------------------------------------------------------
629 void ElectronIDMod::Terminate()
630 {
631 // Run finishing code on the computer (slave) that did the analysis
632 }