ATLAS Offline Software
Loading...
Searching...
No Matches
TrigCaloRecConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3from AthenaCommon.SystemOfUnits import MeV, deg
4from AthenaCommon.Logging import logging
5from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6from AthenaConfiguration.ComponentFactory import CompFactory
7from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool
8from AthenaConfiguration.AccumulatorCache import AccumulatorCache
9from TriggerMenuMT.HLT.CommonSequences.FullScanDefs import em_clusters, lc_clusters, fs_towers, fs_cells
10
11from TrigEDMConfig.TriggerEDM import recordable
12
13mlog = logging.getLogger ('TrigCaloRecConfig')
14
15
16def trigCaloClusterMonitoringTool(flags, doMonCells = False, isFullScan = None):
17 """Monitoring tool for TrigCaloClusterMaker"""
18
19 monTool = GenericMonitoringTool(flags, 'MonTool')
20
21 if isFullScan is None:
22 isFullScan = doMonCells
23
24 maxNumberOfClusters = 1200 if isFullScan else 50
25
26 monTool.defineHistogram('container_size', path='EXPERT', type='TH1F', title="Container Size; Number of Clusters; Number of Events", xbins=50, xmin=0.0, xmax=maxNumberOfClusters)
27 monTool.defineHistogram('container_size_by_mu', path='EXPERT', type='TH1F', title="Container Size; Number of Clusters; Number of Events", xbins=50, xmin=0.0, xmax=maxNumberOfClusters/60)
28 monTool.defineHistogram('Et', path='EXPERT', type='TH1F', title="Cluster E_T; E_T [ MeV ] ; Number of Clusters", xbins=135, xmin=-200.0, xmax=2500.0)
29 monTool.defineHistogram('Eta', path='EXPERT', type='TH1F', title="Cluster #eta; #eta ; Number of Clusters", xbins=100, xmin=-2.5, xmax=2.5)
30 monTool.defineHistogram('Phi', path='EXPERT', type='TH1F', title="Cluster #phi; #phi ; Number of Clusters", xbins=64, xmin=-3.2, xmax=3.2)
31 monTool.defineHistogram('Eta,Phi', path='EXPERT', type='TH2F', title="Number of Clusters; #eta ; #phi ; Number of Clusters", xbins=100, xmin=-2.5, xmax=2.5, ybins=128, ymin=-3.2, ymax=3.2)
32 monTool.defineHistogram('clusterSize', path='EXPERT', type='TH1F', title="Cluster Type; Type ; Number of Clusters", xbins=13, xmin=0.5, xmax=13.5)
33 monTool.defineHistogram('signalState', path='EXPERT', type='TH1F', title="Signal State; Signal State ; Number of Clusters", xbins=4, xmin=-1.5, xmax=2.5)
34 monTool.defineHistogram('size', path='EXPERT', type='TH1F', title="Cluster Size; Size [Cells] ; Number of Clusters", xbins=125, xmin=0.0, xmax=250.0)
35 monTool.defineHistogram('N_BAD_CELLS', path='EXPERT', type='TH1F', title="N_BAD_CELLS; N_BAD_CELLS ; Number of Clusters", xbins=250, xmin=0.5, xmax=250.5)
36 monTool.defineHistogram('ENG_FRAC_MAX', path='EXPERT', type='TH1F', title="ENG_FRAC_MAX; ENG_FRAC_MAX ; Number of Clusters", xbins=50, xmin=0.0, xmax=1.1)
37 monTool.defineHistogram('mu', path='EXPERT', type='TH1F', title="mu; mu; Number of Events", xbins=50, xmin=0.0, xmax=100)
38 monTool.defineHistogram('mu,container_size', path='EXPERT', type='TH2F', title="Container Size versus #mu; #mu; cluster container size", xbins=50, xmin=20.0, xmax=70, ybins=50, ymin=0.0, ymax=maxNumberOfClusters)
39
40 if doMonCells:
41 monTool.defineHistogram('count_1thrsigma', path='EXPERT', type='TH1F', title="count_1thrsigma; count_1thresigma; Number of Events", xbins=60, xmin=0.0, xmax=12e3)
42 monTool.defineHistogram('count_2thrsigma', path='EXPERT', type='TH1F', title="count_2thrsigma; count_2thresigma; Number of Events", xbins=60, xmin=0.0, xmax=6e3)
43 monTool.defineHistogram('count_1thrsigma_by_mu2', path='EXPERT', type='TH1F', title="count_1thrsigma_by_mu2; count_1thresigma_by_mu2; Number of Events", xbins=50, xmin=0.0, xmax=10)
44 monTool.defineHistogram('count_2thrsigma_by_mu2', path='EXPERT', type='TH1F', title="count_2thrsigma_by_mu2; count_2thresigma_by_mu2; Number of Events", xbins=50, xmin=0.0, xmax=5)
45 monTool.defineHistogram('mu,count_1thrsigma', path='EXPERT', type='TH2F', title="nCells above 1st thr versus #mu; #mu; nCells", xbins=50, xmin=20.0, xmax=70, ybins=60, ymin=0.0, ymax=12e3)
46 monTool.defineHistogram('mu,count_2thrsigma', path='EXPERT', type='TH2F', title="nCells above 2nd thr versus #mu; #mu; nCells", xbins=50, xmin=20.0, xmax=70, ybins=60, ymin=0.0, ymax=6e3)
47
48 return monTool
49
50def hltCaloGlobalCellMakerCfg(flags, name="HLTCaloGlobalCellMaker", **kwargs):
51 acc = ComponentAccumulator()
52
53 kwargs.setdefault("InputCellKey", "Calo")
54 kwargs.setdefault("OutputCellKey", "OutCalo")
55 kwargs.setdefault("MaxNCellsPerFEB", 30)
56
57 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
58 acc.merge(CaloNoiseCondAlgCfg(flags))
59
60 acc.addEventAlgo(CompFactory.HLTCaloGlobalCellMaker(name, **kwargs))
61 return(acc)
62
63def hltCaloGlobalCellMonitorCfg(flags, name="HLTCaloGlobalCellMonitor", **kwargs):
64 acc = ComponentAccumulator()
65
66 from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool
67 monTool = GenericMonitoringTool(flags, 'MonTool'+name)
68 monTool.defineHistogram('inputContSize', path='EXPERT', type='TH1F', title="InputContSize; InputContSize; events", xbins=190, xmin=0, xmax=190000)
69 monTool.defineHistogram('outputContSize', path='EXPERT', type='TH1F', title="outputContSize; outputContSize; events", xbins=200, xmin=0, xmax=20000)
70 monTool.defineHistogram('larContSize', path='EXPERT', type='TH1F', title="larContSize; larContSize; events", xbins=190, xmin=0, xmax=190000)
71 monTool.defineHistogram('larAboveSigmaContSize', path='EXPERT', type='TH1F', title="larAboveSigmaContSize; larAboveSigmaContSize; events", xbins=150, xmin=0, xmax=15000)
72 monTool.defineHistogram('CellsPerFEB', path='EXPERT', type='TH1F', title="CellsPerFEB; CellsPerFEB; counts ", xbins=128, xmin=0, xmax=128)
73 monTool.defineHistogram('FEBID,CellsPerFEB', path='EXPERT', type='TH2F', title="CellsPerFEB; CellsPerFEB; FEBID", xbins=1524, xmin=0x38000000, xmax=0x3bc60000, ybins=128, ymin=0, ymax=128)
74 monTool.defineHistogram('layer0', path='EXPERT', type='TH1F', title="layer0; layer0; counts ", xbins=128, xmin=0, xmax=128)
75 monTool.defineHistogram('layer1', path='EXPERT', type='TH1F', title="layer1; layer1; counts ", xbins=128, xmin=0, xmax=128)
76 monTool.defineHistogram('layer2', path='EXPERT', type='TH1F', title="layer2; layer2; counts ", xbins=128, xmin=0, xmax=128)
77 monTool.defineHistogram('layer3', path='EXPERT', type='TH1F', title="layer3; layer3; counts ", xbins=128, xmin=0, xmax=128)
78 monTool.defineHistogram('layer4', path='EXPERT', type='TH1F', title="layer4; layer4; counts ", xbins=128, xmin=0, xmax=128)
79 monTool.defineHistogram('layer5', path='EXPERT', type='TH1F', title="layer5; layer5; counts ", xbins=128, xmin=0, xmax=128)
80 monTool.defineHistogram('layer6', path='EXPERT', type='TH1F', title="layer6; layer6; counts ", xbins=128, xmin=0, xmax=128)
81 monTool.defineHistogram('layer7', path='EXPERT', type='TH1F', title="layer7; layer7; counts ", xbins=128, xmin=0, xmax=128)
82 monTool.defineHistogram('layerIW1', path='EXPERT', type='TH1F', title="layerIW1; layerIW1; counts ", xbins=128, xmin=0, xmax=128)
83 monTool.defineHistogram('layerIW2', path='EXPERT', type='TH1F', title="layerIW2; layerIW2; counts ", xbins=128, xmin=0, xmax=128)
84 monTool.defineHistogram('BCID,layerIW1', path='EXPERT', type='TH2F', title="BCID_vs_layerIW1; BCID; layerIW1; ", xbins=512, xmin=0, xmax=512, ybins=128, ymin=0, ymax=128)
85 monTool.defineHistogram('BCID,layerIW2', path='EXPERT', type='TH2F', title="BCID_vs_layerIW2; BCID; layerIW2;", xbins=512, xmin=0, xmax=512, ybins=128, ymin=0, ymax=128)
86 kwargs.setdefault("MonitoringTool", monTool)
87
88 kwargs.setdefault("MaxNCellsPerFEB", 128 )
89 kwargs.setdefault("NumberOfSigma", 2)
90 acc.addEventAlgo(CompFactory.HLTCaloGlobalCellMonitor(name, **kwargs))
91 return(acc)
92
93@AccumulatorCache
94def hltCaloCellMakerCfg(flags, name=None, roisKey='UNSPECIFIED', CellsName=None, monitorCells=False, doLC=False, doTile=False, sequenceName=None):
95 acc = ComponentAccumulator()
96 from TrigT2CaloCommon.TrigCaloDataAccessConfig import trigCaloDataAccessSvcCfg, CaloDataAccessSvcDependencies
97 acc.merge(trigCaloDataAccessSvcCfg(flags))
98 #choose RoI for fullscan
99 if (roisKey == 'UNSPECIFIED'):
100 from HLTSeeding.HLTSeedingConfig import mapThresholdToL1RoICollection
101 roisKey = mapThresholdToL1RoICollection("FSNOSEED")
102 # choose cells name given parameters
103 cellsFromName = 'CaloCellsFS' if "FS" in name else "CaloCells"
104 cells = cellsFromName if CellsName is None else CellsName
105
106 from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool
107 monTool = GenericMonitoringTool(flags, 'MonTool')
108 monTool.defineHistogram('Cells_N', path='EXPERT', type='TH1F', title="Cells N; NCells; events",
109 xbins=40, xmin=0, xmax=1600 if monitorCells else 240000)
110 monTool.defineHistogram('TIME_exec', path='EXPERT', type='TH1F', title="Cells time; time [ us ] ; Nruns",
111 xbins=80, xmin=0, xmax=800 if monitorCells else 160000)
112 if monitorCells:
113 monTool.defineHistogram('Cells_eT', path='EXPERT', type='TH1F', title="Cells E_T; E_T [ GeV ] ; Nclusters",
114 xbins=100, xmin=0.0, xmax=100.0)
115 monTool.defineHistogram('Cells_eta', path='EXPERT', type='TH1F', title="Cells #eta; #eta ; Nclusters",
116 xbins=100, xmin=-2.5, xmax=2.5)
117 monTool.defineHistogram('Cells_phi', path='EXPERT', type='TH1F', title="Cells #phi; #phi ; Nclusters",
118 xbins=128, xmin=-3.2, xmax=3.2)
119
120 if sequenceName is not None:
121 from AthenaCommon.CFElements import parOR
122 acc.merge(ComponentAccumulator(parOR(sequenceName)))
123 cellMaker = CompFactory.HLTCaloCellMaker(name,
124 CellsName = cells,
125 TrigDataAccessMT = acc.getService('TrigCaloDataAccessSvc'),
126 ExtraInputs = CaloDataAccessSvcDependencies,
127 RoIs=roisKey,
128 monitorCells = monitorCells,
129 MonTool = monTool,
130 TileCellsInROI = False if not doTile else True)
131 acc.addEventAlgo(cellMaker, primary=True,sequenceName=sequenceName)
132 return acc
133
134@AccumulatorCache
135def hltCaloCellCorrectorCfg(flags,name='HLTCaloCellCorrector', inputEDM='CellsClusters', outputEDM='CorrectedCellsClusters', eventShape='HIEventShape'):
136 acc = ComponentAccumulator()
137 cellCorrector = CompFactory.HLTCaloCellCorrector(name = name,
138 EventShapeCollection = eventShape,
139 InputCellKey = inputEDM,
140 OutputCellKey = outputEDM)
141 acc.addEventAlgo(cellCorrector)
142 return acc
143
144
145@AccumulatorCache
146def hltCaloCellSeedlessMakerCfg(flags, roisKey='UNSPECIFIED',sequenceName=None):
147 acc = ComponentAccumulator()
148 hltCaloCellMakerAcc = hltCaloCellMakerCfg(flags, "CaloCellSeedLessFS",
149 roisKey = roisKey,
150 CellsName ="SeedLessFS",
151 monitorCells=False)
152
153 acc.merge(hltCaloCellMakerAcc,sequenceName=sequenceName)
154
155 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
156 acc.merge(CaloNoiseCondAlgCfg(flags, noisetype="electronicNoise"))
157 acc.addCondAlgo(CompFactory.CaloNoiseSigmaDiffCondAlg())
158
159 return acc
160
161
162@AccumulatorCache
163def L0CaloGlobalRoIBuilderCfg(flags,DoNoiseThrRings=True):
164 acc = ComponentAccumulator()
165 from TrigT2CaloEgamma.TrigT2CaloEgammaConfig import RingerReFexConfig
166 nameTool='RingerGlobalFex'
167 nameAlgo='L0CaloGlobalRoIBuilder'
168 nameContCalo='CaloClustersGlobal'
169 nameContRinger='RingerGlobal'
170 if ( DoNoiseThrRings ):
171 nameTool='RingerGlobal2sigFex'
172 nameAlgo='L0CaloGlobalRoI2sigBuilder'
173 nameContCalo='CaloClusters2sigGlobal'
174 nameContRinger='Ringer2sigGlobal'
175 ringer = RingerReFexConfig(flags,name=nameTool,RingerKey='NOTNEEDED',
176 ClustersName=nameContCalo,DoNoiseThrRings=DoNoiseThrRings)
177 from AthenaCommon.CFElements import parOR
178 accSeq = ComponentAccumulator(parOR("HLTBeginSeq"))
179 L0CaloGlobalRoIBuilderAlg = CompFactory.CaloGlobalRoIBuilder(name=nameAlgo,
180 Cells ="SeedLessFS", ClustersName=nameContCalo,
181 RingerKey=nameContRinger,
182 RingerTool=ringer )
183 accSeq.addEventAlgo(L0CaloGlobalRoIBuilderAlg, sequenceName="HLTBeginSeq")
184
185 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
186 acc.merge(CaloNoiseCondAlgCfg(flags))
187 acc.merge(accSeq)
188
189 return acc
190
191def CaloL0RingerPreCfg(flags,DoNoiseThrRings=True):
192 flags.Trigger.ExtraEDMList+= CaloL0RingerPrepareList(DoNoiseThrRings)
193
194def CaloL0RingerPrepareList(DoNoiseThrRings=True):
195 extraEDMList=[]
196 if DoNoiseThrRings :
197 extraEDMList+=[('xAOD::TrigRingerRingsContainer#Ringer2sigGlobal', 'BS ESD AODFULL', 'Calo'), ('xAOD::TrigRingerRingsAuxContainer#Ringer2sigGlobalAux.', 'BS ESD AODFULL', 'Calo'), ('xAOD::TrigEMClusterContainer#CaloClusters2sigGlobal', 'BS ESD AODFULL', 'Calo'), ('xAOD::TrigEMClusterAuxContainer#CaloClusters2sigGlobalAux.', 'BS ESD AODFULL', 'Calo')]
198 else :
199 extraEDMList+=[('xAOD::TrigRingerRingsContainer#RingerGlobal', 'BS ESD AODFULL', 'Calo'), ('xAOD::TrigRingerRingsAuxContainer#RingerGlobalAux.', 'BS ESD AODFULL', 'Calo'), ('xAOD::TrigEMClusterContainer#CaloClustersGlobal', 'BS ESD AODFULL', 'Calo'), ('xAOD::TrigEMClusterAuxContainer#CaloClustersGlobalAux.', 'BS ESD AODFULL', 'Calo')]
200 return extraEDMList
201
202def CaloL0RingerCfg(flags,DoNoiseThrRings=True):
203 from OutputStreamAthenaPool.OutputStreamConfig import addToESD,addToAOD
204 extraContent=CaloL0RingerPrepareList(DoNoiseThrRings)
205 acc = ComponentAccumulator()
206 from AthenaCommon.CFElements import parOR
207 if (flags.Output.doWriteRDO):
208 sequencerName = "L1GlobalSimSeq" if flags.Trigger.L1.doGlobal else "HLTBeginSeq"
209 accSeq = ComponentAccumulator(parOR(sequencerName))
210 accSeq.merge(hltCaloCellSeedlessMakerCfg(flags, roisKey=''), sequenceName=sequencerName)
211 accSeq.merge(L0CaloGlobalRoIBuilderCfg(flags,DoNoiseThrRings=DoNoiseThrRings))
212 acc.merge(accSeq)
213
214 if (flags.Output.doWriteESD or flags.Output.doWriteAOD):
215 if ( flags.Output.doWriteESD ):
216 acc.merge(addToESD(flags, extraContent))
217 if ( flags.Output.doWriteAOD ):
218 acc.merge(addToAOD(flags, extraContent))
219 return acc
220
221
222
223def hltCaloLocalCalib(flags, name = "TrigLocalCalib"):
224 det_version_is_rome = flags.GeoModel.AtlasVersion.startswith("Rome")
225 localCalibTool = CompFactory.CaloLCWeightTool("TrigLCWeight",
226 CorrectionKey="H1ClusterCellWeights",
227 SignalOverNoiseCut=2.0, UseHadProbability=True)
228 trigLCClassify = CompFactory.CaloLCClassificationTool("TrigLCClassify",
229 ClassificationKey="EMFracClassify",
230 UseSpread=False, MaxProbability=0.85 if det_version_is_rome else 0.5,
231 UseNormalizedEnergyDensity=not det_version_is_rome,
232 StoreClassificationProbabilityInAOD=True)
233 tool = CompFactory.CaloClusterLocalCalib( name,
234 ClusterRecoStatus=[1, 2], ClusterClassificationTool=[ trigLCClassify ],
235 LocalCalibTools=[ localCalibTool ])
236 return tool
237
238
239def hltCaloOOCalib(flags, name = "TrigOOCCalib"):
240 localCalibTool = CompFactory.CaloLCOutOfClusterTool("TrigLCOut",
241 CorrectionKey="OOCCorrection",UseEmProbability=False,
242 UseHadProbability=True)
243 tool = CompFactory.CaloClusterLocalCalib( name,
244 ClusterRecoStatus=[1, 2],
245 LocalCalibTools=[ localCalibTool ] )
246 return tool
247
248def hltCaloOOCPi0Calib(flags, name = "TrigOOCPi0Calib" ):
249 localCalibTool = CompFactory.CaloLCOutOfClusterTool("TrigLCOutPi0",
250 CorrectionKey="OOCPi0Correction", UseEmProbability=True,
251 UseHadProbability=False)
252 tool = CompFactory.CaloClusterLocalCalib( name,
253 ClusterRecoStatus=[1, 2],
254 LocalCalibTools=[ localCalibTool ] )
255 return tool
256
257def hltCaloDMCalib(flags, name = "TrigDMCalib" ):
258 localCalibTool = CompFactory.CaloLCDeadMaterialTool("TrigLCDeadMaterial",
259 HadDMCoeffKey="HadDMCoeff2", ClusterRecoStatus=0,
260 WeightModeDM=2,UseHadProbability=True)
261 tool = CompFactory.CaloClusterLocalCalib( name,
262 ClusterRecoStatus=[1, 2],
263 LocalCalibTools=[ localCalibTool ] )
264 return tool
265
266
267
268@AccumulatorCache
269def hltTopoClusterMakerCfg(flags, name, clustersKey="HLT_TopoCaloClustersFS", cellsKey=None, doLC=False, suffix=''):
270 acc = ComponentAccumulator()
271 cellsFromName = 'CaloCellsFS' if "FS" in clustersKey else "CaloCells"
272 cells = cellsFromName if cellsKey is None else cellsKey
273
274 from CaloRec.CaloTopoClusterConfig import (
275 CaloTopoClusterToolCfg,
276 CaloTopoClusterSplitterToolCfg,
277 )
278
279 topoMaker = acc.popToolsAndMerge(CaloTopoClusterToolCfg(flags, cellsname=cells))
280 topoMaker.RestrictPSNeighbors = False
281 listClusterCorrectionTools = []
282 if doLC :
283 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
284 # We need the electronic noise for the LC weights
285 acc.merge(CaloNoiseCondAlgCfg(flags, noisetype="electronicNoise"))
286 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
287 acc.merge(caloTopoCoolFolderCfg(flags))
288 listClusterCorrectionTools = [ hltCaloLocalCalib(flags), hltCaloOOCalib(flags),
289 hltCaloOOCPi0Calib(flags), hltCaloDMCalib(flags) ]
290
291 #timing
292 topoMaker.SeedCutsInT = flags.Trigger.Calo.TopoCluster.doTimeCut
293 topoMaker.CutOOTseed = flags.Trigger.Calo.TopoCluster.extendTimeCut and flags.Trigger.Calo.TopoCluster.doTimeCut
294 topoMaker.UseTimeCutUpperLimit = flags.Trigger.Calo.TopoCluster.useUpperLimitForTimeCut
295 topoMaker.TimeCutUpperLimit = flags.Trigger.Calo.TopoCluster.timeCutUpperLimit
296
297 topoSplitter = acc.popToolsAndMerge(CaloTopoClusterSplitterToolCfg(flags))
298
299 topoMoments = CompFactory.CaloClusterMomentsMaker ('TrigTopoMoments')
300 topoMoments.MaxAxisAngle = 20*deg
301 topoMoments.TwoGaussianNoise = flags.Calo.TopoCluster.doTwoGaussianNoise
302 topoMoments.MinBadLArQuality = 4000
303 topoMoments.MomentsNames = ['FIRST_PHI',
304 'FIRST_ETA',
305 'SECOND_R' ,
306 'SECOND_LAMBDA',
307 'DELTA_PHI',
308 'DELTA_THETA',
309 'DELTA_ALPHA' ,
310 'CENTER_X',
311 'CENTER_Y',
312 'CENTER_Z',
313 'CENTER_MAG',
314 'CENTER_LAMBDA',
315 'LATERAL',
316 'LONGITUDINAL',
317 'FIRST_ENG_DENS',
318 'ENG_FRAC_EM',
319 'ENG_FRAC_MAX',
320 'ENG_FRAC_CORE' ,
321 'FIRST_ENG_DENS',
322 'SECOND_ENG_DENS',
323 'ISOLATION',
324 'ENG_BAD_CELLS',
325 'N_BAD_CELLS',
326 'N_BAD_CELLS_CORR',
327 'BAD_CELLS_CORR_E',
328 'BADLARQ_FRAC',
329 'ENG_POS',
330 'SIGNIFICANCE',
331 'CELL_SIGNIFICANCE',
332 'CELL_SIG_SAMPLING',
333 'AVG_LAR_Q',
334 'AVG_TILE_Q'
335 ]
336
337 clustermakername = name + suffix
338 doMonCells = "FS" in clustermakername
339
340 clustersKey_final = clustersKey
341 if flags.Trigger.Calo.TopoCluster.applyClusterTimingCut:
342 clustersKey = f"{clustersKey}BeforeTimingCut"
343
344 alg = CompFactory.CaloClusterMaker(
345 clustermakername,
346 ClustersOutputName=clustersKey if "CaloMon" in clustermakername else recordable(clustersKey),
347 ClusterCellLinkOutputName = clustersKey+"_links",
348 ClusterMakerTools = [ topoMaker, topoSplitter, topoMoments],
349 ClusterCorrectionTools = listClusterCorrectionTools,
350 SaveUncalibratedSignalState = True,
351 WriteTriggerSpecificInfo = True)
352
353 if flags.Trigger.Calo.TopoCluster.applyClusterTimingCut:
354 from CaloRec.CaloTopoClusterConfig import CaloClusterTimingFilterCfg
355 acc.merge(CaloClusterTimingFilterCfg(flags, name = f"{clustersKey}Filter", InputClusters = clustersKey, OutputClusters = clustersKey_final))
356
357 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
358 acc.merge(CaloNoiseCondAlgCfg(flags))
359 acc.addEventAlgo(alg, primary=True)
360 monitor = CompFactory.TrigCaloClusterMonitor(name + 'Monitoring' + suffix,
361 CellsName = cells,
362 ClustersName = clustersKey_final,
363 MonitorCells = doMonCells,
364 MonitoringTool = trigCaloClusterMonitoringTool(flags, doMonCells))
365 acc.addEventAlgo(monitor, primary=False)
366 return acc
367
368
369
370def hltCaloTopoClusterCalibratorCfg(flags, name, clustersin, clustersout, **kwargs):
371 """ Create the LC calibrator """
372 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
373
374 # We need the electronic noise for the LC weights
375 acc = ComponentAccumulator()
376 acc.merge(CaloNoiseCondAlgCfg(flags, noisetype="electronicNoise"))
377
378 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
379 acc.merge(caloTopoCoolFolderCfg(flags))
380
381 calibrator = CompFactory.TrigCaloClusterCalibrator(
382 name, InputClusters=clustersin, OutputClusters=clustersout,
383 **kwargs
384 #OutputCellLinks = clustersout+"_cellLinks", **kwargs
385 )
386
387 calibrator.ClusterCorrectionTools = [ hltCaloLocalCalib(flags), hltCaloOOCalib(flags),
388 hltCaloOOCPi0Calib(flags), hltCaloDMCalib(flags) ]
389 #NB: Could we take these from CaloRec.CaloTopoClusterConfig.getTopoClusterLocalCalibTools?
390
391 # Monitoring
392 monTool = GenericMonitoringTool(flags, "MonTool")
393 monTool.defineHistogram('Et', path='EXPERT', type='TH1F',
394 title="Cluster E_T; E_T [ MeV ] ; Number of Clusters",
395 xbins=135, xmin=-200.0, xmax=2500.0)
396 monTool.defineHistogram('Eta', path='EXPERT', type='TH1F',
397 title="Cluster #eta; #eta ; Number of Clusters",
398 xbins=100, xmin=-2.5, xmax=2.5)
399 monTool.defineHistogram('Phi', path='EXPERT', type='TH1F',
400 title="Cluster #phi; #phi ; Number of Clusters",
401 xbins=64, xmin=-3.2, xmax=3.2)
402 monTool.defineHistogram('Eta,Phi', path='EXPERT', type='TH2F',
403 title="Number of Clusters; #eta ; #phi ; Number of Clusters",
404 xbins=100, xmin=-2.5, xmax=2.5, ybins=128, ymin=-3.2, ymax=3.2)
405 calibrator.MonTool = monTool
406
407 acc.addEventAlgo(calibrator, primary=True)
408 return acc
409
410##################### Unifying all cluster reco algs together ##################
411from TriggerMenuMT.HLT.Egamma.TrigEgammaKeys import getTrigEgammaKeys
412
413
414def hltCaloTopoClusteringCfg(
415 flags, namePrefix=None, nameSuffix=None, CellsName=None, monitorCells=False, roisKey="UNSPECIFIED", clustersKey=None, doLCFS=False, doLC=False, doTile=False):
416 if nameSuffix == "FS":
417 clustersKeyFromName = em_clusters
418 else:
419 TrigEgammaKeys = getTrigEgammaKeys(flags)
420 clustersKeyFromName = TrigEgammaKeys.precisionTopoClusterContainer
421
422 clusters = clustersKeyFromName if clustersKey is None else clustersKey
423 acc = ComponentAccumulator()
424 acc.merge(
425 hltCaloCellMakerCfg(flags, namePrefix+"HLTCaloCellMaker"+nameSuffix, roisKey=roisKey, CellsName=CellsName, monitorCells=monitorCells, doLC=doLC, doTile=doTile)
426 )
427
428 clustermakername_nosuffix = namePrefix + "HLTCaloClusterMaker"
429
430 clustermakername = clustermakername_nosuffix + nameSuffix
431
432 from PyUtils.moduleExists import moduleExists
433 if moduleExists ('CaloRecGPU') and flags.CaloRecGPU.GlobalFlags.UseCaloRecGPU and "FS" in clustermakername:
434 flags = flags.cloneAndReplace("CaloRecGPU.ActiveConfig", "Trigger.CaloRecGPU.Default", True)
435 from CaloRecGPU.CaloRecGPUConfig import GPUCaloTopoClusterCfg
436
437
438 GPUKernelSvc = CompFactory.GPUKernelSizeOptimizerSvc()
439 acc.addService(GPUKernelSvc)
440
441 gpuhyb = GPUCaloTopoClusterCfg(flags,
442 True,
443 CellsName,
444 clustersname = clusters if "CaloMon" in clustermakername else recordable(clusters),
445 name = clustermakername,
446 ReallyUseGPUTools = not flags.CaloRecGPU.GlobalFlags.UseCPUToolsInstead)
447
448 acc.merge(gpuhyb)
449
450 monitorCells = "FS" in clustermakername
451
452 monitor = CompFactory.TrigCaloClusterMonitor(clustermakername_nosuffix + 'Monitoring' + nameSuffix,
453 CellsName = CellsName,
454 ClustersName = clusters,
455 MonitorCells = monitorCells,
456 MonitoringTool = trigCaloClusterMonitoringTool(flags, monitorCells))
457 acc.addEventAlgo(monitor, primary=False)
458
459 else :
460 calt=hltTopoClusterMakerCfg(flags, clustermakername_nosuffix, cellsKey=CellsName, clustersKey=clusters, doLC=doLC, suffix = nameSuffix)
461 acc.merge(calt)
462 if doLCFS:
463 acc.merge( hltCaloTopoClusterCalibratorCfg(
464 flags,
465 "HLTCaloClusterCalibratorLCFS",
466 clustersin=em_clusters,
467 clustersout=lc_clusters,
468 OutputCellLinks=lc_clusters + "_cellLinks",
469 )
470 )
471 return acc
472
473###################################EgammaSpecific TopoClustering####################################
474@AccumulatorCache
475def egammaTopoClusteringCfg(flags, RoIs):
476 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="RoI", CellsName="CaloCells", monitorCells=True, roisKey=RoIs)
477 return cfg
478
479
480@AccumulatorCache
481def egammaTopoClusteringCfg_LRT(flags, RoIs):
482 TrigEgammaKeys_LRT = getTrigEgammaKeys(flags, name = '_LRT')
483 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="RoI_LRT", CellsName="CaloCells", monitorCells=True, roisKey=RoIs, clustersKey=TrigEgammaKeys_LRT.precisionTopoClusterContainer)
484 return cfg
485
486
487###################################JetMetSpecific TopoClustering####################################
488@AccumulatorCache
489def jetmetTopoClusteringCfg(flags, RoIs):
490 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="FS", CellsName="CaloCellsFS", monitorCells=False, roisKey=RoIs)
491 return cfg
492
493@AccumulatorCache
494def jetmetTopoClusteringCfg_LC(flags, RoIs):
495 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="FS", CellsName="CaloCellsFS", monitorCells=False, roisKey=RoIs, doLCFS=True)
496 return cfg
497
498###################################TauSpecific TopoClustering####################################
499@AccumulatorCache
500def tauLCTopoClusteringCfg(flags, RoIs):
501 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="Tau", nameSuffix="LC", CellsName="CaloCellsLC", monitorCells=False, roisKey=RoIs, clustersKey="HLT_TopoCaloClustersLC", doLC=True, doTile=True)
502 return cfg
503
504@AccumulatorCache
505def tauEMTopoClusteringCfg(flags, RoIs):
506 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="Tau", nameSuffix="EM", CellsName="CaloCells", monitorCells=False, roisKey=RoIs, clustersKey="HLT_TopoCaloClustersEM", doLC=False, doTile=True)
507 return cfg
508
509@AccumulatorCache
510def hltCaloTopoClusteringHICfg(
511 flags, CellsName=None, roisKey="UNSPECIFIED", doLC=False, algSuffix='HIRoI', ion=True):
512 TrigEgammaKeys = getTrigEgammaKeys(flags, ion=ion)
513 eventShape = TrigEgammaKeys.egEventShape
514 clustersKey = TrigEgammaKeys.precisionTopoClusterContainer
515 acc = ComponentAccumulator()
516 acc.merge(hltCaloCellMakerCfg(flags, "HLTCaloCellMaker"+algSuffix, roisKey=roisKey, CellsName=CellsName, monitorCells=True))
517 acc.merge(hltCaloCellCorrectorCfg(flags, name='HLTRoICaloCellCorrector', inputEDM='CaloCells', outputEDM='CorrectedRoICaloCells', eventShape=eventShape))
518 acc.merge(hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topo"+algSuffix, clustersKey=clustersKey, cellsKey="CorrectedRoICaloCells"))
519 return acc
520
521@AccumulatorCache
522def hltHICaloTowerMakerCfg(flags, name, towersKey, cellsKey="CaloCellsFS", RoIs=""):
523 acc = ComponentAccumulator()
524 larcmbtwrbldr = CompFactory.LArTowerBuilderTool("LArCmbTwrBldr",
525 CellContainerName = cellsKey,
526 IncludedCalos = [ "LAREM", "LARHEC" ]
527 )
528
529 fcalcmbtwrbldr = CompFactory.LArFCalTowerBuilderTool("FCalCmbTwrBldr",
530 CellContainerName = cellsKey,
531 MinimumEt = 0.*MeV
532 )
533
534 #input to TileTowerBuilder: cells in TILE
535 tilecmbtwrbldr = CompFactory.TileTowerBuilderTool("TileCmbTwrBldr",
536 CellContainerName = cellsKey,
537 # debugging aid, keep for convenience
538 #DumpTowers = False,
539 #DumpWeightMap = False
540 )
541
542
543
544 alg = CompFactory.TrigCaloTowerMaker(name,
545 Cells=cellsKey,
546 CaloTowers=towersKey,
547 NumberOfPhiTowers=64,
548 NumberOfEtaTowers=100,
549 EtaMin=-5.0,
550 EtaMax=5.0,
551 DeltaEta=1.2,
552 DeltaPhi=1.2,
553 RoIs=RoIs,
554 TowerMakerTools = [ tilecmbtwrbldr, larcmbtwrbldr, fcalcmbtwrbldr ]
555 )
556 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
557 acc.merge(CaloNoiseCondAlgCfg(flags))
558 acc.addEventAlgo(alg, primary=True)
559 return acc
560
561@AccumulatorCache
562def hltHICaloClusterMakerCfg(flags, name, towersKey, cellsKey, clustersKey) :
563 """Function to equip HLT HI cluster builder from towers and cells, adds to output AOD stream"""
564 acc = ComponentAccumulator()
565
566
567 alg=CompFactory.HIClusterMaker(name,
568 InputTowerKey=towersKey,
569 CaloCellContainerKey=cellsKey,
570 OutputContainerKey=clustersKey
571 )
572 acc.addEventAlgo(alg, primary=True)
573 return acc
574
575@AccumulatorCache
576def HICaloTowerCfg(flags):
577 """ Create the towers for heavy ion """
578 acc = ComponentAccumulator()
579 acc.merge(
580 hltCaloCellMakerCfg(flags, "HLTCaloCellMakerFS", roisKey='')
581 )
582 # Then build the towers
583 acc.merge(
584 hltHICaloTowerMakerCfg(
585 flags,
586 "HLTHICaloTowerMakerFS",
587 towersKey=fs_towers,
588 cellsKey=fs_cells,
589 )
590 )
591 # Then build the clusters
592 acc.merge(
593 hltHICaloClusterMakerCfg(
594 flags,
595 "HLTHICaloClusterMakerFS",
596 towersKey=fs_towers,
597 cellsKey=fs_cells,
598 clustersKey = "HLT_HICaloClustersFS"
599 )
600 )
601
602 return acc
603
604
605if __name__ == "__main__":
606 from AthenaConfiguration.TestDefaults import defaultTestFiles, defaultGeometryTags
607 from AthenaConfiguration.AllConfigFlags import initConfigFlags
608
609 flags = initConfigFlags()
610 flags.Input.Files = defaultTestFiles.RAW_RUN3
611 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
612 flags.IOVDb.GlobalTag = "CONDBR2-ES1PA-2022-07"
613 flags.Common.isOnline = True
614 outputContainers = ["CaloCellContainer#SeedLessFS",
615 "xAOD::EventInfo#EventInfo",
616 "xAOD::TrigEMClusterContainer#CaloClustersGlobal",
617 "xAOD::TrigEMClusterAuxContainer#CaloClustersGlobalAux.",
618 "xAOD::TrigRingerRingsContainer#RingerGlobal",
619 "xAOD::TrigRingerRingsAuxContainer#RingerGlobalAux."]
620 flags.Output.ESDFileName='TrigCaloRecCheck'
621
622 flags.fillFromArgs()
623 flags.dump()
624 flags.lock()
625 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
626 cfg = MainServicesCfg(flags)
627
628 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
629 cfg.merge(LArGMCfg(flags))
630 from TileGeoModel.TileGMConfig import TileGMCfg
631 cfg.merge(TileGMCfg(flags))
632
633 from DetDescrCnvSvc.DetDescrCnvSvcConfig import DetDescrCnvSvcCfg
634 cfg.merge(DetDescrCnvSvcCfg(flags))
635
636 from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
637 cfg.merge(ByteStreamReadCfg(flags))
638 cfg.getService("ByteStreamCnvSvc").ROD2ROBmap=["-1"]
639
640 storeGateSvc = cfg.getService("StoreGateSvc")
641 storeGateSvc.Dump=True
642 theL0CaloGlobalRoIBuilderCfg = L0CaloGlobalRoIBuilderCfg(flags)
643 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
644
645 from AthenaCommon.CFElements import parOR
646 cfg.addSequence(parOR("HLTBeginSeq"),parentName="AthMasterSeq")
647
648 CAs = [hltCaloCellSeedlessMakerCfg(flags,roisKey=''),
649 theL0CaloGlobalRoIBuilderCfg,
650 hltCaloCellMakerCfg(flags, "SthFS",roisKey=''),
651 hltCaloGlobalCellMakerCfg(flags, InputCellKey="SeedLessFS", OutputCellKey="SeedLessFSGlobal"),
652 hltCaloGlobalCellMonitorCfg(flags, InputCellKey="SeedLessFSGlobal"),
653 hltCaloGlobalCellMonitorCfg(flags, name="HLTCaloGlobalCellMonitor1", InputCellKey="SeedLessFS"),
654 OutputStreamCfg(flags, flags.Output.ESDFileName, ItemList=outputContainers)]
655 #hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topoFS")]
656
657 for ca in CAs:
658 ca.printConfig(withDetails=True, summariseProps=True)
659 #ca.wasMerged()
660 cfg.merge(ca)
661 cfg.run(50)
trigCaloClusterMonitoringTool(flags, doMonCells=False, isFullScan=None)