10 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
11 from AthenaConfiguration.ComponentFactory
import CompFactory
12 from AthenaCommon.Logging
import logging
13 from fnmatch
import fnmatchcase
15 from CaloClusterCorrection.poolfiles
import poolfiles
17 from CaloClusterCorrection.constants
import \
18 CALOCORR_JO, CALOCORR_POOL, CALOCORR_COOL, \
19 CALOCORR_NOPOOL, CALOCORR_TOPOOL, CALOCORR_DEFAULT_KEY, \
129 if ii < len(cspec)
and isinstance (cspec[ii], str):
132 if ii < len(cspec)
and isinstance (cspec[ii], int):
135 extra_args = cspec[ii:]
136 return (func, version, order, extra_args)
142 if coolTag ==
'GLOBAL':
143 coolTag = flags.IOVDb.GlobalTag
146 folderset =
"/CALO/Ofl/" + corrclass
147 connstring =
'COOLOFL_CALO/OFLP200'
149 folderset =
"/CALO/" + corrclass
150 connstring =
'COOLONL_CALO/' + flags.IOVDb.DatabaseInstance
152 from CoolConvUtilities
import AtlCoolLib
153 db = AtlCoolLib.indirectOpen (connstring, readOnly=
True)
154 ff = db.getFolderSet (folderset)
155 t = ff.resolveTag (coolTag)
158 return '-'.join (l[4:])
202 log = logging.getLogger (
'CaloClusterCorrection')
211 v = getattr (flags.Calo.ClusterCorrection, self.version_override_flag_name)
219 geom = flags.GeoModel.AtlasVersion
220 datasource =
'geant4' if flags.Input.isMC
else 'data'
221 (version, tryhier) = self.
geom_match (datasource, geom)
228 source = flags.Calo.ClusterCorrection.defaultSource
230 if not isinstance (source, list):
232 if CALOCORR_COOL
not in source:
235 if tryhier
and version[0] !=
'@':
238 cl = cl[0:4] +
'Ofl' + cl[4:]
239 version =
"@%s-%s%s" % (cl, generation, version)
244 if version[0] !=
'@' and len(source) > 0:
245 if CALOCORR_COOL
in source:
246 source.remove (CALOCORR_COOL)
248 (vcorrlist, version) = self.
lookup_version (flags, version, corrclass)
254 log.debug (
"%s corrections for %s (%s) using version %s" %
255 (self.name, key, suffix, version))
260 for cspec
in corrlist:
261 (func, this_version, this_order, extra_args) = \
262 split_version_spec (cspec)
266 if this_version ==
'' or extra_args == []:
267 for vcspec
in vcorrlist:
268 if vcspec[0] == func:
269 (vfunc, vversion, vorder, vextra_args) = \
270 split_version_spec (vcspec)
271 if this_version ==
'':
272 this_version = vversion
274 extra_args = vextra_args
279 elif version[0] ==
'@' and not corrlist:
280 this_version = version
282 if this_version ==
'@':
283 this_version = version
286 this_args = dict (extra_args)
289 this_cells_name = cells_name
292 corrname = func.__name__
295 for (k, v)
in kw.items():
296 if k == corrname +
'_suffix':
298 elif k == corrname +
'_key':
300 elif k == corrname +
'_cells_name':
302 elif k == corrname +
'_source':
304 elif k == corrname +
'_version':
306 elif k == corrname +
'_order':
308 elif k.startswith (corrname +
'_'):
309 this_args[k[len(corrname)+1:]] = v
318 generation = generation,
321 tools.append (out.popToolsAndMerge (ca))
323 out.setPrivateTools (tools)
331 vcorrlist = self.versions.get (version)
332 if vcorrlist
is None and version.startswith (
'@'):
333 findvers = _find_version_from_cool_tag (flags, version[1:], corrclass)
334 vcorrlist = self.versions.get (findvers)
335 if vcorrlist
is None:
336 vcorrlist = self.versions.get (
'@')
337 if vcorrlist
is None:
338 raise CaloCorrectionConfigError\
339 (
"Can't find global correction version %s." % version)
340 return (vcorrlist, version)
345 for (pat, v)
in self.geom_versions:
346 if fnmatchcase (geom, pat):
350 if not geom: geom =
''
355 vv = self.newest_version
357 if vv.startswith (
'NOHIER#'):
366 generation = cls.correction_generation_default
367 gen2 = getattr (flags.Calo.ClusterCorrection, cls.correction_generation_flag_name)
371 generation = generation +
'-'
394 for (v,l)
in self.versions.
items():
395 if v.startswith (
'@'):
continue
397 last_funcname =
'(none)'
400 (func, version, order, extra_args) = split_version_spec (c)
401 if order <= last_order:
402 raise CaloCorrectionConfigError\
403 (
"Tools for global version %s are not in order!"
404 " %d(%s) < %d(%s)" % (v, order, func.__name__,
405 last_order, last_funcname))
407 last_funcname = func.__name__
411 okey = (func, version)
412 if okey
not in ordermap:
413 ordermap[okey] = (order, v)
414 elif ordermap[okey][0] != order:
415 raise CaloCorrectionConfigError\
416 (
"Tool %s has order %d in %s but order %d in %s!" %
417 (func.__name__, order, v,
418 ordermap[okey][0], ordermap[okey][1]))
421 valid_keys = func (flags,
425 if valid_keys
is None:
427 for key
in valid_keys:
434 tools.append (ca.popPrivateTools())
437 result.setPrivateTools (tools)
439 return (sgkeys, result)
443 sgkeys, tool_names, key, cspec,
445 (func, version, order, extra_args) = split_version_spec (cspec)
446 name = func.__name__ +
'_' + version +
'_' + key
447 if name
in tool_names:
450 None,
'', version, key, CALOCORR_TOPOOL,
455 tool = ca.popPrivateTools()
456 if tool
is not None and folder(tool).find (
'/' + corrclass +
'/') >= 0:
457 tool_names.add (name)
458 sgkeys.setdefault (
sgkey(tool), []).append (tool)
459 ca.setPrivateTools (tool)
465 CaloDummyCorrection = CompFactory.CaloDummyCorrection
467 for sgkey
in sgkeys.keys():
468 ll = sgkey.split (
'-')
474 for name
in toolnames.keys():
475 (corrclass, basename) = name.split (
'.')
476 sgkey = name +
'-dummy'
477 tagname =
"%s.%s%s-dummy" % (corrclass, generation, basename)
478 folder =
'/CALO/%s/%s' % (corrclass, basename)
480 for key
in valid_keys:
481 toolname = basename + key +
'-dummy'
482 tool = CaloDummyCorrection (toolname)
483 tool.prefix = key +
'.'
484 sgkeys[sgkey].append (tool)
485 _alltools[toolname] = (folder, tagname, sgkey)
493 corr_output_list = []
498 (sgkeys, ca) = self.
make_ForPool (flags, keys, corrclass)
503 for (sgkey, tools)
in sgkeys.items():
504 if len (tools) == 0:
continue
505 name =
'write_' + sgkey
506 name = name.replace (
'.',
'_')
509 alg = CompFactory.CaloClusterCorrDBWriter (name,
511 ClusterCorrectionTools = tools)
512 result.addEventAlgo (alg)
515 corr_output_list.append (
'CaloRec::ToolConstants#' +
518 tag_list.append (tag (tools[0]))
520 print (
"Final OutputList:")
521 print (corr_output_list)
524 return (corr_output_list, tag_list, result)
661 version = versions[-1][0]
668 if version.startswith (
'@'):
677 raise CaloCorrectionConfigError \
678 (
"Can't find version `%s' for correction named `%s'." %
687 if key ==
'@VALID_KEYS':
692 source = flags.Calo.ClusterCorrection.defaultSource
695 nopool = CALOCORR_NOPOOL
in v[2]
698 if nopool
and source == CALOCORR_TOPOOL:
702 if version.startswith (
'@'):
704 if version ==
'@GLOBAL':
707 fulltag = version[1:]
711 source = CALOCORR_COOL
716 tmp = tmp +
"-" + version
717 sgkey =
"%s.%s" % (corrclass, tmp)
718 fulltag =
"%s.%s%s" % (corrclass, generation, tmp)
720 fulltag = fulltag[0:4] +
'Ofl' + fulltag[4:]
723 if not flags.Input.isMC:
724 folder =
"/CALO/%s/%s" % (corrclass, basename)
726 folder =
"/CALO/Ofl/%s/%s" % (corrclass, basename)
729 prefix = key + sampnames[sampling] +
"."
734 name = name + sampnames[sampling]
739 vv = vv.split(
'-')[-1]
740 name = name +
"_" + vv
742 name = name +
"_" + key
745 if suffix
is not None:
749 if name
in _alltools:
750 if _alltools[name] != (folder, fulltag, sgkey):
751 raise CaloCorrectionConfigError (
752 "Inconsistent configuration of tool %s. Old (folder,tag,sgkey)=%s; new=%s" %
753 (name, _alltools[name], (folder, fulltag, sgkey)))
755 _alltools[name] = (folder, fulltag, sgkey)
758 if confclass
is None:
762 if isinstance (confclass, dict)
and sampling
is not None:
763 confclass = confclass[sampling]
768 corr = confclass (name)
775 if not isinstance (source, list):
780 if s == CALOCORR_JO
or s == CALOCORR_TOPOOL:
781 sel = [x
for x
in avail
if _is_jo_source (x)]
783 sampling , valid_keys,
788 elif s == CALOCORR_POOL:
789 sel = [x
for x
in avail
if _is_pool_source (x)]
791 ca2 = _config_from_pool (flags, corr, sel[0], sgkey)
794 _mung_prefix (corr, key, valid_keys)
798 elif s == CALOCORR_COOL:
799 sel = [x
for x
in avail
if _is_cool_source (x)]
801 ca2 = _config_from_cool (flags, corr, folder, fulltag)
804 _mung_prefix (corr, key, valid_keys)
808 elif _is_jo_source (s):
809 if _config_from_jo (corr, s, key, sampling, valid_keys, order):
813 elif _is_pool_source (s):
814 ca2 = _config_from_pool (flags, corr, s, sgkey)
817 _mung_prefix (corr, key, valid_keys)
821 if wherefrom
is None:
822 raise CaloCorrectionConfigError \
823 (
"Can't find any source to configure tool `%s'. Sources: %s" %
826 log = logging.getLogger (
'CaloClusterCorrection')
827 log.debug (
" correction %s (%s, from %s)" % (name, confclass.__name__,
832 for (k, val)
in kw.items():
834 setattr (corr, k, val)
837 result.setPrivateTools (corr)
843 if s == CALOCORR_COOL:
return 0
844 if s == CALOCORR_POOL:
return 0
845 if s
in poolfiles:
return 0
846 if s.find (
'.') > 0:
return 1
852 return s
in poolfiles
857 return s == CALOCORR_COOL
865 modname =
'.'.join (xjo[:-1])
869 if modname.find (
'.') < 0:
870 modname =
'CaloClusterCorrection.' + modname
873 mod = __import__ (modname, globals(), locals(), [paramclass])
874 parms = getattr (mod, paramclass)
877 if isinstance (parms, dict)
and sampling
is not None:
878 parms = parms[sampling]
880 if order != 0
and hasattr (corr,
'order'):
882 if hasattr (corr,
'isDummy'):
885 log = logging.getLogger (
'CaloClusterCorrection')
888 for (k, val)
in parms.__dict__.items():
900 default_keys = parms.__dict__.get (
'_default_keys')
902 defkey = _longest_match (key, default_keys)
904 defkey = _longest_match (key, valid_keys)
906 defkey = CALOCORR_DEFAULT_KEY
909 log.debug (
" correction %s from JO using %s instead of %s" %
910 (corr.getName(), defkey, key))
916 setattr (corr, k, val)
922 if not poolfile
or not poolfiles[poolfile]:
929 if poolfile
not in _poolfiles_seen:
930 from EventSelectorAthenaPool.CondProxyProviderConfig
import CondProxyProviderCfg
931 ca.merge (CondProxyProviderCfg (flags, [poolfiles[poolfile]]))
934 corr.DBHandleKey = sgkey
938 ToolConstantsCondAlg = CompFactory.ToolConstantsCondAlg
940 name =
'ToolConstantsCondAlg_' + sgkey.replace (
'.',
'_')
941 alg = ToolConstantsCondAlg (name,
943 ToolConstantsKey = sgkey)
952 fsplit = folder.split (
'/')
953 if fsplit[2] ==
'Ofl':
954 corrclass = folder.split (
'/')[4]
956 corrclass = folder.split (
'/')[3]
957 sndict = flags.Calo.ClusterCorrection.dbSubdetName
958 subdetname = sndict.get (corrclass)
960 subdetname = sndict.get (
None)
962 corr.DBHandleKey = folder
965 oldtag = _folders_used.get (folder)
966 if oldtag
is not None and oldtag != tag:
971 _folders_used[folder] = tag
973 from IOVDbSvc.IOVDbSvcConfig
import addFolders
974 tagstr =
'' if tag ==
'@GLOBAL' else tag
975 sdsuffix =
'_OFL' if 'Ofl' in folder
else ''
976 ca.merge (addFolders (flags,
978 detDb = subdetname + sdsuffix,
979 className =
'CaloRec::ToolConstants',
982 log = logging.getLogger (
'CaloClusterCorrection')
983 log.debug (
"Adding cool folder `%s' for subdetector name %s" %
984 (folder, subdetname))
993 while i < len(a)
and i < len(b)
and a[i] == b[i]:
997 if not isinstance (valid_keys, list):
998 valid_keys = [valid_keys]
999 if valid_keys
is None or key
in valid_keys:
1001 new_key = valid_keys[0]
1002 for k
in valid_keys[1:]:
1003 if _matchlen (key, k) > _matchlen (key, new_key):
1007 if valid_keys
is None or key
in valid_keys:
return
1010 new_key = _longest_match (key, valid_keys)
1012 new_prefix = new_key + corr.prefix[len(key):]
1013 corr.prefix = new_prefix
1018 return _alltools[tool.getName()][0]
1023 return _alltools[tool.getName()][1]
1028 return _alltools[tool.getName()][2]