source: CMIP6dreq/trunk/dreqPy/scope.py @ 558

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

Adding hdldemo

Line 
1"""Date Request Scoping module
2---------------------------
3The scope.py module contains the dreqQuery class and a set of ancilliary functions. The dreqQuery class contains methods for analysing the data request.
4"""
5import dreq
6from utilities import cmvFilter
7import collections, string, operator
8import sys
9
10python2 = True
11if sys.version_info[0] == 3:
12  python2 = False
13  from functools import reduce
14  from utilP3 import mlog3
15  mlg = mlog3()
16else:
17  from utilP2 import mlog
18  mlg = mlog()
19
20class baseException(Exception):
21  """Basic exception for general use in code."""
22
23  def __init__(self,msg):
24    self.msg = 'scope:: %s' % msg
25
26  def __str__(self):
27    return repr( self.msg )
28
29  def __repr__(self):
30    return self.msg
31
32nt_mcfg = collections.namedtuple( 'mcfg', ['nho','nlo','nha','nla','nlas','nls','nh1'] )
33class cmpd(object):
34  def __init__(self,dct):
35    self.d = dct
36  def cmp(self,x,y,):
37    return cmp( self.d[x], self.d[y] )
38
39    self.default_mcfg = nt_mcfg._make( [259200,60,64800,40,20,5,100] )
40
41def filter1( a, b ):
42  if b < 0:
43    return a
44  else:
45    return min( [a,b] )
46
47npy = {'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,
48'3 hourly':8*365, '':1 }
49## There are 4 cmor variables with blank frequency ....
50
51def vol01( sz, v, npy, freq, inx ):
52  n1 = npy[freq]
53  s = sz[inx.uid[v].stid]
54  assert type(s) == type(1), 'Non-integer size found for %s' % v
55  assert type(n1) in (type(1),type(0.)), 'Non-number "npy" found for %s, [%s]' % (v,freq)
56  return s*n1
57
58class col_list(object):
59  def __init__(self):
60    self.a = collections.defaultdict(list)
61
62class col_count(object):
63  def __init__(self):
64    self.a = collections.defaultdict(int)
65
66class dreqQuery(object):
67  __doc__ = """Methods to analyse the data request, including data volume estimates"""
68  def __init__(self,dq=None,tierMax=1):
69    if dq == None:
70      self.dq = dreq.loadDreq()
71    else:
72      self.dq=dq
73    self.rlu = {}
74    for i in self.dq.coll['objective'].items:
75      k = '%s.%s' % (i.mip,i.label)
76      assert not k in self.rlu, 'Duplicate label in objectives: %s' % k
77      self.rlu[k] = i.uid
78
79    self.cmvFilter = cmvFilter( self )
80    self.tierMax = tierMax
81
82    self.mips = set( [x.label for x in self.dq.coll['mip'].items ] )
83    self.mipls = sorted( list( self.mips ) )
84
85    self.default_mcfg = nt_mcfg._make( [259200,60,64800,40,20,5,100] )
86    self.mcfg = self.default_mcfg._asdict()
87    ##for k in self.default_mcfg.__dict__.keys():
88      ##self.mcfg[k] = self.default_mcfg.__dict__[k]
89    self.szcfg()
90    self.requestItemExpAll(  )
91
92  def szcfg(self):
93    self.szss = {}
94    self.sz = {}
95    for i in self.dq.coll['spatialShape'].items:
96      type = 'a'
97      if i.levelFlag == False:
98        ds =  i.dimensions.split( '|' )
99        if ds[-1] in ['site', 'basin']:
100          vd = ds[-2]
101        else:
102          vd = ds[-1]
103 
104        if vd[:4] == 'olev' or vd == 'rho':
105          type = 'o'
106          nz = self.mcfg['nlo']
107        elif vd[:4] == 'alev':
108          nz = self.mcfg['nla']
109        elif vd in ['slevel','sdepth']:
110          nz = self.mcfg['nls']
111        elif vd == 'aslevel':
112          nz = self.mcfg['nlas']
113        else:
114          mlg.prnt( 'Failed to parse dimensions %s' % i.dimensions )
115          raise
116      else:
117        nz = i.levels
118
119      dims = set( i.dimensions.split( '|' ) )
120      if 'latitude' in dims and 'longitude' in dims:
121        if type == 'o':
122          nh = self.mcfg['nho']
123        else:
124          nh = self.mcfg['nha']
125      else:
126        nh = 10
127
128      self.szss[i.uid] = nh*nz
129    for i in self.dq.coll['structure'].items:
130      s = self.szss[i.spid]
131      if i.odims != '':
132        s = s*5
133      self.sz[i.uid] = s
134
135  def getRequestLinkByMip( self, mipSel ):
136    """Return the set of request links which are associated with specified MIP"""
137    if type(mipSel) == type(''):
138      t1 = lambda x: x == mipSel
139    elif type(mipSel) == type(set()):
140      t1 = lambda x: x in mipSel
141
142    s = set()
143    for i in self.dq.coll['objectiveLink'].items:
144      if t1(i.label):
145        s.add( self.dq.inx.uid[i.rid] )
146    ##self.rqs = list({self.dq.inx.uid[i.rid] for i in self.dq.coll['objectiveLink'].items if t1(i.label) })
147    self.rqs = list( s )
148    return self.rqs
149
150  def getRequestLinkByObjective( self, objSel ):
151    """Return the set of request links which are associated with specified objectives"""
152    if type(objSel) == type(''):
153      t1 = lambda x: x == self.rlu[objSel]
154    elif type(objSel) == type(set()):
155      t1 = lambda x: x in [self.rlu[i] for i in objSel]
156
157    s = set()
158    for i in self.dq.coll['objectiveLink'].items:
159      if t1(i.label):
160        s.add( self.dq.inx.uid[i.oid] )
161##
162    self.rqs = list( s )
163    ##self.rqs = list({self.dq.inx.uid[i.rid] for i in self.dq.coll['objectiveLink'].items if t1(i.oid) })
164    return self.rqs
165
166  def varGroupXexpt(self, rqList ):
167    """For a list of request links, return a list of variable group IDs for each experiment"""
168    self.cc = collections.defaultdict( list )
169    ## dummy = {self.cc[i.expt].append(i.rlid) for i in self.dq.coll['requestItem'].items if i.rlid in {j.uid for j in rqList} }
170    return self.cc
171
172  def yearsInRequest(self, rql ):
173    self.ntot = sum( [i.ny for i in self.dq.coll['requestItem'].items if i.rlid == rql.uid] )
174    return self.ntot
175
176  def rqlByExpt( self, l1, ex, pmax=2, expFullEx=False ):
177    """rqlByExpt: return a set of request links for an experiment"""
178##
179    inx = self.dq.inx
180   
181    exi = self.dq.inx.uid[ex]
182    if exi._h.label == 'experiment':
183      exset = set( [ex,exi.egid,exi.mip] )
184    else:
185      exset = set( self.esid_to_exptList(ex,deref=False,full=expFullEx) )
186##
187## rql is the set of all request links which are associated with a request item for this experiment set
188##
189    l1p = set()
190    for i in l1:
191      if i.preset < 0 or i.preset <= pmax:
192        if i.esid in exset:
193          l1p.add(i)
194
195    rql0 = set()
196    for i in l1p:
197       rql0.add(i.rlid)
198
199    rqlInv = set()
200    for u in rql0:
201      if inx.uid[u]._h.label == 'remarks':
202        rqlInv.add( u )
203    if len(rqlInv) != 0:
204      mlg.prnt ( 'WARNING.001.00002: %s invalid request links from request items ...' % len(rqlInv) )
205    rql = set()
206    for u in rql0:
207       if inx.uid[u]._h.label != 'remarks':
208         rql.add( u ) 
209
210    return rql, l1p, exset
211
212  def varsByRql( self, rql, pmax=2, intersection=False): 
213      """The complete set of variables associated with a set of rquest links."""
214      inx = self.dq.inx
215      cc1 = collections.defaultdict( set )
216      for i in rql:
217        o = inx.uid[i]
218        if o.opt == 'priority':
219          p = int( float( o.opar ) )
220          assert p in [1,2,3], 'Priority incorrectly set .. %s, %s, %s' % (o.label,o.title, o.uid)
221          cc1[inx.uid[i].mip].add( (inx.uid[i].refid,p) )
222        else:
223          cc1[inx.uid[i].mip].add( inx.uid[i].refid )
224
225      if intersection:
226        ccv = {}
227#
228# set of request variables for each MIP
229#
230        for k in cc1:
231          thisc = reduce( operator.or_, [set( inx.iref_by_sect[vg].a['requestVar'] ) for vg in cc1[k] ] )
232          rqvgs = collections.defaultdict( set )
233          for x in cc1[k]:
234            if type(x) == type( () ):
235              rqvgs[x[0]].add( x[1] )
236            else:
237              rqvgs[x].add( 3 )
238         
239          s = set()
240          for vg in rqvgs:
241            for l in inx.iref_by_sect[vg].a['requestVar']:
242              if inx.uid[l].priority <= min(pmax,max(rqvgs[vg])):
243                s.add( inx.uid[l].vid )
244          ccv[k] = s
245
246        if len( ccv.keys() ) < len( list(imips) ):
247          vars = set()
248        else:
249          vars =  reduce( operator.and_, [ccv[k] for k in ccv] )
250      else:
251        rqvgs = collections.defaultdict( set )
252        for k in cc1:
253          for x in cc1[k]:
254            if type(x) == type( () ):
255              rqvgs[x[0]].add( x[1] )
256            else:
257              rqvgs[x].add( 3 )
258         
259###To obtain a set of variables associated with this collection of variable groups:
260
261        vars = set()
262        for vg in rqvgs:
263          for l in inx.iref_by_sect[vg].a['requestVar']:
264            if inx.uid[l].priority <= min(pmax,max(rqvgs[vg])):
265               vars.add(inx.uid[l].vid)
266        ##col1 = reduce( operator.or_, [set( inx.iref_by_sect[vg].a['requestVar'] ) for vg in rqvg ] )
267
268### filter out cases where the request does not point to a CMOR variable.
269    ##vars = {vid for vid in vars if inx.uid[vid][0] == u'CMORvar'}
270      thisvars = set()
271      for vid in vars:
272         if inx.uid[vid]._h.label == u'CMORvar':
273             thisvars.add(vid)
274
275      return thisvars
276
277  def volByExpt( self, l1, ex, pmax=1, cc=None, retainRedundantRank=False, intersection=False,expFullEx=False ):
278    """volByExpt: calculates the total data volume associated with an experiment/experiment group and a list of request items.
279          The calculation has some approximations concerning the number of years in each experiment group.
280          cc: an optional collector, to accumulate indexed volumes. """
281##
282    inx = self.dq.inx
283    imips = set()
284    for i in l1:
285      imips.add(i.mip)
286    ##imips = {i.mip for i in l1}
287   
288    rql, l1p, exset = self.rqlByExpt( l1, ex, pmax=pmax, expFullEx=expFullEx )
289    dn = False
290    if dn:
291      exi = self.dq.inx.uid[ex]
292      if exi._h.label == 'experiment':
293        exset = set( [ex,exi.egid,exi.mip] )
294      else:
295        exset = set( self.esid_to_exptList(ex,deref=False,full=expFullEx) )
296##
297## rql is the set of all request links which are associated with a request item for this experiment set
298##
299      l1p = set()
300      for i in l1:
301        if i.preset < 0 or i.preset <= pmax:
302          if i.esid in exset:
303            l1p.add(i)
304 
305      rql0 = set()
306      for i in l1p:
307         rql0.add(i.rlid)
308 
309      rqlInv = set()
310      for u in rql0:
311        if inx.uid[u]._h.label == 'remarks':
312          rqlInv.add( u )
313      if len(rqlInv) != 0:
314        mlg.prnt ( 'WARNING.001.00002: %s invalid request links from request items ...' % len(rqlInv) )
315      rql = set()
316      for u in rql0:
317         if inx.uid[u]._h.label != 'remarks':
318           rql.add( u ) 
319
320#####
321    if len( rql ) == 0:
322      self.vars = set()
323      return (0,{},{} )
324
325## The complete set of variables associated with these requests:
326    vars = self.varsByRql( rql, pmax=pmax, intersection=intersection) 
327    tm = 3
328    if tm == 0:
329      s = set()
330      for i in rql:
331        s.add( inx.uid[i].refid )
332      rqvg = list( s )
333    elif tm == 1:
334      cc1 = collections.defaultdict( set )
335      for i in rql:
336        o = inx.uid[i]
337        if o.opt == 'priority':
338          p = int( float( o.opar ) )
339          assert p in [1,2,3], 'Priority incorrectly set .. %s, %s, %s' % (o.label,o.title, o.uid)
340          cc1[inx.uid[i].mip].add( (inx.uid[i].refid,p) )
341        else:
342          cc1[inx.uid[i].mip].add( inx.uid[i].refid )
343
344      if intersection:
345        ccv = {}
346#
347# set of request variables for each MIP
348#
349        for k in cc1:
350          thisc = reduce( operator.or_, [set( inx.iref_by_sect[vg].a['requestVar'] ) for vg in cc1[k] ] )
351          rqvgs = collections.defaultdict( set )
352          for x in cc1[k]:
353            if type(x) == type( () ):
354              rqvgs[x[0]].add( x[1] )
355            else:
356              rqvgs[x].add( 3 )
357         
358          s = set()
359          for vg in rqvgs:
360            for l in inx.iref_by_sect[vg].a['requestVar']:
361              if inx.uid[l].priority <= min(pmax,max(rqvgs[vg])):
362                s.add( inx.uid[l].vid )
363          ccv[k] = s
364
365        if len( ccv.keys() ) < len( list(imips) ):
366          vars = set()
367        else:
368          vars =  reduce( operator.and_, [ccv[k] for k in ccv] )
369      else:
370        rqvgs = collections.defaultdict( set )
371        for k in cc1:
372          for x in cc1[k]:
373            if type(x) == type( () ):
374              rqvgs[x[0]].add( x[1] )
375            else:
376              rqvgs[x].add( 3 )
377         
378###To obtain a set of variables associated with this collection of variable groups:
379
380        vars = set()
381        for vg in rqvgs:
382          for l in inx.iref_by_sect[vg].a['requestVar']:
383            if inx.uid[l].priority <= min(pmax,max(rqvgs[vg])):
384               vars.add(inx.uid[l].vid)
385        ##col1 = reduce( operator.or_, [set( inx.iref_by_sect[vg].a['requestVar'] ) for vg in rqvg ] )
386
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
394### filter out cases where the request does not point to a CMOR variable.
395    ##vars = {vid for vid in vars if inx.uid[vid][0] == u'CMORvar'}
396      thisvars = set()
397      for vid in vars:
398         if inx.uid[vid]._h.label == u'CMORvar':
399             thisvars.add(vid)
400      vars = thisvars
401##
402## filter by configuration option and rank
403##
404    if not retainRedundantRank:
405      len1 = len(vars)
406      cmv = self.cmvFilter.filterByChoiceRank(cmv=vars)
407
408      vars = cmv
409   
410    self.vars = vars
411
412    e = {}
413    for u in rql:
414### for request variables which reference the variable group attached to the link, add the associate CMOR variables, subject to priority
415      i = inx.uid[u]
416      e[i.uid] = set()
417      for x in inx.iref_by_sect[i.refid].a['requestVar']:
418           if inx.uid[x].priority <= pmax:
419              e[i.uid].add( inx.uid[x].vid )
420#
421# for each variable, calculate the maximum number of years across all the request links which reference that variable.
422##
423## for each request item we have nymax, nenmax, nexmax.
424##
425    nym = {}
426    for v in vars:
427      s = set()
428      for i in l1p:
429        if i.esid in exset and v in e[i.rlid]:
430          s.add( self.rqiExp[i.uid][2] )
431      ##nym[v] = max( {self.rqiExp[i.uid][2] for i in l1p if i.esid == ex and v in e[i.rlid]} )
432      if len(s) == 0:
433        nym[v] == 0
434      else:
435        nym[v] = max( s )
436
437    szv = {}
438    ov = []
439    for v in vars:
440      szv[v] = self.sz[inx.uid[v].stid]*npy[inx.uid[v].frequency]
441      ov.append( self.dq.inx.uid[v] )
442    ee = self.listIndexDual( ov, 'mipTable', 'label', acount=None, alist=None, cdict=szv, cc=cc )
443    ff = {}
444    for v in vars:
445      ff[v] = self.sz[ inx.uid[v].stid ] * npy[inx.uid[v].frequency] * nym[v]
446    self.ngptot = sum( [  ff[v]  for v in vars] )
447    return (self.ngptot, ee, ff )
448
449  def esid_to_exptList(self,esid,deref=False,full=False):
450    if not esid in self.dq.inx.uid:
451      mlg.prnt ( 'Attempt to dereferece invalid uid: %s' % esid )
452      raise
453
454    if self.dq.inx.uid[esid]._h.label == 'experiment':
455      expts = [esid,]
456    elif self.dq.inx.uid[esid]._h.label != 'remarks':
457      if esid in self.dq.inx.iref_by_sect and 'experiment' in self.dq.inx.iref_by_sect[esid].a:
458        expts = list( self.dq.inx.iref_by_sect[esid].a['experiment'][:] )
459      else:
460        expts = []
461
462## add in groups and mips for completeness
463##
464      if full:
465        if self.dq.inx.uid[esid]._h.label == 'mip':
466          s = set()
467          for e in expts:
468            if self.dq.inx.uid[e]._h.label != 'experiment':
469              mlg.prnt ( 'ERROR: %s, %s, %s ' % (esid,e, self.dq.inx.uid[e].title ) )
470            s.add( self.dq.inx.uid[e].egid )
471          for i in s:
472            expts.append( i )
473        expts.append( esid )
474    else:
475      ##print ( 'WARNING: request link not associated with valid experiment group' )
476      ##raise
477      return None
478
479
480    if self.tierMax > 0:
481      expts1 = []
482      for i in expts:
483        if self.dq.inx.uid[i]._h.label == 'experiment':
484          if self.dq.inx.uid[i].tier[0] <= self.tierMax:
485            expts1.append( i )
486        elif self.dq.inx.uid[i]._h.label == 'exptgroup':
487          if self.dq.inx.uid[i].tierMin <= self.tierMax:
488            expts1.append( i )
489        else:
490            expts1.append( i )
491    else:
492      expts1 = expts
493
494    if deref:
495      return [self.dq.inx.uid[e] for e in expts1]
496    else:
497      return expts1
498 
499##
500## need to call this on load
501## then use instead of i.ny etc below
502##
503  def requestItemExpAll( self ):
504    self.rqiExp = {}
505    for rqi in self.dq.coll['requestItem'].items:
506      a,b,c = self.requestItemExp( rqi )
507      if a != None:
508        self.rqiExp[rqi.uid] = (a,b,c)
509
510  def requestItemExp( self, rqi ):
511    assert rqi._h.label == "requestItem", 'Argument to requestItemExp must be a requestItem'
512    u = rqi.esid
513    if self.dq.inx.uid[u]._h.label == 'experiment':
514      expts = [u,]
515    elif self.dq.inx.uid[u]._h.label != 'remarks':
516      if u in self.dq.inx.iref_by_sect and 'experiment' in self.dq.inx.iref_by_sect[u].a:
517        expts = self.dq.inx.iref_by_sect[u].a['experiment']
518      else:
519        expts = []
520    else:
521      # print ( 'WARNING: request link not associated with valid experiment group'  )
522      ##rqi.__info__()
523      ##raise
524      return (None, None, None)
525
526    if self.tierMax > 0:
527      expts = [i for i in expts if self.dq.inx.uid[i].tier[0] <= self.tierMax]
528
529    if len(expts) > 0:
530      e = [self.dq.inx.uid[i] for i in expts]
531      for i in e:
532        if i._h.label != 'experiment':
533          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) ]
538      nytot = 0
539   
540    return (expts, dat, nytot )
541   
542
543  def setTierMax( self, tierMax ):
544    """Set the maxium tier and recompute request sizes"""
545    if tierMax != self.tierMax:
546      self.tierMax = tierMax
547      self.requestItemExpAll(  )
548
549  def summaryByMip( self, pmax=1 ):
550    bytesPerFloat = 2.
551    for m in self.mipls:
552      v = self.volByMip( m, pmax=pmax )
553      mlg.prnt ( '%12.12s: %6.2fTb' % (m,v*bytesPerFloat*1.e-12) )
554
555  def rqiByMip( self, mip):
556
557    if type(mip) in [type( '' ),type( u'') ]:
558      if mip not in self.mips:
559        mlg.prnt ( self.mips )
560        raise baseException( 'rqiByMip: Name of mip not recognised: %s' % mip )
561      l1 = [i for i in  self.dq.coll['requestItem'].items if i.mip == mip]
562    elif type(mip) == type( set()):
563      nf = [ m for m in mip if m not in self.mips]
564      if len(nf) > 0:
565        raise baseException( 'rqiByMip: Name of mip(s) not recognised: %s' % str(nf) )
566      l1 = [i for i in  self.dq.coll['requestItem'].items if i.mip in mip]
567    else:
568      raise baseException( 'rqiByMip: "mip" (1st explicit argument) should be type string or set: %s -- %s' % (mip, type(mip))   )
569    return l1
570     
571  def volByMip( self, mip, pmax=2, retainRedundantRank=False, intersection=False):
572
573    l1 = self.rqiByMip( mip )
574     
575    #### The set of experiments/experiment groups:
576    exps = set()
577    for i in l1:
578      exps.add( i.esid )
579    exps = self.mips
580    self.volByE = {}
581    vtot = 0
582    cc = collections.defaultdict( col_count )
583    self.allVars = set()
584    for e in exps:
585      expts = self.esid_to_exptList(e,deref=True,full=False)
586      if expts != None:
587        self.volByE[e] = self.volByExpt( l1, e, pmax=pmax, cc=cc, retainRedundantRank=retainRedundantRank, intersection=intersection )
588        vtot += self.volByE[e][0]
589        self.allVars = self.allVars.union( self.vars )
590    self.indexedVol = cc
591
592    return vtot
593
594  def listIndexDual(self, ll, a1, a2, acount=None, alist=None, cdict=None, cc=None ):
595    do_count = acount != None
596    do_list = alist != None
597    assert not (do_count and do_list), 'It is an error to request both list and count'
598    if not (do_count or do_list):
599      acount = '__number__'
600      do_count = True
601
602    if cc == None:
603      if do_count:
604        cc = collections.defaultdict( col_count )
605      elif do_list:
606        cc = collections.defaultdict( col_list )
607
608    if do_count:
609      for l in ll:
610        if cdict != None:
611          v = cdict[l.uid]
612        elif acount == '__number__':
613          v = 1
614        else:
615          v = l.__dict__[acount]
616
617        cc[ l.__dict__[a1] ].a[ l.__dict__[a2] ] += v
618    elif do_list:
619      for l in ll:
620        if cdict != None:
621          v = cdict[l.uid]
622        elif alist == '__item__':
623          v = l
624        else:
625          v = l.__dict__[alist]
626        cc[ l.__dict__[a1] ].a[ l.__dict__[a2] ].append( v )
627
628    od = {}
629    for k in cc.keys():
630      d2 = {}
631      for k2 in cc[k].a.keys():
632        d2[k2] = cc[k].a[k2]
633      od[k] = d2
634    return od
635
636class dreqUI(object):
637  """Data Request Command line.
638-------------------------
639      -v : print version and exit;
640      --unitTest : run some simple tests;
641      -m <mip>:  MIP of list of MIPs (comma separated);
642      -h :       help: print help text;
643      -t <tier> maxmum tier;
644      -p <priority>  maximum priority;
645      --printLinesMax <n>: Maximum number of lines to be printed
646      --printVars  : If present, a summary of the variables fitting the selection options will be printed
647      --intersection : Analyse the intersection of requests rather than union.
648"""
649  def __init__(self,args):
650    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)} 
652    aa = args[:]
653    while len(aa) > 0:
654      a = aa.pop(0)
655      if a in self.knownargs:
656        b = self.knownargs[a][0]
657        if self.knownargs[a][1]:
658          v = aa.pop(0)
659          self.adict[b] = v
660        else:
661          self.adict[b] = True
662
663    if 'm' in self.adict:
664      self.adict['m'] = set(self.adict['m'].split(',') )
665
666    integerArgs = set( ['p','t','plm'] )
667    for i in integerArgs.intersection( self.adict ):
668      self.adict[i] = int( self.adict[i] )
669
670    self.intersection = self.adict.get( 'intersection', False )
671
672  def run(self, dq=None):
673    if 'h' in self.adict:
674      mlg.prnt ( self.__doc__ )
675      return
676
677    if not 'm' in self.adict:
678      mlg.prnt ( 'Current version requires -m argument'  )
679      mlg.prnt ( self.__doc__ )
680      sys.exit(0)
681
682    if dq == None:
683      self.dq = dreq.loadDreq()
684    else:
685      self.dq = None
686
687    sc = dreqQuery( dq=self.dq )
688
689    ok = True
690    for i in self.adict['m']:
691        if i not in sc.mips:
692          ok = False
693          mlg.prnt ( 'NOT FOUND: ',i )
694    assert ok,'Available MIPs: %s' % str(sc.mips)
695
696    tierMax = self.adict.get( 't', 2 )
697    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) )
701    cc = collections.defaultdict( int )
702    for e in sc.volByE:
703      for v in sc.volByE[e][2]:
704          cc[v] += sc.volByE[e][2][v]
705    x = 0
706    for v in cc:
707      x += cc[v]
708   
709    if python2:
710      vl = sorted( cc.keys(), cmp=cmpd(cc).cmp, reverse=True )
711    else:
712      vl = sorted( cc.keys(), key=lambda x: cc[x], reverse=True )
713    if self.adict.get( 'vars', False ):
714      printLinesMax = self.adict.get( 'plm', 20 )
715      if printLinesMax > 0:
716        mx = min( [printLinesMax,len(vl)] )
717      else:
718        mx = len(vl)
719
720      for v in vl[:mx]:
721        mlg.prnt ( self.dq.inx.uid[v].label, '%7.2fTb' % (cc[v]*2.*1.e-12) )
Note: See TracBrowser for help on using the repository browser.