source: CMIP6dreqbuild/trunk/src/framework/appendViacs_p1.py @ 925

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

release pre-candidate

Line 
1import string, xlrd, os, collections, uuid
2from dreqPy import dreq
3
4class workbook(object):
5  def __init__(self,file):
6    assert os.path.isfile(file), 'File %s not found' % file
7    self.book = xlrd.open_workbook( file )
8    self.sns = self.book.sheet_names()
9
10idir = '/home/martin/2014/wip/dreq/input/VIACSAB/'
11fn = 'VIACSAdvisoryBoardVariableListFeedbackSummary-20150610-1.xls'
12fn = 'VIACSAdvisoryBoardVariableListFeedbackSummary_2016-12-01.xls'
13
14wb = workbook(idir + fn)
15sht = wb.book.sheet_by_name( 'VIACS AB Template' )
16print sht.nrows
17cc = collections.defaultdict( list )
18ccd = collections.defaultdict( dict )
19ccvg = collections.defaultdict( list )
20ccd2 = collections.defaultdict( dict )
21ccmt = collections.defaultdict( dict )
22
23dq = dreq.loadDreq()
24
25for i in dq.coll['miptable'].items:
26  for u in dq.inx.iref_by_sect[i.uid].a['CMORvar']:
27    cmv = dq.inx.uid[u]
28    ccmt[i.label][cmv.label] = u
29
30for i in dq.coll['CMORvar'].items:
31  ccd2[i.mipTable][i.label] = i.uid
32
33ts = set( [type('s'),type( u's' )] )
34thissect = None
35done = False
36i = 0
37def stripr( r ):
38  k = 0
39  for i in range(len(r)):
40    if r[i].value not in ['',None,u'']:
41      k = i
42  return r[:k+1]
43
44
45obj = [x.value for x in sht.row(21)]
46obj1 = obj[:]
47for i in range(5,25):
48   if string.find( obj1[i], ' ' ) != '-1':
49     obj1[i] = obj1[i].split()[0]
50for i in range(25,len(obj)):
51   obj1[i] = 'climateServices'
52
53sb = set()
54sbb = set()
55
56while not done:
57  r = sht.row(i)
58  r0 = r[0].value
59  if type(r0) in ts and len(r0) > 0 and r0[0] == '@':
60     thissect = str( r0[1:] )
61     if r0[:5] == '@SECT':
62       done = True
63
64  if thissect not in [None,'SECT']:
65    if thissect in ['3hr','Omon','day']:
66      sfx = 'c'
67    elif thissect in ['6hrLev']:
68      sfx = 'd'
69    else:
70      sfx = ''
71
72    r1 = stripr(r)
73    if len( r1 ) > 5:
74      rr = [x.value for x in r1]
75      if rr[2] != '':
76        cc[thissect].append( ('ln', i,rr[2]) )
77        for j in range(5,min(len(rr),29)):
78          bits = str( rr[j] ).split( ',' )
79          for b in bits:
80            if b in ['1.0','2.0','3.0','4.0','5.0']:
81              ccvg[ obj1[j] + '.' + b[0] + sfx ].append( ('ln',i,rr[2]) )
82            elif b in ['3b']:
83              ccvg[ obj1[j] + '.' + b ].append( ('ln',i,rr[2]) )
84            else:
85              sb.add(b)
86              sbb.add(rr[j])
87
88        ccd[thissect][ (i,rr[2]) ] = rr[5:]
89  i += 1
90
91def scanSect2(i):
92  done = False
93  while not done:
94    r = sht.row(i)
95    r0 = r[0].value
96    print 'INFO.SECT9.00001: ',r0
97    if r0=='@ENDSECT':
98      done = True
99    elif type(r0) in ts and len(r0) > 0 and r0[0] == '*':
100      r1 = stripr(r)
101      rr = [x.value for x in r1]
102      if string.find(r0,':') != -1:
103        r0 = r0.split(':')[0]
104      vv,tab = r0[1:].split( '.' )
105      if tab in ccd2 and vv in ccd2[tab]:
106        print 'INFO.SECT2.0001: ',('mt',i,(vv,tab))
107        cc['sect2'].append( ('mt',i,(vv,tab)) )
108        for j in range(5,min(len(rr),29)):
109          bits = str( rr[j] ).split( ',' )
110          for b in bits:
111            if b in ['1.0','2.0','3.0','4.0','5.0']:
112              ccvg[ obj1[j] + '.' + b[0] ].append( ('mt',i,(vv,tab)) )
113              print 'INFO.SECT2.0002: ',obj1[j] + '.' + b[0],('mt',i,(vv,tab))
114            else:
115              sb.add(b)
116              sbb.add(rr[j])
117      else:
118        print 'ERROR.SECT2.0001 (variable not found): ',vv,tab
119    i+= 1
120  return i
121
122i = scanSect2(i)
123
124ks = sorted( cc.keys() )
125oo = open( 'sorted.csv', 'w' )
126for k in ks:
127  print  k, len( cc[k] )
128  ##print sorted( cc[k] )
129  for m, i,n in cc[k]:
130    oo.write( '%s\t%s\t%s\n' % (k,n,i) )
131oo.close()
132
133import cmip5so
134
135class s1(object):
136  def __init__(self):
137    self.a = collections.defaultdict( list )
138
139cc2 = collections.defaultdict( s1 )
140for k in cmip5so.so:
141   for v in cmip5so.so[k].a:
142      ttl = str( cmip5so.so[k].a[v][1] )
143      cc2[k].a[ttl].append(v)
144
145vgmap1 = {}
146for x in dq.coll['requestVarGroup'].items:
147  if x.label in vgmap1:
148    print 'ERROR: duplicate requestVarGroup label ...:',x.label,x.uid
149  else:
150    vgmap1[x.label] = x.uid
151
152class scanvar(object):
153  def __init__(self,cc,dq):
154    s1 = {}
155    for i in dq.coll['CMORvar'].items:
156      tab = i.mipTable
157      s1['%s.%s' % (i.label,tab)] = i.uid
158
159    self.vmap = {}
160    self.vmap3 = {}
161    self.vmapx = {}
162    for k0 in cc.keys():
163      k = {'fx:o':'fx', 'fx:a':'fx', 'aero':'aermonthly', 'OImon':'SImon'}.get( k0, k0)
164
165      cc0 = collections.defaultdict( int )
166      if k not in cmip5so.so and k0 != 'sect2':
167         print 'SEVERE: Key %s not found' % k
168      else:
169         for a,b,c in cc[k0]:
170           t = (b,c)
171           if a == 'ln':
172             if t[1] not in cc2[k].a:
173               print 'Long name %s:%s not found' % (k,t[1])
174             elif len( cc2[k].a[t[1]] ) == 2:
175               if ( cc2[k].a[t[1]][0] in cc2[k].a[t[1]][1] ) or ( cc2[k].a[t[1]][1] in cc2[k].a[t[1]][0] ):
176                 print 'INFO: Probable option set %s, %s: %s' % ( k,t[1],str( cc2[k].a[t[1]] ) )
177                 self.vmap3[t] = (k, cc2[k].a[t[1]][0], cc2[k].a[t[1]][1] )
178               else:
179                 print 'WARNING: Dual distinct targets %s, %s: %s' % ( k,t[1],str( cc2[k].a[t[1]] ) )
180             elif len( cc2[k].a[t[1]] ) > 1:
181               print 'WARNING: Multiple targets %s, %s: %s' % ( k,t[1],str( cc2[k].a[t[1]] ) )
182             else:
183               kv = '%s.%s' % (cc2[k].a[t[1]][0],k)
184               if kv in s1:
185                 self.vmap[t] = (k, cc2[k].a[t[1]][0], s1[kv] )
186               else:
187                 print 'WARNING: dreq item not found ...%s, %s: %s' % ( k,t[1], cc2[k].a[t[1]][0] )
188                 self.vmapx[t] = (k, cc2[k].a[t[1]][0] )
189           else:
190              ## want table, var, uid
191             var, tab = c
192             if tab in ccmt and var in ccmt[tab]:
193               self.vmap[t] = (tab,var,ccmt[tab][var])
194               print 'INFO.var.00505: var found: %s: %s.%s: %s' % (a,tab,var,ccmt[tab][var])
195             else:
196               print 'ERROR.var.00505: var not found: %s: %s.%s' % (a,tab,var)
197
198class scanexpt(object):
199  def __init__(self,i0,sht,dq, obj1):
200    s = {}
201    s2 = {}
202    for i in dq.coll['experiment'].items:
203      s[i.label.lower()] = (i.uid,i.label)
204    for i in dq.coll['exptgroup'].items:
205      s2[i.label.lower()] = (i.uid,i.label)
206
207    swtch = False
208    rrr = []
209    rrx = []
210    rry = []
211    self.expts = {}
212
213## withdrawn AMIPFuture4xCO2: ENSOMIP
214    swd = {'AMIPFuture4xCO2',}
215    for i in range(i0,sht.nrows):
216      r = sht.row(i)
217      if swtch:
218        rr = [x.value for x in r]
219        if rr[3] not in ['0','0.0',0.0]:
220          print rr
221          rrr.append( rr[:4] )
222          thise = rr[1].replace( '-', '' ).lower()
223          thisg = rr[0].replace( '-', '' ).lower()
224          if thise in s:
225            self.expts[thise] = ('expt',rr[:],s[thise])
226          else:
227            rrx.append(thise)
228            if thise in s2:
229              self.expts[thise] = ('grp',rr[:],s2[thise])
230            elif thisg in s2:
231              self.expts[thisg] = ('grp',rr[:],s2[thisg])
232            else:
233              rry.append((rr[0],rr[1]))
234      if r[0].value == "@EXPT":
235        swtch = True
236
237    self.cceg = collections.defaultdict( list )
238    seb = set()
239    sebb = set()
240    for k in self.expts:
241            rr = self.expts[k][1]
242            for j in range(5,min(len(rr),29)):
243              bits = str( rr[j] ).split( ',' )
244              for b in bits:
245                if b in ['1.0','2.0','3.0','4.0','5.0','1','2','3','4','5']:
246                  self.cceg[ obj1[j] + '.' + b[0] ].append( k )
247                else:
248                  seb.add(b)
249                  sebb.add(rr[j])
250           
251
252scannedExpts = scanexpt( i,sht,dq, obj1 )
253scannedVars =  scanvar(cc,dq)
254
255oo = open( 'viacsab.csv', 'w' )
256oo.write( '_variableGroup\t%s\t%s\t%s\n' % ('uid','label','title') )
257oo.write( '_requestLink\t%s\tVIACSAB\t%s\t%s\t%s\n' % ('uid','objective','title','vgid') )
258oo.write( '_requestVar\t%s\t%s\t%s\t%s\t%s\n' % ('uid','var','mipTable','vid','vgid') )
259oo.write( '_requestItem\t%s\t%s\t%s\t%s\t%s\n' % ('uid','rlid','eid','label','title') )
260
261res = collections.defaultdict( list )
262res['_variableGroup'].append( ('uid','label','title') )
263res['_requestLink'].append( ('uid','objective','mipTable','title','vgid') )
264res['_requestVar'].append( ('uid','var','mipTable','vid','vgid') )
265res['_requestItem'].append( ('uid','rlid','eid','label','title') )
266res['_objective'].append( ('uid','mip','label','title','description') )
267res['_objectiveLink'].append( ('uid','label','title','oid','rid') )
268## request groups and links
269vguid = {}
270rluid = {}
271obuid = {}
272for ob in set(obj1):
273  if ob != "":
274    oid = str( uuid.uuid1() )
275    res['objective'].append( (oid,'VIACSAB',ob,'VIACSAB: %s' % ob, '%s requirements input to VIACSAB' % ob) )
276    obuid[ob] = oid
277
278vguid = {}
279rluid = {}
280for k in ccvg:
281  label = string.replace( k, '.', '-' )
282  if label in vgmap1:
283    uid = vgmap1[label]
284  else:
285    uid = vguid.get( k, str( uuid.uuid1() ) )
286    print 'WARNING: %s not found in vgmap1' % k
287  if k not in vguid:
288    vguid[k] = uid
289  rluid[k] = str( uuid.uuid1() )
290  obj = string.split( k, '.' )[0]
291  assert obj in obj1, 'unrecognised objective found'
292  title = 'VIACSAB: %s' % k
293  oo.write( 'variableGroup\t%s\t%s\t%s\n' % (uid,label,title) )
294  res['variableGroup'].append( (uid,label,title) )
295  oo.write( 'requestLink\t%s\tVIACSAB\t%s\t%s\t%s\n' % (rluid[k],obj,title,uid) )
296  res['requestLink'].append( (rluid[k],obj,'VIACSAB',label,title,uid) )
297  res['objectiveLink'].append( (str( uuid.uuid1() ),obj,title, obuid[obj], rluid[k] ) )
298
299## request variables
300for k in ccvg:
301  l1 = len( ccvg[k] )
302  n1 = 0
303  vgid = vguid[k]
304  for a,b,c in ccvg[k]:
305    t = (b,c)
306    if t in scannedVars.vmap:
307       n1 += 1
308       uid = str( uuid.uuid1() )
309       tab, var, vid = scannedVars.vmap[t]
310       title = '%s: %s' % (k,var)
311       oo.write( 'requestVar\t%s\t%s\t%s\t%s\t%s\n' % (uid,var,tab,vid,vgid) )
312       res['requestVar'].append( (uid,var,tab,vid,vgid) )
313    else:
314       print 'WARNING.var.0001: not found: %s.%s' % (b,c)
315  print 'VARGROUP: ',k,l1,n1
316
317## request items
318for k in scannedExpts.cceg:
319  if k not in rluid:
320    print 'ERROR %s not found in request links (-> variable groups)' % k
321  else:
322    for sfx in ['','b','c','d']:
323      kk = k + sfx
324      if kk in rluid:
325        rlid = rluid[kk]
326        for e in scannedExpts.cceg[k]:
327          title = '%s: %s' % (kk,e)
328          label = e
329          eid,expt = scannedExpts.expts[e][2]
330          uid = str( uuid.uuid1() )
331          oo.write( 'requestItem\t%s\t%s\t%s\t%s\t%s\n' % (uid,rlid,eid,label,title) )
332          res['requestItem'].append( (uid,rlid,eid,label,title,expt) )
333oo.close()
334### variable groups: VIACSAB-<requester>-<n>
335### request link:  .....
336### request item: for each experiment.
Note: See TracBrowser for help on using the repository browser.