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

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

undated comp_mpi

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