ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.115
Committed: Tue Apr 24 11:45:53 2012 UTC (13 years ago) by fabstoec
Content type: text/plain
Branch: MAIN
Changes since 1.114: +17 -4 lines
Log Message:
added features for Hgg LeptonTag analysis

File Contents

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