source: CCCC/tags/1.2.5/ceda_cc/summary.py @ 223

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CCCC/tags/1.2.5/ceda_cc/summary.py@1241
Revision 223, 8.4 KB checked in by mjuckes, 5 years ago (diff)

summary.py: Unhelpful response to bad arguments corrected (existence of target directory checked)

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