ATLAS Offline Software
FPGATrackSimAnalysisConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
3 from AthenaConfiguration.ComponentFactory import CompFactory
4 from AthenaCommon.Logging import AthenaLogger
5 from PathResolver import PathResolver
6 import importlib
7 import os
8 
9 log = AthenaLogger(__name__)
10 
11 
12 from FPGATrackSimConfTools import FPGATrackSimDataPrepConfig
13 
14 
15 def getEtaBin(flags):
16  etaBin = (flags.Trigger.FPGATrackSim.region >> 6) & 0x1f
17  return etaBin
18 
19 def getFitWeights(etaBin):
20  weight4Eta = [563.9382667,493.23055,381.835315,264.7819679,179.555554,116.0867029,96.30409326,96.13504916,163.7278321,270.5480971,270.6937626,180.2164132,129.0011743,91.50412962,72.65953377,49.77568766,32.518927,20.38964651,12.97547848,8.05716611]
21  weight4Phi = [5291.005291,4784.688995,4739.336493,4329.004329,3508.77193,3278.688525,4366.812227,6756.756757,10752.68817,14925.37313,16666.66667,16949.15254,17543.85965,16666.66667,19230.76923,20833.33333,20408.16327,20000,20000,18181.81818]
22  weights5Eta = [217.5331768,184.2304061,148.3134888,98.13939253,66.37534817,42.93312711,33.65526204,34.33247487,47.5202135,77.16881734,110.4844013,100.8706594,83.79061435,58.69032222,44.9857434,30.5678705,18.85832071,12.76889006,8.270441607,5.426907903]
23  weights5Phi = [1302.083333,1138.952164,1068.376068,961.5384615,831.9467554,764.5259939,996.0159363,1481.481481,2857.142857,3875.968992,4504.504505,5076.142132,5681.818182,5747.126437,6493.506494,6578.947368,6622.516556,6802.721088,6849.315068,6578.947368]
24 
25  assert(etaBin >= 0 and etaBin < 20)
26  return [weight4Eta[etaBin], weight4Phi[etaBin], weights5Eta[etaBin], weights5Phi[etaBin]]
27 
28 def getNSubregions(filePath):
29  with open(PathResolver.FindCalibFile(filePath), 'r') as f:
30  fields = f.readline()
31  assert(fields.startswith('towers'))
32  n = fields.split()[1]
33  return int(n)
34 
35 
36 # Need to figure out if we have two output writers or somehow only one.
38  result=ComponentAccumulator()
39  FPGATrackSimWriteOutput = CompFactory.FPGATrackSimOutputHeaderTool("FPGATrackSimWriteOutput")
40  FPGATrackSimWriteOutput.InFileName = ["test.root"]
41  FPGATrackSimWriteOutput.OutputTreeName = FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"FPGATrackSimLogicalEventTree")
42 
43  if not flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
44  FPGATrackSimWriteOutput.EventLimit = 0
45  else:
46  FPGATrackSimWriteOutput.EventLimit = flags.Trigger.FPGATrackSim.writeOutputEventLimit
47  # RECREATE means that that this tool opens the file.
48  # HEADER would mean that something else (e.g. THistSvc) opens it and we just add the object.
49  FPGATrackSimWriteOutput.RWstatus = "HEADER"
50  FPGATrackSimWriteOutput.THistSvc = CompFactory.THistSvc()
51  result.setPrivateTools(FPGATrackSimWriteOutput)
52  return result
53 
54 def FPGATrackSimSlicingEngineCfg(flags,name="FPGATrackSimSlicingEngineTool"):
55  result = ComponentAccumulator()
56  FPGATrackSimSlicingEngineTool = CompFactory.FPGATrackSimSlicingEngineTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
57  # this is the same as the layer map used by the genscan/inside out tool below.
58  FPGATrackSimSlicingEngineTool.LayerMap = os.path.join(PathResolver.FindCalibDirectory(flags.Trigger.FPGATrackSim.mapsDir),f"{FPGATrackSimDataPrepConfig.getBaseName(flags)}_lyrmap.json")
59  FPGATrackSimSlicingEngineTool.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
60  # If the GNN is enabled (i.e. this is F-4xx) then we don't want to separate first vs second stage.
61  FPGATrackSimSlicingEngineTool.doSecondStage = (not flags.Trigger.FPGATrackSim.ActiveConfig.GNN)
62  FPGATrackSimSlicingEngineTool.RootOutput = flags.Trigger.FPGATrackSim.writeAdditionalOutputData
63  result.setPrivateTools(FPGATrackSimSlicingEngineTool)
64  return result
65 
66 def FPGATrackSimBankSvcCfg(flags,name="FPGATrackSimBankSvc"):
67  result=ComponentAccumulator()
68  FPGATrackSimBankSvc = CompFactory.FPGATrackSimBankSvc(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
69  FPGATrackSimBankSvc.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
70  pathBankSvc = flags.Trigger.FPGATrackSim.bankDir if flags.Trigger.FPGATrackSim.bankDir != '' else f'/eos/atlas/atlascerngroupdisk/det-htt/HTTsim/{flags.GeoModel.AtlasVersion}/21.9.16/'+FPGATrackSimDataPrepConfig.getBaseName(flags)+'/SectorBanks/'
71  pathBankSvc=PathResolver.FindCalibDirectory(pathBankSvc)
72  FPGATrackSimBankSvc.constantsNoGuess_1st = [
73  f'{pathBankSvc}corrgen_raw_8L_skipPlane0.gcon',
74  f'{pathBankSvc}corrgen_raw_8L_skipPlane1.gcon',
75  f'{pathBankSvc}corrgen_raw_8L_skipPlane2.gcon',
76  f'{pathBankSvc}corrgen_raw_8L_skipPlane3.gcon',
77  f'{pathBankSvc}corrgen_raw_8L_skipPlane4.gcon',
78  f'{pathBankSvc}corrgen_raw_8L_skipPlane5.gcon',
79  f'{pathBankSvc}corrgen_raw_8L_skipPlane6.gcon',
80  f'{pathBankSvc}corrgen_raw_8L_skipPlane7.gcon']
81  FPGATrackSimBankSvc.constantsNoGuess_2nd = [
82  f'{pathBankSvc}corrgen_raw_13L_skipPlane0.gcon',
83  f'{pathBankSvc}corrgen_raw_13L_skipPlane1.gcon',
84  f'{pathBankSvc}corrgen_raw_13L_skipPlane2.gcon',
85  f'{pathBankSvc}corrgen_raw_13L_skipPlane3.gcon',
86  f'{pathBankSvc}corrgen_raw_13L_skipPlane4.gcon',
87  f'{pathBankSvc}corrgen_raw_13L_skipPlane5.gcon',
88  f'{pathBankSvc}corrgen_raw_13L_skipPlane6.gcon',
89  f'{pathBankSvc}corrgen_raw_13L_skipPlane7.gcon']
90  layers="5L" if flags.Trigger.FPGATrackSim.ActiveConfig.genScan else "9L"
91  s2_layers = 13
92  pathMapSvc = flags.Trigger.FPGATrackSim.mapsDir if flags.Trigger.FPGATrackSim.mapsDir != '' else f'/eos/atlas/atlascerngroupdisk/det-htt/HTTsim/{flags.GeoModel.AtlasVersion}/21.9.16/'+FPGATrackSimDataPrepConfig.getBaseName(flags)+'/SectorMaps/'
93  pathMapSvc = PathResolver.FindCalibDirectory(pathMapSvc)
94  pmap_file = os.path.join(pathMapSvc, f"region{flags.Trigger.FPGATrackSim.region}.pmap")
95  with open(pmap_file) as f:
96  for line in f:
97  if 'logical_s2' in line:
98  s2_layers = int(line.strip().split()[0])
99  break
100  FPGATrackSimBankSvc.constants_1st = f'{pathBankSvc}corrgen_raw_{layers}_reg{flags.Trigger.FPGATrackSim.region}_checkGood1.gcon'
101  FPGATrackSimBankSvc.constants_2nd = f'{pathBankSvc}corrgen_raw_{s2_layers}L_reg{flags.Trigger.FPGATrackSim.region}_checkGood1.gcon'
102  FPGATrackSimBankSvc.sectorBank_1st = f'{pathBankSvc}sectorsHW_raw_{layers}_reg{flags.Trigger.FPGATrackSim.region}_checkGood1.patt'
103  FPGATrackSimBankSvc.sectorBank_2nd = f'{pathBankSvc}sectorsHW_raw_{s2_layers}L_reg{flags.Trigger.FPGATrackSim.region}_checkGood1.patt'
104  FPGATrackSimBankSvc.sectorSlices = f'{pathBankSvc}slices_{layers}_reg{flags.Trigger.FPGATrackSim.region}.root'
105  FPGATrackSimBankSvc.phiShift = flags.Trigger.FPGATrackSim.phiShift
106 
107  # These should be configurable. The tag system needs updating though.
108  FPGATrackSimBankSvc.sectorQPtBins = [-0.001, -0.0005, 0, 0.0005, 0.001]
109  FPGATrackSimBankSvc.qptAbsBinning = False
110 
111  result.addService(FPGATrackSimBankSvc, create=True, primary=True)
112  return result
113 
114 
115 def FPGATrackSimRoadUnionToolCfg(flags,name="FPGATrackSimRoadUnionTool"):
116  result=ComponentAccumulator()
117  RF = CompFactory.FPGATrackSimRoadUnionTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
118 
119  xBins = flags.Trigger.FPGATrackSim.ActiveConfig.xBins
120  xBufferBins = flags.Trigger.FPGATrackSim.ActiveConfig.xBufferBins
121  yBins = flags.Trigger.FPGATrackSim.ActiveConfig.yBins
122  yBufferBins = flags.Trigger.FPGATrackSim.ActiveConfig.yBufferBins
123  yMin = flags.Trigger.FPGATrackSim.ActiveConfig.qptMin
124  yMax = flags.Trigger.FPGATrackSim.ActiveConfig.qptMax
125  xMin = flags.Trigger.FPGATrackSim.ActiveConfig.phiMin
126  xMax = flags.Trigger.FPGATrackSim.ActiveConfig.phiMax
127  if (not flags.Trigger.FPGATrackSim.oldRegionDefs):
128  phiRange = FPGATrackSimDataPrepConfig.getPhiRange(flags)
129  xMin = phiRange[0]
130  xMax = phiRange[1]
131 
132  xBuffer = (xMax - xMin) / xBins * xBufferBins
133  xMin = xMin - xBuffer
134  xMax = xMax + xBuffer
135  yBuffer = (yMax - yMin) / yBins * yBufferBins
136  yMin -= yBuffer
137  yMax += yBuffer
138  tools = []
139  houghType = flags.Trigger.FPGATrackSim.ActiveConfig.houghType
140  roadMerge = flags.Trigger.FPGATrackSim.ActiveConfig.roadMerge
141 
142 
143  FPGATrackSimMapping = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
144  for number in range(getNSubregions(FPGATrackSimMapping.subrmap)):
145  HoughTransform = CompFactory.FPGATrackSimHoughTransformTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"FPGATrackSimHoughTransformTool")+"_" + str(number))
146  HoughTransform.FPGATrackSimEventSelectionSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
147  HoughTransform.FPGATrackSimBankSvc = result.getPrimaryAndMerge(FPGATrackSimBankSvcCfg(flags))
148  HoughTransform.FPGATrackSimMappingSvc = FPGATrackSimMapping
149  HoughTransform.combine_layers = flags.Trigger.FPGATrackSim.ActiveConfig.combineLayers
150  HoughTransform.convSize_x = flags.Trigger.FPGATrackSim.ActiveConfig.convSizeX
151  HoughTransform.convSize_y = flags.Trigger.FPGATrackSim.ActiveConfig.convSizeY
152  HoughTransform.convolution = flags.Trigger.FPGATrackSim.ActiveConfig.convolution
153  HoughTransform.d0_max = 0
154  HoughTransform.d0_min = 0
155  HoughTransform.fieldCorrection = flags.Trigger.FPGATrackSim.ActiveConfig.fieldCorrection
156  HoughTransform.hitExtend_x = flags.Trigger.FPGATrackSim.ActiveConfig.hitExtendX
157  HoughTransform.localMaxWindowSize = flags.Trigger.FPGATrackSim.ActiveConfig.localMaxWindowSize
158  HoughTransform.nBins_x = xBins + 2 * xBufferBins
159  HoughTransform.nBins_y = yBins + 2 * yBufferBins
160  HoughTransform.phi_max = xMax
161  HoughTransform.phi_min = xMin
162  HoughTransform.qpT_max = yMax
163  HoughTransform.qpT_min = yMin
164  HoughTransform.scale = flags.Trigger.FPGATrackSim.ActiveConfig.scale
165  HoughTransform.subRegion = number
166  HoughTransform.threshold = flags.Trigger.FPGATrackSim.ActiveConfig.threshold
167  HoughTransform.traceHits = True
168  HoughTransform.IdealGeoRoads = (flags.Trigger.FPGATrackSim.ActiveConfig.IdealGeoRoads and flags.Trigger.FPGATrackSim.tracking)
169  HoughTransform.useSpacePoints = flags.Trigger.FPGATrackSim.spacePoints
170  HoughTransform.houghType = houghType
171  HoughTransform.roadMerge = roadMerge
172  if houghType=='LowResource':
173  HoughTransform.requirements = flags.Trigger.FPGATrackSim.ActiveConfig.requirements
174  if houghType=='Flexible':
175  HoughTransform.r_max=flags.Trigger.FPGATrackSim.ActiveConfig.r_max
176  HoughTransform.phi_coord_max=flags.Trigger.FPGATrackSim.ActiveConfig.phi_coord_max
177  HoughTransform.phi_range=flags.Trigger.FPGATrackSim.ActiveConfig.phi_range
178  HoughTransform.r_max_mm=flags.Trigger.FPGATrackSim.ActiveConfig.r_max_mm
179  HoughTransform.bitwise_qApt_conv=flags.Trigger.FPGATrackSim.ActiveConfig.bitwise_qApt_conv
180  HoughTransform.bitwise_phi0_conv=flags.Trigger.FPGATrackSim.ActiveConfig.bitwise_phi0_conv
181  HoughTransform.phi0_sectors=flags.Trigger.FPGATrackSim.ActiveConfig.phi0_sectors
182  HoughTransform.qApt_sectors=flags.Trigger.FPGATrackSim.ActiveConfig.qApt_sectors
183  HoughTransform.pipes_qApt=flags.Trigger.FPGATrackSim.ActiveConfig.pipes_qApt
184  HoughTransform.pipes_phi0=flags.Trigger.FPGATrackSim.ActiveConfig.pipes_phi0
185 
186  tools.append(HoughTransform)
187 
188  RF.tools = tools
189  result.addPublicTool(RF, primary=True)
190  return result
191 
192 def FPGATrackSimRoadUnionTool1DCfg(flags,name="FPGATrackSimRoadUnionTool1D"):
193  result=ComponentAccumulator()
194  tools = []
195  RF = CompFactory.FPGATrackSimRoadUnionTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
196  splitpt=flags.Trigger.FPGATrackSim.Hough1D.splitpt
197  FPGATrackSimMapping = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
198  for ptstep in range(splitpt):
199  qpt_min = flags.Trigger.FPGATrackSim.Hough1D.qptMin
200  qpt_max = flags.Trigger.FPGATrackSim.Hough1D.qptMax
201  lowpt = qpt_min + (qpt_max-qpt_min)/splitpt*ptstep
202  highpt = qpt_min + (qpt_max-qpt_min)/splitpt*(ptstep+1)
203  nSlice = getNSubregions(FPGATrackSimMapping.subrmap)
204  for iSlice in range(nSlice):
205  tool = CompFactory.FPGATrackSimHough1DShiftTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,
206  "Hough1DShift" + str(iSlice)+(("_pt{}".format(ptstep)) if splitpt>1 else "")))
207  tool.subRegion = iSlice if nSlice > 1 else -1
208  xMin = flags.Trigger.FPGATrackSim.Hough1D.phiMin
209  xMax = flags.Trigger.FPGATrackSim.Hough1D.phiMax
210  if (not flags.Trigger.FPGATrackSim.oldRegionDefs):
211  phiRange = FPGATrackSimDataPrepConfig.getPhiRange(flags)
212  xMin = phiRange[0]
213  xMax = phiRange[1]
214  tool.phiMin = xMin
215  tool.phiMax = xMax
216  tool.qptMin = lowpt
217  tool.qptMax = highpt
218  tool.nBins = flags.Trigger.FPGATrackSim.Hough1D.xBins
219  tool.useDiff = True
220  tool.variableExtend = True
221  tool.drawHitMasks = False
222  tool.phiRangeCut = flags.Trigger.FPGATrackSim.Hough1D.phiRangeCut
223  tool.d0spread=-1.0 # mm
224  tool.iterStep = 0 # auto, TODO put in tag
225  tool.iterLayer = 7 # TODO put in tag
226  tool.threshold = flags.Trigger.FPGATrackSim.Hough1D.threshold[0]
227  tool.hitExtend = flags.Trigger.FPGATrackSim.Hough1D.hitExtendX
228  tool.FPGATrackSimEventSelectionSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
229  tool.FPGATrackSimBankSvc = result.getPrimaryAndMerge(FPGATrackSimBankSvcCfg(flags))
230  tool.FPGATrackSimMappingSvc = FPGATrackSimMapping
231  tool.IdealGeoRoads = (flags.Trigger.FPGATrackSim.ActiveConfig.IdealGeoRoads and flags.Trigger.FPGATrackSim.tracking)
232  tool.useSpacePoints = flags.Trigger.FPGATrackSim.spacePoints
233 
234  tools.append(tool)
235 
236  RF.tools = tools
237  result.addPublicTool(RF, primary=True)
238  return result
239 
240 
241 
242 def FPGATrackSimRoadUnionToolGenScanCfg(flags,name="FPGATrackSimRoadUnionToolGenScan"):
243  result=ComponentAccumulator()
244 
245  print("logLevel",flags.Trigger.FPGATrackSim.loglevel)
246 
247  # read the cuts from a seperate python file specified by FPGATrackSim.GenScan.genScanCuts
248  cutset=None
249  if flags.Trigger.FPGATrackSim.oldRegionDefs:
250  toload=flags.Trigger.FPGATrackSim.GenScan.genScanCuts
251  if toload == 'FPGATrackSimGenScanCuts': # its on the newRegion default so it hasn't been set
252  toload = 'FPGATrackSimHough.FPGATrackSimGenScanCuts_incr'
253  cutset = importlib.import_module(toload).cuts[flags.Trigger.FPGATrackSim.region]
254  else:
255  # this allows the cut file defined in python to be loaded from the map directory
256  cutpath = os.path.join(
257  PathResolver.FindCalibDirectory(flags.Trigger.FPGATrackSim.mapsDir),
258  f"{flags.Trigger.FPGATrackSim.GenScan.genScanCuts}.py")
259  print("Cut File = ", cutpath)
260  spec=importlib.util.spec_from_file_location(flags.Trigger.FPGATrackSim.GenScan.genScanCuts,cutpath)
261  if spec is None:
262  print("Failed to find Cut File")
263  cutmodule = importlib.util.module_from_spec(spec)
264  spec.loader.exec_module(cutmodule)
265  cutset=cutmodule.cuts[flags.Trigger.FPGATrackSim.region]
266 
267  # make the binned hits class
268  BinnnedHits = CompFactory.FPGATrackSimBinnedHits("BinnedHits_1stStage")
269  BinnnedHits.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
270  BinnnedHits.FPGATrackSimEventSelectionSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
271 
272  # set layer map
273  if not flags.Trigger.FPGATrackSim.GenScan.layerStudy:
274  if flags.Trigger.FPGATrackSim.oldRegionDefs:
275  BinnnedHits.layerMapFile = flags.Trigger.FPGATrackSim.GenScan.layerMapFile
276  else:
277  print("Loading Layer Radii from ", PathResolver.FindCalibDirectory(flags.Trigger.FPGATrackSim.mapsDir),
278  f"regioneta{FPGATrackSimDataPrepConfig.getEtaSideBits(flags)}_lyrradii.json")
279  # now assumed to be in the map directory with name = basename for region + _lyrmap.json
280  if flags.Trigger.FPGATrackSim.GenScan.useLayerRadiiFile:
281  BinnnedHits.layerRadiiFile =os.path.join(
282  PathResolver.FindCalibDirectory(flags.Trigger.FPGATrackSim.mapsDir),
283  f"regioneta{FPGATrackSimDataPrepConfig.getEtaSideBits(flags)}_lyrradii.json")
284  else:
285  BinnnedHits.layerMapFile =os.path.join(
286  PathResolver.FindCalibDirectory(flags.Trigger.FPGATrackSim.mapsDir),
287  f"{FPGATrackSimDataPrepConfig.getBaseName(flags)}_lyrmap.json")
288 
289 
290 
291 
292  # make the bintool class
293  BinTool = CompFactory.FPGATrackSimBinTool("BinTool_1stStage")
294  BinTool.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
295 
296  # Inputs for the BinTool
297  binsteps=[]
298  BinDesc=None
299  if (cutset["parSet"]=="PhiSlicedKeyLyrPars") :
300  BinDesc = CompFactory.FPGATrackSimKeyLayerBinDesc("KeyLayerBinDesc")
301  BinDesc.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
302  BinDesc.rin=cutset["rin"]
303  BinDesc.rout=cutset["rout"]
304  if flags.Trigger.FPGATrackSim.GenScan.useLayerRadiiFile:
305  phirange = FPGATrackSimDataPrepConfig.getPhiRange(flags)
306  phicenter = (phirange[0]+phirange[1])/2.0
307  BinDesc.PhiOffset = -1.0*phicenter
308 
309  BinDesc.region = flags.Trigger.FPGATrackSim.region
310 
311  # parameters for key layer bindesc are :"zR1", "zR2", "phiR1", "phiR2", "xm"
312  step1 = CompFactory.FPGATrackSimBinStep("PhiBinning")
313  step1.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
314  step1.parBins = [1,1,cutset["parBins"][2],cutset["parBins"][3],cutset["parBins"][4]]
315  step2 = CompFactory.FPGATrackSimBinStep("FullBinning")
316  step2.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
317  step2.parBins = cutset["parBins"]
318  binsteps = [step1,step2]
319  else:
320  log.error("Unknown Binning Setup: ",cutset["parSet"])
321 
322  BinTool.BinDesc = BinDesc
323  BinTool.Steps=binsteps
324 
325 
326  # configure the padding around the nominal region
327  BinTool.d0FractionalPadding =0.05
328  BinTool.z0FractionalPadding =0.05
329  BinTool.etaFractionalPadding =0.05
330  BinTool.phiFractionalPadding =0.05
331  BinTool.qOverPtFractionalPadding =0.05
332  BinTool.parMin = cutset["parMin"]
333  BinTool.parMax = cutset["parMax"]
334  BinnnedHits.BinTool = BinTool
335 
336 
337  # make the monitoring class
338  Monitor = CompFactory.FPGATrackSimGenScanMonitoring(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"GenScanMonitoring"))
339  Monitor.dir = "/GENSCAN/"+FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"GenScanMonitoring")+"/"
340  Monitor.THistSvc = CompFactory.THistSvc()
341  Monitor.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
342  Monitor.phiScale = 10.0
343  Monitor.etaScale = 100.0
344  Monitor.drScale = 20.0
345 
346  # make the main tool
347  tool = CompFactory.FPGATrackSimGenScanTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"GenScanTool"))
348  tool.FPGATrackSimEventSelectionSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
349  tool.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
350  tool.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
351  tool.Monitoring = Monitor
352  tool.BinnedHits = BinnnedHits
353  tool.rin=cutset["rin"]
354  tool.rout=cutset["rout"]
355 
356  # For the 'track fitter' part of GenScanTool.
357  tool.inBinFiltering = flags.Trigger.FPGATrackSim.GenScan.filterInBin
358  weights = getFitWeights(getEtaBin(flags))
359  tool.etaChi2Weight_4hits = weights[0]
360  tool.phiChi2Weight_4hits = weights[1]
361  tool.etaChi2Weight_5hits = weights[2]
362  tool.phiChi2Weight_5hits = weights[3]
363 
364  # configure which filers and thresholds to apply
365  tool.binFilter=flags.Trigger.FPGATrackSim.GenScan.binFilter
366  tool.reversePairDir=flags.Trigger.FPGATrackSim.GenScan.reverse
367  tool.applyPairFilter= not flags.Trigger.FPGATrackSim.GenScan.noCuts
368  tool.applyPairSetFilter= not flags.Trigger.FPGATrackSim.GenScan.noCuts
369  tool.keepHitsStrategy = flags.Trigger.FPGATrackSim.GenScan.keepHitsStrategy
370  tool.threshold = 4
371 
372  # set cuts
373  for (cut,val) in cutset.items():
374  if cut in ["parBins","parSet","parMin","parMax"]:
375  continue
376  setattr(tool,cut,val)
377 
378  # even though we are not actually doing a Union, we need the
379  # RoadUnionTool because mapping is now there
380  RoadUnion = CompFactory.FPGATrackSimRoadUnionTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
381  RoadUnion.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
382  RoadUnion.tools = [tool,]
383  result.addPublicTool(RoadUnion, primary=True)
384 
385  # special configuration for studing layer definitions
386  # pass through all hits, but turn off pairing because
387  # it won't be able to run
388  if flags.Trigger.FPGATrackSim.GenScan.layerStudy:
389  RoadUnion.noHitFilter=True
390  tool.binningOnly=True
391  return result
392 
393 def FPGATrackSimRoadUnionToolGNNCfg(flags,name="FPGATrackSimRoadUnionToolGNN"):
394  result = ComponentAccumulator()
395  RF = CompFactory.FPGATrackSimRoadUnionTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
396  RF.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
397 
398  patternRecoTool = CompFactory.FPGATrackSimGNNPatternRecoTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"FPGATrackSimGNNPatternRecoTool"))
399  patternRecoTool.GNNGraphHitSelector = CompFactory.FPGATrackSimGNNGraphHitSelectorTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"FPGATrackSimGNNGraphHitSelectorTool"))
400  patternRecoTool.GNNGraphConstruction = result.popToolsAndMerge(FPGATrackSimGNNGraphConstructionToolCfg(flags))
401  edgeResult, edgeClassifierTools = FPGATrackSimGNNEdgeClassifierToolCfg(flags)
402  result.merge(edgeResult)
403  patternRecoTool.GNNEdgeClassifiers = edgeClassifierTools
404  patternRecoTool.GNNRoadMaker = result.popToolsAndMerge(FPGATrackSimGNNRoadMakerToolCfg(flags))
405  patternRecoTool.GNNRootOutput = result.popToolsAndMerge(FPGATrackSimGNNRootOutputToolCfg(flags))
406  patternRecoTool.doGNNRootOutput = flags.Trigger.FPGATrackSim.GNN.doGNNRootOutput
407  patternRecoTool.regionNum = int(flags.Trigger.FPGATrackSim.region)
408 
409  RF.tools = [patternRecoTool]
410  result.addPublicTool(RF, primary=True)
411 
412  return result
413 
414 def FPGATrackSimGNNGraphConstructionToolCfg(flags,name="FPGATrackSimGNNGraphConstructionTool"):
415  result = ComponentAccumulator()
416 
417  GNNGraphConstructionTool = CompFactory.FPGATrackSimGNNGraphConstructionTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
418  GNNGraphConstructionTool.graphTool = flags.Trigger.FPGATrackSim.GNN.graphTool.value
419  GNNGraphConstructionTool.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
420 
421 
422  # Module Map Configuration
423  GNNGraphConstructionTool.moduleMapType=flags.Trigger.FPGATrackSim.GNN.moduleMapType.value
424  GNNGraphConstructionTool.moduleMapFunc=flags.Trigger.FPGATrackSim.GNN.moduleMapFunc.value
425  GNNGraphConstructionTool.moduleMapTol=flags.Trigger.FPGATrackSim.GNN.moduleMapTol
426 
427  # Metric Learning Configuration
428  GNNGraphConstructionTool.metricLearningR=flags.Trigger.FPGATrackSim.GNN.metricLearningR
429  GNNGraphConstructionTool.metricLearningMaxN=flags.Trigger.FPGATrackSim.GNN.metricLearningMaxN
430 
431  from AthOnnxComps.OnnxRuntimeInferenceConfig import OnnxRuntimeInferenceToolCfg
432  from AthOnnxComps.OnnxRuntimeFlags import OnnxRuntimeType
433 
434  GNNGraphConstructionTool.MLInferenceTool = result.popToolsAndMerge(OnnxRuntimeInferenceToolCfg(
435  flags, flags.Trigger.FPGATrackSim.GNN.MLModelPath, OnnxRuntimeType.CPU))
436 
437  result.setPrivateTools(GNNGraphConstructionTool)
438 
439  return result
440 
441 def FPGATrackSimGNNEdgeClassifierToolCfg(flags, name="FPGATrackSimGNNEdgeClassifierTool"):
442  result = ComponentAccumulator()
443 
444  from AthOnnxComps.OnnxRuntimeInferenceConfig import OnnxRuntimeInferenceToolCfg
445  from AthOnnxComps.OnnxRuntimeFlags import OnnxRuntimeType
446 
447  region = int(flags.Trigger.FPGATrackSim.region)
448  model_path = f"{flags.Trigger.FPGATrackSim.GNN.GNNModelPath}_{region}.onnx"
449 
450  GNNEdgeClassifierTool = CompFactory.FPGATrackSimGNNEdgeClassifierTool(
451  FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags, name))
452  GNNEdgeClassifierTool.GNNInferenceTool = result.popToolsAndMerge(
453  OnnxRuntimeInferenceToolCfg(flags, model_path, OnnxRuntimeType.CPU, name=f"OnnxInferenceTool_{region}")
454  )
455  GNNEdgeClassifierTool.regionNum = region
456 
457  return result, [GNNEdgeClassifierTool]
458 
459 def FPGATrackSimGNNRoadMakerToolCfg(flags,name="FPGATrackSimGNNRoadMakerTool"):
460  result = ComponentAccumulator()
461 
462  GNNRoadMakerTool = CompFactory.FPGATrackSimGNNRoadMakerTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
463  GNNRoadMakerTool.roadMakerTool = flags.Trigger.FPGATrackSim.GNN.roadMakerTool.value
464  GNNRoadMakerTool.edgeScoreCut = flags.Trigger.FPGATrackSim.GNN.edgeScoreCut
465  GNNRoadMakerTool.doGNNPixelSeeding = flags.Trigger.FPGATrackSim.GNN.doGNNPixelSeeding
466  GNNRoadMakerTool.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
467 
468  from TrigFastTrackFinder.TrigFastTrackFinderConfig import ITkTrigL2LayerNumberToolCfg
469  GNNRoadMakerTool.LayerNumberTool = result.getPrimaryAndMerge(ITkTrigL2LayerNumberToolCfg(flags))
470 
471  result.setPrivateTools(GNNRoadMakerTool)
472 
473  return result
474 
475 def FPGATrackSimGNNRootOutputToolCfg(flags,name="FPGATrackSimGNNRootOutputTool"):
476  result = ComponentAccumulator()
477 
478  GNNRootOutputTool = CompFactory.FPGATrackSimGNNRootOutputTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
479  GNNRootOutputTool.OutputRegion = str(flags.Trigger.FPGATrackSim.region)
480 
481  if(flags.Trigger.FPGATrackSim.GNN.doGNNRootOutput):
482  result.addService(CompFactory.THistSvc(Output = ["TRIGFPGATrackSimGNNOUTPUT DATAFILE='GNNRootOutput.root', OPT='RECREATE'"]))
483  result.setPrivateTools(GNNRootOutputTool)
484 
485  return result
486 
487 def FPGATrackSimDataFlowToolCfg(flags,name="FPGATrackSimDataFlowTool"):
488  result=ComponentAccumulator()
489  DataFlowTool = CompFactory.FPGATrackSimDataFlowTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
490  DataFlowTool.FPGATrackSimEventSelectionSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
491  DataFlowTool.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
492  DataFlowTool.Chi2ndofCut = flags.Trigger.FPGATrackSim.ActiveConfig.chi2cut
493  DataFlowTool.THistSvc = CompFactory.THistSvc()
494  result.setPrivateTools(DataFlowTool)
495  return result
496 
497 def FPGATrackSimHoughRootOutputToolCfg(flags,name="FPGATrackSimHoughRootOutputTool"):
498  result=ComponentAccumulator()
499  HoughRootOutputTool = CompFactory.FPGATrackSimHoughRootOutputTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
500  HoughRootOutputTool.FPGATrackSimEventSelectionSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
501  HoughRootOutputTool.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
502  HoughRootOutputTool.THistSvc = CompFactory.THistSvc()
503  HoughRootOutputTool.OutputRegion = str(flags.Trigger.FPGATrackSim.region)
504  result.setPrivateTools(HoughRootOutputTool)
505  return result
506 
507 def LRTRoadFinderCfg(flags,name="LRTRoadFinder"):
508 
509  result=ComponentAccumulator()
510  LRTRoadFinder =CompFactory.FPGATrackSimHoughTransform_d0phi0_Tool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
511  LRTRoadFinder.FPGATrackSimBankSvc = result.getPrimaryAndMerge(FPGATrackSimBankSvcCfg(flags))
512  LRTRoadFinder.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
513  LRTRoadFinder.combine_layers = flags.Trigger.FPGATrackSim.ActiveConfig.lrtStraighttrackCombineLayers
514  LRTRoadFinder.convolution = flags.Trigger.FPGATrackSim.ActiveConfig.lrtStraighttrackConvolution
515  LRTRoadFinder.hitExtend_x = flags.Trigger.FPGATrackSim.ActiveConfig.lrtStraighttrackHitExtendX
516  LRTRoadFinder.scale = flags.Trigger.FPGATrackSim.ActiveConfig.scale
517  LRTRoadFinder.threshold = flags.Trigger.FPGATrackSim.ActiveConfig.lrtStraighttrackThreshold
518  result.setPrivateTools(LRTRoadFinder)
519  return result
520 
521 def NNTrackToolCfg(flags,name="FPGATrackSimNNTrackTool"):
522  result=ComponentAccumulator()
523  NNTrackTool = CompFactory.FPGATrackSimNNTrackTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
524  NNTrackTool.THistSvc = CompFactory.THistSvc()
525  NNTrackTool.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
526  NNTrackTool.FPGATrackSimBankSvc = result.getPrimaryAndMerge(FPGATrackSimBankSvcCfg(flags))
527  NNTrackTool.IdealGeoRoads = False
528  NNTrackTool.useSpacePoints = flags.Trigger.FPGATrackSim.spacePoints and not flags.Trigger.FPGATrackSim.ActiveConfig.genScan and not flags.Trigger.FPGATrackSim.ActiveConfig.GNN
529  NNTrackTool.SPRoadFilterTool = result.popToolsAndMerge(SPRoadFilterToolCfg(flags))
530  NNTrackTool.MinNumberOfRealHitsInATrack = 5 if flags.Trigger.FPGATrackSim.ActiveConfig.genScan else 7 if flags.Trigger.FPGATrackSim.ActiveConfig.GNN else 9
531  NNTrackTool.useSectors = False
532  NNTrackTool.doGNNTracking = flags.Trigger.FPGATrackSim.GNN.doGNNTracking
533  NNTrackTool.nInputsGNN = flags.Trigger.FPGATrackSim.GNN.nInputsGNN
534  NNTrackTool.useCartesian = flags.Trigger.FPGATrackSim.NNCartesianCoordinates
535  result.setPrivateTools(NNTrackTool)
536  return result
537 
538 def FPGATrackSimTrackFitterToolCfg(flags,name="FPGATrackSimTrackFitterTool"):
539  result=ComponentAccumulator()
540  TF_1st = CompFactory.FPGATrackSimTrackFitterTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
541  TF_1st.GuessHits = flags.Trigger.FPGATrackSim.ActiveConfig.guessHits
542  TF_1st.IdealCoordFitType = flags.Trigger.FPGATrackSim.ActiveConfig.idealCoordFitType
543  TF_1st.FPGATrackSimBankSvc = result.getPrimaryAndMerge(FPGATrackSimBankSvcCfg(flags))
544  TF_1st.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
545  TF_1st.chi2DofRecoveryMax = flags.Trigger.FPGATrackSim.ActiveConfig.chi2DoFRecoveryMax
546  TF_1st.chi2DofRecoveryMin = flags.Trigger.FPGATrackSim.ActiveConfig.chi2DoFRecoveryMin
547  TF_1st.doMajority = flags.Trigger.FPGATrackSim.ActiveConfig.doMajority
548  TF_1st.nHits_noRecovery = flags.Trigger.FPGATrackSim.ActiveConfig.nHitsNoRecovery
549  TF_1st.DoDeltaGPhis = flags.Trigger.FPGATrackSim.ActiveConfig.doDeltaGPhis
550  TF_1st.DoMissingHitsChecks = flags.Trigger.FPGATrackSim.ActiveConfig.doMissingHitsChecks
551  TF_1st.IdealGeoRoads = (flags.Trigger.FPGATrackSim.ActiveConfig.IdealGeoRoads and flags.Trigger.FPGATrackSim.tracking)
552  TF_1st.useSpacePoints = flags.Trigger.FPGATrackSim.spacePoints and not flags.Trigger.FPGATrackSim.ActiveConfig.genScan
553  TF_1st.SPRoadFilterTool = result.popToolsAndMerge(SPRoadFilterToolCfg(flags))
554  TF_1st.fitFromRoad = flags.Trigger.FPGATrackSim.ActiveConfig.fitFromRoad
555  result.addPublicTool(TF_1st, primary=True)
556  return result
557 
558 def FPGATrackSimOverlapRemovalToolCfg(flags,name="FPGATrackSimOverlapRemovalTool"):
559  result=ComponentAccumulator()
560  OR_1st = CompFactory.FPGATrackSimOverlapRemovalTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
561  OR_1st.ORAlgo = "Normal"
562  OR_1st.doFastOR = flags.Trigger.FPGATrackSim.ActiveConfig.doFastOR
563  OR_1st.NumOfHitPerGrouping = 3
564  if flags.Trigger.FPGATrackSim.ActiveConfig.useVaryingChi2Cut and not flags.Trigger.FPGATrackSim.ActiveConfig.trackNNAnalysis2nd:
565  OR_1st.MinChi2 = getChi2Cut(flags.Trigger.FPGATrackSim.region)
566  elif flags.Trigger.FPGATrackSim.ActiveConfig.useVaryingChi2Cut and flags.Trigger.FPGATrackSim.ActiveConfig.trackNNAnalysis2nd:
567  OR_1st.MinChi2 = getChi2CutNN(flags.Trigger.FPGATrackSim.region)
568  else:
569  OR_1st.MinChi2 = flags.Trigger.FPGATrackSim.ActiveConfig.chi2cut
570  if flags.Trigger.FPGATrackSim.ActiveConfig.hough or flags.Trigger.FPGATrackSim.ActiveConfig.hough1D:
571  OR_1st.nBins_x = flags.Trigger.FPGATrackSim.ActiveConfig.xBins + 2 * flags.Trigger.FPGATrackSim.ActiveConfig.xBufferBins
572  OR_1st.nBins_y = flags.Trigger.FPGATrackSim.ActiveConfig.yBins + 2 * flags.Trigger.FPGATrackSim.ActiveConfig.yBufferBins
573  OR_1st.localMaxWindowSize = flags.Trigger.FPGATrackSim.ActiveConfig.localMaxWindowSize
574  OR_1st.roadSliceOR = flags.Trigger.FPGATrackSim.ActiveConfig.roadSliceOR
575 
576  from FPGATrackSimAlgorithms.FPGATrackSimAlgorithmConfig import FPGATrackSimOverlapRemovalToolMonitoringCfg
577  OR_1st.MonTool = result.getPrimaryAndMerge(FPGATrackSimOverlapRemovalToolMonitoringCfg(flags))
578 
579  result.addPublicTool(OR_1st, primary=True)
580  return result
581 
583  newFlags = flags.cloneAndReplace("Trigger.FPGATrackSim.ActiveConfig", "Trigger.FPGATrackSim." + flags.Trigger.FPGATrackSim.algoTag,keepOriginal=True)
584  return newFlags
585 
586 def SPRoadFilterToolCfg(flags,secondStage=False,name="FPGATrackSimSpacepointRoadFilterTool"):
587  result=ComponentAccumulator()
588  name="FPGATrackSimSpacepointRoadFilterTool_1st"
589  if secondStage:
590  name="FPGATrackSimSpacepointRoadFilterTool_2st"
591  SPRoadFilter = CompFactory.FPGATrackSimSpacepointRoadFilterTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
592  SPRoadFilter.FPGATrackSimMappingSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
593  SPRoadFilter.FPGATrackSimBankSvc = result.getPrimaryAndMerge(FPGATrackSimBankSvcCfg(flags))
594  SPRoadFilter.filtering = flags.Trigger.FPGATrackSim.ActiveConfig.spacePointFiltering
595  SPRoadFilter.minSpacePlusPixel = flags.Trigger.FPGATrackSim.minSpacePlusPixel
596  SPRoadFilter.isSecondStage = secondStage
597  SPRoadFilter.dropUnpairedIfSP = flags.Trigger.FPGATrackSim.dropUnpairedIfSP
598 
599  # This threshold is the number of *missing* hits allowed. For now, assume that if 1st stage this is always 1.
600  # We don't actually run this tool in the first stage anymore, so this is more to preserve backwards compatibility
601  if secondStage:
602  SPRoadFilter.threshold = flags.Trigger.FPGATrackSim.hitThreshold
603  else:
604  SPRoadFilter.threshold = 1
605 
606  SPRoadFilter.setSectors = (flags.Trigger.FPGATrackSim.ActiveConfig.IdealGeoRoads and flags.Trigger.FPGATrackSim.tracking)
607  result.setPrivateTools(SPRoadFilter)
608  return result
609 
610 
611 
612 
613 def FPGATrackSimLogicalHitsProcessAlgCfg(inputFlags,name="FPGATrackSimLogicalHitsProcessAlg",**kwargs):
614 
616 
617  result=ComponentAccumulator()
618  kwargs.setdefault("name", FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,name))
619 
620  theFPGATrackSimLogicalHitsProcessAlg=CompFactory.FPGATrackSimLogicalHitsProcessAlg(**kwargs)
621  theFPGATrackSimLogicalHitsProcessAlg.writeOutputData = flags.Trigger.FPGATrackSim.writeAdditionalOutputData
622  theFPGATrackSimLogicalHitsProcessAlg.tracking = flags.Trigger.FPGATrackSim.tracking
623  theFPGATrackSimLogicalHitsProcessAlg.SetTruthParametersForTracks = flags.Trigger.FPGATrackSim.SetTruthParametersForTracks
624  theFPGATrackSimLogicalHitsProcessAlg.doOverlapRemoval = flags.Trigger.FPGATrackSim.doOverlapRemoval
625  theFPGATrackSimLogicalHitsProcessAlg.DoMissingHitsChecks = flags.Trigger.FPGATrackSim.ActiveConfig.doMissingHitsChecks
626  theFPGATrackSimLogicalHitsProcessAlg.DoHoughRootOutput1st = flags.Trigger.FPGATrackSim.ActiveConfig.houghRootoutput1st
627  theFPGATrackSimLogicalHitsProcessAlg.NumOfHitPerGrouping = flags.Trigger.FPGATrackSim.ActiveConfig.NumOfHitPerGrouping
628  theFPGATrackSimLogicalHitsProcessAlg.DoNNTrack_1st = flags.Trigger.FPGATrackSim.ActiveConfig.trackNNAnalysis
629  theFPGATrackSimLogicalHitsProcessAlg.DoGNNTrack = flags.Trigger.FPGATrackSim.GNN.doGNNTracking
630  theFPGATrackSimLogicalHitsProcessAlg.DoGNNPixelSeeding = flags.Trigger.FPGATrackSim.GNN.doGNNPixelSeeding
631  theFPGATrackSimLogicalHitsProcessAlg.eventSelector = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
632  if flags.Trigger.FPGATrackSim.ActiveConfig.useVaryingChi2Cut and not flags.Trigger.FPGATrackSim.ActiveConfig.trackNNAnalysis2nd:
633  theFPGATrackSimLogicalHitsProcessAlg.TrackScoreCut = getChi2Cut(flags.Trigger.FPGATrackSim.region)
634  elif flags.Trigger.FPGATrackSim.ActiveConfig.useVaryingChi2Cut and flags.Trigger.FPGATrackSim.ActiveConfig.trackNNAnalysis2nd:
635  theFPGATrackSimLogicalHitsProcessAlg.TrackScoreCut = getChi2CutNN(flags.Trigger.FPGATrackSim.region)
636  else:
637  theFPGATrackSimLogicalHitsProcessAlg.TrackScoreCut = flags.Trigger.FPGATrackSim.ActiveConfig.chi2cut
638  theFPGATrackSimLogicalHitsProcessAlg.passLowestChi2TrackOnly = flags.Trigger.FPGATrackSim.ActiveConfig.passLowestChi2TrackOnly
639  theFPGATrackSimLogicalHitsProcessAlg.secondStageStrips = (not flags.Trigger.FPGATrackSim.ActiveConfig.GNN)
640  FPGATrackSimMaping = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
641  theFPGATrackSimLogicalHitsProcessAlg.FPGATrackSimMapping = FPGATrackSimMaping
642  # Adding region so we can set it for tracks, then get the bfield
643  theFPGATrackSimLogicalHitsProcessAlg.Region = flags.Trigger.FPGATrackSim.region
644  # If tracking is set to False or if we do the NN analysis, don't configure the bank service
645  if flags.Trigger.FPGATrackSim.tracking and not flags.Trigger.FPGATrackSim.ActiveConfig.trackNNAnalysis:
646  result.getPrimaryAndMerge(FPGATrackSimBankSvcCfg(flags))
647 
648  if (flags.Trigger.FPGATrackSim.ActiveConfig.hough1D):
649  theFPGATrackSimLogicalHitsProcessAlg.RoadFinder = result.getPrimaryAndMerge(FPGATrackSimRoadUnionTool1DCfg(flags))
650  elif (flags.Trigger.FPGATrackSim.ActiveConfig.genScan):
651  theFPGATrackSimLogicalHitsProcessAlg.RoadFinder = result.getPrimaryAndMerge(FPGATrackSimRoadUnionToolGenScanCfg(flags))
652  elif (flags.Trigger.FPGATrackSim.ActiveConfig.GNN):
653  theFPGATrackSimLogicalHitsProcessAlg.RoadFinder = result.getPrimaryAndMerge(FPGATrackSimRoadUnionToolGNNCfg(flags))
654  else:
655  theFPGATrackSimLogicalHitsProcessAlg.RoadFinder = result.getPrimaryAndMerge(FPGATrackSimRoadUnionToolCfg(flags))
656 
657  if (flags.Trigger.FPGATrackSim.ActiveConfig.etaPatternFilter):
658  EtaPatternFilter = CompFactory.FPGATrackSimEtaPatternFilterTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"FPGATrackSimEtaPatternFilterTool"))
659  EtaPatternFilter.FPGATrackSimMappingSvc = FPGATrackSimMaping
660  EtaPatternFilter.threshold = flags.Trigger.FPGATrackSim.Hough1D.threshold[0]
661  EtaPatternFilter.EtaPatterns = flags.Trigger.FPGATrackSim.mapsDir+"/"+FPGATrackSimDataPrepConfig.getBaseName(flags)+".patt"
662  theFPGATrackSimLogicalHitsProcessAlg.RoadFilter = EtaPatternFilter
663  theFPGATrackSimLogicalHitsProcessAlg.FilterRoads = True
664 
665  if (flags.Trigger.FPGATrackSim.ActiveConfig.phiRoadFilter):
666  RoadFilter2 = CompFactory.FPGATrackSimPhiRoadFilterTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"FPGATrackSimPhiRoadFilterTool"))
667  RoadFilter2.FPGATrackSimMappingSvc = FPGATrackSimMaping
668  RoadFilter2.threshold = flags.Trigger.FPGATrackSim.Hough1D.threshold[0]
669  RoadFilter2.fieldCorrection = flags.Trigger.FPGATrackSim.ActiveConfig.fieldCorrection
670 
671  windows = [flags.Trigger.FPGATrackSim.Hough1D.phifilterwindow for i in range(len(flags.Trigger.FPGATrackSim.ActiveConfig.hitExtendX))]
672  RoadFilter2.window = windows
673 
674  theFPGATrackSimLogicalHitsProcessAlg.RoadFilter2 = RoadFilter2
675  theFPGATrackSimLogicalHitsProcessAlg.FilterRoads2 = True
676 
677  theFPGATrackSimLogicalHitsProcessAlg.SlicingEngineTool = result.getPrimaryAndMerge(FPGATrackSimSlicingEngineCfg(flags))
678 
679  theFPGATrackSimLogicalHitsProcessAlg.HoughRootOutputTool = result.getPrimaryAndMerge(FPGATrackSimHoughRootOutputToolCfg(flags))
680 
681  LRTRoadFilter = CompFactory.FPGATrackSimLLPRoadFilterTool(FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags,"FPGATrackSimLLPRoadFilterTool"))
682  result.addPublicTool(LRTRoadFilter)
683  theFPGATrackSimLogicalHitsProcessAlg.LRTRoadFilter = LRTRoadFilter
684 
685  theFPGATrackSimLogicalHitsProcessAlg.LRTRoadFinder = result.getPrimaryAndMerge(LRTRoadFinderCfg(flags))
686  theFPGATrackSimLogicalHitsProcessAlg.NNTrackTool = result.getPrimaryAndMerge(NNTrackToolCfg(flags))
687 
688  theFPGATrackSimLogicalHitsProcessAlg.writeInputBranches=flags.Trigger.FPGATrackSim.writeAdditionalOutputData and (flags.Trigger.FPGATrackSim.regionToWriteDPTree < 0)
689  theFPGATrackSimLogicalHitsProcessAlg.OutputTool = result.popToolsAndMerge(FPGATrackSimWriteOutputCfg(flags))
690  theFPGATrackSimLogicalHitsProcessAlg.TrackFitter_1st = result.getPrimaryAndMerge(FPGATrackSimTrackFitterToolCfg(flags))
691  theFPGATrackSimLogicalHitsProcessAlg.OverlapRemoval_1st = result.getPrimaryAndMerge(FPGATrackSimOverlapRemovalToolCfg(flags))
692 
693  theFPGATrackSimLogicalHitsProcessAlg.SpacePointTool = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimSpacePointsToolCfg(flags))
694  theFPGATrackSimLogicalHitsProcessAlg.Spacepoints = flags.Trigger.FPGATrackSim.spacePoints
695 
696  if flags.Trigger.FPGATrackSim.ActiveConfig.lrt:
697  assert flags.Trigger.FPGATrackSim.ActiveConfig.lrtUseBasicHitFilter != flags.Trigger.FPGATrackSim.ActiveConfig.lrtUseMlHitFilter, 'Inconsistent LRT hit filtering setup, need either ML of Basic filtering enabled'
698  assert flags.Trigger.FPGATrackSim.ActiveConfig.lrtUseStraightTrackHT != flags.Trigger.FPGATrackSim.ActiveConfig.lrtUseDoubletHT, 'Inconsistent LRT HT setup, need either double or strightTrack enabled'
699  theFPGATrackSimLogicalHitsProcessAlg.doLRT = True
700  theFPGATrackSimLogicalHitsProcessAlg.LRTHitFiltering = (not flags.Trigger.FPGATrackSim.ActiveConfig.lrtSkipHitFiltering)
701 
702 
703 
704  from FPGATrackSimAlgorithms.FPGATrackSimAlgorithmConfig import FPGATrackSimTrackMonCfg
705 
706 
707  theFPGATrackSimLogicalHitsProcessAlg.FirstStageRoadMonitor = result.getPrimaryAndMerge(FPGATrackSimTrackMonCfg ('first_stage', flags, variety='road'))
708 
709  theFPGATrackSimLogicalHitsProcessAlg.FirstStageRoadPostFilter1Monitor = result.getPrimaryAndMerge(FPGATrackSimTrackMonCfg ('first_stage_post_filter_1', flags, variety='road'))
710 
711  theFPGATrackSimLogicalHitsProcessAlg.FirstStageRoadPostOverlapRemovalMonitor = result.getPrimaryAndMerge(FPGATrackSimTrackMonCfg ('first_stage_post_overlap_removal', flags, variety='road'))
712 
713  theFPGATrackSimLogicalHitsProcessAlg.FirstStageRoadPostFilter2Monitor = result.getPrimaryAndMerge(FPGATrackSimTrackMonCfg ('first_stage_post_filter_2', flags, variety='road'))
714 
715 
716  theFPGATrackSimLogicalHitsProcessAlg.FirstStageTrackMonitor = result.getPrimaryAndMerge(FPGATrackSimTrackMonCfg ('first_stage', flags, variety='track'))
717 
718  theFPGATrackSimLogicalHitsProcessAlg.FirstStageTrackPostSetTruthMonitor = result.getPrimaryAndMerge(FPGATrackSimTrackMonCfg ('first_stage_post_set_truth', flags, variety='track'))
719 
720  theFPGATrackSimLogicalHitsProcessAlg.FirstStageTrackPostChi2Monitor = result.getPrimaryAndMerge(FPGATrackSimTrackMonCfg ('first_stage_post_chi2', flags, variety='track'))
721 
722  theFPGATrackSimLogicalHitsProcessAlg.FirstStageTrackPostOverlapRemovalTrackMonitor = result.getPrimaryAndMerge(FPGATrackSimTrackMonCfg ('first_stage_post_overlap_removal', flags, variety='track'))
723 
724  result.addEventAlgo(theFPGATrackSimLogicalHitsProcessAlg)
725 
726  return result
727 
728 
729 
730 
731 def getChi2Cut(region):
732  chi2cut_l = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 20] #from most recent run on this branch with new maps/banks, all chi2's are under 1
733  binSize = 0.2
734  side = (region >> 5) & 0x1
735  etaBin = (region >> 6) & 0x1F
736  etaRange = [round(binSize * etaBin, 1), round(binSize * (etaBin + 1), 1)] if side else [round(-binSize * (etaBin + 1), 1), round(-binSize * etaBin, 1)]
737 
738  abs_etaRange = tuple(round(abs(val), 1) for val in etaRange)
739 
740  eta_to_chi2 = {
741  (0.0, 0.2): chi2cut_l[0], (0.2, 0.4): chi2cut_l[1], (0.4, 0.6): chi2cut_l[2],
742  (0.6, 0.8): chi2cut_l[3], (0.8, 1.0): chi2cut_l[4], (1.0, 1.2): chi2cut_l[5],
743  (1.2, 1.4): chi2cut_l[6], (1.4, 1.6): chi2cut_l[7], (1.6, 1.8): chi2cut_l[8],
744  (1.8, 2.0): chi2cut_l[9], (2.0, 2.2): chi2cut_l[10], (2.2, 2.4): chi2cut_l[11],
745  (2.4, 2.6): chi2cut_l[12], (2.6, 2.8): chi2cut_l[13], (2.8, 3.0): chi2cut_l[14],
746  (3.0, 3.2): chi2cut_l[15], (3.2, 3.4): chi2cut_l[16], (3.4, 3.6): chi2cut_l[17],
747  (3.6, 3.8): chi2cut_l[18], (3.8, 4.0): chi2cut_l[19]
748  }
749 
750  return eta_to_chi2.get(abs_etaRange, 20)
751 
752 def getChi2CutNN(region):
753  chi2cut_l = [0.97,0.97,0.99,
754  0.7,0.86,0.99,
755  0.98,0.92,0.98,
756  0.95,0.93,0.4,
757  0.4,0.4,0.7,
758  0.6,0.5,0.4,
759  0.4,0.4]
760  binSize = 0.2
761  side = (region >> 5) & 0x1
762  etaBin = (region >> 6) & 0x1F
763  etaRange = [round(binSize * etaBin, 1), round(binSize * (etaBin + 1), 1)] if side else [round(-binSize * (etaBin + 1), 1), round(-binSize * etaBin, 1)]
764 
765  abs_etaRange = tuple(round(abs(val), 1) for val in etaRange)
766 
767  eta_to_chi2 = {
768  (0.0, 0.2): chi2cut_l[0], (0.2, 0.4): chi2cut_l[1], (0.4, 0.6): chi2cut_l[2],
769  (0.6, 0.8): chi2cut_l[3], (0.8, 1.0): chi2cut_l[4], (1.0, 1.2): chi2cut_l[5],
770  (1.2, 1.4): chi2cut_l[6], (1.4, 1.6): chi2cut_l[7], (1.6, 1.8): chi2cut_l[8],
771  (1.8, 2.0): chi2cut_l[9], (2.0, 2.2): chi2cut_l[10], (2.2, 2.4): chi2cut_l[11],
772  (2.4, 2.6): chi2cut_l[12], (2.6, 2.8): chi2cut_l[13], (2.8, 3.0): chi2cut_l[14],
773  (3.0, 3.2): chi2cut_l[15], (3.2, 3.4): chi2cut_l[16], (3.4, 3.6): chi2cut_l[17],
774  (3.6, 3.8): chi2cut_l[18], (3.8, 4.0): chi2cut_l[19]
775  }
776  return eta_to_chi2.get(abs_etaRange, 0.99)
777 
778 
780  # convert regex to array of regions
781  if flags.Trigger.FPGATrackSim.regionList == "": # in case of empty list just use the region set to flags.Trigger.FPGATrackSim.region
782  flags.Trigger.FPGATrackSim.regionList = [flags.Trigger.FPGATrackSim.region]
783  else: # otherwise use the regionList (this overrides the region flag)
784  from FPGATrackSimConfTools.FPGATrackSimHelperFunctions import convertRegionsExpressionToArray
785  flags.Trigger.FPGATrackSim.regionList = convertRegionsExpressionToArray(flags.Trigger.FPGATrackSim.regionList)
786  print(f"Running for regions: {flags.Trigger.FPGATrackSim.regionList}")
787 
788 
790  FPGATrackSimDataPrepConfig.FPGATrackSimDataPrepFlagCfg(flags)
791 
792  flags.Scheduler.ShowDataDeps=True
793  flags.Scheduler.CheckDependencies=True
794  flags.Debug.DumpEvtStore=False
795 
796  flags.Trigger.FPGATrackSim.readOfflineObjects=False
797  flags.Trigger.FPGATrackSim.doMultiTruth=False
798 
799  flags.Trigger.FPGATrackSim.tracking = False
800  flags.Trigger.FPGATrackSim.Hough.genScan = True
801  flags.Trigger.FPGATrackSim.convertSPs = False # in case we need the conversion to take place on hw we'll have to convert to SPs after the cluster-sorting (will probably need new algorithm)
802  flags.Tracking.ITkActsValidateF150Pass.doActsSpacePoint = not flags.Trigger.FPGATrackSim.convertSPs
803  flags.Trigger.FPGATrackSim.Hough.secondStage = False
804 
805  flags.Trigger.FPGATrackSim.regionList="34,98,162,226,290,354,418,482,546,610,674,738,802,866,930,994,1058,1122,1186,1250"
807 
808  return flags
809 
812  if not flags.Trigger.FPGATrackSim.runOnPreProducedHeaderFiles:
813  acc.merge(FPGATrackSimDataPrepConfig.FPGATrackSimClusteringCfg(flags))
814 
815  from FPGATrackSimConfTools.FPGATrackSimMultiRegionConfig import FPGATrackSimMultiRegionTrackingCfg
816  acc.merge(FPGATrackSimMultiRegionTrackingCfg(flags))
817  else:
818  from FPGATrackSimConfTools.FPGATrackSimMergeOutputsConfig import FPGATrackSimMergeOutputsAlgCfg
819  acc.merge(FPGATrackSimMergeOutputsAlgCfg(flags))
820 
821  from FPGATrackSimSeeding.FPGATrackSimSeedingConfig import FPGATrackSimSeedingCfg
822  acc.merge(FPGATrackSimSeedingCfg(flags))
823 
824 
825  if flags.Tracking.ActiveConfig.storeTrackSeeds:
826  from ActsConfig.ActsSeedingConfig import ActsStoreTrackSeedsCfg
827  from InDetConfig.ITkActsHelpers import isFastPrimaryPass
828 
829  acc.merge(ActsStoreTrackSeedsCfg(flags,
830  processPixels = True,
831  processStrips = not isFastPrimaryPass(flags)))
832 
833 
834  acc.merge(WriteAdditionalFPGATrackSimOutputCfg(flags))
835 
836  # for testing hardware run in F150
837  if(flags.Trigger.FPGATrackSim.runF150hw):
838  from EFTrackingFPGAPipeline.F150KernelTesterConfig import KernelTesterCfg, F150EDMConversionAlgCfg
839  acc.merge(KernelTesterCfg(flags))
840  acc.merge(F150EDMConversionAlgCfg(flags))
841 
842 
843  return acc
844 
847  if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
848  acc.addService(CompFactory.THistSvc(Output = ["EXPERT DATAFILE='monitoring.root', OPT='RECREATE'"]))
849 
850  if (flags.Trigger.FPGATrackSim.Hough.houghRootoutput1st | flags.Trigger.FPGATrackSim.Hough.houghRootoutput2nd):
851  acc.addService(CompFactory.THistSvc(Output = ["TRIGFPGATrackSimHOUGHOUTPUT DATAFILE='HoughRootOutput.root', OPT='RECREATE'"]))
852 
853  if flags.Trigger.FPGATrackSim.Hough.writeTestOutput:
854  acc.addService(CompFactory.THistSvc(Output = ["FPGATRACKSIMOUTPUT DATAFILE='test.root', OPT='RECREATE'"]))
855 
856  if (flags.Trigger.FPGATrackSim.Hough.genScan):
857  acc.addService(CompFactory.THistSvc(Output = ["GENSCAN DATAFILE='genscan.root', OPT='RECREATE'"]))
858  return acc
859 
860 if __name__ == "__main__":
861  from AthenaConfiguration.AllConfigFlags import initConfigFlags
862  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
863 
864 
865  flags = initConfigFlags()
866 
867 
869  FinalProtoTrackChainxAODTracksKey="FPGA"
870  flags.Detector.EnableCalo = False
871 
872  # ensure that the xAOD SP and cluster containers are available
873  flags.Tracking.ITkMainPass.doAthenaToActsSpacePoint=True
874  flags.Tracking.ITkMainPass.doAthenaToActsCluster=True
875  from ActsConfig.ActsCIFlags import actsLegacyWorkflowFlags
877  flags.Acts.doRotCorrection = False
878 
879 
880  flags.Concurrency.NumThreads=1
881  flags.Concurrency.NumConcurrentEvents=1
882  flags.Concurrency.NumProcs=0
883  flags.Scheduler.ShowDataDeps=True
884  flags.Scheduler.CheckDependencies=True
885  flags.Debug.DumpEvtStore=False
886 
887  # flags.Exec.DebugStage="exec" # useful option to debug the execution of the job - we want it commented out for production
888  flags.fillFromArgs()
889 
891 
892 
893  if flags.Trigger.FPGATrackSim.Hough.useVaryingChi2Cut and not flags.Trigger.FPGATrackSim.Hough.trackNNAnalysis:
894  flags.Trigger.FPGATrackSim.Hough.chi2cut = getChi2Cut(flags.Trigger.FPGATrackSim.region)
895  assert not flags.Trigger.FPGATrackSim.pipeline.startswith('F-5'),"ERROR You are trying to run an F-5* pipeline! This is not yet supported!"
896 
897  if (flags.Trigger.FPGATrackSim.pipeline.startswith('F-1')):
898  print("You are trying to run an F-100 pipeline! I am going to run the Data Prep chain for you and nothing else!")
899  FPGATrackSimDataPrepConfig.runDataPrepChain()
900  elif (flags.Trigger.FPGATrackSim.pipeline.startswith('F-2')):
901  print("You are trying to run an F-2* pipeline! I am auto-configuring the 1D bitshift for you, including eta pattern filters and phi road filters")
902  flags.Trigger.FPGATrackSim.Hough.etaPatternFilter = True
903  flags.Trigger.FPGATrackSim.Hough.phiRoadFilter = True
904  flags.Trigger.FPGATrackSim.Hough.hough1D = True
905  flags.Trigger.FPGATrackSim.Hough.hough = False
906  elif (flags.Trigger.FPGATrackSim.pipeline.startswith('F-3')):
907  print("You are trying to run an F-3* pipeline! I am auto-configuring the 2D HT for you, and disabling the eta pattern filter and phi road filter. Whether you wanted to or not")
908  flags.Trigger.FPGATrackSim.Hough.etaPatternFilter = False
909  flags.Trigger.FPGATrackSim.Hough.phiRoadFilter = False
910  flags.Trigger.FPGATrackSim.Hough.hough1D = False
911  flags.Trigger.FPGATrackSim.Hough.hough = True
912  elif (flags.Trigger.FPGATrackSim.pipeline.startswith('F-4')):
913  print("You are trying to run an F-4* pipeline! I am auto-configuring the GNN pattern recognition for you. Whether you wanted to or not")
914  flags.Trigger.FPGATrackSim.Hough.GNN = True
915  flags.Trigger.FPGATrackSim.Hough.chi2cut = 40 # All of the track candidates have chi2 values around 20 for some reason. Needs further investigation. For now move the default cut value to 40
916  elif (flags.Trigger.FPGATrackSim.pipeline.startswith('F-6')):
917  print("You are trying to run an F-6* pipeline! I am auto-configuring the Inside-Out for you. Whether you wanted to or not")
918  flags.Trigger.FPGATrackSim.Hough.genScan=True
919  flags.Trigger.FPGATrackSim.spacePoints = flags.Trigger.FPGATrackSim.Hough.secondStage
920  elif (flags.Trigger.FPGATrackSim.pipeline != ""):
921  raise AssertionError("ERROR You are trying to run the pipeline " + flags.Trigger.FPGATrackSim.pipeline + " which is not yet supported!")
922 
923  if (not flags.Trigger.FPGATrackSim.pipeline.startswith('F-1')):
924 
925  flags.Tracking.writeExtendedSi_PRDInfo = not flags.Trigger.FPGATrackSim.writeOfflPRDInfo
926  splitPipeline=flags.Trigger.FPGATrackSim.pipeline.split('-')
927  trackingOption=9999999
928  if (len(splitPipeline) > 1): trackingOption=int(splitPipeline[1])
929  if (trackingOption < 9999999):
930  trackingOptionMod = (trackingOption % 100)
931  if (trackingOptionMod == 0):
932  print("You are trying to run the linearized chi2 fit as part of a pipeline! I am going to enable this for you whether you want to or not")
933  flags.Trigger.FPGATrackSim.tracking = True
934  flags.Trigger.FPGATrackSim.Hough.trackNNAnalysis = False
935  elif (trackingOptionMod == 10):
936  print("You are trying to run the second stage NN fake rejection as part of a pipeline! I am going to enable this for you whether you want to or not")
937  flags.Trigger.FPGATrackSim.tracking = True
938  flags.Trigger.FPGATrackSim.Hough.trackNNAnalysis = True
939  flags.Trigger.FPGATrackSim.Hough.trackNNAnalysis2nd = flags.Trigger.FPGATrackSim.Hough.secondStage
940  if (flags.Trigger.FPGATrackSim.pipeline.startswith('F-6')):
941  flags.Trigger.FPGATrackSim.doNNPathFinder = True
942  flags.Trigger.FPGATrackSim.doOverlapRemoval = False
943  flags.Trigger.FPGATrackSim.tracking = False
944  flags.Trigger.FPGATrackSim.Hough.trackNNAnalysis = False
945  flags.Trigger.FPGATrackSim.Hough.trackNNAnalysis2nd = flags.Trigger.FPGATrackSim.Hough.secondStage
946  else:
947  raise AssertionError("ERROR Your tracking option for the pipeline = " + str(trackingOption) + " is not yet supported!")
948 
949  if isinstance(flags.Trigger.FPGATrackSim.wrapperFileName, str):
950  log.info("wrapperFile is string, converting to list")
951  flags.Trigger.FPGATrackSim.wrapperFileName = [flags.Trigger.FPGATrackSim.wrapperFileName]
952  flags.Input.Files = lambda f: [f.Trigger.FPGATrackSim.wrapperFileName]
953 
954  if flags.Trigger.FPGATrackSim.Hough.useVaryingChi2Cut and flags.Trigger.FPGATrackSim.Hough.trackNNAnalysis:
955  flags.Trigger.FPGATrackSim.Hough.chi2cut = getChi2CutNN(flags.Trigger.FPGATrackSim.region)
956 
957  flags.lock()
958  flags.dump()
959  flags = flags.cloneAndReplace("Tracking.ActiveConfig","Tracking.MainPass")
960  acc=MainServicesCfg(flags)
961 
962  acc.merge(WriteAdditionalFPGATrackSimOutputCfg(flags))
963 
964  if not flags.Trigger.FPGATrackSim.wrapperFileName:
965  from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
966  acc.merge(PoolReadCfg(flags))
967 
968  if flags.Input.isMC:
969  from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
970  acc.merge(GEN_AOD2xAODCfg(flags))
971 
972  from JetRecConfig.JetRecoSteering import addTruthPileupJetsToOutputCfg # TO DO: check if this is indeed necessary for pileup samples
973  acc.merge(addTruthPileupJetsToOutputCfg(flags))
974 
975  if flags.Detector.EnableCalo:
976  from CaloRec.CaloRecoConfig import CaloRecoCfg
977  acc.merge(CaloRecoCfg(flags))
978 
979  if flags.Tracking.recoChain:
980  from InDetConfig.TrackRecoConfig import InDetTrackRecoCfg
981  acc.merge(InDetTrackRecoCfg(flags))
982  if flags.Trigger.FPGATrackSim.writeOfflPRDInfo:
983  from InDetConfig.InDetPrepRawDataToxAODConfig import ITkActsPrepDataToxAODCfg
984  acc.merge( ITkActsPrepDataToxAODCfg( flags,
985  PixelMeasurementContainer = "ITkPixelMeasurements_offl",
986  StripMeasurementContainer = "ITkStripMeasurements_offl" ) )
987  from InDetConfig.InDetPrepRawDataToxAODConfig import TruthParticleIndexDecoratorAlgCfg
988  acc.merge( TruthParticleIndexDecoratorAlgCfg(flags) )
989  from InDetConfig.InDetPrepRawDataFormationConfig import ITkXAODToInDetClusterConversionCfg
990  acc.merge(ITkXAODToInDetClusterConversionCfg(flags))
991 
992 
993  # Configure both the dataprep and logical hits algorithms.
994  acc.merge(FPGATrackSimDataPrepConfig.FPGATrackSimDataPrepAlgCfg(flags))
995 
996  from FPGATrackSimConfTools.FPGATrackSimMultiRegionConfig import FPGATrackSimMultiRegionTrackingCfg
997  acc.merge(FPGATrackSimMultiRegionTrackingCfg(flags))
998 
999  if flags.Trigger.FPGATrackSim.doEDMConversion:
1000  stage = "_2nd" if flags.Trigger.FPGATrackSim.Hough.secondStage else "_1st"
1001  acc.merge(FPGATrackSimDataPrepConfig.FPGAConversionAlgCfg(flags, name = f"FPGAConversionAlg{stage}",
1002  stage = f"{stage}",
1003  doActsTrk=True,
1004  doSP=flags.Trigger.FPGATrackSim.convertSPs))
1005 
1006  from FPGATrackSimPrototrackFitter.FPGATrackSimPrototrackFitterConfig import FPGATruthDecorationCfg, FPGAProtoTrackFitCfg
1007  acc.merge(FPGAProtoTrackFitCfg(flags,stage=f"{stage}")) # Run ACTS KF
1008  acc.merge(FPGATruthDecorationCfg(flags,FinalProtoTrackChainxAODTracksKey=FinalProtoTrackChainxAODTracksKey)) # Run Truth Matching/Decoration chain
1009  if flags.Trigger.FPGATrackSim.runCKF:
1010  from FPGATrackSimConfTools.FPGATrackExtensionConfig import FPGATrackExtensionAlgCfg
1011  acc.merge(FPGATrackExtensionAlgCfg(flags, enableTrackStatePrinter=False, name="FPGATrackExtension",
1012  ProtoTracksLocation=f"ActsProtoTracks{stage}FromFPGATrack")) # run CKF track extension on FPGA tracks
1013 
1014  if flags.Trigger.FPGATrackSim.writeToAOD:
1015  acc.merge(FPGATrackSimDataPrepConfig.WriteToAOD(flags,
1016  stage = f"{stage}",
1017  finalTrackParticles=f"{FinalProtoTrackChainxAODTracksKey}TrackParticles"))
1018 
1019  # Reporting algorithm (used for debugging - can be disabled)
1020  from FPGATrackSimReporting.FPGATrackSimReportingConfig import FPGATrackSimReportingCfg
1021  acc.merge(FPGATrackSimReportingCfg(flags, stage=f"{stage}",
1022  perEventReports = ((flags.Trigger.FPGATrackSim.sampleType != 'skipTruth') and flags.Exec.MaxEvents<=10 ) )) # disable perEventReports for pileup samples or many events
1023 
1024  acc.store(open('AnalysisConfig.pkl','wb'))
1025 
1026  acc.foreach_component("*FPGATrackSim*").OutputLevel=flags.Trigger.FPGATrackSim.loglevel
1027  if flags.Trigger.FPGATrackSim.msgLimit!=-1:
1028  acc.getService("MessageSvc").debugLimit = flags.Trigger.FPGATrackSim.msgLimit
1029  acc.getService("MessageSvc").infoLimit = flags.Trigger.FPGATrackSim.msgLimit
1030  acc.getService("MessageSvc").verboseLimit = flags.Trigger.FPGATrackSim.msgLimit
1031 
1032  statusCode = acc.run(flags.Exec.MaxEvents)
1033  assert statusCode.isSuccess() is True, "Application execution did not succeed"
python.FPGATrackSimAnalysisConfig.NNTrackToolCfg
def NNTrackToolCfg(flags, name="FPGATrackSimNNTrackTool")
Definition: FPGATrackSimAnalysisConfig.py:521
python.FPGATrackSimAnalysisConfig.FPGATrackSimF150FlagCfg
def FPGATrackSimF150FlagCfg(flags)
Definition: FPGATrackSimAnalysisConfig.py:789
FPGATrackSimPrototrackFitterConfig.FPGAProtoTrackFitCfg
def FPGAProtoTrackFitCfg(flags, name="FPGAPrototrackFitterConfig", stage='', **kwargs)
Definition: FPGATrackSimPrototrackFitterConfig.py:42
python.CaloRecoConfig.CaloRecoCfg
def CaloRecoCfg(flags, clustersname=None)
Definition: CaloRecoConfig.py:9
PathResolver::FindCalibFile
static std::string FindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.h:63
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
vtune_athena.format
format
Definition: vtune_athena.py:14
ActsSeedingConfig.ActsStoreTrackSeedsCfg
ComponentAccumulator ActsStoreTrackSeedsCfg(flags, *bool processPixels, bool processStrips, **dict kwargs)
Definition: ActsSeedingConfig.py:557
python.FPGATrackSimAnalysisConfig.FPGATrackSimRoadUnionTool1DCfg
def FPGATrackSimRoadUnionTool1DCfg(flags, name="FPGATrackSimRoadUnionTool1D")
Definition: FPGATrackSimAnalysisConfig.py:192
xAODTruthCnvConfig.GEN_AOD2xAODCfg
def GEN_AOD2xAODCfg(flags, name="GEN_AOD2xAOD", **kwargs)
Definition: xAODTruthCnvConfig.py:22
MuonGM::round
float round(const float toRound, const unsigned int decimals)
Definition: Mdt.cxx:27
python.FPGATrackSimAnalysisConfig.FPGATrackSimHoughRootOutputToolCfg
def FPGATrackSimHoughRootOutputToolCfg(flags, name="FPGATrackSimHoughRootOutputTool")
Definition: FPGATrackSimAnalysisConfig.py:497
python.FPGATrackSimAnalysisConfig.getFitWeights
def getFitWeights(etaBin)
Definition: FPGATrackSimAnalysisConfig.py:19
python.FPGATrackSimAnalysisConfig.FPGATrackSimGNNRootOutputToolCfg
def FPGATrackSimGNNRootOutputToolCfg(flags, name="FPGATrackSimGNNRootOutputTool")
Definition: FPGATrackSimAnalysisConfig.py:475
python.FPGATrackSimMergeOutputsConfig.FPGATrackSimMergeOutputsAlgCfg
def FPGATrackSimMergeOutputsAlgCfg(flags, **kwargs)
Definition: FPGATrackSimMergeOutputsConfig.py:9
FPGATrackSimHelperFunctions.convertRegionsExpressionToArray
def convertRegionsExpressionToArray(expression, min_value=0, max_value=1279)
Definition: FPGATrackSimHelperFunctions.py:6
python.InDetPrepRawDataToxAODConfig.TruthParticleIndexDecoratorAlgCfg
def TruthParticleIndexDecoratorAlgCfg(flags, name='TruthParticleIndexDecoratorAlg', **kwargs)
Definition: InDetPrepRawDataToxAODConfig.py:6
F150KernelTesterConfig.KernelTesterCfg
def KernelTesterCfg(flags, name='F150BenchmarkAlg', **kwarg)
Definition: F150KernelTesterConfig.py:6
python.FPGATrackSimMultiRegionConfig.FPGATrackSimMultiRegionTrackingCfg
def FPGATrackSimMultiRegionTrackingCfg(flags)
Definition: FPGATrackSimMultiRegionConfig.py:6
python.FPGATrackSimAnalysisConfig.FPGATrackSimTrackFitterToolCfg
def FPGATrackSimTrackFitterToolCfg(flags, name="FPGATrackSimTrackFitterTool")
Definition: FPGATrackSimAnalysisConfig.py:538
PathResolver::FindCalibDirectory
static std::string FindCalibDirectory(const std::string &logical_file_name)
Definition: PathResolver.h:64
TrigFastTrackFinderConfig.ITkTrigL2LayerNumberToolCfg
ComponentAccumulator ITkTrigL2LayerNumberToolCfg(AthConfigFlags flags, **kwargs)
Definition: TrigFastTrackFinderConfig.py:259
python.FPGATrackSimAnalysisConfig.ConfigureMultiRegionFlags
def ConfigureMultiRegionFlags(flags)
Definition: FPGATrackSimAnalysisConfig.py:779
python.FPGATrackSimAnalysisConfig.FPGATrackSimLogicalHitsProcessAlgCfg
def FPGATrackSimLogicalHitsProcessAlgCfg(inputFlags, name="FPGATrackSimLogicalHitsProcessAlg", **kwargs)
Definition: FPGATrackSimAnalysisConfig.py:613
python.FPGATrackSimAnalysisConfig.FPGATrackSimRoadUnionToolGenScanCfg
def FPGATrackSimRoadUnionToolGenScanCfg(flags, name="FPGATrackSimRoadUnionToolGenScan")
Definition: FPGATrackSimAnalysisConfig.py:242
python.FPGATrackSimAnalysisConfig.getEtaBin
def getEtaBin(flags)
return a number 0-19, 0 is most central bin, 19 is most forward (based on absolute value of eta)
Definition: FPGATrackSimAnalysisConfig.py:15
python.FPGATrackSimAnalysisConfig.FPGATrackSimGNNEdgeClassifierToolCfg
def FPGATrackSimGNNEdgeClassifierToolCfg(flags, name="FPGATrackSimGNNEdgeClassifierTool")
Definition: FPGATrackSimAnalysisConfig.py:441
python.FPGATrackSimAnalysisConfig.getChi2Cut
def getChi2Cut(region)
Definition: FPGATrackSimAnalysisConfig.py:731
python.FPGATrackSimAnalysisConfig.FPGATrackSimSeedingCfg
def FPGATrackSimSeedingCfg(flags)
Definition: FPGATrackSimAnalysisConfig.py:810
python.FPGATrackSimAnalysisConfig.FPGATrackSimDataFlowToolCfg
def FPGATrackSimDataFlowToolCfg(flags, name="FPGATrackSimDataFlowTool")
Definition: FPGATrackSimAnalysisConfig.py:487
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:310
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
python.FPGATrackSimAnalysisConfig.prepareFlagsForFPGATrackSimLogicalHitsProcessAlg
def prepareFlagsForFPGATrackSimLogicalHitsProcessAlg(flags)
Definition: FPGATrackSimAnalysisConfig.py:582
python.FPGATrackSimAnalysisConfig.FPGATrackSimBankSvcCfg
def FPGATrackSimBankSvcCfg(flags, name="FPGATrackSimBankSvc")
Definition: FPGATrackSimAnalysisConfig.py:66
python.InDetPrepRawDataFormationConfig.ITkXAODToInDetClusterConversionCfg
def ITkXAODToInDetClusterConversionCfg(flags, name="ITkXAODToInDetClusterConversion", **kwargs)
Definition: InDetPrepRawDataFormationConfig.py:66
python.FPGATrackSimAnalysisConfig.FPGATrackSimRoadUnionToolCfg
def FPGATrackSimRoadUnionToolCfg(flags, name="FPGATrackSimRoadUnionTool")
Definition: FPGATrackSimAnalysisConfig.py:115
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:26
python.InDetPrepRawDataToxAODConfig.ITkActsPrepDataToxAODCfg
ComponentAccumulator ITkActsPrepDataToxAODCfg(flags, *str PixelClusterContainer="ITkPixelClusters", str StripClusterContainer="ITkStripClusters", str PixelMeasurementContainer="ITkPixelMeasurements", str StripMeasurementContainer="ITkStripMeasurements", list[str] TrackParticles=None)
Definition: InDetPrepRawDataToxAODConfig.py:46
python.FPGATrackSimAnalysisConfig.FPGATrackSimWriteOutputCfg
def FPGATrackSimWriteOutputCfg(flags)
Definition: FPGATrackSimAnalysisConfig.py:37
python.JetRecoSteering.addTruthPileupJetsToOutputCfg
def addTruthPileupJetsToOutputCfg(flags, toAOD=True, toESD=True)
Definition: JetRecoSteering.py:7
python.FPGATrackSimAnalysisConfig.WriteAdditionalFPGATrackSimOutputCfg
def WriteAdditionalFPGATrackSimOutputCfg(flags)
Definition: FPGATrackSimAnalysisConfig.py:845
python.OnnxRuntimeInferenceConfig.OnnxRuntimeInferenceToolCfg
def OnnxRuntimeInferenceToolCfg(flags, str model_fname=None, Optional[OnnxRuntimeType] execution_provider=None, name="OnnxRuntimeInferenceTool", **kwargs)
Definition: OnnxRuntimeInferenceConfig.py:9
python.FPGATrackSimAnalysisConfig.LRTRoadFinderCfg
def LRTRoadFinderCfg(flags, name="LRTRoadFinder")
Definition: FPGATrackSimAnalysisConfig.py:507
python.FPGATrackSimAnalysisConfig.FPGATrackSimRoadUnionToolGNNCfg
def FPGATrackSimRoadUnionToolGNNCfg(flags, name="FPGATrackSimRoadUnionToolGNN")
Definition: FPGATrackSimAnalysisConfig.py:393
python.FPGATrackSimAnalysisConfig.getNSubregions
def getNSubregions(filePath)
Definition: FPGATrackSimAnalysisConfig.py:28
python.TrackRecoConfig.InDetTrackRecoCfg
def InDetTrackRecoCfg(flags)
Main ID tracking config #####################.
Definition: TrackRecoConfig.py:804
python.FPGATrackSimAnalysisConfig.FPGATrackSimOverlapRemovalToolCfg
def FPGATrackSimOverlapRemovalToolCfg(flags, name="FPGATrackSimOverlapRemovalTool")
Definition: FPGATrackSimAnalysisConfig.py:558
Trk::open
@ open
Definition: BinningType.h:40
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
python.FPGATrackExtensionConfig.FPGATrackExtensionAlgCfg
def FPGATrackExtensionAlgCfg(flags, enableTrackStatePrinter=False, **kwargs)
Definition: FPGATrackExtensionConfig.py:6
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
ActsCIFlags.actsLegacyWorkflowFlags
None actsLegacyWorkflowFlags(flags)
Definition: ActsCIFlags.py:6
F150KernelTesterConfig.F150EDMConversionAlgCfg
def F150EDMConversionAlgCfg(flags, **kwarg)
Definition: F150KernelTesterConfig.py:55
python.FPGATrackSimAnalysisConfig.SPRoadFilterToolCfg
def SPRoadFilterToolCfg(flags, secondStage=False, name="FPGATrackSimSpacepointRoadFilterTool")
Definition: FPGATrackSimAnalysisConfig.py:586
FPGATrackSimPrototrackFitterConfig.FPGATruthDecorationCfg
def FPGATruthDecorationCfg(flags, FinalProtoTrackChainxAODTracksKey="xAODFPGAPrototracks", **kwargs)
Definition: FPGATrackSimPrototrackFitterConfig.py:58
str
Definition: BTagTrackIpAccessor.cxx:11
DataPrepConfig.FPGATrackSimReportingCfg
def FPGATrackSimReportingCfg(flags, name='FPGATrackSimReportingAlg', **kwargs)
Definition: DataPrepConfig.py:6
python.ITkActsHelpers.isFastPrimaryPass
bool isFastPrimaryPass(flags)
Definition: ITkActsHelpers.py:13
python.FPGATrackSimAnalysisConfig.FPGATrackSimGNNRoadMakerToolCfg
def FPGATrackSimGNNRoadMakerToolCfg(flags, name="FPGATrackSimGNNRoadMakerTool")
Definition: FPGATrackSimAnalysisConfig.py:459
python.FPGATrackSimAnalysisConfig.getChi2CutNN
def getChi2CutNN(region)
Definition: FPGATrackSimAnalysisConfig.py:752
python.PoolReadConfig.PoolReadCfg
def PoolReadCfg(flags)
Definition: PoolReadConfig.py:71
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
python.FPGATrackSimAnalysisConfig.FPGATrackSimGNNGraphConstructionToolCfg
def FPGATrackSimGNNGraphConstructionToolCfg(flags, name="FPGATrackSimGNNGraphConstructionTool")
Definition: FPGATrackSimAnalysisConfig.py:414
FPGATrackSimAlgorithmConfig.FPGATrackSimOverlapRemovalToolMonitoringCfg
def FPGATrackSimOverlapRemovalToolMonitoringCfg(flags)
Definition: FPGATrackSimAlgorithmConfig.py:332
python.FPGATrackSimAnalysisConfig.FPGATrackSimSlicingEngineCfg
def FPGATrackSimSlicingEngineCfg(flags, name="FPGATrackSimSlicingEngineTool")
Definition: FPGATrackSimAnalysisConfig.py:54