Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pmp using cdp pull request #451

Merged
merged 54 commits into from
Nov 29, 2016
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
ec98f58
Initial commit using CDP.
zshaheen Sep 21, 2016
ee862a4
More cleanup.
zshaheen Sep 21, 2016
3b2d19c
Really done this time
zshaheen Sep 21, 2016
68d2d59
Added working PMP files.
zshaheen Sep 21, 2016
e3bac80
All test work.
zshaheen Sep 21, 2016
39136ce
Initial commit of PMPDriverRunDiags with tests.
zshaheen Sep 21, 2016
c5f107a
Added funcs and testing for Omon
zshaheen Sep 21, 2016
ad738d0
Added calculate_levels() and fixed imports
zshaheen Sep 21, 2016
988a48a
Added OutputMetrics, tests and fcn to RunDiags.
zshaheen Sep 22, 2016
dce3516
Added checking for obs or model for data_set_a and data_set_b.
zshaheen Sep 22, 2016
54ad890
Added Observation class and tests.
zshaheen Sep 27, 2016
bd6d313
Added OBS class and tests.
zshaheen Sep 27, 2016
ff9c84e
Added create_obs_mask and tests.
zshaheen Sep 28, 2016
135a2fb
Refactored last commit and tests.
zshaheen Sep 28, 2016
fe0ba71
Done with Observation.
zshaheen Sep 30, 2016
2b13309
Added Model.py
zshaheen Oct 3, 2016
84525a4
RunDiags now (in theory) works with Obs and Model.
zshaheen Oct 3, 2016
4dc9b6b
Renamed data sets to reference and test
zshaheen Oct 4, 2016
375de79
'Done' with PMPRunDiags. Just need to do a lot of refactoring and tes…
zshaheen Oct 5, 2016
9f09040
Added parent to obs and model. Cleanup as well.
zshaheen Oct 5, 2016
a6a9a06
Added two tests for DataSet.calculate_level_from_var().
zshaheen Oct 5, 2016
d20c8bb
Done testing DataSet.
zshaheen Oct 6, 2016
15734de
I forgot what I did, but it was a lot.
zshaheen Oct 7, 2016
2d8fffc
Added files and almost working.
zshaheen Oct 7, 2016
6f2fead
Fixed error regarding regions_specs and now working without any errors.
zshaheen Oct 10, 2016
a22d9fe
Files now being written with correct names.
zshaheen Oct 10, 2016
9a9300b
Interpolated clims now are saved.
zshaheen Oct 11, 2016
97934e5
Everything working except results are off by 0.01 to 0.001
zshaheen Oct 11, 2016
5065aa0
Removed actualy CDP code from repo.
zshaheen Oct 12, 2016
0ac23ef
Cleanup.
zshaheen Oct 12, 2016
774184c
Bunch of renaming and performance increase b/c creating sftlf once.
zshaheen Oct 12, 2016
8d956cd
Parser done.
zshaheen Oct 13, 2016
7f86b61
Bunch of renaming.
zshaheen Oct 13, 2016
185251d
Nothing is working.
zshaheen Nov 2, 2016
3bb00e4
Holy shit, it works now.
zshaheen Nov 3, 2016
df056e7
Renamed back to pcmdi_metrics and added tests
zshaheen Nov 8, 2016
69dacf0
Done with all tests
zshaheen Nov 8, 2016
3280147
Added test script.
zshaheen Nov 9, 2016
880ddce
Abstracted target grid stuff.
zshaheen Nov 10, 2016
b1ed341
More refactoring.
zshaheen Nov 14, 2016
b199789
Moving obs_info_dictionary.json to share/pmp
zshaheen Nov 14, 2016
ec97741
All external files loading from /share/pmp/
zshaheen Nov 14, 2016
2ea037a
Added stuff from legacy pmp.
zshaheen Nov 15, 2016
84f05e3
More renaming.
zshaheen Nov 15, 2016
46ab7fd
Imports work
zshaheen Nov 16, 2016
56205e3
No more errors, but results are still off.
zshaheen Nov 17, 2016
7eae064
Tests pass.
zshaheen Nov 26, 2016
aebaf6e
Refactored PMPParser to use CDPParser.
zshaheen Nov 26, 2016
a4f20cc
Made pmp_driver.py executable and fixed test scripts.
zshaheen Nov 26, 2016
1dbb736
Fixed typo
zshaheen Nov 28, 2016
b39ef1c
Skipping regions without sftlf works now
zshaheen Nov 28, 2016
b7f8a87
Data now added to dict during premature breaking of for loops
zshaheen Nov 28, 2016
61d95f8
Changed test parameter vocabulary.
zshaheen Nov 28, 2016
011f004
fixing merge issues
zshaheen Nov 28, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Added Model.py
  • Loading branch information
zshaheen committed Oct 3, 2016
commit 2b13309b61f76e3809e8b507771cbb34f7bd14a7
158 changes: 158 additions & 0 deletions pcmdi_metrics/PMP/Model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
from pcmdi_metrics.PMP.PMPIO import *


class Model(object):
def __init__(self, parameter, var_name_long, region, model, obs_dict):
self.parameter = parameter
self.parameter = parameter
self.level = self.calculate_level_from_var(var_name_long)
self.var = var_name_long.split('_')[0]
self.region = region
self.model = model
self.obs_dict = obs_dict
self.model_file = None
self.sftlf = self.create_sftlf(self.parameter)
self.create_model_file()

@staticmethod
def calculate_level_from_var(var):
var_split_name = var.split('_')
if len(var_split_name) > 1:
level = float(var_split_name[-1]) * 100
else:
level = None
return level

@staticmethod
def create_sftlf(parameter):
sftlf = {}
# LOOP THROUGH DIFFERENT MODEL VERSIONS OBTAINED FROM input_model_data.py
for model_version in parameter.model_versions:
sft = PMPIO(
parameter.mod_data_path,
getattr(
parameter,
"sftlf_filename_template",
parameter.filename_template))
sft.model_version = model_version
sft.table = "fx"
sft.realm = "atmos"
sft.period = parameter.period
sft.ext = "nc"
sft.case_id = parameter.case_id
sft.targetGrid = None
sft.realization = "r0i0p0"
#applyCustomKeys(sft, parameter.custom_keys, "sftlf")
try:
sftlf[model_version] = {"raw": sft.get("sftlf")}
sftlf[model_version]["filename"] = os.path.basename(sft())
sftlf[model_version]["md5"] = sft.hash()
except:
# Hum no sftlf...
sftlf[model_version] = {"raw": None}
sftlf[model_version]["filename"] = None
sftlf[model_version]["md5"] = None
if parameter.targetGrid == "2.5x2.5":
tGrid = cdms2.createUniformGrid(-88.875, 72, 2.5, 0, 144, 2.5)
else:
tGrid = parameter.targetGrid

sft = cdutil.generateLandSeaMask(tGrid)
sft[:] = sft.filled(1.) * 100.0
sftlf["targetGrid"] = sft

return sftlf

def create_model_file(self):
self.model_file = PMPIO(self.parameter.mod_data_path,
self.parameter.filename_template)
self.model_file.model_version = self.model
self.model_file.period = self.parameter.period
self.model_file.ext = 'nc'
self.model_file.case_id = self.parameter.case_id
self.model_file.realization = self.parameter.realization
self.setup_model_file(self.model_file)

def setup_model_file(self):
regrid_method = ''
regrid_tool = ''

if self.use_omon():
regrid_method = self.parameter.regrid_method_ocn
regrid_tool = self.regrid_tool_ocn.regrid_tool
self.model_file.table = 'Omon'
self.model_file.realm = 'ocn'
else:
regrid_method = self.parameter.regrid_method
regrid_tool = self.parameter.regrid_tool
self.model_file.table = 'Amon'
self.model_file.realm = 'atm'

self.model_file.set_target_grid(self.parameter.target_grid,
regrid_tool,
regrid_method)

def use_omon(self):
return \
self.obs_dict[self.var][self.obs_dict[self.var]["default"]]\
["CMIP_CMOR_TABLE"] == 'Omon'

def get(self):
var_in_file = self.get_var_in_file()

if self.region is not None:
region_value = self.region.get('value', None)
if region_value is not None:
if self.sftlf[self.model]['raw'] is None:
if not hasattr(self.parameter, 'generate_sftlf') or \
self.parameter.generate_sftlf is False:
logging.info('Model %s does not have sftlf, skipping region: %s' % (self.model, self.region))
# TODO MAKE success a member variable?
success = False
else:
self.model_file.variable = self.var
logging.info('Auto generating sftlf for model %s' % self.model())
if os.path.exists(self.model_file()):
var_file = cdms2.open(self.model_file())
var = var_file[var_in_file]
N = var.rank() - 2 # Minus lat and long
sft = cdutil.generateLandSeaMask(var(*(slice(0, 1),) * N)) * 100.0
sft[:] = sft.filled(100.0)
self.sftlf[self.model]['raw'] = sft
var_file.close()
logging.info('Auto generated sftlf for model %s' % self.model)

self.model_file.mask = self.sftlf[self.model]['raw']
self.model_file.target_mask = MV2.not_equal(self.sftlf['targetGrid'], region_value)

try:
if self.level is None:
data_model = self.model_file.get(self.var,
var_in_file=var_in_file,
region=self.region)
else:
data_model = self.model_file.get(self.var,
var_in_file=var_in_file,
level=self.level,
region=self.region)
return data_model
except Exception as err:
#TODO do something about success
success = False
logging.exception('Failed to get variable %s for the version: %s. Error: %s' % (self.var, self.model, err))


def get_var_in_file(self):
tweaks = {}
if hasattr(self.parameter, 'model_tweaks'):
tweaks = self.parameter.model_tweaks.get(self.model, {})
var_in_file = tweaks.get('variable_mapping', {}).get(self.var, None)

if var_in_file is None:
tweaks_all = {}
if hasattr(self.parameter, 'model_tweaks'):
tweaks_all = self.parameter.model_tweaks.get(None, {})
var_in_file = tweaks_all.get(
'variable_mapping', {}).get(self.var, self.var)

return var_in_file
14 changes: 7 additions & 7 deletions pcmdi_metrics/PMP/Observation.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,30 +94,30 @@ def get_obs_from_obs_dict(self):
return obs_from_obs_dict


def setup_obs_file(self, obs_file):
def setup_obs_file(self):
regrid_method = ''
regrid_tool = ''

if self.use_omon():
regrid_method = self.parameter.regrid_method_ocn
regrid_tool = self.regrid_tool_ocn.regrid_tool
obs_file.table = 'Omon'
obs_file.realm = 'ocn'
self.obs_file.table = 'Omon'
self.obs_file.realm = 'ocn'
else:
regrid_method = self.parameter.regrid_method
regrid_tool = self.parameter.regrid_tool
obs_file.table = 'Amon'
obs_file.realm = 'atm'
self.obs_file.table = 'Amon'
self.obs_file.realm = 'atm'

obs_file.set_target_grid(self.parameter.target_grid,
self.obs_file.set_target_grid(self.parameter.target_grid,
regrid_tool,
regrid_method)
if self.region is not None:
region_value = self.region.get('value', None)
if region_value is not None:
if self.sftlf is None:
self.sftlf = self.create_sftlf(self.parameter)
obs_file.targetMask = MV2.not_equal(
self.obs_file.targetMask = MV2.not_equal(
self.sftlf['targetGrid'],
region_value
)
Expand Down