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 F110IntegrationCfg(flags, name = 'F110IntegrationAlg', **kwarg):
46 acc = ComponentAccumulator()
47
48 kwarg.setdefault('bdfID', flags.FPGADataPrep.bdfID) # On the testbed
49 kwarg.setdefault('xclbin', flags.FPGADataPrep.xclbin)
50 kwarg.setdefault('PixelClusterKernelName','pixel_clustering_tool')
51 kwarg.setdefault('StripClusterKernelName','processHits')
52 kwarg.setdefault('StripL2GKernelName','l2g_strip_tool')
53 kwarg.setdefault('PixelEDMPrepKernelName', 'PixelEDMPrep')
54 kwarg.setdefault('StripEDMPrepKernelName', 'StripEDMPrep')
55
56 if ("isRoI_Seeded" in kwarg) and kwarg["isRoI_Seeded"]:
57 if 'RegSelTool' not in kwarg:
58 from RegionSelector.RegSelToolConfig import regSelTool_ITkPixel_Cfg
59 kwarg.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkPixel_Cfg(flags)))
60
61 # Set up Chrono service
62 acc.addService(CompFactory.ChronoStatSvc(
63 PrintUserTime = True,
64 PrintSystemTime = True,
65 PrintEllapsedTime = True
66 ))
67
68 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F110IntegrationAlg(name, **kwarg))
69
70 return acc
71
72def F110StreamIntegrationCfg(flags, name = 'F110StreamIntegrationAlg', **kwarg):
73 acc = ComponentAccumulator()
74
75 kwarg.setdefault('bdfID', flags.FPGADataPrep.bdfID) # On the testbed
76 kwarg.setdefault('xclbin', flags.FPGADataPrep.xclbin)
77 kwarg.setdefault('PixelStartClusterKernelName','pixelLoader')
78 kwarg.setdefault('PixelEndClusterKernelName','PixelEDMWriter')
79
80 kwarg.setdefault('StripStartClusterKernelName','stripLoader')
81 kwarg.setdefault('StripEndClusterKernelName','StripEDMWriter')
82
83 kwarg.setdefault('PixelLUTKernelName','LutPixelLoader')
84 kwarg.setdefault('StripLUTKernelName','LutStripLoader')
85
86 kwarg.setdefault('PixelLUTFilePath','/eos/project/a/atlas-eftracking/FPGA_compilation/FPGA_LUTS/v1/PixelLut.dat')
87 kwarg.setdefault('StripLUTFilePath','/eos/project/a/atlas-eftracking/FPGA_compilation/FPGA_LUTS/v1/StripLut.dat')
88
89
90 if ("isRoI_Seeded" in kwarg) and kwarg["isRoI_Seeded"]:
91 if 'RegSelTool' not in kwarg:
92 from RegionSelector.RegSelToolConfig import regSelTool_ITkPixel_Cfg
93 kwarg.setdefault('RegSelTool', acc.popToolsAndMerge(regSelTool_ITkPixel_Cfg(flags)))
94
95 # Set up Chrono service
96 acc.addService(CompFactory.ChronoStatSvc(
97 PrintUserTime = True,
98 PrintSystemTime = True,
99 PrintEllapsedTime = True
100 ))
101
102 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F110StreamIntegrationAlg(name, **kwarg))
103
104 return acc
105
106
107def F100DataEncodingCfg(flags, name = 'F100DataEncodingAlg', **kwarg):
108 acc = ComponentAccumulator()
109
110 # Set up Cluster maker tool
111 if("FPGADataFormatTool" not in kwarg):
112 from EFTrackingFPGAPipeline.FPGAToolsConfig import FPGADataFormatToolCfg
113 dataFormatTool = acc.popToolsAndMerge(FPGADataFormatToolCfg(flags))
114 kwarg.setdefault('FPGADataFormatTool', dataFormatTool)
115
116 kwarg.setdefault('isRoI_Seeded', False)
117
118 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F100DataEncodingAlg(name, **kwarg))
119
120 return acc
121
122def F100EDMConversionCfg(flags, name = 'F100EDMConversionAlg', **kwarg):
123 acc = ComponentAccumulator()
124
125 from ActsConfig.ActsUtilities import extractChildKwargs
126
127 # Set up Cluster maker tool
128 if("xAODClusterMaker" not in kwarg):
129 from EFTrackingFPGAPipeline.FPGAToolsConfig import xAODClusterMakerCfg
130 clusterMakerTool = acc.popToolsAndMerge(xAODClusterMakerCfg(flags,name="xAODClusterMakerTool",
131 **extractChildKwargs(prefix="xAODClusterMakerTool.", **kwarg)))
132 kwarg.setdefault('F100EDMConversionAlg.xAODClusterMaker', clusterMakerTool)
133
134 acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.F100EDMConversionAlg(name,
135 **extractChildKwargs(prefix="F100EDMConversionAlg.", **kwarg)))
136
137 return acc
138
139
140def FPGAClusterSortingCfg(flags,**kwargs):
141 acc = ComponentAccumulator()
142 from FPGAClusterSorting.FPGAClusterSortingConfig import FPGAClusterSortingAlgCfg
143 ClusterSorting = FPGAClusterSortingAlgCfg(flags,**kwargs)
144
145 acc.merge(ClusterSorting)
146 return acc
147
148def F100FlagsCfg(flags):
149 flags.Scheduler.ShowDataDeps=True
150 flags.Scheduler.CheckDependencies=True
151 flags.Debug.DumpEvtStore=False
152
153 return flags
154
155
156def FPGADataPreparation(flags,runStandalone=False): # thsi is used to run the F100 through Reco_tf
157 kwargs = {}
158 kwargs.setdefault('FPGAThreads', flags.Concurrency.NumThreads)
159 acc = ComponentAccumulator()
160
161 from PixelGeoModelXml.ITkPixelGeoModelConfig import ITkPixelReadoutGeometryCfg
162 acc.merge(ITkPixelReadoutGeometryCfg(flags))
163 from StripGeoModelXml.ITkStripGeoModelConfig import ITkStripReadoutGeometryCfg
164 acc.merge(ITkStripReadoutGeometryCfg(flags))
165
166 acc.merge(F100DataEncodingCfg(flags))
167
168 if(flags.FPGADataPrep.doCodeType == "F1X0"):
169 acc.merge(F1X0IntegrationCfg(flags, "F1X0IntegrationAlg", **kwargs))
170 elif(flags.FPGADataPrep.doCodeType == "F110"):
171 acc.merge(F110IntegrationCfg(flags, "F110IntegrationAlg", **kwargs))
172 elif(flags.FPGADataPrep.doCodeType == "F110Stream"):
173 acc.merge(F110StreamIntegrationCfg(flags, "F110StreamIntegrationAlg", **kwargs))
174 else:
175 print("Code Type is not recognized")
176 exit(1)
177
178 acc.merge(F100EDMConversionCfg(flags,
179 **{'xAODClusterMakerTool.PixelClusterContainerKey':
180 'FPGAPixelClusters' if flags.FPGADataPrep.DoClusterSorting else'ITkPixelClusters',
181 'xAODClusterMakerTool.StripClusterContainerKey':
182 'FPGAStripClusters' if flags.FPGADataPrep.DoClusterSorting else 'ITkStripClusters'}))
183 if(flags.FPGADataPrep.DoClusterSorting):
184 acc.merge(FPGAClusterSortingCfg(flags,
185 **{'sortedxAODPixelClusterContainer':
186 'SortedFPGAPixelClusters' if runStandalone else 'ITkPixelClusters',
187 'sortedxAODStripClusterContainer':
188 'SortedFPGAStripClusters' if runStandalone else 'ITkStripClusters'}))
189
190 from FPGATrackSimReporting.FPGATrackSimReportingConfig import FPGATrackSimReportingCfg
191
192 if(not runStandalone):
193 if(not flags.FPGADataPrep.ForTiming):
194 from FPGATrackSimReporting.FPGATrackSimReportingConfig import FPGATrackSimReportingCfg
195 acc.merge(FPGATrackSimReportingCfg(flags,
196 perEventReports = False, # set to True if per-event information is needed for debugging (e.g. cluster, tracks). Otherwise it produces a lot of output
197 **{'xAODPixelClusterContainers' : ['ITkPixelClusters'],
198 'xAODStripClusterContainers' : ['ITkStripClusters'],
199 'FPGAActsTracks' : [],
200 'isDataPrep': True} ))
201
202 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
203 acc.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
204
205 from SCT_ConditionsAlgorithms.ITkStripConditionsAlgorithmsConfig import ITkStripDetectorElementStatusAlgCfg
206 acc.merge(ITkStripDetectorElementStatusAlgCfg(flags))
207
208 if flags.Acts.EDM.PersistifyClusters or flags.Acts.EDM.PersistifySpacePoints:
209 toAOD = []
210
211 pixel_cluster_shortlist = ['-pixelClusterLink']
212 strip_cluster_shortlist = ['-sctClusterLink']
213
214 pixel_cluster_variables = '.'.join(pixel_cluster_shortlist)
215 strip_cluster_variables = '.'.join(strip_cluster_shortlist)
216
217 toAOD += ['xAOD::PixelClusterContainer#ITkPixelClusters',
218 'xAOD::PixelClusterAuxContainer#ITkPixelClustersAux.' + pixel_cluster_variables,
219 'xAOD::StripClusterContainer#ITkStripClusters',
220 'xAOD::StripClusterAuxContainer#ITkStripClustersAux.' + strip_cluster_variables]
221 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
222 acc.merge(addToAOD(flags, toAOD))
223 return acc
224
225
226
227
228
229if __name__ == "__main__":
230 from AthenaConfiguration.AllConfigFlags import initConfigFlags
231 flags = initConfigFlags()
232
233 flags.Detector.EnableCalo = False
234 flags.FPGADataPrep.DoActs = True
235 flags.Acts.doRotCorrection = False
236
237 flags.Concurrency.NumThreads = 1
238 flags.Input.Files = ["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/PhaseIIUpgrade/EFTracking/ATLAS-P2-RUN4-03-00-00/RDO/reg0_singlemu.root"]
239 # 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"]
240 flags.Output.AODFileName = "FPGA.Benchmark.AOD.pool.root"
241 flags.Debug.DumpEvtStore=False
242 flags.fillFromArgs()
243
244 if(not flags.FPGADataPrep.ForTiming):
245 # DataPreparation Pipeline doesn't do spacepoint fomration, we need ACTS to do it
246 flags.FPGADataPrep.PassThrough.ClusterOnly = True
247 # For Spacepoint formation
248 if flags.FPGADataPrep.PassThrough.ClusterOnly:
249 flags.Acts.useCache = False
250 flags.Tracking.ITkMainPass.doActsSeed = True
251
252 flags.Tracking.ITkMainPass.doAthenaToActsCluster = True
253 flags.Tracking.ITkMainPass.doAthenaToActsSpacePoint = True
254 flags.Tracking.ITkMainPass.doAthenaSpacePoint = True
255 else:
256 flags.Tracking.doTruth=False
257 flags.ITk.doTruth=False
258 flags.InDet.doTruth=False
259
260 flags.lock()
261 flags = flags.cloneAndReplace("Tracking.ActiveConfig", "Tracking.ITkMainPass", keepOriginal=True)
262
263 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
264 cfg = MainServicesCfg(flags)
265
266 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
267 cfg.merge(PoolReadCfg(flags))
268
269 if(not flags.FPGADataPrep.ForTiming):
270 #Truth
271 if flags.Input.isMC:
272 from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
273 cfg.merge(GEN_AOD2xAODCfg(flags))
274
275 # Standard reco
276 from InDetConfig.ITkTrackRecoConfig import ITkTrackRecoCfg
277 cfg.merge(ITkTrackRecoCfg(flags))
278
279 from InDetConfig.InDetPrepRawDataToxAODConfig import TruthParticleIndexDecoratorAlgCfg
280 cfg.merge( TruthParticleIndexDecoratorAlgCfg(flags) )
281
282 else:
283 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
284 cfg.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
285
286 cfg.merge(FPGADataPreparation(flags,runStandalone=True))
287
288 OutputItemList = []
289 # # Connection to ACTS
290 if flags.FPGADataPrep.DoActs:
291
292 # convert xAOD Clusters to SPs
293 from EFTrackingFPGAUtility.DataPrepToActsConfig import UseActsSpacePointFormationCfg
294 cfg.merge(UseActsSpacePointFormationCfg(flags))
295
296
297 # Run the ACTS Fast Tracking on FPGA clusters
298 from FPGATrackSimConfTools.FPGATrackSimDataPrepConfig import FPGATrackSimDataPrepConnectToFastTracking
299 cfg.merge(FPGATrackSimDataPrepConnectToFastTracking(flags, FinalTracks="FPGA",
300 **{'PixelSeedingAlg.InputSpacePoints' : ['FPGAPixelSpacePoints'],
301 'StripSeedingAlg.InputSpacePoints' : [''],
302 'TrackFindingAlg.UncalibratedMeasurementContainerKeys' : ["SortedFPGAPixelClusters","SortedFPGAStripClusters"],
303 'PixelClusterToTruthAssociationAlg.Measurements' : 'SortedFPGAPixelClusters',
304 'StripClusterToTruthAssociationAlg.Measurements' : 'SortedFPGAStripClusters'}))
305 if(not flags.FPGADataPrep.ForTiming):
306
307 # Run the ACTS Fast Tracking (C-100) as an additional reference
308 cfg.merge(FPGATrackSimDataPrepConnectToFastTracking(flags, FinalTracks="ActsFast"))
309
310 OutputItemList += [
311 "xAOD::TrackParticleContainer#FPGATrackParticles",
312 "xAOD::TrackParticleAuxContainer#FPGATrackParticlesAux."
313 ]
314
315
316 if(not flags.FPGADataPrep.ForTiming):
317 OutputItemList += [
318 "xAOD::StripClusterContainer#FPGAStripClusters",
319 "xAOD::StripClusterAuxContainer#FPGAStripClustersAux.",
320 "xAOD::PixelClusterContainer#FPGAPixelClusters",
321 "xAOD::PixelClusterAuxContainer#FPGAPixelClustersAux.",
322 ]
323
324 from EFTrackingFPGAOutputValidation.FPGAOutputValidationConfig import FPGAOutputValidationCfg
325 cfg.merge(FPGAOutputValidationCfg(flags, **{
326 "pixelKeys": ["FPGAPixelClusters", "ITkPixelClusters"],
327 "stripKeys": ["FPGAStripClusters", "ITkStripClusters"],
328 'doDiffHistograms':True,
329 'matchByID' : False,
330 'allowedRdoMisses': 1000}))
331
332
333 # Prepare output
334 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
335 from AthenaConfiguration.Enums import MetadataCategory
336 cfg.merge(SetupMetaDataForStreamCfg(flags,"AOD",
337 createMetadata=[
338 MetadataCategory.ByteStreamMetaData,
339 MetadataCategory.LumiBlockMetaData,
340 MetadataCategory.TruthMetaData,
341 MetadataCategory.IOVMetaData,],))
342
343 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
344 cfg.merge(addToAOD(flags, OutputItemList))
345
346 flags.dump()
347
348 from AthenaCommon.Constants import DEBUG
349 cfg.foreach_component("AthEventSeq/*").OutputLevel = DEBUG
350 cfg.printConfig(withDetails=True, summariseProps=True)
351 cfg.store(open("F100IntegrationAlg.pkl", "wb"))
352 cfg.run(flags.Exec.MaxEvents)
353
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)
F110IntegrationCfg(flags, name='F110IntegrationAlg', **kwarg)