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