CMS 3D CMS Logo

JSONExport.py
Go to the documentation of this file.
1 from __future__ import absolute_import
2 import sys
3 import os.path
4 import logging
5 import random
6 
8 import FWCore.ParameterSet.Config as cms
9 import FWCore.ParameterSet.Modules as mod
10 import FWCore.ParameterSet.Types as typ
11 import FWCore.ParameterSet.Mixins as mix
12 
13 from .Vispa.Plugins.ConfigEditor.ConfigDataAccessor import ConfigDataAccessor
14 from FWCore.GuiBrowsers.FileExportPlugin import FileExportPlugin
15 
17  option_types={}
18  plugin_name='JSON Export'
19  file_types=('html','json')
20  def __init__(self):
21  FileExportPlugin.__init__(self)
22 
23  def produce(self,data):
24 
25  #pset = lambda pdict: [[k,repr(v).split('(',1)[0],(repr(v).split('(',1)[1][:-1])] for k,v in pdict.items()]
26  def pset(pdict):
27  result = []
28  for k,v in pdict.items():
29  if v.pythonTypeName()=='cms.PSet' or v.pythonTypeName()=='cms.untracked.PSet':
30  result.append([k,v.pythonTypeName(),'pset',pset(v.parameters_())])
31  elif v.pythonTypeName()=='cms.VPSet' or v.pythonTypeName()=='cms.untracked.VPSet':
32  result.append([k,v.pythonTypeName(),'vpset',[pset(a.parameters_()) for a in v]])
33  elif v.pythonTypeName().lower().startswith('cms.v') or v.pythonTypeName().lower().startswith('cms.untracked.v'):
34  result.append([k,v.pythonTypeName(),'list',[repr(a) for a in v]])
35  else:
36  result.append([k,v.pythonTypeName(),'single',repr(v.pythonValue())])
37  return result
38 
39  #allObjects = [d for d in data._allObjects if (data.type(d) in ("EDProducer","EDFilter","EDAnalyzer","OutputModule"))]
40  #data.readConnections(allObjects)
41 
42  def moduledict(mod,prefix,links=False):
43  result={}
44  result['label']=data.label(mod)
45  result['class']=data.classname(mod)
46  result['file']=data.pypath(mod)
47  result['line']=data.lineNumber(mod)
48  result['package']=data.pypackage(mod)
49  result['pset']=pset(mod.parameters_())
50  result['type']=data.type(mod)
51  if links:
52  result['uses']=[data.uses(mod)]
53  result['usedby']=[data.usedBy(mod)]
54  result['id']='%s_%s'%(prefix,data.label(mod))
55  return result
56 
57  all={}
58  for tlo in data.topLevelObjects():
59  children=data.children(tlo)
60  if children:
61  all[tlo._label]=children
62 
63  process = {'name':data.process().name_(),'src':data._filename}
64 
65  #now unavailable
66  #schedule = []
67  #if 'Schedule' in all:
68  # for s in all['Schedule']:
69  # schedule.append(data.label(s))
70 
71  source={}
72  if 'source' in all:
73  s = all['source'][0]
74  source['class']=data.classname(s)
75  source['pset']=pset(s.parameters_())
76 
77  essources=[]
78  if 'essources' in all:
79  for e in all['essources']:
80  essources.append(moduledict(e,'essource'))
81  esproducers=[]
82  if 'esproducers' in all:
83  for e in all['esproducers']:
84  essources.append(moduledict(e,'esproducer'))
85  esprefers=[]
86  if 'esprefers' in all:
87  for e in all['esprefers']:
88  essources.append(moduledict(e,'esprefers'))
89  services=[]
90  if 'services' in all:
91  for s in all['services']:
92  services.append({'class':data.classname(s),'pset':pset(s.parameters_())})
93 
94 
95  def jsonPathRecursive(p,prefix):
96  #print "At:",self.label(p),self.type(p)
97  children = data.children(p)
98  if children:
99  children = [jsonPathRecursive(c,prefix) for c in children]
100  return {'type':'Sequence','label':'Sequence %s'%(data.label(p)),'id':'seq_%s' % data.label(p),'children':children}
101  else:
102  return moduledict(p,prefix,True)
103 
104 
105  paths=[]
106  if 'paths' in all:
107  for p in all['paths']:
108  path=jsonPathRecursive(p,data.label(p))
109  if path:
110  if not isinstance(path, type([])):
111  if path['type']=='Sequence':
112  path = path['children']
113  else:
114  path = [path]
115  else:
116  path=[]
117  paths.append({'label':data.label(p),'path':path})
118  endpaths=[]
119  if 'endpaths' in all:
120  for p in all['endpaths']:
121  path=jsonPathRecursive(p,data.label(p))
122  if path:
123  if not isinstance(path, type([])):
124  if path['type']=='Sequence':
125  path = path['children']
126  else:
127  path = [path]
128  else:
129  path=[]
130  endpaths.append({'label':data.label(p),'path':path})
131 
132  #json={'process':process,'schedule':schedule,'source':source,'essources':essources,'esproducers':esproducers,'esprefers':esprefers,'services':services,'paths':paths,'endpaths':endpaths}
133  json={'process':process,'source':source,'essources':essources,'esproducers':esproducers,'esprefers':esprefers,'services':services,'paths':paths,'endpaths':endpaths}
134 
135  return repr(json)
136 
137  def export(self,data,filename,filetype):
138  if not data.process():
139  raise "JSONExport requires a cms.Process object"
140 
141  json = self.produce(data)
142 
143  if filetype=='json':
144  jsonfile = open(filename,'w')
145  jsonfile.write(json)
146  jsonfile.close()
147  if filetype=='html':
148  #open the HTML template and inject the JSON...
149  pass
150 
def produce(self, data)
Definition: JSONExport.py:23
def export(self, data, filename, filetype)
Definition: JSONExport.py:137