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 
75  #resolution padding
76  BinDesc.D0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["d0"]
77  BinDesc.EtaPad=getPadding(flags.Trigger.FPGATrackSim.region)["eta"]
78  BinDesc.QPtPad=getPadding(flags.Trigger.FPGATrackSim.region)["qpt"]
79  BinDesc.PhiPad=getPadding(flags.Trigger.FPGATrackSim.region)["phi"]
80  BinDesc.Z0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["z0"]
81  BinDesc.fieldCorrection=True
82  BinDesc.fieldCorRegion=flags.Trigger.FPGATrackSim.region
83 
84  # parameters for key layer bindesc are :"zR1", "zR2", "phiR1", "phiR2", "xm"
85  step1 = CompFactory.FPGATrackSimBinStep("PhiBinning")
86  step1.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
87  step1.parBins = [1,1,cutset["parBins"][2],cutset["parBins"][3],cutset["parBins"][4]]
88  step2 = CompFactory.FPGATrackSimBinStep("FullBinning")
89  step2.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
90  step2.parBins = cutset["parBins"]
91  binsteps = [step1,step2]
92  else:
93  log.fatal("Unknown Binning Setup: ",cutset["parSet"])
94 
95  BinTool.BinDesc = BinDesc
96  BinTool.Steps = binsteps
97 
98 
99  # configure the padding around the nominal region
100  BinTool.d0FractionalPadding =0.05
101  BinTool.z0FractionalPadding =0.05
102  BinTool.etaFractionalPadding =0.05
103  BinTool.phiFractionalPadding =0.05
104  BinTool.qOverPtFractionalPadding =0.05
105  BinTool.parMin = cutset["parMin"]
106  BinTool.parMax = cutset["parMax"]
107  BinnnedHits.BinTool = BinTool
108 
109  result.setPrivateTools(BinnnedHits)
110 
111  return result
112 
114  result=ComponentAccumulator()
115 
116  Monitor = CompFactory.FPGATrackSimLayerStudyTool("BinMonitoring")
117  Monitor.THistSvc = CompFactory.THistSvc()
118  Monitor.OutputLevel=flags.Trigger.FPGATrackSim.loglevel
119  Monitor.phiScale = 10.0
120  Monitor.etaScale = 100.0
121  Monitor.drScale = 20.0
122  Monitor.plotAllBins = False
123 
124  Monitor.D0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["d0"]
125  Monitor.EtaPad=getPadding(flags.Trigger.FPGATrackSim.region)["eta"]
126  Monitor.QPtPad=getPadding(flags.Trigger.FPGATrackSim.region)["qpt"]
127  Monitor.PhiPad=getPadding(flags.Trigger.FPGATrackSim.region)["phi"]
128  Monitor.Z0Pad=getPadding(flags.Trigger.FPGATrackSim.region)["z0"]
129 
130  result.setPrivateTools(Monitor)
131  return result
132 
134 
135  flags = FPGATrackSimAnalysisConfig.prepareFlagsForFPGATrackSimLogicalHitsProcessAlg(inputFlags)
136 
137  result=ComponentAccumulator()
138  if not flags.Trigger.FPGATrackSim.wrapperFileName:
139  from InDetConfig.InDetPrepRawDataFormationConfig import AthenaTrkClusterizationCfg
140  result.merge(AthenaTrkClusterizationCfg(flags))
141 
142  theFPGATrackSimLayerStudyAlg = CompFactory.FPGATrackSimLayerStudyAlg()
143 
144  theFPGATrackSimLayerStudyAlg.threshold = flags.Trigger.FPGATrackSim.ActiveConfig.threshold[0]
145  theFPGATrackSimLayerStudyAlg.stage = flags.Trigger.FPGATrackSim.layerStudyStage
146 
147  theFPGATrackSimLayerStudyAlg.eventSelector = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimEventSelectionSvcCfg(flags))
148  theFPGATrackSimLayerStudyAlg.FPGATrackSimMapping = result.getPrimaryAndMerge(FPGATrackSimDataPrepConfig.FPGATrackSimMappingCfg(flags))
149 
150  theFPGATrackSimLayerStudyAlg.BinningTool = result.getPrimaryAndMerge(FPGATrackSimBinnedHitsToolCfg(flags))
151  theFPGATrackSimLayerStudyAlg.BinMonitoringTool = result.getPrimaryAndMerge(FPGATrackSimLayerStudyToolCfg(flags))
152 
153  result.addEventAlgo(theFPGATrackSimLayerStudyAlg)
154 
155  return result
156 
157 if __name__ == "__main__":
158 
159  from AthenaConfiguration.AllConfigFlags import initConfigFlags
160  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
161 
162 
163  flags = initConfigFlags()
164 
165 
167  FinalProtoTrackChainxAODTracksKey="FPGA"
168  flags.Detector.EnableCalo = False
169 
170  # ensure that the xAOD SP and cluster containers are available
171  flags.Tracking.ITkMainPass.doAthenaToActsSpacePoint=True
172  flags.Tracking.ITkMainPass.doAthenaToActsCluster=True
173  from ActsConfig.ActsCIFlags import actsLegacyWorkflowFlags
175  flags.Acts.doRotCorrection = False
176 
177 
178  flags.Concurrency.NumThreads=1
179  #flags.Concurrency.NumProcs=0
180  flags.Scheduler.ShowDataDeps=True
181  flags.Scheduler.CheckDependencies=True
182  flags.Debug.DumpEvtStore=False
183 
184  # flags.Exec.DebugStage="exec" # useful option to debug the execution of the job - we want it commented out for production
185  flags.fillFromArgs()
187 
188 
189  if isinstance(flags.Trigger.FPGATrackSim.wrapperFileName, str):
190  log.info("wrapperFile is string, converting to list")
191  flags.Trigger.FPGATrackSim.wrapperFileName = [flags.Trigger.FPGATrackSim.wrapperFileName]
192  flags.Input.Files = lambda f: [f.Trigger.FPGATrackSim.wrapperFileName]
193 
194  from FPGATrackSimConfTools.FPGATrackSimAnalysisConfig import ConfigureMultiRegionFlags
196 
197  flags.lock()
198  flags.dump()
199  flags = flags.cloneAndReplace("Tracking.ActiveConfig","Tracking.MainPass")
200  acc=MainServicesCfg(flags)
201 
202 
203  if flags.Trigger.FPGATrackSim.writeAdditionalOutputData:
204  acc.addService(CompFactory.THistSvc(Output = ["EXPERT DATAFILE='monitoring.root', OPT='RECREATE'"]))
205 
206 
207  # Always produce the "genscan" layer study tree.
208  if (flags.Trigger.FPGATrackSim.Hough.genScan):
209  acc.addService(CompFactory.THistSvc(Output = ["GENSCAN DATAFILE='genscan.root', OPT='RECREATE'"]))
210 
211  if not flags.Trigger.FPGATrackSim.wrapperFileName:
212  from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
213  acc.merge(PoolReadCfg(flags))
214 
215  if flags.Input.isMC:
216  from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
217  acc.merge(GEN_AOD2xAODCfg(flags))
218 
219  from JetRecConfig.JetRecoSteering import addTruthPileupJetsToOutputCfg # TO DO: check if this is indeed necessary for pileup samples
220  acc.merge(addTruthPileupJetsToOutputCfg(flags))
221 
222  if flags.Detector.EnableCalo:
223  from CaloRec.CaloRecoConfig import CaloRecoCfg
224  acc.merge(CaloRecoCfg(flags))
225 
226  if flags.Tracking.recoChain:
227  from InDetConfig.TrackRecoConfig import InDetTrackRecoCfg
228  acc.merge(InDetTrackRecoCfg(flags))
229 
230  # Configure both the dataprep and logical hits algorithms.
231  acc.merge(FPGATrackSimDataPrepConfig.FPGATrackSimDataPrepAlgCfg(flags))
232  acc.merge(FPGATrackSimLayerStudyCfg(flags))
233 
234 
235  acc.store(open('AnalysisConfig.pkl','wb'))
236  acc.foreach_component("*FPGATrackSim*").OutputLevel=flags.Trigger.FPGATrackSim.loglevel
237  if flags.Trigger.FPGATrackSim.msgLimit!=-1:
238  acc.getService("MessageSvc").debugLimit = flags.Trigger.FPGATrackSim.msgLimit
239  acc.getService("MessageSvc").infoLimit = flags.Trigger.FPGATrackSim.msgLimit
240 
241  statusCode = acc.run(flags.Exec.MaxEvents)
242  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:20
python.FPGATrackSimAnalysisConfig.ConfigureMultiRegionFlags
def ConfigureMultiRegionFlags(flags)
Definition: FPGATrackSimAnalysisConfig.py:704
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:113
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.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
python.FPGATrackSimLayerStudyConfig.FPGATrackSimLayerStudyCfg
def FPGATrackSimLayerStudyCfg(inputFlags)
Definition: FPGATrackSimLayerStudyConfig.py:133