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

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

01.00.09

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