18 from __future__
import print_function
20 from PyCool
import cool
21 import CoolConvUtilities.AtlCoolLib
as AtlCoolLib
22 from CaloClusterCorrection.constants
import CALOCORR_COOL, CALOCORR_JO
23 from CaloClusterCorrection.common
import split_version_spec
28 def __init__ (self, dbfile, corrtop, dryrun = False, domagic = True):
32 cool.DatabaseSvcFactory.databaseService()
34 if dbfile.endswith (
'.db'):
35 connstring =
"sqlite://;schema=%s;dbname=OFLP200" % dbfile
41 self.
db=AtlCoolLib.indirectOpen(connstring,
False,
False,
True)
58 for tooldesc
in corrtop.versions[
'@']:
59 tool = tooldesc[0](
'', source=[CALOCORR_COOL, CALOCORR_JO])
62 folder = tool.detStoreKey
65 except AttributeError:
67 self.
funcmap[tooldesc[0]] = folder
72 def run (self, generation=None):
73 if generation
is None:
74 generation = self.
corrtop.correction_generation_default
76 generation = generation +
'-'
78 for (version, toollist)
in self.
corrtop.versions.items():
79 if version[0] ==
'@':
continue
80 self.
make_tag (version, toollist, generation)
87 def make_tag (self, version, toollist, generation):
89 for toolspec
in toollist:
90 toolfunc = toolspec[0]
91 if len(toolspec) >= 2
and isinstance(toolspec[1], str):
92 toolversion = toolspec[1]
96 if toolfunc
not in self.
funcmap:
97 print (
"WARNING: skipping tagging for tool", toolfunc.__name__)
100 if not folder:
continue
101 (dum1, dum2, corrclass, basename) = folder.split (
'/')
103 htmp = corrclass +
'-' + generation + version
110 tag = corrclass +
'.' + generation + basename
111 if len(toolversion) > 0:
112 tag = tag +
'-' + toolversion
114 self.
set_tag (folder, tag, htag)
120 if (folder, htag)
not in self.
tags:
121 (dum1, dum2, corrclass, basename) = folder.split (
'/')
122 tag = corrclass +
'.' + generation + basename +
'-dummy'
123 self.
set_tag (folder, tag, htag)
130 for g
in geom_strings:
131 (globver, tryhier) = self.
corrtop.geom_match(
'MakeHierTags', g)
132 if globver[0] ==
'@':
continue
133 (vlist, version) = self.
corrtop.lookup_version (globver,
None)
136 print (
"Made magic targets for", g)
139 (dum1, dum2, corrclass, basename) = f.split (
'/')
140 magictag =
'TagInfo/' + corrclass +
"." + generation + basename + \
142 toptag = corrclass +
"-" + generation[:-1]
143 self.
set_tag (f, magictag, toptag,
False)
144 print (
"Make magic", f)
149 (dum1, dum2, corrclass, basename) = folder.split (
'/')
152 (func, toolversion, order, extra) = split_version_spec (v)
156 toolversion =
'dummy'
158 src = corrclass +
"." + generation + basename
159 if len(toolversion) > 0:
160 src = src +
"-" + toolversion
162 target = corrclass +
"." + generation + basename +
"-" + g
171 print (
'--> Clone in', folder, src,
'->', target)
174 dbf = self.
db.getFolder (folder)
175 objs = dbf.browseObjects (cool.ValidityKeyMin,
177 cool.ChannelSelection.all(),
180 while objs.goToNext():
181 objlist+=[objs.currentRef()]
182 if len(objlist) == 0:
183 print (
"ERROR: No objects cloning tag %s in folder %s" %
186 dbf.storeObject (obj.since(),
192 dbf.setTagDescription (target,
"Copied from " + src)
197 def set_tag (self, folder, tag, htag, check = True):
199 print (
'--> Set htag in', folder, tag, htag)
202 oldtag = self.
tags.get ((folder, htag))
204 self.
tags[(folder,htag)] = tag
205 if not self.
db.existsFolder(folder):
206 print (
"ERROR: Folder %s doesn't exist" % folder)
208 dbf = self.
db.getFolder(folder)
210 if tag
not in dbf.listTags():
211 print (
"ERROR: Tag %s doesn't exist in folder %s"
215 dbf.findTagRelation(htag)
216 dbf.deleteTagRelation(htag)
219 dbf.createTagRelation (htag, tag)
222 assert oldtag == tag, (tag, oldtag, folder, htag)
231 from HTMLParser
import HTMLParser
236 HTMLParser.__init__ (self)
238 self.feed (urllib2.urlopen(url).
read())
244 if tag !=
'a':
return
245 href = dict(attrs).get (
'href')
247 ii = href.find (
'?tag_name=')
250 self.
tags.append (tag)
254 p =
Parser(
'https://twiki.cern.ch/twiki/bin/view/Atlas/AtlasGeomDBTags')