source: CCCC/trunk/ceda_cc/summary.py @ 193

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CCCC/trunk/ceda_cc/summary.py@193
Revision 193, 6.4 KB checked in by mjuckes, 6 years ago (diff)

brought branches-mnj back to trunk

Line 
1
2import string, sys, glob, os
3
4HERE = os.path.dirname(__file__)
5if HERE == '':
6  HERE = '.'
7print '############################ %s' % HERE
8
9def cmin(x,y):
10  if x < 0:
11        return y
12  else:
13    return min(x,y)
14
15class main(object):
16
17  def __init__(self):
18    args = sys.argv[1:-1]
19    idir = sys.argv[-1]
20    ndisp = 2
21    dohtml = False
22    while len(args) > 0:
23      x = args.pop(0)
24      if x == '-n':
25        ndisp = int( args.pop(0) )
26      elif x == '-html':
27        dohtml = True
28
29    fl = glob.glob( '%s/*__qclog_*.txt' % idir )
30
31    ee = {}
32    self.write( 'Summarising error reports from %s log file' % len(fl) )
33    nne = 0
34    nerr = 0
35    ff = {}
36    for f in fl:
37      nef = 0
38      elist = []
39      for l in open(f).readlines():
40        fn = string.split(f,'/')[-1]
41        if (l[:3] == 'C4.' and string.find(l, 'FAILED') != -1) or string.find(l,'CDMSError:') != -1:
42          nef += 1
43          nerr += 1
44          bits = map( string.strip, string.split(l, ':' ) )
45          if 'FAILED' in bits:
46             kb1 = bits.index('FAILED') + 1
47          else:
48             kb1 = 1
49          if len(bits) > kb1:
50            code = bits[0]
51            if kb1 == 3:
52              msg0 = string.join(bits[kb1:], ':' )
53              msg = string.strip( bits[1] + ' ' + msg0 )
54              se = bits[1][1:-1]
55            else:
56              msg = string.strip( string.join(bits[kb1:], ':' ) )
57              msg0 = msg
58              se = None
59            if code not in ee.keys():
60              ee[code] = [0,{msg:[0,[]]},se]
61            elif msg not in ee[code][1].keys():
62              ee[code][1][msg] = [0,[]]
63            ee[code][0] += 1
64            ee[code][1][msg][0] += 1
65            if ee[code][1][msg][0]:
66              ee[code][1][msg][1].append(fn)
67            elist.append( (code,msg,se) )
68          else:
69            self.write( str(bits) )
70      if nef == 0:
71        nne += 1
72      else:
73        ff[fn] = elist
74
75    keys = ee.keys()
76    keys.sort()
77
78    for k in keys:
79      ks = ee[k][1].keys()
80      if len(ks) == 1:
81        self.write( '%s%s  %s' % (k,ee[k][0],ks[0]) )
82        for i in range(cmin(ndisp,ee[k][0])):
83          self.write( '               %s' % ee[k][1][ks[0]][1][i] )
84      else:
85        self.write( '%s: %s' % (k,ee[k][0])  )
86        ks.sort()
87        for k2 in ks:
88          self.write( '  --- %s: %s' % (k2,ee[k][1][k2][0]) )
89          for i in range(cmin(ndisp,ee[k][1][k2][0])):
90            self.write( '               %s' % ee[k][1][k2][1][i] )
91
92    self.write( 'Number of files with no errors: %s' % nne )
93    esum = (len(fl), nerr, nne )
94    self.testnames()
95    if dohtml:
96      self.htmlout( ee, ff, esum )
97
98  def testnames(self):
99    tnfile = '%s/config/testStandardNames.txt' % HERE
100    ii = open( tnfile ).readlines()
101    self.tests = []
102    thistest = None
103    for l in ii:
104      if l[0] == '=':
105        name = string.strip(l)[1:-1]
106        if thistest != None:
107          thistest.append(defn)
108          self.tests.append( thistest )
109        thistest = [name,]
110        defn = ''
111      elif l[0] == '*':
112        thistest.append( string.strip(l)[1:] )
113      elif string.strip(l) != '':
114        defn += l
115    thistest.append(defn)
116    self.tests.append( thistest )
117    self.testdict = {}
118    for t in self.tests:
119      self.testdict[t[0]] = (t[1],t[2])
120   
121  def write( self, s ):
122    print s
123
124  def htmlout( self, ee, ff, esum ):
125    if not os.path.isdir( 'html' ):
126      os.mkdir( 'html' )
127      os.mkdir( 'html/files' )
128      os.mkdir( 'html/errors' )
129    about = """<p>Output from CEDA CC</p>
130<p>This report contains a list of errors for each file, and a list of files associated with each error.</p>
131"""
132    data = """<p>Demonstration using test data</p>
133"""
134    results = """<ul><li>Number of files tested: %s: <a href="files/findex.html">index by file</a></li>
135                     <li>Number of errors: %s: <a href="errors/eindex.html">index by error</a></li>
136                     <li>Number of error free files: %s</li></ul>
137""" % esum
138
139    keys = ee.keys()
140    keys.sort()
141    list = []
142    for k in keys:
143      if ee[k][2] == None:
144        list.append( '<li>%s: %s</li>' % (k,ee[k][0]) )
145      else:
146        assert ee[k][2] in self.testdict.keys(), 'unrecognised test name: %s' % ee[k][2]
147        list.append( '<li>%s [%s:%s]: %s</li>' % (self.testdict[ee[k][2]][0],k,ee[k][2],ee[k][0]) )
148    res2 = '<ul>%s</ul>' % string.join(list, '\n' )
149    results += res2
150
151    maincontent = """<h1>The test</h1>
152                         %s
153                     <h1>The data</h1>
154                         %s
155                     <h1>Results</h1>
156                         %s
157""" % (about,data,results)
158    self.__htmlPageWrite( 'html/index.html', maincontent )
159
160    keys = ee.keys()
161    keys.sort()
162
163    eItemTmpl = '<li><a href="rep.%3.3i.html">%s [%s]</a>: %s</li>'
164    list = []
165    nn = 0
166    for k in keys:
167      ks = ee[k][1].keys()
168      ks.sort()
169      for k2 in ks:
170        nn += 1
171        list.append( eItemTmpl % (nn,k, ee[k][1][k2][0], k2  ) )
172        l2 = []
173        for ss in ee[k][1][k2][1]:
174            i0 = string.index( ss, '__qclog' )
175            fs = ss[:i0]
176            l2.append( '<li><a href="../files/rep.%s.html">%s</a></li>' % (fs,fs) )
177        ePage = """<h1>Error %s </h1> %s <ul>%s</ul> """ % (nn,k2,string.join( l2, '\n' ) )
178        efp = 'html/errors/rep.%3.3i.html' % nn
179        self.__htmlPageWrite( efp, ePage )
180    eIndexContent = """<h1>List of detected errors</h1>
181Code[number of files with error]: result
182<ul>%s</ul>
183"""  % (string.join(list, '\n' ) )
184    self.__htmlPageWrite( 'html/errors/eindex.html', eIndexContent )
185
186    keys = ff.keys()
187    keys.sort()
188    fItemTmpl = '<li><a href="%s">%s [%s]</a></li>'
189    list = []
190    for k in ff:
191      i0 = string.index( k, '__qclog' )
192      fs = k[:i0]
193      knc = fs + '.nc'
194      hfn = 'rep.%s.html' % fs
195      hfp = 'html/files/%s' % hfn
196      list.append( fItemTmpl % (hfn, knc, len(ff[k]) ) )
197      l2 = []
198      for f in ff[k]:
199        l2.append( '<li>%s: %s</li>' % f[:2] )
200      fPage = """<h1>Errors in %s.nc</h1>
201<ul>%s</ul>
202""" % (fs,string.join( l2, '\n' ) )
203      self.__htmlPageWrite( hfp, fPage )
204    list.sort()
205    fIndexContent = """<h1>List of files with errors</h1>
206        File name [number of errors]
207<ul> %s </ul>
208"""  % string.join( list, '\n' )
209    self.__htmlPageWrite( 'html/files/findex.html', fIndexContent )
210
211
212  def __htmlPageWrite(self, pp, content):
213    ptmpl = """<html><body>%s</body></html>"""
214    oo = open( pp, 'w' )
215    oo.write( ptmpl % content )
216    oo.close()
217
218if __name__ == '__main__':
219  main()
Note: See TracBrowser for help on using the repository browser.