ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.58
Committed: Sat Apr 10 19:41:41 2010 UTC (15 years ago) by sixie
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_014pre2, Mit_014pre1, Mit_013d
Changes since 1.57: +2 -1 lines
Log Message:
add default to use spike removal

File Contents

# Content
1 // $Id: ElectronIDMod.cc,v 1.57 2010/04/10 19:38:45 sixie Exp $
2
3 #include "MitPhysics/Mods/interface/ElectronIDMod.h"
4 #include "MitAna/DataTree/interface/StableData.h"
5 #include "MitAna/DataTree/interface/ElectronCol.h"
6 #include "MitAna/DataTree/interface/VertexCol.h"
7 #include "MitAna/DataTree/interface/DecayParticleCol.h"
8 #include "MitPhysics/Init/interface/ModNames.h"
9
10 using namespace mithep;
11
12 ClassImp(mithep::ElectronIDMod)
13
14 //--------------------------------------------------------------------------------------------------
15 ElectronIDMod::ElectronIDMod(const char *name, const char *title) :
16 BaseMod(name,title),
17 fElectronBranchName(Names::gkElectronBrn),
18 fConversionBranchName(Names::gkMvfConversionBrn),
19 fGoodElectronsName(ModNames::gkGoodElectronsName),
20 fVertexName(string("PrimaryVertexes").c_str()),
21 fElectronIDType("CustomTight"),
22 fElectronIsoType("TrackJuraSliding"),
23 fElectronPtMin(10),
24 fIDLikelihoodCut(0.9),
25 fTrackIsolationCut(5.0),
26 fCaloIsolationCut(5.0),
27 fEcalJuraIsoCut(5.0),
28 fHcalIsolationCut(5.0),
29 fCombIsolationCut(5.0),
30 fApplyConvFilter(kTRUE),
31 fWrongHitsRequirement(kTRUE),
32 fApplySpikeRemoval(kTRUE),
33 fApplyD0Cut(kTRUE),
34 fChargeFilter(kTRUE),
35 fD0Cut(0.25),
36 fReverseIsoCut(kFALSE),
37 fReverseD0Cut(kFALSE),
38 fElIdType(ElectronTools::kIdUndef),
39 fElIsoType(ElectronTools::kIsoUndef),
40 fElectrons(0),
41 fConversions(0),
42 fVertices(0)
43 {
44 // Constructor.
45 }
46
47 //--------------------------------------------------------------------------------------------------
48 Bool_t ElectronIDMod::PassIDCut(const Electron *ele, ElectronTools::EElIdType idType) const
49 {
50
51 Bool_t idcut = kFALSE;
52 switch (idType) {
53 case ElectronTools::kTight:
54 idcut = ele->PassTightID();
55 break;
56 case ElectronTools::kLoose:
57 idcut = ele->PassLooseID();
58 break;
59 case ElectronTools::kLikelihood:
60 idcut = (ele->IDLikelihood() > fIDLikelihoodCut);
61 break;
62 case ElectronTools::kNoId:
63 idcut = kTRUE;
64 break;
65 case ElectronTools::kCustomIdLoose:
66 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdLoose);
67 break;
68 case ElectronTools::kCustomIdTight:
69 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdTight);
70 break;
71 case ElectronTools::kVBTFWorkingPoint95Id:
72 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint95Id);
73 break;
74 case ElectronTools::kVBTFWorkingPoint90Id:
75 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint90Id);
76 break;
77 case ElectronTools::kVBTFWorkingPoint80Id:
78 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint80Id);
79 break;
80 case ElectronTools::kVBTFWorkingPoint70Id:
81 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint70Id);
82 break;
83 default:
84 break;
85 }
86
87 return idcut;
88 }
89
90
91 //--------------------------------------------------------------------------------------------------
92 Bool_t ElectronIDMod::PassIsolationCut(const Electron *ele, ElectronTools::EElIsoType isoType) const
93 {
94
95 Bool_t isocut = kFALSE;
96 switch (isoType) {
97 case ElectronTools::kTrackCalo:
98 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
99 (ele->CaloIsolation() < fCaloIsolationCut);
100 break;
101 case ElectronTools::kTrackJura:
102 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
103 (ele->EcalRecHitIsoDr04() < fEcalJuraIsoCut) &&
104 (ele->HcalIsolation() < fHcalIsolationCut);
105 break;
106 case ElectronTools::kTrackJuraCombined:
107 isocut = (ele->TrackIsolationDr03() + ele->EcalRecHitIsoDr04()
108 - 1.5 < fCombIsolationCut);
109 break;
110 case ElectronTools::kTrackJuraSliding:
111 {
112 Double_t totalIso = ele->TrackIsolationDr03() + ele->EcalRecHitIsoDr04() - 1.5;
113 if (totalIso < (ele->Pt()-10.0)*4.5/20.0 ||
114 totalIso <= 0)
115 isocut = kTRUE;
116
117 if (fReverseIsoCut == kTRUE &&
118 isocut == kFALSE && totalIso < 10)
119 isocut = kTRUE;
120 else if(fReverseIsoCut == kTRUE)
121 isocut = kFALSE;
122 }
123 break;
124 case ElectronTools::kVBTFWorkingPoint95Iso:
125 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint95Iso);
126 break;
127 case ElectronTools::kVBTFWorkingPoint90Iso:
128 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint90Iso);
129 break;
130 case ElectronTools::kVBTFWorkingPoint80Iso:
131 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint80Iso);
132 break;
133 case ElectronTools::kVBTFWorkingPoint70Iso:
134 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint70Iso);
135 break;
136 case ElectronTools::kNoIso:
137 isocut = kTRUE;
138 break;
139 case ElectronTools::kCustomIso:
140 default:
141 break;
142 }
143
144 return isocut;
145 }
146
147
148 //--------------------------------------------------------------------------------------------------
149 void ElectronIDMod::Process()
150 {
151 // Process entries of the tree.
152
153 LoadEventObject(fElectronBranchName, fElectrons);
154
155 ElectronOArr *GoodElectrons = new ElectronOArr;
156 GoodElectrons->SetName(fGoodElectronsName);
157
158 for (UInt_t i=0; i<fElectrons->GetEntries(); ++i) {
159 const Electron *e = fElectrons->At(i);
160
161 if (e->Pt() <= fElectronPtMin)
162 continue;
163
164 //apply ECAL spike removal
165 Bool_t spikecut = ElectronTools::PassSpikeRemovalFilter(e);
166 if (fApplySpikeRemoval && !spikecut)
167 continue;
168
169 //apply id cut
170 Bool_t idcut = PassIDCut(e, fElIdType);
171 if (!idcut)
172 continue;
173
174 //apply Isolation Cut
175 Bool_t isocut = PassIsolationCut(e, fElIsoType);
176 if (!isocut)
177 continue;
178
179 // apply conversion filter
180 Bool_t passConvVeto = kFALSE;
181 if (fApplyConvFilter) {
182 LoadEventObject(fConversionBranchName, fConversions);
183 passConvVeto = ElectronTools::PassConversionFilter(e, fConversions,
184 fWrongHitsRequirement);
185 } else {
186 passConvVeto = kTRUE;
187 }
188 if (passConvVeto == kFALSE) continue;
189
190 // apply d0 cut
191 if (fApplyD0Cut) {
192 LoadEventObject(fVertexName, fVertices);
193 Bool_t passD0cut = ElectronTools::PassD0Cut(e, fVertices, fD0Cut, fReverseD0Cut);
194 if (!passD0cut)
195 continue;
196 }
197
198 //apply charge filter
199 if(fChargeFilter == kTRUE) {
200 Bool_t passChargeFilter = ElectronTools::PassChargeFilter(e);
201 if (!passChargeFilter) continue;
202 }
203
204 // add good electron
205 GoodElectrons->Add(e);
206 }
207
208 // sort according to pt
209 GoodElectrons->Sort();
210
211 // add to event for other modules to use
212 AddObjThisEvt(GoodElectrons);
213 }
214
215 //--------------------------------------------------------------------------------------------------
216 void ElectronIDMod::SlaveBegin()
217 {
218 // Run startup code on the computer (slave) doing the actual analysis. Here,
219 // we just request the electron collection branch.
220
221 ReqEventObject(fElectronBranchName, fElectrons, kTRUE);
222
223 if (fApplyConvFilter)
224 ReqEventObject(fConversionBranchName, fConversions, kTRUE);
225
226 if (fApplyD0Cut)
227 ReqEventObject(fVertexName, fVertices, kTRUE);
228
229 Setup();
230 }
231
232 //--------------------------------------------------------------------------------------------------
233 void ElectronIDMod::Setup()
234 {
235 // Set all options properly before execution.
236
237 if (fElectronIDType.CompareTo("Tight") == 0)
238 fElIdType = ElectronTools::kTight;
239 else if (fElectronIDType.CompareTo("Loose") == 0)
240 fElIdType = ElectronTools::kLoose;
241 else if (fElectronIDType.CompareTo("Likelihood") == 0)
242 fElIdType = ElectronTools::kLikelihood;
243 else if (fElectronIDType.CompareTo("NoId") == 0)
244 fElIdType = ElectronTools::kNoId;
245 else if (fElectronIDType.CompareTo("ZeeId") == 0)
246 fElIdType = ElectronTools::kZeeId;
247 else if (fElectronIDType.CompareTo("CustomLoose") == 0)
248 fElIdType = ElectronTools::kCustomIdLoose;
249 else if (fElectronIDType.CompareTo("CustomTight") == 0)
250 fElIdType = ElectronTools::kCustomIdTight;
251 else if (fElectronIDType.CompareTo("VBTFWorkingPoint95Id") == 0)
252 fElIdType = ElectronTools::kVBTFWorkingPoint95Id;
253 else if (fElectronIDType.CompareTo("VBTFWorkingPoint90Id") == 0)
254 fElIdType = ElectronTools::kVBTFWorkingPoint90Id;
255 else if (fElectronIDType.CompareTo("VBTFWorkingPoint80Id") == 0)
256 fElIdType = ElectronTools::kVBTFWorkingPoint80Id;
257 else if (fElectronIDType.CompareTo("VBTFWorkingPoint70Id") == 0)
258 fElIdType = ElectronTools::kVBTFWorkingPoint70Id;
259
260 else {
261 SendError(kAbortAnalysis, "SlaveBegin",
262 "The specified electron identification %s is not defined.",
263 fElectronIDType.Data());
264 return;
265 }
266
267 if (fElectronIsoType.CompareTo("TrackCalo") == 0 )
268 fElIsoType = ElectronTools::kTrackCalo;
269 else if (fElectronIsoType.CompareTo("TrackJura") == 0)
270 fElIsoType = ElectronTools::kTrackJura;
271 else if(fElectronIsoType.CompareTo("TrackJuraCombined") == 0)
272 fElIsoType = ElectronTools::kTrackJuraCombined;
273 else if(fElectronIsoType.CompareTo("TrackJuraSliding") == 0)
274 fElIsoType = ElectronTools::kTrackJuraSliding;
275 else if (fElectronIsoType.CompareTo("NoIso") == 0 )
276 fElIsoType = ElectronTools::kNoIso;
277 else if (fElectronIsoType.CompareTo("ZeeIso") == 0 )
278 fElIsoType = ElectronTools::kZeeIso;
279 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint95Iso") == 0 )
280 fElIsoType = ElectronTools::kVBTFWorkingPoint95Iso;
281 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint90Iso") == 0 )
282 fElIsoType = ElectronTools::kVBTFWorkingPoint90Iso;
283 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint80Iso") == 0 )
284 fElIsoType = ElectronTools::kVBTFWorkingPoint80Iso;
285 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint70Iso") == 0 )
286 fElIsoType = ElectronTools::kVBTFWorkingPoint70Iso;
287 else if (fElectronIsoType.CompareTo("Custom") == 0 ) {
288 fElIsoType = ElectronTools::kCustomIso;
289 SendError(kWarning, "SlaveBegin",
290 "Custom electron isolation is not yet implemented.");
291 } else {
292 SendError(kAbortAnalysis, "SlaveBegin",
293 "The specified electron isolation %s is not defined.",
294 fElectronIsoType.Data());
295 return;
296 }
297
298
299 }
300
301