source: CMIP6dreqbuild/trunk/src/framework/makeSuppl.py @ 1279

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/makeSuppl.py@1291
Revision 1279, 5.9 KB checked in by mjuckes, 13 months ago (diff)

01.00.29b1

Line 
1
2import xml, collections, uuid, os, string, re
3import xml.dom.minidom
4import datetime, time
5
6import utils_wb
7import scanLims
8from dreqPy import dreq
9from ingest import cmip5so
10import cf
11
12empty=re.compile('^$')
13rmap = {'mn':'valid_min', 'mx':'valid_max', 'amn':'ok_min_mean_abs', 'amx':'ok_max_mean_abs', 
14        'smn':'valid_min_status', 'smx':'valid_max_status', 'samn':'ok_min_mean_abs_status', 'samx':'ok_max_mean_abs_status' } 
15
16class addUnits(object):
17  def __init__(self,dq,wbi='misc/units.xlsx'):
18    eqs = [('N m-1', 'kg s-2', 'J m-2'), ('Pa', 'N m-2', 'kg m-1 s-2'), ('cm-1','km-1','m-1')     ]
19    eqss = {'N m-1':'Newton per metre','Pa':'pressure','m-1':'wavelength','m':'distance or height','s':'time','1':'unitless','m s-2':'acceleration','m2':'area','m3':'volume' }
20    eqcf = {}
21    for k in eqss:
22      eqcf[ cf.units.Units( k ) ] = k
23
24    wb = utils_wb.workbook( wbi )
25    sh = wb.book.sheet_by_name('units')
26    self.repl = {}
27    self.uu = {}
28    for j in range(1,sh.nrows):
29      r = sh.row(j)
30      if len(r[0].value) > 1 and r[0].value[0] == '#':
31        pass
32      else:
33        if len(r) > 5 and r[5].value != u'':
34          self.repl[ r[0].value ] = r[5].value
35        else:
36          try:
37            a = cf.units.Units( r[0].value )
38          except:
39            print 'No cf units for: %s' % r[0].value
40            a = None
41          thisg = None
42          if a != None:
43            for k in eqcf:
44              if a.equivalent(k):
45                thisg = eqss[eqcf[k]]
46          self.uu[r[0].value] = ([x.value for x in r],thisg)
47
48    for k in self.repl:
49      if self.repl[k] not in self.uu:
50        print 'Bad replacement found: %s --> %s' % (k,self.repl[k])
51
52    for i in dq.coll['var'].items:
53      if i.units in self.repl:
54        u = self.repl[i.units]
55      else:
56        u = i.units
57      u = string.strip(u)
58      if str(u) == '1.0':
59        u = '1'
60      if u not in self.uu:
61        print 'UNITS NOT FOUND: %s (%s)' % (u,i.label)
62
63class makeSuppl(object):
64  def __init__(self,src='out/dreqSuppSample.xml' ):
65    assert os.path.isfile( src), '%s not found' % src
66    self.doc = xml.dom.minidom.parse( src  )
67    self.dq = dreq.loadDreq( dreqXML='out/annotated_20150731_chk.xml', configdoc='out/dreq2Defn.xml', manifest=None)
68    self.cc = collections.defaultdict( dict )
69    for i in self.dq.coll['CMORvar'].items:
70      self.cc[i.mipTable][i.label] = i.uid
71    self.header()
72    self.makeQcRanges()
73    self.makeUnits()
74    self.makeClean()
75    self.write()
76
77  def header(self):
78    t = time.gmtime()
79    d = datetime.date(t.tm_year, t.tm_mon, t.tm_mday)
80    thiss = self.doc.getElementsByTagName('prologue')[0]
81    date = thiss.getElementsByTagName('dc:date')[0]
82    date.firstChild.replaceWholeText(d.isoformat())
83    vers = thiss.getElementsByTagName('pav:version')[0]
84    vers.firstChild.replaceWholeText(self.dq.version)
85    ttl = thiss.getElementsByTagName('dc:title')[0]
86    ttl.firstChild.replaceWholeText( 'CMIP6 Data Request Supplement [%s]' % self.dq.version)
87
88  def makeClean(self):
89    thiss = self.doc.getElementsByTagName('places')[0]
90    for item in thiss.getElementsByTagName('item'):
91      thiss.removeChild( item )
92    thiss = self.doc.getElementsByTagName('transfers')[0]
93    for item in thiss.getElementsByTagName('item'):
94      thiss.removeChild( item )
95
96  def makeUnits(self):
97    a = addUnits(self.dq)
98    thiss = self.doc.getElementsByTagName('units')[0]
99    for item in thiss.getElementsByTagName('item'):
100      thiss.removeChild( item )
101    for k in a.uu.keys():
102        r,thisg = a.uu[k]
103        item = self.doc.createElement( 'item' )
104        item.setAttribute( 'uid', str(r[7]) )
105        item.setAttribute( 'label', str(r[1]) )
106        item.setAttribute( 'title', str(r[2]) )
107        item.setAttribute( 'text', str(r[0]) )
108        if thisg != None:
109          item.setAttribute( 'group', str(thisg) )
110        thiss.appendChild( item )
111
112  def makeQcRanges(self):
113    thiss = self.doc.getElementsByTagName('qcranges')[0]
114    for item in thiss.getElementsByTagName('item'):
115      thiss.removeChild( item )
116    self.qcset = set()
117    for t in scanLims.s.ccc:
118      for v in scanLims.s.ccc[t]:
119        if t in self.cc and v in self.cc[t]:
120          vid = self.cc[t][v]
121          self.qcset.add( (t,v) )
122          item = self.doc.createElement( 'item' )
123          item.setAttribute( 'vid', vid )
124          item.setAttribute( 'uid', str( uuid.uuid1() ) )
125          for k in scanLims.s.ccc[t][v]._asdict().keys():
126            if scanLims.s.ccc[t][v]._asdict()[k] != None:
127              k1 = rmap.get( k,k )
128              val = scanLims.s.ccc[t][v]._asdict()[k]
129              val = utils_wb.uniCleanFunc( val )
130              item.setAttribute( k1, str(val) )
131          thiss.appendChild( item )
132        else:
133          print 'WARN.0001.00001: no variables found for %s, %s' % (t,v)
134
135    for t in scanLims.s.cm5:
136      for v in scanLims.s.cm5[t]:
137        if t in self.cc and v in self.cc[t] and (t,v) not in self.qcset:
138          xx = scanLims.s.cm5[t][v][3:]
139          if not all( [x == 'None' for x in xx] ):
140            vid = self.cc[t][v]
141            self.qcset.add( (t,v) )
142            item = self.doc.createElement( 'item' )
143            item.setAttribute( 'vid', vid )
144            item.setAttribute( 'uid', str( uuid.uuid1() ) )
145            if len(xx) != 4:
146              print 'WARN.lenx: ',t,v,scanLims.s.cm5[t][v]
147            else:
148             for x in range(4):
149              if xx[x] != 'None':
150                id = ['valid_min','valid_max','ok_min_mean_abs','ok_max_mean_abs'][x]
151                item.setAttribute( id, xx[x] )
152                item.setAttribute( id + '_status', 'suggested' )
153             thiss.appendChild( item )
154   
155
156  def write(self):
157    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
158    oo = open( 'out/supplement_20150731.xml', 'w' )
159    lines = string.split( txt, '\n' )
160    for line in lines:
161      l = utils_wb.uniCleanFunc( string.strip(line) )
162      if empty.match(l):
163        continue
164      else:
165        oo.write(l + '\n')
166    oo.close()
167   
168
169ms = makeSuppl()
Note: See TracBrowser for help on using the repository browser.