From 19d2a1de42ad4d293f01157c67d65655f5732f1f Mon Sep 17 00:00:00 2001 From: eloise-b Date: Thu, 19 Aug 2021 03:47:35 +0000 Subject: [PATCH 1/4] changing c2 scaling to not clip to 0, and use nodata instead --- wofs/virtualproduct.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/wofs/virtualproduct.py b/wofs/virtualproduct.py index ec1a832..2465eda 100644 --- a/wofs/virtualproduct.py +++ b/wofs/virtualproduct.py @@ -20,11 +20,12 @@ def scale_usgs_collection2(data): """These are taken from the Fractional Cover scaling values""" return data.apply(scale_and_clip_dataarray, keep_attrs=True, - scale_factor=0.275, add_offset=-2000, clip_range=(0, 10000)) + scale_factor=0.275, add_offset=-2000, + clip_range=None, valid_range=(0, 10000)) def scale_and_clip_dataarray(dataarray: xr.DataArray, *, scale_factor=1, add_offset=0, clip_range=None, - new_nodata=-999, new_dtype='int16'): + valid_range=None, new_nodata=-999, new_dtype='int16'): orig_attrs = dataarray.attrs nodata = dataarray.attrs['nodata'] @@ -36,10 +37,15 @@ def scale_and_clip_dataarray(dataarray: xr.DataArray, *, scale_factor=1, add_off if clip_range is not None: clip_min, clip_max = clip_range dataarray.clip(clip_min, clip_max) + if valid_range is not None: + valid_min, valid_max = valid_range + negative_mask = dataarray < valid_min dataarray = dataarray.astype(new_dtype) dataarray.data[mask] = new_nodata + if valid_range is not None: + dataarray.where(negative_mask, new_nodata) dataarray.attrs = orig_attrs dataarray.attrs['nodata'] = new_nodata From 251ecf43d671d0f63c9fdba7dc6d3646223b624e Mon Sep 17 00:00:00 2001 From: eloise-b Date: Thu, 19 Aug 2021 04:25:41 +0000 Subject: [PATCH 2/4] addition of upper valid range --- wofs/virtualproduct.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wofs/virtualproduct.py b/wofs/virtualproduct.py index 2465eda..d526359 100644 --- a/wofs/virtualproduct.py +++ b/wofs/virtualproduct.py @@ -40,12 +40,14 @@ def scale_and_clip_dataarray(dataarray: xr.DataArray, *, scale_factor=1, add_off if valid_range is not None: valid_min, valid_max = valid_range negative_mask = dataarray < valid_min + greater_mask = dataarray > valid_max dataarray = dataarray.astype(new_dtype) dataarray.data[mask] = new_nodata if valid_range is not None: dataarray.where(negative_mask, new_nodata) + dataarray.where(greater_mask, new_nodata) dataarray.attrs = orig_attrs dataarray.attrs['nodata'] = new_nodata From 1c677cf864ac13b61db540f51a3a102a343823aa Mon Sep 17 00:00:00 2001 From: eloise-b Date: Thu, 19 Aug 2021 04:48:05 +0000 Subject: [PATCH 3/4] tidying the valid min and max --- wofs/virtualproduct.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/wofs/virtualproduct.py b/wofs/virtualproduct.py index d526359..6988e03 100644 --- a/wofs/virtualproduct.py +++ b/wofs/virtualproduct.py @@ -37,17 +37,14 @@ def scale_and_clip_dataarray(dataarray: xr.DataArray, *, scale_factor=1, add_off if clip_range is not None: clip_min, clip_max = clip_range dataarray.clip(clip_min, clip_max) - if valid_range is not None: - valid_min, valid_max = valid_range - negative_mask = dataarray < valid_min - greater_mask = dataarray > valid_max dataarray = dataarray.astype(new_dtype) dataarray.data[mask] = new_nodata if valid_range is not None: - dataarray.where(negative_mask, new_nodata) - dataarray.where(greater_mask, new_nodata) + valid_min, valid_max = valid_range + dataarray = dataarray.where(dataarray> valid_min, new_nodata) + dataarray = dataarray.where(dataarray< valid_max, new_nodata) dataarray.attrs = orig_attrs dataarray.attrs['nodata'] = new_nodata From c4d13d9465f53950a191b676a79ff7607b5319f0 Mon Sep 17 00:00:00 2001 From: eloise-b Date: Thu, 19 Aug 2021 04:53:50 +0000 Subject: [PATCH 4/4] <= and >= for the min and max --- wofs/virtualproduct.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wofs/virtualproduct.py b/wofs/virtualproduct.py index 6988e03..eaac228 100644 --- a/wofs/virtualproduct.py +++ b/wofs/virtualproduct.py @@ -43,8 +43,8 @@ def scale_and_clip_dataarray(dataarray: xr.DataArray, *, scale_factor=1, add_off dataarray.data[mask] = new_nodata if valid_range is not None: valid_min, valid_max = valid_range - dataarray = dataarray.where(dataarray> valid_min, new_nodata) - dataarray = dataarray.where(dataarray< valid_max, new_nodata) + dataarray = dataarray.where(dataarray>= valid_min, new_nodata) + dataarray = dataarray.where(dataarray<= valid_max, new_nodata) dataarray.attrs = orig_attrs dataarray.attrs['nodata'] = new_nodata