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

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

fixed bug in summary.py

Line 
1
2import string, sys, glob, os
3import collections
4
5HERE = os.path.dirname(__file__)
6if HERE == '':
7  HERE = '.'
8print '############################ %s' % HERE
9
10NT_esn = collections.namedtuple( 'errorShortName', ['name', 'long_name', 'description' ] )
11class errorShortNames(object):
12
13  def __init__(self,file='config/testStandardNames.txt' ):
14    assert os.path.isfile(file), 'File %s not found' % file
15    ii = map( string.strip, open(file).readlines() )
16    ll = [[ii[0],]]
17    for l in ii[1:]:
18      if len(l) > 0 and l[0] == '=':
19        ll.append( [l,] )
20      else:
21        ll[-1].append( l )
22    self.ll = []
23    for l in ll:
24      if len(l) < 2:
25        print l
26      else:
27        self.ll.append( NT_esn( string.strip(l[0],'='), l[1][1:], string.join(l[2:]) ) )
28
29def cmin(x,y):
30  if x < 0:
31        return y
32  else:
33    return min(x,y)
34
35class main(object):
36
37  def __init__(self):
38    args = sys.argv[1:-1]
39    idir = sys.argv[-1]
40    ndisp = 2
41    dohtml = False
42    while len(args) > 0:
43      x = args.pop(0)
44      if x == '-n':
45        ndisp = int( args.pop(0) )
46      elif x == '-html':
47        dohtml = True
48
49    fl = glob.glob( '%s/*__qclog_*.txt' % idir )
50    fb = glob.glob( '%s/qcBatchLog*' % idir )
51    fb.sort()
52    fb = fb[-1]
53    ii = open( fb )
54    jj = []
55    for k in range(10):
56      jj.append( string.strip(ii.readline()) )
57    ii.close()
58    i0 = jj[0].index( ' INFO ' )
59    tstart = jj[0][:i0]
60    m1 = jj[0][i0+6:]
61    m2 = jj[1][i0+6:]
62    self.info = (tstart, m1, m2)
63##2014-09-06 18:42:24,109 INFO Starting batch -- number of file: 338
64##2014-09-06 18:42:24,109 INFO Source: /data/work/cordex/early/AFR-44i/SMHI/ECMWF-ERAINT/evaluation//.....
65
66    ee = {}
67    self.write( 'Summarising error reports from %s log file' % len(fl) )
68    nne = 0
69    nerr = 0
70    ff = {}
71    for f in fl:
72      nef = 0
73      elist = []
74      for l in open(f).readlines():
75        fn = string.split(f,'/')[-1]
76        if (l[:3] == 'C4.' and string.find(l, 'FAILED') != -1) or string.find(l,'CDMSError:') != -1:
77          nef += 1
78          nerr += 1
79          bits = map( string.strip, string.split(l, ':' ) )
80          if 'FAILED' in bits:
81             kb1 = bits.index('FAILED') + 1
82          else:
83             kb1 = 1
84          if len(bits) > kb1:
85            code = bits[0]
86            if kb1 == 3:
87              msg0 = string.join(bits[kb1:], ':' )
88              msg = string.strip( bits[1] + ' ' + msg0 )
89              se = bits[1][1:-1]
90            else:
91              msg = string.strip( string.join(bits[kb1:], ':' ) )
92              msg0 = msg
93              se = None
94            if code not in ee.keys():
95              ee[code] = [0,{msg:[0,[]]},se]
96            elif msg not in ee[code][1].keys():
97              ee[code][1][msg] = [0,[]]
98            ee[code][0] += 1
99            ee[code][1][msg][0] += 1
100            if ee[code][1][msg][0]:
101              ee[code][1][msg][1].append(fn)
102            elist.append( (code,msg,se) )
103          else:
104            self.write( str(bits) )
105      if nef == 0:
106        nne += 1
107      else:
108        ff[fn] = elist
109
110    keys = ee.keys()
111    keys.sort()
112
113    for k in keys:
114      ks = ee[k][1].keys()
115      if len(ks) == 1:
116        self.write( '%s%s  %s' % (k,ee[k][0],ks[0]) )
117        for i in range(cmin(ndisp,ee[k][0])):
118          self.write( '               %s' % ee[k][1][ks[0]][1][i] )
119      else:
120        self.write( '%s: %s' % (k,ee[k][0])  )
121        ks.sort()
122        for k2 in ks:
123          self.write( '  --- %s: %s' % (k2,ee[k][1][k2][0]) )
124          for i in range(cmin(ndisp,ee[k][1][k2][0])):
125            self.write( '               %s' % ee[k][1][k2][1][i] )
126
127    self.write( 'Number of files with no errors: %s' % nne )
128    esum = (len(fl), nerr, nne )
129    self.testnames()
130    if dohtml:
131      self.htmlout( ee, ff, esum )
132      self.htmlEsn( )
133
134  def testnames(self):
135    tnfile = '%s/config/testStandardNames.txt' % HERE
136    ii = open( tnfile ).readlines()
137    self.tests = []
138    thistest = None
139    for l in ii:
140      if l[0] == '=':
141        name = string.strip(l)[1:-1]
142        if thistest != None:
143          thistest.append(defn)
144          self.tests.append( thistest )
145        thistest = [name,]
146        defn = ''
147      elif l[0] == '*':
148        thistest.append( string.strip(l)[1:] )
149      elif string.strip(l) != '':
150        defn += l
151    thistest.append(defn)
152    self.tests.append( thistest )
153    self.testdict = {}
154    for t in self.tests:
155      self.testdict[t[0]] = (t[1],t[2])
156   
157  def write( self, s ):
158    print s
159
160  def htmlEsn( self ):
161    esn = errorShortNames()
162    cnt = '<h1>Error Short Names</h1>\n'
163    for l in esn.ll:
164      cnt += '''<a name="%s"><h2>%s</h2></a>
165            <p><i>%s</i><br/>
166             %s
167             </p>
168             ''' % (l.name,l.name, l.long_name, l.description )
169   
170    self.__htmlPageWrite( 'html/ref/errorShortNames.html', cnt )
171
172  def htmlout( self, ee, ff, esum ):
173    if not os.path.isdir( 'html' ):
174      os.mkdir( 'html' )
175      os.mkdir( 'html/ref' )
176      os.mkdir( 'html/files' )
177      os.mkdir( 'html/errors' )
178    about = """<p>Output from CEDA CC</p>
179<p>This report contains a list of errors for each file, and a list of files associated with each error.</p>
180"""
181    data = """<p>%s<br/>
182     %s<br/>
183     Start of checks: %s</p>
184""" % (self.info[1], self.info[2], self.info[0] )
185    results = """<ul><li>Number of files tested: %s: <a href="files/findex.html">index by file</a></li>
186                     <li>Number of errors: %s: <a href="errors/eindex.html">index by error</a></li>
187                     <li>Number of error free files: %s</li></ul>
188""" % esum
189
190    keys = ee.keys()
191    keys.sort()
192    list = []
193    for k in keys:
194      if ee[k][2] == None:
195        list.append( '<li>%s: %s</li>' % (k,ee[k][0]) )
196      else:
197        assert ee[k][2] in self.testdict.keys(), 'unrecognised test name: %s' % ee[k][2]
198        list.append( '<li>%s [%s:%s]: %s</li>' % (self.testdict[ee[k][2]][0],k,ee[k][2],ee[k][0]) )
199    res2 = '<ul>%s</ul>' % string.join(list, '\n' )
200    results += res2
201
202    maincontent = """<h1>The test</h1>
203                         %s
204                     <h1>The data</h1>
205                         %s
206                     <h1>Results</h1>
207                         %s
208""" % (about,data,results)
209    self.__htmlPageWrite( 'html/index.html', maincontent )
210
211    keys = ee.keys()
212    keys.sort()
213
214    eItemTmpl = '<li><a href="rep.%3.3i.html">%s [%s]</a>: %s</li>'
215    list = []
216    nn = 0
217    for k in keys:
218      ks = ee[k][1].keys()
219      ks.sort()
220      sect_esn = None
221      for k2 in ks:
222        nn += 1
223        this_esn = string.split(k2,']')[0][1:]
224        if this_esn != sect_esn:
225          sect_esn = this_esn
226          list.append( '<h2>%s: %s<a href="../ref/errorShortNames.html#%s">(definition)</a></h2>' % (k,this_esn, this_esn) )
227        list.append( eItemTmpl % (nn,k, ee[k][1][k2][0], k2  ) )
228        l2 = []
229        for ss in ee[k][1][k2][1]:
230            i0 = string.index( ss, '__qclog' )
231            fs = ss[:i0]
232            l2.append( '<li><a href="../files/rep.%s.html">%s</a></li>' % (fs,fs) )
233        ePage = """<h1>Error %s </h1> %s <ul>%s</ul> """ % (nn,k2,string.join( l2, '\n' ) )
234        efp = 'html/errors/rep.%3.3i.html' % nn
235        self.__htmlPageWrite( efp, ePage )
236    eIndexContent = """<h1>List of detected errors</h1>
237<p>Code[number of files with error]: result <br/>
238Click on the code to see a list of the files in which each error is detected.
239</p>
240<ul>%s</ul>
241"""  % (string.join(list, '\n' ) )
242    self.__htmlPageWrite( 'html/errors/eindex.html', eIndexContent )
243
244    keys = ff.keys()
245    keys.sort()
246    fItemTmpl = '<li><a href="%s">%s [%s]</a></li>'
247    list = []
248    for k in ff:
249      i0 = string.index( k, '__qclog' )
250      fs = k[:i0]
251      knc = fs + '.nc'
252      hfn = 'rep.%s.html' % fs
253      hfp = 'html/files/%s' % hfn
254      list.append( fItemTmpl % (hfn, knc, len(ff[k]) ) )
255      l2 = []
256      for f in ff[k]:
257        l2.append( '<li>%s: %s</li>' % f[:2] )
258      fPage = """<h1>Errors in %s.nc</h1>
259<ul>%s</ul>
260""" % (fs,string.join( l2, '\n' ) )
261      self.__htmlPageWrite( hfp, fPage )
262    list.sort()
263    fIndexContent = """<h1>List of files with errors</h1>
264        File name [number of errors]
265<ul> %s </ul>
266"""  % string.join( list, '\n' )
267    self.__htmlPageWrite( 'html/files/findex.html', fIndexContent )
268
269
270  def __htmlPageWrite(self, pp, content):
271    ptmpl = """<html><body>%s</body></html>"""
272    oo = open( pp, 'w' )
273    oo.write( ptmpl % content )
274    oo.close()
275
276if __name__ == '__main__':
277  main()
Note: See TracBrowser for help on using the repository browser.