ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.117
Committed: Sat Apr 28 07:11:16 2012 UTC (13 years ago) by ceballos
Content type: text/plain
Branch: MAIN
Changes since 1.116: +13 -13 lines
Log Message:
adding hww id

File Contents

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