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

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/makeSuppl.py@1136
Revision 1136, 5.8 KB checked in by mjuckes, 2 years ago (diff)

missing files

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='units/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) > 5 and r[5].value != u'':
31        self.repl[ r[0].value ] = r[5].value
32      else:
33        try:
34          a = cf.units.Units( r[0].value )
35        except:
36          print 'No cf units for: %s' % r[0].value
37          a = None
38        thisg = None
39        if a != None:
40          for k in eqcf:
41            if a.equivalent(k):
42              thisg = eqss[eqcf[k]]
43        self.uu[r[0].value] = ([x.value for x in r],thisg)
44
45    for k in self.repl:
46      if self.repl[k] not in self.uu:
47        print 'Bad replacement found: %s --> %s' % (k,self.repl[k])
48
49    for i in dq.coll['var'].items:
50      if i.units in self.repl:
51        u = self.repl[i.units]
52      else:
53        u = i.units
54      u = string.strip(u)
55      if str(u) == '1.0':
56        u = '1'
57      if u not in self.uu:
58        print 'UNITS NOT FOUND: %s (%s)' % (u,i.label)
59
60class makeSuppl(object):
61  def __init__(self,src='out/dreqSuppSample.xml' ):
62    assert os.path.isfile( src), '%s not found' % src
63    self.doc = xml.dom.minidom.parse( src  )
64    self.dq = dreq.loadDreq( dreqXML='out/annotated_20150731_chk.xml', configdoc='out/dreq2Defn.xml', manifest=None)
65    self.cc = collections.defaultdict( dict )
66    for i in self.dq.coll['CMORvar'].items:
67      self.cc[i.mipTable][i.label] = i.uid
68    self.header()
69    self.makeQcRanges()
70    self.makeUnits()
71    self.makeClean()
72    self.write()
73
74  def header(self):
75    t = time.gmtime()
76    d = datetime.date(t.tm_year, t.tm_mon, t.tm_mday)
77    thiss = self.doc.getElementsByTagName('prologue')[0]
78    date = thiss.getElementsByTagName('dc:date')[0]
79    date.firstChild.replaceWholeText(d.isoformat())
80    vers = thiss.getElementsByTagName('pav:version')[0]
81    vers.firstChild.replaceWholeText(self.dq.version)
82    ttl = thiss.getElementsByTagName('dc:title')[0]
83    ttl.firstChild.replaceWholeText( 'CMIP6 Data Request Supplement [%s]' % self.dq.version)
84
85  def makeClean(self):
86    thiss = self.doc.getElementsByTagName('places')[0]
87    for item in thiss.getElementsByTagName('item'):
88      thiss.removeChild( item )
89    thiss = self.doc.getElementsByTagName('transfers')[0]
90    for item in thiss.getElementsByTagName('item'):
91      thiss.removeChild( item )
92
93  def makeUnits(self):
94    a = addUnits(self.dq)
95    thiss = self.doc.getElementsByTagName('units')[0]
96    for item in thiss.getElementsByTagName('item'):
97      thiss.removeChild( item )
98    for k in a.uu.keys():
99        r,thisg = a.uu[k]
100        item = self.doc.createElement( 'item' )
101        item.setAttribute( 'uid', str(r[7]) )
102        item.setAttribute( 'label', str(r[1]) )
103        item.setAttribute( 'title', str(r[2]) )
104        item.setAttribute( 'text', str(r[0]) )
105        if thisg != None:
106          item.setAttribute( 'group', str(thisg) )
107        thiss.appendChild( item )
108
109  def makeQcRanges(self):
110    thiss = self.doc.getElementsByTagName('qcranges')[0]
111    for item in thiss.getElementsByTagName('item'):
112      thiss.removeChild( item )
113    self.qcset = set()
114    for t in scanLims.s.ccc:
115      for v in scanLims.s.ccc[t]:
116        if t in self.cc and v in self.cc[t]:
117          vid = self.cc[t][v]
118          self.qcset.add( (t,v) )
119          item = self.doc.createElement( 'item' )
120          item.setAttribute( 'vid', vid )
121          item.setAttribute( 'uid', str( uuid.uuid1() ) )
122          for k in scanLims.s.ccc[t][v]._asdict().keys():
123            if scanLims.s.ccc[t][v]._asdict()[k] != None:
124              k1 = rmap.get( k,k )
125              val = scanLims.s.ccc[t][v]._asdict()[k]
126              val = utils_wb.uniCleanFunc( val )
127              item.setAttribute( k1, str(val) )
128          thiss.appendChild( item )
129        else:
130          print 'WARN.0001.00001: no variables found for %s, %s' % (t,v)
131
132    for t in scanLims.s.cm5:
133      for v in scanLims.s.cm5[t]:
134        if t in self.cc and v in self.cc[t] and (t,v) not in self.qcset:
135          xx = scanLims.s.cm5[t][v][3:]
136          if not all( [x == 'None' for x in xx] ):
137            vid = self.cc[t][v]
138            self.qcset.add( (t,v) )
139            item = self.doc.createElement( 'item' )
140            item.setAttribute( 'vid', vid )
141            item.setAttribute( 'uid', str( uuid.uuid1() ) )
142            if len(xx) != 4:
143              print 'WARN.lenx: ',t,v,scanLims.s.cm5[t][v]
144            else:
145             for x in range(4):
146              if xx[x] != 'None':
147                id = ['valid_min','valid_max','ok_min_mean_abs','ok_max_mean_abs'][x]
148                item.setAttribute( id, xx[x] )
149                item.setAttribute( id + '_status', 'suggested' )
150             thiss.appendChild( item )
151   
152
153  def write(self):
154    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
155    oo = open( 'out/supplement_20150731.xml', 'w' )
156    lines = string.split( txt, '\n' )
157    for line in lines:
158      l = utils_wb.uniCleanFunc( string.strip(line) )
159      if empty.match(l):
160        continue
161      else:
162        oo.write(l + '\n')
163    oo.close()
164   
165
166ms = makeSuppl()
Note: See TracBrowser for help on using the repository browser.