ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.73
Committed: Fri Jan 21 09:26:06 2011 UTC (14 years, 3 months ago) by dkralph
Content type: text/plain
Branch: MAIN
Changes since 1.72: +4 -3 lines
Log Message:
Added option to read from published collection.

File Contents

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