source: CMIP6dreq/trunk/dreqPy/vrev.py @ 1292

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/dreqPy/vrev.py@1309
Revision 1292, 5.5 KB checked in by mjuckes, 12 months ago (diff)

01.00.29

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