-
Notifications
You must be signed in to change notification settings - Fork 37
/
io.py
105 lines (96 loc) · 3.62 KB
/
io.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import pcmdi_metrics
import json
import os
class OBS(pcmdi_metrics.io.base.Base):
def __init__(self, root, var, obs_dic, reference="default",
file_mask_template=None):
template = "%(realm)/%(frequency)/%(variable)/" +\
"%(reference)/%(ac)/%(filename)"
pcmdi_metrics.io.base.Base.__init__(
self, root, template, file_mask_template)
obs_name = obs_dic[var][reference]
# usually send "default", "alternate", etc
# but some case (sftlf) we send the actual name
if isinstance(obs_name, dict):
obs_name = reference
ref = obs_dic[var][obs_name]
obs_table = ref["CMIP_CMOR_TABLE"]
if obs_table == u"Omon":
self.realm = 'ocn'
self.frequency = 'mo'
self.ac = 'ac'
elif obs_table == u"fx":
self.realm = ''
self.frequency = 'fx'
self.ac = ''
else:
self.realm = 'atm'
self.frequency = 'mo'
self.ac = 'ac'
self.filename = ref["filename"]
self.reference = obs_name
self.variable = var
class JSONs(pcmdi_metrics.io.base.JSONs):
def __init__(self, files=[], ignored_keys=None):
if ignored_keys is None:
ignored_keys = ["SimulationDescription"]
super(
JSONs,
self).__init__(
files,
structure=[
"variable",
"model",
"reference",
"rip",
"region",
"statistic",
"season"],
ignored_keys=ignored_keys,
)
def addJson(self, filename):
f = open(filename)
tmp_dict = json.load(f)
json_struct = tmp_dict.get("json_structure", list(self.json_struct))
json_version = tmp_dict.get("json_version", None)
if json_version is None:
# Json format not stored, trying to guess
R = tmp_dict["RESULTS"]
K = R.keys()
for ky in K:
try:
out = R[ky] # get first available model
out = out["defaultReference"] # get first set of obs
k = out.keys()
# print filename,"K IS:",k
k.pop(k.index("source"))
out = out[k[0]] # first realization
except Exception:
continue
# Ok at this point we need to see if it is json std 1 or 2
# version 1 had NHEX in every region
# version 2 does not
if "bias_xy_djf_NHEX" in out[out.keys()[0]].keys():
json_version = "1.0"
json_struct = self.json_struct[1:]
else:
json_version = "2.0"
break
if float(json_version) == 2.:
json_struct = json_struct[1:]
# Now update our stored results
# First we need to figure out the variable read in
if "variable" not in json_struct:
json_struct.insert(0, "variable")
var = tmp_dict.get("Variable", None)
if var is None: # Not stored in json, need to get from file name
fnm = os.path.basename(filename)
varnm = fnm.split("_")[0]
else:
varnm = var["id"]
if "level" in var:
varnm += "-%i" % int(var["level"] / 100.)
tmp_dict = {varnm: tmp_dict["RESULTS"]}
else:
tmp_dict = tmp_dict["RESULTS"]
self.addDict2Self(tmp_dict, json_struct, json_version)