ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.67
Committed: Sat Oct 9 20:15:33 2010 UTC (14 years, 7 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_015
Changes since 1.66: +21 -6 lines
Log Message:
Extra electron id options to synchronize with vbtf selection

File Contents

# User Rev Content
1 bendavid 1.67 // $Id: ElectronIDMod.cc,v 1.66 2010/08/19 14:37:17 ceballos Exp $
2 loizides 1.1
3     #include "MitPhysics/Mods/interface/ElectronIDMod.h"
4 loizides 1.26 #include "MitAna/DataTree/interface/StableData.h"
5     #include "MitAna/DataTree/interface/ElectronCol.h"
6     #include "MitAna/DataTree/interface/VertexCol.h"
7 bendavid 1.62 #include "MitAna/DataTree/interface/TriggerObjectCol.h"
8 loizides 1.26 #include "MitAna/DataTree/interface/DecayParticleCol.h"
9 loizides 1.5 #include "MitPhysics/Init/interface/ModNames.h"
10 loizides 1.1
11     using namespace mithep;
12    
13     ClassImp(mithep::ElectronIDMod)
14    
15     //--------------------------------------------------------------------------------------------------
16 loizides 1.5 ElectronIDMod::ElectronIDMod(const char *name, const char *title) :
17 loizides 1.1 BaseMod(name,title),
18 loizides 1.5 fElectronBranchName(Names::gkElectronBrn),
19 ceballos 1.12 fConversionBranchName(Names::gkMvfConversionBrn),
20 loizides 1.5 fGoodElectronsName(ModNames::gkGoodElectronsName),
21 ceballos 1.54 fVertexName(string("PrimaryVertexes").c_str()),
22 ceballos 1.31 fElectronIDType("CustomTight"),
23 ceballos 1.8 fElectronIsoType("TrackJuraSliding"),
24 bendavid 1.62 fTrigObjectsName("HLTModTrigObjs"),
25 loizides 1.1 fElectronPtMin(10),
26 bendavid 1.67 fElectronEtMin(0.0),
27 ceballos 1.64 fElectronEtaMax(2.5),
28 loizides 1.1 fIDLikelihoodCut(0.9),
29     fTrackIsolationCut(5.0),
30     fCaloIsolationCut(5.0),
31 loizides 1.5 fEcalJuraIsoCut(5.0),
32     fHcalIsolationCut(5.0),
33 ceballos 1.49 fCombIsolationCut(5.0),
34 ceballos 1.60 fApplyConvFilterType1(kTRUE),
35     fApplyConvFilterType2(kFALSE),
36 bendavid 1.38 fWrongHitsRequirement(kTRUE),
37 ceballos 1.60 fNExpectedHitsInnerCut(999),
38 ceballos 1.59 fCombinedIdCut(kFALSE),
39 sixie 1.58 fApplySpikeRemoval(kTRUE),
40 ceballos 1.18 fApplyD0Cut(kTRUE),
41 ceballos 1.45 fChargeFilter(kTRUE),
42 ceballos 1.60 fD0Cut(0.020),
43 loizides 1.25 fReverseIsoCut(kFALSE),
44     fReverseD0Cut(kFALSE),
45 bendavid 1.62 fApplyTriggerMatching(kFALSE),
46 bendavid 1.67 fApplyEcalSeeded(kFALSE),
47     fApplyCombinedIso(kTRUE),
48     fApplyEcalFiducial(kFALSE),
49 sixie 1.56 fElIdType(ElectronTools::kIdUndef),
50     fElIsoType(ElectronTools::kIsoUndef),
51 loizides 1.14 fElectrons(0),
52     fConversions(0),
53 loizides 1.25 fVertices(0)
54 loizides 1.1 {
55     // Constructor.
56     }
57    
58     //--------------------------------------------------------------------------------------------------
59 sixie 1.56 Bool_t ElectronIDMod::PassIDCut(const Electron *ele, ElectronTools::EElIdType idType) const
60 sixie 1.42 {
61    
62     Bool_t idcut = kFALSE;
63     switch (idType) {
64 sixie 1.56 case ElectronTools::kTight:
65 sixie 1.42 idcut = ele->PassTightID();
66     break;
67 sixie 1.56 case ElectronTools::kLoose:
68 sixie 1.42 idcut = ele->PassLooseID();
69     break;
70 sixie 1.56 case ElectronTools::kLikelihood:
71 sixie 1.42 idcut = (ele->IDLikelihood() > fIDLikelihoodCut);
72     break;
73 sixie 1.56 case ElectronTools::kNoId:
74 sixie 1.42 idcut = kTRUE;
75     break;
76 sixie 1.56 case ElectronTools::kCustomIdLoose:
77     idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdLoose);
78 sixie 1.42 break;
79 sixie 1.56 case ElectronTools::kCustomIdTight:
80     idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdTight);
81 sixie 1.42 break;
82 sixie 1.56 case ElectronTools::kVBTFWorkingPoint95Id:
83     idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint95Id);
84 ceballos 1.54 break;
85 sixie 1.56 case ElectronTools::kVBTFWorkingPoint90Id:
86     idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint90Id);
87 ceballos 1.54 break;
88 ceballos 1.60 case ElectronTools::kVBTFWorkingPoint85Id:
89     idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint85Id);
90     break;
91 sixie 1.56 case ElectronTools::kVBTFWorkingPoint80Id:
92     idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint80Id);
93     break;
94     case ElectronTools::kVBTFWorkingPoint70Id:
95     idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint70Id);
96 ceballos 1.54 break;
97 sixie 1.42 default:
98     break;
99     }
100    
101     return idcut;
102     }
103    
104    
105     //--------------------------------------------------------------------------------------------------
106 sixie 1.56 Bool_t ElectronIDMod::PassIsolationCut(const Electron *ele, ElectronTools::EElIsoType isoType) const
107 sixie 1.42 {
108    
109     Bool_t isocut = kFALSE;
110     switch (isoType) {
111 sixie 1.56 case ElectronTools::kTrackCalo:
112 sixie 1.42 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
113     (ele->CaloIsolation() < fCaloIsolationCut);
114     break;
115 sixie 1.56 case ElectronTools::kTrackJura:
116 sixie 1.42 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
117 ceballos 1.60 (ele->EcalRecHitIsoDr03() < fEcalJuraIsoCut) &&
118     (ele->HcalTowerSumEtDr03() < fHcalIsolationCut);
119 sixie 1.42 break;
120 sixie 1.56 case ElectronTools::kTrackJuraCombined:
121 ceballos 1.60 isocut = (ele->TrackIsolationDr03() + ele->EcalRecHitIsoDr03()
122 ceballos 1.49 - 1.5 < fCombIsolationCut);
123     break;
124 sixie 1.56 case ElectronTools::kTrackJuraSliding:
125 sixie 1.42 {
126 ceballos 1.60 Double_t totalIso = ele->TrackIsolationDr03() +
127 ceballos 1.61 TMath::Max(ele->EcalRecHitIsoDr03() - 1.0, 0.0) +
128     ele->HcalTowerSumEtDr03();
129 ceballos 1.60 if (totalIso < (ele->Pt()*0.10) )
130 sixie 1.42 isocut = kTRUE;
131    
132     if (fReverseIsoCut == kTRUE &&
133     isocut == kFALSE && totalIso < 10)
134     isocut = kTRUE;
135     else if(fReverseIsoCut == kTRUE)
136     isocut = kFALSE;
137     }
138     break;
139 sixie 1.56 case ElectronTools::kVBTFWorkingPoint95Iso:
140 bendavid 1.67 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint95Iso, fApplyCombinedIso);
141 sixie 1.56 break;
142     case ElectronTools::kVBTFWorkingPoint90Iso:
143 bendavid 1.67 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint90Iso, fApplyCombinedIso);
144 sixie 1.51 break;
145 ceballos 1.60 case ElectronTools::kVBTFWorkingPoint85Iso:
146 bendavid 1.67 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint85Iso, fApplyCombinedIso);
147 ceballos 1.60 break;
148 sixie 1.56 case ElectronTools::kVBTFWorkingPoint80Iso:
149 bendavid 1.67 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint80Iso, fApplyCombinedIso);
150 sixie 1.51 break;
151 sixie 1.56 case ElectronTools::kVBTFWorkingPoint70Iso:
152 bendavid 1.67 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint70Iso, fApplyCombinedIso);
153 sixie 1.51 break;
154 sixie 1.56 case ElectronTools::kNoIso:
155 sixie 1.42 isocut = kTRUE;
156     break;
157 sixie 1.56 case ElectronTools::kCustomIso:
158 sixie 1.42 default:
159     break;
160     }
161    
162     return isocut;
163     }
164    
165    
166     //--------------------------------------------------------------------------------------------------
167 loizides 1.1 void ElectronIDMod::Process()
168     {
169     // Process entries of the tree.
170    
171 loizides 1.23 LoadEventObject(fElectronBranchName, fElectrons);
172 loizides 1.1
173 bendavid 1.62 //get trigger object collection if trigger matching is enabled
174     const TriggerObjectCol *trigObjs = 0;
175     if (fApplyTriggerMatching) {
176     trigObjs = GetHLTObjects(fTrigObjectsName);
177     }
178    
179 loizides 1.6 ElectronOArr *GoodElectrons = new ElectronOArr;
180     GoodElectrons->SetName(fGoodElectronsName);
181 loizides 1.1
182 ceballos 1.18 for (UInt_t i=0; i<fElectrons->GetEntries(); ++i) {
183 loizides 1.5 const Electron *e = fElectrons->At(i);
184 loizides 1.1
185 ceballos 1.66 if (e->SCluster() == 0)
186     continue;
187    
188 ceballos 1.65 if (e->Pt() < fElectronPtMin)
189 loizides 1.5 continue;
190 loizides 1.1
191 bendavid 1.67 if (e->SCluster()->Et() < fElectronEtMin)
192     continue;
193    
194 ceballos 1.65 if (e->AbsEta() > fElectronEtaMax)
195 ceballos 1.64 continue;
196    
197 bendavid 1.67 if (fApplyEcalFiducial && ( (e->SCluster()->AbsEta()>1.4442 && e->SCluster()->AbsEta()<1.5666) || e->SCluster()->AbsEta()>2.5 )) {
198     continue;
199     }
200    
201     if (fApplyEcalSeeded && !e->IsEcalDriven()) {
202     continue;
203     }
204    
205 bendavid 1.62 //apply trigger matching
206     Bool_t matchTrigger = fApplyTriggerMatching && ElectronTools::PassTriggerMatching(e,trigObjs);
207     if (fApplyTriggerMatching && !matchTrigger)
208     continue;
209    
210 sixie 1.55 //apply ECAL spike removal
211 sixie 1.56 Bool_t spikecut = ElectronTools::PassSpikeRemovalFilter(e);
212 sixie 1.57 if (fApplySpikeRemoval && !spikecut)
213 sixie 1.55 continue;
214    
215 sixie 1.42 //apply id cut
216     Bool_t idcut = PassIDCut(e, fElIdType);
217 loizides 1.5 if (!idcut)
218     continue;
219    
220 sixie 1.42 //apply Isolation Cut
221     Bool_t isocut = PassIsolationCut(e, fElIsoType);
222     if (!isocut)
223 loizides 1.5 continue;
224    
225 ceballos 1.60 // apply conversion filters
226     Bool_t passConvVetoType1 = kFALSE;
227     if (fApplyConvFilterType1) {
228 sixie 1.42 LoadEventObject(fConversionBranchName, fConversions);
229 ceballos 1.60 passConvVetoType1 = ElectronTools::PassConversionFilter(e, fConversions,
230 sixie 1.56 fWrongHitsRequirement);
231 ceballos 1.12 }
232 ceballos 1.60 else {
233     passConvVetoType1 = kTRUE;
234     }
235    
236     if (passConvVetoType1 == kFALSE) continue;
237    
238     Bool_t passConvVetoType2 = kFALSE;
239     if (fApplyConvFilterType2) {
240     passConvVetoType2 = TMath::Abs(e->ConvPartnerDCotTheta()) >= 0.02 ||
241     TMath::Abs(e->ConvPartnerDist()) >= 0.02;
242     }
243     else {
244     passConvVetoType2 = kTRUE;
245     }
246 sixie 1.42
247 ceballos 1.60 if (passConvVetoType2 == kFALSE) continue;
248    
249     // apply NExpectedHitsInner Cut
250     if(fNExpectedHitsInnerCut < 999 &&
251     e->BestTrk()->NExpectedHitsInner() > fNExpectedHitsInnerCut) continue;
252    
253 sixie 1.42 // apply d0 cut
254 ceballos 1.15 if (fApplyD0Cut) {
255 sixie 1.42 LoadEventObject(fVertexName, fVertices);
256 sixie 1.56 Bool_t passD0cut = ElectronTools::PassD0Cut(e, fVertices, fD0Cut, fReverseD0Cut);
257 sixie 1.42 if (!passD0cut)
258 ceballos 1.24 continue;
259 ceballos 1.12 }
260    
261 ceballos 1.59 // apply charge filter
262 sixie 1.42 if(fChargeFilter == kTRUE) {
263 sixie 1.56 Bool_t passChargeFilter = ElectronTools::PassChargeFilter(e);
264 sixie 1.42 if (!passChargeFilter) continue;
265 ceballos 1.45 }
266    
267 ceballos 1.63 // apply full combined id, using Tight cuts
268 ceballos 1.59 if(fCombinedIdCut == kTRUE) {
269     LoadEventObject(fVertexName, fVertices);
270     LoadEventObject(fConversionBranchName, fConversions);
271 ceballos 1.63 Int_t result = ElectronTools::PassTightId(e, *&fVertices, fConversions, 2);
272 ceballos 1.59 if(result != 15) continue;
273     }
274    
275 loizides 1.5 // add good electron
276 ceballos 1.12 GoodElectrons->Add(e);
277 loizides 1.5 }
278 loizides 1.1
279 loizides 1.9 // sort according to pt
280     GoodElectrons->Sort();
281    
282 loizides 1.5 // add to event for other modules to use
283 loizides 1.6 AddObjThisEvt(GoodElectrons);
284 loizides 1.1 }
285    
286     //--------------------------------------------------------------------------------------------------
287     void ElectronIDMod::SlaveBegin()
288     {
289     // Run startup code on the computer (slave) doing the actual analysis. Here,
290 loizides 1.5 // we just request the electron collection branch.
291 loizides 1.1
292 loizides 1.23 ReqEventObject(fElectronBranchName, fElectrons, kTRUE);
293 loizides 1.17
294 ceballos 1.59 if(fCombinedIdCut == kTRUE) {
295 ceballos 1.60 fElectronIDType = "NoId";
296     fElectronIsoType = "NoIso";
297     fApplyConvFilterType1 = kFALSE;
298     fApplyConvFilterType2 = kFALSE;
299     fApplyD0Cut = kFALSE;
300 ceballos 1.59 }
301    
302 ceballos 1.60 if (fApplyConvFilterType1 || fCombinedIdCut == kTRUE)
303 loizides 1.23 ReqEventObject(fConversionBranchName, fConversions, kTRUE);
304 loizides 1.17
305 ceballos 1.59 if (fApplyD0Cut || fCombinedIdCut == kTRUE)
306 loizides 1.23 ReqEventObject(fVertexName, fVertices, kTRUE);
307 loizides 1.1
308 sixie 1.42 Setup();
309     }
310    
311     //--------------------------------------------------------------------------------------------------
312     void ElectronIDMod::Setup()
313     {
314     // Set all options properly before execution.
315    
316 loizides 1.5 if (fElectronIDType.CompareTo("Tight") == 0)
317 sixie 1.56 fElIdType = ElectronTools::kTight;
318 loizides 1.5 else if (fElectronIDType.CompareTo("Loose") == 0)
319 sixie 1.56 fElIdType = ElectronTools::kLoose;
320 loizides 1.5 else if (fElectronIDType.CompareTo("Likelihood") == 0)
321 sixie 1.56 fElIdType = ElectronTools::kLikelihood;
322 loizides 1.10 else if (fElectronIDType.CompareTo("NoId") == 0)
323 sixie 1.56 fElIdType = ElectronTools::kNoId;
324 sixie 1.42 else if (fElectronIDType.CompareTo("ZeeId") == 0)
325 sixie 1.56 fElIdType = ElectronTools::kZeeId;
326 sixie 1.51 else if (fElectronIDType.CompareTo("CustomLoose") == 0)
327 sixie 1.56 fElIdType = ElectronTools::kCustomIdLoose;
328 sixie 1.51 else if (fElectronIDType.CompareTo("CustomTight") == 0)
329 sixie 1.56 fElIdType = ElectronTools::kCustomIdTight;
330 sixie 1.55 else if (fElectronIDType.CompareTo("VBTFWorkingPoint95Id") == 0)
331 sixie 1.56 fElIdType = ElectronTools::kVBTFWorkingPoint95Id;
332 sixie 1.51 else if (fElectronIDType.CompareTo("VBTFWorkingPoint90Id") == 0)
333 sixie 1.56 fElIdType = ElectronTools::kVBTFWorkingPoint90Id;
334 sixie 1.51 else if (fElectronIDType.CompareTo("VBTFWorkingPoint80Id") == 0)
335 sixie 1.56 fElIdType = ElectronTools::kVBTFWorkingPoint80Id;
336 ceballos 1.60 else if (fElectronIDType.CompareTo("VBTFWorkingPoint85Id") == 0)
337     fElIdType = ElectronTools::kVBTFWorkingPoint85Id;
338 sixie 1.51 else if (fElectronIDType.CompareTo("VBTFWorkingPoint70Id") == 0)
339 sixie 1.56 fElIdType = ElectronTools::kVBTFWorkingPoint70Id;
340 sixie 1.51
341 peveraer 1.29 else {
342 loizides 1.5 SendError(kAbortAnalysis, "SlaveBegin",
343     "The specified electron identification %s is not defined.",
344     fElectronIDType.Data());
345     return;
346     }
347 sixie 1.51
348 loizides 1.5 if (fElectronIsoType.CompareTo("TrackCalo") == 0 )
349 sixie 1.56 fElIsoType = ElectronTools::kTrackCalo;
350 loizides 1.5 else if (fElectronIsoType.CompareTo("TrackJura") == 0)
351 sixie 1.56 fElIsoType = ElectronTools::kTrackJura;
352 ceballos 1.49 else if(fElectronIsoType.CompareTo("TrackJuraCombined") == 0)
353 sixie 1.56 fElIsoType = ElectronTools::kTrackJuraCombined;
354 loizides 1.5 else if(fElectronIsoType.CompareTo("TrackJuraSliding") == 0)
355 sixie 1.56 fElIsoType = ElectronTools::kTrackJuraSliding;
356 loizides 1.5 else if (fElectronIsoType.CompareTo("NoIso") == 0 )
357 sixie 1.56 fElIsoType = ElectronTools::kNoIso;
358 sixie 1.42 else if (fElectronIsoType.CompareTo("ZeeIso") == 0 )
359 sixie 1.56 fElIsoType = ElectronTools::kZeeIso;
360 sixie 1.55 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint95Iso") == 0 )
361 sixie 1.56 fElIsoType = ElectronTools::kVBTFWorkingPoint95Iso;
362 sixie 1.51 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint90Iso") == 0 )
363 sixie 1.56 fElIsoType = ElectronTools::kVBTFWorkingPoint90Iso;
364 ceballos 1.60 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint85Iso") == 0 )
365     fElIsoType = ElectronTools::kVBTFWorkingPoint85Iso;
366 sixie 1.51 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint80Iso") == 0 )
367 sixie 1.56 fElIsoType = ElectronTools::kVBTFWorkingPoint80Iso;
368 sixie 1.51 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint70Iso") == 0 )
369 sixie 1.56 fElIsoType = ElectronTools::kVBTFWorkingPoint70Iso;
370 loizides 1.5 else if (fElectronIsoType.CompareTo("Custom") == 0 ) {
371 sixie 1.56 fElIsoType = ElectronTools::kCustomIso;
372 loizides 1.5 SendError(kWarning, "SlaveBegin",
373     "Custom electron isolation is not yet implemented.");
374     } else {
375     SendError(kAbortAnalysis, "SlaveBegin",
376     "The specified electron isolation %s is not defined.",
377     fElectronIsoType.Data());
378     return;
379     }
380 sixie 1.42
381 loizides 1.30
382     }
383 sixie 1.51
384