source: CMIP6dreqbuild/trunk/src/framework/dreqPy/vrev.py @ 1062

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

TOTAL bug: partial solution

Line 
1"""This module has a class which will analyse the usage of variables in the data request"""
2import operator
3import collections
4
5class checkVar(object):
6  """checkVar
7--------
8Class to analyse the usage of variables in the data request.
9"""
10  errorLog = collections.defaultdict( set )
11  def __init__(self,dq,errorMode='aggregate'):
12    self.errorMode = errorMode
13    self.dq = dq
14    self.mips = set( [i.label for i in  dq.coll['mip'].items] )
15    for i in ['PDRMIP', 'DECK', 'VIACSAB', 'SolarMIP', 'CMIP6' ]:
16      self.mips.discard(i)
17
18  def chk2(self,vn,byExpt=False, byBoth=False):
19    dq = self.dq
20    ks = [i for i in dq.coll['var'].items if i.label == vn ]
21
22    v = ks[0]
23    cc = {}
24    l = dq.inx.iref_by_sect[v.uid].a['CMORvar']
25    for i in l:
26      r = dq.inx.uid[i]
27      kk = '%s.%s' % (r.mipTable, r.label )
28      cc[i] = (kk,self.chkCmv( i, byExpt=byExpt, byBoth=byBoth ) )
29
30    return cc
31
32  def chk(self,vn):
33    ks = [i for i in dq.coll['var'].items if i.label == vn ]
34
35    v = ks[0]
36    l = dq.inx.iref_by_sect[v.uid].a['CMORvar']
37
38## set of all request variables
39    s = set()
40    for i in l:
41      for j in dq.inx.iref_by_sect[i].a['requestVar']:
42        s.add(j)
43
44## filter out the ones which link to a remark
45    s0 = set( [i for i in s if dq.inx.uid[dq.inx.uid[i].vgid]._h.label != 'remarks' ] )
46
47## set of request groups
48
49    s1  = set( [dq.inx.uid[i].vgid for i in s0 ] )
50
51    #s2 = set()
52#for i in s1:
53  #for j in dq.inx.iref_by_sect[i].a['requestLink']:
54    #s2.add(j)
55    s2 = reduce( operator.or_, [set(dq.inx.iref_by_sect[i].a['requestLink']) for i in s1 if 'requestLink' in dq.inx.iref_by_sect[i].a] )
56
57    mips = set( [dq.inx.uid[i].mip for i in s2 ] )
58    self.missing = self.mips.difference( mips )
59    self.inc = mips
60
61#############
62  def chkCmv(self,cmvid, byExpt=False, byBoth=False,expt=None):
63    dq = self.dq
64##
65## find set of requestVar records referring to this CMORvar
66##
67    s = set( dq.inx.iref_by_sect[cmvid].a['requestVar'] )
68
69## filter out the ones which link to a remark
70
71# s0: set of requestVars
72
73    s0 = set( [i for i in s if dq.inx.uid[dq.inx.uid[i].vgid]._h.label != 'remarks' ] )
74
75## set of request groups
76## dictionary, keyed on variable group uid, with values set to priority of variable
77##
78
79    cc1 = collections.defaultdict( set )
80    for i in s0:
81      cc1[ dq.inx.uid[i].vgid ].add( dq.inx.uid[i].priority )
82    ##s1  = set( [dq.inx.uid[i].vgid for i in s0 ] )
83   
84##
85## loop over requestGroups, find requestLink records, filtered by priority
86##
87    s2 = set()
88    for i in cc1:
89      if 'requestLink' in dq.inx.iref_by_sect[i].a:
90        for l in dq.inx.iref_by_sect[i].a['requestLink']:
91          lr = dq.inx.uid[l]
92          if lr.opt == 'priority':
93            p = int( float( lr.opar ) )
94            if max( cc1[i] ) <= p:
95              s2.add(l)
96          else:
97            s2.add( l )
98
99    if len( s2 ) == 0:
100      if byBoth:
101        return (set(),set())
102      else:
103        return s2
104
105##
106## logic here omits a filter on experiment name .... and hence gives too many MIPs when aggregated over mIPSs
107##
108    if byBoth or not byExpt:
109      mips0 = set( [dq.inx.uid[i].mip for i in s2] )
110    if byExpt or byBoth:
111      s3 = set()
112
113      if expt != None:
114        for i in s2:
115          if i in self.sc.rqLinkByExpt[expt]:
116            s3.add(i)
117      else:
118        s3 = s2
119##  set of esid values
120      ##esids = set()
121      ##for i in s2:
122        ##for u in dq.inx.iref_by_sect[i].a['requestItem']:
123          ##if expt != None:
124            ##esid = dq.inx.uid[u].esid
125            ##if esid == expt or 'experiment' in dq.inx.iref_by_sect[expt].a and esid in dq.inx.iref_by_sect[expt].a['experiment']:
126              ##esids.add( esid )
127              ##s3.add( i )
128              ##print 'TMP001: filteron:',expt
129            ##else:
130              ##print 'TMP001: filteroff:',expt
131          ##else:
132            ##esids.add( dq.inx.uid[u].esid )
133
134      mips = set( [dq.inx.uid[i].mip for i in s3] )
135
136###
137### CHECK: not clear what this was for .....
138###    appears to give meaningless output
139###
140      doThisObsolete = False
141      if doThisObsolete:
142        mips = set()
143        for e in esids:
144          if e == '':
145            ##print 'WARNING: empty esid encountered'
146            pass
147          else:
148            r = dq.inx.uid[e]
149            if r._h.label == 'mip':
150              mips.add(e)
151            else:
152              if r._h.label == 'exptgroup':
153                if 'experiment' in dq.inx.iref_by_sect[e].a:
154                  r = dq.inx.uid[  dq.inx.iref_by_sect[e].a['experiment'][0] ]
155                else:
156                  ei = dq.inx.uid[e]
157                  if self.errorMode != 'aggregate':
158                    print ( 'ERROR.exptgroup.00001: empty experiment group: %s: %s' % (ei.label, ei.title) )
159                  self.errorLog['ERROR.exptgroup.00001'].add( 'empty experiment group: %s: %s' % (ei.label, ei.title) )
160              if r._h.label in [ 'remarks','exptgroup']:
161                ##print 'WARNING: link to remarks encountered'
162                pass
163              else:
164                assert r._h.label == 'experiment', 'LOGIC ERROR ... should have an experiment record here: %s' % r._h.label
165                mips.add(r.mip)
166      if byBoth:
167        return (mips0,mips)
168      else:
169        return mips
170    else:
171      return mips0
172
173if __name__ == '__main__':
174  try:
175    import dreq
176  except:
177    import dreqPy.dreq as dreq
178  dq = dreq.loadDreq()
179  c = checkVar(dq)
180  c.chk( 'tas' )
181  print ( '%s, %s' % (c.inc, c.missing))
Note: See TracBrowser for help on using the repository browser.