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

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

added key VIACSAB integration code

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