Skip to content

Commit 60c916b

Browse files
committed
refining taylor diagram and associated changes
1 parent 1399a17 commit 60c916b

File tree

6 files changed

+1266
-1148
lines changed

6 files changed

+1266
-1148
lines changed

lib/adf_dataset.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -240,10 +240,20 @@ def load_reference_climo_ds(self, case, variablename, apply_scaling=True):
240240
fils = self.get_reference_climo_file(variablename)
241241
ds = self.load_dataset(fils)
242242
vname = self.ref_var_nam[variablename] # name of variable in the reference data
243+
# Check if already transformed (via attribute or units)
244+
# Check if already transformed (via attribute or units)
245+
unit_match = ds[vname].attrs.get('units') == self.adf.variable_defaults[variablename].get('new_unit')
246+
if ds[vname].attrs.get('transformed', False) or unit_match:
247+
apply_scaling = False
243248
if not apply_scaling:
244249
add_offset = 0
245250
scale_factor = 1
251+
252+
attrs = ds[vname].attrs.copy()
246253
ds[vname] = ds[vname] * scale_factor + add_offset
254+
ds[vname].attrs = attrs
255+
if scale_factor != 1 or add_offset != 0:
256+
ds[vname].attrs['transformed'] = True
247257
return ds
248258

249259
def load_reference_climo_da(self, case, variablename, apply_scaling=True):
@@ -391,20 +401,24 @@ def load_da(self, fils, variablename, **kwargs):
391401
if ds is None:
392402
warnings.warn(f"\t WARNING: Load failed for {variablename}")
393403
return None
394-
da = (ds[variablename]).squeeze()
404+
da = ds[variablename].squeeze()
395405
apply_scaling = kwargs.get('apply_scaling', True)
396406
if not apply_scaling:
397407
add_offset = 0
398408
scale_factor = 1
399409
else:
400410
scale_factor = kwargs.get('scale_factor', 1)
401411
add_offset = kwargs.get('add_offset', 0)
412+
attrs = da.attrs.copy()
402413
da = da * scale_factor + add_offset
403-
if variablename in self.adf.variable_defaults:
404-
vres = self.adf.variable_defaults[variablename]
405-
da.attrs['units'] = vres.get("new_unit", da.attrs.get('units', 'none'))
406-
else:
407-
da.attrs['units'] = 'none'
414+
da.attrs = attrs
415+
416+
if scale_factor != 1 or add_offset != 0:
417+
if variablename in self.adf.variable_defaults:
418+
new_unit = self.adf.variable_defaults[variablename].get("new_unit")
419+
if new_unit:
420+
da.attrs['units'] = new_unit
421+
da.attrs['transformed'] = True
408422
return da
409423

410424
# Get variable conversion defaults, if applicable
@@ -433,8 +447,4 @@ def get_value_converters(self, case, variablename):
433447
add_offset = vres.get("add_offset", 0)
434448
return add_offset, scale_factor
435449

436-
#------------------
437-
438-
439-
440-
450+
#------------------

lib/adf_utils.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def mask_land_or_ocean(arr, msk, use_nan=False):
126126
missing_value = -999.
127127
#End if
128128

129-
arr = xr.where(msk>=0.9,arr,missing_value)
129+
arr = xr.where(msk>=0.9,arr,missing_value, keep_attrs=True)
130130
arr.attrs["missing_value"] = missing_value
131131
return(arr)
132132

@@ -535,7 +535,7 @@ def lev_to_plev(data, ps, hyam, hybm, P0=100000., new_levels=None,
535535
#Temporary print statement to notify users to ignore warning messages.
536536
#This should be replaced by a debug-log stdout filter at some point:
537537
print("Please ignore the interpolation warnings that follow!")
538-
538+
539539
#Apply GeoCAT hybrid->pressure interpolation:
540540
if new_levels is not None:
541541
data_interp = gcomp.interpolation.interp_hybrid_to_pressure(data, ps,
@@ -559,10 +559,22 @@ def lev_to_plev(data, ps, hyam, hybm, P0=100000., new_levels=None,
559559
#Rename vertical dimension back to "lev" in order to work with
560560
#the ADF plotting functions:
561561
data_interp_rename = data_interp.rename({"plev": "lev"})
562+
attrs = data_interp_rename.attrs.copy()
563+
lev_orig = data_interp_rename["lev"]
564+
lev_orig_attrs = lev_orig.attrs.copy()
562565

563566
#Convert vertical dimension to mb/hPa, if requested:
564567
if convert_to_mb:
565-
data_interp_rename["lev"] = data_interp_rename["lev"] / 100.0
568+
lev_new = lev_orig / 100.0
569+
lev_new.attrs = lev_orig_attrs
570+
lev_new.name = "lev"
571+
lev_new.attrs["units"] = "hPa"
572+
lev_new.attrs["history"] = f"converted to hPa by dividing by 100 in adf_utils.lev_to_plev"
573+
data_interp_rename["lev"] = lev_new
574+
data_interp_rename.attrs = attrs
575+
else:
576+
data_interp_rename.attrs['units'] = "Pa"
577+
data_interp_rename.attrs['history'] = f"Interpolated using GeoCAT, assume units of Pa in adf_utils.lev_to_plev"
566578

567579
return data_interp_rename
568580

@@ -678,6 +690,7 @@ def plev_to_plev(data, new_levels=None, convert_to_mb=False):
678690

679691
# convert vertical dimension to mb/hPa, if requested:
680692
if convert_to_mb:
693+
## DEAL WITH METADATA BETTER HERE
681694
output["lev"] = output["lev"] / 100.0
682695
#End if
683696

0 commit comments

Comments
 (0)