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

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

release 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'
12
13wb = workbook(idir + fn)
14sht = wb.book.sheet_by_name( 'VIACS AB Template' )
15print sht.nrows
16cc = collections.defaultdict( list )
17ccd = collections.defaultdict( dict )
18ccvg = collections.defaultdict( list )
19ccd2 = collections.defaultdict( dict )
20ccmt = collections.defaultdict( dict )
21
22dq = dreq.loadDreq()
23
24for i in dq.coll['miptable'].items:
25  for u in dq.inx.iref_by_sect[i.uid].a['CMORvar']:
26    cmv = dq.inx.uid[u]
27    ccmt[i.label][cmv.label] = u
28
29for i in dq.coll['CMORvar'].items:
30  ccd2[i.mipTable][i.label] = i.uid
31
32ts = set( [type('s'),type( u's' )] )
33thissect = None
34done = False
35i = 0
36def stripr( r ):
37  k = 0
38  for i in range(len(r)):
39    if r[i].value not in ['',None,u'']:
40      k = i
41  return r[:k+1]
42
43
44obj = [x.value for x in sht.row(21)]
45obj1 = obj[:]
46for i in range(5,25):
47   if string.find( obj1[i], ' ' ) != '-1':
48     obj1[i] = obj1[i].split()[0]
49for i in range(25,30):
50   obj1[i] = 'climateServices'
51
52sb = set()
53sbb = set()
54
55while not done:
56  r = sht.row(i)
57  r0 = r[0].value
58  if type(r0) in ts and len(r0) > 0 and r0[0] == '@':
59     thissect = str( r0[1:] )
60     if r0[:5] == '@SECT':
61       done = True
62
63  if thissect not in [None,'SECT']:
64    if thissect in ['3hr','Omon','day']:
65      sfx = 'c'
66    elif thissect in ['6hrLev']:
67      sfx = 'd'
68    else:
69      sfx = ''
70
71    r1 = stripr(r)
72    if len( r1 ) > 5:
73      rr = [x.value for x in r1]
74      if rr[2] != '':
75        cc[thissect].append( ('ln', i,rr[2]) )
76        for j in range(5,min(len(rr),29)):
77          bits = str( rr[j] ).split( ',' )
78          for b in bits:
79            if b in ['1.0','2.0','3.0','4.0','5.0']:
80              ccvg[ obj1[j] + '.' + b[0] + sfx ].append( ('ln',i,rr[2]) )
81            elif b in ['3b']:
82              ccvg[ obj1[j] + '.' + b ].append( ('ln',i,rr[2]) )
83            else:
84              sb.add(b)
85              sbb.add(rr[j])
86
87        ccd[thissect][ (i,rr[2]) ] = rr[5:]
88  i += 1
89
90def scanSect2(i):
91  done = False
92  while not done:
93    r = sht.row(i)
94    r0 = r[0].value
95    print 'INFO.SECT9.00001: ',r0
96    if r0=='@ENDSECT':
97      done = True
98    elif type(r0) in ts and len(r0) > 0 and r0[0] == '*':
99      r1 = stripr(r)
100      rr = [x.value for x in r1]
101      if string.find(r0,':') != -1:
102        r0 = r0.split(':')[0]
103      vv,tab = r0[1:].split( '.' )
104      if tab in ccd2 and vv in ccd2[tab]:
105        print 'INFO.SECT2.0001: ',('mt',i,(vv,tab))
106        cc['sect2'].append( ('mt',i,(vv,tab)) )
107        for j in range(5,min(len(rr),29)):
108          bits = str( rr[j] ).split( ',' )
109          for b in bits:
110            if b in ['1.0','2.0','3.0','4.0','5.0']:
111              ccvg[ obj1[j] + '.' + b[0] ].append( ('mt',i,(vv,tab)) )
112              print 'INFO.SECT2.0002: ',obj1[j] + '.' + b[0],('mt',i,(vv,tab))
113            else:
114              sb.add(b)
115              sbb.add(rr[j])
116      else:
117        print 'ERROR.SECT2.0001 (variable not found): ',vv,tab
118    i+= 1
119  return i
120
121i = scanSect2(i)
122
123ks = sorted( cc.keys() )
124oo = open( 'sorted.csv', 'w' )
125for k in ks:
126  print  k, len( cc[k] )
127  ##print sorted( cc[k] )
128  for m, i,n in cc[k]:
129    oo.write( '%s\t%s\t%s\n' % (k,n,i) )
130oo.close()
131
132import cmip5so
133
134class s1(object):
135  def __init__(self):
136    self.a = collections.defaultdict( list )
137
138cc2 = collections.defaultdict( s1 )
139for k in cmip5so.so:
140   for v in cmip5so.so[k].a:
141      ttl = str( cmip5so.so[k].a[v][1] )
142      cc2[k].a[ttl].append(v)
143
144vgmap1 = {}
145for x in dq.coll['requestVarGroup'].items:
146  if x.label in vgmap1:
147    print 'ERROR: duplicate requestVarGroup label ...:',x.label,x.uid
148  else:
149    vgmap1[x.label] = x.uid
150
151class scanvar(object):
152  def __init__(self,cc,dq):
153    s1 = {}
154    for i in dq.coll['CMORvar'].items:
155      tab = i.mipTable
156      s1['%s.%s' % (i.label,tab)] = i.uid
157
158    self.vmap = {}
159    self.vmap3 = {}
160    self.vmapx = {}
161    for k0 in cc.keys():
162      k = {'fx:o':'fx', 'fx:a':'fx', 'aero':'aermonthly', 'OImon':'SImon'}.get( k0, k0)
163
164      cc0 = collections.defaultdict( int )
165      if k not in cmip5so.so and k0 != 'sect2':
166         print 'SEVERE: Key %s not found' % k
167      else:
168         for a,b,c in cc[k0]:
169           if a == 'ln':
170             t = (b,c)
171             if t[1] not in cc2[k].a:
172               print 'Long name %s:%s not found' % (k,t[1])
173             elif len( cc2[k].a[t[1]] ) == 2:
174               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] ):
175                 print 'INFO: Probable option set %s, %s: %s' % ( k,t[1],str( cc2[k].a[t[1]] ) )
176                 self.vmap3[t] = (k, cc2[k].a[t[1]][0], cc2[k].a[t[1]][1] )
177               else:
178                 print 'WARNING: Dual distinct targets %s, %s: %s' % ( k,t[1],str( cc2[k].a[t[1]] ) )
179             elif len( cc2[k].a[t[1]] ) > 1:
180               print 'WARNING: Multiple targets %s, %s: %s' % ( k,t[1],str( cc2[k].a[t[1]] ) )
181             else:
182               kv = '%s.%s' % (cc2[k].a[t[1]][0],k)
183               if kv in s1:
184                 self.vmap[t] = (k, cc2[k].a[t[1]][0], s1[kv] )
185               else:
186                 print 'WARNING: dreq item not found ...%s, %s: %s' % ( k,t[1], cc2[k].a[t[1]][0] )
187                 self.vmapx[t] = (k, cc2[k].a[t[1]][0] )
188           else:
189              ## want table, var, uid
190             var, tab = c
191             if tab in ccmt and var in ccmt[tab]:
192               self.vmap[t] = (tab,var,ccmt[tab][var])
193               print 'INFO.var.00505: var found: %s: %s.%s: %s' % (a,tab,var,ccmt[tab][var])
194             else:
195               print 'ERROR.var.00505: var not found: %s: %s.%s' % (a,tab,var)
196
197class scanexpt(object):
198  def __init__(self,i0,sht,dq, obj1):
199    s = {}
200    s2 = {}
201    for i in dq.coll['experiment'].items:
202      s[i.label.lower()] = i.uid
203    for i in dq.coll['exptgroup'].items:
204      s2[i.label.lower()] = i.uid
205    ##s = {i.label.lower() for i in dq.coll['experiment'].items}
206    ##s2 = {i.label.lower() for i in dq.coll['exptgroup'].items}
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',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 = 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) )
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.