source: cp4cds-tmp/simChk1.py @ 874

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/cp4cds-tmp/simChk1.py@874
Revision 874, 4.6 KB checked in by mjuckes, 3 years ago (diff)

updated to scan additional variables

RevLine 
[868]1
2
3import os, collections, glob
4
5base = '/badc/cmip5/data/cmip5/output1/'
6
7
8vars1 = [('Amon','tas'),('Amon','tasmin'),('Amon','tasmax'),('Amon','uas'),('Amon','vas'),('Amon','hurs'),('Amon','pr'),('Amon','ps')]
9vars1 = [('Amon','tas'),('Amon','tasmin'),('Amon','tasmax'),('Amon','uas'),('Amon','vas'),('Amon','pr'),('Amon','ps')]
10
[874]11spth = {'Amon':'mon/atmos/Amon/', 'day':'day/atmos/day/',
12        'Lmon':'mon/land/Lmon/',
13        'Omon':'mon/ocean/Omon/',
14        'OImon':'mon/seaIce/OImon/',
15        'LImon':'mon/landIce/LImon/' }
[868]16
[874]17mset1 = { 'info':'Selected by simChk1, based on availabiity of 7 vars in 3 experiments',
18          'models':[('MRI', 'MRI-CGCM3'), ('MOHC', 'HadGEM2-ES'), ('MIROC', 'MIROC-ESM'), ('CNRM-CERFACS', 'CNRM-CM5'), ('NOAA-GFDL', 'GFDL-ESM2G'), ('IPSL', 'IPSL-CM5B-LR'), ('CMCC', 'CMCC-CM'), ('NASA-GISS', 'GISS-E2-R-CC'), ('MIROC', 'MIROC5'), ('NASA-GISS', 'GISS-E2-H'), ('MPI-M', 'MPI-ESM-LR'), ('NASA-GISS', 'GISS-E2-R'), ('NOAA-GFDL', 'GFDL-ESM2M'), ('MOHC', 'HadGEM2-CC'), ('IPSL', 'IPSL-CM5A-LR'), ('CSIRO-BOM', 'ACCESS1-0'), ('MPI-M', 'MPI-ESM-MR'), ('IPSL', 'IPSL-CM5A-MR'), ('MIROC', 'MIROC4h'), ('CMCC', 'CMCC-CMS'), ('NCC', 'NorESM1-M'), ('BCC', 'bcc-csm1-1-m'), ('NOAA-GFDL', 'GFDL-CM3'), ('CSIRO-BOM', 'ACCESS1-3'), ('NASA-GISS', 'GISS-E2-H-CC'), ('BNU', 'BNU-ESM'), ('BCC', 'bcc-csm1-1'), ('MIROC', 'MIROC-ESM-CHEM'), ('INM', 'inmcm4')]
19         }
20
21class vtab(object):
22  def __init__(self,vars1,fn='CP4CDS_Projections-data-overview.csv'):
23    assert os.path.isfile(fn), '%s not found' % fn
24    self.vars1 = vars1
25    self.vars2 = []
26    ii = open( fn, 'r' )
27    for l in ii.readlines():
28      if len(l) > 1 and l[0] != '#':
29        var, tab = l.split( '\t' )[:2]
30        assert tab in spth, 'Unrecignised table %s' % tab
31        if (tab,var) not in self.vars1:
32          self.vars2.append( (tab,var) )
33
[868]34class models(object):
[874]35  def __init__(self, base, vars,force=False,mlist=None):
[868]36    assert os.path.isdir( base ), '%s not found' % base
[874]37    self.vars = vars
38    self.force=force
39    self.mlist=mlist
40
[868]41    l10 = glob.glob( '%s/*' % base )
42    l1 = [i for i in l10 if os.path.isdir( i ) ]
[870]43    self.files = dict()
[868]44
45    self.im = []
46
[874]47    if mlist == None:
48      for i in sorted( l1 ):
49        self.addModels( i )
50    else:
51      self.im = mlist
[870]52
53    si = set()
54    sm = set()
55    for i,m in self.im:
56      si.add(i)
57      sm.add(m)
58    print sorted( list( si ) )
59    print sorted( list( sm ) )
[868]60    print self.im
61    self.filterModels(['piControl','historical','rcp45'])
62 
63  def addModels( self, x ):
64    l20 = glob.glob( '%s/*' % x)
65    l2 = [i for i in l20 if os.path.isdir( i ) ]
66    for i in sorted( l2 ):
67      inst, model = i.split( '/' )[-2:]
68      self.im.append( (inst,model) )
69
70  def filterModels(self,expts):
[874]71    pths = set( [spth[t[0]] for t in self.vars] )
[868]72    n0 = len(self.im)
73    n1 = n2 = n3 = n4 = 0
74    sok = set()
75    sokk = set()
76    for i,m in self.im:
77      rcl = []
78      for expt in expts:
79        rcl.append( self.filterModel( expt,i,m,pths ) )
80      rc = min( rcl )
81      if rc != -2:
82        n1 += 1
83      if  rc > 0:
84        n2 += 1
85        sok.add( (i,m) )
86      if min(rcl[1:]) > 2 and rcl[0] > 0:
87        n3 += 1
88        sokk.add( (i,m) )
89      print '%12s: %12s: %s' % (i,m, rc)
90
91    print sok
92    print sokk
[870]93    oo = open( 'fileList.txt', 'w' )
94    for e,i,m,rip in self.files:
[874]95       if (i,m) in sok or self.force:
[870]96         for f in self.files[ (e,i,m,rip) ]:
97           oo.write( f + '\n' )
98    oo.close()
[868]99
100    print 'Models: %s; with historical, rcp45 and piControl: %s; with top variables in 1 simulation: %s; in 3: %s' % (n0,n1,n2,n3)
101
102  def filterModel(self,expt,inst,model,pths):
103    ens = set()
104    for p in pths:
105      x = glob.glob( '%s%s/%s/%s/%s*' % (base,inst,model,expt,p) )
106      for e in x:
107        rip = e.split('/')[-1]
108        ens.add(rip)
109    if len(ens) == 0:
110      return -2
111    else:
112      ens = sorted( list( ens ) )
113      eok = set()
114      for e in ens:
[870]115        efl = []
[868]116        missing = set()
[874]117        for t,v in self.vars:
[868]118          p = spth[t]
119          if os.path.isdir( '%s%s/%s/%s/%s/%s/latest/%s' % (base,inst,model,expt,p,e,v) ):
120            fl =  glob.glob( '%s%s/%s/%s/%s/%s/latest/%s/*.nc' % (base,inst,model,expt,p,e,v) )
[870]121            for f in fl:
122              efl.append(f)
[868]123          else:
124            missing.add( (t,v) )
[874]125        if len(missing) == 0 or (self.force and len(efl) > 0):
[868]126          eok.add(e)
[870]127          self.files[ (expt,inst,model,e) ] = efl
[868]128      if len( eok ) == 0:
129        return -1
130      else:
131        return len(eok)
132         
[874]133mode = 2
134if mode == 1:
135  m = models(base,vars1)
136else:
137  vv = vtab( vars1 )
138  m = models(base,vv.vars2,force=True, mlist=mset1['models'])
[868]139
140
Note: See TracBrowser for help on using the repository browser.