ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.125
Committed: Mon May 21 08:01:39 2012 UTC (12 years, 11 months ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_028a
Changes since 1.124: +16 -20 lines
Log Message:
new fo

File Contents

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