ATLAS Offline Software
Loading...
Searching...
No Matches
OverlayMetadata.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3import re
4
5from AthenaCommon.Logging import logging
6from AthenaConfiguration.AllConfigFlags import GetFileMD
7
8logger = logging.getLogger("OverlayMetadataConfig")
9
10
11def validateGeometryTag(logger, target, value):
12 """Validate geometry tag so it is the same as target"""
13 target_layout = target.split('-')
14 value_layout = value.split('-')
15 if len(target_layout) != len(value_layout):
16 return False
17
18 for p, s in zip(target_layout[:-1], value_layout[:-1]):
19 if not re.match(p, s):
20 return False
21
22 if not re.match(target_layout[-1], value_layout[-1]):
23 logger.warning("Simulation geometry tag mismatch! %s vs %s", target, value)
24
25 return True
26
27
28def overlayInputMetadataCheck(flags, simDict, tagInfoDict):
29 """Check the metadata for signal HITS or presampled pileup RDO file"""
30 logger.info("Checking Overlay configuration against Signal or presampled pileup RDO metadata...")
31
32 simKeys = simDict.keys()
33 tagInfoKeys = tagInfoDict.keys()
34
35 # Check the PhysicsList set agrees with that used in the simulation
36 if "PhysicsList" in simKeys:
37 if re.match(simDict["PhysicsList"], flags.Sim.PhysicsList):
38 logger.debug("Overlay configuration matches Signal Simulation metadata. [Sim.PhysicsList = %s]", flags.Sim.PhysicsList)
39 else:
40 flags.Sim.PhysicsList = simDict["PhysicsList"]
41 logger.warning("Overlay Sim.PhysicsList does not match the PhysicsList used in the Signal Simulation step! Assume the value from the Signal Simulation step is correct!")
42 logger.warning("Set Sim.PhysicsList = %s", flags.Sim.PhysicsList)
43 else:
44 logger.error("'PhysicsList' key not found in Signal Simulation metadata!")
45 raise AssertionError("Signal Simulation metadata key not found")
46
47 # Check the DetDescrVersion set agrees with that used in the simulation
48 if "SimLayout" in simKeys:
49 if validateGeometryTag(logger, simDict["SimLayout"], flags.GeoModel.AtlasVersion):
50 logger.debug("Overlay configuration matches Signal Simulation metadata. [Geomodel.AtlasVersion = %s]",
51 flags.GeoModel.AtlasVersion)
52 else:
53 flags.GeoModel.AtlasVersion = simDict["SimLayout"]
54 logger.warning("Overlay Geomodel.AtlasVersion does not match the value used in the Signal Simulation step! Assume the value from the Signal Simulation step is correct!")
55 logger.warning("Set Geomodel.AtlasVersion = %s", flags.GeoModel.AtlasVersion)
56 else:
57 logger.error("'SimLayout' key not found in Signal Simulation metadata!")
58 raise AssertionError("Signal Simulation metadata key not found")
59
60 # Check the Conditions Tag set against that used in the simulation
61 if "IOVDbGlobalTag" in tagInfoKeys:
62 if not re.match(tagInfoDict["IOVDbGlobalTag"], flags.IOVDb.GlobalTag):
63 logger.debug("Overlay configuration: [IOVDb.GlobalTag = %s], Signal Simulation metadata: [IOVDb.GlobalTag = %s]",
64 flags.IOVDb.GlobalTag, tagInfoDict['IOVDbGlobalTag'])
65 else:
66 logger.error("'IOVDbGlobalTag' key not found in Signal Simulation metadata!")
67 raise AssertionError("Signal Simulation metadata key not found")
68
69 # Set the TRTRangeCut digitizationFlag based on what was used during the simulation.
70 if "TRTRangeCut" in simKeys:
71 if not re.match(simDict["TRTRangeCut"], str(flags.Sim.TRTRangeCut)):
72 flags.Sim.TRTRangeCut = simDict["TRTRangeCut"]
73 logger.warning("Overlay Sim.TRTRangeCut does not match the value used in the Signal Simulation step! Assume the value from the Signal Simulation step is correct!")
74 logger.warning("Set Sim.TRTRangeCut = %s", flags.Sim.TRTRangeCut)
75 else:
76 logger.warning("'TRTRangeCut' key not found in Signal Simulation metadata!")
77
78 # Check which sub-detectors were simulated
79 # TODO: needed?
80
81 logger.info("Completed checks of Overlay configuration against Signal Simulation metadata.")
82
83
84def simulationMetadataCheck(sigdict, pudict):
85 """Check the simulation metadata for presampled pileup RDO file"""
86 sigkeys = sigdict.keys()
87 pukeys = pudict.keys()
88
89 # Loop over metadata keys which must have matching values
90 warningKeys = ['G4Version']
91 sigKeysToCheck = ['PhysicsList', 'SimLayout', 'MagneticField', 'hitFileMagicNumber'] + warningKeys
92 for o in sigKeysToCheck:
93 try:
94 assert o in pukeys
95 except AssertionError:
96 logger.error("%s key missing from Presampled pile-up Simulation metadata!", o)
97 raise AssertionError("Presampled pile-up Simulation metadata key not found")
98 try:
99 assert o in sigkeys
100 except AssertionError:
101 logger.error("%s key missing from Signal Simulation metadata!", o)
102 raise AssertionError("Signal Simulation metadata key not found")
103 try:
104 if o == "SimLayout": # allow last part of the simulation tag to differ
105 assert validateGeometryTag(logger, sigdict[o], pudict[o])
106 elif not isinstance(pudict[o], type(sigdict[o])):
107 assert re.match(str(pudict[o]), str(sigdict[o]))
108 else:
109 if isinstance(pudict[o], str):
110 assert re.match(pudict[o], sigdict[o])
111 elif isinstance(pudict[o], int):
112 assert (pudict[o] == sigdict[o])
113 else:
114 assert re.match(str(pudict[o]), str(sigdict[o]))
115 except AssertionError:
116 if o in warningKeys:
117 logger.warning("Simulation metadata mismatch! Presampled pile-up: [%s = %s] Signal: [%s = %s]", o, pudict[o], o, sigdict[o])
118 else:
119 logger.error("Simulation metadata mismatch! Presampled pile-up: [%s = %s] Signal: [%s = %s]", o, pudict[o], o, sigdict[o])
120 raise AssertionError("Simulation metadata mismatch")
121
122
123def tagInfoMetadataCheck(sigdict, pudict):
124 """Check the tag info metadata for presampled pileup RDO File"""
125 sigkeys = sigdict.keys()
126 pukeys = pudict.keys()
127
128 logger.debug("Signal /TagInfo %s", sigdict)
129 logger.debug("Pileup /TagInfo %s", pudict)
130
131 sigOnlyDict = dict()
132 sigOnlyKeySet = set(sigkeys).difference(set(pukeys))
133 logger.debug("The following keys only appear in Signal /TagInfo metadata:")
134 logger.debug(sigOnlyKeySet)
135 for key in sigOnlyKeySet:
136 sigOnlyDict[key] = sigdict[key]
137 logger.debug(" key: %s value: %s", key, sigdict[key])
138 pass
139 # TODO: extra
140 keysToCompareSet = set(sigkeys).intersection(set(pukeys))
141 logger.debug("The following keys appear in Signal and Presampled pile-up /TagInfo metadata:")
142 logger.debug(keysToCompareSet)
143
144 # Loop over metadata keys which must have matching values
145 warningKeys = ['IOVDbGlobalTag']
146 sigKeysToCheck = warningKeys
147 for o in sigKeysToCheck:
148 try:
149 assert o in pukeys
150 except AssertionError:
151 logger.error("%s key missing from Presampled pile-up Simulation metadata!", o)
152 raise AssertionError("Presampled pile-up Simulation metadata key not found")
153 try:
154 assert o in sigkeys
155 except AssertionError:
156 logger.error("%s key missing from Signal Simulation metadata!", o)
157 raise AssertionError("Signal Simulation metadata key not found")
158 try:
159 if not isinstance(pudict[o], type(sigdict[o])):
160 assert re.match(str(pudict[o]), str(sigdict[o]))
161 else:
162 if isinstance(pudict[o], str):
163 assert re.match(pudict[o], sigdict[o])
164 elif isinstance(pudict[o], int):
165 assert (pudict[o] == sigdict[o])
166 else:
167 assert re.match(str(pudict[o]), str(sigdict[o]))
168 except AssertionError:
169 if o in warningKeys:
170 logger.warning("Simulation metadata mismatch! Presampled pile-up: [%s = %s] Signal: [%s = %s]", o, pudict[o], o, sigdict[o])
171 else:
172 logger.error("Simulation metadata mismatch! Presampled pile-up: [%s = %s] Signal: [%s = %s]", o, pudict[o], o, sigdict[o])
173 raise AssertionError("Simulation metadata mismatch")
174
175
177 """Check overlay metadata"""
178 if flags.Input.SecondaryFiles:
179 signalMetadata = GetFileMD(flags.Input.SecondaryFiles, maxLevel="full")
180 signalSimulationMetadata = signalMetadata.get("/Simulation/Parameters", {})
181 signalTagInfoMetadata = signalMetadata.get("/TagInfo", {})
182 # signal check
183 overlayInputMetadataCheck(flags, signalSimulationMetadata, signalTagInfoMetadata)
184 else:
185 # This can be the case for the FastChain with overlay
186 # It is not an error.
187 logger.info("Simulation metadata check not done due to no inputs")
188
189 # pile-up check
190 if not flags.Overlay.DataOverlay and flags.Input.Files:
191 pileupMetaDataCheck = GetFileMD(flags.Input.Files, maxLevel="full")
192 pileupDigitizationMetadata = pileupMetaDataCheck.get("/Digitization/Parameters", {})
193 pileupSimulationMetadata = pileupMetaDataCheck.get("/Simulation/Parameters", {})
194 pileupTagInfoMetadata = pileupMetaDataCheck.get("/TagInfo", {})
195
196 logger.info("Checking Presampled pile-up metadata against Signal Simulation metadata...")
197 simulationMetadataCheck(signalSimulationMetadata, pileupSimulationMetadata)
198 tagInfoMetadataCheck(signalTagInfoMetadata, pileupTagInfoMetadata)
199 logger.info("Completed all checks against Presampled pile-up Simulation metadata.")
200
201 if pileupDigitizationMetadata:
202 # Store metadata for later writing in OverlayMainContentCfg
203 flags._Overlay_pileupDigitizationMetadata = pileupDigitizationMetadata
204
205
207 """Check fastchain overlay metadata"""
208 # pile-up check
209 if not flags.Overlay.DataOverlay and flags.Input.Files:
210 pileupMetaDataCheck = GetFileMD(flags.Input.Files, maxLevel="full")
211 pileupDigitizationMetadata = pileupMetaDataCheck.get("/Digitization/Parameters", {})
212 pileupSimulationMetadata = pileupMetaDataCheck.get("/Simulation/Parameters", {})
213 pileupTagInfoMetadata = pileupMetaDataCheck.get("/TagInfo", {})
214
215 logger.info("Checking Presampled pile-up metadata against configuration of jobs (i.e. flags)...")
216 overlayInputMetadataCheck(flags, pileupSimulationMetadata, pileupTagInfoMetadata)
217 logger.info("Completed all checks against Presampled pile-up Simulation metadata.")
218
219 if pileupDigitizationMetadata:
220 # Store metadata for later writing in OverlayMainContentCfg
221 flags._Overlay_pileupDigitizationMetadata = pileupDigitizationMetadata
222
223
225 """Write overlay digitization metadata to intermediate sqlite file (DigitParams.db)"""
226 runNumber = flags.Input.RunNumbers[0]
227 runNumberEnd = flags.Input.RunNumbers[-1]
228 if runNumberEnd == runNumber:
229 runNumberEnd += 1
230 logger.debug('Overlay BeginRun = %s', str(runNumber) )
231 logger.debug('Overlay EndRun = %s', str(runNumberEnd) )
232
233 logger.info('Filling Digitization MetaData')
234 logger.info('Writing overlay digitization parameters to intermediate sqlite file (DigitParams.db)')
235
236 # Write to DigitParams.db intermediate file
237 from IOVDbMetaDataTools import ParameterDbFiller
239 dbFiller.setBeginRun(runNumber)
240 dbFiller.setEndRun(runNumberEnd)
241
242 # Copy over pileup dictionary
243 for key in pileupDict:
244 value = str(pileupDict[key])
245 logger.info('DigitizationMetaData: setting "%s" to be %s', key, value)
246 if key in ["BeamIntensityPattern"]:
247 dbFiller.addDigitParam64(key, value)
248 else:
249 dbFiller.addDigitParam(key, value)
250
251 # Make the MetaData Db
252 dbFiller.genDigitDb()
STL class.
std::vector< std::string > intersection(std::vector< std::string > &v1, std::vector< std::string > &v2)
writeOverlayDigitizationMetadata(flags, pileupDict)
overlayInputMetadataCheck(flags, simDict, tagInfoDict)
tagInfoMetadataCheck(sigdict, pudict)
validateGeometryTag(logger, target, value)
simulationMetadataCheck(sigdict, pudict)