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 alg = CompFactory.CaloClusterMaker(
341 clustermakername,
342 ClustersOutputName=clustersKey if "CaloMon" in clustermakername else recordable(clustersKey),
343 ClusterCellLinkOutputName = clustersKey+"_links",
344 ClusterMakerTools = [ topoMaker, topoSplitter, topoMoments],
345 ClusterCorrectionTools = listClusterCorrectionTools,
346 SaveUncalibratedSignalState = True,
347 WriteTriggerSpecificInfo = True)
348
349 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
350 acc.merge(CaloNoiseCondAlgCfg(flags))
351 acc.addEventAlgo(alg, primary=True)
352 monitor = CompFactory.TrigCaloClusterMonitor(name + 'Monitoring' + suffix,
353 CellsName = cells,
354 ClustersName = clustersKey,
355 MonitorCells = doMonCells,
356 MonitoringTool = trigCaloClusterMonitoringTool(flags, doMonCells))
357 acc.addEventAlgo(monitor, primary=False)
358 return acc
359
360
361
362def hltCaloTopoClusterCalibratorCfg(flags, name, clustersin, clustersout, **kwargs):
363 """ Create the LC calibrator """
364 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
365
366 # We need the electronic noise for the LC weights
367 acc = ComponentAccumulator()
368 acc.merge(CaloNoiseCondAlgCfg(flags, noisetype="electronicNoise"))
369
370 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
371 acc.merge(caloTopoCoolFolderCfg(flags))
372
373 calibrator = CompFactory.TrigCaloClusterCalibrator(
374 name, InputClusters=clustersin, OutputClusters=clustersout,
375 **kwargs
376 #OutputCellLinks = clustersout+"_cellLinks", **kwargs
377 )
378
379 calibrator.ClusterCorrectionTools = [ hltCaloLocalCalib(flags), hltCaloOOCalib(flags),
380 hltCaloOOCPi0Calib(flags), hltCaloDMCalib(flags) ]
381 #NB: Could we take these from CaloRec.CaloTopoClusterConfig.getTopoClusterLocalCalibTools?
382
383 # Monitoring
384 monTool = GenericMonitoringTool(flags, "MonTool")
385 monTool.defineHistogram('Et', path='EXPERT', type='TH1F',
386 title="Cluster E_T; E_T [ MeV ] ; Number of Clusters",
387 xbins=135, xmin=-200.0, xmax=2500.0)
388 monTool.defineHistogram('Eta', path='EXPERT', type='TH1F',
389 title="Cluster #eta; #eta ; Number of Clusters",
390 xbins=100, xmin=-2.5, xmax=2.5)
391 monTool.defineHistogram('Phi', path='EXPERT', type='TH1F',
392 title="Cluster #phi; #phi ; Number of Clusters",
393 xbins=64, xmin=-3.2, xmax=3.2)
394 monTool.defineHistogram('Eta,Phi', path='EXPERT', type='TH2F',
395 title="Number of Clusters; #eta ; #phi ; Number of Clusters",
396 xbins=100, xmin=-2.5, xmax=2.5, ybins=128, ymin=-3.2, ymax=3.2)
397 calibrator.MonTool = monTool
398
399 acc.addEventAlgo(calibrator, primary=True)
400 return acc
401
402##################### Unifying all cluster reco algs together ##################
403from TriggerMenuMT.HLT.Egamma.TrigEgammaKeys import getTrigEgammaKeys
404
405
406def hltCaloTopoClusteringCfg(
407 flags, namePrefix=None,nameSuffix=None, CellsName=None, monitorCells=False, roisKey="UNSPECIFIED",clustersKey=None, doLCFS=False, doTau = False):
408 if doTau:
409 CellsName = "CaloCellsLC"
410 clustersKeyFromName = "HLT_TopoCaloClustersLC"
411 elif nameSuffix == "FS":
412 clustersKeyFromName = em_clusters
413 else:
414 TrigEgammaKeys = getTrigEgammaKeys(flags)
415 clustersKeyFromName = TrigEgammaKeys.precisionTopoClusterContainer
416
417 clusters = clustersKeyFromName if clustersKey is None else clustersKey
418 acc = ComponentAccumulator()
419 acc.merge(
420 hltCaloCellMakerCfg(flags, namePrefix + "HLTCaloCellMaker"+nameSuffix, roisKey=roisKey, CellsName=CellsName, monitorCells=monitorCells, doTau = doTau)
421 )
422
423 clustermakername_nosuffix = namePrefix + "HLTCaloClusterMaker"
424
425 clustermakername = clustermakername_nosuffix + nameSuffix
426
427 # TODO - Don't use hasFlag here, use another concrete flag instead
428 if flags.hasFlag("CaloRecGPU.GlobalFlags.UseCaloRecGPU") and flags.CaloRecGPU.GlobalFlags.UseCaloRecGPU and "FS" in clustermakername:
429 flags = flags.cloneAndReplace("CaloRecGPU.ActiveConfig", "Trigger.CaloRecGPU.Default", True)
430 from CaloRecGPU.CaloRecGPUConfig import GPUCaloTopoClusterCfg
431
432
433 GPUKernelSvc = CompFactory.GPUKernelSizeOptimizerSvc()
434 acc.addService(GPUKernelSvc)
435
436 gpuhyb = GPUCaloTopoClusterCfg(flags,
437 True,
438 CellsName,
439 clustersname = clusters if "CaloMon" in clustermakername else recordable(clusters),
440 name = clustermakername,
441 ReallyUseGPUTools = not flags.CaloRecGPU.GlobalFlags.UseCPUToolsInstead)
442
443 acc.merge(gpuhyb)
444
445 monitorCells = "FS" in clustermakername
446
447 monitor = CompFactory.TrigCaloClusterMonitor(clustermakername_nosuffix + 'Monitoring' + nameSuffix,
448 CellsName = CellsName,
449 ClustersName = clusters,
450 MonitorCells = monitorCells,
451 MonitoringTool = trigCaloClusterMonitoringTool(flags, monitorCells))
452 acc.addEventAlgo(monitor, primary=False)
453
454 else :
455 calt=hltTopoClusterMakerCfg(flags, clustermakername_nosuffix, cellsKey=CellsName, clustersKey=clusters, doLC=doTau, suffix = nameSuffix)
456 acc.merge(calt)
457 if doLCFS:
458 acc.merge( hltCaloTopoClusterCalibratorCfg(
459 flags,
460 "HLTCaloClusterCalibratorLCFS",
461 clustersin=em_clusters,
462 clustersout=lc_clusters,
463 OutputCellLinks=lc_clusters + "_cellLinks",
464 )
465 )
466 return acc
467
468###################################EgammaSpecific TopoClustering####################################
469@AccumulatorCache
470def egammaTopoClusteringCfg(flags, RoIs):
471 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="RoI", CellsName="CaloCells", monitorCells=True, roisKey=RoIs)
472 return cfg
473
474
475@AccumulatorCache
476def egammaTopoClusteringCfg_LRT(flags, RoIs):
477 TrigEgammaKeys_LRT = getTrigEgammaKeys(flags, name = '_LRT')
478 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="RoI_LRT", CellsName="CaloCells", monitorCells=True, roisKey=RoIs, clustersKey= TrigEgammaKeys_LRT.precisionTopoClusterContainer)
479 return cfg
480
481
482###################################JetMetSpecific TopoClustering####################################
483@AccumulatorCache
484def jetmetTopoClusteringCfg(flags, RoIs):
485 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="FS", CellsName="CaloCellsFS", monitorCells=False, roisKey=RoIs)
486 return cfg
487
488@AccumulatorCache
489def jetmetTopoClusteringCfg_LC(flags, RoIs):
490 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="FS", CellsName="CaloCellsFS", monitorCells=False, roisKey=RoIs, doLCFS=True)
491 return cfg
492
493###################################TauSpecific TopoClustering####################################
494@AccumulatorCache
495def tauTopoClusteringCfg(flags, RoIs):
496 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="Tau", nameSuffix="", CellsName="CaloCellsLC", monitorCells=False, roisKey=RoIs, clustersKey="HLT_TopoCaloClustersLC", doTau= True)
497 return cfg
498
499@AccumulatorCache
500def hltCaloTopoClusteringHICfg(
501 flags, CellsName=None, roisKey="UNSPECIFIED", doLC=False,algSuffix='HIRoI', ion=True):
502 TrigEgammaKeys = getTrigEgammaKeys(flags, ion=ion)
503 eventShape = TrigEgammaKeys.egEventShape
504 clustersKey = TrigEgammaKeys.precisionTopoClusterContainer
505 acc = ComponentAccumulator()
506 acc.merge(hltCaloCellMakerCfg(flags, "HLTCaloCellMaker"+algSuffix, roisKey=roisKey, CellsName=CellsName, monitorCells=True))
507 acc.merge(hltCaloCellCorrectorCfg(flags,name='HLTRoICaloCellCorrector', inputEDM='CaloCells', outputEDM='CorrectedRoICaloCells', eventShape=eventShape))
508 acc.merge(hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topo"+algSuffix, clustersKey=clustersKey,cellsKey="CorrectedRoICaloCells"))
509 return acc
510
511@AccumulatorCache
512def hltHICaloTowerMakerCfg(flags, name, towersKey, cellsKey="CaloCellsFS", RoIs=""):
513 acc = ComponentAccumulator()
514 larcmbtwrbldr = CompFactory.LArTowerBuilderTool("LArCmbTwrBldr",
515 CellContainerName = cellsKey,
516 IncludedCalos = [ "LAREM", "LARHEC" ]
517 )
518
519 fcalcmbtwrbldr = CompFactory.LArFCalTowerBuilderTool("FCalCmbTwrBldr",
520 CellContainerName = cellsKey,
521 MinimumEt = 0.*MeV
522 )
523
524 #input to TileTowerBuilder: cells in TILE
525 tilecmbtwrbldr = CompFactory.TileTowerBuilderTool("TileCmbTwrBldr",
526 CellContainerName = cellsKey,
527 # debugging aid, keep for convenience
528 #DumpTowers = False,
529 #DumpWeightMap = False
530 )
531
532
533
534 alg = CompFactory.TrigCaloTowerMaker(name,
535 Cells=cellsKey,
536 CaloTowers=towersKey,
537 NumberOfPhiTowers=64,
538 NumberOfEtaTowers=100,
539 EtaMin=-5.0,
540 EtaMax=5.0,
541 DeltaEta=1.2,
542 DeltaPhi=1.2,
543 RoIs=RoIs,
544 TowerMakerTools = [ tilecmbtwrbldr, larcmbtwrbldr, fcalcmbtwrbldr ]
545 )
546 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
547 acc.merge(CaloNoiseCondAlgCfg(flags))
548 acc.addEventAlgo(alg, primary=True)
549 return acc
550
551@AccumulatorCache
552def hltHICaloClusterMakerCfg(flags, name, towersKey, cellsKey, clustersKey) :
553 """Function to equip HLT HI cluster builder from towers and cells, adds to output AOD stream"""
554 acc = ComponentAccumulator()
555
556
557 alg=CompFactory.HIClusterMaker(name,
558 InputTowerKey=towersKey,
559 CaloCellContainerKey=cellsKey,
560 OutputContainerKey=clustersKey
561 )
562 acc.addEventAlgo(alg, primary=True)
563 return acc
564
565@AccumulatorCache
566def HICaloTowerCfg(flags):
567 """ Create the towers for heavy ion """
568 acc = ComponentAccumulator()
569 acc.merge(
570 hltCaloCellMakerCfg(flags, "HLTCaloCellMakerFS", roisKey='')
571 )
572 # Then build the towers
573 acc.merge(
574 hltHICaloTowerMakerCfg(
575 flags,
576 "HLTHICaloTowerMakerFS",
577 towersKey=fs_towers,
578 cellsKey=fs_cells,
579 )
580 )
581 # Then build the clusters
582 acc.merge(
583 hltHICaloClusterMakerCfg(
584 flags,
585 "HLTHICaloClusterMakerFS",
586 towersKey=fs_towers,
587 cellsKey=fs_cells,
588 clustersKey = "HLT_HICaloClustersFS"
589 )
590 )
591
592 return acc
593
594
595if __name__ == "__main__":
596 from AthenaConfiguration.TestDefaults import defaultTestFiles, defaultGeometryTags
597 from AthenaConfiguration.AllConfigFlags import initConfigFlags
598
599 flags = initConfigFlags()
600 flags.Input.Files = defaultTestFiles.RAW_RUN3
601 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
602 flags.IOVDb.GlobalTag = "CONDBR2-ES1PA-2022-07"
603 flags.Common.isOnline = True
604 outputContainers = ["CaloCellContainer#SeedLessFS",
605 "xAOD::EventInfo#EventInfo",
606 "xAOD::TrigEMClusterContainer#CaloClustersGlobal",
607 "xAOD::TrigEMClusterAuxContainer#CaloClustersGlobalAux.",
608 "xAOD::TrigRingerRingsContainer#RingerGlobal",
609 "xAOD::TrigRingerRingsAuxContainer#RingerGlobalAux."]
610 flags.Output.ESDFileName='TrigCaloRecCheck'
611
612 flags.fillFromArgs()
613 flags.dump()
614 flags.lock()
615 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
616 cfg = MainServicesCfg(flags)
617
618 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
619 cfg.merge(LArGMCfg(flags))
620 from TileGeoModel.TileGMConfig import TileGMCfg
621 cfg.merge(TileGMCfg(flags))
622
623 from DetDescrCnvSvc.DetDescrCnvSvcConfig import DetDescrCnvSvcCfg
624 cfg.merge(DetDescrCnvSvcCfg(flags))
625
626 from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
627 cfg.merge(ByteStreamReadCfg(flags))
628 cfg.getService("ByteStreamCnvSvc").ROD2ROBmap=["-1"]
629
630 storeGateSvc = cfg.getService("StoreGateSvc")
631 storeGateSvc.Dump=True
632 theL0CaloGlobalRoIBuilderCfg = L0CaloGlobalRoIBuilderCfg(flags)
633 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
634
635 from AthenaCommon.CFElements import parOR
636 cfg.addSequence(parOR("HLTBeginSeq"),parentName="AthMasterSeq")
637
638 CAs = [hltCaloCellSeedlessMakerCfg(flags,roisKey=''),
639 theL0CaloGlobalRoIBuilderCfg,
640 hltCaloCellMakerCfg(flags, "SthFS",roisKey=''),
641 hltCaloGlobalCellMakerCfg(flags,InputCellKey="SeedLessFS",OutputCellKey="SeedLessFSGlobal"),
642 hltCaloGlobalCellMonitorCfg(flags,InputCellKey="SeedLessFSGlobal"),
643 hltCaloGlobalCellMonitorCfg(flags,name="HLTCaloGlobalCellMonitor1",InputCellKey="SeedLessFS"),
644 OutputStreamCfg(flags,flags.Output.ESDFileName,ItemList=outputContainers)]
645 #hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topoFS")]
646
647 for ca in CAs:
648 ca.printConfig(withDetails=True, summariseProps=True)
649 #ca.wasMerged()
650 cfg.merge(ca)
651 cfg.run(50)
trigCaloClusterMonitoringTool(flags, doMonCells=False, isFullScan=None)