source: CMIP6dreqbuild/trunk/src/framework/dreqPy/misc_utils.py @ 902

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

cleaned examples and import structure

Line 
1import collections, string , os
2import logging
3import time
4
5def vfmt( x ):
6            if x < 1.e9:
7              s = '%sM' % int( x*1.e-6 )
8            elif x < 1.e12:
9              s = '%sG' % int( x*1.e-9 )
10            elif x < 1.e13:
11              s = '%3.1fT' % ( x*1.e-12 )
12            elif x < 1.e15:
13              s = '%3iT' % int( x*1.e-12 )
14            elif x < 1.e18:
15              s = '%3iP' % int( x*1.e-15 )
16            else:
17              s = '{:,.2f}'.format( x*1.e-9 )
18            return s
19
20def setMlab( m ):
21      if type(m) == type(''):
22        if m == '_all_':
23          mlab = 'TOTAL'
24        else:
25          mlab = m
26      else:
27        ll = sorted( [x.lower() for x in list(m)] )
28        if len(ll) == 1:
29          mlab = list(m)[0]
30        else:
31          mlab='.'.join( [ x[:2].lower() for x in ll ] )
32      return mlab
33
34class dreqLog(object):
35  def __init__(self, dir='.'):
36    self.tstring2 = '%4.4i%2.2i%2.2i' % time.gmtime()[0:3]
37    self.logdir = dir
38    if not os.path.isdir( dir ):
39      os.mkdir(dir )
40      print ( 'dreqLog: making a new directory fr log files: %s' % dir )
41
42  def getLog(self,name,dir=None):
43    if dir == None:
44      dir = self.logdir
45    testLogFile = '%s/dreq_%s_%s.txt' % (dir,name,self.tstring2)
46    log = logging.getLogger(testLogFile)
47    fHdlr = logging.FileHandler(testLogFile,mode='w')
48    fileFormatter = logging.Formatter('%(message)s')
49    fHdlr.setFormatter(fileFormatter)
50    log.addHandler(fHdlr)
51    log.setLevel(logging.INFO)
52    return log
53
54def rankCMORvars(dq):
55  """Unused in 01.beta.32"""
56  cc = collections.defaultdict( set )
57  ee = {}
58  kd = 0
59  ff = {}
60  for ic in dq.coll['CMORvar'].items:
61    s = set()
62    r = set()
63    i = dq.inx.uid[ ic.vid ]
64    if i._h.label != 'remarks':
65      kk = '%s.%s' % (ic.mipTable, ic.label)
66      if i.title != ic.title:
67        print ( '%s: %s, %s' % (kk, ic.title, i.title) )
68        kd += 1
69      if string.find( ic.modeling_realm, ' ' ) != -1:
70         for x in string.split( ic.modeling_realm ):
71            r.add( string.strip( x ) )
72      elif ic.modeling_realm not in ['__unset__','']:
73          r.add( ic.modeling_realm )
74      if 'requestVar' in dq.inx.iref_by_sect[ic.uid].a:
75          for x in dq.inx.iref_by_sect[ic.uid].a['requestVar']:
76            s.add(x)
77
78    if len(s) > 0:
79      ee[kk] = r
80      ff[kk] = i
81      ss = sorted( [dq.inx.uid[x].priority for x in s] )
82      if len(ss) > 1:
83        kk = '%s-%s' % (ss[0],ss[1])
84        sn = dq.inx.uid[i.sn]
85        if sn._h.label == 'remarks':
86          kk += 'x'
87        cc[kk].add( i.label )
88    else:
89      print ( '%s not used' % i.label )
90  print ( kd )
91  return (cc,ee,ff)
92
93def rankVars(dq):
94  """Find the maximal priorities at which variables are requested ... to prioritise checking .. called by sm1"""
95  cc = collections.defaultdict( set )
96  ee = {}
97  ff = {}
98  for i in dq.coll['var'].items:
99    s = set()
100    r = set()
101    if 'CMORvar' in  dq.inx.iref_by_sect[i.uid].a:
102      for cmv in dq.inx.iref_by_sect[i.uid].a['CMORvar']:
103        ic = dq.inx.uid[cmv]
104        if string.find( ic.modeling_realm, ' ' ) != -1:
105          for x in string.split( ic.modeling_realm ):
106            r.add( string.strip( x ) )
107        elif ic.modeling_realm not in ['__unset__','']:
108          r.add( ic.modeling_realm )
109        if 'requestVar' in dq.inx.iref_by_sect[cmv].a:
110          for x in dq.inx.iref_by_sect[cmv].a['requestVar']:
111            s.add(x)
112
113    if len(s) > 0:
114      ee[i.label] = r
115      ff[i.label] = i
116      ss = sorted( [dq.inx.uid[x].priority for x in s] )
117      if len(ss) > 0:
118        kk = '%s' % (ss[0])
119        sn = dq.inx.uid[i.sn]
120        if sn._h.label == 'remarks':
121          kk += 'x'
122        cc[kk].add( i.label )
123    else:
124      print ( '%s not used' % i.label )
125  return (cc,ee,ff)
126
127def getExptSum(dq,mip,rqi):
128  """Return a dictionary of experiment uids keyed on MIPs, from list of request items (used in makeTables)"""
129  cc = collections.defaultdict( set )
130  for i in rqi:
131    es = dq.inx.uid[i.esid]
132    if es._h.label == 'experiment':
133      cc[es.mip].add(es.uid)
134    elif es._h.label in ['exptgroup','mip']:
135      if 'experiment' in dq.inx.iref_by_sect[i.esid].a:
136        for id in dq.inx.iref_by_sect[i.esid].a['experiment']:
137          ex = dq.inx.uid[id]
138          cc[ex.mip].add(id)
139
140  return cc
141
142class rqiSet(object):
143  """Unused in 01.beta.32"""
144  npy = {'1hrClimMon':24*12, 'daily':365, u'Annual':1, u'fx':0.01, u'1hr':24*365, u'3hr':8*365,
145       u'monClim':12, u'Timestep':100, u'6hr':4*365, u'day':365, u'1day':365, u'mon':12, u'yr':1,
146       u'1mon':12, 'month':12, 'year':1, 'monthly':12, 'hr':24*365, 'other':24*365,
147        'subhr':24*365, 'Day':365, '6h':4*365, '3 hourly':8*365, '':1 }
148  def __init__(self,dq,rqi=None,byMip=None):
149    self.dq = dq
150    if rqi != None:
151      assert byMip == None, 'ERROR.rqiSet.001: Cannot have rqi and byMip both assigned'
152      self.rqi = rqi
153    elif byMip != None:
154      self.rqi = [i for i in dq.coll['requestItem'].items if i.mip == byMip]
155    else:
156      self.rqi = dq.coll['requestItem'].items
157
158    self.verbose = False
159    if self.verbose:
160      print ( 'INFO.rqiSet.00001: initialised, len(rqi) = %s' % len(self.rqi) )
161
162  def run(self,vsz,rqi=None,pmax=1,tiermax=1,plist=False):
163    self.exptVarSum(pmax=pmax,plist=plist,tiermax=tiermax)
164    self.exptVarVol(vsz,plist=plist,tiermax=tiermax)
165
166  def getVarList(self,rqi,pmax=1):
167    cc = collections.defaultdict( list )
168    for i in rqi:
169      rl = self.dq.inx.uid[i.rlid]
170      if 'requestVar' in self.dq.inx.iref_by_sect[rl.refid].a:
171        for id in self.dq.inx.iref_by_sect[rl.refid].a['requestVar']:
172          rq = self.dq.inx.uid[id]
173          if rq.priority <= pmax:
174            cc[rq.vid].append( (i.ny, i.nymax, i.nenmax,rl.grid,i.uid) )
175    ee = {}
176    for vid in cc.keys():
177      if len( cc[vid] ) == 1:
178        ee[vid] = cc[vid][0]
179      else:
180        ll = [x[0] for x in cc[vid] if x[0] > 0]
181        if len(ll) == 0:
182          ny = -1
183        else:
184          ny = max(ll)
185        ll = [x[1] for x in cc[vid] if x[1] > 0]
186        if len(ll) == 0:
187          nymax = -1
188        else:
189          nymax = max(ll)
190        ll = [x[2] for x in cc[vid] if x[2] > 0]
191        if len(ll) == 0:
192          nenmax = -1
193        else:
194          nenmax = max(ll)
195        ss = set( [x[3] for x in cc[vid]] )
196        rqil =  [x[4] for x in cc[vid] ] 
197        ee[vid] = (ny,nymax,nenmax,list(ss),rqil )
198
199    return ee
200
201  def exptVarSum(self,exptsOk=False,pmax=1,plist=True,tiermax=1):
202    if not exptsOk:
203      self.exptByMip(tiermax=tiermax)
204
205    self.exvars = {}
206    for m in sorted( self.expts.keys() ):
207      for i in self.expts[m]:
208        rqi = [self.dq.inx.uid[x] for x in self.exrqi[i] ]
209
210## obtain dictionary, keyed om CMORvar uid, of variables requested
211        ee = self.getVarList( rqi, pmax=pmax )
212        ex = self.dq.inx.uid[i]
213        if plist:
214          print ( 'exptVarSum: %s, %s, %s (%s)' % (m,ex.label,len( ee.keys() ), len( rqi)) )
215        self.exvars[i] = ee
216
217  def exptVarVol(self,vsz,plist=True,tiermax=1):
218    nttt = 0
219##
220## exvarvol is a dictionary of dictionaries. key 1: experiment uid.
221##                                           key 2: cmor variable uid
222##                               content: 5-tuple: ntot: floats requested
223##                                                    s: floats per time instant
224##                                                  npy: number of outputs per year
225##                                                   ny: number of years of output
226##                                                  nen: number of ensembles
227####################################################################################
228    self.exvarvol = {}
229    for m in sorted( self.expts.keys() ):
230      for i in self.expts[m]:
231        ee = self.exvars[i]
232        ex = self.dq.inx.uid[i]
233##
234## experiment has list of ensemble size (ensz) against tier (tier)
235## max ensz st. tier <= tiermax
236##
237        l = [x for x in ex.tier if x <= tiermax]
238        exensz = ex.ensz[len(l)-1]
239
240        cmvd = {}
241        nn = 0
242        nerr = 0
243        for k in ee:
244          cmv = self.dq.inx.uid[k]
245          if cmv._h.label == 'CMORvar':
246            s = vsz[cmv.stid]
247            npy = self.npy[cmv.frequency]
248            nyi = ee[k][0]
249            if ex.yps < 0:
250              ny = nyi
251            else:
252              ny = min( [ex.yps,nyi] )
253            ne = ee[k][2]
254            if ne < 0:
255              nen = exensz
256            else:
257              nen = min( [ne,exensz] )
258            ntot = s*npy*ny*nen
259##
260## need to do more on various options here
261##
262            cmvd[k] = (ntot,s,npy,ny,nen)
263            nn += ntot
264          else:
265            nerr += 1
266        if plist:
267          print ( 'exptVarVol: %s, %s, %s[%s]: %9.4fTb' % (m,ex.label,len( ee.keys() ), nerr, nn*2.*1.e-12) )
268        nttt += nn
269        self.exvarvol[i] = cmvd
270
271    if plist:
272      print ( 'TOTAL: %9.3fTb' % (nttt*2*1.e-12) )
273       
274  def exptByMip(self,tiermax=1):
275    cc = collections.defaultdict( list )
276    for i in self.rqi:
277      cc[i.mip].append( i )
278
279    ks = sorted( list( cc.keys() ) )
280    for k in ks:
281      self.getExptByThisMip(k,cc[k],tiermax=tiermax)
282
283  def getExptByThisMip(self,mip,rqi,tiermax=1):
284    self.expts = collections.defaultdict( set )
285    self.exrqi = collections.defaultdict( set )
286    for i in rqi:
287      es = self.dq.inx.uid[i.esid]
288
289## check to see if "treset" override is present and below tiermax
290      tover = False
291      if 'treset' in i.__dict__ and i.treset != '__unset__':
292        tover = i.treset <= tiermax
293       
294      if es._h.label == 'experiment':
295        if es.tier[0] <= tiermax or tover:
296          self.expts[es.mip].add(es.uid)
297          self.exrqi[es.uid].add( i.uid )
298      elif es._h.label in ['exptgroup','mip']:
299        if 'experiment' in self.dq.inx.iref_by_sect[i.esid].a:
300          for id in self.dq.inx.iref_by_sect[i.esid].a['experiment']:
301            ex = self.dq.inx.uid[id]
302            if ex.tier[0] <= tiermax or tover:
303              self.expts[ex.mip].add(id)
304              self.exrqi[id].add( i.uid )
305    ks = sorted( list( self.expts.keys() ) )
306    xx = string.join( ['%s: %s' % (k,len(self.expts[k])) for k in ks], ', ' )
307    print ( '%s:: %s' % (mip,xx) )
308
309class c1(object):
310  def __init__(self):
311    self.a = collections.defaultdict( int )
Note: See TracBrowser for help on using the repository browser.