7def extractFolderInfo(dbname,globaltag="",checkFolders=[],runnumber=cool.ValidityKeyMax>>32,selection=""):
8 dbSvc = cool.DatabaseSvcFactory.databaseService()
9 try:
10 db= dbSvc.openDatabase(dbname)
11 except Exception as e:
12 print ("Problems connecting to database:",e)
13 return None
14
15
16 sel=None
17 print (selection)
18 ss=selection.split(",")
19 for s in ss:
20 if len(s)==0:continue
21 idx=s.find(":")
22 if idx==-1:
23 c1=cool.ChannelId(int(s))
24 c2=c1
25 else:
26 c1=cool.ChannelId(int(s[:idx]))
27 c2=cool.ChannelId(int(s[1+idx:]))
28
29 if sel is None:
30 sel=cool.ChannelSelection(c1,c2,cool.ChannelSelection.sinceBeforeChannel)
31 else:
32 sel.addRange(c1,c2)
33
34 if sel is None:
35 print ("ExtractFolderInfo: No COOL channel selection given, work on all channels")
36 sel=cool.ChannelSelection.all()
37
38
39 folderInfoList=list()
40
41 nodelist=db.listAllNodes()
42 for fn in nodelist:
43 if not db.existsFolder(fn): continue
44 if len(checkFolders):
45 takeFolder=False
46 for cf in checkFolders:
47 if cf[-1] == "/": cf=cf[0:-1]
48 idx=len(cf)
49 pyfn=str(fn)
50 if pyfn.startswith(cf) and (idx>=len(pyfn) or pyfn[idx]=="/"):
51 takeFolder=True
52 break
53 if not takeFolder: continue
54
55 f=db.getFolder(fn)
56 print ("Analyzing",fn)
57
58
59
60
61 descr=str(f.description())
62 i1=descr.find("<typeName>")+len("<typeName>")
63 i2=descr.find("</typeName>",i1)
64 if (i1==-1 or i2==-1):
65 print ("ERROR could not get typename of object stored in folder",fn)
66 continue
67 typename=descr[i1:i2]
68
69
70 i1=descr.find("<key>")+len("<key>")
71 i2=descr.find("</key>",i1)
72 if (i1==-1 or i2==-1):
73 print ("ERROR could not get SG key of object stored in folder",fn)
74 continue
75 key=descr[i1:i2]
76
77
78
79
80 tagList=f.listTags()
81 if len(tagList)==0:
82 tagList=[""]
83 elif len(tagList)>1 and globaltag!="":
84 try:
85 tagList=[f.resolveTag(globaltag)]
86 except Exception:
87 print ("Hierachical tag", globaltag,"not defined in folder",fn)
88 return None
89
90 for t in tagList:
91 itr=f.findObjects(runnumber<<32,sel,t)
92 minIOV=cool.ValidityKeyMax>>32
93 maxIOV=cool.ValidityKeyMin>>32
94
95 while itr.goToNext():
96 obj=itr.currentRef()
97
98 since=obj.since()>>32
99 until=obj.until()>>32
100
101 if minIOV>since: minIOV=since
102 if maxIOV<until: maxIOV=until
103 itr.close()
104
105
106 folderinfo=(str(fn),typename,key,str(t),minIOV,maxIOV)
107 folderInfoList+=[folderinfo]
108
109 db.closeDatabase()
110 return folderInfoList
111
112
113
114
115
116
117