3 from PyUtils.MetaReader
import read_metadata, lite_primary_keys_to_keep, lite_TagInfo_keys_to_keep
4 from AthenaCommon.Logging
import logging
5 from functools
import lru_cache
7 msg = logging.getLogger(
'AutoConfigFlags')
10 _fileMetaData = dict()
13 def __init__(self, filename, maxLevel='peeker'):
20 msg.debug(
"Loaded using 'lite' %s",
str(self.
metadata))
28 def get(self, key, default):
31 if key
in lite_primary_keys_to_keep
or key
in lite_TagInfo_keys_to_keep:
40 levels = [
'peeker',
'full']
if self.
maxAccessLevel ==
'full' else [
'peeker']
45 msg.info(
"Looking into the file in '%s' mode as the configuration requires more details: %s ", level, key)
57 return self.
get(key,
None)
65 def GetFileMD(filenames, allowEmpty=True, maxLevel='peeker'):
68 msg.info(
"Running an input-less job. Will have empty metadata.")
70 raise RuntimeError(
"Metadata can not be read in an input-less job.")
71 if isinstance(filenames, str):
72 filenames = [filenames]
73 if '_ATHENA_GENERIC_INPUTFILE_NAME_' in filenames:
74 raise RuntimeError(
'Input file name not set, instead _ATHENA_GENERIC_INPUTFILE_NAME_ found. Cannot read metadata.')
75 for filename
in filenames:
76 if filename
not in _fileMetaData:
77 msg.info(
"Obtaining metadata of auto-configuration by peeking into '%s'", filename)
79 if _fileMetaData[filename].maxAccessLevel != maxLevel:
80 _fileMetaData[filename].maxAccessLevel = maxLevel
81 if _fileMetaData[filename][
'nentries']
not in [
None, 0]:
82 return _fileMetaData[filename]
84 msg.info(
"The file: %s has no entries, going to the next one for harvesting the metadata", filename)
85 msg.info(
"No file with events found, returning anyways metadata associated to the first file %s", filenames[0])
86 return _fileMetaData[filenames[0]]
89 """Read geometry database for all detectors"""
91 from AtlasGeoModel
import CommonGeoDB
92 from PixelGeoModel
import PixelGeoDB
93 from LArGeoAlgsNV
import LArGeoDB
94 from MuonGeoModel
import MuonGeoDB
98 from AtlasGeoModel.AtlasGeoDBInterface
import AtlasGeoDBInterface
99 dbGeomCursor = AtlasGeoDBInterface(geoTag)
100 dbGeomCursor.ConnectAndBrowseGeoDB()
102 params = {
'Common' : CommonGeoDB.InitializeGeometryParameters(dbGeomCursor),
106 'Luminosity' : CommonGeoDB.InitializeLuminosityDetectorParameters(dbGeomCursor),
109 msg.debug(
'Config parameters retrieved from Geometry DB (Frontier/Oracle):')
110 for key
in params.keys():
111 msg.debug(f
'{key} -> {params[key]}')
114 from AtlasGeoModel.AtlasGeoDBInterface
import AtlasGeoDBInterface_SQLite
115 sqliteReader = AtlasGeoDBInterface_SQLite(geoTag,sqliteDBFullPath)
116 sqliteReader.ConnectToDB()
118 params = {
'Common' : CommonGeoDB.InitializeGeometryParameters_SQLite(sqliteReader),
122 'Luminosity' : CommonGeoDB.InitializeLuminosityDetectorParameters_SQLite(sqliteReader),
125 msg.debug(
'Config parameters retrieved from Geometry DB (SQLite):')
126 for key
in params.keys():
127 msg.debug(f
'{key} -> {params[key]}')
132 @lru_cache(maxsize=4)
134 """Query geometry DB for detector description. Returns dictionary with
135 detector description. Queries DB for each tag only once.
137 geoTag: geometry tag (e.g. ATLAS-R2-2016-01-00-01)
140 raise ValueError(
"No geometry tag specified")
143 detDescrInfo[
"geomTag"] = geoTag
147 @lru_cache(maxsize=4)
149 """Query geometry DB for detector description.
150 Returns a set of detectors used in a geometry tag.
152 geoTag: geometry tag (e.g. ATLAS-R2-2016-01-00-01)
154 detectors =
DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Common'][
'Detectors']
156 manualConfig =
not DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Common'][
"DetectorsConfigured"]
160 detectors.add(
'Bpipe')
161 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Common'][
'Run']
not in [
'RUN1',
'RUN2',
'RUN3']:
162 detectors.add(
'ITkPixel')
163 detectors.add(
'ITkStrip')
164 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Luminosity'][
'BCMPrime']:
165 detectors.add(
'BCMPrime')
166 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Luminosity'][
'PLR']:
169 detectors.add(
'Pixel')
174 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Common'][
'Run']
not in [
'RUN1',
'RUN2',
'RUN3']:
175 detectors.add(
'HGTD')
178 detectors.add(
'Tile')
181 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Common'][
'Run']
in [
'RUN1',
'RUN2',
'RUN3']:
182 detectors.add(
'MBTS')
184 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Muon'][
'HasMDT']:
186 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Muon'][
'HasRPC']:
188 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Muon'][
'HasTGC']:
190 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Muon'][
'HasCSC']:
192 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Muon'][
'HasSTGC']:
193 detectors.add(
'sTGC')
194 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Muon'][
'HasMM']:
198 detectors.add(
'Lucid')
199 if DetDescrInfo(geoTag,sqliteDB,sqliteDBFullPath)[
'Common'][
'Run']
not in [
'RUN1']:
202 detectors.add(
'ALFA')
203 detectors.add(
'FwdRegion')
211 from .RunToTimestampData
import RunToTimestampDict
212 return RunToTimestampDict
216 """This is used to hold a dictionary of the form
217 {152166:1269948352889940910, ...} to allow the
218 timestamp to be determined from the run.
221 timeStamps = [run2timestampDict.get(runNumber,1)
for runNumber
in runNumbers]
226 """Read in GeneratorsInfo from the input file
228 from AthenaConfiguration.Enums
import ProductionStep
229 inputFiles = flags.Input.Files
230 if flags.Common.ProductionStep
in [ProductionStep.Overlay, ProductionStep.FastChain]
and flags.Input.SecondaryFiles
and not flags.Overlay.ByteStream:
232 inputFiles = flags.Input.SecondaryFiles
233 generatorsString =
""
234 from AthenaConfiguration.AutoConfigFlags
import GetFileMD
236 generatorsString =
GetFileMD(inputFiles).
get(
"generators",
"")
237 from GeneratorConfig.Versioning
import generatorsGetFromMetadata
242 """Read in special simulation job option fragments based on metadata
243 passed by the evgen stage
245 specialConfigDict = dict()
246 legacyPreIncludeToCAPostInclude = {
'SimulationJobOptions/preInclude.AMSB.py' :
'Charginos.CharginosConfig.AMSB_Cfg',
247 'SimulationJobOptions/preInclude.Monopole.py' :
'Monopole.MonopoleConfig.MonopoleCfg',
248 'SimulationJobOptions/preInclude.Quirks.py' :
'Quirks.QuirksConfig.QuirksCfg',
249 'SimulationJobOptions/preInclude.SleptonsLLP.py' :
'Sleptons.SleptonsConfig.SleptonsLLPCfg',
250 'SimulationJobOptions/preInclude.GMSB.py' :
'Sleptons.SleptonsConfig.GMSB_Cfg',
251 'SimulationJobOptions/preInclude.Qball.py' :
'Monopole.MonopoleConfig.QballCfg',
252 'SimulationJobOptions/preInclude.RHadronsPythia8.py' :
'RHadrons.RHadronsConfig.RHadronsCfg',
253 'SimulationJobOptions/preInclude.fcp.py' :
'Monopole.MonopoleConfig.fcpCfg' }
254 legacyPreIncludeToCAPreInclude = {
'SimulationJobOptions/preInclude.AMSB.py' :
None,
255 'SimulationJobOptions/preInclude.Monopole.py' :
'Monopole.MonopoleConfig.MonopolePreInclude',
256 'SimulationJobOptions/preInclude.Quirks.py' :
None,
257 'SimulationJobOptions/preInclude.SleptonsLLP.py' :
None,
258 'SimulationJobOptions/preInclude.GMSB.py' :
None,
259 'SimulationJobOptions/preInclude.Qball.py' :
'Monopole.MonopoleConfig.QballPreInclude',
260 'SimulationJobOptions/preInclude.RHadronsPythia8.py' :
'RHadrons.RHadronsConfig.RHadronsPreInclude',
261 'SimulationJobOptions/preInclude.fcp.py' :
'Monopole.MonopoleConfig.fcpPreInclude' }
262 specialConfigString =
''
263 from AthenaConfiguration.Enums
import ProductionStep
264 inputFiles = flags.Input.Files
265 secondaryInputFiles = flags.Input.SecondaryFiles
266 if flags.Common.ProductionStep
in [ProductionStep.Overlay, ProductionStep.FastChain]
and not flags.Overlay.DataOverlay
and flags.Input.SecondaryFiles:
268 inputFiles = flags.Input.SecondaryFiles
269 secondaryInputFiles = flags.Input.Files
270 from AthenaConfiguration.AutoConfigFlags
import GetFileMD
271 if len(inputFiles)>0:
272 specialConfigString =
GetFileMD(inputFiles).
get(
'specialConfiguration',
'')
273 if (
not len(specialConfigString)
or specialConfigString ==
'NONE')
and len(secondaryInputFiles)>0:
276 specialConfigString =
GetFileMD(secondaryInputFiles).
get(
'specialConfiguration',
'')
277 if len(specialConfigString)>0:
280 spcitems = specialConfigString.split(
";")
281 for spcitem
in spcitems:
284 if not spcitem
or spcitem.upper() ==
"NONE":
287 if "=" not in spcitem:
288 spcitem =
"preInclude=" + spcitem
290 k, v = spcitem.split(
"=")
291 if k ==
"preInclude" and v.endswith(
'.py'):
292 if v ==
'SimulationJobOptions/preInclude.RhadronsPythia8.py':
293 v =
'SimulationJobOptions/preInclude.RHadronsPythia8.py'
294 v1 = legacyPreIncludeToCAPreInclude[v]
296 specialConfigDict[k] = v1
297 v2 = legacyPreIncludeToCAPostInclude[v]
299 specialConfigDict[
'postInclude'] = v2
301 specialConfigDict[k] = v
302 return specialConfigDict