ATLAS Offline Software
Loading...
Searching...
No Matches
EGammaCommonConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3# ********************************************************************
4# EGammaCommonConfig.py
5# Configures all tools needed for e-gamma object selection and sets
6# up the kernel algorithms so the results can be accessed/written to
7# the DAODs.
8# Component accumulator version.
9# ********************************************************************
10
11from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
12from AthenaConfiguration.ComponentFactory import CompFactory
13from AthenaConfiguration.Enums import LHCPeriod
14
15
16def EGammaCommonCfg(flags):
17 """Main config method for e-gamma decorations"""
18
19 acc = ComponentAccumulator()
20
21 includeFwdElectrons = "ForwardElectrons" in flags.Input.Collections
22
23 # ====================================================================
24 # PHOTON ETA (=ETA2), ET (=E/COSH(ETA2))
25 # ====================================================================
26 from DerivationFrameworkEGamma.EGammaToolsConfig import PhotonsDirectionToolCfg
27
28 DFCommonPhotonsDirection = acc.addPublicTool(acc.popToolsAndMerge(
29 PhotonsDirectionToolCfg(
30 flags,
31 name="DFCommonPhotonsDirection",
32 EtaSGEntry="DFCommonPhotons_eta",
33 PhiSGEntry="DFCommonPhotons_phi",
34 EtSGEntry="DFCommonPhotons_et",
35 )
36 ))
37
38 isMC = flags.Input.isMC
39 isFullSim = False
40 if isMC:
41 isFullSim = flags.Sim.ISF.Simulator.isFullSim()
42 isRun2orRun3 = flags.GeoModel.Run in (LHCPeriod.Run2, LHCPeriod.Run3)
43
44 print("EGammaCommon: isMC = ", isMC)
45 if isMC:
46 print("EGammaCommon: isFullSim = ", isFullSim)
47
48 # ====================================================================
49 # ELECTRON LH SELECTORS
50 # see Reconstruction/egamma/egammaTools/python/EMPIDBuilderBase.py
51 # on how to configure the selectors
52 # ====================================================================
53 from ROOT import LikeEnum
54
55 from ElectronPhotonSelectorTools.AsgElectronLikelihoodToolsConfig import (
56 AsgElectronLikelihoodToolCfg,
57 )
58 from ElectronPhotonSelectorTools.ElectronLikelihoodToolMapping import electronLHmenu
59
60 lhMenu = electronLHmenu.offlineMC21
61 if flags.GeoModel.Run is LHCPeriod.Run2:
62 lhMenu = electronLHmenu.offlineMC20
63
64 # Very Loose
65 ElectronLHSelectorVeryLoose = acc.popToolsAndMerge(
66 AsgElectronLikelihoodToolCfg(
67 flags,
68 name="ElectronLHSelectorVeryLoose",
69 quality=LikeEnum.VeryLoose,
70 menu=lhMenu,
71 )
72 )
73 ElectronLHSelectorVeryLoose.primaryVertexContainer = "PrimaryVertices"
74 acc.addPublicTool(ElectronLHSelectorVeryLoose)
75
76 # Loose
77 ElectronLHSelectorLoose = acc.popToolsAndMerge(
78 AsgElectronLikelihoodToolCfg(
79 flags,
80 name="ElectronLHSelectorLoose",
81 quality=LikeEnum.Loose,
82 menu=lhMenu,
83 )
84 )
85 ElectronLHSelectorLoose.primaryVertexContainer = "PrimaryVertices"
86 acc.addPublicTool(ElectronLHSelectorLoose)
87
88 # LooseBL
89 ElectronLHSelectorLooseBL = acc.popToolsAndMerge(
90 AsgElectronLikelihoodToolCfg(
91 flags,
92 name="ElectronLHSelectorLooseBL",
93 quality=LikeEnum.LooseBL,
94 menu=lhMenu,
95 )
96 )
97 ElectronLHSelectorLooseBL.primaryVertexContainer = "PrimaryVertices"
98 acc.addPublicTool(ElectronLHSelectorLooseBL)
99
100 # Medium
101 ElectronLHSelectorMedium = acc.popToolsAndMerge(
102 AsgElectronLikelihoodToolCfg(
103 flags,
104 name="ElectronLHSelectorMedium",
105 quality=LikeEnum.Medium,
106 menu=lhMenu,
107 )
108 )
109 ElectronLHSelectorMedium.primaryVertexContainer = "PrimaryVertices"
110 acc.addPublicTool(ElectronLHSelectorMedium)
111
112 # Tight
113 ElectronLHSelectorTight = acc.popToolsAndMerge(
114 AsgElectronLikelihoodToolCfg(
115 flags,
116 name="ElectronLHSelectorTight",
117 quality=LikeEnum.Tight,
118 menu=lhMenu,
119 )
120 )
121 ElectronLHSelectorTight.primaryVertexContainer = "PrimaryVertices"
122 acc.addPublicTool(ElectronLHSelectorTight)
123
124 # ====================================================================
125 # ELECTRON DNN SELECTORS
126 # ====================================================================
127 from ElectronPhotonSelectorTools.AsgElectronSelectorToolConfig import (
128 AsgElectronSelectorToolCfg,
129 )
130
131 # Loose
132 ElectronDNNSelectorLoose = acc.popToolsAndMerge(
133 AsgElectronSelectorToolCfg(
134 flags,
135 name="ElectronDNNSelectorLoose",
136 WorkingPoint="LooseDNNElectron",
137 )
138 )
139 acc.addPublicTool(ElectronDNNSelectorLoose)
140
141 # Medium
142 ElectronDNNSelectorMedium = acc.popToolsAndMerge(
143 AsgElectronSelectorToolCfg(
144 flags,
145 name="ElectronDNNSelectorMedium",
146 WorkingPoint="MediumDNNElectron",
147 )
148 )
149 acc.addPublicTool(ElectronDNNSelectorMedium)
150
151 # Tight
152 ElectronDNNSelectorTight = acc.popToolsAndMerge(
153 AsgElectronSelectorToolCfg(
154 flags,
155 name="ElectronDNNSelectorTight",
156 WorkingPoint="TightDNNElectron",
157 )
158 )
159 acc.addPublicTool(ElectronDNNSelectorTight)
160
161 # ====================================================================
162 # ELECTRON DNN SELECTORS WITHOUT CF REJECTION
163 # ====================================================================
164 # Very-Loose 97%
165 ElectronDNNSelectorVeryLooseNoCF97 = acc.popToolsAndMerge(
166 AsgElectronSelectorToolCfg(
167 flags,
168 name="ElectronDNNSelectorVeryLooseNoCF97",
169 WorkingPoint="VeryLooseNoCF97DNNElectron",
170 )
171 )
172 acc.addPublicTool(ElectronDNNSelectorVeryLooseNoCF97)
173
174 # Loose
175 ElectronDNNSelectorLooseNoCF = acc.popToolsAndMerge(
176 AsgElectronSelectorToolCfg(
177 flags,
178 name="ElectronDNNSelectorLooseNoCF",
179 WorkingPoint="LooseNoCFDNNElectron",
180 )
181 )
182 acc.addPublicTool(ElectronDNNSelectorLooseNoCF)
183
184 # Medium
185 ElectronDNNSelectorMediumNoCF = acc.popToolsAndMerge(
186 AsgElectronSelectorToolCfg(
187 flags,
188 name="ElectronDNNSelectorMediumNoCF",
189 WorkingPoint="MediumNoCFDNNElectron",
190 )
191 )
192 acc.addPublicTool(ElectronDNNSelectorMediumNoCF)
193
194 # Tight
195 ElectronDNNSelectorTightNoCF = acc.popToolsAndMerge(
196 AsgElectronSelectorToolCfg(
197 flags,
198 name="ElectronDNNSelectorTightNoCF",
199 WorkingPoint="TightNoCFDNNElectron",
200 )
201 )
202 acc.addPublicTool(ElectronDNNSelectorTightNoCF)
203
204 # ====================================================================
205 # ELECTRON CHARGE SELECTION
206 # ====================================================================
207 if flags.Derivation.Egamma.addECIDS:
208 from ElectronPhotonSelectorTools.AsgElectronChargeIDSelectorToolConfig import (
209 AsgElectronChargeIDSelectorToolCfg,
210 )
211
212 ElectronChargeIDSelector = acc.popToolsAndMerge(
213 AsgElectronChargeIDSelectorToolCfg(
214 flags, name="ElectronChargeIDSelectorLoose"
215 )
216 )
217 ElectronChargeIDSelector.primaryVertexContainer = "PrimaryVertices"
218 ElectronChargeIDSelector.TrainingFile = (
219 "ElectronPhotonSelectorTools/ChargeID/ECIDS_20180731rel21Summer2018.root"
220 )
221 acc.addPublicTool(ElectronChargeIDSelector)
222
223 # ====================================================================
224 # FWD ELECTRON LH SELECTORS
225 # ====================================================================
226 if includeFwdElectrons:
227 from ElectronPhotonSelectorTools.AsgForwardElectronLikelihoodToolConfig import (
228 AsgForwardElectronLikelihoodToolCfg,
229 )
230
231 ForwardElectronLHSelectorLoose = acc.popToolsAndMerge(
232 AsgForwardElectronLikelihoodToolCfg(
233 flags,
234 name="ForwardElectronLHSelectorLoose",
235 WorkingPoint="LooseLHForwardElectron",
236 )
237 )
238 acc.addPublicTool(ForwardElectronLHSelectorLoose)
239
240 ForwardElectronLHSelectorMedium = acc.popToolsAndMerge(
241 AsgForwardElectronLikelihoodToolCfg(
242 flags,
243 name="ForwardElectronLHSelectorMedium",
244 WorkingPoint="MediumLHForwardElectron",
245 )
246 )
247 acc.addPublicTool(ForwardElectronLHSelectorMedium)
248
249 ForwardElectronLHSelectorTight = acc.popToolsAndMerge(
250 AsgForwardElectronLikelihoodToolCfg(
251 flags,
252 name="ForwardElectronLHSelectorTight",
253 WorkingPoint="TightLHForwardElectron",
254 )
255 )
256 acc.addPublicTool(ForwardElectronLHSelectorTight)
257
258 # ====================================================================
259 # PHOTON SELECTION (loose and tight cut-based)
260 # ====================================================================
261 from ROOT import egammaPID
262
263 from ElectronPhotonSelectorTools.AsgPhotonIsEMSelectorsConfig import (
264 AsgPhotonIsEMSelectorCfg,
265 )
266 from ElectronPhotonSelectorTools.PhotonIsEMSelectorMapping import photonPIDmenu
267 pidMenu = photonPIDmenu.offlineMC21
268 if flags.GeoModel.Run is LHCPeriod.Run2:
269 pidMenu = photonPIDmenu.offlineMC20
270
271 # Loose
272 PhotonIsEMSelectorLoose = acc.popToolsAndMerge(
273 AsgPhotonIsEMSelectorCfg(
274 flags,
275 name="PhotonIsEMSelectorLoose",
276 quality=egammaPID.PhotonIDLoose,
277 menu=pidMenu
278 )
279 )
280 acc.addPublicTool(PhotonIsEMSelectorLoose)
281
282 # Medium
283 PhotonIsEMSelectorMedium = acc.popToolsAndMerge(
284 AsgPhotonIsEMSelectorCfg(
285 flags,
286 name="PhotonIsEMSelectorMedium",
287 quality=egammaPID.PhotonIDMedium,
288 menu=pidMenu
289 )
290 )
291 acc.addPublicTool(PhotonIsEMSelectorMedium)
292
293 # Tight
294 PhotonIsEMSelectorTight = acc.popToolsAndMerge(
295 AsgPhotonIsEMSelectorCfg(
296 flags,
297 name="PhotonIsEMSelectorTight",
298 quality=egammaPID.PhotonIDTight,
299 menu=pidMenu
300 )
301 )
302 acc.addPublicTool(PhotonIsEMSelectorTight)
303
304 # ====================================================================
305 # PHOTON BDT SELECTION
306 # ====================================================================
307 photonIDBDTWP = "TightBDTPhoton_Run3"
308 if flags.GeoModel.Run is LHCPeriod.Run2:
309 photonIDBDTWP = "TightBDTPhoton_Run2"
310 from ElectronPhotonSelectorTools.AsgPhotonBDTSelectorConfig import (
311 PhotonBDTCalculatorCfg,
312 AsgPhotonBDTSelectorCfg,
313 )
314 PhotonBDTCalculator = acc.popToolsAndMerge(
315 PhotonBDTCalculatorCfg(
316 flags,
317 name="PhotonBDTCalculator",
318 useNFs=False,
319 )
320 )
321 PhotonBDTSelectorTight = acc.popToolsAndMerge(
322 AsgPhotonBDTSelectorCfg(
323 flags,
324 name="PhotonBDTSelectorTight",
325 ScoreDecoration="DFCommonPhotonsBDTScore",
326 WorkingPoint=photonIDBDTWP,
327 useNFs=False,
328 SuppressInputDependence=True
329 )
330 )
331 PhotonBDTCalculatorNF = acc.popToolsAndMerge(
332 PhotonBDTCalculatorCfg(
333 flags,
334 name="PhotonBDTCalculatorNF",
335 useNFs=True,
336 )
337 )
338 PhotonBDTSelectorTightNF = acc.popToolsAndMerge(
339 AsgPhotonBDTSelectorCfg(
340 flags,
341 name="PhotonBDTSelectorTightNF",
342 ScoreDecoration="DFCommonPhotonsNFBDTScore",
343 WorkingPoint=photonIDBDTWP+"_NFs",
344 useNFs=True,
345 SuppressInputDependence=True
346 )
347 )
348 # ====================================================================
349 # RECTANGULAR CLUSTER TOOLS
350 # ====================================================================
351
352 from egammaCaloTools.egammaCaloToolsConfig import CaloFillRectangularClusterCfg
353
354 EGAMCOM_caloFillRect55 = acc.popToolsAndMerge(
355 CaloFillRectangularClusterCfg(
356 flags,
357 name="EGAMCOMCaloFillRectangularCluster55",
358 cells_name="AllCalo",
359 eta_size=5,
360 phi_size=5,
361 fill_cluster=True,
362 )
363 )
364 acc.addPublicTool(EGAMCOM_caloFillRect55)
365
366 EGAMCOM_caloFillRect35 = acc.popToolsAndMerge(
367 CaloFillRectangularClusterCfg(
368 flags,
369 name="EGAMCOMCaloFillRectangularCluster35",
370 cells_name="AllCalo",
371 eta_size=3,
372 phi_size=5,
373 fill_cluster=True,
374 )
375 )
376 acc.addPublicTool(EGAMCOM_caloFillRect35)
377
378 EGAMCOM_caloFillRect37 = acc.popToolsAndMerge(
379 CaloFillRectangularClusterCfg(
380 flags,
381 name="EGAMCOMCaloFillRectangularCluster37",
382 cells_name="AllCalo",
383 eta_size=3,
384 phi_size=7,
385 fill_cluster=True,
386 )
387 )
388 acc.addPublicTool(EGAMCOM_caloFillRect37)
389
390 EGAMCOM_caloFillRect711 = acc.popToolsAndMerge(
391 CaloFillRectangularClusterCfg(
392 flags,
393 name="EGAMCOMCaloFillRectangularCluster711",
394 cells_name="AllCalo",
395 eta_size=7,
396 phi_size=11,
397 fill_cluster=True,
398 )
399 )
400 acc.addPublicTool(EGAMCOM_caloFillRect711)
401
402 # ====================================================================
403 # AUGMENTATION TOOLS
404 # ====================================================================
405 from DerivationFrameworkEGamma.EGammaToolsConfig import EGSelectionToolWrapperCfg
406 from DerivationFrameworkEGamma.EGammaToolsConfig import (
407 EGElectronLikelihoodToolWrapperCfg,
408 EGPhotonBDTToolWrapperCfg,
409 EGPhotonBDTToolDecoratorCfg
410 )
411
412 # Note: LH selectors don't need fudging since the LH is tuned to data
413
414 # decorate electrons with the output of LH very loose
415 ElectronPassLHVeryLoose = acc.addPublicTool(acc.popToolsAndMerge(
416 EGElectronLikelihoodToolWrapperCfg(
417 flags,
418 name="ElectronPassLHVeryLoose",
419 EGammaElectronLikelihoodTool=ElectronLHSelectorVeryLoose,
420 CutType="",
421 StoreGateEntryName="DFCommonElectronsLHVeryLoose",
422 ContainerName="Electrons",
423 StoreTResult=False,
424 )
425 ))
426
427 # decorate electrons with the output of LH loose
428 ElectronPassLHLoose = acc.addPublicTool(acc.popToolsAndMerge(
429 EGElectronLikelihoodToolWrapperCfg(
430 flags,
431 name="ElectronPassLHLoose",
432 EGammaElectronLikelihoodTool=ElectronLHSelectorLoose,
433 CutType="",
434 StoreGateEntryName="DFCommonElectronsLHLoose",
435 ContainerName="Electrons",
436 StoreTResult=False,
437 )
438 ))
439
440 # decorate electrons with the output of LH loose+BL
441 ElectronPassLHLooseBL = acc.addPublicTool(acc.popToolsAndMerge(
442 EGElectronLikelihoodToolWrapperCfg(
443 flags,
444 name="ElectronPassLHLooseBL",
445 EGammaElectronLikelihoodTool=ElectronLHSelectorLooseBL,
446 CutType="",
447 StoreGateEntryName="DFCommonElectronsLHLooseBL",
448 ContainerName="Electrons",
449 StoreTResult=False,
450 )
451 ))
452
453 # decorate electrons with the output of LH medium
454 ElectronPassLHMedium = acc.addPublicTool(acc.popToolsAndMerge(
455 EGElectronLikelihoodToolWrapperCfg(
456 flags,
457 name="ElectronPassLHMedium",
458 EGammaElectronLikelihoodTool=ElectronLHSelectorMedium,
459 CutType="",
460 StoreGateEntryName="DFCommonElectronsLHMedium",
461 ContainerName="Electrons",
462 StoreTResult=False,
463 )
464 ))
465
466 # decorate electrons with the output of LH tight
467 ElectronPassLHTight = acc.addPublicTool(acc.popToolsAndMerge(
468 EGElectronLikelihoodToolWrapperCfg(
469 flags,
470 name="ElectronPassLHTight",
471 EGammaElectronLikelihoodTool=ElectronLHSelectorTight,
472 CutType="",
473 StoreGateEntryName="DFCommonElectronsLHTight",
474 ContainerName="Electrons",
475 StoreTResult=False,
476 )
477 ))
478
479 # decorate electrons with the output of DNN Loose
480 ElectronPassDNNLoose = acc.addPublicTool(acc.popToolsAndMerge(
481 EGElectronLikelihoodToolWrapperCfg(
482 flags,
483 name="ElectronPassDNNLoose",
484 EGammaElectronLikelihoodTool=ElectronDNNSelectorLoose,
485 CutType="",
486 StoreGateEntryName="DFCommonElectronsDNNLoose",
487 ContainerName="Electrons",
488 FudgedContainerName="FudgedElectrons" if isMC else "",
489 StoreTResult=False,
490 StoreGateEntryMultipleNames=[
491 "DFCommonElectronsDNN_pel",
492 "DFCommonElectronsDNN_pcf",
493 "DFCommonElectronsDNN_ppc",
494 "DFCommonElectronsDNN_phf",
495 "DFCommonElectronsDNN_ple",
496 "DFCommonElectronsDNN_plh",
497 ],
498 StoreMultipleOutputs=True,
499 )
500 ))
501
502 # decorate electrons with the output of DNN Medium
503 ElectronPassDNNMedium = acc.addPublicTool(acc.popToolsAndMerge(
504 EGElectronLikelihoodToolWrapperCfg(
505 flags,
506 name="ElectronPassDNNMedium",
507 EGammaElectronLikelihoodTool=ElectronDNNSelectorMedium,
508 CutType="",
509 StoreGateEntryName="DFCommonElectronsDNNMedium",
510 ContainerName="Electrons",
511 FudgedContainerName="FudgedElectrons" if isMC else "",
512 StoreTResult=False,
513 )
514 ))
515
516 # decorate electrons with the output of DNN Tight
517 ElectronPassDNNTight = acc.addPublicTool(acc.popToolsAndMerge(
518 EGElectronLikelihoodToolWrapperCfg(
519 flags,
520 name="ElectronPassDNNTight",
521 EGammaElectronLikelihoodTool=ElectronDNNSelectorTight,
522 CutType="",
523 StoreGateEntryName="DFCommonElectronsDNNTight",
524 ContainerName="Electrons",
525 FudgedContainerName="FudgedElectrons" if isMC else "",
526 StoreTResult=False,
527 )
528 ))
529
530 # decorate electrons with the output of DNN VeryLoose97 without CF
531 ElectronPassDNNVeryLooseNoCF97 = acc.addPublicTool(acc.popToolsAndMerge(
532 EGElectronLikelihoodToolWrapperCfg(
533 flags,
534 name="ElectronPassDNNVeryLooseNoCF97",
535 EGammaElectronLikelihoodTool=ElectronDNNSelectorVeryLooseNoCF97,
536 CutType="",
537 StoreGateEntryName="DFCommonElectronsDNNVeryLooseNoCF97",
538 ContainerName="Electrons",
539 FudgedContainerName="FudgedElectrons" if isMC else "",
540 StoreTResult=False,
541 )
542 ))
543 # decorate electrons with the output of DNN Loose without CF
544 ElectronPassDNNLooseNoCF = acc.addPublicTool(acc.popToolsAndMerge(
545 EGElectronLikelihoodToolWrapperCfg(
546 flags,
547 name="ElectronPassDNNLooseNoCF",
548 EGammaElectronLikelihoodTool=ElectronDNNSelectorLooseNoCF,
549 CutType="",
550 StoreGateEntryName="DFCommonElectronsDNNLooseNoCF",
551 ContainerName="Electrons",
552 FudgedContainerName="FudgedElectrons" if isMC else "",
553 StoreTResult=False,
554 )
555 ))
556
557 # decorate electrons with the output of DNN Medium without CF
558 ElectronPassDNNMediumNoCF = acc.addPublicTool(acc.popToolsAndMerge(
559 EGElectronLikelihoodToolWrapperCfg(
560 flags,
561 name="ElectronPassDNNMediumNoCF",
562 EGammaElectronLikelihoodTool=ElectronDNNSelectorMediumNoCF,
563 CutType="",
564 StoreGateEntryName="DFCommonElectronsDNNMediumNoCF",
565 ContainerName="Electrons",
566 FudgedContainerName="FudgedElectrons" if isMC else "",
567 StoreTResult=False,
568 )
569 ))
570
571 # decorate electrons with the output of DNN Tight without CF
572 ElectronPassDNNTightNoCF = acc.addPublicTool(acc.popToolsAndMerge(
573 EGElectronLikelihoodToolWrapperCfg(
574 flags,
575 name="ElectronPassDNNTightNoCF",
576 EGammaElectronLikelihoodTool=ElectronDNNSelectorTightNoCF,
577 CutType="",
578 StoreGateEntryName="DFCommonElectronsDNNTightNoCF",
579 ContainerName="Electrons",
580 FudgedContainerName="FudgedElectrons" if isMC else "",
581 StoreTResult=False,
582 )
583 ))
584
585 # decorate electrons with the output of ECIDS
586 if flags.Derivation.Egamma.addECIDS:
587 ElectronPassECIDS = acc.addPublicTool(acc.popToolsAndMerge(
588 EGElectronLikelihoodToolWrapperCfg(
589 flags,
590 name="ElectronPassECIDS",
591 EGammaElectronLikelihoodTool=ElectronChargeIDSelector,
592 CutType="",
593 StoreGateEntryName="DFCommonElectronsECIDS",
594 ContainerName="Electrons",
595 StoreTResult=True,
596 )
597 ))
598
599 if includeFwdElectrons:
600 # decorate forward electrons with the output of LH loose
601 ForwardElectronPassLHLoose = acc.addPublicTool(acc.popToolsAndMerge(
602 EGElectronLikelihoodToolWrapperCfg(
603 flags,
604 name="ForwardElectronPassLHLoose",
605 EGammaElectronLikelihoodTool=ForwardElectronLHSelectorLoose,
606 CutType="",
607 StoreGateEntryName="DFCommonForwardElectronsLHLoose",
608 ContainerName="ForwardElectrons",
609 )
610 ))
611
612 # decorate forward electrons with the output of LH medium
613 ForwardElectronPassLHMedium = acc.addPublicTool(acc.popToolsAndMerge(
614 EGElectronLikelihoodToolWrapperCfg(
615 flags,
616 name="ForwardElectronPassLHMedium",
617 EGammaElectronLikelihoodTool=ForwardElectronLHSelectorMedium,
618 CutType="",
619 StoreGateEntryName="DFCommonForwardElectronsLHMedium",
620 ContainerName="ForwardElectrons",
621 )
622 ))
623
624 # decorate forward electrons with the output of LH tight
625 ForwardElectronPassLHTight = acc.addPublicTool(acc.popToolsAndMerge(
626 EGElectronLikelihoodToolWrapperCfg(
627 flags,
628 name="ForwardElectronPassLHTight",
629 EGammaElectronLikelihoodTool=ForwardElectronLHSelectorTight,
630 CutType="",
631 StoreGateEntryName="DFCommonForwardElectronsLHTight",
632 ContainerName="ForwardElectrons",
633 )
634 ))
635
636 # decorate photons with the output of IsEM loose
637 # on MC, use fudged shower shapes to compute the ID (but the
638 # original shower shapes are not overridden)
639 PhotonPassIsEMLoose = acc.addPublicTool(acc.popToolsAndMerge(
640 EGSelectionToolWrapperCfg(
641 flags,
642 name="PhotonPassIsEMLoose",
643 EGammaSelectionTool=PhotonIsEMSelectorLoose,
644 CutType="",
645 StoreGateEntryName="DFCommonPhotonsIsEMLoose",
646 ContainerName="Photons",
647 FudgedContainerName="FudgedPhotons" if isFullSim else "",
648 )
649 ))
650
651 # decorate photons with the output of IsEM medium
652 # on MC, use fudged shower shapes to compute the ID (but the
653 # original shower shapes are not overridden)
654 PhotonPassIsEMMedium = acc.addPublicTool(acc.popToolsAndMerge(
655 EGSelectionToolWrapperCfg(
656 flags,
657 name="PhotonPassIsEMMedium",
658 EGammaSelectionTool=PhotonIsEMSelectorMedium,
659 CutType="",
660 StoreGateEntryName="DFCommonPhotonsIsEMMedium",
661 ContainerName="Photons",
662 FudgedContainerName="FudgedPhotons" if isFullSim else "",
663 )
664 ))
665
666 # decorate photons with the output of IsEM tight
667 # on full-sim MC, use fudged shower shapes to compute the ID
668 # (but the original shower shapes are not overridden)
669 PhotonPassIsEMTight = acc.addPublicTool(acc.popToolsAndMerge(
670 EGSelectionToolWrapperCfg(
671 flags,
672 name="PhotonPassIsEMTight",
673 EGammaSelectionTool=PhotonIsEMSelectorTight,
674 CutType="",
675 StoreGateEntryName="DFCommonPhotonsIsEMTight",
676 ContainerName="Photons",
677 FudgedContainerName="FudgedPhotons" if isFullSim else "",
678 )
679 ))
680
681 # decorate photons with the output of BDT tight
682 # on full-sim MC, use fudged shower shapes to compute the ID
683 # (but the original shower shapes are not overridden)
684 PhotonBDTDecorator = acc.addPublicTool(acc.popToolsAndMerge(
685 EGPhotonBDTToolDecoratorCfg(
686 flags,
687 name="PhotonBDTDecorator",
688 PhotonObservableTool=PhotonBDTCalculator,
689 StoreGateEntryName="DFCommonPhotonsBDT",
690 ContainerName="Photons",
691 FudgedContainerName= "FudgedPhotons" if isFullSim else ""
692 )
693 ))
694
695
696 PhotonPassBDTTight = acc.addPublicTool(acc.popToolsAndMerge(
697 EGPhotonBDTToolWrapperCfg(
698 flags,
699 name="PhotonPassBDTTight",
700 PhotonBDTSelectionTool=PhotonBDTSelectorTight,
701 CutType="",
702 StoreGateEntryName="DFCommonPhotonsBDT",
703 WorkingPointName="Tight",
704 ContainerName="Photons",
705 FudgedContainerName= "FudgedPhotons" if isFullSim else ""
706 )
707 ))
708
709 # decorate photons with the output of IsEM tight
710 # on MC, normalizing flows-based correction used to compute the ID
711 # (but the original shower shapes are not overridden)
712 PhotonPassIsEMTightNF = acc.addPublicTool(acc.popToolsAndMerge(
713 EGSelectionToolWrapperCfg(
714 flags,
715 name="PhotonPassIsEMTightNF",
716 EGammaSelectionTool=PhotonIsEMSelectorTight,
717 CutType="",
718 StoreGateEntryName="DFCommonPhotonsIsEMTightNF",
719 ContainerName="Photons",
720 FudgedContainerName= "NFFudgedPhotons" if (isMC and isRun2orRun3) else ""
721 )
722 ))
723
724 # decorate photons with the output of BDT tight
725 # on MC, normalizing flows-based correction used to compute the ID
726 # (but the original shower shapes are not overridden)
727 PhotonBDTDecoratorNF = acc.addPublicTool(acc.popToolsAndMerge(
728 EGPhotonBDTToolDecoratorCfg(
729 flags,
730 name="PhotonBDTDecoratorNF",
731 PhotonObservableTool=PhotonBDTCalculatorNF,
732 StoreGateEntryName="DFCommonPhotonsNFBDT",
733 ContainerName="Photons",
734 FudgedContainerName= "NFFudgedPhotons" if (isMC and isRun2orRun3) else ""
735 )
736 ))
737
738 PhotonPassBDTTightNF = acc.addPublicTool(acc.popToolsAndMerge(
739 EGPhotonBDTToolWrapperCfg(
740 flags,
741 name="PhotonPassBDTTightNF",
742 PhotonBDTSelectionTool=PhotonBDTSelectorTightNF,
743 CutType="",
744 StoreGateEntryName="DFCommonPhotonsNFBDT",
745 WorkingPointName="Tight",
746 ContainerName="Photons",
747 FudgedContainerName= "NFFudgedPhotons" if (isMC and isRun2orRun3) else ""
748 )
749 ))
750
751
752 # decorate photons with the photon cleaning flags
753 # on MC, fudge the shower shapes used to compute the flags
754 from DerivationFrameworkEGamma.EGammaToolsConfig import EGPhotonCleaningWrapperCfg
755
756 PhotonPassCleaning = acc.addPublicTool(acc.popToolsAndMerge(
757 EGPhotonCleaningWrapperCfg(
758 flags,
759 name="PhotonPassCleaning",
760 StoreGateEntryName="DFCommonPhotonsCleaning",
761 ContainerName="Photons",
762 FudgedContainerName= "FudgedPhotons" if isFullSim else ""
763 )
764 ))
765
766 # decorate some electrons with an additional ambiguity flag
767 # against internal and early material conversion
768 from DerivationFrameworkEGamma.EGammaToolsConfig import EGElectronAmbiguityToolCfg
769
770 ElectronAmbiguity = acc.addPublicTool(acc.popToolsAndMerge(
771 EGElectronAmbiguityToolCfg(
772 flags,
773 name="ElectronAdditionnalAmbiguity",
774 isMC=flags.Input.isMC,
775 )
776 ))
777
778 # list of all the decorators so far
779 EGAugmentationTools = [
780 DFCommonPhotonsDirection,
781 ElectronPassLHVeryLoose,
782 ElectronPassLHLoose,
783 ElectronPassLHLooseBL,
784 ElectronPassLHMedium,
785 ElectronPassLHTight,
786 ElectronPassDNNLoose,
787 ElectronPassDNNMedium,
788 ElectronPassDNNTight,
789 ElectronPassDNNVeryLooseNoCF97,
790 ElectronPassDNNLooseNoCF,
791 ElectronPassDNNMediumNoCF,
792 ElectronPassDNNTightNoCF,
793 PhotonPassIsEMLoose,
794 PhotonPassIsEMMedium,
795 PhotonPassIsEMTight,
796 PhotonPassIsEMTightNF,
797 PhotonBDTDecorator,
798 PhotonPassBDTTight,
799 PhotonBDTDecoratorNF,
800 PhotonPassBDTTightNF,
801 PhotonPassCleaning,
802 ElectronAmbiguity,
803 ]
804
805 if flags.Derivation.Egamma.addECIDS:
806 EGAugmentationTools.extend([ElectronPassECIDS])
807
808 if includeFwdElectrons:
809 EGAugmentationTools.extend(
810 [
811 ForwardElectronPassLHLoose,
812 ForwardElectronPassLHMedium,
813 ForwardElectronPassLHTight,
814 ]
815 )
816
817 from egammaAlgs.egammaAODFixesConfig import runAODFix
818 _, fixes = runAODFix(flags)
819 # the topoIso fix already provides the decorations that this tool creates
820 if not('egammatopoIsoFix' in fixes):
821 if flags.Derivation.Egamma.addMissingCellInfo:
822 from DerivationFrameworkCalo.DerivationFrameworkCaloConfig import (
823 EgammaCoreCellRecoveryCfg,
824 )
825
826 CoreCellRecoveryTool = acc.popToolsAndMerge(
827 EgammaCoreCellRecoveryCfg(flags)
828 )
829 acc.addPublicTool(CoreCellRecoveryTool)
830 EGAugmentationTools.append(CoreCellRecoveryTool)
831
832 if flags.Derivation.Egamma.addMissingCellInfo:
833 from DerivationFrameworkEGamma.EGammaToolsConfig import EGammaEnergyCalibrationWrapperCfg
834 TransformerEnergyCalibration = acc.addPublicTool(acc.popToolsAndMerge(
835 EGammaEnergyCalibrationWrapperCfg(
836 flags,
837 name="TransformerEnergyCalibration",
838 )
839 ))
840 EGAugmentationTools.append(TransformerEnergyCalibration)
841
842 # ==================================================
843 # Truth Related tools
844 if flags.Input.isMC:
845 # Decorate Electron with bkg electron type/origin
846 from DerivationFrameworkEGamma.EGammaToolsConfig import (
847 BkgElectronClassificationCfg,
848 )
849
850 BkgElectronClassificationTool = acc.addPublicTool(acc.popToolsAndMerge(
851 BkgElectronClassificationCfg(
852 flags,
853 name="BkgElectronClassificationTool"
854 )
855 ))
856 EGAugmentationTools.append(BkgElectronClassificationTool)
857
858 # Decorate egammaTruthParticles with truth-particle-level etcone20,30,40
859 from DerivationFrameworkMCTruth.TruthDerivationToolsConfig import (
860 TruthIsolationToolCfg,
861 )
862
863 TruthEgetIsolationTool = acc.getPrimaryAndMerge(
864 TruthIsolationToolCfg(
865 flags,
866 name="TruthEgetIsolationTool",
867 isoParticlesKey="egammaTruthParticles",
868 allParticlesKey="TruthParticles",
869 particleIDsToCalculate=[-11, 11, 22],
870 IsolationConeSizes=[0.2, 0.3, 0.4],
871 excludeIDsFromCone=[-16, -14, -13, -12, 12, 13, 14, 16],
872 IsolationVarNamePrefix="etcone",
873 ChargedParticlesOnly=False,
874 )
875 )
876 EGAugmentationTools.append(TruthEgetIsolationTool)
877
878 # Decorate egammaTruthParticles with truth-particle-level ptcone20,30,40
879 TruthEgptIsolationTool = acc.getPrimaryAndMerge(
880 TruthIsolationToolCfg(
881 flags,
882 name="TruthEgptIsolationTool",
883 isoParticlesKey="egammaTruthParticles",
884 allParticlesKey="TruthParticles",
885 particleIDsToCalculate=[-11, 11, 22],
886 IsolationConeSizes=[0.2, 0.3, 0.4],
887 IsolationVarNamePrefix="ptcone",
888 ChargedParticlesOnly=True,
889 )
890 )
891 EGAugmentationTools.append(TruthEgptIsolationTool)
892
893 # Compute the truth-particle-level energy density in the central eta region
894 from EventShapeTools.EventDensityConfig import configEventDensityTool
895 from JetRecConfig.JetRecConfig import (
896 getInputAlgs,
897 getConstitPJGAlg,
898 reOrderAlgs,
899 )
900 from JetRecConfig.StandardJetConstits import stdConstitDic as cst
901
902 # Schedule PseudoJetTruth
903 constit_algs = getInputAlgs(cst.Truth, flags=flags)
904 constit_algs, ca = reOrderAlgs([a for a in constit_algs if a is not None])
905 acc.merge(ca)
906 for a in constit_algs:
907 acc.addEventAlgo(a)
908 constitPJAlg = getConstitPJGAlg(cst.Truth, suffix=None)
909 acc.addEventAlgo(constitPJAlg)
910
911 tc = configEventDensityTool(
912 "EDTruthCentralTool",
913 cst.Truth,
914 0.5,
915 AbsRapidityMin=0.0,
916 AbsRapidityMax=1.5,
917 OutputContainer="TruthIsoCentralEventShape",
918 OutputLevel=3,
919 )
920 acc.addPublicTool(tc)
921
922 # Compute the truth-particle-level energy density in the forward eta region
923 tf = configEventDensityTool(
924 "EDTruthForwardTool",
925 cst.Truth,
926 0.5,
927 AbsRapidityMin=1.5,
928 AbsRapidityMax=3.0,
929 OutputContainer="TruthIsoForwardEventShape",
930 OutputLevel=3,
931 )
932 acc.addPublicTool(tf)
933
934 acc.addEventAlgo(
935 CompFactory.EventDensityAthAlg("EDTruthCentralAlg", EventDensityTool=tc)
936 )
937 acc.addEventAlgo(
938 CompFactory.EventDensityAthAlg("EDTruthForwardAlg", EventDensityTool=tf)
939 )
940
941 # Create Fudged egamma collections
942 if flags.Input.isMC:
943 from DerivationFrameworkEGamma.EGammaToolsConfig import (
944 ElectronFudgeAlgorithmCfg, PhotonFudgeAlgorithmCfg, PhotonNFFudgeAlgorithmCfg)
945 acc.merge(ElectronFudgeAlgorithmCfg(flags))
946 if isRun2orRun3:
947 acc.merge(PhotonNFFudgeAlgorithmCfg(flags))
948 if isFullSim:
949 acc.merge(PhotonFudgeAlgorithmCfg(flags))
950
951 # =======================================
952 # CREATE THE DERIVATION KERNEL ALGORITHM
953 # =======================================
954
955 acc.addEventAlgo(
956 CompFactory.DerivationFramework.CommonAugmentation(
957 "EGammaCommonKernel", AugmentationTools=EGAugmentationTools
958 )
959 )
960
961 # =======================================
962 # ADD TOOLS : custom electron, photon and muon track isolation
963 # =======================================
964 from IsolationAlgs.DerivationTrackIsoConfig import DerivationTrackIsoCfg
965
966 acc.merge(DerivationTrackIsoCfg(flags, object_types=("Electrons", "Muons")))
967
968 hasFlowObject = (
969 "JetETMissChargedParticleFlowObjects" in flags.Input.Collections
970 and "JetETMissNeutralParticleFlowObjects" in flags.Input.Collections
971 )
972 if hasFlowObject:
973 from IsolationAlgs.IsolationSteeringDerivConfig import IsolationSteeringDerivCfg
974
975 acc.merge(IsolationSteeringDerivCfg(flags))
976
977 return acc
void print(char *figname, TCanvas *c1)