ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/ElectronIDMod.cc
Revision: 1.80
Committed: Fri Mar 11 15:13:09 2011 UTC (14 years, 1 month ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_020pre1
Changes since 1.79: +29 -15 lines
Log Message:
new

File Contents

# Content
1 // $Id: ElectronIDMod.cc,v 1.79 2011/03/07 12:45:52 ceballos Exp $
2
3 #include "MitPhysics/Mods/interface/ElectronIDMod.h"
4 #include "MitAna/DataTree/interface/StableData.h"
5 #include "MitAna/DataTree/interface/ElectronFwd.h"
6 #include "MitAna/DataTree/interface/MuonFwd.h"
7 #include "MitAna/DataTree/interface/VertexCol.h"
8 #include "MitAna/DataTree/interface/TriggerObjectCol.h"
9 #include "MitAna/DataTree/interface/DecayParticleCol.h"
10 #include "MitPhysics/Init/interface/ModNames.h"
11
12 using namespace mithep;
13
14 ClassImp(mithep::ElectronIDMod)
15
16 //--------------------------------------------------------------------------------------------------
17 ElectronIDMod::ElectronIDMod(const char *name, const char *title) :
18 BaseMod(name,title),
19 fElectronBranchName(Names::gkElectronBrn),
20 fConversionBranchName(Names::gkMvfConversionBrn),
21 fGoodElectronsName(ModNames::gkGoodElectronsName),
22 fNonIsolatedMuonsName("random"),
23 fNonIsolatedElectronsName("random"),
24 fVertexName(ModNames::gkGoodVertexesName),
25 fBeamSpotName(Names::gkBeamSpotBrn),
26 fTrackName(Names::gkTrackBrn),
27 fPFCandidatesName(Names::gkPFCandidatesBrn),
28 fElectronIDType("CustomTight"),
29 fElectronIsoType("TrackJuraSliding"),
30 fTrigObjectsName("HLTModTrigObjs"),
31 fElectronPtMin(10),
32 fElectronEtMin(0.0),
33 fElectronEtaMax(2.5),
34 fIDLikelihoodCut(0.75),
35 fTrackIsolationCut(5.0),
36 fCaloIsolationCut(5.0),
37 fEcalJuraIsoCut(5.0),
38 fHcalIsolationCut(5.0),
39 fCombIsolationCut(0.10),
40 fApplyConvFilterType1(kTRUE),
41 fApplyConvFilterType2(kFALSE),
42 fNWrongHitsMax(1),
43 fNExpectedHitsInnerCut(999),
44 fCombinedIdCut(kFALSE),
45 fApplySpikeRemoval(kTRUE),
46 fApplyD0Cut(kTRUE),
47 fChargeFilter(kTRUE),
48 fD0Cut(0.020),
49 fApplyTriggerMatching(kFALSE),
50 fApplyEcalSeeded(kFALSE),
51 fApplyCombinedIso(kTRUE),
52 fApplyEcalFiducial(kFALSE),
53 fElectronsFromBranch(kTRUE),
54 fElIdType(ElectronTools::kIdUndef),
55 fElIsoType(ElectronTools::kIsoUndef),
56 fElectrons(0),
57 fConversions(0),
58 fVertices(0),
59 fBeamSpot(0),
60 fTracks(0),
61 fPFCandidates(0),
62 fNonIsolatedMuons(0),
63 fNonIsolatedElectrons(0),
64 fLH(0),
65 fPileupEnergyDensityName(Names::gkPileupEnergyDensityBrn),
66 fPileupEnergyDensity(0)
67 {
68 // Constructor.
69 }
70
71 //--------------------------------------------------------------------------------------------------
72 Bool_t ElectronIDMod::Likelihood(const Electron *ele) const
73 {
74 LikelihoodMeasurements measurements;
75 measurements.pt = ele->Pt();
76 measurements.subdet = (fabs(ele->Eta())<1.479) ? 0 : 1;
77 measurements.deltaPhi = TMath::Abs(ele->DeltaPhiSuperClusterTrackAtVtx());
78 measurements.deltaEta = TMath::Abs(ele->DeltaEtaSuperClusterTrackAtVtx());
79 measurements.eSeedClusterOverPout = ele->ESeedClusterOverPout();
80 measurements.eSuperClusterOverP = ele->ESuperClusterOverP();
81 measurements.hadronicOverEm = ele->HadronicOverEm();
82 measurements.sigmaIEtaIEta = ele->CoviEtaiEta();
83 measurements.sigmaIPhiIPhi = TMath::Sqrt(ele->SCluster()->Seed()->CoviPhiiPhi());
84 measurements.fBrem = ele->FBrem();
85 measurements.nBremClusters = ele->NumberOfClusters() - 1;
86 double likelihood = fLH->result(measurements);
87
88 if(likelihood > fIDLikelihoodCut) return kTRUE;
89 return kFALSE;
90 }
91
92 //--------------------------------------------------------------------------------------------------
93 Bool_t ElectronIDMod::PassIDCut(const Electron *ele, ElectronTools::EElIdType idType) const
94 {
95
96 Bool_t idcut = kFALSE;
97 switch (idType) {
98 case ElectronTools::kTight:
99 idcut = ele->PassTightID();
100 break;
101 case ElectronTools::kLoose:
102 idcut = ele->PassLooseID();
103 break;
104 case ElectronTools::kLikelihood:
105 idcut = Likelihood(ele);
106 break;
107 case ElectronTools::kNoId:
108 idcut = kTRUE;
109 break;
110 case ElectronTools::kCustomIdLoose:
111 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdLoose);
112 break;
113 case ElectronTools::kCustomIdTight:
114 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kCustomIdTight);
115 break;
116 case ElectronTools::kVBTFWorkingPoint95Id:
117 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint95Id);
118 break;
119 case ElectronTools::kVBTFWorkingPoint90Id:
120 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint90Id);
121 break;
122 case ElectronTools::kVBTFWorkingPoint85Id:
123 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint85Id);
124 break;
125 case ElectronTools::kVBTFWorkingPoint80Id:
126 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint80Id);
127 break;
128 case ElectronTools::kVBTFWorkingPoint70Id:
129 idcut = ElectronTools::PassCustomID(ele, ElectronTools::kVBTFWorkingPoint70Id);
130 break;
131 default:
132 break;
133 }
134
135 return idcut;
136 }
137
138 //--------------------------------------------------------------------------------------------------
139 Bool_t ElectronIDMod::PassIsolationCut(const Electron *ele, ElectronTools::EElIsoType isoType,
140 const TrackCol *tracks, const Vertex *vertex,
141 const Double_t rho) const
142 {
143
144 Bool_t isocut = kFALSE;
145 switch (isoType) {
146 case ElectronTools::kTrackCalo:
147 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
148 (ele->CaloIsolation() < fCaloIsolationCut);
149 break;
150 case ElectronTools::kTrackJura:
151 isocut = (ele->TrackIsolationDr03() < fTrackIsolationCut) &&
152 (ele->EcalRecHitIsoDr03() < fEcalJuraIsoCut) &&
153 (ele->HcalTowerSumEtDr03() < fHcalIsolationCut);
154 break;
155 case ElectronTools::kTrackJuraCombined:
156 isocut = (ele->TrackIsolationDr03() + ele->EcalRecHitIsoDr03()
157 - 1.5 < fCombIsolationCut);
158 break;
159 case ElectronTools::kTrackJuraSliding:
160 {
161 //Double_t beta = IsolationTools::BetaE(tracks, ele, vertex, 0.0, 0.2, 0.3, 0.02);
162 //if(beta == 0) beta = 1.0;
163 //Double_t totalIso = ele->TrackIsolationDr03() + (ele->EcalRecHitIsoDr03() + ele->HcalTowerSumEtDr03())*beta;
164 //if(ele->SCluster()->AbsEta() < 1.479) totalIso = ele->TrackIsolationDr03() + (TMath::Max(ele->EcalRecHitIsoDr03() - 1.0, 0.0) + ele->HcalTowerSumEtDr03())*beta;
165 //if(beta == 0) beta = 1.0;
166 Double_t totalIso = ele->TrackIsolationDr03() + TMath::Max(ele->EcalRecHitIsoDr03() + ele->HcalTowerSumEtDr03() - rho * TMath::Pi() * 0.3 * 0.3, 0.0);
167 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);
168 if (totalIso < (ele->Pt()*fCombIsolationCut) )
169 isocut = kTRUE;
170 }
171 break;
172 case ElectronTools::kTrackJuraSlidingNoCorrection:
173 {
174 Double_t totalIso = ele->TrackIsolationDr03() + (ele->EcalRecHitIsoDr03() + ele->HcalTowerSumEtDr03());
175 if(ele->SCluster()->AbsEta() < 1.479) totalIso = ele->TrackIsolationDr03() + (TMath::Max(ele->EcalRecHitIsoDr03() - 1.0, 0.0) + ele->HcalTowerSumEtDr03());
176 if (totalIso < (ele->Pt()*fCombIsolationCut) )
177 isocut = kTRUE;
178 }
179 break;
180 case ElectronTools::kPFIso:
181 {
182 Double_t beta = IsolationTools::BetaE(tracks, ele, vertex, 0.0, 0.2, 0.3, 0.02);
183 if(beta == 0) beta = 1.0;
184 Double_t totalIso = IsolationTools::PFElectronIsolation(ele, fPFCandidates, vertex, 0.2, 0.5, 0.3, 0.02, 0, beta, fNonIsolatedMuons, fNonIsolatedElectrons);
185 if (totalIso < (ele->Pt()*fCombIsolationCut) )
186 isocut = kTRUE;
187 }
188 break;
189 case ElectronTools::kPFIsoNoL:
190 {
191 Double_t beta = IsolationTools::BetaE(tracks, ele, vertex, 0.0, 0.2, 0.3, 0.02);
192 if(beta == 0) beta = 1.0;
193 Double_t totalIso = IsolationTools::PFElectronIsolation(ele, fPFCandidates, vertex, 0.2, 0.5, 0.3, 0.02, 3, beta, fNonIsolatedMuons, fNonIsolatedElectrons);
194 if (totalIso < (ele->Pt()*fCombIsolationCut) )
195 isocut = kTRUE;
196 }
197 break;
198 case ElectronTools::kVBTFWorkingPoint95Iso:
199 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint95Iso, fApplyCombinedIso);
200 break;
201 case ElectronTools::kVBTFWorkingPoint90Iso:
202 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint90Iso, fApplyCombinedIso);
203 break;
204 case ElectronTools::kVBTFWorkingPoint85Iso:
205 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint85Iso, fApplyCombinedIso);
206 break;
207 case ElectronTools::kVBTFWorkingPoint80Iso:
208 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint80Iso, fApplyCombinedIso);
209 break;
210 case ElectronTools::kVBTFWorkingPoint70Iso:
211 isocut = ElectronTools::PassCustomIso(ele, ElectronTools::kVBTFWorkingPoint70Iso, fApplyCombinedIso);
212 break;
213 case ElectronTools::kNoIso:
214 isocut = kTRUE;
215 break;
216 case ElectronTools::kCustomIso:
217 default:
218 break;
219 }
220
221 return isocut;
222 }
223
224
225 //--------------------------------------------------------------------------------------------------
226 void ElectronIDMod::Process()
227 {
228 // Process entries of the tree.
229
230 if(fElIsoType != ElectronTools::kPFIsoNoL) {
231 LoadEventObject(fElectronBranchName, fElectrons);
232 }
233 else {
234 fElectrons = GetObjThisEvt<ElectronOArr>(fElectronBranchName);
235 fNonIsolatedMuons = GetObjThisEvt<MuonCol>(fNonIsolatedMuonsName);
236 fNonIsolatedElectrons = GetObjThisEvt<ElectronCol>(fNonIsolatedElectronsName);
237 }
238 LoadEventObject(fBeamSpotName, fBeamSpot);
239 LoadEventObject(fTrackName, fTracks);
240 LoadEventObject(fPFCandidatesName, fPFCandidates);
241 if(fElIsoType == ElectronTools::kTrackJuraSliding) {
242 LoadEventObject(fPileupEnergyDensityName, fPileupEnergyDensity);
243 }
244 fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
245
246 //get trigger object collection if trigger matching is enabled
247 const TriggerObjectCol *trigObjs = 0;
248 if (fApplyTriggerMatching) {
249 trigObjs = GetHLTObjects(fTrigObjectsName);
250 }
251
252 ElectronOArr *GoodElectrons = new ElectronOArr;
253 GoodElectrons->SetName(fGoodElectronsName);
254
255 for (UInt_t i=0; i<fElectrons->GetEntries(); ++i) {
256 const Electron *e = fElectrons->At(i);
257
258 if (e->SCluster() == 0)
259 continue;
260
261 if (e->Pt() < fElectronPtMin)
262 continue;
263
264 if (e->SCluster()->Et() < fElectronEtMin)
265 continue;
266
267 if (e->AbsEta() > fElectronEtaMax)
268 continue;
269
270 if (fApplyEcalFiducial && ( (e->SCluster()->AbsEta()>1.4442 && e->SCluster()->AbsEta()<1.5666) || e->SCluster()->AbsEta()>2.5 )) {
271 continue;
272 }
273
274 if (fApplyEcalSeeded && !e->IsEcalDriven()) {
275 continue;
276 }
277
278 //apply trigger matching
279 Bool_t matchTrigger = fApplyTriggerMatching && ElectronTools::PassTriggerMatching(e,trigObjs);
280 if (fApplyTriggerMatching && !matchTrigger)
281 continue;
282
283 //apply ECAL spike removal
284 Bool_t spikecut = ElectronTools::PassSpikeRemovalFilter(e);
285 if (fApplySpikeRemoval && !spikecut)
286 continue;
287
288 //apply id cut
289 Bool_t idcut = PassIDCut(e, fElIdType);
290 if (!idcut)
291 continue;
292
293 //apply Isolation Cut
294 Double_t Rho = 0.0;
295 if(fElIsoType == ElectronTools::kTrackJuraSliding) {
296 Rho = fPileupEnergyDensity->At(0)->Rho();
297 }
298 Bool_t isocut = PassIsolationCut(e, fElIsoType, fTracks, fVertices->At(0), Rho);
299 if (!isocut)
300 continue;
301
302 // apply conversion filters
303 Bool_t passConvVetoType1 = kFALSE;
304 if (fApplyConvFilterType1) {
305 LoadEventObject(fConversionBranchName, fConversions);
306 passConvVetoType1 = ElectronTools::PassConversionFilter(e, fConversions,
307 fBeamSpot->At(0), fNWrongHitsMax);
308 }
309 else {
310 passConvVetoType1 = kTRUE;
311 }
312
313 if (passConvVetoType1 == kFALSE) continue;
314
315 Bool_t passConvVetoType2 = kFALSE;
316 if (fApplyConvFilterType2) {
317 passConvVetoType2 = TMath::Abs(e->ConvPartnerDCotTheta()) >= 0.02 ||
318 TMath::Abs(e->ConvPartnerDist()) >= 0.02;
319 }
320 else {
321 passConvVetoType2 = kTRUE;
322 }
323
324 if (passConvVetoType2 == kFALSE) continue;
325
326 // apply NExpectedHitsInner Cut
327 if(fNExpectedHitsInnerCut < 999 &&
328 e->CorrectedNExpectedHitsInner() > fNExpectedHitsInnerCut) continue;
329
330 // apply d0 cut
331 if (fApplyD0Cut) {
332 Bool_t passD0cut = ElectronTools::PassD0Cut(e, fVertices, fD0Cut);
333 if (!passD0cut)
334 continue;
335 }
336
337 // apply charge filter
338 if(fChargeFilter == kTRUE) {
339 Bool_t passChargeFilter = ElectronTools::PassChargeFilter(e);
340 if (!passChargeFilter) continue;
341 }
342
343 // apply full combined id, using Tight cuts
344 if(fCombinedIdCut == kTRUE) {
345 fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
346 LoadEventObject(fConversionBranchName, fConversions);
347 Int_t result = ElectronTools::PassTightId(e, *&fVertices, fConversions, 2);
348 if(result != 15) continue;
349 }
350
351 // add good electron
352 GoodElectrons->Add(e);
353 }
354
355 // sort according to pt
356 GoodElectrons->Sort();
357
358 // add to event for other modules to use
359 AddObjThisEvt(GoodElectrons);
360 }
361
362 //--------------------------------------------------------------------------------------------------
363 void ElectronIDMod::SlaveBegin()
364 {
365 // Run startup code on the computer (slave) doing the actual analysis. Here,
366 // we just request the electron collection branch.
367
368 // In this case we cannot have a branch
369 if (fElectronIsoType.CompareTo("PFIsoNoL") != 0 ) {
370 ReqEventObject(fElectronBranchName, fElectrons,fElectronsFromBranch);
371 }
372 ReqEventObject(fBeamSpotName, fBeamSpot, kTRUE);
373 ReqEventObject(fTrackName, fTracks, kTRUE);
374 ReqEventObject(fPFCandidatesName, fPFCandidates, kTRUE);
375 if (fElectronIsoType.CompareTo("TrackJuraSliding") == 0 ) {
376 ReqEventObject(fPileupEnergyDensityName, fPileupEnergyDensity, kTRUE);
377 }
378
379 if(fCombinedIdCut == kTRUE) {
380 fElectronIDType = "NoId";
381 fElectronIsoType = "NoIso";
382 fApplyConvFilterType1 = kFALSE;
383 fApplyConvFilterType2 = kFALSE;
384 fApplyD0Cut = kFALSE;
385 }
386
387 if (fApplyConvFilterType1 || fCombinedIdCut == kTRUE)
388 ReqEventObject(fConversionBranchName, fConversions, kTRUE);
389
390 Setup();
391 }
392
393 //--------------------------------------------------------------------------------------------------
394 void ElectronIDMod::Setup()
395 {
396 // Set all options properly before execution.
397
398 if (fElectronIDType.CompareTo("Tight") == 0)
399 fElIdType = ElectronTools::kTight;
400 else if (fElectronIDType.CompareTo("Loose") == 0)
401 fElIdType = ElectronTools::kLoose;
402 else if (fElectronIDType.CompareTo("Likelihood") == 0)
403 fElIdType = ElectronTools::kLikelihood;
404 else if (fElectronIDType.CompareTo("NoId") == 0)
405 fElIdType = ElectronTools::kNoId;
406 else if (fElectronIDType.CompareTo("ZeeId") == 0)
407 fElIdType = ElectronTools::kZeeId;
408 else if (fElectronIDType.CompareTo("CustomLoose") == 0)
409 fElIdType = ElectronTools::kCustomIdLoose;
410 else if (fElectronIDType.CompareTo("CustomTight") == 0)
411 fElIdType = ElectronTools::kCustomIdTight;
412 else if (fElectronIDType.CompareTo("VBTFWorkingPoint95Id") == 0)
413 fElIdType = ElectronTools::kVBTFWorkingPoint95Id;
414 else if (fElectronIDType.CompareTo("VBTFWorkingPoint90Id") == 0)
415 fElIdType = ElectronTools::kVBTFWorkingPoint90Id;
416 else if (fElectronIDType.CompareTo("VBTFWorkingPoint80Id") == 0)
417 fElIdType = ElectronTools::kVBTFWorkingPoint80Id;
418 else if (fElectronIDType.CompareTo("VBTFWorkingPoint85Id") == 0)
419 fElIdType = ElectronTools::kVBTFWorkingPoint85Id;
420 else if (fElectronIDType.CompareTo("VBTFWorkingPoint70Id") == 0)
421 fElIdType = ElectronTools::kVBTFWorkingPoint70Id;
422
423 else {
424 SendError(kAbortAnalysis, "SlaveBegin",
425 "The specified electron identification %s is not defined.",
426 fElectronIDType.Data());
427 return;
428 }
429
430 if (fElectronIsoType.CompareTo("TrackCalo") == 0 )
431 fElIsoType = ElectronTools::kTrackCalo;
432 else if (fElectronIsoType.CompareTo("TrackJura") == 0)
433 fElIsoType = ElectronTools::kTrackJura;
434 else if(fElectronIsoType.CompareTo("TrackJuraCombined") == 0)
435 fElIsoType = ElectronTools::kTrackJuraCombined;
436 else if(fElectronIsoType.CompareTo("TrackJuraSliding") == 0)
437 fElIsoType = ElectronTools::kTrackJuraSliding;
438 else if(fElectronIsoType.CompareTo("TrackJuraSlidingNoCorrection") == 0)
439 fElIsoType = ElectronTools::kTrackJuraSlidingNoCorrection;
440 else if (fElectronIsoType.CompareTo("PFIso") == 0 )
441 fElIsoType = ElectronTools::kPFIso;
442 else if (fElectronIsoType.CompareTo("PFIsoNoL") == 0 )
443 fElIsoType = ElectronTools::kPFIsoNoL;
444 else if (fElectronIsoType.CompareTo("NoIso") == 0 )
445 fElIsoType = ElectronTools::kNoIso;
446 else if (fElectronIsoType.CompareTo("ZeeIso") == 0 )
447 fElIsoType = ElectronTools::kZeeIso;
448 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint95Iso") == 0 )
449 fElIsoType = ElectronTools::kVBTFWorkingPoint95Iso;
450 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint90Iso") == 0 )
451 fElIsoType = ElectronTools::kVBTFWorkingPoint90Iso;
452 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint85Iso") == 0 )
453 fElIsoType = ElectronTools::kVBTFWorkingPoint85Iso;
454 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint80Iso") == 0 )
455 fElIsoType = ElectronTools::kVBTFWorkingPoint80Iso;
456 else if (fElectronIsoType.CompareTo("VBTFWorkingPoint70Iso") == 0 )
457 fElIsoType = ElectronTools::kVBTFWorkingPoint70Iso;
458 else if (fElectronIsoType.CompareTo("Custom") == 0 ) {
459 fElIsoType = ElectronTools::kCustomIso;
460 SendError(kWarning, "SlaveBegin",
461 "Custom electron isolation is not yet implemented.");
462 } else {
463 SendError(kAbortAnalysis, "SlaveBegin",
464 "The specified electron isolation %s is not defined.",
465 fElectronIsoType.Data());
466 return;
467 }
468
469
470 }
471
472 //--------------------------------------------------------------------------------------------------
473 void ElectronIDMod::Terminate()
474 {
475 // Run finishing code on the computer (slave) that did the analysis
476 }