CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
dataformats.py
Go to the documentation of this file.
1 
2 import cStringIO,operator
3 from functools import reduce
4 
5 def indent(rows, hasHeader=False, headerChar='-', delim=' | ', justify='left',
6  separateRows=False, prefix='', postfix='', wrapfunc=lambda x:x):
7  """Indents a table by column.
8  - rows: A sequence of sequences of items, one sequence per row.
9  - hasHeader: True if the first row consists of the columns' names.
10  - headerChar: Character to be used for the row separator line
11  (if hasHeader==True or separateRows==True).
12  - delim: The column delimiter.
13  - justify: Determines how are data justified in their column.
14  Valid values are 'left','right' and 'center'.
15  - separateRows: True if rows are to be separated by a line
16  of 'headerChar's.
17  - prefix: A string prepended to each printed row.
18  - postfix: A string appended to each printed row.
19  - wrapfunc: A function f(text) for wrapping text; each element in
20  the table is first wrapped by this function."""
21  # closure for breaking logical rows to physical, using wrapfunc
22  def rowWrapper(row):
23  newRows = [wrapfunc(item).split('\n') for item in row]
24  return [[substr or '' for substr in item] for item in map(None,*newRows)]
25  # break each logical row into one or more physical ones
26  logicalRows = [rowWrapper(row) for row in rows]
27  # columns of physical rows
28  columns = map(None,*reduce(operator.add,logicalRows))
29  # get the maximum of each column by the string length of its items
30  maxWidths = [max([len(str(item)) for item in column]) for column in columns]
31  rowSeparator = headerChar * (len(prefix) + len(postfix) + sum(maxWidths) + \
32  len(delim)*(len(maxWidths)-1))
33  # select the appropriate justify method
34  justify = {'center':str.center, 'right':str.rjust, 'left':str.ljust}[justify.lower()]
35  output=cStringIO.StringIO()
36  if separateRows: print >> output, rowSeparator
37  for physicalRows in logicalRows:
38  for row in physicalRows:
39  print >> output, \
40  prefix \
41  + delim.join([justify(str(item),width) for (item,width) in zip(row,maxWidths)]) \
42  + postfix
43  if separateRows or hasHeader: print >> output, rowSeparator; hasHeader=False
44  return output.getvalue()
45 
46 # written by Mike Brown
47 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/148061
48 def wrap_onspace(text, width):
49  """
50  A word-wrap function that preserves existing line breaks
51  and most spaces in the text. Expects that existing line
52  breaks are posix newlines (\n).
53  """
54  return reduce(lambda line, word, width=width: '%s%s%s' %
55  (line,
56  ' \n'[(len(line[line.rfind('\n')+1:])
57  + len(word.split('\n',1)[0]
58  ) >= width)],
59  word),
60  text.split(' ')
61  )
62 
63 import re
64 def wrap_onspace_strict(text, width):
65  """Similar to wrap_onspace, but enforces the width constraint:
66  words longer than width are split."""
67  wordRegex = re.compile(r'\S{'+str(width)+r',}')
68  return wrap_onspace(wordRegex.sub(lambda m: wrap_always(m.group(),width),text),width)
69 
70 import math
71 def wrap_always(text, width):
72  """A simple word-wrap function that wraps text on exactly width characters.
73  It doesn't split the text in words."""
74  return '\n'.join([ text[width*i:width*(i+1)] \
75  for i in xrange(int(math.ceil(1.*len(text)/width))) ])
76 
77 
78 
79 # END OF TABLE FORMATING
80 
81 # START of import
82 import sys
83 imported_modules = []
84 
85 def importDF(path):
86 
87  modules_to_import = "RecoTracker RecoLocalTracker RecoLocalCalo RecoEcal RecoEgamma RecoLocalMuon RecoMuon RecoJets RecoMET RecoBTag RecoTauTag RecoVertex RecoPixelVertexing HLTrigger RecoParticleFlow".split()
88  modules_to_import = "RecoLocalTracker RecoLocalMuon RecoLocalCalo RecoEcal TrackingTools RecoTracker RecoJets RecoMET RecoMuon RecoBTau RecoBTag RecoTauTag RecoVertex RecoPixelVertexing RecoEgamma RecoParticleFlow L1Trigger".split()
89 
90 
91  for module in modules_to_import:
92  m = module + "_dataformats"
93  try:
94  sys.path.append(path+"/src/Documentation/DataFormats/python/")
95 # sys.path.append(".")
96  globals()[m] = __import__(m)
97  imported_modules.append(m)
98  print "Searching in "+ module
99  except ImportError:
100  print "skipping", module
101 
102 # END of import
103 
104 
105 def search(query):
106  labels = ('Where(Package)', 'Instance', 'Container', 'Description')
107  width = 20
108  data = ""
109 
110  for module in imported_modules:
111  dict = vars(globals()[module])["json"]
112  for type in ["full", "reco", "aod"]:
113  for data_items in dict[type]['data']:
114  if query.lower() in data_items.__str__().lower() and not (("No documentation".lower()) in data_items.__str__().lower()):
115  data+= module.replace("_json", "")+" ("+ type.replace("full", "FEVT") + ")||" + "||".join(data_items.values())+"\n"
116 
117  if (data != ""):
118  rows = [row.strip().split('||') for row in data.splitlines()]
119  print indent([labels]+rows, hasHeader=True, separateRows=True, prefix='| ', postfix=' |', wrapfunc=lambda x: wrap_always(x,width))
120  else:
121  print "No documentation found"
122 
123 def help():
124  print "usage: dataformats pattern_to_search"
125  print "example: dataformats muon"
126  print "Note! multiple patterns separated by space are not supported"
127 
128 if __name__ == "__main__":
129 
130  if ("help" in sys.argv):
131  help()
132  sys.exit(0)
133 
134  if (len(sys.argv) > 2):
135  importDF(sys.argv[1])
136  print "\nSearching for: "+sys.argv[2]+"\n"
137  search(sys.argv[2])
138 
139  else:
140  help()
141 
142 
def wrap_onspace
Definition: dataformats.py:48
def wrap_always
Definition: dataformats.py:71
Definition: search.py:1
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def wrap_onspace_strict
Definition: dataformats.py:64
double split
Definition: MVATrainer.cc:139