Ignore:
Timestamp:
28/01/16 16:04:07 (4 years ago)
Author:
mjuckes
Message:

candidate

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CMIP6dreq/trunk/dreqPy/scope.py

    r558 r570  
    33The scope.py module contains the dreqQuery class and a set of ancilliary functions. The dreqQuery class contains methods for analysing the data request. 
    44""" 
    5 import dreq 
    6 from utilities import cmvFilter  
     5try: 
     6  import dreq 
     7  from utilities import cmvFilter  
     8except: 
     9  import dreqPy.dreq 
     10  from dreqPy.utilities import cmvFilter  
     11 
    712import collections, string, operator 
    813import sys 
     
    1217  python2 = False 
    1318  from functools import reduce 
    14   from utilP3 import mlog3 
     19  try:  
     20    from utilP3 import mlog3 
     21  except: 
     22    from dreqPy.utilP3 import mlog3 
    1523  mlg = mlog3() 
    1624else: 
     
    4452  else: 
    4553    return min( [a,b] ) 
     54 
     55def filter2( a, b, tt, tm ): 
     56## largest tier less than or equal to tm 
     57  t1 = [t for t in tt if t <= tm][-1] 
     58  it1 = tt.index(t1) 
     59  aa = a[it1] 
     60  if b < 0: 
     61    return aa 
     62  else: 
     63    return min( [aa,b] ) 
    4664 
    4765npy = {'daily':365, u'Annual':1, u'fx':0.01, u'1hr':24*365, u'3hr':8*365, u'monClim':12, u'Timestep':100, u'6hr':4*365, u'day':365, u'1day':365, u'mon':12, u'yr':1, u'1mon':12, 'month':12, 'year':1, 'monthly':12, 'hr':24*365, 'other':24*365, 'subhr':24*365, 'Day':365, '6h':4*365, 
     
    275293      return thisvars 
    276294 
    277   def volByExpt( self, l1, ex, pmax=1, cc=None, retainRedundantRank=False, intersection=False,expFullEx=False ): 
     295  def volByExpt( self, l1, ex, pmax=1, cc=None, retainRedundantRank=False, intersection=False,expFullEx=False, adsCount=False ): 
    278296    """volByExpt: calculates the total data volume associated with an experiment/experiment group and a list of request items. 
    279297          The calculation has some approximations concerning the number of years in each experiment group. 
     
    317335         if inx.uid[u]._h.label != 'remarks': 
    318336           rql.add( u )  
     337    else: 
     338      exi = self.dq.inx.uid[ex] 
     339      if exi._h.label == 'experiment': 
     340        exset = set( [ex,exi.egid,exi.mip] ) 
    319341 
    320342##### 
     
    385407        ##col1 = reduce( operator.or_, [set( inx.iref_by_sect[vg].a['requestVar'] ) for vg in rqvg ] ) 
    386408 
    387 ###The collector col1 here accumulates all the record uids, resulting in a single collection. These are request variables, to get a set of CMOR variables at priority <= pmax: 
    388         ##vars = set() 
    389         ##for l in list(col1): 
    390            ##if inx.uid[l].priority <= pmax: 
    391              ##vars.add(inx.uid[l].vid) 
    392 ## 
    393  
    394409### filter out cases where the request does not point to a CMOR variable. 
    395410    ##vars = {vid for vid in vars if inx.uid[vid][0] == u'CMORvar'} 
     
    424439## 
    425440    nym = {} 
     441 
     442## 
     443## if dataset count rather than volume is wanted, use item 3 from rqiExp tuple. 
     444    if adsCount: 
     445      irqi = 3 
     446    else: 
     447      irqi = 2 
     448 
    426449    for v in vars: 
    427450      s = set() 
     451      cc2 = collections.defaultdict( set ) 
    428452      for i in l1p: 
     453################## 
    429454        if i.esid in exset and v in e[i.rlid]: 
    430           s.add( self.rqiExp[i.uid][2] ) 
     455          ix = inx.uid[i.esid] 
     456          if exi._h.label == 'experiment': 
     457            if ex in self.rqiExp[i.uid][1]: 
     458              this = self.rqiExp[i.uid][1][ex] 
     459              cc2[i.esid].add( this[-1]*this[-2] ) 
     460          elif ix._h.label == 'experiment': 
     461            cc2[i.esid].add( self.rqiExp[i.uid][irqi] ) 
     462          else: 
     463            if 'experiment' in inx.iref_by_sect[i.esid].a: 
     464              for u in inx.iref_by_sect[i.esid].a['experiment']: 
     465                if u in self.rqiExp[i.uid][1]: 
     466                  this = self.rqiExp[i.uid][1][u] 
     467                  cc2[u].add( this[-1]*this[-2] ) 
     468                ###cc2[u].add( self.rqiExp[i.uid][irqi] ) 
     469            ##else: 
     470              ##print 'WARNING .... empty experiment set' 
     471          s.add( self.rqiExp[i.uid][irqi] ) 
    431472      ##nym[v] = max( {self.rqiExp[i.uid][2] for i in l1p if i.esid == ex and v in e[i.rlid]} ) 
    432473      if len(s) == 0: 
    433         nym[v] == 0 
    434       else: 
    435         nym[v] = max( s ) 
     474        nym[v] = 0 
     475      else: 
     476        ##print 'debug2:: ',v,cc2 
     477        nym[v] = sum( [max( cc2[k] ) for k in cc2] ) 
    436478 
    437479    szv = {} 
     
    443485    ff = {} 
    444486    for v in vars: 
    445       ff[v] = self.sz[ inx.uid[v].stid ] * npy[inx.uid[v].frequency] * nym[v] 
     487      if adsCount: 
     488        ff[v] = 1 
     489      else: 
     490        ff[v] = self.sz[ inx.uid[v].stid ] * npy[inx.uid[v].frequency] 
     491        if inx.uid[v].frequency != 'monClim': 
     492          ff[v] = ff[v]*nym[v] 
    446493    self.ngptot = sum( [  ff[v]  for v in vars] ) 
    447494    return (self.ngptot, ee, ff ) 
     
    504551    self.rqiExp = {} 
    505552    for rqi in self.dq.coll['requestItem'].items: 
    506       a,b,c = self.requestItemExp( rqi ) 
     553      a,b,c,d = self.requestItemExp( rqi ) 
    507554      if a != None: 
    508         self.rqiExp[rqi.uid] = (a,b,c) 
     555        self.rqiExp[rqi.uid] = (a,b,c,d) 
    509556 
    510557  def requestItemExp( self, rqi ): 
     
    522569      ##rqi.__info__() 
    523570      ##raise 
    524       return (None, None, None) 
     571      return (None, None, None, None) 
    525572 
    526573    if self.tierMax > 0: 
    527574      expts = [i for i in expts if self.dq.inx.uid[i].tier[0] <= self.tierMax] 
     575 
     576    self.multiTierOnly = False 
     577    if self.multiTierOnly: 
     578      expts = [i for i in expts if len(self.dq.inx.uid[i].tier) > 1] 
     579      print ('Len expts: %s' % len(expts) ) 
    528580 
    529581    if len(expts) > 0: 
     
    532584        if i._h.label != 'experiment': 
    533585          mlg.prnt ( 'ERROR: %s, %s, %s ' % ( u,i._h.label, i.label, i.title ) ) 
    534       dat = [ (i.ntot, i.yps, i.ensz, i.nstart, filter1(i.yps,rqi.nymax), filter1(i.ensz,rqi.nenmax) ) for i in e] 
    535       nytot = sum( [x[-2]*x[-1] for x in dat ] ) 
    536     else: 
    537       dat = [ (0,0,0,0,0) ] 
     586      ##dat = [ (i.ntot, i.yps, i.ensz, i.tier, i.nstart, filter1(i.yps,rqi.nymax), filter2(i.ensz,rqi.nenmax,i.tier,self.tierMax) ) for i in e] 
     587      dat2 = {} 
     588      for i in e: 
     589        dat2[i.uid] = (i.ntot, i.yps, i.ensz, i.tier, i.nstart, filter1(i.yps,rqi.nymax), filter2(i.ensz,rqi.nenmax,i.tier,self.tierMax) ) 
     590      ### number of  
     591      nytot = sum( [dat2[x][-2]*dat2[x][-3] for x in dat2 ] ) 
     592      netot = sum( [dat2[x][-1] for x in dat2 ] ) 
     593      ##print 'debug1:: ',dat, nytot, netot 
     594    else: 
     595      dat2 = {} 
    538596      nytot = 0 
     597      netot = 0 
    539598     
    540     return (expts, dat, nytot ) 
    541      
     599    return (expts, dat2, nytot, netot ) 
    542600 
    543601  def setTierMax( self, tierMax ): 
     
    569627    return l1 
    570628       
    571   def volByMip( self, mip, pmax=2, retainRedundantRank=False, intersection=False): 
     629  def volByMip( self, mip, pmax=2, retainRedundantRank=False, intersection=False, adsCount=False, exptid=None): 
    572630 
    573631    l1 = self.rqiByMip( mip ) 
    574632       
    575633    #### The set of experiments/experiment groups: 
    576     exps = set() 
    577     for i in l1: 
    578       exps.add( i.esid ) 
    579     exps = self.mips 
     634    if exptid == None: 
     635      exps = self.mips 
     636    else: 
     637      exps = set( [exptid,] ) 
     638      ##print exptid, exps 
    580639    self.volByE = {} 
    581640    vtot = 0 
     
    585644      expts = self.esid_to_exptList(e,deref=True,full=False) 
    586645      if expts != None: 
    587         self.volByE[e] = self.volByExpt( l1, e, pmax=pmax, cc=cc, retainRedundantRank=retainRedundantRank, intersection=intersection ) 
     646        self.volByE[e] = self.volByExpt( l1, e, pmax=pmax, cc=cc, retainRedundantRank=retainRedundantRank, intersection=intersection, adsCount=adsCount ) 
    588647        vtot += self.volByE[e][0] 
    589648        self.allVars = self.allVars.union( self.vars ) 
     
    641700      -m <mip>:  MIP of list of MIPs (comma separated); 
    642701      -h :       help: print help text; 
     702      -e <expt>: experiment; 
    643703      -t <tier> maxmum tier; 
    644704      -p <priority>  maximum priority; 
     
    649709  def __init__(self,args): 
    650710    self.adict = {} 
    651     self.knownargs = {'-m':('m',True), '-p':('p',True), '-t':('t',True), '-h':('h',False), '--printLinesMax':('plm',True), '--printVars':('vars',False), '--intersection':('intersection',False)}  
     711    self.knownargs = {'-m':('m',True), '-p':('p',True), '-e':('e',True), '-t':('t',True), '-h':('h',False), '--printLinesMax':('plm',True), '--printVars':('vars',False), '--intersection':('intersection',False),'--count':('count',False)}  
    652712    aa = args[:] 
    653713    while len(aa) > 0: 
     
    691751        if i not in sc.mips: 
    692752          ok = False 
    693           mlg.prnt ( 'NOT FOUND: ',i ) 
     753          mlg.prnt ( 'NOT FOUND: %s' % i ) 
     754 
     755    eid = None 
     756    if self.adict.has_key('e'): 
     757      for i in self.dq.coll['experiment'].items: 
     758        if i.label == self.adict['e']: 
     759          eid = i.uid 
     760      assert eid != None, 'Experiment %s not found' % self.adict['e'] 
     761    print ( 'eid=%s' % eid ) 
    694762    assert ok,'Available MIPs: %s' % str(sc.mips) 
    695  
    696     tierMax = self.adict.get( 't', 2 ) 
     763    adsCount = self.adict.get( 'count', False ) 
     764 
     765    tierMax = self.adict.get( 't', 1 ) 
    697766    sc.setTierMax(  tierMax ) 
    698     pmax = self.adict.get( 'p', 2 ) 
    699     v0 = sc.volByMip( self.adict['m'], pmax=pmax, intersection=self.intersection ) 
    700     mlg.prnt ( '%7.2fTb' % (v0*2.*1.e-12) ) 
     767    pmax = self.adict.get( 'p', 1 ) 
     768    v0 = sc.volByMip( self.adict['m'], pmax=pmax, intersection=self.intersection, adsCount=adsCount, exptid=eid ) 
     769    #mlg.prnt ( '%7.2fTb' % (v0*2.*1.e-12) ) 
     770    mlg.prnt ( '%s' % v0 ) 
    701771    cc = collections.defaultdict( int ) 
    702772    for e in sc.volByE: 
Note: See TracChangeset for help on using the changeset viewer.