CMS 3D CMS Logo

class-composition.py
Go to the documentation of this file.
1 #! /usr/bin/env python3
2 from __future__ import print_function
3 import networkx as nx
4 import re
5 stdcl = re.compile("^std::(.*)[^>]$")
6 stdptr = re.compile("(.*)_ptr$")
7 datacl = re.compile("^class ")
8 bfunc = re.compile("^function ")
9 mbcl = re.compile("(base|data) class")
10 farg = re.compile(r"(.*)\(\w+\)")
11 nsep = re.compile(r"\:\:")
12 topfunc = re.compile(
13  r"::(produce|analyze|filter|beginLuminosityBlock|beginRun|beginStream)\(")
14 baseclass = re.compile(
15  "edm::(one::|stream::|global::)?ED(Producer|Filter|Analyzer)(Base)?")
16 getfunc = re.compile(
17  r"edm::eventsetup::EventSetupRecord::get<.*>\((.*)&\) const")
18 handle = re.compile("(.*),?class edm::ES(.*)Handle<(.*)>")
19 statics = set()
20 toplevelfuncs = set()
21 onefuncs = set()
22 dataclassfuncs = set()
23 virtfuncs = set()
24 virtclasses = set()
25 badfuncs = set()
26 badclasses = set()
27 esdclasses = set()
28 dataclasses = set()
29 flaggedclasses = set()
30 memberclasses = set()
31 derivedclasses = set()
32 
33 Gdg = nx.DiGraph()
34 Hdg = nx.DiGraph()
35 Idg = nx.DiGraph()
36 
37 
38 f = open('classes.txt.dumperall')
39 for line in f:
40  if mbcl.search(line):
41  fields = line.split("'")
42  if fields[2] == ' member data class ':
43  if not stdcl.search(fields[2]):
44  Hdg.add_edge(fields[1], fields[3], kind=fields[2])
45  if fields[2] == ' templated member data class ':
46  Hdg.add_edge(fields[1], fields[5], kind=fields[3])
47  if fields[2] == ' base class ':
48  Hdg.add_edge(fields[1], fields[3], kind=fields[2])
49  Idg.add_edge(fields[3], fields[1], kind=' derived class')
50 f.close()
51 
52 f = open('function-calls-db.txt')
53 
54 for line in f:
55  if not bfunc.search(line):
56  continue
57  fields = line.split("'")
58  if fields[2] == ' calls function ':
59  Gdg.add_edge(fields[1], fields[3], kind=' calls function ')
60  if getfunc.search(fields[3]):
61  dataclassfuncs.add(fields[3])
62  m = getfunc.match(fields[3])
63  n = handle.match(m.group(1))
64  if n:
65  o = n.group(3)
66  else:
67  o = m.group(1)
68  p = re.sub("class ", "", o)
69  dataclass = re.sub("struct ", "", p)
70  dataclasses.add(dataclass)
71  if fields[2] == ' overrides function ':
72  if baseclass.search(fields[3]):
73  Gdg.add_edge(fields[1], fields[3], kind=' overrides function ')
74  if topfunc.search(fields[3]):
75  toplevelfuncs.add(fields[1])
76  else:
77  Gdg.add_edge(fields[3], fields[1], kind=' calls override function ')
78  if fields[2] == ' static variable ':
79  Gdg.add_edge(fields[1], fields[3], kind=' static variable ')
80  statics.add(fields[3])
81 f.close()
82 
83 visited = set()
84 nodes = sorted(dataclasses)
85 for node in nodes:
86  if node in visited:
87  continue
88  visited.add(node)
89  if node in Hdg:
90  stack = [(node, iter(Hdg[node]))]
91  if node in Idg:
92  Qdg = nx.dfs_preorder_nodes(Idg, node)
93  for q in Qdg:
94  print("class '"+q+"'")
95  if q in Hdg:
96  stack.append((q, iter(Hdg[q])))
97  while stack:
98  parent, children = stack[-1]
99  print("class '"+parent+"'")
100  try:
101  child = next(children)
102  if child not in visited:
103  visited.add(child)
104  if not stdcl.search(child):
105  print("class '"+child+"'")
106  stack.append((child, iter(Hdg[child])))
107  kind = Hdg[parent][child]['kind']
108  print(parent, kind, child)
109  if stdptr.search(kind):
110  if child in Idg:
111  Qdg = nx.dfs_preorder_nodes(Idg, child)
112  for q in Qdg:
113  print("class '"+q+"'")
114  if q in Hdg:
115  stack.append((q, iter(Hdg[q])))
116  except StopIteration:
117  stack.pop()
print
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:46
GetRecoTauVFromDQM_MC_cff.next
next
Definition: GetRecoTauVFromDQM_MC_cff.py:31