ATLAS Offline Software
Loading...
Searching...
No Matches
OverlayMetadata.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 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.Overlay.ByteStream:
179 files = flags.Input.Files
180 filesPileup = flags.Input.SecondaryFiles
181 else:
182 files = flags.Input.SecondaryFiles
183 filesPileup = flags.Input.Files
184
185 if files:
186 signalMetadata = GetFileMD(files, maxLevel="full")
187 signalSimulationMetadata = signalMetadata.get("/Simulation/Parameters", {})
188 signalTagInfoMetadata = signalMetadata.get("/TagInfo", {})
189 # signal check
190 overlayInputMetadataCheck(flags, signalSimulationMetadata, signalTagInfoMetadata)
191 else:
192 # This can be the case for the FastChain with overlay
193 # It is not an error.
194 logger.info("Simulation metadata check not done due to no inputs")
195
196 # pile-up check
197 if not flags.Overlay.DataOverlay and filesPileup:
198 pileupMetaDataCheck = GetFileMD(filesPileup, maxLevel="full")
199 pileupDigitizationMetadata = pileupMetaDataCheck.get("/Digitization/Parameters", {})
200 pileupSimulationMetadata = pileupMetaDataCheck.get("/Simulation/Parameters", {})
201 pileupTagInfoMetadata = pileupMetaDataCheck.get("/TagInfo", {})
202
203 logger.info("Checking Presampled pile-up metadata against Signal Simulation metadata...")
204 simulationMetadataCheck(signalSimulationMetadata, pileupSimulationMetadata)
205 tagInfoMetadataCheck(signalTagInfoMetadata, pileupTagInfoMetadata)
206 logger.info("Completed all checks against Presampled pile-up Simulation metadata.")
207
208 if pileupDigitizationMetadata:
209 # Store metadata for later writing in OverlayMainContentCfg
210 flags._Overlay_pileupDigitizationMetadata = pileupDigitizationMetadata
211
212
214 """Check fastchain overlay metadata"""
215 if flags.Overlay.ByteStream:
216 filesPileup = flags.Input.SecondaryFiles
217 else:
218 filesPileup = flags.Input.Files
219
220 # pile-up check
221 if not flags.Overlay.DataOverlay and filesPileup:
222 pileupMetaDataCheck = GetFileMD(filesPileup, maxLevel="full")
223 pileupDigitizationMetadata = pileupMetaDataCheck.get("/Digitization/Parameters", {})
224 pileupSimulationMetadata = pileupMetaDataCheck.get("/Simulation/Parameters", {})
225 pileupTagInfoMetadata = pileupMetaDataCheck.get("/TagInfo", {})
226
227 logger.info("Checking Presampled pile-up metadata against configuration of jobs (i.e. flags)...")
228 overlayInputMetadataCheck(flags, pileupSimulationMetadata, pileupTagInfoMetadata)
229 logger.info("Completed all checks against Presampled pile-up Simulation metadata.")
230
231 if pileupDigitizationMetadata:
232 # Store metadata for later writing in OverlayMainContentCfg
233 flags._Overlay_pileupDigitizationMetadata = pileupDigitizationMetadata
234
235
237 """Write overlay digitization metadata to intermediate sqlite file (DigitParams.db)"""
238 runNumber = flags.Input.RunNumbers[0]
239 runNumberEnd = flags.Input.RunNumbers[-1]
240 if runNumberEnd == runNumber:
241 runNumberEnd += 1
242 logger.debug('Overlay BeginRun = %s', str(runNumber) )
243 logger.debug('Overlay EndRun = %s', str(runNumberEnd) )
244
245 logger.info('Filling Digitization MetaData')
246 logger.info('Writing overlay digitization parameters to intermediate sqlite file (DigitParams.db)')
247
248 # Write to DigitParams.db intermediate file
249 from IOVDbMetaDataTools import ParameterDbFiller
251 dbFiller.setBeginRun(runNumber)
252 dbFiller.setEndRun(runNumberEnd)
253
254 # Copy over pileup dictionary
255 for key in pileupDict:
256 value = str(pileupDict[key])
257 logger.info('DigitizationMetaData: setting "%s" to be %s', key, value)
258 if key in ["BeamIntensityPattern"]:
259 dbFiller.addDigitParam64(key, value)
260 else:
261 dbFiller.addDigitParam(key, value)
262
263 # Make the MetaData Db
264 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)