ATLAS Offline Software
Loading...
Searching...
No Matches
F100IntegrationConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3from AthenaConfiguration.ComponentFactory import CompFactory
4from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
5
6
7def F1X0IntegrationCfg(flags, name = 'F1X0IntegrationAlg', **kwarg):
8 acc = ComponentAccumulator()
9
10 kwarg.setdefault('bdfID', flags.FPGADataPrep.bdfID) # On the testbed
11 kwarg.setdefault('xclbin', flags.FPGADataPrep.xclbin)
12 if(flags.FPGADataPrep.doF110):
13 kwarg.setdefault('PixelClusterKernelName','pixel_clustering_tool')
14 else:
15 kwarg.setdefault('PixelClusterKernelName', 'pixclustering_top_v1_0')
16 kwarg.setdefault('StripClusterKernelName','processHits')
17 kwarg.setdefault('PixelL2GKernelName','l2g_pixel_tool')
18 kwarg.setdefault('StripL2GKernelName','l2g_strip_tool')
19 kwarg.setdefault('PixelEDMPrepKernelName', 'PixelEDMPrep')
20 kwarg.setdefault('StripEDMPrepKernelName', 'StripEDMPrep')
21 kwarg.setdefault('doF110', flags.FPGADataPrep.doF110)
22
23 if ("isRoI_Seeded" in kwarg) and kwarg["isRoI_Seeded"]:
24 if 'RegSelTool' not in kwarg:
25 from RegionSelector.RegSelToolConfig import regSelTool_ITkPixel_Cfg
26 kwarg.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkPixel_Cfg(flags)))
27
28 # Set up Chrono service
29 acc.addService(CompFactory.ChronoStatSvc(
30 PrintUserTime = True,
31 PrintSystemTime = True,
32 PrintEllapsedTime = True
33 ))
34
35 from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool
36 montool = GenericMonitoringTool(flags, HistPath = f"F100Integration_{name}")
37 montool.defineHistogram('TIME_Total',path='EXPERT',type='TH1F',title="Total time (ms)", xbins = 400, xmin=0.0, xmax=2000.0)
38
39 kwarg.setdefault('MonTool', montool)
40
41 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F1X0IntegrationAlg(name, **kwarg))
42
43 return acc
44
45def F1X0XRTIntegrationCfg(flags, name = 'F1X0IntegrationAlg', **kwarg):
46 acc = ComponentAccumulator()
47
48 kwarg.setdefault('bdfID', flags.FPGADataPrep.bdfID) # On the testbed
49 kwarg.setdefault('xclbin', flags.FPGADataPrep.xclbin)
50 if(flags.FPGADataPrep.doF110):
51 kwarg.setdefault('PixelClusterKernelName','pixel_clustering_tool')
52 else:
53 kwarg.setdefault('PixelClusterKernelName', 'pixclustering_top_v1_0')
54 kwarg.setdefault('StripClusterKernelName','processHits')
55 kwarg.setdefault('PixelL2GKernelName','l2g_pixel_tool')
56 kwarg.setdefault('StripL2GKernelName','l2g_strip_tool')
57 kwarg.setdefault('PixelEDMPrepKernelName', 'PixelEDMPrep')
58 kwarg.setdefault('StripEDMPrepKernelName', 'StripEDMPrep')
59 kwarg.setdefault('doF110', flags.FPGADataPrep.doF110)
60
61 if ("isRoI_Seeded" in kwarg) and kwarg["isRoI_Seeded"]:
62 if 'RegSelTool' not in kwarg:
63 from RegionSelector.RegSelToolConfig import regSelTool_ITkPixel_Cfg
64 kwarg.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkPixel_Cfg(flags)))
65
66 # Set up Chrono service
67 acc.addService(CompFactory.ChronoStatSvc(
68 PrintUserTime = True,
69 PrintSystemTime = True,
70 PrintEllapsedTime = True
71 ))
72
73 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F1X0XRTIntegrationAlg(name, **kwarg))
74
75 return acc
76
77def F100StreamIntegrationCfg(flags, name = 'F100StreamIntegrationAlg', **kwarg):
78 acc = ComponentAccumulator()
79
80 kwarg.setdefault('bdfID', flags.FPGADataPrep.bdfID) # On the testbed
81 kwarg.setdefault('xclbin', flags.FPGADataPrep.xclbin)
82 kwarg.setdefault('PixelStartClusterKernelName','loaderPixel')
83 kwarg.setdefault('PixelEndClusterKernelName','unloaderPixelCluster')
84 kwarg.setdefault('PixelEndClusterEdmKernelName','unloaderPixelEdm')
85
86 kwarg.setdefault('StripStartClusterKernelName','loaderStrip')
87 kwarg.setdefault('StripEndClusterKernelName','unloaderStrip')
88 kwarg.setdefault('PixelL2GKernelName','l2g_pixel_tool')
89 kwarg.setdefault('StripL2GKernelName','l2g_strip_tool')
90 kwarg.setdefault('PixelEDMPrepKernelName', 'PixelEDMPrep')
91 kwarg.setdefault('StripEDMPrepKernelName', 'StripEDMPrep')
92
93 if ("isRoI_Seeded" in kwarg) and kwarg["isRoI_Seeded"]:
94 if 'RegSelTool' not in kwarg:
95 from RegionSelector.RegSelToolConfig import regSelTool_ITkPixel_Cfg
96 kwarg.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkPixel_Cfg(flags)))
97
98 # Set up Chrono service
99 acc.addService(CompFactory.ChronoStatSvc(
100 PrintUserTime = True,
101 PrintSystemTime = True,
102 PrintEllapsedTime = True
103 ))
104
105 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F100StreamIntegrationAlg(name, **kwarg))
106
107 return acc
108
109def F110IntegrationCfg(flags, name = 'F110IntegrationAlg', **kwarg):
110 acc = ComponentAccumulator()
111
112 kwarg.setdefault('bdfID', flags.FPGADataPrep.bdfID) # On the testbed
113 kwarg.setdefault('xclbin', flags.FPGADataPrep.xclbin)
114 kwarg.setdefault('PixelClusterKernelName','pixel_clustering_tool')
115 kwarg.setdefault('StripClusterKernelName','processHits')
116 kwarg.setdefault('StripL2GKernelName','l2g_strip_tool')
117 kwarg.setdefault('PixelEDMPrepKernelName', 'PixelEDMPrep')
118 kwarg.setdefault('StripEDMPrepKernelName', 'StripEDMPrep')
119
120 if ("isRoI_Seeded" in kwarg) and kwarg["isRoI_Seeded"]:
121 if 'RegSelTool' not in kwarg:
122 from RegionSelector.RegSelToolConfig import regSelTool_ITkPixel_Cfg
123 kwarg.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkPixel_Cfg(flags)))
124
125 # Set up Chrono service
126 acc.addService(CompFactory.ChronoStatSvc(
127 PrintUserTime = True,
128 PrintSystemTime = True,
129 PrintEllapsedTime = True
130 ))
131
132 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F110IntegrationAlg(name, **kwarg))
133
134 return acc
135
136def F110StreamIntegrationCfg(flags, name = 'F110StreamIntegrationAlg', **kwarg):
137 acc = ComponentAccumulator()
138
139 kwarg.setdefault('bdfID', flags.FPGADataPrep.bdfID) # On the testbed
140 kwarg.setdefault('xclbin', flags.FPGADataPrep.xclbin)
141 kwarg.setdefault('PixelStartClusterKernelName','pixelLoader')
142 kwarg.setdefault('PixelEndClusterKernelName','PixelEDMWriter')
143
144 kwarg.setdefault('StripStartClusterKernelName','stripLoader')
145 kwarg.setdefault('StripEndClusterKernelName','StripEDMWriter')
146
147 if ("isRoI_Seeded" in kwarg) and kwarg["isRoI_Seeded"]:
148 if 'RegSelTool' not in kwarg:
149 from RegionSelector.RegSelToolConfig import regSelTool_ITkPixel_Cfg
150 kwarg.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkPixel_Cfg(flags)))
151
152 # Set up Chrono service
153 acc.addService(CompFactory.ChronoStatSvc(
154 PrintUserTime = True,
155 PrintSystemTime = True,
156 PrintEllapsedTime = True
157 ))
158
159 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F110StreamIntegrationAlg(name, **kwarg))
160
161 return acc
162
163
164def F100DataEncodingCfg(flags, name = 'F100DataEncodingAlg', **kwarg):
165 acc = ComponentAccumulator()
166
167 # Set up Cluster maker tool
168 if("FPGADataFormatTool" not in kwarg):
169 from EFTrackingFPGAPipeline.DataPrepConfig import FPGADataFormatToolCfg
170 dataFormatTool = acc.popToolsAndMerge(FPGADataFormatToolCfg(flags))
171 kwarg.setdefault('FPGADataFormatTool', dataFormatTool)
172
173 kwarg.setdefault('isRoI_Seeded', False)
174
175 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F100DataEncodingAlg(name, **kwarg))
176
177 return acc
178
179def F100EDMConversionCfg(flags, name = 'F100EDMConversionAlg', **kwarg):
180 acc = ComponentAccumulator()
181
182 from ActsConfig.ActsUtilities import extractChildKwargs
183
184 # Set up Cluster maker tool
185 if("xAODClusterMaker" not in kwarg):
186 from EFTrackingFPGAPipeline.DataPrepConfig import xAODClusterMakerCfg
187 clusterMakerTool = acc.popToolsAndMerge(xAODClusterMakerCfg(flags,name="xAODClusterMakerTool",
188 **extractChildKwargs(prefix="xAODClusterMakerTool.", **kwarg)))
189 kwarg.setdefault('F100EDMConversionAlg.xAODClusterMaker', clusterMakerTool)
190
191 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F100EDMConversionAlg(name,
192 **extractChildKwargs(prefix="F100EDMConversionAlg.", **kwarg)))
193
194 return acc
195
196
197def FPGAClusterSortingCfg(flags,**kwargs):
198 acc = ComponentAccumulator()
199 from FPGAClusterSorting.FPGAClusterSortingConfig import FPGAClusterSortingAlgCfg
200 ClusterSorting = FPGAClusterSortingAlgCfg(flags,**kwargs)
201
202 acc.merge(ClusterSorting)
203 return acc
204
205def F100FlagsCfg(flags):
206 flags.Scheduler.ShowDataDeps=True
207 flags.Scheduler.CheckDependencies=True
208 flags.Debug.DumpEvtStore=False
209
210 return flags
211
212
213def FPGADataPreparation(flags,runStandalone=False): # thsi is used to run the F100 through Reco_tf
214 kwargs = {}
215 kwargs.setdefault('FPGAThreads', flags.Concurrency.NumThreads)
216 acc = ComponentAccumulator()
217 acc.merge(F100DataEncodingCfg(flags))
218
219 if(flags.FPGADataPrep.doCodeType == "F1X0"):
220 acc.merge(F1X0IntegrationCfg(flags, "F1X0IntegrationAlg", **kwargs))
221 elif(flags.FPGADataPrep.doCodeType == "F1X0XRT"):
222 acc.merge(F1X0XRTIntegrationCfg(flags, "F1X0XRTIntegrationAlg", **kwargs))
223 elif(flags.FPGADataPrep.doCodeType == "F100Stream"):
224 acc.merge(F100StreamIntegrationCfg(flags, "F100StreamIntegrationAlg", **kwargs))
225 elif(flags.FPGADataPrep.doCodeType == "F110"):
226 acc.merge(F110IntegrationCfg(flags, "F110IntegrationAlg", **kwargs))
227 elif(flags.FPGADataPrep.doCodeType == "F110Stream"):
228 acc.merge(F110StreamIntegrationCfg(flags, "F110StreamIntegrationAlg", **kwargs))
229 else:
230 print("Code Type is not recognized")
231 exit(1)
232
233 acc.merge(F100EDMConversionCfg(flags,
234 **{'xAODClusterMakerTool.PixelClusterContainerKey':
235 'FPGAPixelClusters' if flags.FPGADataPrep.DoClusterSorting else'ITkPixelClusters',
236 'xAODClusterMakerTool.StripClusterContainerKey':
237 'FPGAStripClusters' if flags.FPGADataPrep.DoClusterSorting else 'ITkStripClusters'}))
238 if(flags.FPGADataPrep.DoClusterSorting):
239 acc.merge(FPGAClusterSortingCfg(flags,
240 **{'sortedxAODPixelClusterContainer':
241 'SortedFPGAPixelClusters' if runStandalone else 'ITkPixelClusters',
242 'sortedxAODStripClusterContainer':
243 'SortedFPGAStripClusters' if runStandalone else 'ITkStripClusters'}))
244
245 if(not runStandalone):
246 if(not flags.FPGADataPrep.ForTiming):
247 from FPGATrackSimReporting.FPGATrackSimReportingConfig import FPGATrackSimReportingCfg
248 acc.merge(FPGATrackSimReportingCfg(flags,
249 perEventReports = False, # set to True if per-event information is needed for debugging (e.g. cluster, tracks). Otherwise it produces a lot of output
250 **{'xAODPixelClusterContainers' : ['ITkPixelClusters'],
251 'xAODStripClusterContainers' : ['ITkStripClusters'],
252 'FPGAActsTracks' : [],
253 'isDataPrep': True} ))
254
255 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
256 acc.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
257
258 from SCT_ConditionsAlgorithms.ITkStripConditionsAlgorithmsConfig import ITkStripDetectorElementStatusAlgCfg
259 acc.merge(ITkStripDetectorElementStatusAlgCfg(flags))
260
261 if flags.Acts.EDM.PersistifyClusters or flags.Acts.EDM.PersistifySpacePoints:
262 toAOD = []
263
264 pixel_cluster_shortlist = ['-pixelClusterLink']
265 strip_cluster_shortlist = ['-sctClusterLink']
266
267 pixel_cluster_variables = '.'.join(pixel_cluster_shortlist)
268 strip_cluster_variables = '.'.join(strip_cluster_shortlist)
269
270 toAOD += ['xAOD::PixelClusterContainer#ITkPixelClusters',
271 'xAOD::PixelClusterAuxContainer#ITkPixelClustersAux.' + pixel_cluster_variables,
272 'xAOD::StripClusterContainer#ITkStripClusters',
273 'xAOD::StripClusterAuxContainer#ITkStripClustersAux.' + strip_cluster_variables]
274 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
275 acc.merge(addToAOD(flags, toAOD))
276 return acc
277
278
279
280
281
282if __name__ == "__main__":
283 from AthenaConfiguration.AllConfigFlags import initConfigFlags
284 flags = initConfigFlags()
285
286 flags.Detector.EnableCalo = False
287 flags.FPGADataPrep.DoActs = True
288 flags.Acts.doRotCorrection = False
289
290 flags.Concurrency.NumThreads = 1
291 flags.Input.Files = ["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/PhaseIIUpgrade/EFTracking/ATLAS-P2-RUN4-03-00-00/RDO/reg0_singlemu.root"]
292 # flags.Input.Files = ["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/PhaseIIUpgrade/RDO/ATLAS-P2-RUN4-03-00-00/mc21_14TeV.601229.PhPy8EG_A14_ttbar_hdamp258p75_SingleLep.recon.RDO.e8481_s4149_r14700/RDO.33629020._000047.pool.root.1"]
293 flags.Output.AODFileName = "FPGA.Benchmark.AOD.pool.root"
294 flags.Debug.DumpEvtStore=False
295 flags.fillFromArgs()
296
297 if(not flags.FPGADataPrep.ForTiming):
298 # DataPreparation Pipeline doesn't do spacepoint fomration, we need ACTS to do it
299 flags.FPGADataPrep.PassThrough.ClusterOnly = True
300 # For Spacepoint formation
301 if flags.FPGADataPrep.PassThrough.ClusterOnly:
302 flags.Acts.useCache = False
303 flags.Tracking.ITkMainPass.doActsSeed = True
304
305 flags.Tracking.ITkMainPass.doAthenaToActsCluster = True
306 flags.Tracking.ITkMainPass.doAthenaToActsSpacePoint = True
307 flags.Tracking.ITkMainPass.doAthenaSpacePoint = True
308 else:
309 flags.Tracking.doTruth=False
310 flags.ITk.doTruth=False
311 flags.InDet.doTruth=False
312
313 flags.lock()
314 flags = flags.cloneAndReplace("Tracking.ActiveConfig", "Tracking.ITkMainPass", keepOriginal=True)
315
316 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
317 cfg = MainServicesCfg(flags)
318
319 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
320 cfg.merge(PoolReadCfg(flags))
321
322 if(not flags.FPGADataPrep.ForTiming):
323 #Truth
324 if flags.Input.isMC:
325 from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
326 cfg.merge(GEN_AOD2xAODCfg(flags))
327
328 # Standard reco
329 from InDetConfig.ITkTrackRecoConfig import ITkTrackRecoCfg
330 cfg.merge(ITkTrackRecoCfg(flags))
331
332 from InDetConfig.InDetPrepRawDataToxAODConfig import TruthParticleIndexDecoratorAlgCfg
333 cfg.merge( TruthParticleIndexDecoratorAlgCfg(flags) )
334
335 else:
336 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
337 cfg.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
338
339 cfg.merge(FPGADataPreparation(flags,runStandalone=True))
340
341 OutputItemList = []
342 # # Connection to ACTS
343 if flags.FPGADataPrep.DoActs:
344
345 # convert xAOD Clusters to SPs
346 from EFTrackingFPGAUtility.DataPrepToActsConfig import UseActsSpacePointFormationCfg
347 cfg.merge(UseActsSpacePointFormationCfg(flags))
348
349
350 # Run the ACTS Fast Tracking on FPGA clusters
351 from FPGATrackSimConfTools.FPGATrackSimDataPrepConfig import FPGATrackSimDataPrepConnectToFastTracking
352 cfg.merge(FPGATrackSimDataPrepConnectToFastTracking(flags, FinalTracks="FPGA",
353 **{'PixelSeedingAlg.InputSpacePoints' : ['FPGAPixelSpacePoints'],
354 'StripSeedingAlg.InputSpacePoints' : [''],
355 'TrackFindingAlg.UncalibratedMeasurementContainerKeys' : ["SortedFPGAPixelClusters","SortedFPGAStripClusters"],
356 'PixelClusterToTruthAssociationAlg.Measurements' : 'SortedFPGAPixelClusters',
357 'StripClusterToTruthAssociationAlg.Measurements' : 'SortedFPGAStripClusters'}))
358 if(not flags.FPGADataPrep.ForTiming):
359
360 # Run the ACTS Fast Tracking (C-100) as an additional reference
361 cfg.merge(FPGATrackSimDataPrepConnectToFastTracking(flags, FinalTracks="ActsFast"))
362
363 OutputItemList += [
364 "xAOD::TrackParticleContainer#FPGATrackParticles",
365 "xAOD::TrackParticleAuxContainer#FPGATrackParticlesAux."
366 ]
367
368
369 if(not flags.FPGADataPrep.ForTiming):
370 OutputItemList += [
371 "xAOD::StripClusterContainer#FPGAStripClusters",
372 "xAOD::StripClusterAuxContainer#FPGAStripClustersAux.",
373 "xAOD::PixelClusterContainer#FPGAPixelClusters",
374 "xAOD::PixelClusterAuxContainer#FPGAPixelClustersAux.",
375 ]
376
377 from EFTrackingFPGAOutputValidation.FPGAOutputValidationConfig import FPGAOutputValidationCfg
378 cfg.merge(FPGAOutputValidationCfg(flags, **{
379 "pixelKeys": ["FPGAPixelClusters", "ITkPixelClusters"],
380 "stripKeys": ["FPGAStripClusters", "ITkStripClusters"],
381 'doDiffHistograms':True,
382 'matchByID' : False,
383 'allowedRdoMisses': 1000}))
384
385
386 # Prepare output
387 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
388 from AthenaConfiguration.Enums import MetadataCategory
389 cfg.merge(SetupMetaDataForStreamCfg(flags,"AOD",
390 createMetadata=[
391 MetadataCategory.ByteStreamMetaData,
392 MetadataCategory.LumiBlockMetaData,
393 MetadataCategory.TruthMetaData,
394 MetadataCategory.IOVMetaData,],))
395
396 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
397 cfg.merge(addToAOD(flags, OutputItemList))
398
399 flags.dump()
400
401 from AthenaCommon.Constants import DEBUG
402 cfg.foreach_component("AthEventSeq/*").OutputLevel = DEBUG
403 cfg.printConfig(withDetails=True, summariseProps=True)
404 cfg.store(open("F100IntegrationAlg.pkl", "wb"))
405 cfg.run(flags.Exec.MaxEvents)
406
407
408
if(febId1==febId2)
void print(char *figname, TCanvas *c1)
FPGAClusterSortingCfg(flags, **kwargs)
FPGADataPreparation(flags, runStandalone=False)
F1X0IntegrationCfg(flags, name='F1X0IntegrationAlg', **kwarg)
F100DataEncodingCfg(flags, name='F100DataEncodingAlg', **kwarg)
F110StreamIntegrationCfg(flags, name='F110StreamIntegrationAlg', **kwarg)
F100EDMConversionCfg(flags, name='F100EDMConversionAlg', **kwarg)
F1X0XRTIntegrationCfg(flags, name='F1X0IntegrationAlg', **kwarg)
F110IntegrationCfg(flags, name='F110IntegrationAlg', **kwarg)
F100StreamIntegrationCfg(flags, name='F100StreamIntegrationAlg', **kwarg)