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

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

misc updates

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
204    for i in dq.coll['exptgroup'].items:
205      s2[i.label.lower()] = i.uid
206    ##s = {i.label.lower() for i in dq.coll['experiment'].items}
207    ##s2 = {i.label.lower() for i in dq.coll['exptgroup'].items}
208    swtch = False
209    rrr = []
210    rrx = []
211    rry = []
212    self.expts = {}
213
214## withdrawn AMIPFuture4xCO2: ENSOMIP
215    swd = {'AMIPFuture4xCO2',}
216    for i in range(i0,sht.nrows):
217      r = sht.row(i)
218      if swtch:
219        rr = [x.value for x in r]
220        if rr[3] not in ['0','0.0',0.0]:
221          print rr
222          rrr.append( rr[:4] )
223          thise = rr[1].replace( '-', '' ).lower()
224          thisg = rr[0].replace( '-', '' ).lower()
225          if thise in s:
226            self.expts[thise] = ('expt',rr[:],s[thise])
227          else:
228            rrx.append(thise)
229            if thise in s2:
230              self.expts[thise] = ('grp',rr[:],s2[thise])
231            elif thisg in s2:
232              self.expts[thisg] = ('grp',rr[:],s2[thisg])
233            else:
234              rry.append((rr[0],rr[1]))
235      if r[0].value == "@EXPT":
236        swtch = True
237
238    self.cceg = collections.defaultdict( list )
239    seb = set()
240    sebb = set()
241    for k in self.expts:
242            rr = self.expts[k][1]
243            for j in range(5,min(len(rr),29)):
244              bits = str( rr[j] ).split( ',' )
245              for b in bits:
246                if b in ['1.0','2.0','3.0','4.0','5.0','1','2','3','4','5']:
247                  self.cceg[ obj1[j] + '.' + b[0] ].append( k )
248                else:
249                  seb.add(b)
250                  sebb.add(rr[j])
251           
252
253scannedExpts = scanexpt( i,sht,dq, obj1 )
254scannedVars =  scanvar(cc,dq)
255
256oo = open( 'viacsab.csv', 'w' )
257oo.write( '_variableGroup\t%s\t%s\t%s\n' % ('uid','label','title') )
258oo.write( '_requestLink\t%s\tVIACSAB\t%s\t%s\t%s\n' % ('uid','objective','title','vgid') )
259oo.write( '_requestVar\t%s\t%s\t%s\t%s\t%s\n' % ('uid','var','mipTable','vid','vgid') )
260oo.write( '_requestItem\t%s\t%s\t%s\t%s\t%s\n' % ('uid','rlid','eid','label','title') )
261
262res = collections.defaultdict( list )
263res['_variableGroup'].append( ('uid','label','title') )
264res['_requestLink'].append( ('uid','objective','mipTable','title','vgid') )
265res['_requestVar'].append( ('uid','var','mipTable','vid','vgid') )
266res['_requestItem'].append( ('uid','rlid','eid','label','title') )
267res['_objective'].append( ('uid','mip','label','title','description') )
268res['_objectiveLink'].append( ('uid','label','title','oid','rid') )
269## request groups and links
270vguid = {}
271rluid = {}
272obuid = {}
273for ob in set(obj1):
274  if ob != "":
275    oid = str( uuid.uuid1() )
276    res['objective'].append( (oid,'VIACSAB',ob,'VIACSAB: %s' % ob, '%s requirements input to VIACSAB' % ob) )
277    obuid[ob] = oid
278
279vguid = {}
280rluid = {}
281for k in ccvg:
282  label = string.replace( k, '.', '-' )
283  if label in vgmap1:
284    uid = vgmap1[label]
285  else:
286    uid = vguid.get( k, str( uuid.uuid1() ) )
287    print 'WARNING: %s not found in vgmap1' % k
288  if k not in vguid:
289    vguid[k] = uid
290  rluid[k] = str( uuid.uuid1() )
291  obj = string.split( k, '.' )[0]
292  assert obj in obj1, 'unrecognised objective found'
293  title = 'VIACSAB: %s' % k
294  oo.write( 'variableGroup\t%s\t%s\t%s\n' % (uid,label,title) )
295  res['variableGroup'].append( (uid,label,title) )
296  oo.write( 'requestLink\t%s\tVIACSAB\t%s\t%s\t%s\n' % (rluid[k],obj,title,uid) )
297  res['requestLink'].append( (rluid[k],obj,'VIACSAB',label,title,uid) )
298  res['objectiveLink'].append( (str( uuid.uuid1() ),obj,title, obuid[obj], rluid[k] ) )
299
300## request variables
301for k in ccvg:
302  l1 = len( ccvg[k] )
303  n1 = 0
304  vgid = vguid[k]
305  for a,b,c in ccvg[k]:
306    t = (b,c)
307    if t in scannedVars.vmap:
308       n1 += 1
309       uid = str( uuid.uuid1() )
310       tab, var, vid = scannedVars.vmap[t]
311       title = '%s: %s' % (k,var)
312       oo.write( 'requestVar\t%s\t%s\t%s\t%s\t%s\n' % (uid,var,tab,vid,vgid) )
313       res['requestVar'].append( (uid,var,tab,vid,vgid) )
314    else:
315       print 'WARNING.var.0001: not found: %s.%s' % (b,c)
316  print 'VARGROUP: ',k,l1,n1
317
318## request items
319for k in scannedExpts.cceg:
320  if k not in rluid:
321    print 'ERROR %s not found in request links (-> variable groups)' % k
322  else:
323    for sfx in ['','b','c','d']:
324      kk = k + sfx
325      if kk in rluid:
326        rlid = rluid[kk]
327        for e in scannedExpts.cceg[k]:
328          title = '%s: %s' % (kk,e)
329          label = e
330          eid = scannedExpts.expts[e][2]
331          uid = str( uuid.uuid1() )
332          oo.write( 'requestItem\t%s\t%s\t%s\t%s\t%s\n' % (uid,rlid,eid,label,title) )
333          res['requestItem'].append( (uid,rlid,eid,label,title) )
334oo.close()
335### variable groups: VIACSAB-<requester>-<n>
336### request link:  .....
337### request item: for each experiment.
Note: See TracBrowser for help on using the repository browser.