source: CMIP6dreq/trunk/dreqPy/misc_utils.py @ 886

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/dreqPy/misc_utils.py@886
Revision 886, 9.6 KB checked in by mjuckes, 3 years ago (diff)

release cand

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