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 theFPGATrackSimDataPrepAlg=CompFactory.FPGATrackSimDataPrepAlg()
385 theFPGATrackSimDataPrepAlg.HitFiltering = flags.Trigger.FPGATrackSim.ActiveConfig.hitFiltering
386 theFPGATrackSimDataPrepAlg.writeOutputData = flags.Trigger.FPGATrackSim.writeAdditionalOutputData
387 writePreClusterBranch=flags.Trigger.FPGATrackSim.writeAdditionalOutputData and (flags.Trigger.FPGATrackSim.regionToWriteDPTree < 0)
388 theFPGATrackSimDataPrepAlg.writePreClusterBranch=writePreClusterBranch
389
390 theFPGATrackSimDataPrepAlg.Clustering = flags.Trigger.FPGATrackSim.clustering
391 theFPGATrackSimDataPrepAlg.doEvtSel= False if flags.Trigger.FPGATrackSim.pipeline.startswith('F-1') or flags.Trigger.FPGATrackSim.sampleType == 'skipTruth' else True
392 theFPGATrackSimDataPrepAlg.useInternalTruthTracks = flags.Trigger.FPGATrackSim.useFPGATruthTrackMatching
393 theFPGATrackSimDataPrepAlg.recordHits = not flags.Trigger.FPGATrackSim.pipeline.startswith('F-1')
394 theFPGATrackSimDataPrepAlg.writeRegion = flags.Trigger.FPGATrackSim.writeRegion
395 theFPGATrackSimDataPrepAlg.isDataPrepPipeline = True if flags.Tracking.ActiveConfig.extension == "ActsValidateF100" else False
396
397 theFPGATrackSimDataPrepAlg.RawToLogicalHitsTools = []
398 from FPGATrackSimConfTools.FPGATrackSimHelperFunctions import convertRegionsExpressionToArray
399 for region in convertRegionsExpressionToArray(flags.Trigger.FPGATrackSim.regionList):
400 flagsForEachRegion = inputFlags.clone()
401 flagsForEachRegion = flagsForEachRegion.cloneAndReplace("Trigger.FPGATrackSim.ActiveConfig", "Trigger.FPGATrackSim." + inputFlags.Trigger.FPGATrackSim.algoTag,keepOriginal=True)
402 flagsForEachRegion.Trigger.FPGATrackSim.region = region
403 flagsForEachRegion.lock()
404
405 theFPGATrackSimDataPrepAlg.RawToLogicalHitsTools.append(result.getPrimaryAndMerge(FPGATrackSimRawLogicCfg(flagsForEachRegion)))
406 theFPGATrackSimDataPrepAlg.eventSelectors.append(result.getPrimaryAndMerge(FPGATrackSimEventSelectionToolCfg(flagsForEachRegion)))
407
408 if flags.Trigger.FPGATrackSim.wrapperFileName and flags.Trigger.FPGATrackSim.wrapperFileName is not None:
409 theFPGATrackSimDataPrepAlg.InputTool = result.getPrimaryAndMerge(FPGATrackSimReadInputCfg(flags))
410 if flags.Trigger.FPGATrackSim.wrapperFileName2 and flags.Trigger.FPGATrackSim.wrapperFileName2 is not None:
411 theFPGATrackSimDataPrepAlg.InputTool2 = result.getPrimaryAndMerge(FPGATrackSimReadInput2Cfg(flags))
412 theFPGATrackSimDataPrepAlg.SecondInputToolN = flags.Trigger.FPGATrackSim.secondInputToolN
413 theFPGATrackSimDataPrepAlg.SGInputTool = ""
414 else:
415 theFPGATrackSimDataPrepAlg.InputTool = ""
416 theFPGATrackSimDataPrepAlg.InputTool2 = ""
417 from FPGATrackSimSGInput.FPGATrackSimSGInputConfig import FPGATrackSimSGInputToolCfg
418 theFPGATrackSimDataPrepAlg.SGInputTool = result.getPrimaryAndMerge(FPGATrackSimSGInputToolCfg(flags))
419 theFPGATrackSimDataPrepAlg.SGInputTool.ReadOfflineClusters=False
420 theFPGATrackSimDataPrepAlg.SGInputTool.ReadOfflineTracks=False
421
422 theFPGATrackSimDataPrepAlg.HitFilteringTool = result.getPrimaryAndMerge(FPGATrackSimHitFilteringToolCfg(flags))
423
424 theFPGATrackSimDataPrepAlg.ClusteringTool = CompFactory.FPGATrackSimClusteringTool()
425 if not flags.Trigger.FPGATrackSim.wrapperFileName:
426 theFPGATrackSimDataPrepAlg.ClusteringTool.LorentzAngleTool = result.getPrimaryAndMerge(FPGATrackSimLorentzAngleToolCfg(flags))
427 theFPGATrackSimDataPrepAlg.ClusteringTool.LorentzAngleShift = flags.Trigger.FPGATrackSim.LorentzAngleShift
428 else:
429 theFPGATrackSimDataPrepAlg.ClusteringTool.LorentzAngleShift = -1 # should be set to False by default in the tool class but just in case...
430
431 theFPGATrackSimDataPrepAlg.OutputTool = result.getPrimaryAndMerge(FPGATrackSimDataPrepOutputCfg(flags))
432
433 from FPGATrackSimAlgorithms.FPGATrackSimAlgorithmConfig import FPGATrackSimDataPrepMonitoringCfg
434 theFPGATrackSimDataPrepAlg.MonTool = result.getPrimaryAndMerge(FPGATrackSimDataPrepMonitoringCfg(flags))
435
436 result.addEventAlgo(theFPGATrackSimDataPrepAlg)
437
438 return result
439
440
441log = AthenaLogger(__name__)
442
444 if flags.Trigger.FPGATrackSim.regionList == "": # in case of empty list just use the region set to flags.Trigger.FPGATrackSim.region
445 flags.Trigger.FPGATrackSim.regionList = [flags.Trigger.FPGATrackSim.region]
446 else: # otherwise use the regionList (this overrides the region flag)
447 flags.Trigger.FPGATrackSim.regionList = convertRegionsExpressionToArray(flags.Trigger.FPGATrackSim.regionList)
448 return flags
449
450def FPGATrackSimClusteringCfg(flags): # to be used in the Reco_tf configuration
451 acc=ComponentAccumulator()
452 if not flags.Trigger.FPGATrackSim.runOnPreProducedHeaderFiles:
453 acc.merge(FPGATrackSimDataPrepAlgCfg(flags))
454 acc.merge(FPGAConversionAlgCfg(flags, name = 'FPGAConversionAlg', stage = '_1st',**{
455 'FPGATrackSimSPKey': 'FPGAClusters_1st',
456 'xAODPixelClusterFromFPGAClusterKey': 'FPGAPixelClusters',
457 'xAODStripClusterFromFPGAClusterKey': 'FPGAStripClusters',
458 'xAODPixelSpacePointFromFPGAKey': 'ITkPixelSpacePoints',
459 'doActsTrk': False,
460 'useRoads': False,
461 'doSP': flags.Trigger.FPGATrackSim.convertSPs,
462 }))
463 else:
464 from FPGATrackSimConfTools.FPGATrackSimMergeOutputsConfig import FPGATrackSimMergeOutputsAlgCfg
465 acc.merge(FPGATrackSimMergeOutputsAlgCfg(flags))
466 acc.merge(FPGAConversionAlgCfg(flags, name = 'FPGAConversionAlg', stage = '_1st',**{
467 'FPGATrackSimHitKey': 'FPGAHits',
468 'xAODPixelClusterFromFPGAHitKey': 'FPGAPixelClusters',
469 'xAODStripClusterFromFPGAHitKey': 'FPGAStripClusters',
470 'xAODPixelSpacePointFromFPGAKey': 'ITkPixelSpacePoints',
471 'doActsTrk': False,
472 'useRoads': False,
473 'doClusters': False,
474 'doHits': True,
475 'doSP': flags.Trigger.FPGATrackSim.convertSPs,
476 }))
477
478 from FPGAClusterSorting.FPGAClusterSortingConfig import FPGAClusterSortingAlgCfg
479 ClusterSorting = FPGAClusterSortingAlgCfg(flags,**{'xAODPixelClusterContainer': 'FPGAPixelClusters',
480 'xAODStripClusterContainer': 'FPGAStripClusters',
481 'sortedxAODPixelClusterContainer': 'ITkPixelClusters',
482 'sortedxAODStripClusterContainer': 'ITkStripClusters'})
483
484 acc.merge(ClusterSorting)
485
486 from PixelConditionsAlgorithms.ITkPixelConditionsConfig import ITkPixelDetectorElementStatusAlgCfg
487 acc.merge(ITkPixelDetectorElementStatusAlgCfg(flags))
488
489 from SCT_ConditionsAlgorithms.ITkStripConditionsAlgorithmsConfig import ITkStripDetectorElementStatusAlgCfg
490 acc.merge(ITkStripDetectorElementStatusAlgCfg(flags))
491
492 if flags.Acts.EDM.PersistifyClusters or flags.Acts.EDM.PersistifySpacePoints:
493 toAOD = []
494
495 pixel_cluster_shortlist = ['-pixelClusterLink']
496 strip_cluster_shortlist = ['-sctClusterLink']
497
498 pixel_cluster_variables = '.'.join(pixel_cluster_shortlist)
499 strip_cluster_variables = '.'.join(strip_cluster_shortlist)
500
501 toAOD += ['xAOD::PixelClusterContainer#ITkPixelClusters',
502 'xAOD::PixelClusterAuxContainer#ITkPixelClustersAux.' + pixel_cluster_variables,
503 'xAOD::StripClusterContainer#ITkStripClusters',
504 'xAOD::StripClusterAuxContainer#ITkStripClustersAux.' + strip_cluster_variables]
505 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
506 acc.merge(addToAOD(flags, toAOD))
507
508
509 from FPGATrackSimReporting.FPGATrackSimReportingConfig import FPGATrackSimReportingCfg
510 acc.merge(FPGATrackSimReportingCfg(flags,
511 perEventReports = False, # set to True if per-event information is needed for debugging (e.g. cluster, tracks). Otherwise it produces a lot of output
512 **{'xAODPixelClusterContainers' : ['ITkPixelClusters'],
513 'xAODStripClusterContainers' : ['ITkStripClusters'],
514 'FPGAActsTracks' : [f'{flags.Tracking.ActiveConfig.extension}Tracks',f'SiSPTracksSeedSegments{flags.Tracking.ActiveConfig.extension}PixelTracks'],
515 'isDataPrep': True} ))
516
517 if flags.Trigger.FPGATrackSim.writeAdditionalOutputData and flags.Tracking.ActiveConfig.extension in ["ActsValidateF100"]:
518 acc.addService(CompFactory.THistSvc(Output = [f"EXPERT DATAFILE='{flags.Trigger.FPGATrackSim.outputMonitorFile}', OPT='RECREATE'"]))
519 acc.addService(CompFactory.THistSvc(Output = ["FPGATRACKSIMOUTPUT DATAFILE='dataprep.root', OPT='RECREATE'"]))
520 return acc
521
522def FPGATrackSimDataPrepFlagCfg(flags): # to be used in the Reco_tf configuration
523
524 flags.Trigger.FPGATrackSim.readOfflineObjects=False
525 flags.Trigger.FPGATrackSim.doMultiTruth=False
526
527 flags = FPGATrackSimRegionFlagCfg(flags)
528
529 return flags
530
531
532def FPGATrackSimDataPrepSetup(flags,runReco=True):
533 acc = ComponentAccumulator()
534 if flags.Trigger.FPGATrackSim.wrapperFileName and flags.Trigger.FPGATrackSim.wrapperFileName is not None:
535 return acc
536
537 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
538 acc.merge(PoolReadCfg(flags))
539
540 if not runReco:
541 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
542 acc.merge(EventInfoCnvAlgCfg(flags))
543 else:
544 if flags.Input.isMC:
545 from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
546 acc.merge(GEN_AOD2xAODCfg(flags))
547
548 from JetRecConfig.JetRecoSteering import addTruthPileupJetsToOutputCfg # TO DO: check if this is indeed necessary for pileup samples
549 acc.merge(addTruthPileupJetsToOutputCfg(flags))
550
551 if flags.Detector.EnableCalo:
552 from CaloRec.CaloRecoConfig import CaloRecoCfg
553 acc.merge(CaloRecoCfg(flags))
554
555 from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
556 acc.merge(BeamSpotCondAlgCfg(flags))
557
558 from InDetConfig.SiliconPreProcessing import ITkRecPreProcessingSiliconCfg
559 acc.merge(ITkRecPreProcessingSiliconCfg(flags))
560
561 return acc
562
563
565 from AthenaConfiguration.AllConfigFlags import initConfigFlags
566 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
567
568 FinalDataPrepTrackChainxAODTracksKeyPrefix="FPGA"
569
570 flags = initConfigFlags()
571 from InDetConfig.ConfigurationHelpers import OnlyTrackingPreInclude
572 OnlyTrackingPreInclude(flags)
573
574
575
576
577 from ActsConfig.ActsCIFlags import actsProductionFlags
578 actsProductionFlags(flags)
579
580
581 flags.Concurrency.NumThreads=1
582 flags.Concurrency.NumConcurrentEvents=1
583 flags.Concurrency.NumProcs=0
584 flags.Scheduler.ShowDataDeps=False
585 flags.Scheduler.CheckDependencies=True
586 flags.Debug.DumpEvtStore=False # Set to Truth to enable Event Store printouts
587 # flags.Exec.DebugStage="exec" # useful option to debug the execution of the job - we want it commented out for production
588 flags.fillFromArgs()
589 if isinstance(flags.Trigger.FPGATrackSim.wrapperFileName, str):
590 log.info("wrapperFile is string, converting to list")
591 flags.Trigger.FPGATrackSim.wrapperFileName = [flags.Trigger.FPGATrackSim.wrapperFileName]
592 flags.Input.Files = lambda f: [f.Trigger.FPGATrackSim.wrapperFileName]
593
594 flags.Tracking.writeExtendedSi_PRDInfo = not flags.Trigger.FPGATrackSim.writeOfflPRDInfo # Don't write ITkPixel/StripMeasurements if writeOfflPRDInfo = True
595 # In this case, ITkPixel/StripMeasurements_offl written based on F100 clustering
596
597 flags = FPGATrackSimRegionFlagCfg(flags)
598
599 flags.lock()
600 flags = flags.cloneAndReplace("Tracking.ActiveConfig", "Tracking.ITkActsPass", keepOriginal=True)
601
602 acc=MainServicesCfg(flags)
603 if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
604 acc.addService(CompFactory.THistSvc(Output = [f"EXPERT DATAFILE='{flags.Trigger.FPGATrackSim.outputMonitorFile}', OPT='RECREATE'"]))
605 acc.addService(CompFactory.THistSvc(Output = ["FPGATRACKSIMOUTPUT DATAFILE='dataprep.root', OPT='RECREATE'"]))
606
607
608 from ActsConfig.ActsGeometryConfig import ActsTrackingGeometrySvcCfg
609 acc.merge(ActsTrackingGeometrySvcCfg(flags))
610 from ActsAlignmentAlgs.AlignmentAlgsConfig import ActsGeometryContextAlgCfg
611 acc.merge(ActsGeometryContextAlgCfg(flags))
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")