source: CMIP6dreq/trunk/dreqPy/table_utils.py @ 1280

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/dreqPy/table_utils.py@1292
Revision 1280, 21.7 KB checked in by mjuckes, 12 months ago (diff)

01.00.29b1

Line 
1import collections, os, sys
2
3try:
4    import xlsxwriter
5except:
6    print ('No xlsxwrite: will not make tables ...')
7
8try:
9  import vrev
10  import misc_utils
11except:
12  import dreqPy.vrev as vrev
13  import dreqPy.misc_utils as misc_utils
14
15def realmFlt( ss ):
16  if ss == '':
17    return ss
18  if ss.find( ' ' ) == -1:
19    return ss
20  return ss.split( ' ' )[0]
21
22python2 = True
23if sys.version_info[0] == 3:
24  python2 = False
25  def cmp(x,y):
26    if x == y:
27      return 0
28    elif x > y:
29      return 1
30    else:
31      return -1
32
33if sys.version_info >= (2,7):
34  from functools import cmp_to_key
35  oldpython = False
36else:
37  oldpython = True
38
39class cmpdn(object):
40  def __init__(self,kl):
41    self.kl = kl
42  def cmp(self,x,y):
43    for k in self.kl:
44      if x.__dict__[k] != y.__dict__[k]:
45        return cmp( x.__dict__[k], y.__dict__[k] )
46
47    return cmp( 0,0 )
48
49def cmpAnnex( x, y ):
50  ax = len(x) > 2 and x[:2] == 'em'
51  ay = len(y) > 2 and y[:2] == 'em'
52  bx = len(x) > 5 and x[:5] in ['CMIP5','CORDE','SPECS']
53  by = len(y) > 5 and y[:5] in ['CMIP5','CORDE','SPECS']
54  if ax  == ay and bx == by:
55    return cmp(x,y)
56  elif ax:
57    if by:
58      return cmp(0,1)
59    else:
60      return cmp(1,0)
61  elif ay:
62    if bx:
63      return cmp(1,0)
64    else:
65      return cmp(0,1)
66  elif bx:
67      return cmp(1,0)
68  else:
69    return cmp(0,1)
70
71if not oldpython:
72  kAnnex = cmp_to_key( cmpAnnex )
73  kCmpdn = cmp_to_key( cmpdn(['sn','label']).cmp )
74  kCmpdnPrl = cmp_to_key( cmpdn(['prov','rowIndex','label']).cmp )
75
76
77class xlsx(object):
78  def __init__(self,fn,xls=True,txt=False,txtOpts=None):
79    self.xls=xls
80    self.txt=txt
81    self.txtOpts = txtOpts
82    self.mcfgNote = 'Reference Volume (1 deg. atmosphere, 0.5 deg. ocean)'
83    if xls:
84      self.wb = xlsxwriter.Workbook('%s.xlsx' % fn)
85      self.hdr_cell_format = self.wb.add_format({'text_wrap': True, 'font_size': 14, 'font_color':'#0000ff', 'bold':1, 'fg_color':'#aaaacc'})
86      self.hdr_cell_format.set_text_wrap()
87      self.sect_cell_format = self.wb.add_format({'text_wrap': True, 'font_size': 14, 'font_color':'#0000ff', 'bold':1, 'fg_color':'#ccccbb'})
88      self.sect_cell_format.set_text_wrap()
89      self.cell_format = self.wb.add_format({'text_wrap': True, 'font_size': 11})
90      self.cell_format.set_text_wrap()
91
92    if txt:
93      self.oo = open( '%s.csv' % fn, 'w' )
94
95  def header(self,tableNotes,collected):
96    if self.xls:
97      sht = self.newSheet( 'Notes' )
98      sht.write( 0,0, '', self.hdr_cell_format )
99      sht.write( 0,1, 'Notes on tables', self.hdr_cell_format )
100      ri = 0
101      sht.set_column(0,0,30)
102      sht.set_column(1,1,60)
103      self.sht = sht
104      for t in tableNotes:
105        ri += 1
106        for i in range(2):
107          sht.write( ri,i, t[i], self.cell_format )
108
109      if collected != None:
110        ri += 2
111        sht.write( ri, 0, 'Table', self.sect_cell_format )
112        sht.write( ri, 1, self.mcfgNote, self.sect_cell_format )
113        ttl = 0.
114        for k in sorted( collected.keys() ):
115          ri += 1
116          sht.write( ri, 0, k )
117          sht.write( ri, 1, misc_utils.vfmt( collected[k]*2. ) )
118          ttl += collected[k]
119
120        ri += 1
121        sht.write( ri, 0, 'TOTAL' )
122        sht.write( ri, 1, misc_utils.vfmt( ttl*2. ) )
123
124    if self.txt:
125      self.oo.write( '\t'.join( ['Notes','','Notes on tables']) + '\n' )
126      for t in tableNotes:
127        self.oo.write( '\t'.join( ['Notes',] + list(t)) + '\n' )
128
129      if collected != None:
130        self.oo.write( '\t'.join( ['Notes','Table','Reference Volume (1 deg. atmosphere, 0.5 deg. ocean)']) + '\n')
131        for k in sorted( collected.keys() ):
132          self.oo.write( '\t'.join( ['Notes',k,misc_utils.vfmt( collected[k]*2. )]) + '\n' )
133
134  def cmvtabrec(self,j,t,orec):
135     if self.xls:
136        for i in range(len(orec)):
137           if str( type(orec[i]) ) == "<class 'dreq.dreqItem_CoreAttributes'>":
138             self.sht.write( j,i, '', self.cell_format )
139           else:
140             ##print i, orec[i], type( orec[i] )
141             try:
142                self.sht.write( j,i, orec[i], self.cell_format )
143             except:
144               print ('FAILED TO WRITE RECORD: %s' % str(orec))
145               print ('FAILED TO WRITE RECORD: %s' % str(orec[i]))
146               raise
147
148     if self.txt:
149        self.oo.write( '\t'.join( [t,] + [x.replace('"',"'") for x in orec]) + '\n' )
150
151  def varrec(self,j,orec):
152     if self.xls:
153        for i in range(len(orec)):
154           self.sht.write( j,i, orec[i], self.cell_format )
155
156     if self.txt:
157        self.oo.write( '\t'.join( orec, '\t') + '\n' )
158
159  def var(self):
160      if self.xls:
161       self.sht = self.newSheet( 'var' )
162      j = 0
163      hrec = ['Long name', 'units', 'description', 'Variable Name', 'CF Standard Name' ]
164      if self.xls:
165          self.sht.set_column(1,1,40)
166          self.sht.set_column(1,2,30)
167          self.sht.set_column(1,3,60)
168          self.sht.set_column(1,4,40)
169          self.sht.set_column(1,5,40)
170          self.sht.set_column(1,20,40)
171          self.sht.set_column(1,21,40)
172
173      if self.xls:
174        for i in range(len(hrec)):
175          self.sht.write( j,i, hrec[i], self.hdr_cell_format )
176
177      if self.txt:
178        for i in range(len(hrec)):
179          self.oo.write( hrec[i] + '\t' )
180        self.oo.write( '\n' )
181
182  def cmvtab(self,t,addMips,mode='c',tslice=False,byFreqRealm=False,truePriority=False):
183      if self.xls:
184        self.sht = self.newSheet( t )
185      j = 0
186      ncga = 'NetCDF Global Attribute'
187      if mode == 'c':
188        hrec = ['Default Priority','Long name', 'units', 'description', 'comment', 'Variable Name', 'CF Standard Name', 'cell_methods', 'positive', 'type', 'dimensions', 'CMOR Name', 'modeling_realm', 'frequency', 'cell_measures', 'prov', 'provNote','rowIndex','UID','vid','stid','Structure Title','valid_min', 'valid_max', 'ok_min_mean_abs', 'ok_max_mean_abs']
189        hcmt = ['Default priority (generally overridden by settings in "requestVar" record)',ncga,'','','Name of variable in file','','','CMOR directive','','','CMOR name, unique within table','','','','','','','','','','CMOR variable identifier','MIP variable identifier','Structure identifier','','','','','']
190        if truePriority:
191           hrec[0] = 'Priority'
192           hcmt[0] = 'Lowest priority value set in request for this variable for this experiment'
193        if self.xls:
194          self.sht.set_column(1,1,40)
195          self.sht.set_column(1,3,50)
196          self.sht.set_column(1,4,30)
197          self.sht.set_column(1,5,50)
198          self.sht.set_column(1,6,30)
199          self.sht.set_column(1,9,40)
200          self.sht.set_column(1,18,40)
201          self.sht.set_column(1,19,40)
202          self.sht.set_column(1,20,40)
203          self.sht.set_column(1,21,40)
204          self.sht.set_column(1,26,40)
205          self.sht.set_column(1,27,40)
206          self.sht.set_column(1,30,40)
207      else:
208        hrec = ['','Long name', 'units', 'description', '', 'Variable Name', 'CF Standard Name', '','', 'cell_methods', 'valid_min', 'valid_max', 'ok_min_mean_abs', 'ok_max_mean_abs', 'positive', 'type', 'dimensions', 'CMOR name', 'modeling_realm', 'frequency', 'cell_measures', 'flag_values', 'flag_meanings', 'prov', 'provNote','rowIndex','UID']
209      if addMips:
210        hrec.append( 'MIPs (requesting)' )
211        hrec.append( 'MIPs (by experiment)' )
212
213      if byFreqRealm:
214        hrec = ['Table',] + hrec
215        hcmt = ['CMOR table',] + hcmt
216      if tslice:
217          hrec += ['Number of Years','Slice Type','Years','Grid']
218          hcmt += ['','','','']
219
220      if self.xls:
221        for i in range(len(hrec)):
222          self.sht.write( j,i, hrec[i], self.hdr_cell_format )
223          if hcmt[i] != '':
224            self.sht.write_comment( j,i,hcmt[i])
225
226      if self.txt:
227        self.oo.write( 'MIP table\t' )
228        for i in range(len(hrec)):
229          self.oo.write( hrec[i] + '\t' )
230        self.oo.write( '\n' )
231        self.oo.write( t + '\t' )
232        for i in range(len(hrec)):
233          if hcmt[i] != '':
234            self.oo.write( hcmt[i] + '\t')
235          else:
236            self.oo.write( '\t')
237        self.oo.write( '\n' )
238
239  def newSheet(self,name):
240    self.worksheet = self.wb.add_worksheet(name=name)
241    return self.worksheet
242
243  def close(self):
244    if self.xls:
245      self.wb.close()
246    if self.txt:
247      self.oo.close()
248
249###
250### need to have name of experiment here, for the aggregation over MIPs to work ... in the column of request by MIPs
251###
252class makeTab(object):
253  def __init__(self, sc, subset=None, mcfgNote=None, dest='tables/test', skipped=set(), collected=None,xls=True,txt=False,txtOpts=None,byFreqRealm=False, tslice=None, exptUid=None, tabMode=None, pdict=None):
254    """txtOpts: gives option to list MIP variables instead of CMOR variables"""
255    self.sc = sc
256    dq = sc.dq
257    if subset != None:
258      cmv = [x for x in dq.coll['CMORvar'].items if x.uid in subset]
259    else:
260      cmv = dq.coll['CMORvar'].items
261    self.byFreqRealm=byFreqRealm
262
263    ixt = collections.defaultdict(list)
264    if not byFreqRealm:
265      for i in cmv:
266        ixt[i.mipTable].append( i.uid )
267    else:
268      for i in cmv:
269        ixt['%s.%s' % (i.frequency,realmFlt( i.modeling_realm) )].append( i.uid )
270
271    if oldpython:
272        tables = sorted( ixt.keys(), cmp=cmpAnnex )
273    else:
274        tables = sorted( ixt.keys(), key=kAnnex )
275
276    addMips = True
277    if addMips:
278      chkv = vrev.checkVar(dq)
279      chkv.sc = self.sc
280    mode = 'c'
281    tableNotes = [
282       ('Request Version',str(dq.version)),
283       ('MIPs (...)','The last two columns in each row list MIPs associated with each variable. The first column in this pair lists the MIPs which are requesting the variable in one or more experiments. The second column lists the MIPs proposing experiments in which this variable is requested. E.g. If a variable is requested in a DECK experiment by HighResMIP, then HighResMIP appears in the first column and DECK in the second')]
284
285    wb = xlsx( dest, xls=xls, txt=txt )
286    if mcfgNote != None:
287      wb.mcfgNote = mcfgNote
288    wb.header( tableNotes, collected)
289    truePriority = tabMode == 'e' and pdict != None
290
291    if txtOpts != None and txtOpts.mode == 'var':
292      vl =  list( set( [v.vid for v in cmv] )  )
293      vli = [dq.inx.uid[i] for i in vl]
294      if oldpython:
295        thisvli =  sorted( vli, cmp=cmpdn(['sn','label']).cmp )
296      else:
297        thisvli = sorted( vli, key=kCmpdn )
298      wb.var()
299     
300      j = 0
301      for v in thisvli:
302      ###hrec = ['Long name', 'units', 'description', 'Variable Name', 'CF Standard Name' ]
303         orec = [v.title, v.units, v.description, v.label, v.sn]
304         j += 1
305         wb.varrec( j,orec )
306    else:
307      withoo = False
308      for t in tables:
309        if withoo:
310          oo = open( 'tables/test_%s.csv' % t, 'w' )
311        wb.cmvtab(t,addMips,mode='c',tslice=tslice != None,byFreqRealm=byFreqRealm,truePriority = truePriority)
312
313        j = 0
314        if oldpython:
315          thiscmvlist =  sorted( [dq.inx.uid[u] for u in ixt[t]], cmp=cmpdn(['prov','rowIndex','label']).cmp )
316        else:
317          thiscmvlist = sorted( [dq.inx.uid[u] for u in ixt[t]], key=kCmpdnPrl )
318
319        for cmv in thiscmvlist:
320          var = dq.inx.uid[ cmv.vid ]
321          strc = dq.inx.uid[ cmv.stid ]
322          if strc._h.label == 'remarks':
323            print ( 'ERROR: structure not found for %s: %s .. %s (%s)' % (cmv.uid,cmv.label,cmv.title,cmv.mipTable) )
324            ok = False
325          else:
326            sshp = dq.inx.uid[ strc.spid ]
327            tshp = dq.inx.uid[ strc.tmid ]
328            ok = all( [i._h.label != 'remarks' for i in [var,strc,sshp,tshp]] )
329          #[u'shuffle', u'ok_max_mean_abs', u'vid', '_contentInitialised', u'valid_min', u'frequency', u'uid', u'title', u'rowIndex', u'positive', u'stid', u'mipTable', u'label', u'type', u'description', u'deflate_level', u'deflate', u'provNote', u'ok_min_mean_abs', u'modeling_realm', u'prov', u'valid_max']
330
331          if not ok:
332            if (t,cmv.label) not in skipped:
333              ml = []
334              for i in range(4):
335                 ii = [var,strc,sshp,tshp][i]
336                 if ii._h.label == 'remarks':
337                   ml.append( ['var','struct','time','spatial'][i] )
338              print ( 'makeTables: skipping %s %s: %s' % (t,cmv.label,','.join( ml)) )
339              skipped.add( (t,cmv.label) )
340          else:
341            dims = []
342            dims +=  sshp.dimensions.split( '|' )
343            if 'odims' in strc.__dict__:
344              dims +=  strc.odims.split( '|' )
345            dims +=  tshp.dimensions.split( '|' )
346            if 'coords' in strc.__dict__:
347              dims +=  strc.coords.split( '|' )
348            dims = ' '.join( dims )
349            if "qcranges" in dq.inx.iref_by_sect[cmv.uid].a:
350              u = dq.inx.iref_by_sect[cmv.uid].a['qcranges'][0]
351              qc = dq.inx.uid[u]
352              ll = []
353              for k in ['valid_min', 'valid_max', 'ok_min_mean_abs', 'ok_max_mean_abs']:
354                if qc.hasattr(k):
355                  ll.append( '%s %s' % (qc.__dict__[k],qc.__dict__['%s_status' % k][0]) )
356                else:
357                  ll.append( '' )
358              valid_min, valid_max, ok_min_mean_abs, ok_max_mean_abs = tuple( ll )
359            else:
360              valid_min, valid_max, ok_min_mean_abs, ok_max_mean_abs = ('','','','')
361               
362            if mode == 'c':
363              try:
364                if tabMode == 'e' and pdict != None:
365                  if cmv.uid in pdict:
366                    thisp = str( min( pdict[cmv.uid] ) )
367                  else:
368                    thisp = str(cmv.defaultPriority)
369                    print ('ERROR.priority.0101: %s, %s ' % (cmv.label,dest) )
370                else:
371                  thisp = str(cmv.defaultPriority)
372#
373# avoid duplication of information (added in 01.00.29)
374##
375                if cmv.description != var.description:
376                  cmmt = cmv.description
377                else:
378                  cmmt = ''
379                orec = [thisp,var.title, var.units, var.description, cmmt, var.label, var.sn, strc.cell_methods, cmv.positive, cmv.type, dims, cmv.label, cmv.modeling_realm, cmv.frequency, strc.cell_measures, cmv.prov,cmv.provNote,str(cmv.rowIndex),cmv.uid,cmv.vid,cmv.stid,strc.title, valid_min, valid_max, ok_min_mean_abs, ok_max_mean_abs]
380
381##
382              except:
383                print ('FAILED TO CONSTRUCT RECORD: %s [%s], %s [%s]' % (cmv.uid,cmv.label,var.uid,var.label) )
384                raise
385            else:
386              orec = ['',var.title, var.units, cmv.description, '', var.label, var.sn, '','', strc.cell_methods, valid_min, valid_max, ok_min_mean_abs, ok_max_mean_abs, cmv.positive, cmv.type, dims, cmv.label, cmv.modeling_realm, cmv.frequency, strc.cell_measures, strc.flag_values, strc.flag_meanings,cmv.prov,cmv.provNote,str(cmv.rowIndex),var.uid]
387
388            if byFreqRealm:
389              orec = [cmv.mipTable,] + orec
390
391##!
392# CHECK -- ERROR HERE FOR "TOTAL" ROW --spurious mips in thismips ---
393##!
394## change "c" to something searchable
395            if addMips:
396##
397## union of all mips interested in this variable
398##
399              thismips = chkv.chkCmv( cmv.uid )
400##
401## all mips requesting this variable for this experiment
402##
403              thismips2 = chkv.chkCmv( cmv.uid, byExpt=True, expt=exptUid )
404              orec.append( ','.join( sorted( list( thismips) ) ) )
405              orec.append( ','.join( sorted( list( thismips2) ) ) )
406
407            if tslice != None:
408              msgLevel = 0
409              if cmv.uid in tslice and msgLevel > 1:
410                print ( 'INFO.table_utils.01001: slice 3: %s : %s' % ( str( tslice[cmv.uid] ), cmv.label ) )
411              if cmv.uid not in tslice:
412                orec += ['All', '','','']
413              elif type( tslice[cmv.uid] ) == type( 0 ):
414                print ( 'ERROR: unexpected tslice type: %s, %s' % (cmv.uid, tslice[cmv.uid] ) )
415              elif len(  tslice[cmv.uid] ) == 3:
416                x,priority,grid = tslice[cmv.uid]
417                orec[0] = priority
418                if x != None:
419                   tslab,tsmode,a,b = x
420                   orec += [tslab,tsmode,'',grid]
421                else:   
422                   print ( 'WARN.table_utils.01001: slice 3: %s : %s' % ( str( tslice[cmv.uid] ), cmv.label ) )
423                   orec += ['*unknown*','','',grid]
424              else:
425                tslab,tsmode,a,b,priority,grid = tslice[cmv.uid]
426                if type( priority ) != type(1):
427                  thisp = priority
428                  priority = thisp[1]
429                orec[0] = '%s' % priority
430                     
431                if tsmode[:4] in ['simp','bran']:
432                   nys = b + 1 - a
433                   ys = range(a,b+1)
434                   orec += [str(nys), '',str(ys)]
435                elif tsmode in ['rangeplus']:
436                   nys = b + 1 - a + 0.01
437                   ys = [1850,] + range(a,b+1)
438                   orec += [str(nys), 'Partial 1850 + %s to %s' % (a,b),'%6.2f' % ys]
439                elif tsmode[:4] in ['YEAR']:
440                   nys = a
441                   ys = b
442                   orec += [str(nys), '',str(ys)]
443                else:
444                   orec += ['slice', tslab,'']
445                orec.append( grid )
446               
447            if orec[0] in [0,'0',None]:
448                  print ('ERROR.priority.006: %s, %s ' % (orec,dest))
449            if withoo:
450              oo.write( '\t'.join(orec ) + '\n' )
451            j+=1
452            wb.cmvtabrec( j,t,orec )
453
454        if withoo:
455          oo.close()
456    wb.close()
457
458class tables(object):
459  def __init__(self,sc, odir='xls',xls=True,txt=False,txtOpts=None):
460      self.sc = sc
461      self.dq = sc.dq
462      ##self.mips = mips
463      self.odir = odir
464      self.accReset()
465      self.doXls = xls
466      self.doTxt = txt
467      self.txtOpts = txtOpts
468
469  def accReset(self):
470    self.acc = [0.,collections.defaultdict(int),collections.defaultdict( float ) ]
471
472  def accAdd(self,x):
473    self.acc[0] += x[0]
474    for k in x[2]:
475       self.acc[2][k] += x[2][k]
476
477
478  def doTable(self,m,l1,m2,pmax,collector,acc=True, mlab=None,exptids=None,cc=None):
479      """*acc* allows accumulation of values to be switched off when called in single expt mode"""
480     
481      self.verbose = False
482      if mlab == None:
483        mlab = misc_utils.setMlab( m )
484
485      cc0 = misc_utils.getExptSum( self.dq, mlab, l1 )
486      ks = sorted( list( cc0.keys() ) )
487      if self.verbose:
488        print ('Experiment summary: %s %s' % (mlab,', '.join( ['%s: %s' % (k,len(cc0[k])) for k in ks] ) ) )
489
490      if m2 in [None, 'TOTAL']:
491        x = self.acc
492      else:
493        x = self.sc.volByExpt( l1, m2, pmax=pmax )
494
495##self.volByExpt( l1, e, pmax=pmax, cc=cc, retainRedundantRank=retainRedundantRank, intersection=intersection, adsCount=adsCount )
496        v0 = self.sc.volByMip( m, pmax=pmax,  exptid=m2 )
497####
498        if cc==None:
499          cc = collections.defaultdict( int )
500        for e in self.sc.volByE:
501          if self.verbose:
502             print ('INFO.mlab.... %s: %s: %s' % ( mlab, e, len( self.sc.volByE[e][2] ) ) )
503          for v in self.sc.volByE[e][2]:
504             cc[v] += self.sc.volByE[e][2][v]
505        xxx = 0
506        for v in cc:
507          xxx += cc[v]
508####
509        if acc:
510          for e in self.sc.volByE:
511            self.accAdd(self.sc.volByE[e])
512
513      if m2 not in [ None, 'TOTAL']:
514          im2 = self.dq.inx.uid[m2]
515          ismip = im2._h.label == 'mip'
516          mlab2 = im2.label
517
518          x0 = 0
519          for e in self.sc.volByE:
520            if exptids == None or e in exptids:
521              x = self.sc.volByE[e]
522              if x[0] > 0:
523                collector[mlab].a[mlab2] += x[0]
524                x0 += x[0]
525      else:
526          ismip = False
527          mlab2 = 'TOTAL'
528          x0 = x[0]
529
530      if mlab2 == 'TOTAL' and x0 == 0:
531        print ( 'no data detected for %s' % mlab )
532
533      if x0 > 0:
534#
535# create sum for each table
536#
537        xs = 0
538        kkc = '_%s_%s' % (mlab,mlab2)
539        kkct = '_%s_%s' % (mlab,'TOTAL')
540        if m2 in [None, 'TOTAL']:
541          x = self.acc
542          x2 = set(x[2].keys() )
543          for k in x[2].keys():
544           i = self.dq.inx.uid[k]
545           xxx =  x[2][k]
546           xs += xxx
547        else:
548          x2 = set()
549          for e in self.sc.volByE:
550            if exptids == None or e in exptids:
551              x = self.sc.volByE[e]
552              x2 = x2.union( set( x[2].keys() ) )
553              for k in x[2].keys():
554               i = self.dq.inx.uid[k]
555               xxx =  x[2][k]
556               xs += xxx
557               if xxx > 0:
558                collector[kkc].a[i.mipTable] += xxx
559                if ismip:
560                  collector[kkct].a[i.mipTable] += xxx
561
562##
563## One user was getting false error message here, with ('%s' % x0) == ('%s' % xs)
564##
565        if abs(x0 -xs) > 1.e-8*( abs(x0) + abs(xs) ):
566          print ( 'ERROR.0088: consistency problem %s  %s %s %s' % (m,m2,x0,xs) )
567        if x0 == 0:
568          print ( 'Zero size: %s, %s' % (m,m2) )
569          if len( x[2].keys() ) > 0:
570             print ( 'ERROR:zero: %s, %s: %s' % (m,m2,str(x[2].keys()) ) )
571
572        if acc and m2 not in [ None, 'TOTAL']:
573          collector[mlab].a['TOTAL'] += x0
574
575        dd = collections.defaultdict( list )
576        lll = set()
577        for v in x2:
578          vi = self.sc.dq.inx.uid[v]
579          if vi._h.label != 'remarks':
580            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
581            lll.add(u)
582            dd[t].append( (f,t,l,tt,d,u) )
583
584        if len( dd.keys() ) > 0:
585          collector[mlab].dd[mlab2] = dd
586          if m2 not in [ None, 'TOTAL']:
587            if im2._h.label == 'experiment':
588              dothis = self.sc.tierMax >= min( im2.tier )
589###
590### BUT ... there is a treset in the request item .... it may be that some variables are excluded ...
591###         need the variable list itself .....
592###
593          makeTab( self.sc, subset=lll, dest='%s/%s-%s_%s_%s' % (self.odir,mlab,mlab2,self.sc.tierMax,pmax), collected=collector[kkc].a,
594              mcfgNote=self.sc.mcfgNote,
595              txt=self.doTxt, xls=self.doXls, txtOpts=self.txtOpts, exptUid=self.sc.exptByLabel.get(mlab2,mlab2) )
Note: See TracBrowser for help on using the repository browser.