Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Versioning.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 from os import getenv
3 
4 import re
5 versionRegex = re.compile(r'\‍(v\.(.*)\‍)$')
6 
7 ignoredGenerators = ["Pythia8B", "Powheg"]
8 
9 
11  from pathlib import Path
12  from PathResolver import PathResolver
13  filePath = Path(PathResolver.FindCalibFile("GeneratorConfig/Legacy_AthGeneration_versions.txt"))
14  data = {}
15  with filePath.open() as f:
16  header = f.readline().strip().split(",")
17  generators = header[2:]
18  for line in f:
19  line = line.strip().split(",")
20  item = {generator: version for generator, version in zip(generators, line[2:])}
21  item['version'] = line[0]
22  data[line[1]] = item
23  return data
24 
26  from pathlib import Path
27  from PathResolver import PathResolver
28  filePath = Path(PathResolver.FindCalibFile("GeneratorConfig/Legacy_SampleOverrides.txt"))
29  data = {}
30  with filePath.open() as f:
31  f.readline() # skip header
32  for line in f:
33  line = line.strip()
34  if line[0] == "#":
35  continue
36  line = line.split(",")
37  data[int(line[0])] = line[1]
38  return data
39 
41  output = {}
42  for generator in generators:
43  env_variable = f"{generator.upper()}VER"
44  output[generator] = getenv(env_variable, None)
45  return output
46 
47 def generatorsGetFromMetadata(metadataString):
48  output = {}
49  metadataStringSplit = metadataString.split("+")
50  for s in metadataStringSplit:
51  match = versionRegex.search(s)
52  if match:
53  s = s.replace(match.group(0), "")
54  output[s] = match.group(1)
55  else:
56  output[s] = None
57  return output
58 
59 def generatorsVersionedStringList(generatorsDictionary):
60  list = []
61  for generator, version in generatorsDictionary.items():
62  if version is not None:
63  list.append(f"{generator}(v.{version})")
64  else:
65  list.append(generator)
66  return list
67 
68 def generatorsVersionedString(generatorsVersionedList):
69  return "+".join(generatorsVersionedList)
70 
71 
73  from AthenaCommon.Logging import logging
74  log = logging.getLogger("GeneratorsInfo")
75  from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
76 
77  generatorsData = flags.Input.GeneratorsInfo
78  log.info(f"Generators data: {generatorsData}")
79 
80  missingVersion = False
81  for k, v in generatorsData.items():
82  if v is None and k not in ignoredGenerators:
83  missingVersion = True
84 
85  if not missingVersion:
86  return ComponentAccumulator()
87 
88  log.info("At least one MC generator is missing version information. Attempting to fix...")
89 
90  from PyUtils.AMITagHelperConfig import inputAMITags
91  tags = inputAMITags(flags, fixBroken=True, silent=True)
92  tag = None
93  if tags and tags[0].startswith("e"):
94  tag = tags[0]
95 
96  # Fix specific samples
97  releaseDataSampleOverridesDict = legacyReleaseDataSampleOverrides()
98  if flags.Input.MCChannelNumber and flags.Input.MCChannelNumber in releaseDataSampleOverridesDict:
99  log.warning(f"Overriding e-tag for sample {flags.Input.MCChannelNumber} to {releaseDataSampleOverridesDict[flags.Input.MCChannelNumber]}.")
100  tag = releaseDataSampleOverridesDict[flags.Input.MCChannelNumber]
101 
102  releaseDataDict = legacyReleaseData()
103  if tag not in releaseDataDict:
104  log.warning(f"Could not find release data for tag {tag}.")
105  return ComponentAccumulator()
106 
107  releaseData = releaseDataDict[tag]
108  for k, v in generatorsData.items():
109  if v is None and k not in ignoredGenerators and k in releaseData:
110  log.info(f"Setting version for {k} to {releaseData[k]}.")
111  generatorsData[k] = releaseData[k]
112 
113  outputStringList = generatorsVersionedStringList(generatorsData)
114 
115  from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
116  return TagInfoMgrCfg(flags, tagValuePairs={"generators": generatorsVersionedString(outputStringList)})
PathResolver::FindCalibFile
static std::string FindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.h:108
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
python.TagInfoMgrConfig.TagInfoMgrCfg
def TagInfoMgrCfg(flags, tagValuePairs={})
Definition: TagInfoMgrConfig.py:6
python.Versioning.generatorsVersionedString
def generatorsVersionedString(generatorsVersionedList)
Definition: Versioning.py:68
python.LArMinBiasAlgConfig.int
int
Definition: LArMinBiasAlgConfig.py:59
python.Versioning.generatorsGetInitialVersionedDictionary
def generatorsGetInitialVersionedDictionary(generators)
Definition: Versioning.py:40
python.Versioning.GeneratorVersioningFixCfg
def GeneratorVersioningFixCfg(flags)
Definition: Versioning.py:72
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
python.Versioning.generatorsVersionedStringList
def generatorsVersionedStringList(generatorsDictionary)
Definition: Versioning.py:59
python.Versioning.legacyReleaseData
def legacyReleaseData()
Definition: Versioning.py:10
SCT_ConditionsAlgorithms::CoveritySafe::getenv
std::string getenv(const std::string &variableName)
get an environment variable
Definition: SCT_ConditionsUtilities.cxx:17
python.AMITagHelperConfig.inputAMITags
def inputAMITags(flags, fixBroken=False, silent=False)
Definition: AMITagHelperConfig.py:38
python.Versioning.generatorsGetFromMetadata
def generatorsGetFromMetadata(metadataString)
Definition: Versioning.py:47
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
python.Versioning.legacyReleaseDataSampleOverrides
def legacyReleaseDataSampleOverrides()
Definition: Versioning.py:25