ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.112
Committed: Fri Jan 27 11:48:26 2012 UTC (13 years, 3 months ago) by sixie
Content type: text/plain
Branch: MAIN
Changes since 1.111: +18 -2 lines
Log Message:
add option flag to print out MVA debug information

File Contents

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