ATLAS Offline Software
DumpGeoConfig.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 #----------------------------------------------------------------
4 # Author: Riccardo Maria BIANCHI <riccardo.maria.bianchi@cern.ch>
5 # Initial version: Feb 2024
6 #----------------------------------------------------------------
7 
8 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
9 from AthenaConfiguration.ComponentFactory import CompFactory
10 #from AthenaConfiguration.Enums import Format
11 
12 
13 def configureGeometry(flags, cfg):
14 
15  # Beam pipe
16  if flags.Detector.GeometryBpipe:
17  from BeamPipeGeoModel.BeamPipeGMConfig import BeamPipeGeometryCfg
18  cfg.merge(BeamPipeGeometryCfg(flags))
19 
20  # Inner Detectors
21  if flags.Detector.GeometryPixel:
22  from PixelGeoModel.PixelGeoModelConfig import PixelReadoutGeometryCfg
23  cfg.merge(PixelReadoutGeometryCfg(flags))
24  # TODO: do we need to set this separately?
25  # if flags.Detector.GeometryBCM:
26 
27  if flags.Detector.GeometrySCT:
28  from SCT_GeoModel.SCT_GeoModelConfig import SCT_ReadoutGeometryCfg
29  cfg.merge(SCT_ReadoutGeometryCfg(flags))
30 
31  if flags.Detector.GeometryTRT:
32  from TRT_GeoModel.TRT_GeoModelConfig import TRT_ReadoutGeometryCfg
33  cfg.merge(TRT_ReadoutGeometryCfg(flags))
34 
35  # InDetServMat
36  # Trigger the build of the InDetServMat geometry
37  # if any ID subsystems have been enabled
38  if flags.Detector.GeometryID:
39  from InDetServMatGeoModel.InDetServMatGeoModelConfig import (
40  InDetServiceMaterialCfg)
41  cfg.merge(InDetServiceMaterialCfg(flags))
42 
43  # Calorimeters
44  if flags.Detector.GeometryLAr:
45  from LArGeoAlgsNV.LArGMConfig import LArGMCfg
46  cfg.merge(LArGMCfg(flags))
47 
48  if flags.Detector.GeometryTile:
49  from TileGeoModel.TileGMConfig import TileGMCfg
50  cfg.merge(TileGMCfg(flags))
51  # TODO: do we need to set this separately?
52  # if flags.Detector.GeometryMBTS:
53 
54  # Muon spectrometer
55  if flags.Detector.GeometryMuon:
56  from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
57  cfg.merge(MuonGeoModelCfg(flags))
58 
59  # HGTD (defined only for Run4 geometry tags)
60  if flags.Detector.GeometryHGTD:
61  #set up geometry
62  if flags.HGTD.Geometry.useGeoModelXml:
63  from HGTD_GeoModelXml.HGTD_GeoModelConfig import HGTD_SimulationGeometryCfg
64  else:
65  from HGTD_GeoModel.HGTD_GeoModelConfig import HGTD_SimulationGeometryCfg
66  cfg.merge(HGTD_SimulationGeometryCfg(flags))
67 
68  # ITk (defined only for Run4 geometry tags)
69  if flags.Detector.GeometryITkPixel:
70  from PixelGeoModelXml.ITkPixelGeoModelConfig import ITkPixelReadoutGeometryCfg
71  cfg.merge(ITkPixelReadoutGeometryCfg(flags))
72  if flags.Detector.GeometryITkStrip:
73  from StripGeoModelXml.ITkStripGeoModelConfig import ITkStripReadoutGeometryCfg
74  cfg.merge(ITkStripReadoutGeometryCfg(flags))
75  # TODO: do we need to set those separately?
76  # if flags.Detector.GeometryBCMPrime:
77  # if flags.Detector.GeometryPLR:
78 
79  # Cavern (disabled by default)
80  if flags.Detector.GeometryCavern:
81  from AtlasGeoModel.CavernGMConfig import CavernGeometryCfg
82  cfg.merge(CavernGeometryCfg(flags))
83 
84  # Forward detectors (disabled by default)
85  if flags.Detector.GeometryLucid or flags.Detector.GeometryALFA or flags.Detector.GeometryAFP or flags.Detector.GeometryFwdRegion :
86  from AtlasGeoModel.ForDetGeoModelConfig import ForDetGeometryCfg
87  cfg.merge(ForDetGeometryCfg(flags))
88  if flags.Detector.GeometryZDC:
89  from ZDC_GeoM.ZdcGeoModelConfig import ZDC_DetToolCfg
90  cfg.merge(ZDC_DetToolCfg(flags))
91 
92 
93 
94 
96  import os
97 
98  if "AtlasVersion" in os.environ:
99  return os.environ["AtlasVersion"]
100  if "AtlasBaseVersion" in os.environ:
101  return os.environ["AtlasBaseVersion"]
102  return "Unknown"
103 
104 def DumpGeoCfg(flags, name="DumpGeoCA", outFileName="", **kwargs):
105  # This is based on a few old-style configuation files:
106  # JiveXML_RecEx_config.py
107  # JiveXML_jobOptionBase.py
108  result = ComponentAccumulator()
109 
110  #print(dir("args: ", args)) # debug
111 
112 
113  # set diitional Alg's properties
114  # Note: at this point, the user-defined Geo TAG args.detDescr,
115  # if set, has already replaced the default GeoModel.AtlasVersion in 'flags';
116  # so, we can use the latter, directy.
117  _logger.verbose("Using ATLAS/Athena version: %s", getATLASVersion())
118  _logger.verbose("Using GeoModel ATLAS version: %s", flags.GeoModel.AtlasVersion)
119  kwargs.setdefault("AtlasRelease", getATLASVersion())
120  kwargs.setdefault("AtlasVersion", flags.GeoModel.AtlasVersion)
121  kwargs.setdefault("OutSQLiteFileName", outFileName)
122  if args.filterDetManagers:
123  kwargs.setdefault("UserFilterDetManager", args.filterDetManagers.split(","))
124 
125 
126  the_alg = CompFactory.DumpGeo(name="DumpGeoAlg", **kwargs)
127  result.addEventAlgo(the_alg, primary=True)
128  return result
129 
130 
131 if __name__=="__main__":
132  import os, sys
133  # Run with e.g. python -m DumpGeo.DumpGeoConfig --detDescr=<ATLAS-geometry-tag> --filter=[<list of tree tops>]
134 
135  # from AthenaConfiguration.Enums import Format
136  from AthenaCommon.Logging import logging
137  from AthenaCommon.Constants import VERBOSE
138 
139  from AthenaConfiguration.TestDefaults import defaultGeometryTags
140 
141  # ++++ Firstly we setup flags ++++
142  _logger = logging.getLogger('DumpGeo')
143  _logger.setLevel(VERBOSE)
144 
145  from AthenaConfiguration.AllConfigFlags import initConfigFlags
146  flags = initConfigFlags()
147  flags.Exec.MaxEvents = 0
148  # ^ We do not need any events to get the GeoModel tree from the GeoModelSvc.
149  # So, we don't need to run on any events,
150  # and we don't need to trigger any execute() Athena methods either.
151  # So, we set 'EvtMax' to 0 and Athena will skip the 'execute' phase;
152  # only the 'finalize' step will be run after the 'init'.
153  # -- Note:
154  # Also, if we run on events (even on 1 event) and we dump the Pixel
155  # as part of the DetectorManager filter, then we get a crash because
156  # the PixelDetectorManager complains during the 'execute' phase,
157  # because we 'stole' a handle on its TreeTop,
158  # which contains a FullPhysVol and cannot be shared.
159  flags.Concurrency.NumThreads = 0
160  # ^ VP1 will not work with the scheduler, since its condition/data dependencies are not known in advance
161  # More in details: the scheduler needs to know BEFORE the event, what the dependencies of each Alg are.
162  # So for VP1, no dependencies are declared, which means the conditions data is not there.
163  # So when I load tracks, the geometry is missing and it crashes.
164  # Turning off the scheduler (with NumThreads=0) fixes this.
165 
166  parser = flags.getArgumentParser()
167  parser.prog = 'dump-geo'
168  # here we extend the parser with CLI options specific to DumpGeo
169  parser.add_argument("--detDescr", default=defaultGeometryTags.RUN3,
170  help="The ATLAS geometry tag you want to dump (a convenience alias for the Athena flag 'GeoModel.AtlasVersion=TAG')", metavar="TAG")
171  # parser.add_argument("--filterTreeTops", help="Only output the GeoModel Tree Tops specified in the FILTER list; input is a comma-separated list")
172  parser.add_argument("--filterDetManagers", help="Only output the GeoModel Detector Managers specified in the FILTER list; input is a comma-separated list")
173  parser.add_argument("-f", "--forceOverwrite",
174  help="Force to overwrite an existing SQLite output file with the same name, if any", action = 'store_true')
175 
176  args = flags.fillFromArgs(parser=parser)
177 
178  if args.help:
179  # No point doing more here, since we just want to print the help.
180  sys.exit()
181 
182  _logger.verbose("+ About to set flags related to the input")
183 
184  # Empty input is not normal for Athena, so we will need to check
185  # this repeatedly below (the same as with VP1)
186  dumpgeo_empty_input = False
187  # This covers the use case where we launch DumpGeo
188  # without input files; e.g., to check the detector description
189  if (flags.Input.Files == [] or
190  flags.Input.Files == ['_ATHENA_GENERIC_INPUTFILE_NAME_']):
191  from Campaigns.Utils import Campaign
192  from AthenaConfiguration.TestDefaults import defaultGeometryTags
193 
194  dumpgeo_empty_input = True
195  # NB Must set e.g. ConfigFlags.Input.Runparse_args() Number and
196  # ConfigFlags.Input.TimeStamp before calling the
197  # MainServicesCfg to avoid it attempting auto-configuration
198  # from an input file, which is empty in this use case.
199  # If you don't have it, it (and/or other Cfg routines) complains and crashes.
200  # See also:
201  # https://acode-browser1.usatlas.bnl.gov/lxr/source/athena/InnerDetector/InDetConditions/SCT_ConditionsAlgorithms/python/SCT_DCSConditionsTestAlgConfig.py#0023
202  flags.Input.ProjectName = "mc20_13TeV"
203  flags.Input.RunNumbers = [330000]
204  flags.Input.TimeStamps = [1]
205  flags.Input.TypedCollections = []
206 
207  # set default CondDB and Geometry version
208  flags.IOVDb.GlobalTag = "OFLCOND-MC23-SDR-RUN3-02"
209  flags.Input.isMC = True
210  flags.Input.MCCampaign = Campaign.Unknown
211  flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
212  _logger.verbose("+ ... Done")
213  _logger.verbose("+ empty input: '%s'" % dumpgeo_empty_input)
214 
215  _logger.verbose("+ detDescr flag: '%s'" % args.detDescr)
216 
217 
218  _logger.verbose("+ About to set the detector flags")
219  # So we can now set up the geometry flags from the input
220  from AthenaConfiguration.DetectorConfigFlags import setupDetectorFlags
221  setupDetectorFlags(flags, None, use_metadata=not dumpgeo_empty_input,
222  toggle_geometry=True, keep_beampipe=True)
223  _logger.verbose("+ ... Done")
224 
225  if args.detDescr:
226  _logger.verbose("+ About to set this detector description tag: '%s'" % args.detDescr)
227  flags.GeoModel.AtlasVersion = args.detDescr
228  _logger.verbose("+ ... Done")
229 
230 
231  # finalize setting flags: lock them.
232  flags.lock()
233 
234 
235 
236  # Handle the user's inputs and create a file name
237  # for the output SQLite, accordingly
238  outFileName = "geometry"
239  filterDetManagers = []
240  # - Put Geometry TAG into the file name
241  # NOTE: at this point, the user-defined Geo TAG args.detDescr,
242  # if set, has already replaced the default TAG in 'flags';
243  # so, we can use the latter, directy.
244  geoTAG = flags.GeoModel.AtlasVersion
245  print("+ DumpGeo -- INFO -- This is the Detector Description geometry TAG you are dumping: '%s'" % geoTAG)
246  outFileName = outFileName + "-" + geoTAG
247  # - Put DetectorManagers' names into the file name,
248  # if the filter has been used by the user
249  if args.filterDetManagers:
250  print("+ DumpGeo -- NOTE -- Your 'GeoModel Detector Manager' filter set: '%s'" % args.filterDetManagers)
251  filterDetManagers = args.filterDetManagers.split(",")
252  outFileName = outFileName + "-" + "-".join(filterDetManagers)
253  # - Add the final extension to the name of the output SQLite file
254  outFileName = outFileName + ".db"
255 
256  # Overwrite the output SQLite file, if existing
257  if os.path.exists(outFileName):
258  if args.forceOverwrite is True:
259  print("+ DumpGeo -- NOTE -- You chose to overwrite an existing geometry dump file with the same name, if present.")
260  # os.environ["DUMPGEOFORCEOVERWRITE"] = "1" # save to an env var, for later use in GeoModelStandalone/GeoExporter
261  # Check if the file exists before attempting to delete it
262  if os.path.exists(outFileName):
263  os.remove(outFileName)
264  print(f"The file {outFileName} has been deleted.")
265  else:
266  print(f"The file {outFileName} does not exist. So, it was not needed to 'force-delete' it. Continuing...")
267  else:
268  print(f"\nDumpGeo -- ERROR! The ouput file '{outFileName}' exists already!\nPlease move or remove it, or use the 'force' option: '-f' or '--forceOverWrite'.\n\n")
269  sys.exit()
270  #raise ValueError("The output file exists already!")
271 
272 
273  # DEBUG -- inspect the flags
274  # flags.dump()
275  # flags._loadDynaFlags('GeoModel')
276  # flags._loadDynaFlags('Detector')
277  # flags.dump('Detector.(Geometry|Enable)', True)
278 
279  # ++++ Now we setup the actual configuration ++++
280  _logger.verbose("+ Setup main services")
281  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
282  cfg = MainServicesCfg(flags)
283  _logger.verbose("+ ...Done")
284 
285  _logger.verbose("+ About to setup geometry")
286  configureGeometry(flags,cfg)
287  _logger.verbose("+ ...Done")
288 
289  # configure DumpGeo
290  cfg.merge(DumpGeoCfg(flags, args, outFileName=outFileName))
291  cfg.run()
292 
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
BeamPipeGMConfig.BeamPipeGeometryCfg
def BeamPipeGeometryCfg(flags)
Definition: BeamPipeGMConfig.py:5
TRT_GeoModelConfig.TRT_ReadoutGeometryCfg
def TRT_ReadoutGeometryCfg(flags)
Definition: TRT_GeoModelConfig.py:55
python.InDetServMatGeoModelConfig.InDetServiceMaterialCfg
def InDetServiceMaterialCfg(flags)
Definition: InDetServMatGeoModelConfig.py:8
python.ForDetGeoModelConfig.ForDetGeometryCfg
def ForDetGeometryCfg(flags)
Definition: ForDetGeoModelConfig.py:33
DumpGeoConfig.configureGeometry
def configureGeometry(flags, cfg)
Definition: DumpGeoConfig.py:13
ZdcGeoModelConfig.ZDC_DetToolCfg
def ZDC_DetToolCfg(flags)
Definition: ZdcGeoModelConfig.py:4
SCT_GeoModelConfig.SCT_ReadoutGeometryCfg
def SCT_ReadoutGeometryCfg(flags)
Definition: SCT_GeoModelConfig.py:42
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:256
Constants
some useful constants -------------------------------------------------—
LArGMConfig.LArGMCfg
def LArGMCfg(flags)
Definition: LArGMConfig.py:8
PixelGeoModelConfig.PixelReadoutGeometryCfg
def PixelReadoutGeometryCfg(flags)
Definition: PixelGeoModelConfig.py:42
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
python.DetectorConfigFlags.setupDetectorFlags
def setupDetectorFlags(flags, custom_list=None, use_metadata=False, toggle_geometry=False, validate_only=False, keep_beampipe=False)
Definition: DetectorConfigFlags.py:286
DumpGeoConfig.getATLASVersion
def getATLASVersion()
Definition: DumpGeoConfig.py:95
ITkPixelGeoModelConfig.ITkPixelReadoutGeometryCfg
def ITkPixelReadoutGeometryCfg(flags, setGeometryAlignable=False, setAlignmentFolderName="/Indet/Align")
Definition: ITkPixelGeoModelConfig.py:39
python.CavernGMConfig.CavernGeometryCfg
def CavernGeometryCfg(flags)
Definition: CavernGMConfig.py:6
python.MuonGeometryConfig.MuonGeoModelCfg
def MuonGeoModelCfg(flags)
Definition: MuonGeometryConfig.py:28
ITkStripGeoModelConfig.ITkStripReadoutGeometryCfg
def ITkStripReadoutGeometryCfg(flags, setGeometryAlignable=False, setAlignmentFolderName="/Indet/Align")
Definition: ITkStripGeoModelConfig.py:39
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
Muon::print
std::string print(const MuPatSegment &)
Definition: MuonTrackSteering.cxx:28
DumpGeoConfig.DumpGeoCfg
def DumpGeoCfg(flags, name="DumpGeoCA", outFileName="", **kwargs)
Definition: DumpGeoConfig.py:104
HGTD_GeoModelConfig.HGTD_SimulationGeometryCfg
def HGTD_SimulationGeometryCfg(flags)
Definition: python/HGTD_GeoModelConfig.py:17
TileGMConfig.TileGMCfg
def TileGMCfg(flags)
Definition: TileGMConfig.py:7