ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.113
Committed: Wed Feb 8 16:57:20 2012 UTC (13 years, 2 months ago) by sixie
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_025d
Changes since 1.112: +2 -2 lines
Log Message:
add internal radius handling for embedded taus for the MVA

File Contents

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