ATLAS Offline Software
Loading...
Searching...
No Matches
Versioning.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2from os import getenv
3
4import re
5versionRegex = re.compile(r'\‍(v\.(.*)\‍)$')
6
7ignoredGenerators = ["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
56 dsid_info = line[0].split("_")
57 dsid = int(dsid_info[0])
58 if dsid not in data:
59 data[dsid] = {}
60 if len(dsid_info) == 1:
61 data[dsid]["any"] = versions
62 else:
63 data[dsid][dsid_info[1]] = versions
64 return data
65
67 output = {}
68 for generator in generators:
69 env_variable = f"{generator.upper()}VER"
70 output[generator] = getenv(env_variable, None)
71 return output
72
73def generatorsGetFromMetadata(metadataString):
74 output = {}
75 metadataStringSplit = metadataString.split("+")
76 for s in metadataStringSplit:
77 match = versionRegex.search(s)
78 if match:
79 s = s.replace(match.group(0), "")
80 output[s] = match.group(1)
81 else:
82 output[s] = None
83 return output
84
85def generatorsVersionedStringList(generatorsDictionary):
86 list = []
87 for generator, version in generatorsDictionary.items():
88 if version is not None:
89 list.append(f"{generator}(v.{version})")
90 else:
91 list.append(generator)
92 return list
93
94def generatorsVersionedString(generatorsVersionedList):
95 return "+".join(generatorsVersionedList)
96
97
99 from AthenaCommon.Logging import logging
100 log = logging.getLogger("GeneratorsInfo")
101 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
102
103 generatorsData = flags.Input.GeneratorsInfo
104 log.info(f"Generators data: {generatorsData}")
105
106 missingVersion = False
107 for k, v in generatorsData.items():
108 if v is None and k not in ignoredGenerators:
109 missingVersion = True
110
111 # Fix specific samples directly
112 releaseDataSampleGeneratorOverridesDict = legacyReleaseDataSampleGeneratorOverrides()
113 overrides = None
114 if flags.Input.MCChannelNumber and flags.Input.MCChannelNumber in releaseDataSampleGeneratorOverridesDict:
115 overrides = releaseDataSampleGeneratorOverridesDict[flags.Input.MCChannelNumber]
116 log.warning("Found generator overrides for sample with DSID %d", flags.Input.MCChannelNumber)
117
118 if not missingVersion and not overrides:
119 return ComponentAccumulator()
120
121 log.info("At least one MC generator is missing version information. Attempting to fix...")
122
123 from PyUtils.AMITagHelperConfig import inputAMITags
124 tags = inputAMITags(flags, fixBroken=True, silent=True)
125 tag = None
126 if tags and tags[0].startswith("e"):
127 tag = tags[0]
128
129 # First check if we are fixing samples directly
130 if overrides:
131 if "any" in overrides:
132 overrides = overrides["any"]
133 else:
134 overrides = overrides.get(tag, {})
135
136 # Check again if e-tag matches and overrides are not empty
137 if overrides:
138 log.warning(f"Overriding generators to {'+'.join(overrides.keys())}.")
139 generatorsData = {}
140 for generator, version in overrides.items():
141 if version is not None:
142 log.warning(f"Overriding version for {generator} to {version}.")
143 generatorsData[generator] = version
144
145 outputStringList = generatorsVersionedStringList(generatorsData)
146
147 from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
148 return TagInfoMgrCfg(flags, tagValuePairs={"generators": generatorsVersionedString(outputStringList)})
149
150 # Fix specific samples' e-tag
151 releaseDataSampleTagOverridesDict = legacyReleaseDataSampleTagOverrides()
152 if flags.Input.MCChannelNumber and flags.Input.MCChannelNumber in releaseDataSampleTagOverridesDict:
153 log.warning(f"Overriding e-tag for sample {flags.Input.MCChannelNumber} to {releaseDataSampleTagOverridesDict[flags.Input.MCChannelNumber]}.")
154 tag = releaseDataSampleTagOverridesDict[flags.Input.MCChannelNumber]
155
156 # Retrieve generators release data
157 releaseDataDict = legacyReleaseData()
158 if tag not in releaseDataDict:
159 log.warning(f"Could not find release data for tag {tag}.")
160 return ComponentAccumulator()
161
162 # Apply release data to missing generators
163 releaseData = releaseDataDict[tag]
164 for k, v in generatorsData.items():
165 if v is None and k not in ignoredGenerators and k in releaseData:
166 log.info(f"Setting version for {k} to {releaseData[k]}.")
167 generatorsData[k] = releaseData[k]
168
169 outputStringList = generatorsVersionedStringList(generatorsData)
170
171 from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
172 return TagInfoMgrCfg(flags, tagValuePairs={"generators": generatorsVersionedString(outputStringList)})
static std::string FindCalibFile(const std::string &logical_file_name)
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:177
legacyReleaseDataSampleTagOverrides()
Definition Versioning.py:25
generatorsVersionedString(generatorsVersionedList)
Definition Versioning.py:94
generatorsGetInitialVersionedDictionary(generators)
Definition Versioning.py:66
legacyReleaseDataSampleGeneratorOverrides()
Definition Versioning.py:40
GeneratorVersioningFixCfg(flags)
Definition Versioning.py:98
generatorsVersionedStringList(generatorsDictionary)
Definition Versioning.py:85
generatorsGetFromMetadata(metadataString)
Definition Versioning.py:73