Ignore:
Timestamp:
24/11/16 16:09:19 (3 years ago)
Author:
mjuckes
Message:

Updated setup for tag 01.beta.43

File:
1 edited

Legend:

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

    r872 r880  
    2424import collections, string, operator 
    2525import sys, os 
     26 
     27def sortTimeSlice( tsl ): 
     28  s = set() 
     29  for ts in tsl: 
     30    s.add( ts[1] ) 
     31  if len(s) > 1: 
     32    return (-1,None,'Multiple slice types') 
     33  tst = s.pop() 
     34  if not ( tst == 'simpleRange' or (len(tst) > 13 and tst[:13] == 'branchedYears') ): 
     35    return (-2,None,'slice type aggregation not supported') 
     36  if len(tsl) == 2: 
     37    tsll = list( tsl ) 
     38    sa,ea = tsll[0][2:] 
     39    sb,eb = tsll[1][2:] 
     40    if sa <= sb and ea >= eb: 
     41      return (1,tsll[0], 'Taking largest slice') 
     42    if sb <= sa and eb >= ea: 
     43      return (1,tsll[1], 'Taking largest slice') 
     44    if ea < sb or eb < sa: 
     45      return (2,tsll, 'Slices are disjoint') 
     46    return (-3,None, 'Overlapping slices') 
     47  else: 
     48    tsll = sorted( list(tsl), key=lambda x: x[3] ) 
     49    if min( [x[2] for x in tsll] ) == tsll[-1][2]: 
     50        return (1,tsll[-1], 'Taking largest slice') 
     51    return (-4,None, 'Cannot sort slices') 
    2652 
    2753odsz = {'landUse':(5,'free'), 'tau':7, 'scatratio':15, 'effectRadLi|tau':(28,'query pending'), 'vegtype':(8,'free'), 'sza5':5, 'site':(119,'73 for aquaplanet .. '), 'iceband':(5,'free'), 'dbze':15, 'spectband':(10,'free'), 'misrBands':(7,'query pending'), 'effectRadIc|tau':(28,'query pending')} 
     
    195221        elif vd[:4] == 'alev': 
    196222          nz = self.mcfg['nla'] 
    197         elif vd in ['slevel','sdepth']: 
     223        elif vd in ['slevel']: 
    198224          nz = self.mcfg['nls'] 
     225        elif vd in ['snowdepth','sdepth']: 
     226          nz = 5 
    199227        elif vd == 'aslevel': 
    200228          nz = self.mcfg['nlas'] 
     
    274302      if t1(i.mip): 
    275303        if 'requestItem' in self.dq.inx.iref_by_sect[i.uid].a: 
    276           if any( [ self.rqiExp[x][-1] > 0 for  x in self.dq.inx.iref_by_sect[i.uid].a['requestItem'] if x in self.rqiExp ] ): 
     304          if any( [ self.rqiExp[x][3] > 0 for  x in self.dq.inx.iref_by_sect[i.uid].a['requestItem'] if x in self.rqiExp ] ): 
    277305            s.add( i ) 
    278306 
     
    439467    """Parse a set of request links, and get years requested for each (varGroup, expt, grid) tuple """ 
    440468       
     469    self.tsliceDict = collections.defaultdict( dict ) 
     470    ccts = collections.defaultdict( dict ) 
    441471    cc = collections.defaultdict( set ) 
    442472    for rl in rqll: 
     
    459489        for iu in self.dq.inx.iref_by_sect[rl.uid].a['requestItem']: 
    460490          i = self.dq.inx.uid[iu] 
    461           if iu in self.rqiExp: 
    462             for e in self.rqiExp[iu][1]: 
    463               if (ex == None or e in ex) and (exBlack == None or e not in exBlack): 
    464                 this = self.rqiExp[iu][1][e] 
    465                 if this != None: 
    466                   thisns = this[-3] 
    467                   thisny = this[-2] 
    468                   thisne = this[-1] 
    469                   ##cc[ (rl.refid,e,grd) ].add( filter1( thisns*thisny*thisne, i.nymax) ) 
    470                   cc[ (rl.refid,e,grd) ].add( thisns*thisny*thisne ) 
     491 
     492## 
     493## apply "treset" filter to request items linked to this group. 
     494## 
     495          if self.tierMax < 0 or 'treset' not in i.__dict__ or i.treset <= self.tierMax: 
     496            if iu in self.rqiExp: 
     497              for e in self.rqiExp[iu][1]: 
     498                if (ex == None or e in ex) and (exBlack == None or e not in exBlack): 
     499                  this = self.rqiExp[iu][1][e] 
     500                  if this != None: 
     501                    thisns = this[-3] 
     502                    thisny = this[-2] 
     503                    thisne = this[-1] 
     504                    ##cc[ (rl.refid,e,grd) ].add( filter1( thisns*thisny*thisne, i.nymax) ) 
     505                    cc[ (rl.refid,e,grd) ].add( thisns*thisny*thisne ) 
     506                    if self.rqiExp[iu][4] != None: 
     507                      ccts[(rl.refid,e)][thisns*thisny*thisne] = self.rqiExp[iu][4] 
     508 
    471509    ee = collections.defaultdict( dict ) 
    472510 
     
    475513      for g,e,grd in cc: 
    476514        ee[g][(e,grd)] = max( cc[( g,e,grd) ] ) 
     515        if (g,e) in ccts and ee[g][(e,grd)] in ccts[(g,e)]: 
     516           self.tsliceDict[g][e] = ccts[(g,e)][ ee[g][(e,grd)] ] 
    477517      return ee 
    478518    ff = collections.defaultdict( dict ) 
     
    698738        expts.append( esid ) 
    699739    else: 
    700       ##print ( 'WARNING: request link not associated with valid experiment group' ) 
    701       ##raise 
    702740      return None 
    703741 
     
    729767      a,b,c,d,e = self.requestItemExp( rqi ) 
    730768      if a != None: 
    731         self.rqiExp[rqi.uid] = (a,b,c,d) 
     769        self.rqiExp[rqi.uid] = (a,b,c,d,e) 
    732770 
    733771  def requestItemExp( self, rqi ): 
     
    739777        if ts.type == 'simpleRange': 
    740778          tsl = (ts.label,'simpleRange', ts.start,ts.end) 
    741         elif ts.type == 'branchOffsetRange': 
     779        elif ts.type == 'branchedYears': 
    742780          tsl = (ts.label,'%s:%s' % (ts.type,ts.child), ts.start,ts.end) 
    743781        else: 
    744782          tsl = (ts.label, ts.type, None, None ) 
    745         print 'TIME SLICE: ',tsl 
    746783 
    747784       
     
    905942    mxls.run( m, mlab=mlab ) 
    906943 
    907   def cmvByInvMip( self, mip,pmax=1,includeYears=False, exptFilter=None ): 
     944  def cmvByInvMip( self, mip,pmax=1,includeYears=False, exptFilter=None,exptFilterBlack=None ): 
    908945    mips = set( self.mips[:] ) 
    909946    if type(mip) == type( '' ): 
     
    913950        mips.discard( m ) 
    914951 
    915     return self.cmvByMip( mips,pmax=pmax,includeYears=includeYears, exptFilter=exptFilter ) 
     952    return self.cmvByMip( mips,pmax=pmax,includeYears=includeYears, exptFilter=exptFilter, exptFilterBlack=exptFilterBlack ) 
    916953 
    917954  def cmvByMip( self, mip,pmax=1,includeYears=False, exptFilter=None, exptFilterBlack=None ): 
     
    927964      expys = self.exptYears( l1, ex=exptFilter, exBlack=exptFilterBlack ) 
    928965      cc = collections.defaultdict( set ) 
     966      ccts = collections.defaultdict( set ) 
    929967    ss = set() 
    930968    for pr in ee: 
     
    937975          for x in self.dq.inx.iref_by_sect[i.uid].a['requestVar']: 
    938976            i1 = self.dq.inx.uid[x] 
    939             if i1.vid == 'baa586e6-e5dd-11e5-8482-ac72891c3257': 
    940                print 'INFO.cmv.00055: ',i1.vid, i1.priority, i1.mip, i1.title 
     977 
    941978            if (pr == -1 and i1.priority <= pmax) or (pr > 0 and pr <= pmax): 
    942979              if includeYears and i1.vid in self.cmvGridId: 
     
    947984                gflg = {'si':'','li':''}.get( self.cmvGridId[i1.vid], self.cmvGridId[i1.vid] ) 
    948985                rtl = True 
    949                 if i1.vid == 'baa586e6-e5dd-11e5-8482-ac72891c3257': 
    950                   print 'INFO.cmv.00056: ',i1.vid, gflg, expys[i.uid] 
     986 
    951987                if i.uid in expys: 
    952988                  if rtl: 
     
    960996                          else: 
    961997                            grd1 = grd 
    962                           if i1.vid == 'baa586e6-e5dd-11e5-8482-ac72891c3257': 
    963                              print 'INFO.cmv.0002: ',e,grd1,grd 
    964998                          cc[(i1.vid,e,grd1)].add( expys[i.uid][e,grd] ) 
     999                          if i.uid in self.tsliceDict and e in self.tsliceDict[i.uid]: 
     1000                            ccts[(i1.vid,e)].add( self.tsliceDict[i.uid][e] ) 
     1001 
    9651002                  else: 
     1003 
    9661004                   for gf in expys[i.uid]: 
    9671005                    for e,grd in expys[i.uid][gf]: 
     
    9951033        for v,e,g in cc: 
    9961034          l2[v][(e,g)] = max( list( cc[(v,e,g)] ) ) 
     1035 
     1036      l2ts = collections.defaultdict( dict ) 
     1037      for v in l2: 
     1038        for e,g in l2[v]: 
     1039          if (v,e) in ccts: 
     1040            if len( ccts[(v,e)] ) > 1: 
     1041              rc, ts, msg = sortTimeSlice( ccts[(v,e)] ) 
     1042              if rc == 1: 
     1043                l2ts[v][e] = ts 
     1044              elif rc == 2: 
     1045                yl = range( ts[0][2], ts[0][3] + 1) + range( ts[1][2], ts[1][3] + 1) 
     1046                l2ts[v][e] = ('_union', 'YEARLIST', len(yl), yl ) 
     1047              else: 
     1048                print ('TIME SLICE MULTIPLE OPTIONS FOR : %s, %s, %s, %s' % (v,e,str(ccts[(v,e)]), msg ) ) 
     1049            else: 
     1050              l2ts[v][e] = ccts[(v,e)].pop() 
     1051      return l2, l2ts 
    9971052    else: 
    9981053      l2 = sorted( [i for i in [self.dq.inx.uid[i] for i in ss] if i._h.label != 'remarks'], key=lambda x: x.label ) 
    999     return l2 
     1054      return l2 
    10001055 
    10011056  def exptFilterList(self,val,option,ret='uid'): 
     
    10331088## 
    10341089    if not self.uniqueRequest: 
    1035       cmv = self.cmvByMip(mip,pmax=pmax,includeYears=True,exptFilter=self.exptFilter,exptFilterBlack=self.exptFilterBlack) 
    1036     else: 
    1037       cmv1 = self.cmvByInvMip(mip,pmax=pmax,includeYears=True,exptFilter=self.exptFilter,exptFilterBlack=self.exptFilterBlack) 
    1038       cmv2 = self.cmvByMip('TOTAL',pmax=pmax,includeYears=True,exptFilter=self.exptFilter,exptFilterBlack=self.exptFilterBlack) 
     1090      cmv, self.cmvts = self.cmvByMip(mip,pmax=pmax,includeYears=True,exptFilter=self.exptFilter,exptFilterBlack=self.exptFilterBlack) 
     1091    else: 
     1092      cmv1, cmvts1 = self.cmvByInvMip(mip,pmax=pmax,includeYears=True,exptFilter=self.exptFilter,exptFilterBlack=self.exptFilterBlack) 
     1093      cmv2, cmvts2 = self.cmvByMip('TOTAL',pmax=pmax,includeYears=True,exptFilter=self.exptFilter,exptFilterBlack=self.exptFilterBlack) 
    10391094      cmv = self.differenceSelectedCmvDict(  cmv1, cmv2 ) 
    10401095  
     
    10811136          cc1 = collections.defaultdict( int ) 
    10821137          se = collections.defaultdict( set ) 
    1083           if i == 'baa586e6-e5dd-11e5-8482-ac72891c3257': 
    1084              print 'INFO.vo.00001: ',cmv[i] 
    10851138          for e,g in cmv[i]: 
    10861139            cc0[g] += cmv[i][(e,g)] 
     
    12031256           sf = self.odsz[o] 
    12041257        else: 
    1205            # print ( 'SEVERE.odims.00006: no information on dimension size: %s' % o ) 
    12061258           sf = 5 
    12071259 
     
    12771329      expts = self.esid_to_exptList(e,deref=True,full=False) 
    12781330      if expts not in  [None,[]]: 
    1279         ###print 'EXPTS: ',e,len(expts), list( expts )[0].label 
    12801331        for ei in expts: 
    12811332          self.volByE[ei.label] = self.volByExpt( l1, ei.uid, pmax=pmax, cc=cc, retainRedundantRank=retainRedundantRank, intersection=intersection, adsCount=adsCount ) 
    12821333          vtot += self.volByE[ei.label][0] 
    12831334        self.allVars = self.allVars.union( self.vars ) 
    1284       ##else: 
    1285         ##print 'No expts found: ',e 
    12861335    self.indexedVol = cc 
    12871336 
     
    13531402      --grdpol <native|1deg> :  policy for default grid, if MIPs have not expressed a preference; 
    13541403      --allgrd :  When a variable is requested on multiple grids, archive all grids requested (default: only the finest resolution); 
    1355       --unique :  List only variables which are not requested uniquely by this MIP, for at least one experiment; 
     1404      --unique :  List only variables which are requested uniquely by this MIP, for at least one experiment; 
    13561405      --txt : Create text file with requested variables; 
    13571406      --mcfg : Model configuration: 7 integers, comma separated, 'nho','nlo','nha','nla','nlas','nls','nh1' 
     
    15821631      vs.run( self.adict['m'], 'requestVol_%s_%s_%s' % (mlab,tierMax,pmax), pmax=pmax )  
    15831632      vs.anal(olab=mlab,doUnique=False) 
    1584       vs.analAll(pmax,mips=self.adict['m']) 
     1633      mips = self.adict['m'] 
     1634      if type(mips) in [type(set()),type(dict())]: 
     1635        mips = self.adict['m'].copy() 
     1636        if len(mips) > 1: 
     1637          if type(mips) == type(set()): 
     1638             mips.add( '*TOTAL' ) 
     1639          else: 
     1640             mips['*TOTAL'] = '' 
     1641 
     1642      vs.analAll(pmax,mips=mips,html=False) 
    15851643      ttl = sum( [x for k,x in vs.res['vu'].items()] )*2.*1.e-12 
    15861644      ttl2 = sum( [x for k,x in vs.res['vu'].items()] )*2.*1.e-12 
Note: See TracChangeset for help on using the changeset viewer.