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  self.addOption ('decorateTruth', False, type=bool,
76  info="decorate truth particle information on the reconstructed one")
77  self.addOption ('decorateCaloClusterEta', False, type=bool,
78  info="decorate the calo cluster eta on the reconstructed one")
79  self.addOption ('decorateEmva', False, type=bool,
80  info="decorate E_mva_only on the objects (needed for columnar tools/PHYSLITE)")
81 

Member Function Documentation

◆ instanceName()

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

Definition at line 82 of file PhotonAnalysisConfig.py.

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

◆ makeAlgs()

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

Definition at line 124 of file PhotonAnalysisConfig.py.

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

◆ 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 87 of file PhotonAnalysisConfig.py.

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

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