ATLAS Offline Software
FPGATrackSimLayerStudyConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 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 logging
5 
6 
7 import AthenaCommon.Utils.unixtools as unixtools
8 import importlib
9 import os
10 from FPGATrackSimConfTools.FPGATrackSimAnalysisConfig import ConfigureMultiRegionFlags
11 from FPGATrackSimConfTools.FPGATrackSimSecondStageConfig import getPadding
12 
13 log = logging.getLogger ('FPGATrackSim')
14 
15 
16 from FPGATrackSimConfTools import FPGATrackSimDataPrepConfig
17 from FPGATrackSimConfTools import FPGATrackSimAnalysisConfig
18 
20  # This can probably be imported in the future from the analysis config, but for now it's here.
21  result = ComponentAccumulator()
22  log.info("Setting binning parameters")
23 
24  # Allow the initial set of cuts to be read in via config flags, instead of the cuts file.
25  # This effectively eliminates the need to make a "step 0" cut file.
26  # If not set then default to loading the cuts file.
27  if flags.Trigger.FPGATrackSim.GenScan.initialLayerStudy:
28  cutset = {"rin": flags.Trigger.FPGATrackSim.GenScan.rin,
29  "rout": flags.Trigger.FPGATrackSim.GenScan.rout,
30  "parBins": flags.Trigger.FPGATrackSim.GenScan.parBins,
31  "parMin": flags.Trigger.FPGATrackSim.GenScan.parMin,
32  "parMax": flags.Trigger.FPGATrackSim.GenScan.parMax,
33  "parSet": flags.Trigger.FPGATrackSim.GenScan.parSet
34  }
35  log.info("Running initial layer study, taking FPGATrackSimBinning cuts from flags")
36  log.info(cutset)
37  elif flags.Trigger.FPGATrackSim.GenScan.layerStudyCutFile:
38  if flags.Trigger.FPGATrackSim.oldRegionDefs:
39  cutset = importlib.import_module(flags.Trigger.FPGATrackSim.GenScan.layerStudyCutFile).cuts[flags.Trigger.FPGATrackSim.region]
40  else:
41  # this allows the cut file defined in python to be loaded from the map directory
42  # Updated to use python path resolver. It seems like we have to manually pass in CALIBPATH.
43  relpath = os.path.join(flags.Trigger.FPGATrackSim.mapsDir, flags.Trigger.FPGATrackSim.GenScan.layerStudyCutFile + ".py")
44  abspath = unixtools.find_datafile(relpath, pathlist=os.getenv("CALIBPATH").split(":"))
45  spec=importlib.util.spec_from_file_location("FPGATrackSimGenScanCuts", abspath)
46  if spec is None:
47  log.fatal("Failed to load cuts file")
48  cutmodule = importlib.util.module_from_spec(spec)
49  spec.loader.exec_module(cutmodule)
50  cutset=cutmodule.cuts[flags.Trigger.FPGATrackSim.region]
51  log.info("Running layer study using configured cuts file")
52  log.info(cutset)
53  else:
54  log.fatal("Must either set initialLayerStudy=True or set layerStudyCutFile to the name of a cut file!")
55 
56  # make the binned hits class
57  BinnnedHits = CompFactory.FPGATrackSimBinnedHits("BinnedHits_LayerStudy")
58  BinnnedHits.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
59  BinnnedHits.FPGATrackSimEventSelectionSvc = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
60 
61  # make the bintool class
62  BinTool = CompFactory.FPGATrackSimBinTool("BinTool_LayerStudy")
63  BinTool.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
64 
65  # Inputs for the BinTool
66  binsteps=[]
67  BinDesc=None
68  if (cutset["parSet"]=="PhiSlicedKeyLyrPars"):
69  BinDesc = CompFactory.FPGATrackSimKeyLayerBinDesc("KeyLayerBinDescLayerStudy")
70  BinDesc.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
71  BinDesc.rin=cutset["rin"]
72  BinDesc.rout=cutset["rout"]
73  phirange = FPGATrackSimDataPrepConfig.getPhiRange(flags)
74  if flags.Trigger.FPGATrackSim.GenScan.useLayerRadiiFile:
75  phicenter = (phirange[0]+phirange[1])/2.0
76  BinDesc.PhiOffset = -1.0*phicenter
77 
78  BinDesc.region = flags.Trigger.FPGATrackSim.region
79 
80  # parameters for key layer bindesc are :"zR1", "zR2", "phiR1", "phiR2", "xm"
81  step1 = CompFactory.FPGATrackSimBinStep("PhiBinning")
82  step1.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
83  step1.parBins = [1,1,cutset["parBins"][2],cutset["parBins"][3],cutset["parBins"][4]]
84  step2 = CompFactory.FPGATrackSimBinStep("FullBinning")
85  step2.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
86  step2.parBins = cutset["parBins"]
87  binsteps = [step1,step2]
88  else:
89  log.fatal("Unknown Binning Setup: ",cutset["parSet"])
90 
91  BinTool.BinDesc = BinDesc
92  BinTool.Steps = binsteps
93 
94 
95  # configure the padding around the nominal region
96  BinTool.d0FractionalPadding =0.05
97  BinTool.z0FractionalPadding =0.05
98  BinTool.etaFractionalPadding =0.05
99  BinTool.phiFractionalPadding =0.05
100  BinTool.qOverPtFractionalPadding =0.05
101  BinTool.parMin = cutset["parMin"]
102  BinTool.parMax = cutset["parMax"]
103  BinnnedHits.BinTool = BinTool
104 
105  result.setPrivateTools(BinnnedHits)
106 
107  return result
108 
110  result=ComponentAccumulator()
111 
112  Monitor = CompFactory.FPGATrackSimLayerStudyTool("BinMonitoring")
113  Monitor.THistSvc = CompFactory.THistSvc()
114  Monitor.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
115  Monitor.phiScale = 10.0
116  Monitor.etaScale = 100.0
117  Monitor.drScale = 20.0
118  Monitor.plotAllBins = False
119 
120  Monitor.D0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["d0"]
121  Monitor.EtaPad=getPadding(flags.Trigger.FPGATrackSim.region)["eta"]
122  Monitor.QPtPad=getPadding(flags.Trigger.FPGATrackSim.region)["qpt"]
123  Monitor.PhiPad=getPadding(flags.Trigger.FPGATrackSim.region)["phi"]
124  Monitor.Z0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["z0"]
125 
126  result.setPrivateTools(Monitor)
127  return result
128 
130  from AthenaConfiguration.ComponentFactory import CompFactory
131  flags = FPGATrackSimAnalysisConfig.prepareFlagsForFPGATrackSimLogicalHitsProcessAlg(flags)
132  result = ComponentAccumulator()
133  if not flags.Trigger.FPGATrackSim.wrapperFileName:
134  from InDetConfig.InDetPrepRawDataFormationConfig import AthenaTrkClusterizationCfg
135  result.merge(AthenaTrkClusterizationCfg(flags))
136 
137  reg = flags.Trigger.FPGATrackSim.region
138 
139  monitor_tool = CompFactory.FPGATrackSimLayerStudyTool(
140  f"BinMonitoring_reg{reg}",
141  LayerStudyTreeName=FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags, "LayerStudy"),
142  TruthTreeName=FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags, "TruthTree"),
143  )
144 
145  theFPGATrackSimLayerStudyAlg = CompFactory.FPGATrackSimLayerStudyAlg(name=f"FPGATrackSimLayerStudyAlg_reg{reg}")
146 
147  theFPGATrackSimLayerStudyAlg.BinningTool = result.getPrimaryAndMerge(FPGATrackSimBinnedHitsToolCfg(flags))
148  theFPGATrackSimLayerStudyAlg.BinMonitoringTool = monitor_tool
149  theFPGATrackSimLayerStudyAlg.threshold = flags.Trigger.FPGATrackSim.ActiveConfig.threshold[0]
150  theFPGATrackSimLayerStudyAlg.stage = flags.Trigger.FPGATrackSim.layerStudyStage
151  theFPGATrackSimLayerStudyAlg.eventSelector = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
152  theFPGATrackSimLayerStudyAlg.FPGATrackSimMapping = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
153 
154  result.addEventAlgo(theFPGATrackSimLayerStudyAlg)
155  return result
156 
157 
158 if __name__ == "__main__":
159 
160  from AthenaConfiguration.AllConfigFlags import initConfigFlags
161  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
162 
163 
164  flags = initConfigFlags()
165 
166 
168  FinalProtoTrackChainxAODTracksKey="FPGA"
169  flags.Detector.EnableCalo = False
170 
171  # ensure that the xAOD SP and cluster containers are available
172  flags.Tracking.ITkMainPass.doAthenaToActsSpacePoint=True
173  flags.Tracking.ITkMainPass.doAthenaToActsCluster=True
174  from ActsConfig.ActsCIFlags import actsLegacyWorkflowFlags
176  flags.Acts.doRotCorrection = False
177 
178 
179  flags.Concurrency.NumThreads=1
180  #flags.Concurrency.NumProcs=0
181  flags.Scheduler.ShowDataDeps=True
182  flags.Scheduler.CheckDependencies=True
183  flags.Debug.DumpEvtStore=False
184 
185  # flags.Exec.DebugStage="exec" # useful option to debug the execution of the job - we want it commented out for production
186  flags.fillFromArgs()
188 
189 
190  if isinstance(flags.Trigger.FPGATrackSim.wrapperFileName, str):
191  log.info("wrapperFile is string, converting to list")
192  flags.Trigger.FPGATrackSim.wrapperFileName = [flags.Trigger.FPGATrackSim.wrapperFileName]
193  flags.Input.Files = lambda f: [f.Trigger.FPGATrackSim.wrapperFileName]
194 
195  from FPGATrackSimConfTools.FPGATrackSimAnalysisConfig import ConfigureMultiRegionFlags
197 
198  # The region map needs to not be loaded when running layer study; we set this here to
199  # guarantee it propagates consistently to all code that tries to set up the mapping service.
200  flags.Trigger.FPGATrackSim.loadRegionMap = False
201  flags.Trigger.FPGATrackSim.loadRadii = False
202 
203  # We also don't want to load any of the ONNX files, so set them to the empty string.
204  # Again, override the user.
205  flags.Trigger.FPGATrackSim.FakeNNonnxFile1st = ""
206  flags.Trigger.FPGATrackSim.FakeNNonnxFile2nd = ""
207  flags.Trigger.FPGATrackSim.ParamNNonnxFile1st = ""
208  flags.Trigger.FPGATrackSim.ParamNNonnxFile2nd = ""
209  flags.Trigger.FPGATrackSim.ExtensionNNVolonnxFile = ""
210  flags.Trigger.FPGATrackSim.ExtensionNNHitonnxFile = ""
211 
212  flags.lock()
213  flags.dump()
214  flags = flags.cloneAndReplace("Tracking.ActiveConfig","Tracking.MainPass")
215  acc=MainServicesCfg(flags)
216 
217 
218  if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
219  acc.addService(CompFactory.THistSvc(Output = ["EXPERT DATAFILE='monitoring.root', OPT='RECREATE'"]))
220 
221 
222  # Always produce the "genscan" layer study tree.
223  if (flags.Trigger.FPGATrackSim.Hough.genScan):
224  acc.addService(CompFactory.THistSvc(Output = ["GENSCAN DATAFILE='genscan.root', OPT='RECREATE'"]))
225 
226  if not flags.Trigger.FPGATrackSim.wrapperFileName:
227  from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
228  acc.merge(PoolReadCfg(flags))
229 
230  if flags.Input.isMC:
231  from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
232  acc.merge(GEN_AOD2xAODCfg(flags))
233 
234  from JetRecConfig.JetRecoSteering import addTruthPileupJetsToOutputCfg # TO DO: check if this is indeed necessary for pileup samples
235  acc.merge(addTruthPileupJetsToOutputCfg(flags))
236 
237  if flags.Detector.EnableCalo:
238  from CaloRec.CaloRecoConfig import CaloRecoCfg
239  acc.merge(CaloRecoCfg(flags))
240 
241  if flags.Tracking.recoChain:
242  from InDetConfig.TrackRecoConfig import InDetTrackRecoCfg
243  acc.merge(InDetTrackRecoCfg(flags))
244 
245  #Configure Multiregion config algo for layerstudyalg
246  from FPGATrackSimConfTools.FPGATrackSimMultiRegionConfig import FPGATrackSimRunLayerStudyOnManyRegions
248 
249  # Configure dataprep as well; layerstudy is already configured above
250  acc.merge(FPGATrackSimDataPrepConfig.FPGATrackSimDataPrepAlgCfg(flags))
251 
252  acc.store(open('AnalysisConfig.pkl','wb'))
253  acc.foreach_component("*FPGATrackSim*").OutputLevel=flags.Trigger.FPGATrackSim.loglevel
254  if flags.Trigger.FPGATrackSim.msgLimit!=-1:
255  acc.getService("MessageSvc").debugLimit = flags.Trigger.FPGATrackSim.msgLimit
256  acc.getService("MessageSvc").infoLimit = flags.Trigger.FPGATrackSim.msgLimit
257 
258  statusCode = acc.run(flags.Exec.MaxEvents)
259  assert statusCode.isSuccess() is True, "Application execution did not succeed"
python.CaloRecoConfig.CaloRecoCfg
def CaloRecoCfg(flags, clustersname=None)
Definition: CaloRecoConfig.py:9
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
xAODTruthCnvConfig.GEN_AOD2xAODCfg
def GEN_AOD2xAODCfg(flags, name="GEN_AOD2xAOD", **kwargs)
Definition: xAODTruthCnvConfig.py:22
python.FPGATrackSimAnalysisConfig.ConfigureMultiRegionFlags
def ConfigureMultiRegionFlags(flags)
Definition: FPGATrackSimAnalysisConfig.py:779
python.FPGATrackSimLayerStudyConfig.FPGATrackSimLayerStudyCfg
def FPGATrackSimLayerStudyCfg(flags)
Definition: FPGATrackSimLayerStudyConfig.py:129
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:310
python.FPGATrackSimSecondStageConfig.getPadding
def getPadding(region)
Definition: FPGATrackSimSecondStageConfig.py:212
python.FPGATrackSimLayerStudyConfig.FPGATrackSimLayerStudyToolCfg
def FPGATrackSimLayerStudyToolCfg(flags)
Definition: FPGATrackSimLayerStudyConfig.py:109
python.FPGATrackSimLayerStudyConfig.FPGATrackSimBinnedHitsToolCfg
def FPGATrackSimBinnedHitsToolCfg(flags)
Definition: FPGATrackSimLayerStudyConfig.py:19
python.JetRecoSteering.addTruthPileupJetsToOutputCfg
def addTruthPileupJetsToOutputCfg(flags, toAOD=True, toESD=True)
Definition: JetRecoSteering.py:7
python.TrackRecoConfig.InDetTrackRecoCfg
def InDetTrackRecoCfg(flags)
Main ID tracking config #####################.
Definition: TrackRecoConfig.py:804
Trk::open
@ open
Definition: BinningType.h:40
python.InDetPrepRawDataFormationConfig.AthenaTrkClusterizationCfg
def AthenaTrkClusterizationCfg(flags)
Definition: InDetPrepRawDataFormationConfig.py:357
python.FPGATrackSimMultiRegionConfig.FPGATrackSimRunLayerStudyOnManyRegions
def FPGATrackSimRunLayerStudyOnManyRegions(flags)
Definition: FPGATrackSimMultiRegionConfig.py:53
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
ActsCIFlags.actsLegacyWorkflowFlags
None actsLegacyWorkflowFlags(flags)
Definition: ActsCIFlags.py:7
python.PoolReadConfig.PoolReadCfg
def PoolReadCfg(flags)
Definition: PoolReadConfig.py:71
Trk::split
@ split
Definition: LayerMaterialProperties.h:38