source: CMIP6dreqbuild/trunk/src/framework/audit.py @ 979

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/audit.py@980
Revision 979, 23.1 KB checked in by mjuckes, 3 years ago (diff)

01.00.07

Line 
1
2from dreqPy import dreq
3from dreqPy import misc_utils
4from ingest import mipTab
5import cmchecl
6import collections, sys, os
7realms = [
8        "aerosol",
9        "atmos",
10        "atmosChem",
11        "land",
12        "landIce",
13        "ocean",
14        "ocnBgchem",
15        "seaIce"
16    ]
17
18python2 = True
19if sys.version_info[0] == 3:
20  python2 = False
21
22if len(sys.argv) > 1:
23  lname = sys.argv[1]
24else:
25  lname = 'audit'
26logFarm = misc_utils.dreqLog(dir='logs')
27log = logFarm.getLog(lname)
28
29class c1(object):
30  def __init__(self):
31    self.a = collections.defaultdict( list )
32
33class checkUnits(object):
34
35  def __init__(self, cc, extra=None):
36    assert python2, 'The checkUnits module requires cf, which is not available in python 3'
37    import cf
38    if extra != None:
39      for k in sorted( extra.keys() ):
40        try:
41          a = cf.units.Units( k )
42        except:
43          log.warn( 'WARN.001.0004: bad units %s (%s)' % (k,str(extra[k])) )
44
45    for k in sorted( cc.keys() ):
46      try:
47        a = cf.units.Units( k )
48      except:
49        log.warn( 'Bad CF units: %s' % k )
50        a = None
51
52      if a != None:
53        for k2 in cc[k].a:
54          try:
55            b = cf.units.Units( k2 )
56          except:
57            b = None
58            log.warn( 'WARN.001.0003: unit invalid : %s .... %s: %s' % (k,k2,str( cc[k].a[k2]) ) )
59          if b != None and not a.equivalent(b):
60            log.warn( 'WARN.001.0002: unit mismatch: %s .... %s: %s' % (k,k2,str( cc[k].a[k2]) ) )
61
62def splitStr( s ):
63  if s == '':
64    return ['']
65  if s.find( ' ') == -1:
66    return [s,]
67  return s.split()
68
69class checkDims(object):
70
71  def __init__(self, dq):
72    """Generate list of used dimensions in ss;
73       Check against defined dimenions [todo]"""
74    ss = set()
75    self.cellm = set()
76    cc = collections.defaultdict(list)
77    duds = ('', '****', '?',)
78    for i in dq.coll['spatialShape'].items:
79      if i.dimensions != '':
80        for x in i.dimensions.split( '|' ):
81          if x in duds:
82            cc[x].append( i.uid )
83          else:
84            ss.add(x)
85    for i in dq.coll['temporalShape'].items:
86      if i.dimensions != '':
87        for x in i.dimensions.split( '|' ):
88          if x in duds:
89            cc[x].append( i.uid )
90          else:
91            ss.add(x)
92    for i in dq.coll['structure'].items:
93      self.cellm.add( i.cell_methods )
94      if i.odims != '':
95        for x in i.odims.split( ' ' ):
96          if x in duds:
97            cc[x].append( i.uid )
98          else:
99            ss.add(x)
100      if i.coords != '':
101        for x in i.coords.split( ' ' ):
102          if x in duds:
103            cc[x].append( i.uid )
104          else:
105            ss.add(x)
106
107    cellm = sorted( list( self.cellm ) )
108    for c in cellm:
109      log.info( 'cell_methods\t %s' % c )
110    log.info( str( sorted( list(ss) ) ) )
111    ll = set( [i.label for i in dq.coll['grids'].items] )
112    for x in ss:
113      if x not in ll:
114        log.error( 'ERROR: dimension not found: %s' % x )
115
116class auditor(object):
117  def __init__(self,dq):
118    self.dq = dq
119    self.run()
120
121  def run(self):
122    self.loadDraftNewVar()
123    self.audit_var()
124    self.audit_sn()
125    self.audit_cmv()
126    self.audit_rqv()
127    self.audit_rql()
128    self.audit_rqg()
129    self.audit_str()
130    self.audit_cm()
131
132  def audit_cm(self):
133    log.info( 'Running Cell Methods Audit' )
134    cc = cmchecl.check_cm()
135    nf = 0
136    for i in self.dq.coll['cellMethods'].items:
137      res = cc.test( i.cell_methods )
138      if not res:
139         log.error( 'ERROR.cm.00001: cannot parse cell methods: "%s" [%s]' % (i.cell_methods,i.label) )
140         nf += 1
141    if nf == 0:
142       log.info( 'INFO.cm.00001: all cell methods strings parsed by cmchecl' )
143
144    l1 = [i for i in self.dq.coll['structure'].items if i.cell_methods == ""]
145    ss = set()
146    if len( l1 ) > 0:
147      log.error( 'ERROR.cm.00010: %s blank cell methods in structure records: ' % len(l1) )
148      for i in l1:
149        log.error( 'ERROR.cm.00011: %s: %s' % ( i.label, i.title )  )
150    for i in l1:
151      if 'CMORvar' in self.dq.inx.iref_by_sect[i.uid].a:
152        for u in dq.inx.iref_by_sect[i.uid].a['CMORvar']:
153           ss.add(u)
154    if len(ss) > 0:
155      log.error( 'ERROR.cm.00020: %s CMOR vars affected ' % len(ss) )
156      for u in ss:
157        cmv = dq.inx.uid[u]
158        log.error( 'ERROR.cm.00021: Invalid cell methods: %s, %s, %s [%s]' % (cmv.label, cmv.title, cmv.mipTable, cmv.prov) )
159
160  def audit_var(self):
161    cc = collections.defaultdict( list )
162    ss = collections.defaultdict( c1 )
163    ssx = collections.defaultdict( set )
164    umap = { 'Wm-2':'W m-2', 'string':''}
165    for i in self.dq.coll['var'].items:
166      cc[i.label].append(i)
167      isn = self.dq.inx.uid[i.sn]
168      if isn._h.label != 'remarks':
169        u = umap.get( isn.units, isn.units )
170        ss[u].a[i.units].append( i.label )
171      else:
172        ssx[i.units].add( i.label )
173
174    ii = [k for k in cc if len(cc[k]) > 1]
175    log.warn( 'var.0001: %48s [%s]: %s' % ('Duplicate variable names',len( self.dq.coll['var'].items ),len(ii)) )
176    showDupVar=False
177    showDupVar=True
178    showDupVarBrief=False
179    if showDupVar:
180      for i in ii:
181        log.info(  '----- %s -----' % i )
182        for x in cc[i]:
183          log.info( '%s, %s, %s, %s' % ( x.label,x.title,x.sn,x.prov ))
184    elif showDupVarBrief:
185      lg.info( str( ii ))
186    self.cc = cc
187
188    if not python2:
189      log.warn( 'Skipping the units check .. not available in python3' )
190    else:
191      checkUnits( ss, extra=ssx )
192   
193  def audit_str(self):
194    nms = 0
195    ss = set()
196    cc = collections.defaultdict( list )
197    for i in self.dq.coll['structure'].items:
198      cc[ (i.spid, i.tmid,i.odims,i.coords,i.cmid) ].append( i )
199      if i.cmid != '__unset__' and self.dq.inx.uid[i.cmid]._h.label == 'remarks' and i.cell_methods != '':
200        ss.add(i.cmid)
201        nms += 1
202    if nms > 0:
203      log.error( 'str.00010: missing cell methods records for %s records (%s)' % (nms, len(ss) ) )
204      log.error( 'str.00011: %s' % str( sorted(list(ss)) ) )
205    else:
206      log.info( 'str.00010: all structure methods have valid cmid' )
207
208    ks = [k for k in cc if len(cc[k]) > 1]
209    log.info( 'str.00020: count of repeated space/time structure: %s' % len(ks) )
210    if len(ks) > 0:
211      oo = open( 'structureRepeats.csv', 'w' )
212      for k in ks:
213        oo.write( '\t'.join( ['NEXT', k[0], k[1], k[2], k[3], self.dq.inx.uid[k[0]].label, self.dq.inx.uid[k[1]].label] ) + '\n' )
214        for i in cc[k]:
215          oo.write( '\t'.join( ['+',i.uid, i.label, i.title, i.odims, i.coords, i.cell_methods, i.cell_measures, i.flag_meanings, i.spid ] ) + '\n' )
216      oo.close()
217
218  def saveRevisedNewVar(self,ll):
219    oo = open( 'revised_newvars.csv', 'w' )
220    for v in sorted( list( ll ) ):
221      oo.write( self.draftNewVar[v] )
222    oo.close()
223
224  def loadDraftNewVar(self):
225    self.draftNewVar = {}
226    for f in ['draft_newvars.csv','draft_newvars02.csv']:
227      ii = open( f, 'r' ).readlines()
228      ss = set()
229      for l in ii:
230        r = l.split( '\t' )
231        vn = r[0].strip()
232        assert vn not in ss, 'Duplicate variable name in %s: %s' % (f,vn)
233        ss.add(vn)
234        if vn in self.draftNewVar:
235          log.info( 'INFO.newvar.0001:  overwriting new var: %s' % vn )
236        self.draftNewVar[vn] = l
237   
238  def audit_cmv(self):
239    zmtabs = ['AERmonZ', 'E6hrZ', 'EdayZ', 'EmonZ']
240    mipt = mipTab.mipt()
241    zmtabsi = [mipt.invmap[x] for x in zmtabs]
242    ccmv = collections.defaultdict( list )
243    ccmv2 = collections.defaultdict( list )
244    ccmv4 = collections.defaultdict( list )
245    ccmv6 = collections.defaultdict( list )
246    ccp = collections.defaultdict( set )
247
248    cmlk = {}
249    zmstr = set()
250    for i in self.dq.coll['structure'].items:
251      cmlk[i.uid] = i.cell_methods
252      if i.cell_methods.find( 'longitude: mean' ) != -1 or i.cell_methods.find( 'global: mean' ):
253        zmstr.add( i.uid )
254    print 'ZMSTR', zmstr
255     
256##
257## check that vars in AERmonZ, E6hrZ, EdayZ, EmonZ have cell_methods with longitude mean.
258##
259    nms = 0
260    ss = set()
261    badRealm = set()
262    badRealmNames = set()
263 
264    hasHeight = set( ['tas','uas','vas','huss','hurs','sfcwind','sfcwindMax','tasmax','tasmin','tasmaxCrop','tasminCrop','tasLut','hussLut'] )
265    chh = collections.defaultdict( set )
266
267    badzm = set()
268    badzmt = set()
269    spidmap = {'XY-AH':'XY-A/AH','XY-A':'XY-A/AH'}
270    for i in self.dq.coll['CMORvar'].items:
271      if i.mipTable in zmtabsi and (i.stid not in zmstr):
272        badzm.add( i.uid )
273        badzmt.add( i.mipTable )
274        log.error( 'cmv.00121: bad zonal mean variable: %s.%s, %s, %s, %s, %s' % (i.mipTable, i.label,i.uid, i.prov, i.stid, cmlk[i.stid]) )
275
276      ccp[ i.label ].add( i.positive )
277      ccmv[i.label].append(i)
278      ccmv4[ (i.frequency,i.label,i.stid)].append(i)
279      ccmv2[ (i.mipTable,i.label)].append(i)
280      if i.stid not in self.dq.inx.uid or self.dq.inx.uid[i.stid]._h.label == 'remarks':
281        ss.add( i.stid )
282        nms += 1
283      else:
284        st = self.dq.inx.uid[i.stid]
285        sp = self.dq.inx.uid[st.spid]
286        ccmv6[ (i.frequency,i.label,spidmap.get(sp.label,sp.label),st.tmid)].append((i,st))
287        if i.label in hasHeight:
288           if st.coords.find( 'height' ) == -1:
289             chh[ i.label ].add( i.uid )
290
291      for rr in i.modeling_realm.split():
292        if rr not in realms:
293          badRealm.add( (i.mipTable, i.label ) )
294          badRealmNames.add( (i.modeling_realm,rr) )
295    kkp = [k for k in ccp if len(ccp[k]) > 1]
296    if len(kkp) > 0:
297       log.error( 'cmv.00170: bad positive attributes: %s, %s' % (len( kkp ),str(kkp)) )
298    else:
299       log.info( 'cmv.00170: positive attributes OK' )
300
301    if len( chh ) > 0:
302       log.error( 'cmv.04170: near surface field without height coord: %s' % (len(chh) ) )
303       for k in sorted( list( chh.keys() ) ):
304         log.error( 'cmv.04171: without height coord: %s: %s' % (k,len(chh[k]) ) )
305    else:
306       log.info( 'cmv.04170: near surface fields OK (wrt height coord)' )
307         
308    if len( badzm ) > 0:
309       log.error( 'cmv.00120: bad zonal mean variables: %s, %s' % (len( badzm ),str(badzmt)) )
310    if len( badRealm ) > 0:
311      log.error( 'cmv.00030: bad modeling realms set in %s cmv records' % len( badRealm ) )
312      log.error( 'cmv.00031: bad modeling realms: %s' % str( sorted( list( badRealmNames) ) ) )
313      cc1 = collections.defaultdict( list )
314      for tab, lab in badRealm:
315        cc1[tab].append(lab)
316      for tab in sorted( cc1.keys() ):
317        log.error( 'cmv.00032: table %s: %s' % (tab,str(sorted(cc1[tab]))) )
318    else:
319      log.info( 'cmv.00030: modeling realms set ok cmv records' )
320
321    if nms > 0:
322      log.error( 'cmv.00010: missing variable structures for %s CMORvar records, bad stids: %s' % (nms,len(ss)) )
323      log.error( 'cmv.00011: bad stids: %s' % str( sorted( list( ss ) ) ) )
324    else:
325      log.info( 'cmv.00010: variable structures for all CMORvar records present' )
326
327    ii0 = [i for i in self.dq.coll['CMORvar'].items if i.mipTable == '']
328    if len(ii0) > 0:
329      log.error( 'cmv.00020: %48s [%s]: %s' % ('Empty MIP table in CMORvar',len(self.dq.coll['CMORvar'].items),len(ii0)) )
330    else:
331      log.info( 'cmv.00020: all CMORvar records have mip table defined' )
332
333    ii = [i for i in self.dq.coll['CMORvar'].items if self.dq.inx.uid[i.vid]._h.label == 'remarks']
334    if len(ii) == 0:
335      log.info( 'cmv.00200: all CMORvar records have valid vid' )
336    else:
337      ii1 = [i for i in ii if 'requestVar' in self.dq.inx.iref_by_sect[i.uid].a]
338      log.error( 'cmv.00200: %48s [%s]: %s (requested: %s)' % ('CMORvar records with bad vid',len(self.dq.coll['CMORvar'].items),len(ii),len(ii1)) )
339
340      iix2 = []
341      iix3 = []
342      for i in ii1:
343        ok = False
344        ok3 = False
345        for u in self.dq.inx.iref_by_sect[i.uid].a['requestVar']:
346          vg = self.dq.inx.uid[ self.dq.inx.uid[u].vgid ]
347          if vg._h.label != 'remarks':
348           ok = True
349           iix2.append(i)
350           if 'requestLink' in self.dq.inx.iref_by_sect[vg.uid].a:
351             iix3.append(i)
352      log.error( 'cmv.0021: of these: valid requestVarGroup: %s; valid requestLink(s): %s' %  (len(iix2),len(iix3)) )
353      rnv = set()
354      for i in iix3:
355        if i.label in self.draftNewVar:
356          log.error( 'cmv.0125: %s, %s, %s' % (i.uid,i.label,i.title) )
357          rnv.add( i.label )
358        else:
359          log.error( 'cmv.0122: %s, %s, %s' % (i.uid,i.label,i.title) )
360
361      if len( rnv ) > 0:
362        self.saveRevisedNewVar( rnv )
363       
364         
365    ii2 = [k for k in ccmv2 if len(ccmv2[k]) > 1]
366    if len(ii2) == 0:
367      log.info( 'cmv.0030: unique CMOR variable names OK' )
368    else:
369      log.error( 'cmv.0030: non-unique CMOR variable naming for %s records' % len(ii2) )
370      log.error( 'cmv.0031: %s' % str(ii2) )
371
372    ii4 = [k for k in ccmv4 if len(ccmv4[k]) > 1]
373    ii6 = [k for k in ccmv6 if len(ccmv6[k]) > 1]
374    ii4b = list()
375    ii6b = list()
376    for k in ii4:
377      if len(ccmv4[k]) == 2 and set( [i.mipTable[-3:] for i in ccmv4[k]] ) == set(['Ant','Gre']):
378        pass
379      else:
380        ii4b.append(k)
381
382    for k in ii6:
383      if len(ccmv6[k]) == 2 and set( [i.mipTable[-3:] for i,s in ccmv6[k]] ) == set(['Ant','Gre']):
384        pass
385      else:
386        ii6b.append(k)
387
388    if len(ii4b) == 0:
389      log.info( 'cmv.0040: unique CMOR variable usage [4] OK' )
390    else:
391      log.error( 'cmv.0040: non-unique CMOR variable usage possible for %s records' % len(ii4b) )
392      log.error( 'cmv.0041: %s' % str(ii4b) )
393      kk=0
394      oo = open( 'cmv_probDuplication.csv', 'w' )
395      for k in ii4b:
396        kk += 1
397        rec = ('NEXT\t%s\t' % kk ) + str( '\t'.join( k ) )
398        print 'INFO.cmvdup.00001: ',rec
399        oo.write( rec + '\n' )
400        vid = None
401        for i in ccmv4[k]:
402          assert vid == None or i.vid == vid, 'Unexpected vid variation ...: %s%s %s' % (i.label, i.vid, vid)
403          vid = i.vid
404          rec = '+\t%s\t%s\t%s\t%s\t%s' % (i.uid,i.mipTable,i.title,i.description,i.prov)
405          oo.write( rec + '\n' )
406          print 'INFO.cmvdup.00001: ',rec
407      oo.close()
408
409    if len(ii6b) == 0:
410      log.info( 'cmv.0060: unique CMOR variable usage [6] OK' )
411    else:
412      log.info( 'cmv.0060: unique CMOR variable issues [6] %s ' % len(ii6b) )
413      kk=0
414      ccx = collections.defaultdict( set )
415      for k in ii6b:
416        ss = set()
417        freq,label,spid,tmid = k
418        for i,st in ccmv6[k]:
419          ss.add( (st.uid,st.label,st.title) )
420        tt = tuple( sorted( list( ss ) ) )
421        ccx[tt].add( (freq,label) )
422      log.info( 'cmv.0061: unique CMOR variable issues [6.1] %s ' % len(ccx.keys()) )
423      for tt in ccx:
424        ll = [t[2] for t in tt]
425        log.info( 'cmv.0062: unique CMOR variable issues [6.2] %s: %s ' % ('; '.join(ll),str(ccx[tt]) ) )
426       
427      oo = open( 'cmv_probDuplication6.csv', 'w' )
428      for k in ii6b:
429        kk += 1
430        rec = ('NEXT\t%s\t' % kk ) + str( '\t'.join( k ) )
431        oo.write( rec + '\n' )
432        vid = None
433        for i,st in ccmv6[k]:
434          assert vid == None or i.vid == vid, 'Unexpected vid variation ...: %s%s %s' % (i.label, i.vid, vid)
435          vid = i.vid
436          rec = '+\t%s\t%s\t%s\t%s\t%s\t%s' % (i.uid,i.mipTable,i.title,st.title,i.description,i.prov)
437          oo.write( rec + '\n' )
438      oo.close()
439
440    ccmv3 = collections.defaultdict( list )
441    for t in ccmv2:
442      s = set()
443      for i in ccmv2[t]:
444        id = i.uid
445        if 'varRelLnk' in self.dq.inx.iref_by_sect[id].a:
446          for x in self.dq.inx.iref_by_sect[id].a['varRelLnk']:
447            s.add( x )
448      s = list(s)
449      if len(s) > 0:
450        ccmv3[t] = s
451
452    ii5 = [k for k in ii2 if k not in ccmv3 or len(ccmv2[k]) > len(ccmv3[k])]
453    cc4 = collections.defaultdict( list )
454    for t,v in ii2:
455      cc4[t].append( v )
456
457    log.warn( '%48s [%s]: %s [%s tables]' % ('Duplicate variables in CMORvar',len(self.dq.coll['CMORvar'].items),len(ii2), len( cc4.keys() ) ) )
458    showAllCmvErrors=False
459    showAllCmvErrors=True
460    if showAllCmvErrors:
461       rats = ['uid','label','title','description','frequency','mipTable','stid','prov','provNote']
462       oocm = open( 'cmvDup.csv', 'w' )
463       c1 = collections.defaultdict( list )
464       ##for i in ii2:
465         ##c1[i.prov].append( i.label )
466       ##log.warn( 'No MIP var: %s ... %s' % (str( sorted( [i.label for i in ii if i.label in self.cc] ) ), str(c1)))
467       for k in sorted( cc4.keys() ):
468         log.warn(  '%16s::  %s' % (k,str(sorted(cc4[k]))) )
469         for v in sorted(cc4[k]):
470             sv = set()
471             for i in ccmv2[ (k,v) ]:
472                sv.add(i.vid)
473
474             if len(list(sv)) == 1:
475               vun = True
476               vv = self.dq.inx.uid[ list(sv)[0] ]
477               oocm.write( '@VAR:\t\t\t%s\t%s\t%s\n' % (vv.label,vv.title,vv.description) )
478             else:
479               vun = False
480
481             for i in ccmv2[ (k,v) ]:
482                stt = self.dq.inx.uid[i.stid].title
483                if 'Temporal mean' in stt:
484                   if i.frequency == '3hr':
485                     i.title += ' [3 hour mean]'
486                xtra = ''
487                oocm.write( '\t\t' + '\t'.join( [str(i.__dict__[x]) for x in rats] ) + '\t%s%s\n' % (stt,xtra) )
488                if not vun:
489                  vv = self.dq.inx.uid[i.vid]
490                  xtra = '\t\t\t\t%s\t%s\t%s\n' % (vv.label,vv.title,vv.description)
491                  oocm.write(xtra)
492             oocm.write( '####\n' )
493       oocm.close()
494    t2_ii = ii[:]
495    self.ccmv = ccmv
496
497  def audit_sn(self):
498    cc = collections.defaultdict( list )
499    cc2 = collections.defaultdict( int )
500    cc3 = collections.defaultdict( dict )
501    nrem = 0
502    snm = set()
503    snmm = collections.defaultdict( int )
504    for i in self.dq.coll['var'].items:
505      if 'CMORvar' in self.dq.inx.iref_by_sect[i.uid].a:
506        srq = set()
507        for u in self.dq.inx.iref_by_sect[i.uid].a['CMORvar']:
508          if 'requestVar' in self.dq.inx.iref_by_sect[u].a:
509            for uu in self.dq.inx.iref_by_sect[u].a['requestVar']:
510              rqv = self.dq.inx.uid[uu]
511              srq.add( rqv.priority )
512        if len(srq) > 0:
513          pm = min( srq )
514           
515          kk = i.sn
516          if self.dq.inx.uid[kk]._h.label == 'remarks':
517            nrem += 1
518            snm.add(kk)
519           ## if pm == 1:
520            print 'MISSING STANDARD NAME: ',i.label, i.title, i.sn, i.provmip
521            snmm[pm] += 1
522            cc2[i.provmip] += 1
523            cc3[i.provmip][i.label]=(i.title,i.sn)
524          if i.procnote != []:
525            ll = sorted( i.procnote )
526            kk += ':' + '|'.join(ll )
527          cc[kk].append( i.uid )
528
529    log.warn( 'sn.001: Number of missing standard names: %s [for %s variables] {%s}' % (len(snm),nrem,str(snmm)) )
530    log.warn( 'sn.002: Number of missing standard names by MIP: %s ' % (str(cc2)) )
531    ll = []
532    for k in cc:
533      if len( cc[k] ) > 1:
534        ll.append( k )
535    oo = open( 'audit_sn_errors.csv', 'w' )
536    for k in sorted(cc3.keys()):
537      for v in sorted( cc3[k].keys() ):
538        t,s = cc3[k][v]
539        oo.write( '\t'.join( [k,v,t,s] ) + '\n' )
540    oo.close()
541
542    log.warn( 'sn.003: Duplicate use of standard names: %s' % len(ll) )
543    oo = open( 'audit_sn_repeats.csv', 'w' )
544    for k in sorted( ll ):
545      orc = [k,]
546      l1 = cc[k][:]
547      l2 = []
548      l1b = []
549      for u in cc[k]:
550        i = self.dq.inx.uid[u]
551        if i.prov == "CMIP6 endorsement [SIMIP]":
552          l2.append(u)
553        else:
554          l1b.append(u)
555      if len( l2) > 1:
556        log.error( 'WARN.simip.00001: repeat use of standard name in SIMIP: %s:: %s' % (k,str(l2)) )
557      if len(l2) == 1:
558        orc.append( '*' )
559      else:
560        orc.append( '' )
561
562      nnn = 0
563      for u in l2 +l1b:
564        i = self.dq.inx.uid[u]
565        if "CMORvar" not in self.dq.inx.iref_by_sect[u].a:
566           orc += [i.label +'**', i.title]
567        else:
568          nn = 0
569          for uu in self.dq.inx.iref_by_sect[u].a['CMORvar']:
570            cmv = self.dq.inx.uid[uu]
571            if 'requestVar' in self.dq.inx.iref_by_sect[uu].a:
572              nn += 1
573          if nn == 0:
574             orc += [i.label + '*', i.title]
575          else:
576             nnn += 1
577             orc += [i.label, i.title]
578         
579      if nnn > 1:
580        oo.write( '\t'.join( orc ) + '\n' )
581    oo.close()
582     
583  def audit_rqv(self):
584    ixx = [i for i in self.dq.coll['requestVar'].items if i.vid in self.dq.inx.uid]
585    if len(ixx) < len( self.dq.inx.uid ):
586       log.error( 'SEVERE.var.00301: request vars with bad links ....' )
587   
588    ii = [i for i in ixx if self.dq.inx.uid[i.vid]._h.label == 'remarks']
589    ii2 = [i for i in ii if i.label not in self.cc]
590    ii3 = [i.vgid for i in ii if self.dq.inx.uid[i.vgid]._h.label != 'remarks']
591##ii4: set of invalid requestVarGroup records
592    ii4 = [i for i in ii3 if 'requestLink' not in self.dq.inx.iref_by_sect[i].]
593######
594    ii5Info = 'Set of bad requestVar records linking to a valid requestVarGroup records.'
595    ii5 = [i for i in ii if i.vgid not in ii4]
596##ii6: set of bad requestVar records linking to a valid requestVarGroup records and no variable name match.
597    ii6 = [i for i in ii5 if i.label not in self.cc]
598    log.error( '%48s [%s]: %s [%s, %s, %s; %s]' % ('Bad variable links in requestVar',len(self.dq.coll['requestVar'].items),len(ii),len(ii2), len(ii5), len(ii6), len(ii4)) )
599    log.info ( str( ii5Info ))
600    svg = set()
601    for i in ii5:
602      log.info( 'ii5: %s' % str([i.label, i.title, i.uid, i.mip, self.dq.inx.uid[i.vgid].title] ) )
603      svg.add( i.vgid )
604    for i in ii2:
605      if i.vgid in self.dq.inx.uid and self.dq.inx.uid[i.vgid]._h.label != 'remarks':
606        xx = '%s [%s]' % (self.dq.inx.uid[i.vgid].title, i.vgid)
607      else:
608        xx = i.vgid
609      log.info( 'ii2: %s' % str([i.label, i.title, i.uid, i.mip, xx] ) )
610
611    log.warn( 'rvg.0010: requestVarGroups with bad request vars:' )
612    for u in sorted( list(svg) ):
613      log.warn( 'rvg.0011: %s: %s' % (u, self.dq.inx.uid[u].title ))
614
615    log.info( '    [# records]: # broken [var name not known, link to valid group, valid group and no var name; valid request groups' )
616    showAllRqvErrors=False
617    if showAllRqvErrors:
618      log.info( '%s\n%s' % (str( [i.label for i in ii if i.label in self.cc]), str( [i.label for i in ii2] ) ) )
619
620    ii1 = [i for i in ii if i.label in self.ccmv]
621    listBadRequestVar=False
622    if listBadRequestVar:
623      for i in ii1:
624        log.info( str( i.label,i.mip,i.table,[x.frequency for x in self.ccmv[i.label]] ) )
625
626  def audit_rql(self):
627    ii = [i for i in self.dq.coll['requestLink'].items if self.dq.inx.uid[i.refid]._h.label == 'remarks']
628    log.info( '%48s: %s (from %s)' % ('ERROR.rql.001: Bad request group links in requestLink',len(ii), len(self.dq.coll['requestLink'].items)) )
629    rql_detail=True
630    if rql_detail:
631      for i in ii:
632         log.info( '%s: %s, %s [%s]' % ('ERROR.rql.002: ',i.mip,i.label,i.uid) )
633
634  def audit_rqg(self):
635    ii = [i for i in self.dq.coll['requestVarGroup'].items if len( dq.inx.iref_by_sect[i.uid].a['requestVar'])  == 0]
636    ii1 = [i for i in ii if len( dq.inx.iref_by_sect[i.uid].a['requestLink'])  != 0]
637    log.info( '%48s: %s/%s (from %s)' % ('Request groups with no request links:',len(ii) - len(ii1),len(ii1), len(self.dq.coll['requestVarGroup'].items)) )
638    listEmptyRequestVarGroups=True
639    if listEmptyRequestVarGroups:
640      for i in ii1:
641        log.info ( 'INFO.rqgempty.0001: %s: %s, %s [%s]' % (i.label, i.title, i.mip, i.uid) )
642
643dq = dreq.loadDreq(manifest=None)
644a = auditor( dq )
645cd = checkDims( dq )
Note: See TracBrowser for help on using the repository browser.