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
11from TrigEDMConfig.TriggerEDM
import recordable
13mlog = logging.getLogger (
'TrigCaloRecConfig')
17 """Monitoring tool for TrigCaloClusterMaker"""
19 monTool = GenericMonitoringTool(flags, 'MonTool')
21 if isFullScan is None:
22 isFullScan = doMonCells
24 maxNumberOfClusters = 1200 if isFullScan else 50
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)
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)
50def hltCaloGlobalCellMakerCfg(flags, name="HLTCaloGlobalCellMaker", **kwargs):
51 acc = ComponentAccumulator()
53 kwargs.setdefault("InputCellKey", "Calo")
54 kwargs.setdefault("OutputCellKey", "OutCalo")
55 kwargs.setdefault("MaxNCellsPerFEB", 30)
57 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
58 acc.merge(CaloNoiseCondAlgCfg(flags))
60 acc.addEventAlgo(CompFactory.HLTCaloGlobalCellMaker(name, **kwargs))
63def hltCaloGlobalCellMonitorCfg(flags, name="HLTCaloGlobalCellMonitor", **kwargs):
64 acc = ComponentAccumulator()
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)
88 kwargs.setdefault("MaxNCellsPerFEB", 128 )
89 kwargs.setdefault("NumberOfSigma", 2)
90 acc.addEventAlgo(CompFactory.HLTCaloGlobalCellMonitor(name, **kwargs))
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
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)
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)
120 if sequenceName is not None:
121 from AthenaCommon.CFElements import parOR
122 acc.merge(ComponentAccumulator(parOR(sequenceName)))
123 cellMaker = CompFactory.HLTCaloCellMaker(name,
125 TrigDataAccessMT = acc.getService('TrigCaloDataAccessSvc'),
126 ExtraInputs = CaloDataAccessSvcDependencies,
128 monitorCells = monitorCells,
130 TileCellsInROI = False if not doTau else True)
131 acc.addEventAlgo(cellMaker, primary=True,sequenceName=sequenceName)
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)
146def hltCaloCellSeedlessMakerCfg(flags, roisKey='UNSPECIFIED',sequenceName=None):
147 acc = ComponentAccumulator()
148 hltCaloCellMakerAcc = hltCaloCellMakerCfg(flags, "CaloCellSeedLessFS",
150 CellsName ="SeedLessFS",
153 acc.merge(hltCaloCellMakerAcc,sequenceName=sequenceName)
155 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
156 acc.merge(CaloNoiseCondAlgCfg(flags, noisetype="electronicNoise"))
157 acc.addCondAlgo(CompFactory.CaloNoiseSigmaDiffCondAlg())
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,
183 accSeq.addEventAlgo(L0CaloGlobalRoIBuilderAlg, sequenceName="HLTBeginSeq")
185 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
186 acc.merge(CaloNoiseCondAlgCfg(flags))
191def CaloL0RingerPreCfg(flags,DoNoiseThrRings=True):
192 flags.Trigger.ExtraEDMList+= CaloL0RingerPrepareList(DoNoiseThrRings)
194def CaloL0RingerPrepareList(DoNoiseThrRings=True):
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')]
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')]
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 accSeq = ComponentAccumulator(parOR("HLTBeginSeq"))
209 accSeq.merge(hltCaloCellSeedlessMakerCfg(flags, sequenceName="HLTBeginSeq"))
210 accSeq.merge(L0CaloGlobalRoIBuilderCfg(flags,DoNoiseThrRings=DoNoiseThrRings))
213 if (flags.Output.doWriteESD or flags.Output.doWriteAOD):
214 if ( flags.Output.doWriteESD ):
215 acc.merge(addToESD(flags, extraContent))
216 if ( flags.Output.doWriteAOD ):
217 acc.merge(addToAOD(flags, extraContent))
222def hltCaloLocalCalib(flags, name = "TrigLocalCalib"):
223 det_version_is_rome = flags.GeoModel.AtlasVersion.startswith("Rome")
224 localCalibTool = CompFactory.CaloLCWeightTool("TrigLCWeight",
225 CorrectionKey="H1ClusterCellWeights",
226 SignalOverNoiseCut=2.0, UseHadProbability=True)
227 trigLCClassify = CompFactory.CaloLCClassificationTool("TrigLCClassify",
228 ClassificationKey="EMFracClassify",
229 UseSpread=False, MaxProbability=0.85 if det_version_is_rome else 0.5,
230 UseNormalizedEnergyDensity=not det_version_is_rome,
231 StoreClassificationProbabilityInAOD=True)
232 tool = CompFactory.CaloClusterLocalCalib( name,
233 ClusterRecoStatus=[1, 2], ClusterClassificationTool=[ trigLCClassify ],
234 LocalCalibTools=[ localCalibTool ])
238def hltCaloOOCalib(flags, name = "TrigOOCCalib"):
239 localCalibTool = CompFactory.CaloLCOutOfClusterTool("TrigLCOut",
240 CorrectionKey="OOCCorrection",UseEmProbability=False,
241 UseHadProbability=True)
242 tool = CompFactory.CaloClusterLocalCalib( name,
243 ClusterRecoStatus=[1, 2],
244 LocalCalibTools=[ localCalibTool ] )
247def hltCaloOOCPi0Calib(flags, name = "TrigOOCPi0Calib" ):
248 localCalibTool = CompFactory.CaloLCOutOfClusterTool("TrigLCOutPi0",
249 CorrectionKey="OOCPi0Correction", UseEmProbability=True,
250 UseHadProbability=False)
251 tool = CompFactory.CaloClusterLocalCalib( name,
252 ClusterRecoStatus=[1, 2],
253 LocalCalibTools=[ localCalibTool ] )
256def hltCaloDMCalib(flags, name = "TrigDMCalib" ):
257 localCalibTool = CompFactory.CaloLCDeadMaterialTool("TrigLCDeadMaterial",
258 HadDMCoeffKey="HadDMCoeff2", ClusterRecoStatus=0,
259 WeightModeDM=2,UseHadProbability=True)
260 tool = CompFactory.CaloClusterLocalCalib( name,
261 ClusterRecoStatus=[1, 2],
262 LocalCalibTools=[ localCalibTool ] )
268def hltTopoClusterMakerCfg(flags, name, clustersKey="HLT_TopoCaloClustersFS", cellsKey=None, doLC=False, suffix=''):
269 acc = ComponentAccumulator()
270 cellsFromName = 'CaloCellsFS' if "FS" in clustersKey else "CaloCells"
271 cells = cellsFromName if cellsKey is None else cellsKey
273 from CaloRec.CaloTopoClusterConfig import (
274 CaloTopoClusterToolCfg,
275 CaloTopoClusterSplitterToolCfg,
278 topoMaker = acc.popToolsAndMerge(CaloTopoClusterToolCfg(flags, cellsname=cells))
279 topoMaker.RestrictPSNeighbors = False
280 listClusterCorrectionTools = []
282 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
283 # We need the electronic noise for the LC weights
284 acc.merge(CaloNoiseCondAlgCfg(flags, noisetype="electronicNoise"))
285 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
286 acc.merge(caloTopoCoolFolderCfg(flags))
287 listClusterCorrectionTools = [ hltCaloLocalCalib(flags), hltCaloOOCalib(flags),
288 hltCaloOOCPi0Calib(flags), hltCaloDMCalib(flags) ]
291 topoMaker.SeedCutsInT = flags.Trigger.Calo.TopoCluster.doTimeCut
292 topoMaker.CutOOTseed = flags.Trigger.Calo.TopoCluster.extendTimeCut and flags.Trigger.Calo.TopoCluster.doTimeCut
293 topoMaker.UseTimeCutUpperLimit = flags.Trigger.Calo.TopoCluster.useUpperLimitForTimeCut
294 topoMaker.TimeCutUpperLimit = flags.Trigger.Calo.TopoCluster.timeCutUpperLimit
296 topoSplitter = acc.popToolsAndMerge(CaloTopoClusterSplitterToolCfg(flags))
298 topoMoments = CompFactory.CaloClusterMomentsMaker ('TrigTopoMoments')
299 topoMoments.MaxAxisAngle = 20*deg
300 topoMoments.TwoGaussianNoise = flags.Calo.TopoCluster.doTwoGaussianNoise
301 topoMoments.MinBadLArQuality = 4000
302 topoMoments.MomentsNames = ['FIRST_PHI',
336 clustermakername = name + suffix
337 doMonCells = "FS" in clustermakername
339 alg = CompFactory.CaloClusterMaker(
341 ClustersOutputName=clustersKey if "CaloMon" in clustermakername else recordable(clustersKey),
342 ClusterCellLinkOutputName = clustersKey+"_links",
343 ClusterMakerTools = [ topoMaker, topoSplitter, topoMoments],
344 ClusterCorrectionTools = listClusterCorrectionTools,
345 SaveUncalibratedSignalState = True,
346 WriteTriggerSpecificInfo = True)
348 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
349 acc.merge(CaloNoiseCondAlgCfg(flags))
350 acc.addEventAlgo(alg, primary=True)
351 monitor = CompFactory.TrigCaloClusterMonitor(name + 'Monitoring' + suffix,
353 ClustersName = clustersKey,
354 MonitorCells = doMonCells,
355 MonitoringTool = trigCaloClusterMonitoringTool(flags, doMonCells))
356 acc.addEventAlgo(monitor, primary=False)
361def hltCaloTopoClusterCalibratorCfg(flags, name, clustersin, clustersout, **kwargs):
362 """ Create the LC calibrator """
363 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
365 # We need the electronic noise for the LC weights
366 acc = ComponentAccumulator()
367 acc.merge(CaloNoiseCondAlgCfg(flags, noisetype="electronicNoise"))
369 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
370 acc.merge(caloTopoCoolFolderCfg(flags))
372 calibrator = CompFactory.TrigCaloClusterCalibrator(
373 name, InputClusters=clustersin, OutputClusters=clustersout,
375 #OutputCellLinks = clustersout+"_cellLinks", **kwargs
378 calibrator.ClusterCorrectionTools = [ hltCaloLocalCalib(flags), hltCaloOOCalib(flags),
379 hltCaloOOCPi0Calib(flags), hltCaloDMCalib(flags) ]
380 #NB: Could we take these from CaloRec.CaloTopoClusterConfig.getTopoClusterLocalCalibTools?
383 monTool = GenericMonitoringTool(flags, "MonTool")
384 monTool.defineHistogram('Et', path='EXPERT', type='TH1F',
385 title="Cluster E_T; E_T [ MeV ] ; Number of Clusters",
386 xbins=135, xmin=-200.0, xmax=2500.0)
387 monTool.defineHistogram('Eta', path='EXPERT', type='TH1F',
388 title="Cluster #eta; #eta ; Number of Clusters",
389 xbins=100, xmin=-2.5, xmax=2.5)
390 monTool.defineHistogram('Phi', path='EXPERT', type='TH1F',
391 title="Cluster #phi; #phi ; Number of Clusters",
392 xbins=64, xmin=-3.2, xmax=3.2)
393 monTool.defineHistogram('Eta,Phi', path='EXPERT', type='TH2F',
394 title="Number of Clusters; #eta ; #phi ; Number of Clusters",
395 xbins=100, xmin=-2.5, xmax=2.5, ybins=128, ymin=-3.2, ymax=3.2)
396 calibrator.MonTool = monTool
398 acc.addEventAlgo(calibrator, primary=True)
401##################### Unifying all cluster reco algs together ##################
402from TriggerMenuMT.HLT.Egamma.TrigEgammaKeys import getTrigEgammaKeys
405def hltCaloTopoClusteringCfg(
406 flags, namePrefix=None,nameSuffix=None, CellsName=None, monitorCells=False, roisKey="UNSPECIFIED",clustersKey=None, doLCFS=False, doTau = False):
408 CellsName = "CaloCellsLC"
409 clustersKeyFromName = "HLT_TopoCaloClustersLC"
410 elif nameSuffix == "FS":
411 clustersKeyFromName = em_clusters
413 TrigEgammaKeys = getTrigEgammaKeys(flags)
414 clustersKeyFromName = TrigEgammaKeys.precisionTopoClusterContainer
416 clusters = clustersKeyFromName if clustersKey is None else clustersKey
417 acc = ComponentAccumulator()
419 hltCaloCellMakerCfg(flags, namePrefix + "HLTCaloCellMaker"+nameSuffix, roisKey=roisKey, CellsName=CellsName, monitorCells=monitorCells, doTau = doTau)
422 clustermakername_nosuffix = namePrefix + "HLTCaloClusterMaker"
424 clustermakername = clustermakername_nosuffix + nameSuffix
426 # TODO - Don't use hasFlag here, use another concrete flag instead
427 if flags.hasFlag("CaloRecGPU.GlobalFlags.UseCaloRecGPU") and flags.CaloRecGPU.GlobalFlags.UseCaloRecGPU and "FS" in clustermakername:
428 flags = flags.cloneAndReplace("CaloRecGPU.ActiveConfig", "Trigger.CaloRecGPU.Default", True)
429 from CaloRecGPU.CaloRecGPUConfig import GPUCaloTopoClusterCfg
432 GPUKernelSvc = CompFactory.GPUKernelSizeOptimizerSvc()
433 acc.addService(GPUKernelSvc)
435 gpuhyb = GPUCaloTopoClusterCfg(flags,
438 clustersname = clusters if "CaloMon" in clustermakername else recordable(clusters),
439 name = clustermakername,
440 ReallyUseGPUTools = not flags.CaloRecGPU.GlobalFlags.UseCPUToolsInstead)
444 monitorCells = "FS" in clustermakername
446 monitor = CompFactory.TrigCaloClusterMonitor(clustermakername_nosuffix + 'Monitoring' + nameSuffix,
447 CellsName = CellsName,
448 ClustersName = clusters,
449 MonitorCells = monitorCells,
450 MonitoringTool = trigCaloClusterMonitoringTool(flags, monitorCells))
451 acc.addEventAlgo(monitor, primary=False)
454 calt=hltTopoClusterMakerCfg(flags, clustermakername_nosuffix, cellsKey=CellsName, clustersKey=clusters, doLC=doTau, suffix = nameSuffix)
457 acc.merge( hltCaloTopoClusterCalibratorCfg(
459 "HLTCaloClusterCalibratorLCFS",
460 clustersin=em_clusters,
461 clustersout=lc_clusters,
462 OutputCellLinks=lc_clusters + "_cellLinks",
467###################################EgammaSpecific TopoClustering####################################
469def egammaTopoClusteringCfg(flags, RoIs):
470 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="RoI", CellsName="CaloCells", monitorCells=True, roisKey=RoIs)
475def egammaTopoClusteringCfg_LRT(flags, RoIs):
476 TrigEgammaKeys_LRT = getTrigEgammaKeys(flags, name = '_LRT')
477 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="RoI_LRT", CellsName="CaloCells", monitorCells=True, roisKey=RoIs, clustersKey= TrigEgammaKeys_LRT.precisionTopoClusterContainer)
481###################################JetMetSpecific TopoClustering####################################
483def jetmetTopoClusteringCfg(flags, RoIs):
484 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="FS", CellsName="CaloCellsFS", monitorCells=False, roisKey=RoIs)
488def jetmetTopoClusteringCfg_LC(flags, RoIs):
489 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="", nameSuffix="FS", CellsName="CaloCellsFS", monitorCells=False, roisKey=RoIs, doLCFS=True)
492###################################TauSpecific TopoClustering####################################
494def tauTopoClusteringCfg(flags, RoIs):
495 cfg = hltCaloTopoClusteringCfg(flags, namePrefix="Tau", nameSuffix="", CellsName="CaloCellsLC", monitorCells=False, roisKey=RoIs, clustersKey="HLT_TopoCaloClustersLC", doTau= True)
499def hltCaloTopoClusteringHICfg(
500 flags, CellsName=None, roisKey="UNSPECIFIED", doLC=False,algSuffix='HIRoI', ion=True):
501 TrigEgammaKeys = getTrigEgammaKeys(flags, ion=ion)
502 eventShape = TrigEgammaKeys.egEventShape
503 clustersKey = TrigEgammaKeys.precisionTopoClusterContainer
504 acc = ComponentAccumulator()
505 acc.merge(hltCaloCellMakerCfg(flags, "HLTCaloCellMaker"+algSuffix, roisKey=roisKey, CellsName=CellsName, monitorCells=True))
506 acc.merge(hltCaloCellCorrectorCfg(flags,name='HLTRoICaloCellCorrector', inputEDM='CaloCells', outputEDM='CorrectedRoICaloCells', eventShape=eventShape))
507 acc.merge(hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topo"+algSuffix, clustersKey=clustersKey,cellsKey="CorrectedRoICaloCells"))
511def hltHICaloTowerMakerCfg(flags, name, towersKey, cellsKey="CaloCellsFS", RoIs=""):
512 acc = ComponentAccumulator()
513 larcmbtwrbldr = CompFactory.LArTowerBuilderTool("LArCmbTwrBldr",
514 CellContainerName = cellsKey,
515 IncludedCalos = [ "LAREM", "LARHEC" ]
518 fcalcmbtwrbldr = CompFactory.LArFCalTowerBuilderTool("FCalCmbTwrBldr",
519 CellContainerName = cellsKey,
523 #input to TileTowerBuilder: cells in TILE
524 tilecmbtwrbldr = CompFactory.TileTowerBuilderTool("TileCmbTwrBldr",
525 CellContainerName = cellsKey,
526 # debugging aid, keep for convenience
528 #DumpWeightMap = False
533 alg = CompFactory.TrigCaloTowerMaker(name,
535 CaloTowers=towersKey,
536 NumberOfPhiTowers=64,
537 NumberOfEtaTowers=100,
543 TowerMakerTools = [ tilecmbtwrbldr, larcmbtwrbldr, fcalcmbtwrbldr ]
545 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
546 acc.merge(CaloNoiseCondAlgCfg(flags))
547 acc.addEventAlgo(alg, primary=True)
551def hltHICaloClusterMakerCfg(flags, name, towersKey, cellsKey, clustersKey) :
552 """Function to equip HLT HI cluster builder from towers and cells, adds to output AOD stream"""
553 acc = ComponentAccumulator()
556 alg=CompFactory.HIClusterMaker(name,
557 InputTowerKey=towersKey,
558 CaloCellContainerKey=cellsKey,
559 OutputContainerKey=clustersKey
561 acc.addEventAlgo(alg, primary=True)
565def HICaloTowerCfg(flags):
566 """ Create the towers for heavy ion """
567 acc = ComponentAccumulator()
569 hltCaloCellMakerCfg(flags, "HLTCaloCellMakerFS", roisKey='')
571 # Then build the towers
573 hltHICaloTowerMakerCfg(
575 "HLTHICaloTowerMakerFS",
580 # Then build the clusters
582 hltHICaloClusterMakerCfg(
584 "HLTHICaloClusterMakerFS",
587 clustersKey = "HLT_HICaloClustersFS"
594if __name__ == "__main__":
595 from AthenaConfiguration.TestDefaults import defaultTestFiles, defaultGeometryTags
596 from AthenaConfiguration.AllConfigFlags import initConfigFlags
598 flags = initConfigFlags()
599 flags.Input.Files = defaultTestFiles.RAW_RUN3
600 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
601 flags.IOVDb.GlobalTag = "CONDBR2-ES1PA-2022-07"
602 flags.Common.isOnline = True
603 outputContainers = ["CaloCellContainer#SeedLessFS",
604 "xAOD::EventInfo#EventInfo",
605 "xAOD::TrigEMClusterContainer#CaloClustersGlobal",
606 "xAOD::TrigEMClusterAuxContainer#CaloClustersGlobalAux.",
607 "xAOD::TrigRingerRingsContainer#RingerGlobal",
608 "xAOD::TrigRingerRingsAuxContainer#RingerGlobalAux."]
609 flags.Output.ESDFileName='TrigCaloRecCheck'
614 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
615 cfg = MainServicesCfg(flags)
617 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
618 cfg.merge(LArGMCfg(flags))
619 from TileGeoModel.TileGMConfig import TileGMCfg
620 cfg.merge(TileGMCfg(flags))
622 from DetDescrCnvSvc.DetDescrCnvSvcConfig import DetDescrCnvSvcCfg
623 cfg.merge(DetDescrCnvSvcCfg(flags))
625 from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
626 cfg.merge(ByteStreamReadCfg(flags))
627 cfg.getService("ByteStreamCnvSvc").ROD2ROBmap=["-1"]
629 storeGateSvc = cfg.getService("StoreGateSvc")
630 storeGateSvc.Dump=True
631 theL0CaloGlobalRoIBuilderCfg = L0CaloGlobalRoIBuilderCfg(flags)
632 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
634 from AthenaCommon.CFElements import parOR
635 cfg.addSequence(parOR("HLTBeginSeq"),parentName="AthMasterSeq")
637 CAs = [hltCaloCellSeedlessMakerCfg(flags,roisKey=''),
638 theL0CaloGlobalRoIBuilderCfg,
639 hltCaloCellMakerCfg(flags, "SthFS",roisKey=''),
640 hltCaloGlobalCellMakerCfg(flags,InputCellKey="SeedLessFS",OutputCellKey="SeedLessFSGlobal"),
641 hltCaloGlobalCellMonitorCfg(flags,InputCellKey="SeedLessFSGlobal"),
642 hltCaloGlobalCellMonitorCfg(flags,name="HLTCaloGlobalCellMonitor1",InputCellKey="SeedLessFS"),
643 OutputStreamCfg(flags,flags.Output.ESDFileName,ItemList=outputContainers)]
644 #hltTopoClusterMakerCfg(flags, "TrigCaloClusterMaker_topoFS")]
647 ca.printConfig(withDetails=True, summariseProps=True)
trigCaloClusterMonitoringTool(flags, doMonCells=False, isFullScan=None)