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