source: CMIP6dreqbuild/trunk/src/workbook/choiceCfg.py @ 600

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/choiceCfg.py@600
Revision 600, 7.3 KB checked in by mjuckes, 5 years ago (diff)

final adjustments

Line 
1import uuid, string
2
3#('uid','stid','label','title','description','vid', \
4#                   'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', 'type', 'ok_min_mean_abs',  \
5#                   'deflate', 'valid_min', 'flag_values', 'modeling_realm', 'valid_max', 'positive', 'mipTable', \
6#                   'prov', 'provNote', 'frequency', 'rowIndex', 'coordinates')
7
8def labify( thisl ):
9              if string.find( thisl, '_' ) != -1:
10                thisl = string.replace( thisl, '_', '-' )
11              if string.find( thisl, '*' ) != -1:
12                thisl = string.replace( thisl, '*', '-' )
13              if string.find( thisl, '!' ) != -1:
14                thisl = string.replace( thisl, '!', '-' )
15              if string.find( thisl, ' ' ) != -1:
16                thisl = string.replace( thisl, ' ', '-' )
17              if string.find( thisl, ':' ) != -1:
18                thisl = string.replace( thisl, ':', '-' )
19              return thisl
20
21class choices(object):
22  def __init__(self, main):
23    self.main = main
24    self.highResMip()
25    self.DynVar()
26    self.configOptions()
27    classes = {'RedundancySet':['Redundancy Set', 'Set with an integer set to each element, such that higher value elements render lower values redundant. Where values are the same there is overlap but no complete redundancy'], \
28           'ConfigDependency':['Model Configuration Dependency', 'One or more variables which may be required only for specific model configurations']}
29
30  def configOptions(self):
31    self.varChoiceLnkCfg = []
32    self.varChoiceLnkCfgInfo = [ 'uid', 'label', 'title', 'vid', 'cid', 'cfgid', 'cfg']
33
34    boussinesqOnly = ['rhozero']
35    cfgid = 'BoussinesqOcean'
36    uid  = 'BoussinesqOceanOptionSet'
37    for var in boussinesqOnly:
38      vids = set( self.main.vars1[var] )
39      cm = [i for i in self.main.cmv if i[5] in vids]
40      for c in cm:
41        print ( 'INFO.xxx.00005: %s: %s' % ( var, c[21] ) )
42        self.varChoiceLnkCfg.append( [str(uuid.uuid1()),'%s-%s' % ( var, c[21] ), '%s [%s]' % ( var, c[21] ), c[0], uid, cfgid, 'true'] )
43    label = uid
44    desc = 'Variable(s) only required for models with Boussinesq oceans.'
45    title = 'Option set for %s' % cfgid
46    thisClass = 'ConfigurationOptionSet'
47    this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':string.join(boussinesqOnly,','), 'optionList':'', 'description':desc }
48    self.choices[uid] = this
49
50## masscello
51    var = 'masscello'
52    vids = set( self.main.vars1[var] )
53    cm = [i for i in self.main.cmv if i[5] in vids]
54    uid='boussinesq-%s' % var
55    cfgid = 'BoussinesqOceanConstantTh'
56    for c in cm:
57        print ( 'INFO.xxx.00005: %s: %s' % ( var, c[21] ) )
58        cfg = string.lower( str(c[21] == 'fx') )
59        self.varChoiceLnkCfg.append( [str(uuid.uuid1()),'%s-%s' % ( var, c[21] ), '%s [%s]' % ( var, c[21] ), c[0], uid, cfgid, cfg] )
60    label = '%s' % var
61    desc = 'The ocean grid cell mass (masscello) can be supplied as a fixed field for Boussinesq models if the grid cell thickness is constant in time. Otherwise, this variable is required at monthly frequency.'
62    title = 'Option set for %s' % cfgid
63    thisClass = 'ConfigurationOptionSet'
64    this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':var, 'optionList':'', 'description':desc }
65    self.choices[uid] = this
66
67  def highResMip(self):
68
69    desc = 'The 3hrPlev and 6hrPlev_extr fields overlap'
70
71    self.choices = {}
72    self.varChoiceLnk = []
73    self.varChoiceLnkInfo = [ 'uid', 'label', 'title', 'vid', 'cid', 'rank']
74
75    ##for var in ['ta','ua','va','wap','hus']:
76    for var in ['ta','ua','va','hus']:
77      vids = set( self.main.vars1[var] )
78      cm = [i for i in self.main.cmv if i[5] in vids]
79      for c in cm:
80        print ( 'INFO.xxx.00001: %s: %s' % ( var, str(c) ) )
81      cc = ''
82      opts = ''
83##
84## note that uid is intended for use as part of a URL .... need to be careful with character choice
85##
86      uid='choices_HighResMIP.overlap.%s' % var
87      label = 'overlap-%s' % var
88      title = 'Redundancy Set for HighResMIP pressure level %s' % var
89      thisClass = 'RedundancySet'
90##
91## in order, 3hr, 4lev: 6hr, 7lev: 6hr, 4lev: 6hr, 3lev
92##
93      ol = [2,2,1]
94      ix = 0
95##HighResMIP [3hrPlev]
96      ok = []
97      grps = {'ta':['3hrPlev','6hrPlev_extr','6hrPlev'], 'wap':['3hrPlev','6hrPlev_extr_dr','6hrPlev'],
98              'hus':['3hrPlev','6hrPlev_extr'] }
99      ranks = {'3hrPlev':3,'6hrPlev_extr':2,'6hrPlev_extr_dr':1, '6hrPlev':0}
100     
101##
102## initial inclusion of 6hrPlev_extr_dr was an error ... these are time mean fields.
103##
104## need to add some 27 level fields, but 1st clarify requirements
105##
106      s1 = {c[19] for c in cm}
107      ##print sorted(list(s1))
108      ##raise
109      for grp in grps.get( var, ['3hrPlev','6hrPlev_extr','6hrPlev']):
110        c0 = [c for c in cm if c[19].find( '[%s]' % grp) != -1]
111        thisl = labify( '%s-%s' % (var, grp) )
112        title = '%s [%s]' % (var, grp)
113        ok.append( len(c0)  == 1 )
114        cc += '%s:%s; ' % (grp,var)
115        opts += '%s; ' % ol[ix]
116        ix += 1
117        if len(c0 ) == 1:
118          self.varChoiceLnk.append( [str(uuid.uuid1()), thisl, title,  c0[0][0], uid, str(ranks[grp]) ] )
119        else:
120          print 'Group %s not found' % grp
121          print s1, var
122      if not all(ok):
123        print 'ERROR.070.020001: not all groups found for %s [%s]' % (var,str(ok))
124      else:
125        print 'INFO.070.020001: all groups found for %s [%s]' % (var,str(ok))
126      this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':cc, 'optionList':opts, 'description':desc }
127      self.choices[uid] = this
128
129  def DynVar(self):
130
131    desc = 'Pressure level fields overlap ... priority 1: 10 levels, 2: 17 levels, 3: 23 levels'
132
133    self.varChoiceLnkInfo = [ 'uid', 'label', 'title', 'vid', 'cid', 'rank']
134
135    for var in ['ta','ua','va','wap','hus','zg']:
136      vids = set( self.main.vars1[var] )
137      cm = [i for i in self.main.cmv if i[5] in vids]
138      for c in cm:
139        print ( 'INFO.xxx.00001: %s: %s' % ( var, str(c) ) )
140      cc = ''
141      opts = ''
142##
143## note that uid is intended for use as part of a URL .... need to be careful with character choice
144##
145      uid='choices_DynVar.overlap.%s' % var
146      label = 'overlap-%s' % var
147      title = 'Redundancy Set for DynVar pressure level %s' % var
148      thisClass = 'RedundancySet'
149##
150## in order, 3hr, 4lev: 6hr, 7lev: 6hr, 4lev
151##
152      ol = [2,2,1]
153      ix = 0
154##HighResMIP [3hrPlev]
155      ok = []
156      grps = {'ta':['3hrPlev','6hrPlev_extr'], 'wap':['3hrPlev','6hrPlev_extr_dr'] }
157      ranks = {'23':3,'17':2,'10':1}
158     
159##
160## initial inclusion of 6hrPlev_extr_dr was an error ... these are time mean fields.
161##
162## need to add some 27 level fields, but 1st clarify requirements
163##
164      for grp in ['DYVR_daily',]:
165        c0 = [c for c in cm if c[19] == 'DynVar [%s]' % grp]
166        for c in c0:
167          lab = c[2]
168          thisl = labify( '%s-%s' % (lab, grp) )
169          title = '%s [%s]' % (lab, grp)
170          cc += '%s:%s; ' % (grp,var)
171          rk = lab[-2:]
172          assert rk in ranks, 'Could not identify rank for: %s' % str(c)
173          opts += '%s; ' % ol[ix]
174          ix += 1
175          self.varChoiceLnk.append( [str(uuid.uuid1()), thisl, title,  c[0], uid, str(ranks[rk]) ] )
176      this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':cc, 'optionList':opts, 'description':desc }
177      self.choices[uid] = this
178
Note: See TracBrowser for help on using the repository browser.