ATLAS Offline Software
MakeHierTags.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2 
3 #
4 # File: CaloClusterCorrection/python/MakeHierTags.py
5 # Created: Apr 2009, sss
6 # Purpose: Add hierarchical cluster correction tags to a COOL database.
7 #
8 # Construct with the database sqlite file and the top-level corrections
9 # class. Then call run(). Run takes an optional generation argument
10 # (the default is taken from the correction class).
11 #
12 # Example:
13 # from CaloClusterCorrection.CaloSwCorrections import CaloSwCorrections
14 # mh = MakeHierTags ('swcool.db', CaloSwCorrections)
15 # mh.run()
16 #
17 
18 from __future__ import print_function
19 
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
24 import sys
25 
26 
28  def __init__ (self, dbfile, corrtop, dryrun = False, domagic = True):
29  self.corrtop = corrtop
30  self.dryrun = dryrun
31  self.domagic = domagic
32  cool.DatabaseSvcFactory.databaseService()
33 
34  if dbfile.endswith ('.db'):
35  connstring = "sqlite://;schema=%s;dbname=OFLP200" % dbfile
36  self.makeleaf = True
37  else:
38  connstring = dbfile
39  self.makeleaf = False
40 
41  self.db=AtlCoolLib.indirectOpen(connstring,False,False,True)
42 
43  # List of all folders.
44  self.folders = []
45 
46  # Map from tool creation functions to folders.
47  self.funcmap = {}
48 
49  # Map from (folder, hier-tag) pairs to individual folder tags
50  self.tags = {}
51 
52  self.get_all_folders (corrtop)
53  return
54 
55 
56  def get_all_folders (self, corrtop):
57  ftmp = {}
58  for tooldesc in corrtop.versions['@']:
59  tool = tooldesc[0]('', source=[CALOCORR_COOL, CALOCORR_JO])
60  folder = None
61  try:
62  folder = tool.detStoreKey
63  if len(folder) > 0:
64  ftmp[folder] = 1
65  except AttributeError:
66  pass
67  self.funcmap[tooldesc[0]] = folder
68  self.folders = ftmp.keys()
69  return
70 
71 
72  def run (self, generation=None):
73  if generation is None:
74  generation = self.corrtop.correction_generation_default
75  if generation != '':
76  generation = generation + '-'
77 
78  for (version, toollist) in self.corrtop.versions.items():
79  if version[0] == '@': continue
80  self.make_tag (version, toollist, generation)
81 
82  if self.domagic:
83  self.make_magic (generation)
84  return
85 
86 
87  def make_tag (self, version, toollist, generation):
88  htag = None
89  for toolspec in toollist:
90  toolfunc = toolspec[0]
91  if len(toolspec) >= 2 and isinstance(toolspec[1], str):
92  toolversion = toolspec[1]
93  else:
94  toolversion = ''
95 
96  if toolfunc not in self.funcmap:
97  print ("WARNING: skipping tagging for tool", toolfunc.__name__)
98  continue
99  folder = self.funcmap[toolfunc]
100  if not folder: continue
101  (dum1, dum2, corrclass, basename) = folder.split ('/')
102 
103  htmp = corrclass + '-' + generation + version
104  if htag is None:
105  htag = htmp
106  print (htag)
107  else:
108  assert htag == htmp
109 
110  tag = corrclass + '.' + generation + basename
111  if len(toolversion) > 0:
112  tag = tag + '-' + toolversion
113 
114  self.set_tag (folder, tag, htag)
115 
116  if htag is None:
117  return
118 
119  for folder in self.folders:
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)
124  return
125 
126 
127  def make_magic (self, generation):
128  geom_strings = scrape_tags()
129  if self.makeleaf:
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)
134  for f in self.folders:
135  self.make_magic_target (f, g, vlist, generation)
136  print ("Made magic targets for", g)
137 
138  for f in self.folders:
139  (dum1, dum2, corrclass, basename) = f.split ('/')
140  magictag = 'TagInfo/' + corrclass + "." + generation + basename + \
141  '-/GeoAtlas'
142  toptag = corrclass + "-" + generation[:-1]
143  self.set_tag (f, magictag, toptag, False)
144  print ("Make magic", f)
145  return
146 
147 
148  def make_magic_target (self, folder, g, vlist, generation):
149  (dum1, dum2, corrclass, basename) = folder.split ('/')
150 
151  for v in vlist:
152  (func, toolversion, order, extra) = split_version_spec (v)
153  if self.funcmap.get(func) == folder:
154  break
155  else:
156  toolversion = 'dummy'
157 
158  src = corrclass + "." + generation + basename
159  if len(toolversion) > 0:
160  src = src + "-" + toolversion
161 
162  target = corrclass + "." + generation + basename + "-" + g
163 
164  self.copy_tag (folder, src, target)
165 
166  return
167 
168 
169  def copy_tag (self, folder, src, target):
170  if self.dryrun:
171  print ('--> Clone in', folder, src, '->', target)
172  return
173 
174  dbf = self.db.getFolder (folder)
175  objs = dbf.browseObjects (cool.ValidityKeyMin,
176  cool.ValidityKeyMax,
177  cool.ChannelSelection.all(),
178  src)
179  objlist=[]
180  while objs.goToNext():
181  objlist+=[objs.currentRef()]
182  if len(objlist) == 0:
183  print ("ERROR: No objects cloning tag %s in folder %s" %
184  (src, folder))
185  for obj in objlist:
186  dbf.storeObject (obj.since(),
187  obj.until(),
188  obj.payload(),
189  obj.channelId(),
190  target,
191  True)
192  dbf.setTagDescription (target, "Copied from " + src)
193  #print ("Cloned", folder, src, target)
194  return
195 
196 
197  def set_tag (self, folder, tag, htag, check = True):
198  if self.dryrun:
199  print ('--> Set htag in', folder, tag, htag)
200  return
201 
202  oldtag = self.tags.get ((folder, htag))
203  if oldtag is None:
204  self.tags[(folder,htag)] = tag
205  if not self.db.existsFolder(folder):
206  print ("ERROR: Folder %s doesn't exist" % folder)
207  sys.exit(1)
208  dbf = self.db.getFolder(folder)
209  if check:
210  if tag not in dbf.listTags():
211  print ("ERROR: Tag %s doesn't exist in folder %s"
212  % (tag,folder))
213  sys.exit(1)
214  try:
215  dbf.findTagRelation(htag) # will throw if htag doesn't exist
216  dbf.deleteTagRelation(htag)
217  except Exception:
218  pass
219  dbf.createTagRelation (htag, tag)
220  #print ('set_tag', folder, tag, htag)
221  else:
222  assert oldtag == tag, (tag, oldtag, folder, htag)
223  return
224 
225 
226 
229 
230 import urllib2
231 from HTMLParser import HTMLParser
232 
233 class Parser (HTMLParser):
234 
235  def __init__ (self, url):
236  HTMLParser.__init__ (self)
237  self.tags = []
238  self.feed (urllib2.urlopen(url).read())
239  self.close()
240  return
241 
242 
243  def handle_starttag (self, tag, attrs):
244  if tag != 'a': return
245  href = dict(attrs).get ('href')
246  if not href: return
247  ii = href.find ('?tag_name=')
248  if ii < 0: return
249  tag = href[ii + 10:]
250  self.tags.append (tag)
251  return
252 
254  p = Parser('https://twiki.cern.ch/twiki/bin/view/Atlas/AtlasGeomDBTags')
255  p.tags.sort()
256  return p.tags
read
IovVectorMap_t read(const Folder &theFolder, const SelectionCriterion &choice, const unsigned int limit=10)
Definition: openCoraCool.cxx:569
MakeHierTags.scrape_tags
def scrape_tags()
Definition: MakeHierTags.py:253
MakeHierTags.MakeHierTags.domagic
domagic
Definition: MakeHierTags.py:31
MakeHierTags.MakeHierTags.make_tag
def make_tag(self, version, toollist, generation)
Definition: MakeHierTags.py:87
MakeHierTags.MakeHierTags.make_magic
def make_magic(self, generation)
Definition: MakeHierTags.py:127
MakeHierTags.Parser.tags
tags
Definition: MakeHierTags.py:237
MakeHierTags.MakeHierTags.tags
tags
Definition: MakeHierTags.py:50
MakeHierTags.MakeHierTags.__init__
def __init__(self, dbfile, corrtop, dryrun=False, domagic=True)
Definition: MakeHierTags.py:28
MakeHierTags.MakeHierTags.set_tag
def set_tag(self, folder, tag, htag, check=True)
Definition: MakeHierTags.py:197
MakeHierTags.MakeHierTags.make_magic_target
def make_magic_target(self, folder, g, vlist, generation)
Definition: MakeHierTags.py:148
MakeHierTags.MakeHierTags.funcmap
funcmap
Definition: MakeHierTags.py:47
MakeHierTags.MakeHierTags.db
db
Definition: MakeHierTags.py:41
MakeHierTags.MakeHierTags.makeleaf
makeleaf
Definition: MakeHierTags.py:36
MakeHierTags.Parser.handle_starttag
def handle_starttag(self, tag, attrs)
Definition: MakeHierTags.py:243
MakeHierTags.MakeHierTags.dryrun
dryrun
Definition: MakeHierTags.py:30
MakeHierTags.MakeHierTags
Definition: MakeHierTags.py:27
MakeHierTags.MakeHierTags.copy_tag
def copy_tag(self, folder, src, target)
Definition: MakeHierTags.py:169
MakeHierTags.Parser.__init__
def __init__(self, url)
Definition: MakeHierTags.py:235
MakeHierTags.MakeHierTags.corrtop
corrtop
Definition: MakeHierTags.py:29
MakeHierTags.Parser
Definition: MakeHierTags.py:233
MakeHierTags.MakeHierTags.run
def run(self, generation=None)
Definition: MakeHierTags.py:72
get
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition: hcg.cxx:127
MakeHierTags.MakeHierTags.folders
folders
Definition: MakeHierTags.py:44
MakeHierTags.MakeHierTags.get_all_folders
def get_all_folders(self, corrtop)
Definition: MakeHierTags.py:56