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

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

adding missing file

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       sht = wb.book.sheet_by_name( sn )
67       for i in range( sht.nrows ):
68         r = [x.value for x in sht.row(i)]
69         print '>>> ',r
70         if r[1] != 'Label':
71           u = self.uByLab[ r[1] ]
72           if u in self.summary:
73             lab, tmid, spid, title, description, fv, tlab = self.summary[u]
74             if title != r[2]:
75               print 'SEVERE: title mismatch :',title,r[2],r[1],lab,u
76             t = (tmid,spid,r[4],r[5],r[6],r[7],r[8])
77             if t in self.map:
78                print 'Duplicate lookup ... %s' % str(t)
79                print '--------',(u,lab,title,description,fv)
80                print '--------',self.map[t]
81             self.map[t] = (u,lab,title,description,fv,tlab,True)
82           else:
83             if len(r[0]) > 8 and r[0][0] == '*':
84                if r[3] in self.ldsp.uidByLab:
85                  spid = self.ldsp.uidByLab[r[3]]
86                  t = (sn,spid,r[4],r[5],r[6],r[7],r[8])
87                  if t in self.map:
88                     print 'Duplicate lookup [2] ... %s' % str(t)
89                     print '--------',(u,lab,title,description,fv)
90                     print '--------',self.map[t]
91                     self.map[t] = (u,r[1],'','','',sn,False)
92                  print 'INFO.str.0042: generating incomplete record %s: %s' % (r[1],r[2])
93                else:
94                  print 'INFO.str.0041: ignoring %s: %s' % (r[1],r[2])
95             elif r[1] not in self.labs and r[1] not in self.force:
96               print 'INFO.str.0040: ignoring %s: %s' % (r[1],r[2])
97             else:
98               print 'ERROR: no uid found for ..:',sn,r
99
100  def save(self):
101    sh = shelve.open( 'inSh/structRef', 'n' )
102    sh['__info__'] = 'Created by ifiles.struct .. information about structures keyed on tmid, spid, odims, coords, cell_methods, cell_measures, flag_meanings'
103    sh['__cols__'] = ['tmid', 'spid', 'odims', 'coords', 'cell_methods', 'cell_measures', 'flag_meanings', 'uid','label','title','description','flag_values', 'time_label']
104    s1 = set()
105    for k in self.map:
106      u = self.map[k][0]
107      sh[u] = list(k) + list(self.map[k])
108      rr = sh[u][:7]
109      rr[0] = self.map[k][-1]
110      tt = tuple(rr)
111      if tt in s1:
112        print 'SEVERE: duplicate of prospective lookup .... ',tt
113      s1.add(tt)
114      if tt[5] == '@OPT':
115         print tt, u, sh[u]
116    sh.close()
117
118           
119class probDup(object):
120  def __init__(self):
121    self.fl = sorted( glob.glob( 'ingest_files/cmv_probDuplication*.xls' ) )
122    self.cc = collections.defaultdict( list )
123    self.cch = dict()
124    self.records = dict()
125
126  def read(self):
127    for f in self.fl:
128      wb=workbook( f )
129      sht = wb.book.sheet_by_name( 'Sheet1' )
130      key = None
131      for i in range( sht.nrows ):
132        rr = [x.value for x in sht.row(i)]
133        if rr[0] == 'NEXT':
134          key = tuple( rr[1:] )
135        else:
136          u = rr[1]
137          assert u not in self.records, 'Duplicate mappings for %s' % u
138          self.records[u] = rr
139          self.cc[key].append( rr[:2] )
140
141  def review(self):
142    print 'INFO:number of records: %s' % len(self.cc.keys())
143    nsk = 0
144    nch = 0
145    for k in self.cc:
146      c1 = collections.defaultdict( set )
147      kb = set()
148      for r in self.cc[k]:
149        c1[r[0]].add( r[1] )
150        if r[0] not in ['+','-']:
151          kb.add( r[0] )
152      if len(kb) > 0:
153        print 'WARN: unrecognised directives: %s: %s' % (str(k),str(kb))
154      elif len( c1['-'] )  == 0:
155        nsk += 1
156      elif len( c1['+'] ) == 1:
157        nch += 1
158        assert k not in self.cch, 'Duplicate change record key: %s' % k
159        self.cch[k] = (list( c1['+'] )[0],sorted( list( c1['-'] ) ) )
160      else:
161        print 'WARN: cannot scan directives: %s: n+: %s; n-:%s' % (str(k),len( c1['+'] ),len( c1['-'] ))
162    print 'INFO: records with no actions: %s' % nsk
163    print 'INFO: records with change instruction: %s' % nch
164
165if __name__ == '__main__':
166  #pd = probDup()
167  #pd.read()
168  #pd.review()
169
170  s = struct()
171  s.read()
172  s.save()
Note: See TracBrowser for help on using the repository browser.