ATLAS Offline Software
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_SampleTagOverrides.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  from pathlib import Path
42  from PathResolver import PathResolver
43  filePath = Path(PathResolver.FindCalibFile("GeneratorConfig/Legacy_SampleGeneratorOverrides.txt"))
44  data = {}
45  with filePath.open() as f:
46  f.readline() # skip header
47  for line in f:
48  line = line.strip()
49  if line[0] == "#":
50  continue
51  line = line.split(",")
52  versions = {}
53  for i in range(1, len(line), 2):
54  versions[line[i]] = line[i+1] if line[i+1] != "None" else None
55  data[int(line[0])] = versions
56  return data
57 
59  output = {}
60  for generator in generators:
61  env_variable = f"{generator.upper()}VER"
62  output[generator] = getenv(env_variable, None)
63  return output
64 
65 def generatorsGetFromMetadata(metadataString):
66  output = {}
67  metadataStringSplit = metadataString.split("+")
68  for s in metadataStringSplit:
69  match = versionRegex.search(s)
70  if match:
71  s = s.replace(match.group(0), "")
72  output[s] = match.group(1)
73  else:
74  output[s] = None
75  return output
76 
77 def generatorsVersionedStringList(generatorsDictionary):
78  list = []
79  for generator, version in generatorsDictionary.items():
80  if version is not None:
81  list.append(f"{generator}(v.{version})")
82  else:
83  list.append(generator)
84  return list
85 
86 def generatorsVersionedString(generatorsVersionedList):
87  return "+".join(generatorsVersionedList)
88 
89 
91  from AthenaCommon.Logging import logging
92  log = logging.getLogger("GeneratorsInfo")
93  from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
94 
95  generatorsData = flags.Input.GeneratorsInfo
96  log.info(f"Generators data: {generatorsData}")
97 
98  missingVersion = False
99  for k, v in generatorsData.items():
100  if v is None and k not in ignoredGenerators:
101  missingVersion = True
102 
103  if not missingVersion:
104  return ComponentAccumulator()
105 
106  log.info("At least one MC generator is missing version information. Attempting to fix...")
107 
108  from PyUtils.AMITagHelperConfig import inputAMITags
109  tags = inputAMITags(flags, fixBroken=True, silent=True)
110  tag = None
111  if tags and tags[0].startswith("e"):
112  tag = tags[0]
113 
114  # Fix specific samples directly
115  releaseDataSampleGeneratorOverridesDict = legacyReleaseDataSampleGeneratorOverrides()
116  if flags.Input.MCChannelNumber and flags.Input.MCChannelNumber in releaseDataSampleGeneratorOverridesDict:
117  overrides = releaseDataSampleGeneratorOverridesDict[flags.Input.MCChannelNumber]
118  log.warning(f"Overriding generators to {'+'.join(overrides.keys())}.")
119  generatorsData = {}
120  for generator, version in overrides.items():
121  if version is not None:
122  log.warning(f"Overriding version for {generator} to {version}.")
123  generatorsData[generator] = version
124 
125  outputStringList = generatorsVersionedStringList(generatorsData)
126 
127  from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
128  return TagInfoMgrCfg(flags, tagValuePairs={"generators": generatorsVersionedString(outputStringList)})
129 
130  # Fix specific samples' e-tag
131  releaseDataSampleTagOverridesDict = legacyReleaseDataSampleTagOverrides()
132  if flags.Input.MCChannelNumber and flags.Input.MCChannelNumber in releaseDataSampleTagOverridesDict:
133  log.warning(f"Overriding e-tag for sample {flags.Input.MCChannelNumber} to {releaseDataSampleTagOverridesDict[flags.Input.MCChannelNumber]}.")
134  tag = releaseDataSampleTagOverridesDict[flags.Input.MCChannelNumber]
135 
136  # Retrieve generators release data
137  releaseDataDict = legacyReleaseData()
138  if tag not in releaseDataDict:
139  log.warning(f"Could not find release data for tag {tag}.")
140  return ComponentAccumulator()
141 
142  # Apply release data to missing generators
143  releaseData = releaseDataDict[tag]
144  for k, v in generatorsData.items():
145  if v is None and k not in ignoredGenerators and k in releaseData:
146  log.info(f"Setting version for {k} to {releaseData[k]}.")
147  generatorsData[k] = releaseData[k]
148 
149  outputStringList = generatorsVersionedStringList(generatorsData)
150 
151  from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
152  return TagInfoMgrCfg(flags, tagValuePairs={"generators": generatorsVersionedString(outputStringList)})
PathResolver::FindCalibFile
static std::string FindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.h:63
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:86
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
python.Versioning.generatorsGetInitialVersionedDictionary
def generatorsGetInitialVersionedDictionary(generators)
Definition: Versioning.py:58
python.Versioning.GeneratorVersioningFixCfg
def GeneratorVersioningFixCfg(flags)
Definition: Versioning.py:90
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:77
python.Versioning.legacyReleaseData
def legacyReleaseData()
Definition: Versioning.py:10
python.Versioning.legacyReleaseDataSampleGeneratorOverrides
def legacyReleaseDataSampleGeneratorOverrides()
Definition: Versioning.py:40
SCT_ConditionsAlgorithms::CoveritySafe::getenv
std::string getenv(const std::string &variableName)
get an environment variable
Definition: SCT_ConditionsUtilities.cxx:17
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
python.AMITagHelperConfig.inputAMITags
def inputAMITags(flags, fixBroken=False, silent=False)
Definition: AMITagHelperConfig.py:38
python.Versioning.generatorsGetFromMetadata
def generatorsGetFromMetadata(metadataString)
Definition: Versioning.py:65
python.Versioning.legacyReleaseDataSampleTagOverrides
def legacyReleaseDataSampleTagOverrides()
Definition: Versioning.py:25
Trk::split
@ split
Definition: LayerMaterialProperties.h:38