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

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

misc updates

Line 
1import glob, collections, shelve
2from utils_wb import workbook
3
4class icol(object):
5  def __init__(self):
6    self.cc = collections.defaultdict( list )
7
8class loadSpatial(object):
9  def __init__(self):
10    wb = workbook( '../workbook/inputs/spatialShape_ref.xls' )
11    s1 = wb.book.sheet_by_name(u'ss_ref')
12    self.ss = {}
13    self.labByUid = {}
14    self.uidByLab = {}
15    uu = set()
16    for i in range(s1.nrows):
17      rr = [x.value for x in s1.row(i)]
18      if rr[0] != 'label':
19        assert rr[2] not in self.ss, 'Duplicate dimension set in spatial shape sheet: %s' % rr[2]
20        a,b,k,lf = tuple( [x.strip() for x in rr[:4] ] )
21        li = str( int( rr[4] ) )
22        u = str( rr[6] )
23        assert u not in uu, 'Duplicate uid in spatialShape_ref.xls: %s' % u
24        self.labByUid[u] = rr[0]
25        self.uidByLab[rr[0]] = u
26        self.ss[ k ] = (a,b,lf,li,u)
27
28class struct(object):
29  def __init__(self):
30    self.force = ('str-a02',)
31    self.f = '../workbook/inputs/structRef.xls'
32    self.ih = ['Label', 'Title', 'Spatial shape', 'Other dims', 'coords', 'cell methods', 'cell measures', 'flag meanings', 'flag values', 'Spatial shape (title)', 'Spatial dimensions']
33    ii = open( '../workbook/inputs/strUidMap.txt' )
34    self.uByLab = {}
35    self.ldsp = loadSpatial()
36    self.summary = {}
37    for l in ii.readlines():
38      l,u = l.strip().split()
39      self.uByLab[ l ] = u
40    ii.close()
41    ii = open( 'strRef2.txt' )
42    self.labs = set()
43    for l in ii.readlines():
44      bits = l.strip().split( '\t' )
45      description = ''
46      if len(bits) == 8:
47        u, lab, spid, tmid, title, description, flag_values, tlab = bits
48      else:
49        print 'SEVERE: can not parse ',l
50        raise
51      description = description[1:-1]
52      flag_values = flag_values[1:-1]
53      self.summary[u] = (lab, tmid, spid, title, description, flag_values, tlab)
54      self.labs.add(lab)
55    ii.close()
56
57## (i.tmid,i.spid,i.odims,i.coords,i.cell_methods,i.cell_measures,i.flag_meanings)
58## Label        Title   Spatial shape   Other dims      coords  cell methods    cell measures   flag meanings   flag values     Spatial shape (title)   Spatial dimensions
59
60
61  def read(self):
62    self.map = dict()
63    wb=workbook( self.f )
64    print wb.sns
65    for sn in sorted( wb.sns ):
66      if sn != '__mods__':
67       sht = wb.book.sheet_by_name( sn )
68       for i in range( sht.nrows ):
69         r = [x.value for x in sht.row(i)]
70         print '>>> ',r
71         if r[1] != 'Label':
72           u = self.uByLab[ r[1] ]
73           if u in self.summary:
74             lab, tmid, spid, title, description, fv, tlab = self.summary[u]
75             if title != r[2]:
76               print 'SEVERE: title mismatch :',title,r[2],r[1],lab,u
77             t = (tmid,spid,r[4],r[5],r[6],r[7],r[8])
78             if t in self.map:
79                print 'Duplicate lookup ... %s' % str(t)
80                print '--------',(u,lab,title,description,fv)
81                print '--------',self.map[t]
82             self.map[t] = (u,lab,title,description,fv,tlab,True)
83           else:
84             if len(r[0]) > 8 and r[0][0] == '*':
85                if r[3] in self.ldsp.uidByLab:
86                  spid = self.ldsp.uidByLab[r[3]]
87                  t = (sn,spid,r[4],r[5],r[6],r[7],r[8])
88                  if t in self.map:
89                     print 'Duplicate lookup [2] ... %s' % str(t)
90                     print '--------',(u,lab,title,description,fv)
91                     print '--------',self.map[t]
92                     self.map[t] = (u,r[1],'','','',sn,False)
93                  print 'INFO.str.0042: generating incomplete record %s: %s' % (r[1],r[2])
94                else:
95                  print 'INFO.str.0041: ignoring %s: %s' % (r[1],r[2])
96             elif r[1] not in self.labs and r[1] not in self.force:
97               print 'INFO.str.0040: ignoring %s: %s' % (r[1],r[2])
98             else:
99               print 'ERROR: no uid found for ..:',sn,r
100
101  def save(self):
102    sh = shelve.open( 'inSh/structRef', 'n' )
103    sh['__info__'] = 'Created by ifiles.struct .. information about structures keyed on tmid, spid, odims, coords, cell_methods, cell_measures, flag_meanings'
104    sh['__cols__'] = ['tmid', 'spid', 'odims', 'coords', 'cell_methods', 'cell_measures', 'flag_meanings', 'uid','label','title','description','flag_values', 'time_label']
105    s1 = set()
106    for k in self.map:
107      u = self.map[k][0]
108      sh[u] = list(k) + list(self.map[k])
109      rr = sh[u][:7]
110      rr[0] = self.map[k][-1]
111      tt = tuple(rr)
112      if tt in s1:
113        print 'SEVERE: duplicate of prospective lookup .... ',tt
114      s1.add(tt)
115      if tt[5] == '@OPT':
116         print tt, u, sh[u]
117    sh.close()
118
119           
120class probDup(object):
121  def __init__(self):
122    self.fl = sorted( glob.glob( 'ingest_files/cmv_probDuplication*.xls' ) )
123    self.cc = collections.defaultdict( list )
124    self.cch = dict()
125    self.records = dict()
126
127  def read(self):
128    for f in self.fl:
129      wb=workbook( f )
130      sht = wb.book.sheet_by_name( 'Sheet1' )
131      key = None
132      for i in range( sht.nrows ):
133        rr = [x.value for x in sht.row(i)]
134        if rr[0] == 'NEXT':
135          key = tuple( rr[1:] )
136        else:
137          u = rr[1]
138          assert u not in self.records, 'Duplicate mappings for %s' % u
139          self.records[u] = rr
140          self.cc[key].append( rr[:2] )
141
142  def review(self):
143    print 'INFO:number of records: %s' % len(self.cc.keys())
144    nsk = 0
145    nch = 0
146    for k in self.cc:
147      c1 = collections.defaultdict( set )
148      kb = set()
149      for r in self.cc[k]:
150        c1[r[0]].add( r[1] )
151        if r[0] not in ['+','-']:
152          kb.add( r[0] )
153      if len(kb) > 0:
154        print 'WARN: unrecognised directives: %s: %s' % (str(k),str(kb))
155      elif len( c1['-'] )  == 0:
156        nsk += 1
157      elif len( c1['+'] ) == 1:
158        nch += 1
159        assert k not in self.cch, 'Duplicate change record key: %s' % k
160        self.cch[k] = (list( c1['+'] )[0],sorted( list( c1['-'] ) ) )
161      else:
162        print 'WARN: cannot scan directives: %s: n+: %s; n-:%s' % (str(k),len( c1['+'] ),len( c1['-'] ))
163    print 'INFO: records with no actions: %s' % nsk
164    print 'INFO: records with change instruction: %s' % nch
165
166if __name__ == '__main__':
167  #pd = probDup()
168  #pd.read()
169  #pd.review()
170
171  s = struct()
172  s.read()
173  s.save()
Note: See TracBrowser for help on using the repository browser.