ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.111
Committed: Wed Jan 4 16:31:00 2012 UTC (13 years, 4 months ago) by sixie
Content type: text/plain
Branch: MAIN
Changes since 1.110: +20 -11 lines
Log Message:
move mva evaluation to the end to save execution time

File Contents

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