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, doTau=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 doTau 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, doTau = False):
416 if doTau:
417 CellsName = "CaloCellsLC"
418 clustersKeyFromName = "HLT_TopoCaloClustersLC"
419 elif nameSuffix == "FS":
420 clustersKeyFromName = em_clusters
421 else:
422 TrigEgammaKeys = getTrigEgammaKeys(flags)
423 clustersKeyFromName = TrigEgammaKeys.precisionTopoClusterContainer
424
425 clusters = clustersKeyFromName if clustersKey is None else clustersKey
426 acc = ComponentAccumulator()
427 acc.merge(
428 hltCaloCellMakerCfg(flags, namePrefix + "HLTCaloCellMaker"+nameSuffix, roisKey=roisKey, CellsName=CellsName, monitorCells=monitorCells, doTau = doTau)
429 )
430
431 clustermakername_nosuffix = namePrefix + "HLTCaloClusterMaker"
432
433 clustermakername = clustermakername_nosuffix + nameSuffix
434
435 if flags.CaloRecGPU.GlobalFlags.UseCaloRecGPU and "FS" in clustermakername:
436 flags = flags.cloneAndReplace("CaloRecGPU.ActiveConfig", "Trigger.CaloRecGPU.Default", True)
437 from CaloRecGPU.CaloRecGPUConfig import GPUCaloTopoClusterCfg
438
439
440 GPUKernelSvc = CompFactory.GPUKernelSizeOptimizerSvc()
441 acc.addService(GPUKernelSvc)
442
443 gpuhyb = GPUCaloTopoClusterCfg(flags,
444 True,
445 CellsName,
446 clustersname = clusters if "CaloMon" in clustermakername else recordable(clusters),
447 name = clustermakername,
448 ReallyUseGPUTools = not flags.CaloRecGPU.GlobalFlags.UseCPUToolsInstead)
449
450 acc.merge(gpuhyb)
451
452 monitorCells = "FS" in clustermakername
453
454 monitor = CompFactory.TrigCaloClusterMonitor(clustermakername_nosuffix + 'Monitoring' + nameSuffix,
455 CellsName = CellsName,
456 ClustersName = clusters,
457 MonitorCells = monitorCells,
458 MonitoringTool = trigCaloClusterMonitoringTool(flags, monitorCells))
459 acc.addEventAlgo(monitor, primary=False)
460
461 else :
462 calt=hltTopoClusterMakerCfg(flags, clustermakername_nosuffix, cellsKey=CellsName, clustersKey=clusters, doLC=doTau, suffix = nameSuffix)
463 acc.merge(calt)
464 if doLCFS:
465 acc.merge( hltCaloTopoClusterCalibratorCfg(
466 flags,
467 "HLTCaloClusterCalibratorLCFS",
468 clustersin=em_clusters,
469 clustersout=lc_clusters,
470 OutputCellLinks=lc_clusters + "_cellLinks",
471 )
472 )
473 return acc
474
475###################################EgammaSpecific TopoClustering####################################
476@AccumulatorCache
477def egammaTopoClusteringCfg(flags, RoIs):
478 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="RoI", CellsName="CaloCells", monitorCells=True, roisKey=RoIs)
479 return cfg
480
481
482@AccumulatorCache
483def egammaTopoClusteringCfg_LRT(flags, RoIs):
484 TrigEgammaKeys_LRT = getTrigEgammaKeys(flags, name = '_LRT')
485 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="RoI_LRT", CellsName="CaloCells", monitorCells=True, roisKey=RoIs, clustersKey= TrigEgammaKeys_LRT.precisionTopoClusterContainer)
486 return cfg
487
488
489###################################JetMetSpecific TopoClustering####################################
490@AccumulatorCache
491def jetmetTopoClusteringCfg(flags, RoIs):
492 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="FS", CellsName="CaloCellsFS", monitorCells=False, roisKey=RoIs)
493 return cfg
494
495@AccumulatorCache
496def jetmetTopoClusteringCfg_LC(flags, RoIs):
497 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="FS", CellsName="CaloCellsFS", monitorCells=False, roisKey=RoIs, doLCFS=True)
498 return cfg
499
500###################################TauSpecific TopoClustering####################################
501@AccumulatorCache
502def tauTopoClusteringCfg(flags, RoIs):
503 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="Tau", nameSuffix="", CellsName="CaloCellsLC", monitorCells=False, roisKey=RoIs, clustersKey="HLT_TopoCaloClustersLC", doTau= True)
504 return cfg
505
506@AccumulatorCache
507def hltCaloTopoClusteringHICfg(
508 flags, CellsName=None, roisKey="UNSPECIFIED", doLC=False,algSuffix='HIRoI', ion=True):
509 TrigEgammaKeys = getTrigEgammaKeys(flags, ion=ion)
510 eventShape = TrigEgammaKeys.egEventShape
511 clustersKey = TrigEgammaKeys.precisionTopoClusterContainer
512 acc = ComponentAccumulator()
513 acc.merge(hltCaloCellMakerCfg(flags, "HLTCaloCellMaker"+algSuffix, roisKey=roisKey, CellsName=CellsName, monitorCells=True))
514 acc.merge(hltCaloCellCorrectorCfg(flags,name='HLTRoICaloCellCorrector', inputEDM='CaloCells', outputEDM='CorrectedRoICaloCells', eventShape=eventShape))
515 acc.merge(hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topo"+algSuffix, clustersKey=clustersKey,cellsKey="CorrectedRoICaloCells"))
516 return acc
517
518@AccumulatorCache
519def hltHICaloTowerMakerCfg(flags, name, towersKey, cellsKey="CaloCellsFS", RoIs=""):
520 acc = ComponentAccumulator()
521 larcmbtwrbldr = CompFactory.LArTowerBuilderTool("LArCmbTwrBldr",
522 CellContainerName = cellsKey,
523 IncludedCalos = [ "LAREM", "LARHEC" ]
524 )
525
526 fcalcmbtwrbldr = CompFactory.LArFCalTowerBuilderTool("FCalCmbTwrBldr",
527 CellContainerName = cellsKey,
528 MinimumEt = 0.*MeV
529 )
530
531 #input to TileTowerBuilder: cells in TILE
532 tilecmbtwrbldr = CompFactory.TileTowerBuilderTool("TileCmbTwrBldr",
533 CellContainerName = cellsKey,
534 # debugging aid, keep for convenience
535 #DumpTowers = False,
536 #DumpWeightMap = False
537 )
538
539
540
541 alg = CompFactory.TrigCaloTowerMaker(name,
542 Cells=cellsKey,
543 CaloTowers=towersKey,
544 NumberOfPhiTowers=64,
545 NumberOfEtaTowers=100,
546 EtaMin=-5.0,
547 EtaMax=5.0,
548 DeltaEta=1.2,
549 DeltaPhi=1.2,
550 RoIs=RoIs,
551 TowerMakerTools = [ tilecmbtwrbldr, larcmbtwrbldr, fcalcmbtwrbldr ]
552 )
553 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
554 acc.merge(CaloNoiseCondAlgCfg(flags))
555 acc.addEventAlgo(alg, primary=True)
556 return acc
557
558@AccumulatorCache
559def hltHICaloClusterMakerCfg(flags, name, towersKey, cellsKey, clustersKey) :
560 """Function to equip HLT HI cluster builder from towers and cells, adds to output AOD stream"""
561 acc = ComponentAccumulator()
562
563
564 alg=CompFactory.HIClusterMaker(name,
565 InputTowerKey=towersKey,
566 CaloCellContainerKey=cellsKey,
567 OutputContainerKey=clustersKey
568 )
569 acc.addEventAlgo(alg, primary=True)
570 return acc
571
572@AccumulatorCache
573def HICaloTowerCfg(flags):
574 """ Create the towers for heavy ion """
575 acc = ComponentAccumulator()
576 acc.merge(
577 hltCaloCellMakerCfg(flags, "HLTCaloCellMakerFS", roisKey='')
578 )
579 # Then build the towers
580 acc.merge(
581 hltHICaloTowerMakerCfg(
582 flags,
583 "HLTHICaloTowerMakerFS",
584 towersKey=fs_towers,
585 cellsKey=fs_cells,
586 )
587 )
588 # Then build the clusters
589 acc.merge(
590 hltHICaloClusterMakerCfg(
591 flags,
592 "HLTHICaloClusterMakerFS",
593 towersKey=fs_towers,
594 cellsKey=fs_cells,
595 clustersKey = "HLT_HICaloClustersFS"
596 )
597 )
598
599 return acc
600
601
602if __name__ == "__main__":
603 from AthenaConfiguration.TestDefaults import defaultTestFiles, defaultGeometryTags
604 from AthenaConfiguration.AllConfigFlags import initConfigFlags
605
606 flags = initConfigFlags()
607 flags.Input.Files = defaultTestFiles.RAW_RUN3
608 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
609 flags.IOVDb.GlobalTag = "CONDBR2-ES1PA-2022-07"
610 flags.Common.isOnline = True
611 outputContainers = ["CaloCellContainer#SeedLessFS",
612 "xAOD::EventInfo#EventInfo",
613 "xAOD::TrigEMClusterContainer#CaloClustersGlobal",
614 "xAOD::TrigEMClusterAuxContainer#CaloClustersGlobalAux.",
615 "xAOD::TrigRingerRingsContainer#RingerGlobal",
616 "xAOD::TrigRingerRingsAuxContainer#RingerGlobalAux."]
617 flags.Output.ESDFileName='TrigCaloRecCheck'
618
619 flags.fillFromArgs()
620 flags.dump()
621 flags.lock()
622 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
623 cfg = MainServicesCfg(flags)
624
625 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
626 cfg.merge(LArGMCfg(flags))
627 from TileGeoModel.TileGMConfig import TileGMCfg
628 cfg.merge(TileGMCfg(flags))
629
630 from DetDescrCnvSvc.DetDescrCnvSvcConfig import DetDescrCnvSvcCfg
631 cfg.merge(DetDescrCnvSvcCfg(flags))
632
633 from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
634 cfg.merge(ByteStreamReadCfg(flags))
635 cfg.getService("ByteStreamCnvSvc").ROD2ROBmap=["-1"]
636
637 storeGateSvc = cfg.getService("StoreGateSvc")
638 storeGateSvc.Dump=True
639 theL0CaloGlobalRoIBuilderCfg = L0CaloGlobalRoIBuilderCfg(flags)
640 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
641
642 from AthenaCommon.CFElements import parOR
643 cfg.addSequence(parOR("HLTBeginSeq"),parentName="AthMasterSeq")
644
645 CAs = [hltCaloCellSeedlessMakerCfg(flags,roisKey=''),
646 theL0CaloGlobalRoIBuilderCfg,
647 hltCaloCellMakerCfg(flags, "SthFS",roisKey=''),
648 hltCaloGlobalCellMakerCfg(flags,InputCellKey="SeedLessFS",OutputCellKey="SeedLessFSGlobal"),
649 hltCaloGlobalCellMonitorCfg(flags,InputCellKey="SeedLessFSGlobal"),
650 hltCaloGlobalCellMonitorCfg(flags,name="HLTCaloGlobalCellMonitor1",InputCellKey="SeedLessFS"),
651 OutputStreamCfg(flags,flags.Output.ESDFileName,ItemList=outputContainers)]
652 #hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topoFS")]
653
654 for ca in CAs:
655 ca.printConfig(withDetails=True, summariseProps=True)
656 #ca.wasMerged()
657 cfg.merge(ca)
658 cfg.run(50)
trigCaloClusterMonitoringTool(flags, doMonCells=False, isFullScan=None)