ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimDataPrepConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3from AthenaConfiguration.ComponentFactory import CompFactory
4from AthenaCommon.Logging import AthenaLogger
5from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6from math import pi
7from FPGATrackSimConfTools.FPGATrackSimHelperFunctions import convertRegionsExpressionToArray
8
9
10def nameWithRegionSuffix(flags, basename):
11 return f"{basename}_reg{flags.Trigger.FPGATrackSim.region}"
12
13
14def getRegionNumber(nPiOver16Min, minAbsEta, isPositiveEta, verbosePrint=True):
15 binSizePhi = pi/16
16 binSizeEta = 0.2
17 region = nPiOver16Min
18 if (nPiOver16Min >= 32 or nPiOver16Min < 0):
19 print("You are asking for nPiOver16 = ",nPiOver16Min," but we only have 32 phi bins! Returning -1")
20 return -1
21 if (minAbsEta > 3.81 or minAbsEta < 0):
22 print("You are asking for minAbsEta = ",minAbsEta," but we only have 20 abs eta bins! Returning -1")
23 return -1
24 if not (isPositiveEta == 0 or isPositiveEta == 1):
25 print("You are asking for isPositiveEta = ",isPositiveEta, " but this should only be 0 or 1! Returning -1")
26 return -1
27
28 etanum = round(minAbsEta / binSizeEta)
29 mineta = binSizeEta*etanum
30 maxeta = binSizeEta*(etanum+1)
31 if (not isPositiveEta):
32 mineta = -binSizeEta*(etanum+1)
33 maxeta = -binSizeEta*etanum
34
35 region = region | ((isPositiveEta & 0x1) << 5)
36 region = region | (etanum << 6)
37 if (verbosePrint):
38 print("I am returning the region number for minphi =",nPiOver16Min, "*pi/16, which is equal to",binSizePhi*nPiOver16Min)
39 print(" and maxphi =",nPiOver16Min+1, "*pi/16, which is equal to",binSizePhi*(nPiOver16Min+1))
40 print(" and mineta =",mineta, "and max eta =", maxeta)
41
42 return region
43
44
45def getBaseName(flags):
46 if (flags.Trigger.FPGATrackSim.oldRegionDefs):
47 if (not (flags.Trigger.FPGATrackSim.baseName == '')):
48 return flags.Trigger.FPGATrackSim.baseName
49 elif (flags.Trigger.FPGATrackSim.region == 0):
50 return 'eta0103phi0305'
51 elif (flags.Trigger.FPGATrackSim.region == 1):
52 return 'eta0709phi0305'
53 elif (flags.Trigger.FPGATrackSim.region == 2):
54 return 'eta1214phi0305'
55 elif (flags.Trigger.FPGATrackSim.region == 3):
56 return 'eta2022phi0305'
57 elif (flags.Trigger.FPGATrackSim.region == 4):
58 return 'eta3234phi0305'
59 elif (flags.Trigger.FPGATrackSim.region == 5):
60 return 'eta0103phi1113'
61 elif (flags.Trigger.FPGATrackSim.region == 6):
62 return 'eta0103phi1921'
63 elif (flags.Trigger.FPGATrackSim.region == 7):
64 return 'eta0103phi3436'
65 else:
66 return 'default'
67 else:
68 if (flags.Trigger.FPGATrackSim.region >= 1280 or flags.Trigger.FPGATrackSim.region < 0): return 'default'
69 else:
70 return "region"+str(flags.Trigger.FPGATrackSim.region)
71
72def getPhiRange(flags):
73 if (flags.Trigger.FPGATrackSim.oldRegionDefs):
74 if (not (flags.Trigger.FPGATrackSim.baseName == '')):
75 return [0.3,0.5]
76 elif (flags.Trigger.FPGATrackSim.region == 0):
77 return [0.3,0.5]
78 elif (flags.Trigger.FPGATrackSim.region == 1):
79 return [0.3,0.5]
80 elif (flags.Trigger.FPGATrackSim.region == 2):
81 return [0.3,0.5]
82 elif (flags.Trigger.FPGATrackSim.region == 3):
83 return [0.3,0.5]
84 elif (flags.Trigger.FPGATrackSim.region == 4):
85 return [0.3,0.5]
86 elif (flags.Trigger.FPGATrackSim.region == 5):
87 return [1.1,1.3]
88 elif (flags.Trigger.FPGATrackSim.region == 6):
89 return [1.9,2.1]
90 elif (flags.Trigger.FPGATrackSim.region == 7):
91 return [3.4,3.6]
92 else:
93 return [0.3,0.5]
94 else:
95 binSize = pi/16
96 phiBin=flags.Trigger.FPGATrackSim.region & 0x1f
97 if (flags.Trigger.FPGATrackSim.region >= 1280 or flags.Trigger.FPGATrackSim.region < 0): return [binSize*2,binSize*3]
98 else:
99 return [binSize*phiBin,binSize*(phiBin+1)]
100
101def getEtaRange(flags):
102 if (flags.Trigger.FPGATrackSim.oldRegionDefs):
103 if (not (flags.Trigger.FPGATrackSim.baseName == '')):
104 return [0.1,0.3]
105 elif (flags.Trigger.FPGATrackSim.region == 0):
106 return [0.1,0.3]
107 elif (flags.Trigger.FPGATrackSim.region == 1):
108 return [0.7,0.9]
109 elif (flags.Trigger.FPGATrackSim.region == 2):
110 return [1.2,1.4]
111 elif (flags.Trigger.FPGATrackSim.region == 3):
112 return [2.0,2.2]
113 elif (flags.Trigger.FPGATrackSim.region == 4):
114 return [3.2,3.4]
115 elif (flags.Trigger.FPGATrackSim.region == 5):
116 return [0.1,0.3]
117 elif (flags.Trigger.FPGATrackSim.region == 6):
118 return [0.1,0.3]
119 elif (flags.Trigger.FPGATrackSim.region == 7):
120 return [0.1,0.3]
121 else:
122 return [0.3,0.5]
123 else:
124 if (flags.Trigger.FPGATrackSim.region >= 1280 or flags.Trigger.FPGATrackSim.region < 0): return [0.2,0.4]
125 else:
126 binSize = 0.2
127 side = (flags.Trigger.FPGATrackSim.region >> 5) & 0x1
128 etaBin = (flags.Trigger.FPGATrackSim.region >> 6) & 0x1f
129 if (side): return [binSize*etaBin,binSize*(etaBin+1)]
130 else: return [-binSize*(etaBin+1),-binSize*etaBin]
131
132
133def getEtaSideBits(flags):
134 # this includes both the eta and side bits
135 return flags.Trigger.FPGATrackSim.region >> 5
136
137def FPGATrackSimRawLogicCfg(flags,name="FPGATrackSimRawLogicTool"):
138 result=ComponentAccumulator()
139 FPGATrackSimRawLogic = CompFactory.FPGATrackSimRawToLogicalHitsTool(nameWithRegionSuffix(flags,name))
140 FPGATrackSimRawLogic.SaveOptional = 2
141 if (flags.Trigger.FPGATrackSim.ActiveConfig.sampleType == 'skipTruth'):
142 FPGATrackSimRawLogic.SaveOptional = 1
143 FPGATrackSimRawLogic.TowersToMap = [0] # TODO TODO why is this hardcoded?
144 FPGATrackSimRawLogic.FPGATrackSimEventSelectionSvc = result.getPrimaryAndMerge(FPGATrackSimEventSelectionSvcCfg(flags))
145 FPGATrackSimRawLogic.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimMappingCfg(flags))
146 result.addPublicTool(FPGATrackSimRawLogic,primary=True)
147 return result
148
150 result=ComponentAccumulator()
151 SpacePointTool = CompFactory.FPGATrackSimSpacePointsTool()
152 SpacePointTool.Filtering = flags.Trigger.FPGATrackSim.ActiveConfig.spacePointFiltering
153 SpacePointTool.FilteringClosePoints = False
154 SpacePointTool.PhiWindow = 0.004
155 SpacePointTool.Duplication = True
156 result.addPublicTool(SpacePointTool, primary=True)
157 return result
158
159
161 newFlags = flags.cloneAndReplace("Trigger.FPGATrackSim.ActiveConfig", "Trigger.FPGATrackSim." + flags.Trigger.FPGATrackSim.algoTag)
162 return newFlags
163
164
166 result=ComponentAccumulator()
167
168 FPGATrackSimWriteOutput = CompFactory.FPGATrackSimOutputHeaderTool("FPGATrackSimWriteOutputDataPrep")
169 FPGATrackSimWriteOutput.InFileName = ["test.root"]
170 FPGATrackSimWriteOutput.OutputTreeName = "FPGATrackSimDataPrepTree"
171 from FPGATrackSimConfTools.FPGATrackSimHelperFunctions import convertRegionsExpressionToArray
172 writeThis=flags.Trigger.FPGATrackSim.writeAdditionalOutputData and ((flags.Trigger.FPGATrackSim.regionToWriteDPTree in convertRegionsExpressionToArray(flags.Trigger.FPGATrackSim.regionList)) or (flags.Trigger.FPGATrackSim.regionToWriteDPTree < 0))
173
174 if not writeThis:
175 FPGATrackSimWriteOutput.EventLimit = 0
176 else:
177 FPGATrackSimWriteOutput.EventLimit = flags.Trigger.FPGATrackSim.writeOutputEventLimit
178 if flags.Trigger.FPGATrackSim.writeRegion>=0: # negative is off
179 FPGATrackSimWriteOutput.RequireActivation=True
180 # RECREATE means that that this tool opens the file.
181 # HEADER would mean that something else (e.g. THistSvc) opens it and we just add the object.
182 FPGATrackSimWriteOutput.RWstatus = "HEADER"
183 FPGATrackSimWriteOutput.THistSvc = CompFactory.THistSvc()
184 result.addPublicTool(FPGATrackSimWriteOutput, primary=True)
185 return result
186
187def FPGAConversionAlgCfg(inputFlags, name = 'FPGAConversionAlg', stage = '', **kwargs):
188
190
191 result=ComponentAccumulator()
192 from StripGeoModelXml.ITkStripGeoModelConfig import ITkStripReadoutGeometryCfg
193 result.merge(ITkStripReadoutGeometryCfg(flags))
194
195 kwargs.setdefault("FPGATrackSimClusterKey", "FPGAClusters_1st")
196 kwargs.setdefault("FPGATrackSimHitKey", "FPGAHits%s" %(stage))
197 kwargs.setdefault("FPGATrackSimRoadKey", "FPGARoads")
198 kwargs.setdefault("FPGATrackSimTrackKey", "FPGATracks")
199 kwargs.setdefault("xAODPixelClusterFromFPGAClusterKey", "xAODPixelClustersFromFPGACluster")
200 kwargs.setdefault("xAODStripClusterFromFPGAClusterKey", "xAODStripClustersFromFPGACluster")
201 kwargs.setdefault("xAODStripSpacePointFromFPGAKey", "xAODStripSpacePoints%sFromFPGA" %(stage))
202 kwargs.setdefault("xAODPixelSpacePointFromFPGAKey", "xAODPixelSpacePoints%sFromFPGA" %(stage))
203 kwargs.setdefault("xAODPixelClusterFromFPGAHitKey", "xAODPixelClusters%sFromFPGAHit" %(stage))
204 kwargs.setdefault("xAODStripClusterFromFPGAHitKey", "xAODStripClusters%sFromFPGAHit" %(stage))
205 kwargs.setdefault("ActsProtoTrackFromFPGARoadKey", "ActsProtoTracks%sFromFPGARoad" %(stage))
206 kwargs.setdefault("ActsProtoTrackFromFPGATrackKey", "ActsProtoTracks%sFromFPGATrack" %(stage))
207 kwargs.setdefault("doHits", False)
208 kwargs.setdefault("doClusters", True)
209 kwargs.setdefault("doActsTrk", False)
210 kwargs.setdefault("useRoads", False)
211 kwargs.setdefault("ClusterConverter", result.popToolsAndMerge(FPGAClusterConverterCfg(flags)))
212 kwargs.setdefault("ActsTrkConverter", result.popToolsAndMerge(FPGAActsTrkConverterCfg(flags)))
213
214 ConvertionAlgorithm = CompFactory.FPGAConversionAlgorithm(name, **kwargs)
215 ConvertionAlgorithm.ClusterConverter.doLorentzShift=False # this should not be turned on unless needed for validation purposes
216
217 result.addEventAlgo(ConvertionAlgorithm)
218 return result
219
221 result=ComponentAccumulator()
222 FPGAClusterConverter = CompFactory.FPGAClusterConverter()
223 FPGAClusterConverter.doLorentzShift=True
224
225 from SiLorentzAngleTool.ITkPixelLorentzAngleConfig import ITkPixelLorentzAngleToolCfg
226 FPGAClusterConverter.LorentzAngleToolPixel = result.popToolsAndMerge(ITkPixelLorentzAngleToolCfg(flags))
227
228 from SiLorentzAngleTool.ITkStripLorentzAngleConfig import ITkStripLorentzAngleToolCfg
229 FPGAClusterConverter.LorentzAngleToolStrip = result.popToolsAndMerge(ITkStripLorentzAngleToolCfg(flags))
230
231 result.setPrivateTools(FPGAClusterConverter)
232
233 return result
234
235
237 result=ComponentAccumulator()
238 FPGAActsTrkConverter = CompFactory.FPGAActsTrkConverter()
239 result.setPrivateTools(FPGAActsTrkConverter)
240
241 return result
242
243
244def WriteToAOD(flags, stage = '',finalTrackParticles = ''): # store xAOD containers in AOD file
245 result = ComponentAccumulator()
246 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
247 from OutputStreamAthenaPool.OutputStreamConfig import outputStreamName
248 from AthenaConfiguration.Enums import MetadataCategory
249
250 result.merge( SetupMetaDataForStreamCfg( flags,"AOD",
251 createMetadata=[
252 MetadataCategory.ByteStreamMetaData,
253 MetadataCategory.LumiBlockMetaData,
254 MetadataCategory.TruthMetaData,
255 MetadataCategory.IOVMetaData,],)
256 )
257 log.info("AOD ItemList: %s", result.getEventAlgo(outputStreamName("AOD")).ItemList)
258 log.info("AOD MetadataItemList: %s", result.getEventAlgo(outputStreamName("AOD")).MetadataItemList)
259 log.info("---------- Configured AOD writing")
260
261 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
262 toAOD = [f"xAOD::TrackParticleContainer#{finalTrackParticles}",f"xAOD::TrackParticleAuxContainer#{finalTrackParticles}Aux."]
263 if flags.Trigger.FPGATrackSim.writeClustersToAOD:
264 toAOD += ["xAOD::PixelClusterContainer#xAODPixelClustersFromFPGACluster","xAOD::PixelClusterAuxContainer#xAODPixelClustersFromFPGAClusterAux.",
265 "xAOD::StripClusterContainer#xAODStripClustersFromFPGACluster","xAOD::StripClusterAuxContainer#xAODStripClustersFromFPGAClusterAux."]
266 if flags.Trigger.FPGATrackSim.writeOfflPRDInfo:
267 toAOD += ['xAOD::TrackMeasurementValidationContainer#ITkPixelMeasurements_offl','xAOD::TrackMeasurementValidationAuxContainer#ITkPixelMeasurements_offlAux.',
268 'xAOD::TrackMeasurementValidationContainer#ITkStripMeasurements_offl','xAOD::TrackMeasurementValidationAuxContainer#ITkStripMeasurements_offlAux.']
269 if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
270 toAOD += [f"xAOD::SpacePointContainer#xAODPixelSpacePoints{stage}FromFPGA",f"xAOD::SpacePointAuxContainer#xAODPixelSpacePoints{stage}FromFPGAAux.-measurements",
271 f"xAOD::SpacePointContainer#xAODStripSpacePoints{stage}FromFPGA",f"xAOD::SpacePointAuxContainer#xAODStripSpacePoints{stage}FromFPGAAux.-measurements.-sctSpacePointLink"]
272
273 result.merge(addToAOD(flags, toAOD))
274
275 return result
276
277
278def FPGATrackSimEventSelectionSvcCfg(flags,name="FPGATrackSimEventSelectionSvc"):
279
280 result=ComponentAccumulator()
281 eventSelector = CompFactory.FPGATrackSimEventSelectionSvc(nameWithRegionSuffix(flags,name))
282 eventSelector.regions = flags.Trigger.FPGATrackSim.slicesFile
283 eventSelector.regionID = flags.Trigger.FPGATrackSim.region
284 eventSelector.sampleType = flags.Trigger.FPGATrackSim.sampleType
285 eventSelector.skipRegionCheck = flags.Trigger.FPGATrackSim.pipeline.startswith('F-1') # if set to True, it will essentially run for the whole detector
286 eventSelector.withPU = False
287 eventSelector.oldRegionDefs = flags.Trigger.FPGATrackSim.oldRegionDefs
288
289
290 eventSelector.mind0 = flags.Trigger.FPGATrackSim.d0min
291 eventSelector.maxd0 = flags.Trigger.FPGATrackSim.d0max
292 eventSelector.minz0 = flags.Trigger.FPGATrackSim.z0min
293 eventSelector.maxz0 = flags.Trigger.FPGATrackSim.z0max
294 eventSelector.minqOverPt = flags.Trigger.FPGATrackSim.qOverPtmin
295 eventSelector.maxqOverPt = flags.Trigger.FPGATrackSim.qOverPtmax
296
297 result.addService(eventSelector, create=True, primary=True)
298 return result
299
300def FPGATrackSimEventSelectionToolCfg(flags,name="FPGATrackSimEventSelectionTool"):
301 result=ComponentAccumulator()
302 eventSelectionTool=CompFactory.FPGATrackSim.FPGATrackSimEventSelectionTool(nameWithRegionSuffix(flags,name))
303 eventSelectionTool.evtSelectionService = result.getPrimaryAndMerge(FPGATrackSimEventSelectionSvcCfg(flags))
304
305 result.addPublicTool(eventSelectionTool, primary=True)
306 return result
307
308def FPGATrackSimMappingCfg(flags,name="FPGATrackSimMappingSvc"):
309 result=ComponentAccumulator()
310 mappingSvc = CompFactory.FPGATrackSimMappingSvc(nameWithRegionSuffix(flags,name))
311 mappingSvc.regionID = flags.Trigger.FPGATrackSim.region
312 mappingSvc.mappingType = "FILE"
313 mappingSvc.rmap = flags.Trigger.FPGATrackSim.mapsDir+"/"+getBaseName(flags)+".rmap" # we need more configurability here i.e. file choice should depend on some flag
314 mappingSvc.subrmap = flags.Trigger.FPGATrackSim.mapsDir+"/"+getBaseName(flags)+".rmap" # At this point this is the same as the region map, so let's not have two files
315 mappingSvc.pmap = flags.Trigger.FPGATrackSim.mapsDir+"/"+getBaseName(flags)+".pmap"
316 mappingSvc.modulemap = flags.Trigger.FPGATrackSim.mapsDir+"/moduleidmap"
317 mappingSvc.radiiFile = flags.Trigger.FPGATrackSim.mapsDir + "/"+getBaseName(flags)+"_radii.txt"
318 mappingSvc.radiiFile2nd = flags.Trigger.FPGATrackSim.mapsDir + "/"+getBaseName(flags)+"_radii_2nd.txt"
319 mappingSvc.loadRadii = (not flags.Trigger.FPGATrackSim.ActiveConfig.GNN) and flags.Trigger.FPGATrackSim.loadRadii
320 mappingSvc.loadRegionMap = flags.Trigger.FPGATrackSim.loadRegionMap
321 mappingSvc.DoGNNTrack = flags.Trigger.FPGATrackSim.GNN.doGNNTracking
322
323 mappingSvc.FakeNNonnx1st = flags.Trigger.FPGATrackSim.FakeNNonnxFile1st
324 mappingSvc.FakeNNonnx2nd = flags.Trigger.FPGATrackSim.FakeNNonnxFile2nd
325 mappingSvc.ParamNNonnx1st = flags.Trigger.FPGATrackSim.ParamNNonnxFile1st
326 mappingSvc.ParamNNonnx2nd = flags.Trigger.FPGATrackSim.ParamNNonnxFile2nd
327 mappingSvc.ExtensionNNVolonnx = flags.Trigger.FPGATrackSim.ExtensionNNVolonnxFile
328 mappingSvc.ExtensionNNHitonnx = flags.Trigger.FPGATrackSim.ExtensionNNHitonnxFile
329 mappingSvc.GNNModuleMap = flags.Trigger.FPGATrackSim.GNN.moduleMapPath
330 mappingSvc.layerOverride = []
331 result.addService(mappingSvc, create=True, primary=True)
332 return result
333
334
336 result=ComponentAccumulator()
337 InputTool = CompFactory.FPGATrackSimInputHeaderTool(name="FPGATrackSimReadInput",
338 InFileName = flags.Trigger.FPGATrackSim.wrapperFileName)
339 result.addPublicTool(InputTool, primary=True)
340 return result
341
343 result=ComponentAccumulator()
344 InputTool2 = CompFactory.FPGATrackSimReadRawRandomHitsTool(name="FPGATrackSimReadInput2", InFileName = flags.Trigger.FPGATrackSim.wrapperFileName2)
345 result.addPublicTool(InputTool2, primary=True)
346 return result
347
349 result=ComponentAccumulator()
350 HitFilteringTool = CompFactory.FPGATrackSimHitFilteringTool()
351 HitFilteringTool.barrelStubDphiCut = 3.0
352 HitFilteringTool.doRandomRemoval = False
353 HitFilteringTool.doStubs = False
354 HitFilteringTool.endcapStubDphiCut = 1.5
355 HitFilteringTool.pixelClusRmFrac = 0
356 HitFilteringTool.pixelHitRmFrac = 0
357 HitFilteringTool.stripClusRmFrac = 0
358 HitFilteringTool.stripHitRmFrac = 0
359 HitFilteringTool.useNstrips = False
360 result.addPublicTool(HitFilteringTool, primary=True)
361 return result
362
364 result=ComponentAccumulator()
365 LorentzAngleTool = CompFactory.FPGATrackSim.LorentzAngleTool()
366 LorentzAngleTool.UseAthenaLorentzAngleTools=False
367 LorentzAngleTool.shiftGlobalPosition=True
368
369 from SiLorentzAngleTool.ITkPixelLorentzAngleConfig import ITkPixelLorentzAngleToolCfg
370 LorentzAngleTool.LorentzAngleToolPixel = result.popToolsAndMerge(ITkPixelLorentzAngleToolCfg(flags))
371
372 from SiLorentzAngleTool.ITkStripLorentzAngleConfig import ITkStripLorentzAngleToolCfg
373 LorentzAngleTool.LorentzAngleToolStrip = result.popToolsAndMerge(ITkStripLorentzAngleToolCfg(flags))
374
375 result.addPublicTool(LorentzAngleTool, primary=True)
376 return result
377
379
381
382 result=ComponentAccumulator()
383
384
385 theFPGATrackSimDataPrepAlg=CompFactory.FPGATrackSimDataPrepAlg()
386 theFPGATrackSimDataPrepAlg.HitFiltering = flags.Trigger.FPGATrackSim.ActiveConfig.hitFiltering
387 theFPGATrackSimDataPrepAlg.writeOutputData = flags.Trigger.FPGATrackSim.writeAdditionalOutputData
388 writePreClusterBranch=flags.Trigger.FPGATrackSim.writeAdditionalOutputData and (flags.Trigger.FPGATrackSim.regionToWriteDPTree < 0)
389 theFPGATrackSimDataPrepAlg.writePreClusterBranch=writePreClusterBranch
390
391 theFPGATrackSimDataPrepAlg.Clustering = flags.Trigger.FPGATrackSim.clustering
392 theFPGATrackSimDataPrepAlg.doEvtSel= False if flags.Trigger.FPGATrackSim.pipeline.startswith('F-1') or flags.Trigger.FPGATrackSim.sampleType == 'skipTruth' else True
393 theFPGATrackSimDataPrepAlg.useInternalTruthTracks = flags.Trigger.FPGATrackSim.useFPGATruthTrackMatching
394 theFPGATrackSimDataPrepAlg.recordHits = not flags.Trigger.FPGATrackSim.pipeline.startswith('F-1')
395 theFPGATrackSimDataPrepAlg.writeRegion = flags.Trigger.FPGATrackSim.writeRegion
396 theFPGATrackSimDataPrepAlg.isDataPrepPipeline = True if flags.Tracking.ActiveConfig.extension == "ActsValidateF100" else False
397
398 theFPGATrackSimDataPrepAlg.RawToLogicalHitsTools = []
399 from FPGATrackSimConfTools.FPGATrackSimHelperFunctions import convertRegionsExpressionToArray
400 for region in convertRegionsExpressionToArray(flags.Trigger.FPGATrackSim.regionList):
401 flagsForEachRegion = inputFlags.clone()
402 flagsForEachRegion = flagsForEachRegion.cloneAndReplace("Trigger.FPGATrackSim.ActiveConfig", "Trigger.FPGATrackSim." + inputFlags.Trigger.FPGATrackSim.algoTag,keepOriginal=True)
403 flagsForEachRegion.Trigger.FPGATrackSim.region = region
404 flagsForEachRegion.lock()
405
406 theFPGATrackSimDataPrepAlg.RawToLogicalHitsTools.append(result.getPrimaryAndMerge(FPGATrackSimRawLogicCfg(flagsForEachRegion)))
407 theFPGATrackSimDataPrepAlg.eventSelectors.append(result.getPrimaryAndMerge(FPGATrackSimEventSelectionToolCfg(flagsForEachRegion)))
408
409 if flags.Trigger.FPGATrackSim.wrapperFileName and flags.Trigger.FPGATrackSim.wrapperFileName is not None:
410 theFPGATrackSimDataPrepAlg.InputTool = result.getPrimaryAndMerge(FPGATrackSimReadInputCfg(flags))
411 if flags.Trigger.FPGATrackSim.wrapperFileName2 and flags.Trigger.FPGATrackSim.wrapperFileName2 is not None:
412 theFPGATrackSimDataPrepAlg.InputTool2 = result.getPrimaryAndMerge(FPGATrackSimReadInput2Cfg(flags))
413 theFPGATrackSimDataPrepAlg.SecondInputToolN = flags.Trigger.FPGATrackSim.secondInputToolN
414 theFPGATrackSimDataPrepAlg.SGInputTool = ""
415 else:
416 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometryToolCfg
417 result.getPrimaryAndMerge(ActsTrackingGeometryToolCfg(flags))
418 theFPGATrackSimDataPrepAlg.InputTool = ""
419 theFPGATrackSimDataPrepAlg.InputTool2 = ""
420 from FPGATrackSimSGInput.FPGATrackSimSGInputConfig import FPGATrackSimSGInputToolCfg
421 theFPGATrackSimDataPrepAlg.SGInputTool = result.getPrimaryAndMerge(FPGATrackSimSGInputToolCfg(flags))
422 theFPGATrackSimDataPrepAlg.SGInputTool.ReadOfflineClusters=False
423 theFPGATrackSimDataPrepAlg.SGInputTool.ReadOfflineTracks=False
424
425 theFPGATrackSimDataPrepAlg.HitFilteringTool = result.getPrimaryAndMerge(FPGATrackSimHitFilteringToolCfg(flags))
426
427 theFPGATrackSimDataPrepAlg.ClusteringTool = CompFactory.FPGATrackSimClusteringTool()
428 if not flags.Trigger.FPGATrackSim.wrapperFileName:
429 theFPGATrackSimDataPrepAlg.ClusteringTool.LorentzAngleTool = result.getPrimaryAndMerge(FPGATrackSimLorentzAngleToolCfg(flags))
430 theFPGATrackSimDataPrepAlg.ClusteringTool.LorentzAngleShift = flags.Trigger.FPGATrackSim.LorentzAngleShift
431 else:
432 theFPGATrackSimDataPrepAlg.ClusteringTool.LorentzAngleShift = -1 # should be set to False by default in the tool class but just in case...
433
434 theFPGATrackSimDataPrepAlg.OutputTool = result.getPrimaryAndMerge(FPGATrackSimDataPrepOutputCfg(flags))
435
436 from FPGATrackSimAlgorithms.FPGATrackSimAlgorithmConfig import FPGATrackSimDataPrepMonitoringCfg
437 theFPGATrackSimDataPrepAlg.MonTool = result.getPrimaryAndMerge(FPGATrackSimDataPrepMonitoringCfg(flags))
438
439 result.addEventAlgo(theFPGATrackSimDataPrepAlg)
440
441 return result
442
443
444log = AthenaLogger(__name__)
445
447 if flags.Trigger.FPGATrackSim.regionList == "": # in case of empty list just use the region set to flags.Trigger.FPGATrackSim.region
448 flags.Trigger.FPGATrackSim.regionList = [flags.Trigger.FPGATrackSim.region]
449 else: # otherwise use the regionList (this overrides the region flag)
450 flags.Trigger.FPGATrackSim.regionList = convertRegionsExpressionToArray(flags.Trigger.FPGATrackSim.regionList)
451 return flags
452
453def FPGATrackSimClusteringCfg(flags): # to be used in the Reco_tf configuration
454 acc=ComponentAccumulator()
455 if not flags.Trigger.FPGATrackSim.runOnPreProducedHeaderFiles:
456 acc.merge(FPGATrackSimDataPrepAlgCfg(flags))
457 acc.merge(FPGAConversionAlgCfg(flags, name = 'FPGAConversionAlg', stage = '_1st',**{
458 'FPGATrackSimSPKey': 'FPGAClusters_1st',
459 'xAODPixelClusterFromFPGAClusterKey': 'FPGAPixelClusters',
460 'xAODStripClusterFromFPGAClusterKey': 'FPGAStripClusters',
461 'xAODPixelSpacePointFromFPGAKey': 'ITkPixelSpacePoints',
462 'doActsTrk': False,
463 'useRoads': False,
464 'doSP': flags.Trigger.FPGATrackSim.convertSPs,
465 }))
466 else:
467 from FPGATrackSimConfTools.FPGATrackSimMergeOutputsConfig import FPGATrackSimMergeOutputsAlgCfg
468 acc.merge(FPGATrackSimMergeOutputsAlgCfg(flags))
469 acc.merge(FPGAConversionAlgCfg(flags, name = 'FPGAConversionAlg', stage = '_1st',**{
470 'FPGATrackSimHitKey': 'FPGAHits',
471 'xAODPixelClusterFromFPGAHitKey': 'FPGAPixelClusters',
472 'xAODStripClusterFromFPGAHitKey': 'FPGAStripClusters',
473 'xAODPixelSpacePointFromFPGAKey': 'ITkPixelSpacePoints',
474 'doActsTrk': False,
475 'useRoads': False,
476 'doClusters': False,
477 'doHits': True,
478 'doSP': flags.Trigger.FPGATrackSim.convertSPs,
479 }))
480
481 from FPGAClusterSorting.FPGAClusterSortingConfig import FPGAClusterSortingAlgCfg
482 ClusterSorting = FPGAClusterSortingAlgCfg(flags,**{'xAODPixelClusterContainer': 'FPGAPixelClusters',
483 'xAODStripClusterContainer': 'FPGAStripClusters',
484 'sortedxAODPixelClusterContainer': 'ITkPixelClusters',
485 'sortedxAODStripClusterContainer': 'ITkStripClusters'})
486
487 acc.merge(ClusterSorting)
488
489 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
490 acc.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
491
492 from SCT_ConditionsAlgorithms.ITkStripConditionsAlgorithmsConfig import ITkStripDetectorElementStatusAlgCfg
493 acc.merge(ITkStripDetectorElementStatusAlgCfg(flags))
494
495 if flags.Acts.EDM.PersistifyClusters or flags.Acts.EDM.PersistifySpacePoints:
496 toAOD = []
497
498 pixel_cluster_shortlist = ['-pixelClusterLink']
499 strip_cluster_shortlist = ['-sctClusterLink']
500
501 pixel_cluster_variables = '.'.join(pixel_cluster_shortlist)
502 strip_cluster_variables = '.'.join(strip_cluster_shortlist)
503
504 toAOD += ['xAOD::PixelClusterContainer#ITkPixelClusters',
505 'xAOD::PixelClusterAuxContainer#ITkPixelClustersAux.' + pixel_cluster_variables,
506 'xAOD::StripClusterContainer#ITkStripClusters',
507 'xAOD::StripClusterAuxContainer#ITkStripClustersAux.' + strip_cluster_variables]
508 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
509 acc.merge(addToAOD(flags, toAOD))
510
511
512 from FPGATrackSimReporting.FPGATrackSimReportingConfig import FPGATrackSimReportingCfg
513 acc.merge(FPGATrackSimReportingCfg(flags,
514 perEventReports = False, # set to True if per-event information is needed for debugging (e.g. cluster, tracks). Otherwise it produces a lot of output
515 **{'xAODPixelClusterContainers' : ['ITkPixelClusters'],
516 'xAODStripClusterContainers' : ['ITkStripClusters'],
517 'FPGAActsTracks' : [f'{flags.Tracking.ActiveConfig.extension}Tracks',f'SiSPTracksSeedSegments{flags.Tracking.ActiveConfig.extension}PixelTracks'],
518 'isDataPrep': True} ))
519
520 if flags.Trigger.FPGATrackSim.writeAdditionalOutputData and flags.Tracking.ActiveConfig.extension in ["ActsValidateF100"]:
521 acc.addService(CompFactory.THistSvc(Output = [f"EXPERT DATAFILE='{flags.Trigger.FPGATrackSim.outputMonitorFile}', OPT='RECREATE'"]))
522 acc.addService(CompFactory.THistSvc(Output = ["FPGATRACKSIMOUTPUT DATAFILE='dataprep.root', OPT='RECREATE'"]))
523 return acc
524
525def FPGATrackSimDataPrepFlagCfg(flags): # to be used in the Reco_tf configuration
526
527 flags.Trigger.FPGATrackSim.readOfflineObjects=False
528 flags.Trigger.FPGATrackSim.doMultiTruth=False
529
530 flags = FPGATrackSimRegionFlagCfg(flags)
531
532 return flags
533
534
535def FPGATrackSimDataPrepSetup(flags,runReco=True):
536 acc = ComponentAccumulator()
537 if flags.Trigger.FPGATrackSim.wrapperFileName and flags.Trigger.FPGATrackSim.wrapperFileName is not None:
538 return acc
539
540 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
541 acc.merge(PoolReadCfg(flags))
542
543 if not runReco:
544 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
545 acc.merge(EventInfoCnvAlgCfg(flags))
546 else:
547 if flags.Input.isMC:
548 from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
549 acc.merge(GEN_AOD2xAODCfg(flags))
550
551 from JetRecConfig.JetRecoSteering import addTruthPileupJetsToOutputCfg # TO DO: check if this is indeed necessary for pileup samples
552 acc.merge(addTruthPileupJetsToOutputCfg(flags))
553
554 if flags.Detector.EnableCalo:
555 from CaloRec.CaloRecoConfig import CaloRecoCfg
556 acc.merge(CaloRecoCfg(flags))
557
558 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
559 acc.merge(BeamSpotCondAlgCfg(flags))
560
561 from InDetConfig.SiliconPreProcessing import ITkRecPreProcessingSiliconCfg
562 acc.merge(ITkRecPreProcessingSiliconCfg(flags))
563
564 return acc
565
566
568 from AthenaConfiguration.AllConfigFlags import initConfigFlags
569 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
570
571 FinalDataPrepTrackChainxAODTracksKeyPrefix="FPGA"
572
573 flags = initConfigFlags()
574 from InDetConfig.ConfigurationHelpers import OnlyTrackingPreInclude
575 OnlyTrackingPreInclude(flags)
576
577
578
579
580 from ActsConfig.ActsCIFlags import actsWorkflowFlags
581 actsWorkflowFlags(flags)
582
583
584 flags.Concurrency.NumThreads=1
585 flags.Concurrency.NumConcurrentEvents=1
586 flags.Concurrency.NumProcs=0
587 flags.Scheduler.ShowDataDeps=False
588 flags.Scheduler.CheckDependencies=True
589 flags.Debug.DumpEvtStore=False # Set to Truth to enable Event Store printouts
590 # flags.Exec.DebugStage="exec" # useful option to debug the execution of the job - we want it commented out for production
591 flags.fillFromArgs()
592 if isinstance(flags.Trigger.FPGATrackSim.wrapperFileName, str):
593 log.info("wrapperFile is string, converting to list")
594 flags.Trigger.FPGATrackSim.wrapperFileName = [flags.Trigger.FPGATrackSim.wrapperFileName]
595 flags.Input.Files = lambda f: [f.Trigger.FPGATrackSim.wrapperFileName]
596
597 flags.Tracking.writeExtendedSi_PRDInfo = not flags.Trigger.FPGATrackSim.writeOfflPRDInfo # Don't write ITkPixel/StripMeasurements if writeOfflPRDInfo = True
598 # In this case, ITkPixel/StripMeasurements_offl written based on F100 clustering
599
600 flags = FPGATrackSimRegionFlagCfg(flags)
601
602 flags.lock()
603 flags = flags.cloneAndReplace("Tracking.ActiveConfig", "Tracking.ITkActsPass", keepOriginal=True)
604
605 acc=MainServicesCfg(flags)
606 if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
607 acc.addService(CompFactory.THistSvc(Output = [f"EXPERT DATAFILE='{flags.Trigger.FPGATrackSim.outputMonitorFile}', OPT='RECREATE'"]))
608 acc.addService(CompFactory.THistSvc(Output = ["FPGATRACKSIMOUTPUT DATAFILE='dataprep.root', OPT='RECREATE'"]))
609
610
611 acc.merge(FPGATrackSimDataPrepSetup(flags))
612
613 # Use the imported configuration function for the data prep algorithm.
614 acc.merge(FPGATrackSimDataPrepAlgCfg(flags))
615
616 if flags.Trigger.FPGATrackSim.doEDMConversion:
617 acc.merge(FPGAConversionAlgCfg(flags, name = 'FPGAConversionAlg', stage = '_1st', doActsTrk=False, doSP = False))
618
619 # convert Pixel Clusters to SPs
620 from ActsConfig.ActsSpacePointFormationConfig import ActsPixelSpacePointFormationAlgCfg
621 acc.merge(ActsPixelSpacePointFormationAlgCfg(flags,name="FPGAActsPixelSpacePointFormationAlg",
622 **{'PixelClusters':"xAODPixelClustersFromFPGACluster",
623 'PixelSpacePoints':"xAODPixelSpacePointsFromFPGA"}))
624
625 if flags.Trigger.FPGATrackSim.writeToAOD:
626 acc.merge(WriteToAOD(flags,
627 stage = '_1st',
628 finalTrackParticles=f"{FinalDataPrepTrackChainxAODTracksKeyPrefix}TrackParticles"))
629
630 # Printout for various FPGA-related objects
631 from FPGATrackSimReporting.FPGATrackSimReportingConfig import FPGATrackSimReportingCfg
632 acc.merge(FPGATrackSimReportingCfg(flags,stage="_1st",
633 perEventReports = (flags.Trigger.FPGATrackSim.sampleType != 'skipTruth'),
634 isDataPrep=True))
635
636 # cluster monitoring
637 if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
638 from EFTrackingFPGAOutputValidation.FPGAOutputValidationConfig import FPGAOutputValidationCfg
639 acc.merge(FPGAOutputValidationCfg(flags, **{'pixelKeys' : ["xAODPixelClustersFromFPGACluster","ITkPixelClusters"],
640 'stripKeys':["xAODStripClustersFromFPGACluster","ITkStripClusters"],
641 'doDiffHistograms':True,
642 'matchByID' : True}))
643
644 acc.store(open('AnalysisConfig.pkl','wb'))
645
646 statusCode = acc.run(flags.Exec.MaxEvents)
647 assert statusCode.isSuccess() is True, "Application execution did not succeed"
648
649
650if __name__ == "__main__":
void print(char *figname, TCanvas *c1)
getRegionNumber(nPiOver16Min, minAbsEta, isPositiveEta, verbosePrint=True)
FPGATrackSimMappingCfg(flags, name="FPGATrackSimMappingSvc")
WriteToAOD(flags, stage='', finalTrackParticles='')
FPGATrackSimEventSelectionToolCfg(flags, name="FPGATrackSimEventSelectionTool")
FPGAConversionAlgCfg(inputFlags, name='FPGAConversionAlg', stage='', **kwargs)
FPGATrackSimRawLogicCfg(flags, name="FPGATrackSimRawLogicTool")
FPGATrackSimEventSelectionSvcCfg(flags, name="FPGATrackSimEventSelectionSvc")