ATLAS Offline Software
Public Member Functions | List of all members
python.PhotonAnalysisConfig.PhotonCalibrationConfig Class Reference
Inheritance diagram for python.PhotonAnalysisConfig.PhotonCalibrationConfig:
Collaboration diagram for python.PhotonAnalysisConfig.PhotonCalibrationConfig:

Public Member Functions

def __init__ (self)
 
def instanceName (self)
 
def makeCalibrationAndSmearingAlg (self, config, name)
 
def makeAlgs (self, config)
 

Detailed Description

the ConfigBlock for the photon four-momentum correction

Definition at line 17 of file PhotonAnalysisConfig.py.

Constructor & Destructor Documentation

◆ __init__()

def python.PhotonAnalysisConfig.PhotonCalibrationConfig.__init__ (   self)

Definition at line 20 of file PhotonAnalysisConfig.py.

20  def __init__ (self) :
21  super (PhotonCalibrationConfig, self).__init__ ()
22  self.setBlockName('Photons')
23  self.addOption ('containerName', '', type=str,
24  noneAction='error',
25  info="the name of the output container after calibration.")
26  self.addOption ('ESModel', '', type=str,
27  info="flag of egamma calibration recommendation.")
28  self.addOption ('decorrelationModel', '1NP_v1', type=str,
29  info="egamma energy scale decorrelationModel. The default is 1NP_v1. "
30  "Supported Model: 1NP_v1, FULL_v1.")
31  self.addOption ('postfix', '', type=str,
32  info="a postfix to apply to decorations and algorithm names. "
33  "Typically not needed here since the calibration is common to "
34  "all photons.")
35  self.addOption ('crackVeto', False, type=bool,
36  info="whether to perform LAr crack veto based on the cluster eta, "
37  "i.e. remove photons within 1.37<|eta|<1.52. "
38  "The default is False.")
39  self.addOption ('enableCleaning', True, type=bool,
40  info="whether to enable photon cleaning (DFCommonPhotonsCleaning). "
41  "The default is True.")
42  self.addOption ('cleaningAllowLate', False, type=bool,
43  info="whether to ignore timing information in cleaning "
44  "(DFCommonPhotonsCleaningNoTime). The default is False.")
45  self.addOption ('recomputeIsEM', False, type=bool,
46  info="whether to recompute the photon shower shape fudge "
47  "corrections (sets up an instance of CP::PhotonShowerShapeFudgeAlg). "
48  "The default is False, i.e. to use derivation variables.")
49  self.addOption ('recalibratePhyslite', True, type=bool,
50  info="whether to run the CP::EgammaCalibrationAndSmearingAlg on "
51  "PHYSLITE derivations. The default is True.")
52  self.addOption ('minPt', 10*GeV, type=float,
53  info="the minimum pT cut to apply to calibrated photons. "
54  "The default is 10 GeV.")
55  self.addOption ('maxEta', 2.37, type=float,
56  info="maximum photon |eta| (float). The default is 2.37.")
57  self.addOption ('forceFullSimConfigForP4', False, type=bool,
58  info="whether to force the tool to use the configuration meant for "
59  "full simulation samples for P4 corrections. Only for testing purposes. "
60  "The default is False.")
61  self.addOption ('forceFullSimConfigForIso', False, type=bool,
62  info="whether to force the tool to use the configuration meant for "
63  "full simulation samples for isolation corrections. Only for testing purposes. "
64  "The default is False.")
65  self.addOption ('applyIsolationCorrection', True, type=bool,
66  info="whether to to apply the isolation corrections "
67  "The default is True.")
68  self.addOption ('splitCalibrationAndSmearing', False, type=bool,
69  info="EXPERIMENTAL: This splits the EgammaCalibrationAndSmearingTool "
70  " into two steps. The first step applies a baseline calibration that "
71  "is not affected by systematics. The second step then applies the "
72  "systematics dependent corrections. The net effect is that the "
73  "slower first step only has to be run once, while the second is run "
74  "once per systematic. ATLASG-2358",
75  expertMode=True)
76  self.addOption ('decorateTruth', False, type=bool,
77  info="decorate truth particle information on the reconstructed one")
78  self.addOption ('decorateCaloClusterEta', False, type=bool,
79  info="decorate the calo cluster eta on the reconstructed one")
80  self.addOption ('decorateEmva', False, type=bool,
81  info="decorate E_mva_only on the objects (needed for columnar tools/PHYSLITE)")
82 

Member Function Documentation

◆ instanceName()

def python.PhotonAnalysisConfig.PhotonCalibrationConfig.instanceName (   self)
Return the instance name for this block

Definition at line 83 of file PhotonAnalysisConfig.py.

83  def instanceName (self) :
84  """Return the instance name for this block"""
85  return self.containerName + self.postfix
86 
87 

◆ makeAlgs()

def python.PhotonAnalysisConfig.PhotonCalibrationConfig.makeAlgs (   self,
  config 
)

Definition at line 125 of file PhotonAnalysisConfig.py.

125  def makeAlgs (self, config) :
126 
127  log = logging.getLogger('PhotonCalibrationConfig')
128 
129  postfix = self.postfix
130  if postfix != '' and postfix[0] != '_' :
131  postfix = '_' + postfix
132 
133  if self.forceFullSimConfigForP4:
134  log.warning("You are running PhotonCalibrationConfig forcing full sim config for P4 corrections")
135  log.warning("This is only intended to be used for testing purposes")
136 
137  if config.isPhyslite() :
138  config.setSourceName (self.containerName, "AnalysisPhotons")
139  else :
140  config.setSourceName (self.containerName, "Photons")
141 
142  cleaningWP = 'NoTime' if self.cleaningAllowLate else ''
143 
144  # Decorate calo cluster eta if required
145  if self.decorateCaloClusterEta:
146  alg = config.createAlgorithm( 'CP::EgammaCaloClusterEtaAlg',
147  'ElectronEgammaCaloClusterEtaAlg',
148  reentrant=True )
149  alg.particles = config.readName(self.containerName)
150  config.addOutputVar (self.containerName, 'caloEta2', 'caloEta2', noSys=True)
151 
152  # Set up a shallow copy to decorate
153  if config.wantCopy (self.containerName) :
154  alg = config.createAlgorithm( 'CP::AsgShallowCopyAlg', 'PhotonShallowCopyAlg' )
155  alg.input = config.readName (self.containerName)
156  alg.output = config.copyName (self.containerName)
157 
158  # Set up the eta-cut on all photons prior to everything else
159  alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonEtaCutAlg' )
160  alg.selectionDecoration = 'selectEta' + postfix + ',as_bits'
161  config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
162  alg.selectionTool.maxEta = self.maxEta
163  if self.crackVeto:
164  alg.selectionTool.etaGapLow = 1.37
165  alg.selectionTool.etaGapHigh = 1.52
166  alg.selectionTool.useClusterEta = True
167  alg.particles = config.readName (self.containerName)
168  alg.preselection = config.getPreselection (self.containerName, '')
169  config.addSelection (self.containerName, '', alg.selectionDecoration)
170 
171  # Setup shower shape fudge
172  if self.recomputeIsEM and config.dataType() is DataType.FullSim:
173  alg = config.createAlgorithm( 'CP::PhotonShowerShapeFudgeAlg',
174  'PhotonShowerShapeFudgeAlg' )
175  config.addPrivateTool( 'showerShapeFudgeTool',
176  'ElectronPhotonVariableCorrectionTool' )
177  if config.geometry is LHCPeriod.Run2:
178  alg.showerShapeFudgeTool.ConfigFile = \
179  'EGammaVariableCorrection/TUNE25/ElPhVariableNominalCorrection.conf'
180  if config.geometry is LHCPeriod.Run3:
181  alg.showerShapeFudgeTool.ConfigFile = \
182  'EGammaVariableCorrection/TUNE23/ElPhVariableNominalCorrection.conf'
183  alg.photons = config.readName (self.containerName)
184  alg.photonsOut = config.copyName (self.containerName)
185  alg.preselection = config.getPreselection (self.containerName, '')
186 
187  # Select photons only with good object quality.
188  alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonObjectQualityAlg' )
189  alg.selectionDecoration = 'goodOQ,as_bits'
190  config.addPrivateTool( 'selectionTool', 'CP::EgammaIsGoodOQSelectionTool' )
191  alg.selectionTool.Mask = xAOD.EgammaParameters.BADCLUSPHOTON
192  alg.particles = config.readName (self.containerName)
193  alg.preselection = config.getPreselection (self.containerName, '')
194  config.addSelection (self.containerName, '', alg.selectionDecoration)
195 
196  # Select clean photons
197  if self.enableCleaning:
198  alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonCleaningAlg' )
199  config.addPrivateTool( 'selectionTool', 'CP::AsgFlagSelectionTool' )
200  alg.selectionDecoration = 'isClean,as_bits'
201  alg.selectionTool.selectionFlags = ['DFCommonPhotonsCleaning' + cleaningWP]
202  alg.particles = config.readName (self.containerName)
203  alg.preselection = config.getPreselection (self.containerName, '')
204  config.addSelection (self.containerName, '', alg.selectionDecoration)
205 
206  # Change the origin of Photons from (0,0,0) to (0,0,z)
207  # where z comes from the position of a vertex
208  # Default the one tagged as Primary
209  alg = config.createAlgorithm( 'CP::PhotonOriginCorrectionAlg',
210  'PhotonOriginCorrectionAlg',
211  reentrant=True )
212  alg.photons = config.readName (self.containerName)
213  alg.photonsOut = config.copyName (self.containerName)
214  alg.preselection = config.getPreselection (self.containerName, '')
215 
216  if not self.splitCalibrationAndSmearing :
217  # Set up the calibration and smearing algorithm:
218  alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonCalibrationAndSmearingAlg')
219  if config.isPhyslite() and not self.recalibratePhyslite :
220  alg.skipNominal = True
221  else:
222  # This splits the EgammaCalibrationAndSmearingTool into two
223  # steps. The first step applies a baseline calibration that
224  # is not affected by systematics. The second step then
225  # applies the systematics dependent corrections. The net
226  # effect is that the slower first step only has to be run
227  # once, while the second is run once per systematic.
228  #
229  # For now (22 May 24) this has to happen in the same job, as
230  # the output of the first step is not part of PHYSLITE, and
231  # even for the nominal the output of the first and second
232  # step are different. In the future the plan is to put both
233  # the output of the first and second step into PHYSLITE,
234  # allowing to skip the first step when running on PHYSLITE.
235  #
236  # WARNING: All of this is experimental, see: ATLASG-2358
237 
238  # Set up the calibration algorithm:
239  alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonBaseCalibrationAlg')
240  # turn off systematics for the calibration step
241  alg.noToolSystematics = True
242  # turn off smearing for the calibration step
243  alg.calibrationAndSmearingTool.doSmearing = False
244 
245  # Set up the smearing algorithm:
246  alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonCalibrationSystematicsAlg')
247  # turn off scale corrections for the smearing step
248  alg.calibrationAndSmearingTool.doScaleCorrection = False
249  alg.calibrationAndSmearingTool.useMVACalibration = False
250  alg.calibrationAndSmearingTool.decorateEmva = False
251 
252  if not self.applyIsolationCorrection:
253  log.warning("You are not applying the isolation corrections")
254  log.warning("This is only intended to be used for testing purposes")
255 
256  if self.minPt > 0:
257 
258  # Set up the the pt selection
259  alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonPtCutAlg' )
260  alg.selectionDecoration = 'selectPt' + postfix + ',as_bits'
261  config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
262  alg.selectionTool.minPt = self.minPt
263  alg.particles = config.readName (self.containerName)
264  alg.preselection = config.getPreselection (self.containerName, '')
265  config.addSelection (self.containerName, '', alg.selectionDecoration,
266  preselection=True)
267 
268  # Set up the isolation correction algorithm.
269  if self.applyIsolationCorrection:
270 
271  if self.forceFullSimConfigForIso:
272  log.warning("You are running PhotonCalibrationConfig forcing full sim config for isolation corrections")
273  log.warning("This is only intended to be used for testing purposes")
274 
275  alg = config.createAlgorithm( 'CP::EgammaIsolationCorrectionAlg',
276  'PhotonIsolationCorrectionAlg' )
277  config.addPrivateTool( 'isolationCorrectionTool',
278  'CP::IsolationCorrectionTool' )
279  alg.isolationCorrectionTool.IsMC = config.dataType() is not DataType.Data
280  alg.isolationCorrectionTool.AFII_corr = (
281  0 if self.forceFullSimConfigForIso
282  else config.dataType() is DataType.FastSim)
283  alg.egammas = config.readName (self.containerName)
284  alg.egammasOut = config.copyName (self.containerName)
285  alg.preselection = config.getPreselection (self.containerName, '')
286 
287  # Additional decorations
288  alg = config.createAlgorithm( 'CP::AsgEnergyDecoratorAlg', 'EnergyDecorator' )
289  alg.particles = config.readName (self.containerName)
290 
291  config.addOutputVar (self.containerName, 'pt', 'pt')
292  config.addOutputVar (self.containerName, 'eta', 'eta', noSys=True)
293  config.addOutputVar (self.containerName, 'phi', 'phi', noSys=True)
294  config.addOutputVar (self.containerName, 'e_%SYS%', 'e')
295 
296  # decorate truth information on the reconstructed object:
297  if self.decorateTruth and config.dataType() is not DataType.Data:
298  config.addOutputVar (self.containerName, "truthType", "truth_type", noSys=True)
299  config.addOutputVar (self.containerName, "truthOrigin", "truth_origin", noSys=True)
300 
301 

◆ makeCalibrationAndSmearingAlg()

def python.PhotonAnalysisConfig.PhotonCalibrationConfig.makeCalibrationAndSmearingAlg (   self,
  config,
  name 
)
Create the calibration and smearing algorithm

Factoring this out into its own function, as we want to
instantiate it in multiple places

Definition at line 88 of file PhotonAnalysisConfig.py.

88  def makeCalibrationAndSmearingAlg (self, config, name) :
89  """Create the calibration and smearing algorithm
90 
91  Factoring this out into its own function, as we want to
92  instantiate it in multiple places"""
93  log = logging.getLogger('PhotonCalibrationConfig')
94 
95  # Set up the calibration and smearing algorithm:
96  alg = config.createAlgorithm( 'CP::EgammaCalibrationAndSmearingAlg', name )
97  config.addPrivateTool( 'calibrationAndSmearingTool',
98  'CP::EgammaCalibrationAndSmearingTool' )
99  # Set default ESModel per period
100  if self.ESModel:
101  alg.calibrationAndSmearingTool.ESModel = self.ESModel
102  else:
103  if config.geometry() is LHCPeriod.Run2:
104  alg.calibrationAndSmearingTool.ESModel = 'es2023_R22_Run2_v1'
105  elif config.geometry() is LHCPeriod.Run3:
106  alg.calibrationAndSmearingTool.ESModel = 'es2024_Run3_v0'
107  elif config.geometry() is LHCPeriod.Run4:
108  log.warning("No ESModel set for Run4, using Run3 model")
109  alg.calibrationAndSmearingTool.ESModel = 'es2024_Run3_v0'
110  else:
111  raise ValueError (f"Can't set up the ElectronCalibrationConfig with {config.geometry().value}, "
112  "there must be something wrong!")
113 
114  alg.calibrationAndSmearingTool.decorrelationModel = self.decorrelationModel
115  alg.calibrationAndSmearingTool.useFastSim = (
116  0 if self.forceFullSimConfigForP4
117  else int( config.dataType() is DataType.FastSim ))
118  alg.calibrationAndSmearingTool.decorateEmva = self.decorateEmva
119  alg.egammas = config.readName (self.containerName)
120  alg.egammasOut = config.copyName (self.containerName)
121  alg.preselection = config.getPreselection (self.containerName, '')
122  return alg
123 
124 

The documentation for this class was generated from the following file:
python.processes.powheg.ZZj_MiNNLO.ZZj_MiNNLO.__init__
def __init__(self, base_directory, **kwargs)
Constructor: all process options are set here.
Definition: ZZj_MiNNLO.py:18
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45