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 
74  BinDesc.region = flags.Trigger.FPGATrackSim.region
75 
76  #resolution padding
77  BinDesc.D0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["d0"]
78  BinDesc.EtaPad=getPadding(flags.Trigger.FPGATrackSim.region)["eta"]
79  BinDesc.QPtPad=getPadding(flags.Trigger.FPGATrackSim.region)["qpt"]
80  BinDesc.PhiPad=getPadding(flags.Trigger.FPGATrackSim.region)["phi"]
81  BinDesc.Z0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["z0"]
82  BinDesc.fieldCorrection=True
83  BinDesc.fieldCorRegion=flags.Trigger.FPGATrackSim.region
84 
85  # parameters for key layer bindesc are :"zR1", "zR2", "phiR1", "phiR2", "xm"
86  step1 = CompFactory.FPGATrackSimBinStep("PhiBinning")
87  step1.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
88  step1.parBins = [1,1,cutset["parBins"][2],cutset["parBins"][3],cutset["parBins"][4]]
89  step2 = CompFactory.FPGATrackSimBinStep("FullBinning")
90  step2.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
91  step2.parBins = cutset["parBins"]
92  binsteps = [step1,step2]
93  else:
94  log.fatal("Unknown Binning Setup: ",cutset["parSet"])
95 
96  BinTool.BinDesc = BinDesc
97  BinTool.Steps = binsteps
98 
99 
100  # configure the padding around the nominal region
101  BinTool.d0FractionalPadding =0.05
102  BinTool.z0FractionalPadding =0.05
103  BinTool.etaFractionalPadding =0.05
104  BinTool.phiFractionalPadding =0.05
105  BinTool.qOverPtFractionalPadding =0.05
106  BinTool.parMin = cutset["parMin"]
107  BinTool.parMax = cutset["parMax"]
108  BinnnedHits.BinTool = BinTool
109 
110  result.setPrivateTools(BinnnedHits)
111 
112  return result
113 
115  result=ComponentAccumulator()
116 
117  Monitor = CompFactory.FPGATrackSimLayerStudyTool("BinMonitoring")
118  Monitor.THistSvc = CompFactory.THistSvc()
119  Monitor.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
120  Monitor.phiScale = 10.0
121  Monitor.etaScale = 100.0
122  Monitor.drScale = 20.0
123  Monitor.plotAllBins = False
124 
125  Monitor.D0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["d0"]
126  Monitor.EtaPad=getPadding(flags.Trigger.FPGATrackSim.region)["eta"]
127  Monitor.QPtPad=getPadding(flags.Trigger.FPGATrackSim.region)["qpt"]
128  Monitor.PhiPad=getPadding(flags.Trigger.FPGATrackSim.region)["phi"]
129  Monitor.Z0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["z0"]
130 
131  result.setPrivateTools(Monitor)
132  return result
133 
135  from AthenaConfiguration.ComponentFactory import CompFactory
136  flags = FPGATrackSimAnalysisConfig.prepareFlagsForFPGATrackSimLogicalHitsProcessAlg(flags)
137  result = ComponentAccumulator()
138  if not flags.Trigger.FPGATrackSim.wrapperFileName:
139  from InDetConfig.InDetPrepRawDataFormationConfig import AthenaTrkClusterizationCfg
140  result.merge(AthenaTrkClusterizationCfg(flags))
141 
142  reg = flags.Trigger.FPGATrackSim.region
143 
144  monitor_tool = CompFactory.FPGATrackSimLayerStudyTool(
145  f"BinMonitoring_reg{reg}",
146  LayerStudyTreeName=FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags, "LayerStudy"),
147  TruthTreeName=FPGATrackSimDataPrepConfig.nameWithRegionSuffix(flags, "TruthTree"),
148  )
149 
150  theFPGATrackSimLayerStudyAlg = CompFactory.FPGATrackSimLayerStudyAlg(name=f"FPGATrackSimLayerStudyAlg_reg{reg}")
151 
152  theFPGATrackSimLayerStudyAlg.BinningTool = result.getPrimaryAndMerge(FPGATrackSimBinnedHitsToolCfg(flags))
153  theFPGATrackSimLayerStudyAlg.BinMonitoringTool = monitor_tool
154  theFPGATrackSimLayerStudyAlg.threshold = flags.Trigger.FPGATrackSim.ActiveConfig.threshold[0]
155  theFPGATrackSimLayerStudyAlg.stage = flags.Trigger.FPGATrackSim.layerStudyStage
156  theFPGATrackSimLayerStudyAlg.eventSelector = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
157  theFPGATrackSimLayerStudyAlg.FPGATrackSimMapping = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
158 
159  result.addEventAlgo(theFPGATrackSimLayerStudyAlg)
160  return result
161 
162 
163 if __name__ == "__main__":
164 
165  from AthenaConfiguration.AllConfigFlags import initConfigFlags
166  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
167 
168 
169  flags = initConfigFlags()
170 
171 
173  FinalProtoTrackChainxAODTracksKey="FPGA"
174  flags.Detector.EnableCalo = False
175 
176  # ensure that the xAOD SP and cluster containers are available
177  flags.Tracking.ITkMainPass.doAthenaToActsSpacePoint=True
178  flags.Tracking.ITkMainPass.doAthenaToActsCluster=True
179  from ActsConfig.ActsCIFlags import actsLegacyWorkflowFlags
181  flags.Acts.doRotCorrection = False
182 
183 
184  flags.Concurrency.NumThreads=1
185  #flags.Concurrency.NumProcs=0
186  flags.Scheduler.ShowDataDeps=True
187  flags.Scheduler.CheckDependencies=True
188  flags.Debug.DumpEvtStore=False
189 
190  # flags.Exec.DebugStage="exec" # useful option to debug the execution of the job - we want it commented out for production
191  flags.fillFromArgs()
193 
194 
195  if isinstance(flags.Trigger.FPGATrackSim.wrapperFileName, str):
196  log.info("wrapperFile is string, converting to list")
197  flags.Trigger.FPGATrackSim.wrapperFileName = [flags.Trigger.FPGATrackSim.wrapperFileName]
198  flags.Input.Files = lambda f: [f.Trigger.FPGATrackSim.wrapperFileName]
199 
200  from FPGATrackSimConfTools.FPGATrackSimAnalysisConfig import ConfigureMultiRegionFlags
202 
203  # The region map needs to not be loaded when running layer study; we set this here to
204  # guarantee it propagates consistently to all code that tries to set up the mapping service.
205  flags.Trigger.FPGATrackSim.loadRegionMap = False
206  flags.Trigger.FPGATrackSim.loadRadii = False
207 
208  # We also don't want to load any of the ONNX files, so set them to the empty string.
209  # Again, override the user.
210  flags.Trigger.FPGATrackSim.FakeNNonnxFile1st = ""
211  flags.Trigger.FPGATrackSim.FakeNNonnxFile2nd = ""
212  flags.Trigger.FPGATrackSim.ParamNNonnxFile1st = ""
213  flags.Trigger.FPGATrackSim.ParamNNonnxFile2nd = ""
214  flags.Trigger.FPGATrackSim.ExtensionNNVolonnxFile = ""
215  flags.Trigger.FPGATrackSim.ExtensionNNHitonnxFile = ""
216 
217  flags.lock()
218  flags.dump()
219  flags = flags.cloneAndReplace("Tracking.ActiveConfig","Tracking.MainPass")
220  acc=MainServicesCfg(flags)
221 
222 
223  if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
224  acc.addService(CompFactory.THistSvc(Output = ["EXPERT DATAFILE='monitoring.root', OPT='RECREATE'"]))
225 
226 
227  # Always produce the "genscan" layer study tree.
228  if (flags.Trigger.FPGATrackSim.Hough.genScan):
229  acc.addService(CompFactory.THistSvc(Output = ["GENSCAN DATAFILE='genscan.root', OPT='RECREATE'"]))
230 
231  if not flags.Trigger.FPGATrackSim.wrapperFileName:
232  from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
233  acc.merge(PoolReadCfg(flags))
234 
235  if flags.Input.isMC:
236  from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
237  acc.merge(GEN_AOD2xAODCfg(flags))
238 
239  from JetRecConfig.JetRecoSteering import addTruthPileupJetsToOutputCfg # TO DO: check if this is indeed necessary for pileup samples
240  acc.merge(addTruthPileupJetsToOutputCfg(flags))
241 
242  if flags.Detector.EnableCalo:
243  from CaloRec.CaloRecoConfig import CaloRecoCfg
244  acc.merge(CaloRecoCfg(flags))
245 
246  if flags.Tracking.recoChain:
247  from InDetConfig.TrackRecoConfig import InDetTrackRecoCfg
248  acc.merge(InDetTrackRecoCfg(flags))
249 
250  #Configure Multiregion config algo for layerstudyalg
251  from FPGATrackSimConfTools.FPGATrackSimMultiRegionConfig import FPGATrackSimRunLayerStudyOnManyRegions
253 
254  # Configure dataprep as well; layerstudy is already configured above
255  acc.merge(FPGATrackSimDataPrepConfig.FPGATrackSimDataPrepAlgCfg(flags))
256 
257  acc.store(open('AnalysisConfig.pkl','wb'))
258  acc.foreach_component("*FPGATrackSim*").OutputLevel=flags.Trigger.FPGATrackSim.loglevel
259  if flags.Trigger.FPGATrackSim.msgLimit!=-1:
260  acc.getService("MessageSvc").debugLimit = flags.Trigger.FPGATrackSim.msgLimit
261  acc.getService("MessageSvc").infoLimit = flags.Trigger.FPGATrackSim.msgLimit
262 
263  statusCode = acc.run(flags.Exec.MaxEvents)
264  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:722
python.FPGATrackSimLayerStudyConfig.FPGATrackSimLayerStudyCfg
def FPGATrackSimLayerStudyCfg(flags)
Definition: FPGATrackSimLayerStudyConfig.py:134
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:312
python.FPGATrackSimSecondStageConfig.getPadding
def getPadding(region)
Definition: FPGATrackSimSecondStageConfig.py:212
python.FPGATrackSimLayerStudyConfig.FPGATrackSimLayerStudyToolCfg
def FPGATrackSimLayerStudyToolCfg(flags)
Definition: FPGATrackSimLayerStudyConfig.py:114
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:338
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:6
python.PoolReadConfig.PoolReadCfg
def PoolReadCfg(flags)
Definition: PoolReadConfig.py:71
Trk::split
@ split
Definition: LayerMaterialProperties.h:38