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.8 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
435
436 theFPGATrackSimDataPrepAlg.OutputTool = result.getPrimaryAndMerge(FPGATrackSimDataPrepOutputCfg(flags))
437
438 from FPGATrackSimAlgorithms.FPGATrackSimAlgorithmConfig import FPGATrackSimDataPrepMonitoringCfg
439 theFPGATrackSimDataPrepAlg.MonTool = result.getPrimaryAndMerge(FPGATrackSimDataPrepMonitoringCfg(flags))
440
441 result.addEventAlgo(theFPGATrackSimDataPrepAlg)
442
443 return result
444
445
446log = AthenaLogger(__name__)
447
449 if flags.Trigger.FPGATrackSim.regionList == "": # in case of empty list just use the region set to flags.Trigger.FPGATrackSim.region
450 flags.Trigger.FPGATrackSim.regionList = [flags.Trigger.FPGATrackSim.region]
451 else: # otherwise use the regionList (this overrides the region flag)
452 flags.Trigger.FPGATrackSim.regionList = convertRegionsExpressionToArray(flags.Trigger.FPGATrackSim.regionList)
453 return flags
454
455def FPGATrackSimClusteringCfg(flags): # to be used in the Reco_tf configuration
456 acc=ComponentAccumulator()
457 if not flags.Trigger.FPGATrackSim.runOnPreProducedHeaderFiles:
458 acc.merge(FPGATrackSimDataPrepAlgCfg(flags))
459 acc.merge(FPGAConversionAlgCfg(flags, name = 'FPGAConversionAlg', stage = '_1st',**{
460 'FPGATrackSimSPKey': 'FPGAClusters_1st',
461 'xAODPixelClusterFromFPGAClusterKey': 'FPGAPixelClusters',
462 'xAODStripClusterFromFPGAClusterKey': 'FPGAStripClusters',
463 'xAODPixelSpacePointFromFPGAKey': 'ITkPixelSpacePoints',
464 'doActsTrk': False,
465 'useRoads': False,
466 'doSP': flags.Trigger.FPGATrackSim.convertSPs,
467 }))
468 else:
469 from FPGATrackSimConfTools.FPGATrackSimMergeOutputsConfig import FPGATrackSimMergeOutputsAlgCfg
470 acc.merge(FPGATrackSimMergeOutputsAlgCfg(flags))
471 acc.merge(FPGAConversionAlgCfg(flags, name = 'FPGAConversionAlg', stage = '_1st',**{
472 'FPGATrackSimHitKey': 'FPGAHits',
473 'xAODPixelClusterFromFPGAHitKey': 'FPGAPixelClusters',
474 'xAODStripClusterFromFPGAHitKey': 'FPGAStripClusters',
475 'xAODPixelSpacePointFromFPGAKey': 'ITkPixelSpacePoints',
476 'doActsTrk': False,
477 'useRoads': False,
478 'doClusters': False,
479 'doHits': True,
480 'doSP': flags.Trigger.FPGATrackSim.convertSPs,
481 }))
482
483 from FPGAClusterSorting.FPGAClusterSortingConfig import FPGAClusterSortingAlgCfg
484 ClusterSorting = FPGAClusterSortingAlgCfg(flags,**{'xAODPixelClusterContainer': 'FPGAPixelClusters',
485 'xAODStripClusterContainer': 'FPGAStripClusters',
486 'sortedxAODPixelClusterContainer': 'ITkPixelClusters',
487 'sortedxAODStripClusterContainer': 'ITkStripClusters'})
488
489 acc.merge(ClusterSorting)
490
491 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
492 acc.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
493
494 from SCT_ConditionsAlgorithms.ITkStripConditionsAlgorithmsConfig import ITkStripDetectorElementStatusAlgCfg
495 acc.merge(ITkStripDetectorElementStatusAlgCfg(flags))
496
497 if flags.Acts.EDM.PersistifyClusters or flags.Acts.EDM.PersistifySpacePoints:
498 toAOD = []
499
500 pixel_cluster_shortlist = ['-pixelClusterLink']
501 strip_cluster_shortlist = ['-sctClusterLink']
502
503 pixel_cluster_variables = '.'.join(pixel_cluster_shortlist)
504 strip_cluster_variables = '.'.join(strip_cluster_shortlist)
505
506 toAOD += ['xAOD::PixelClusterContainer#ITkPixelClusters',
507 'xAOD::PixelClusterAuxContainer#ITkPixelClustersAux.' + pixel_cluster_variables,
508 'xAOD::StripClusterContainer#ITkStripClusters',
509 'xAOD::StripClusterAuxContainer#ITkStripClustersAux.' + strip_cluster_variables]
510 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
511 acc.merge(addToAOD(flags, toAOD))
512
513
514 from FPGATrackSimReporting.FPGATrackSimReportingConfig import FPGATrackSimReportingCfg
515 acc.merge(FPGATrackSimReportingCfg(flags,
516 perEventReports = False, # set to True if per-event information is needed for debugging (e.g. cluster, tracks). Otherwise it produces a lot of output
517 **{'xAODPixelClusterContainers' : ['ITkPixelClusters'],
518 'xAODStripClusterContainers' : ['ITkStripClusters'],
519 'FPGAActsTracks' : [f'{flags.Tracking.ActiveConfig.extension}Tracks',f'SiSPTracksSeedSegments{flags.Tracking.ActiveConfig.extension}PixelTracks'],
520 'isDataPrep': True} ))
521
522 if flags.Trigger.FPGATrackSim.writeAdditionalOutputData and flags.Tracking.ActiveConfig.extension in ["ActsValidateF100"]:
523 acc.addService(CompFactory.THistSvc(Output = [f"EXPERT DATAFILE='{flags.Trigger.FPGATrackSim.outputMonitorFile}', OPT='RECREATE'"]))
524 acc.addService(CompFactory.THistSvc(Output = ["FPGATRACKSIMOUTPUT DATAFILE='dataprep.root', OPT='RECREATE'"]))
525 return acc
526
527def FPGATrackSimDataPrepFlagCfg(flags): # to be used in the Reco_tf configuration
528
529 flags.Trigger.FPGATrackSim.readOfflineObjects=False
530 flags.Trigger.FPGATrackSim.doMultiTruth=False
531
532 flags = FPGATrackSimRegionFlagCfg(flags)
533
534 return flags
535
536
537def FPGATrackSimDataPrepSetup(flags,runReco=True):
538 acc = ComponentAccumulator()
539 if flags.Trigger.FPGATrackSim.wrapperFileName and flags.Trigger.FPGATrackSim.wrapperFileName is not None:
540 return acc
541
542 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
543 acc.merge(PoolReadCfg(flags))
544
545 if not runReco:
546 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
547 acc.merge(EventInfoCnvAlgCfg(flags))
548 else:
549 if flags.Input.isMC:
550 from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
551 acc.merge(GEN_AOD2xAODCfg(flags))
552
553 from JetRecConfig.JetRecoSteering import addTruthPileupJetsToOutputCfg # TO DO: check if this is indeed necessary for pileup samples
554 acc.merge(addTruthPileupJetsToOutputCfg(flags))
555
556 if flags.Detector.EnableCalo:
557 from CaloRec.CaloRecoConfig import CaloRecoCfg
558 acc.merge(CaloRecoCfg(flags))
559
560 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
561 acc.merge(BeamSpotCondAlgCfg(flags))
562
563 from InDetConfig.SiliconPreProcessing import ITkRecPreProcessingSiliconCfg
564 acc.merge(ITkRecPreProcessingSiliconCfg(flags))
565
566 return acc
567
568
570 from AthenaConfiguration.AllConfigFlags import initConfigFlags
571 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
572
573 FinalDataPrepTrackChainxAODTracksKeyPrefix="FPGA"
574
575 flags = initConfigFlags()
576 from InDetConfig.ConfigurationHelpers import OnlyTrackingPreInclude
577 OnlyTrackingPreInclude(flags)
578
579
580
581
582 from ActsConfig.ActsCIFlags import actsWorkflowFlags
583 actsWorkflowFlags(flags)
584
585
586 flags.Concurrency.NumThreads=1
587 flags.Concurrency.NumConcurrentEvents=1
588 flags.Concurrency.NumProcs=0
589 flags.Scheduler.ShowDataDeps=False
590 flags.Scheduler.CheckDependencies=True
591 flags.Debug.DumpEvtStore=False # Set to Truth to enable Event Store printouts
592 # flags.Exec.DebugStage="exec" # useful option to debug the execution of the job - we want it commented out for production
593 flags.fillFromArgs()
594 if isinstance(flags.Trigger.FPGATrackSim.wrapperFileName, str):
595 log.info("wrapperFile is string, converting to list")
596 flags.Trigger.FPGATrackSim.wrapperFileName = [flags.Trigger.FPGATrackSim.wrapperFileName]
597 flags.Input.Files = lambda f: [f.Trigger.FPGATrackSim.wrapperFileName]
598
599 flags.Tracking.writeExtendedSi_PRDInfo = not flags.Trigger.FPGATrackSim.writeOfflPRDInfo # Don't write ITkPixel/StripMeasurements if writeOfflPRDInfo = True
600 # In this case, ITkPixel/StripMeasurements_offl written based on F100 clustering
601
602 flags = FPGATrackSimRegionFlagCfg(flags)
603
604 flags.lock()
605 flags = flags.cloneAndReplace("Tracking.ActiveConfig", "Tracking.ITkActsPass", keepOriginal=True)
606
607 acc=MainServicesCfg(flags)
608 if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
609 acc.addService(CompFactory.THistSvc(Output = [f"EXPERT DATAFILE='{flags.Trigger.FPGATrackSim.outputMonitorFile}', OPT='RECREATE'"]))
610 acc.addService(CompFactory.THistSvc(Output = ["FPGATRACKSIMOUTPUT DATAFILE='dataprep.root', OPT='RECREATE'"]))
611
612
613 acc.merge(FPGATrackSimDataPrepSetup(flags))
614
615 # Use the imported configuration function for the data prep algorithm.
616 acc.merge(FPGATrackSimDataPrepAlgCfg(flags))
617
618 if flags.Trigger.FPGATrackSim.doEDMConversion:
619 acc.merge(FPGAConversionAlgCfg(flags, name = 'FPGAConversionAlg', stage = '_1st', doActsTrk=False, doSP = False))
620
621 # convert Pixel Clusters to SPs
622 from ActsConfig.ActsSpacePointFormationConfig import ActsPixelSpacePointFormationAlgCfg
623 acc.merge(ActsPixelSpacePointFormationAlgCfg(flags,name="FPGAActsPixelSpacePointFormationAlg",
624 **{'PixelClusters':"xAODPixelClustersFromFPGACluster",
625 'PixelSpacePoints':"xAODPixelSpacePointsFromFPGA"}))
626
627 if flags.Trigger.FPGATrackSim.writeToAOD:
628 acc.merge(WriteToAOD(flags,
629 stage = '_1st',
630 finalTrackParticles=f"{FinalDataPrepTrackChainxAODTracksKeyPrefix}TrackParticles"))
631
632 # Printout for various FPGA-related objects
633 from FPGATrackSimReporting.FPGATrackSimReportingConfig import FPGATrackSimReportingCfg
634 acc.merge(FPGATrackSimReportingCfg(flags,stage="_1st",
635 perEventReports = (flags.Trigger.FPGATrackSim.sampleType != 'skipTruth'),
636 isDataPrep=True))
637
638 # cluster monitoring
639 if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
640 from EFTrackingFPGAOutputValidation.FPGAOutputValidationConfig import FPGAOutputValidationCfg
641 acc.merge(FPGAOutputValidationCfg(flags, **{'pixelKeys' : ["xAODPixelClustersFromFPGACluster","ITkPixelClusters"],
642 'stripKeys':["xAODStripClustersFromFPGACluster","ITkStripClusters"],
643 'doDiffHistograms':True,
644 'matchByID' : True}))
645
646 acc.store(open('AnalysisConfig.pkl','wb'))
647
648 statusCode = acc.run(flags.Exec.MaxEvents)
649 assert statusCode.isSuccess() is True, "Application execution did not succeed"
650
651
652if __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")