3 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator, ConfigurationError
5 from AthenaConfiguration.ComponentFactory
import CompFactory
6 from AthenaConfiguration.AccumulatorCache
import AccumulatorCache
7 from AthenaCommon.Logging
import logging
8 from functools
import cache
10 msg = logging.getLogger(
'IOVDbSvcCfg')
14 result.addCondAlgo(CompFactory.CondInputLoader(**kwargs))
20 kwargs.setdefault(
'COOLSQLiteVetoPattern',
'/DBRelease/')
23 result.addService(CompFactory.DBReplicaSvc(**kwargs))
32 kwargs.setdefault(
'OnlineMode', flags.Common.isOnline)
33 kwargs.setdefault(
'dbConnection', flags.IOVDb.DBConnection)
34 kwargs.setdefault(
'crestServer', flags.IOVDb.CrestServer)
36 kwargs.setdefault(
'DBInstance', flags.IOVDb.DatabaseInstance)
38 if 'FRONTIER_SERVER' in os.environ.keys()
and os.environ[
'FRONTIER_SERVER'] !=
'':
39 kwargs.setdefault(
'CacheAlign', 3)
42 if flags.Common.isOnline
and flags.Trigger.Online.isPartition:
43 kwargs[
'CacheAlign'] = 0
44 kwargs[
'CacheRun'] = 0
45 kwargs[
'CacheTime'] = 0
47 kwargs.setdefault(
'GlobalTag', flags.IOVDb.GlobalTag)
48 if 'Folders' in kwargs:
49 kwargs[
'Folders'] = [
'/TagInfo<metaOnly/>'] + kwargs[
'Folders']
51 kwargs.setdefault(
'Folders', [
'/TagInfo<metaOnly/>'])
54 if flags.IOVDb.GlobalTag
and flags.IOVDb.GlobalTag.startswith(
'CREST-'):
55 kwargs.setdefault(
'Source',
'CREST')
57 result.addService(CompFactory.IOVDbSvc(**kwargs), primary=
True)
60 from AthenaPoolCnvSvc.PoolCommonConfig
import PoolSvcCfg
61 result.merge(
PoolSvcCfg(flags, withCatalogs=
True))
62 if flags.MP.UseSharedReader
or flags.MP.UseSharedWriter:
63 from AthenaPoolCnvSvc.PoolCommonConfig
import AthenaPoolSharedIOCnvSvcCfg
66 from AthenaPoolCnvSvc.PoolCommonConfig
import AthenaPoolCnvSvcCfg
68 result.addService(CompFactory.CondSvc())
69 result.addService(CompFactory.ProxyProviderSvc(ProviderNames=[
'IOVDbSvc']))
71 if not flags.Input.isMC:
75 from EventInfoMgt.TagInfoMgrConfig
import TagInfoMgrCfg
79 from AthenaServices.MetaDataSvcConfig
import MetaDataSvcCfg
86 def addFolders(flags, folderStrings, detDb=None, className=None, extensible=False, tag=None, db=None, modifiers=''):
89 tagString =
'<tag>%s</tag>' % tag
92 if isinstance(folderStrings, str):
93 return addFolderList(flags, ((folderStrings + tagString, detDb, className),), extensible, db, modifiers)
96 folderDefinitions = []
98 for folderString
in folderStrings:
99 folderDefinitions.append((folderString + tagString, detDb, className))
101 return addFolderList(flags, folderDefinitions, extensible, db, modifiers)
104 def addFolderList(flags, listOfFolderInfoTuple, extensible=False, db=None, modifiers=''):
105 """Add access to the given set of folders, in the identified subdetector schema.
106 FolerInfoTuple consists of (foldername,detDB,classname)
108 If EXTENSIBLE is set, then if we access an open-ended IOV at the end of the list,
109 the end time for this range will be set to just past the current event.
110 Subsequent accesses will update this end time for subsequent events.
111 This allows the possibility of later adding a new IOV using IOVSvc::setRange."""
115 flags.IOVDb.SqliteFolders,
116 flags.IOVDb.DatabaseInstance)
118 for (fs, detDb, className)
in listOfFolderInfoTuple:
121 if className
is not None:
122 loadFolders.add((className, fse))
124 if fse
in sqliteFolders:
125 msg.warning(f
'Reading folder {fs} from sqlite, bypassing production database')
126 fs+=sqliteFolders[fse]
127 elif detDb
is not None and fs.find(
'<db>') == -1:
132 dbName = flags.IOVDb.DatabaseInstance
133 if detDb
in _dblist.keys():
134 fs = f
'<db>{_dblist[detDb]}/{dbName}</db> {fs}'
135 elif os.access(detDb, os.R_OK):
137 fs = f
'<db>sqlite://;schema={detDb};dbname={dbName}</db> {fs}'
139 raise ConfigurationError(f
'Error, db shorthand {detDb} not known, nor found as sqlite file')
143 fs = fs +
'<extensible/>'
153 result.getPrimary().Folders+=folders
155 result.getCondAlgo(
'CondInputLoader').Load |= loadFolders
157 if flags.IOVDb.CleanerRingSize > 0:
159 cleanerSvc = CompFactory.Athena.DelayedConditionsCleanerSvc(RingSize=flags.IOVDb.CleanerRingSize)
160 result.addService(cleanerSvc)
161 result.addService(CompFactory.Athena.ConditionsCleanerSvc(CleanerSvc=cleanerSvc))
167 def addFoldersSplitOnline(flags, detDb, onlineFolders, offlineFolders, className=None, extensible=False, addMCString='_OFL', splitMC=False, tag=None, forceDb=None, modifiers=''):
168 """Add access to given folder, using either online_folder or offline_folder. For MC, add addMCString as a postfix (default is _OFL)"""
170 if flags.Common.isOnline
and not flags.Input.isMC:
171 folders = onlineFolders
172 elif splitMC
and not flags.Input.isMC:
173 folders = onlineFolders
176 detDb = detDb + addMCString
177 folders = offlineFolders
179 return addFolders(flags, folders, detDb, className, extensible, tag=tag, db=forceDb, modifiers=modifiers)
183 'INDET':
'COOLONL_INDET',
184 'INDET_ONL':
'COOLONL_INDET',
185 'PIXEL':
'COOLONL_PIXEL',
186 'PIXEL_ONL':
'COOLONL_PIXEL',
188 'SCT_ONL':
'COOLONL_SCT',
190 'TRT_ONL':
'COOLONL_TRT',
192 'LAR_ONL':
'COOLONL_LAR',
193 'TILE':
'COOLONL_TILE',
194 'TILE_ONL':
'COOLONL_TILE',
195 'MUON':
'COOLONL_MUON',
196 'MUON_ONL':
'COOLONL_MUON',
197 'MUONALIGN':
'COOLONL_MUONALIGN',
198 'MUONALIGN_ONL':
'COOLONL_MUONALIGN',
200 'MDT_ONL':
'COOLONL_MDT',
202 'RPC_ONL':
'COOLONL_RPC',
204 'TGC_ONL':
'COOLONL_TGC',
206 'CSC_ONL':
'COOLONL_CSC',
207 'TDAQ':
'COOLONL_TDAQ',
208 'TDAQ_ONL':
'COOLONL_TDAQ',
209 'GLOBAL':
'COOLONL_GLOBAL',
210 'GLOBAL_ONL':
'COOLONL_GLOBAL',
211 'TRIGGER':
'COOLONL_TRIGGER',
212 'TRIGGER_ONL':
'COOLONL_TRIGGER',
213 'CALO':
'COOLONL_CALO',
214 'CALO_ONL':
'COOLONL_CALO',
216 'FWD_ONL':
'COOLONL_FWD',
217 'INDET_OFL':
'COOLOFL_INDET',
218 'PIXEL_OFL':
'COOLOFL_PIXEL',
219 'SCT_OFL':
'COOLOFL_SCT',
220 'TRT_OFL':
'COOLOFL_TRT',
221 'LAR_OFL':
'COOLOFL_LAR',
222 'TILE_OFL':
'COOLOFL_TILE',
223 'MUON_OFL':
'COOLOFL_MUON',
224 'MUONALIGN_OFL':
'COOLOFL_MUONALIGN',
225 'MDT_OFL':
'COOLOFL_MDT',
226 'RPC_OFL':
'COOLOFL_RPC',
227 'TGC_OFL':
'COOLOFL_TGC',
228 'CSC_OFL':
'COOLOFL_CSC',
229 'TDAQ_OFL':
'COOLOFL_TDAQ',
230 'DCS_OFL':
'COOLOFL_DCS',
231 'GLOBAL_OFL':
'COOLOFL_GLOBAL',
232 'TRIGGER_OFL':
'COOLOFL_TRIGGER',
233 'CALO_OFL':
'COOLOFL_CALO',
234 'FWD_OFL':
'COOLOFL_FWD'
239 """Add xml override for the specified folder (folder-level tag, forceRunNumber, ...)"""
242 suffix = f
' <db>{db}</db>'
243 return IOVDbSvcCfg(flags, overrideTags=(f
'<prefix>{folder}</prefix> <{tagType}>{tag}</{tagType}>{suffix}',))
247 """Extract the folder name (non-XML text) from a IOVDbSvc.Folders entry"""
251 while ix < len(folderString):
252 if (folderString[ix] ==
'<' and xmlTag ==
''):
253 ix2 = folderString.find(
'>', ix)
255 xmlTag = folderString[ix + 1 : ix2].strip()
257 elif folderString[ix:ix+2] ==
'</' and xmlTag !=
'':
258 ix2 = folderString.find(
'>', ix)
263 ix2 = folderString.find(
'<', ix)
265 ix2 = len(folderString)
267 folderName = folderName + folderString[ix : ix2]
269 return folderName.strip()
274 if sqliteInput ==
"":
return []
276 if isinstance(takeFolders, str):
277 takeFolders=[takeFolders,]
278 dbStr=
"sqlite://;schema="+ sqliteInput+
";dbname="+databaseInstance
279 from PyCool
import cool
280 dbSvc = cool.DatabaseSvcFactory.databaseService()
281 db = dbSvc.openDatabase(dbStr)
282 nodelist=db.listAllNodes()
283 for node
in nodelist:
284 if db.existsFolder(node):
285 if (len(takeFolders)>0
and str(node)
not in takeFolders):
continue
286 connStr=
"<db>"+dbStr+
"</db>"
288 if f.versioningMode
is not cool.FolderVersioning.SINGLE_VERSION:
291 connStr+=
"<tag>"+tags[0]+
"</tag>"
292 sqliteFolders[
str(node)]=connStr
295 if len(takeFolders)>0:
296 missedFolders=
set(takeFolders)-
set(sqliteFolders.keys())
297 if len(missedFolders):
298 msg.error(
"The following folders were requested via the flag IOVSvc.sqliteFolder but not found in the sqlite file %s",(sqliteInput))
299 for f
in missedFolders:
302 msg.info(
"The following folders/tags are read from sqlite:")
303 for v
in sqliteFolders.items():
304 msg.info(
"\t"+
str(v))
311 "Block use of specified conditions DB folder so data can be read from elsewhere"
312 msg.info(
"Trying to remove folder [%s] from IOVDbSvc.Folders",folder)
313 iovdbsvc=ca.getService(
"IOVDbSvc")
314 oldLen=len(iovdbsvc.Folders)
315 iovdbsvc.Folders=[x
for x
in iovdbsvc.Folders
if x.find(folder)==-1]
316 newLen=len(iovdbsvc.Folders)
318 msg.warning(
"Folder [%s] not found in IOVDbSvc.Folder",folder)
320 elif (oldLen-newLen>1):
321 msg.warning(
"Folder string [%s] matched more than one folder, removed %i folders",folder,oldLen-newLen)
324 condInputLoader=ca.getCondAlgo(
"CondInputLoader")
325 condInputLoader.Load=
set([x
for x
in condInputLoader.Load
if x[1].
find(folder)==-1])
330 if __name__ ==
'__main__':
331 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
332 from AthenaConfiguration.TestDefaults
import defaultTestFiles
334 flags.Input.Files = defaultTestFiles.RAW_RUN2
339 with open(
'test.pkl',
'wb')
as f: