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

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

adding misc

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