From 9cce883abf4aa4bf9fac563d3d012d2587fdbe5a Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 2 Sep 2021 22:41:22 +0800 Subject: [PATCH 01/33] Update __init__.py --- satpy/composites/__init__.py | 126 +++++++++++++++++++++++++++-------- 1 file changed, 99 insertions(+), 27 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index f58ff1ed19..28465ecded 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -555,7 +555,7 @@ def _insert_palette_colors(channels, palette): class DayNightCompositor(GenericCompositor): """A compositor that blends a day data with night data.""" - def __init__(self, name, lim_low=85., lim_high=88., **kwargs): + def __init__(self, name, lim_low=85., lim_high=88., chose_day_night="day_and_night", **kwargs): """Collect custom configuration values. Args: @@ -563,18 +563,21 @@ def __init__(self, name, lim_low=85., lim_high=88., **kwargs): blending of the given channels lim_high (float): upper limit of Sun zenith angle for the blending of the given channels + chose_day_night (string): "day_and_night" means both day and night parts will be kept + "only_day" means only day part will be kept + "only_night" means only night part will be kept """ self.lim_low = lim_low self.lim_high = lim_high + self.chose_day_night = chose_day_night super(DayNightCompositor, self).__init__(name, **kwargs) def __call__(self, projectables, **kwargs): """Generate the composite.""" projectables = self.match_data_arrays(projectables) - day_data = projectables[0] - night_data = projectables[1] + data_1 = projectables[0] lim_low = np.cos(np.deg2rad(self.lim_low)) lim_high = np.cos(np.deg2rad(self.lim_high)) @@ -585,43 +588,99 @@ def __call__(self, projectables, **kwargs): LOG.debug("Computing sun zenith angles.") # Get chunking that matches the data try: - chunks = day_data.sel(bands=day_data['bands'][0]).chunks + chunks = data_1.sel(bands=data_1['bands'][0]).chunks except KeyError: - chunks = day_data.chunks - lons, lats = day_data.attrs["area"].get_lonlats(chunks=chunks) - coszen = xr.DataArray(cos_zen(day_data.attrs["start_time"], + chunks = data_1.chunks + lons, lats = data_1.attrs["area"].get_lonlats(chunks=chunks) + coszen = xr.DataArray(cos_zen(data_1.attrs["start_time"], lons, lats), dims=['y', 'x'], - coords=[day_data['y'], day_data['x']]) + coords=[data_1['y'], data_1['x']]) # Calculate blending weights coszen -= np.min((lim_high, lim_low)) coszen /= np.abs(lim_low - lim_high) coszen = coszen.clip(0, 1) - # Apply enhancements to get images - day_data = enhance2dataset(day_data) - night_data = enhance2dataset(night_data) + if self.chose_day_night == "day_and_night": + # This means both day and night part will be kept + data_2 = projectables[1] + day_data = data_1 + night_data = data_2 - # Adjust bands so that they match - # L/RGB -> RGB/RGB - # LA/RGB -> RGBA/RGBA - # RGB/RGBA -> RGBA/RGBA - day_data = add_bands(day_data, night_data['bands']) - night_data = add_bands(night_data, day_data['bands']) + # Apply enhancements to get images + day_data = enhance2dataset(day_data) + night_data = enhance2dataset(night_data) - # Replace missing channel data with zeros - day_data = zero_missing_data(day_data, night_data) - night_data = zero_missing_data(night_data, day_data) + # Adjust bands so that they match + # L/RGB -> RGB/RGB + # LA/RGB -> RGBA/RGBA + # RGB/RGBA -> RGBA/RGBA + day_data = add_bands(day_data, night_data['bands']) + night_data = add_bands(night_data, day_data['bands']) - # Get merged metadata - attrs = combine_metadata(day_data, night_data) + # Replace missing channel data with zeros + day_data = zero_missing_data(day_data, night_data) + night_data = zero_missing_data(night_data, day_data) + + # Get merged metadata + attrs = combine_metadata(day_data, night_data) + + # Blend the two images together + data = (1 - coszen) * night_data + coszen * day_data + data.attrs = attrs + + # Split to separate bands so the mode is correct + data = [data.sel(bands=b) for b in data['bands']] + + elif self.chose_day_night == "only_day": + # This means only day part will be kept + day_data = data_1 + + # Apply enhancements to get images + day_data = enhance2dataset(day_data) + + # Add alpha band + # L -> LA + # RGB -> RGBA + day_data = add_bands(day_data, day_data['bands']) + + # Replace missing channel data with zeros + day_data = zero_missing_data(day_data, day_data) + + # Get merged metadata + attrs = combine_metadata(day_data, day_data) + + # Set night part to 0 and get the maskout image + data = (1 - coszen) * 0 + coszen * day_data + data.attrs = attrs + + # Split to separate bands so the mode is correct + data = [data.sel(bands=b) for b in data['bands']] - # Blend the two images together - data = (1 - coszen) * night_data + coszen * day_data - data.attrs = attrs + elif self.chose_day_night == "only_night": + # This means only night part will be kept + night_data = data_1 - # Split to separate bands so the mode is correct - data = [data.sel(bands=b) for b in data['bands']] + # Apply enhancements to get images + night_data = enhance2dataset(night_data) + + # Add alpha band + # L -> LA + # RGB -> RGBA + night_data = add_bands(night_data, night_data['bands']) + + # Replace missing channel data with zeros + night_data = zero_missing_data(night_data, night_data) + + # Get merged metadata + attrs = combine_metadata(night_data, night_data) + + # Set night part to 0 and get the maskout image + data = (1 - coszen) * night_data + coszen * 0 + data.attrs = attrs + + # Split to separate bands so the mode is correct + data = [data.sel(bands=b) for b in data['bands']] return super(DayNightCompositor, self).__call__(data, **kwargs) @@ -695,6 +754,19 @@ def add_bands(data, bands): new_data = xr.concat(new_data, dim='bands') new_data.attrs['mode'] = data.attrs['mode'] + 'A' data = new_data + elif 'A' not in data['bands'].data: + new_data = [data.sel(bands=band) for band in data['bands'].data] + # Create alpha band based on a copy of the first "real" band + alpha = new_data[0].copy() + alpha.data = da.ones((data.sizes['y'], + data.sizes['x']), + chunks=new_data[0].chunks) + # Rename band to indicate it's alpha + alpha['bands'] = 'A' + new_data.append(alpha) + new_data = xr.concat(new_data, dim='bands') + new_data.attrs['mode'] = data.attrs['mode'] + 'A' + data = new_data return data From 4a75db108bc6ff88e9cdeb37a7c2b7afa30e6435 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 3 Sep 2021 22:51:06 +0800 Subject: [PATCH 02/33] Update __init__.py --- satpy/composites/__init__.py | 138 ++++++++++------------------------- 1 file changed, 37 insertions(+), 101 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 28465ecded..20dc7b90ed 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -555,7 +555,7 @@ def _insert_palette_colors(channels, palette): class DayNightCompositor(GenericCompositor): """A compositor that blends a day data with night data.""" - def __init__(self, name, lim_low=85., lim_high=88., chose_day_night="day_and_night", **kwargs): + def __init__(self, name, lim_low=85., lim_high=88., day_night="day_only", **kwargs): """Collect custom configuration values. Args: @@ -563,124 +563,74 @@ def __init__(self, name, lim_low=85., lim_high=88., chose_day_night="day_and_nig blending of the given channels lim_high (float): upper limit of Sun zenith angle for the blending of the given channels - chose_day_night (string): "day_and_night" means both day and night parts will be kept - "only_day" means only day part will be kept - "only_night" means only night part will be kept + day_night (string): "day_night" means both day and night portions will be kept + "day_only" means only day portion will be kept + "night_only" means only night portion will be kept """ self.lim_low = lim_low self.lim_high = lim_high - self.chose_day_night = chose_day_night + self.day_night = day_night super(DayNightCompositor, self).__init__(name, **kwargs) def __call__(self, projectables, **kwargs): """Generate the composite.""" projectables = self.match_data_arrays(projectables) - data_1 = projectables[0] + foreground_data = projectables[0] + background_data = projectables[1] if self.day_night == "day_night" else foreground_data lim_low = np.cos(np.deg2rad(self.lim_low)) lim_high = np.cos(np.deg2rad(self.lim_high)) try: - coszen = np.cos(np.deg2rad(projectables[2])) + coszen = np.cos(np.deg2rad(projectables[2 if self.day_night == "day_night" else 1])) except IndexError: from pyorbital.astronomy import cos_zen LOG.debug("Computing sun zenith angles.") # Get chunking that matches the data try: - chunks = data_1.sel(bands=data_1['bands'][0]).chunks + chunks = foreground_data.sel(bands=foreground_data['bands'][0]).chunks except KeyError: - chunks = data_1.chunks - lons, lats = data_1.attrs["area"].get_lonlats(chunks=chunks) - coszen = xr.DataArray(cos_zen(data_1.attrs["start_time"], + chunks = foreground_data.chunks + lons, lats = foreground_data.attrs["area"].get_lonlats(chunks=chunks) + coszen = xr.DataArray(cos_zen(foreground_data.attrs["start_time"], lons, lats), dims=['y', 'x'], - coords=[data_1['y'], data_1['x']]) + coords=[foreground_data['y'], foreground_data['x']]) # Calculate blending weights coszen -= np.min((lim_high, lim_low)) coszen /= np.abs(lim_low - lim_high) coszen = coszen.clip(0, 1) - if self.chose_day_night == "day_and_night": - # This means both day and night part will be kept - data_2 = projectables[1] - day_data = data_1 - night_data = data_2 + # Apply enhancements to get images + foreground_data = enhance2dataset(foreground_data) + background_data = enhance2dataset(background_data) - # Apply enhancements to get images - day_data = enhance2dataset(day_data) - night_data = enhance2dataset(night_data) - - # Adjust bands so that they match - # L/RGB -> RGB/RGB - # LA/RGB -> RGBA/RGBA - # RGB/RGBA -> RGBA/RGBA - day_data = add_bands(day_data, night_data['bands']) - night_data = add_bands(night_data, day_data['bands']) - - # Replace missing channel data with zeros - day_data = zero_missing_data(day_data, night_data) - night_data = zero_missing_data(night_data, day_data) - - # Get merged metadata - attrs = combine_metadata(day_data, night_data) - - # Blend the two images together - data = (1 - coszen) * night_data + coszen * day_data - data.attrs = attrs - - # Split to separate bands so the mode is correct - data = [data.sel(bands=b) for b in data['bands']] - - elif self.chose_day_night == "only_day": - # This means only day part will be kept - day_data = data_1 - - # Apply enhancements to get images - day_data = enhance2dataset(day_data) - - # Add alpha band - # L -> LA - # RGB -> RGBA - day_data = add_bands(day_data, day_data['bands']) - - # Replace missing channel data with zeros - day_data = zero_missing_data(day_data, day_data) - - # Get merged metadata - attrs = combine_metadata(day_data, day_data) - - # Set night part to 0 and get the maskout image - data = (1 - coszen) * 0 + coszen * day_data - data.attrs = attrs - - # Split to separate bands so the mode is correct - data = [data.sel(bands=b) for b in data['bands']] - - elif self.chose_day_night == "only_night": - # This means only night part will be kept - night_data = data_1 - - # Apply enhancements to get images - night_data = enhance2dataset(night_data) + # Adjust bands so that they match + # L/RGB -> RGB/RGB + # LA/RGB -> RGBA/RGBA + # RGB/RGBA -> RGBA/RGBA + foreground_data = add_bands(foreground_data, background_data['bands']) + background_data = add_bands(background_data, foreground_data['bands']) - # Add alpha band - # L -> LA - # RGB -> RGBA - night_data = add_bands(night_data, night_data['bands']) + # Replace missing channel data with zeros + foreground_data = zero_missing_data(foreground_data, background_data) + background_data = zero_missing_data(background_data, foreground_data) - # Replace missing channel data with zeros - night_data = zero_missing_data(night_data, night_data) + # Get merged metadata + attrs = combine_metadata(foreground_data, background_data) - # Get merged metadata - attrs = combine_metadata(night_data, night_data) + # Blend the two images together + day_data = foreground_data if "day" in self.day_night else None + night_data = foreground_data if self.day_night == "night_only" else None + night_data = background_data if self.day_night == "day_night" else night_data - # Set night part to 0 and get the maskout image - data = (1 - coszen) * night_data + coszen * 0 - data.attrs = attrs + day_portion = coszen * (day_data if day_data is not None else 0) + night_portion = (1 - coszen) * (night_data if night_data is not None else 0) + data = night_portion + day_portion - # Split to separate bands so the mode is correct - data = [data.sel(bands=b) for b in data['bands']] + # Split to separate bands so the mode is correct + data = [data.sel(bands=b) for b in data['bands']] return super(DayNightCompositor, self).__call__(data, **kwargs) @@ -741,7 +691,7 @@ def add_bands(data, bands): data['bands'] = new_bands data.attrs['mode'] = mode # Add alpha band - if 'A' not in data['bands'].data and 'A' in bands.data: + if ('A' not in data['bands'].data and 'A' in bands.data) or ('A' not in data['bands'].data): new_data = [data.sel(bands=band) for band in data['bands'].data] # Create alpha band based on a copy of the first "real" band alpha = new_data[0].copy() @@ -754,20 +704,6 @@ def add_bands(data, bands): new_data = xr.concat(new_data, dim='bands') new_data.attrs['mode'] = data.attrs['mode'] + 'A' data = new_data - elif 'A' not in data['bands'].data: - new_data = [data.sel(bands=band) for band in data['bands'].data] - # Create alpha band based on a copy of the first "real" band - alpha = new_data[0].copy() - alpha.data = da.ones((data.sizes['y'], - data.sizes['x']), - chunks=new_data[0].chunks) - # Rename band to indicate it's alpha - alpha['bands'] = 'A' - new_data.append(alpha) - new_data = xr.concat(new_data, dim='bands') - new_data.attrs['mode'] = data.attrs['mode'] + 'A' - data = new_data - return data From b3b7b35d278e9a4793b96a62633f7b666bc308bf Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 3 Sep 2021 23:23:42 +0800 Subject: [PATCH 03/33] Update __init__.py --- satpy/composites/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 20dc7b90ed..bc9f9f56bc 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -628,6 +628,7 @@ def __call__(self, projectables, **kwargs): day_portion = coszen * (day_data if day_data is not None else 0) night_portion = (1 - coszen) * (night_data if night_data is not None else 0) data = night_portion + day_portion + data.attrs = attrs # Split to separate bands so the mode is correct data = [data.sel(bands=b) for b in data['bands']] From 2ceb218d7ed5c0048f5e3e0ff10c6dba4587fecd Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 9 Sep 2021 22:49:09 +0800 Subject: [PATCH 04/33] Update __init__.py --- satpy/composites/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index bc9f9f56bc..49ecab429f 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -45,13 +45,11 @@ class IncompatibleAreas(Exception): """Error raised upon compositing things of different shapes.""" - pass class IncompatibleTimes(Exception): """Error raised upon compositing things from different times.""" - pass def check_times(projectables): @@ -76,8 +74,8 @@ def check_times(projectables): # Is there a more gracious way to handle this ? if np.max(times) - np.min(times) > np.timedelta64(1, 's'): raise IncompatibleTimes - else: - mid_time = (np.max(times) - np.min(times)) / 2 + np.min(times) + + mid_time = (np.max(times) - np.min(times)) / 2 + np.min(times) return mid_time @@ -191,7 +189,7 @@ def check_geolocation(self, data_arrays): areas = [ds.attrs.get('area') for ds in data_arrays] if all(a is None for a in areas): return - elif any(a is None for a in areas): + if any(a is None for a in areas): raise ValueError("Missing 'area' attribute") if not all(areas[0] == x for x in areas[1:]): From 630baaf03df5c9cfdb8da8329dc82efc8704082c Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 10 Sep 2021 18:19:04 +0800 Subject: [PATCH 05/33] tests --- .../364e2cdb-08a4-4c1d-a217-1f12daa49251.nc | Bin 0 -> 23272 bytes .../4483f4b4-543a-4f34-89e2-b69688a35a20.nc | Bin 0 -> 23272 bytes satpy/tests/dask-worker-space/global.lock | 0 satpy/tests/dask-worker-space/purge.lock | 0 ...c.nc21fb662d-1220-11ec-aa6f-0a1f71143ab9.nc | Bin 0 -> 25395 bytes ...c.nc220b60bd-1220-11ec-ae94-0a1f71143ab9.nc | Bin 0 -> 25395 bytes ...c.nc3a19c5f9-121f-11ec-a56f-0a1f71143ab9.nc | Bin 0 -> 25395 bytes ...c.nc3a2b1f30-121f-11ec-97d1-0a1f71143ab9.nc | Bin 0 -> 25395 bytes ...c.nc222122aa-1220-11ec-91c0-0a1f71143ab9.nc | Bin 0 -> 189138 bytes ...c.nc3a4241e9-121f-11ec-9ac7-0a1f71143ab9.nc | Bin 0 -> 189138 bytes ...c.nc222cb381-1220-11ec-9719-0a1f71143ab9.nc | Bin 0 -> 12192 bytes ...c.nc3a4ee25e-121f-11ec-af87-0a1f71143ab9.nc | Bin 0 -> 12192 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 0 -> 18322 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 0 -> 20402 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 0 -> 20402 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 0 -> 18318 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 0 -> 18318 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 0 -> 40463 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 0 -> 40463 bytes 19 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 satpy/tests/364e2cdb-08a4-4c1d-a217-1f12daa49251.nc create mode 100644 satpy/tests/4483f4b4-543a-4f34-89e2-b69688a35a20.nc create mode 100644 satpy/tests/dask-worker-space/global.lock create mode 100644 satpy/tests/dask-worker-space/purge.lock create mode 100644 satpy/tests/test_file_vii_base_nc.nc21fb662d-1220-11ec-aa6f-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_base_nc.nc220b60bd-1220-11ec-ae94-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_base_nc.nc3a19c5f9-121f-11ec-a56f-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_base_nc.nc3a2b1f30-121f-11ec-97d1-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_l1b_nc.nc222122aa-1220-11ec-91c0-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_l1b_nc.nc3a4241e9-121f-11ec-9ac7-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_l2_nc.nc222cb381-1220-11ec-9719-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_l2_nc.nc3a4ee25e-121f-11ec-af87-0a1f71143ab9.nc create mode 100644 satpy/tests/testingcfwriter2021253100940-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter22021253100940-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter22021253101610-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter32021253100940-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter32021253101610-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter42021253100940-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter42021253101610-viirs-mband-20201007075915-20201007080744.nc diff --git a/satpy/tests/364e2cdb-08a4-4c1d-a217-1f12daa49251.nc b/satpy/tests/364e2cdb-08a4-4c1d-a217-1f12daa49251.nc new file mode 100644 index 0000000000000000000000000000000000000000..9a0745497330de2fd1c2c354c9dd6164b7c79fa0 GIT binary patch literal 23272 zcmeHPduSZT8K1p7$!B@3hofL8xcDr)!AXU*Ydg>>mu>E;Pkmpm-eV5Nqyp$`zGQ$ zx;uA8mbY7x7I`qrwYbjoye=XvD%sdbzu$<^uMqtz6QY(kgs@Yz9Tm2SiN1(i#fsS~yMAGgsvW7+roV1}Yl+gH zu&icC7ZJ;{>SzOr^Jp{at7+{T(g9LJtc;75-@;an)MT_yY4Xe}d0ITKGI9NCSs_|0 zrdxpbNm11JTGjMyPo}SLie@{v-<|92+rFdM>C0w%a@u4Uw8@6`g-8skuO5a%6P;c+ z94HKSbb3XvAR0jjZnv%{P;y4PRNu5_N4EQGsxNn_D&ih4SH+6j^>onEC7>C9thmoD zIl&-|HZoT9%f9575a*hX93q)ESWAScQT^=A+?|u%OhXQ}sejljC-9d~_->f(>`D~C z0Ke=7eq!HPnDB$Ja_T_7in(iX-SO5G-4{5 z6c-cq7iJofDa-kMjd*smYW;L0#;*3wxKC^Nii{|GHH#4^?mzxg#fa}LQGMxD*;FIS zA;gNYepVIphrHrg(Ww}7B!Ac~l|R#Dd;ht0M;HB`Otg!SFYf*7Omp&>%DFaYVwSPB zjz-<+Evng{JQQC+y^mU_Z%|s;pq0U+Y;0k>$P8ZeLMjX}uat zF+2K&e5v60`J$SYSE3TJVYC$NcLzcYqRwFq%-mVKM@<$Dn7*Nn$_&%9y{});g=tzR zA=Fcv4_OJ-`5CPSI=14}4{p9QyQ4>*m(LW`LX~te!7~EWl#lZuqsJO~O{&SqHECxY zubD$WPg5+PS+DP)NjZF+%W=-vT{=xZmuKEiFTZSBdG4=1EH2G*lk+)~8x0r@7!4Q= z7!4Q=7!4Q=7!4Q=7!4Q=7!CZtXn;Hu?4e=r_6FT}@@YiH$uFwiNyo{3i`Tb59z69g zYLW7$ywRerv_)Ug&XGr)+~qQ=;q+#AmV!~Y6ngLkQCx${lcNFw2=YO1ZEuBJ8Xonn z9c`Q2Qmw;o2Ydir0zLu$0f;-$c_0qhKqJr$tO8a8 z31B_20cZu1KnJiH*aD=1PM{m;0d@lYz;56{U@uSrhJg`a6bOMsz(c?|@Gvj|dKYkGvH0&=YUB@14aWz14aWz16QtrnSri?7RLF)16{w@L7-!n62-xz$eh6=o91^s z*!&lPF1nU_YWl22T^6BxmF5%Z`ud*N(v=6Vzpqy{w`&Qta*2f%i|Kvq@aeUB6IuNB z+y5*BTnJFnVu7m@po&29yRR)BnC$_THLD&_yKhr%`CmMs{vq?1XD2x$wG=_5jk&@> zrs@0h=a4eto{g$Up~@x~q+BKjjz{AKGKdsRiF3_X&7v*(seivJBm}MhnVMoZz4y%u zXMTsJK$PxMnczhVHG02ZE;b5$*O6iEkMvp%I=gz^yRDKy4=$8I+;+~X4;PCp8a44;eD!VWO2URCmw}|+Z)j0^Y zavYTNUvfYbawu_sS<4r+iMi#U{`2Eg)H1%+SdMjwCDq`|ER-kR(9Lfu~L=XmwwGLBQ}pt1+m0xfBw#IMy|=B23JR4$4y zJvP%@J|lrYAaj{guJA=vXE?KF6Yp*}kGkGV!W?+Q!-w zTCG7}V}$gwTlAb_et%GM@FCCgLd2y{_V3P+I9kRtMV#kffjIHzHi+A$R&Ly&T8FPB jlt<~Kk_TL8H1Pb;8Fsy);cy|%6l0A?G9UhX*>C;>e%@vI literal 0 HcmV?d00001 diff --git a/satpy/tests/4483f4b4-543a-4f34-89e2-b69688a35a20.nc b/satpy/tests/4483f4b4-543a-4f34-89e2-b69688a35a20.nc new file mode 100644 index 0000000000000000000000000000000000000000..9a0745497330de2fd1c2c354c9dd6164b7c79fa0 GIT binary patch literal 23272 zcmeHPduSZT8K1p7$!B@3hofL8xcDr)!AXU*Ydg>>mu>E;Pkmpm-eV5Nqyp$`zGQ$ zx;uA8mbY7x7I`qrwYbjoye=XvD%sdbzu$<^uMqtz6QY(kgs@Yz9Tm2SiN1(i#fsS~yMAGgsvW7+roV1}Yl+gH zu&icC7ZJ;{>SzOr^Jp{at7+{T(g9LJtc;75-@;an)MT_yY4Xe}d0ITKGI9NCSs_|0 zrdxpbNm11JTGjMyPo}SLie@{v-<|92+rFdM>C0w%a@u4Uw8@6`g-8skuO5a%6P;c+ z94HKSbb3XvAR0jjZnv%{P;y4PRNu5_N4EQGsxNn_D&ih4SH+6j^>onEC7>C9thmoD zIl&-|HZoT9%f9575a*hX93q)ESWAScQT^=A+?|u%OhXQ}sejljC-9d~_->f(>`D~C z0Ke=7eq!HPnDB$Ja_T_7in(iX-SO5G-4{5 z6c-cq7iJofDa-kMjd*smYW;L0#;*3wxKC^Nii{|GHH#4^?mzxg#fa}LQGMxD*;FIS zA;gNYepVIphrHrg(Ww}7B!Ac~l|R#Dd;ht0M;HB`Otg!SFYf*7Omp&>%DFaYVwSPB zjz-<+Evng{JQQC+y^mU_Z%|s;pq0U+Y;0k>$P8ZeLMjX}uat zF+2K&e5v60`J$SYSE3TJVYC$NcLzcYqRwFq%-mVKM@<$Dn7*Nn$_&%9y{});g=tzR zA=Fcv4_OJ-`5CPSI=14}4{p9QyQ4>*m(LW`LX~te!7~EWl#lZuqsJO~O{&SqHECxY zubD$WPg5+PS+DP)NjZF+%W=-vT{=xZmuKEiFTZSBdG4=1EH2G*lk+)~8x0r@7!4Q= z7!4Q=7!4Q=7!4Q=7!4Q=7!CZtXn;Hu?4e=r_6FT}@@YiH$uFwiNyo{3i`Tb59z69g zYLW7$ywRerv_)Ug&XGr)+~qQ=;q+#AmV!~Y6ngLkQCx${lcNFw2=YO1ZEuBJ8Xonn z9c`Q2Qmw;o2Ydir0zLu$0f;-$c_0qhKqJr$tO8a8 z31B_20cZu1KnJiH*aD=1PM{m;0d@lYz;56{U@uSrhJg`a6bOMsz(c?|@Gvj|dKYkGvH0&=YUB@14aWz14aWz16QtrnSri?7RLF)16{w@L7-!n62-xz$eh6=o91^s z*!&lPF1nU_YWl22T^6BxmF5%Z`ud*N(v=6Vzpqy{w`&Qta*2f%i|Kvq@aeUB6IuNB z+y5*BTnJFnVu7m@po&29yRR)BnC$_THLD&_yKhr%`CmMs{vq?1XD2x$wG=_5jk&@> zrs@0h=a4eto{g$Up~@x~q+BKjjz{AKGKdsRiF3_X&7v*(seivJBm}MhnVMoZz4y%u zXMTsJK$PxMnczhVHG02ZE;b5$*O6iEkMvp%I=gz^yRDKy4=$8I+;+~X4;PCp8a44;eD!VWO2URCmw}|+Z)j0^Y zavYTNUvfYbawu_sS<4r+iMi#U{`2Eg)H1%+SdMjwCDq`|ER-kR(9Lfu~L=XmwwGLBQ}pt1+m0xfBw#IMy|=B23JR4$4y zJvP%@J|lrYAaj{guJA=vXE?KF6Yp*}kGkGV!W?+Q!-w zTCG7}V}$gwTlAb_et%GM@FCCgLd2y{_V3P+I9kRtMV#kffjIHzHi+A$R&Ly&T8FPB jlt<~Kk_TL8H1Pb;8Fsy);cy|%6l0A?G9UhX*>C;>e%@vI literal 0 HcmV?d00001 diff --git a/satpy/tests/dask-worker-space/global.lock b/satpy/tests/dask-worker-space/global.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/satpy/tests/dask-worker-space/purge.lock b/satpy/tests/dask-worker-space/purge.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/satpy/tests/test_file_vii_base_nc.nc21fb662d-1220-11ec-aa6f-0a1f71143ab9.nc b/satpy/tests/test_file_vii_base_nc.nc21fb662d-1220-11ec-aa6f-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..a8357c13d03b1387971881ec2f15edcce1f61f02 GIT binary patch literal 25395 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 z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ T0R|XgfB^;=V1R+Qx`F=yHXD@g literal 0 HcmV?d00001 diff --git a/satpy/tests/test_file_vii_l1b_nc.nc3a4241e9-121f-11ec-9ac7-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l1b_nc.nc3a4241e9-121f-11ec-9ac7-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..c78066f6ea02ad6e15aa7ec928e9836aa3d6c853 GIT binary patch literal 189138 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 T0R|XgfB^;=V1R+Qx`F=yHXD@g literal 0 HcmV?d00001 diff --git a/satpy/tests/test_file_vii_l2_nc.nc222cb381-1220-11ec-9719-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l2_nc.nc222cb381-1220-11ec-9719-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..e851894b6eed90f851395dc4b3805aba22e33a25 GIT binary patch literal 12192 zcmeHL-D(p-6rSCrFEeAl?ae&d!{~#uloeML0u}vomwf%s1bBbC}Je$xOCK zJFcnWFvGGX%j$X2l8_yZn<1?@nVD82Z`47*EuhFQ4C%C*%6yklKR7Bu>CS>>+q1vO z+R*_99el9PaI8n8;ClCf2q+1|*cp7-lRcOldfWj&AOmrpPTPV%1deU^(W+xN7aLC1 zsd*MG<)tJdbV4{HFIsJ}YAv|SPNi8@#bluY;UcT78(b=G&1t?uIR0vdcl-C_oonAa z;NvWvu(95PFQ>%8y30<*v#pBleZw8OjeUR1u3cK$@ZtB2D@qJzQ58keSrEX2YvwvkVlO6&-40?@`O%}Pucbo@wiGV_S%Jlswr2ovk+tm5T)@zPuWU_kM<#K4c^_o7r z=;^h(*X~-f8?HTDapJlx$piyHDj&a>MF5ahaJ+lvxv`8}b;~TuPovlx-3Q0#QpX7)E{!#S(lvZJLpma#Rkp> z{ax665IzhKJeTQy16%DA78R=Qu22&^11!b`!4C)u!l>69Ww&N~PIJ2~`0>FUf))mV zWk&dM2JQB7b@QRx($42fGwc}m0M$cIhO7?<5l2AllO^*IwEbL%H1%X{>v_?bypGGo zlyjQ*L5WmgDS#jW2&T=fIc*jU)AA8qz?_5hC1pcfSaTB64GUMJBNd#*IdO!D)Cd-%?0HgZv95FF6g!AF0t1 zo>F)+NR7qEQWQYM`fEXYKhyh}N7$63S0b+m{AO?s5 rVqhN_c)z}$qAzhk8Xygj21o;>0nz|zfHXiFAPtZPNCTvS{nfw^rmfTk literal 0 HcmV?d00001 diff --git a/satpy/tests/test_file_vii_l2_nc.nc3a4ee25e-121f-11ec-af87-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l2_nc.nc3a4ee25e-121f-11ec-af87-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..e851894b6eed90f851395dc4b3805aba22e33a25 GIT binary patch literal 12192 zcmeHL-D(p-6rSCrFEeAl?ae&d!{~#uloeML0u}vomwf%s1bBbC}Je$xOCK zJFcnWFvGGX%j$X2l8_yZn<1?@nVD82Z`47*EuhFQ4C%C*%6yklKR7Bu>CS>>+q1vO z+R*_99el9PaI8n8;ClCf2q+1|*cp7-lRcOldfWj&AOmrpPTPV%1deU^(W+xN7aLC1 zsd*MG<)tJdbV4{HFIsJ}YAv|SPNi8@#bluY;UcT78(b=G&1t?uIR0vdcl-C_oonAa z;NvWvu(95PFQ>%8y30<*v#pBleZw8OjeUR1u3cK$@ZtB2D@qJzQ58keSrEX2YvwvkVlO6&-40?@`O%}Pucbo@wiGV_S%Jlswr2ovk+tm5T)@zPuWU_kM<#K4c^_o7r z=;^h(*X~-f8?HTDapJlx$piyHDj&a>MF5ahaJ+lvxv`8}b;~TuPovlx-3Q0#QpX7)E{!#S(lvZJLpma#Rkp> z{ax665IzhKJeTQy16%DA78R=Qu22&^11!b`!4C)u!l>69Ww&N~PIJ2~`0>FUf))mV zWk&dM2JQB7b@QRx($42fGwc}m0M$cIhO7?<5l2AllO^*IwEbL%H1%X{>v_?bypGGo zlyjQ*L5WmgDS#jW2&T=fIc*jU)AA8qz?_5hC1pcfSaTB64GUMJBNd#*IdO!D)Cd-%?0HgZv95FF6g!AF0t1 zo>F)+NR7qEQWQYM`fEXYKhyh}N7$63S0b+m{AO?s5 rVqhN_c)z}$qAzhk8Xygj21o;>0nz|zfHXiFAPtZPNCTvS{nfw^rmfTk literal 0 HcmV?d00001 diff --git a/satpy/tests/testingcfwriter2021253100940-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter2021253100940-viirs-mband-20201007075915-20201007080744.nc new file mode 100644 index 0000000000000000000000000000000000000000..702cbdff5ba95f1c75dd2c56f025774bfacc9844 GIT binary patch literal 18322 zcmeHOVQiB{7{2!Fw$gorF$MxIrdfuf+iE+vxlIRKx(nkce;_d?c+cJUwq02_Bm#3nthAXGeC;-0&@`f!5%-Q{y^~qXOed4iW}?<))|*awTl_77W`AdM z!0!$CyZoJ9t$treyT8-lray&VG^R_z!E|bxE09R1GD0{82ql93%>m!@dI;)jY`J8P zgo7`e=}E)15{6_4EMT8D%nX;&-O`jYtXO=syVcj>3p9<#N87pszCepFzyx&i_s&D_ z9F@p2hohD^XHJL10XayNYdWy3<`c!S;>pX(JfLXLpv-^llPF)c8~h-+7+YN@8feQ{ z@$67p?**&IYB>tL`$$;m+!{=$&3GckLCwtS7RvGNM4}u8y;06lxeet&@9?ky5t9$4 z`nGKkg@?Bdh9kql-T{u~ax|Nrp1jz2b}+d0CDPheQfoQdvl0yUVu6^?c6R;+8Q`d3 zw_cD{U)UUa9kkK-`Vvbi+`By_w1kHEWW_+_H0ywl@aRiSB;vD?Ady{|l-#<=SkY8G zYQ`g}=!79;KW59GG}F6{7?xKg8;Rxcg-T_-y^Y*dDq+d>1bCs-1Y;+fe`#C1Me?T& z+lV~^g8P9k5{zb17RkvU({7qz#{RaK(I$H=^|jzwo{L*WR!5Z6j5( z=CIAM(Bhb33(wWc-`qD^*zcEiZKCO;eCDm#uJf*{s*3e>&ib0VeT>!jxDE(v`TDhA zo;-GLIp4@N2VEwo#YaY?J$wwu`14UEg@8gpA)pXY2q*-W3<6|lRItx&`!r{Sa$EVH zO-x}o-G_-eQ($5;wmE!lRnCBH0ESL($&-;(DwkGv*9wWbAFA+F20Mjmjd`!}_TI`h zpgEmz`5fG~hBJUaSekAaz)W*$H-*b5jaqaGHnKg-N}BrcyZ)tvQam0Au$AY(4nMKs z3QZ1UpVpw3v77<91|^4!tVS&vwQkymB5JaO?|+ZhS}jDb^llczV62C=Rnea+h+b7`wd}_Aa$) zmw}gC;H){u%D^e*A=lr9pQf=D%nuEQLj9qkP&gQh2o2h~NN5m`TG5PQfT?Iz`G1;5Kyot3>h92yFo5UvJe zKYi3c$m{3Php-tP%0W>B?v?d= zwHRnmZGVcaU*ca z;FP=5mf+xk7$qL4Jkf};(UItB2YE=vbb2EaoeoxLFA|;P(9^P*PUpr%Cpi_eTlTn} z`+e=tT{wQ>%*2J`8~whvj%H5i5QL`%2eqf1`o%6nDyDlRIY*~{Z8Ez)$B87>sazqT z5Kssx1QY@a0fm4J1$s;UQt}IUXR!%jYogV8=&!s6&({%O?2@xHXbqk?RtX@oAXFM1jpqs*TKfb zL8OSt)H`G}Yo)x)Xd0Pxa!SNX6~~BD>=WhJ5w|-aFXGv8yKhIQjiiwpv&Pvve&rEC zQ~1ahZgESKT2qe5B?_)XG?TuO@oRng;H})9KY76qEYO_?<9hk15Q{4#VHYD77g12q zi}XSC)49vndgcxGJA|mI#f-(Jm@&#J@|7ziQgN^!#ne)L;MD0?3N^kfdibGfOmj>c wQ<*fT@}48#epkw4S}4HmlLb5`inJqiRIU(E2q**;0tx|zfI>hau(T2Q2m4LPssI20 literal 0 HcmV?d00001 diff --git a/satpy/tests/testingcfwriter22021253100940-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter22021253100940-viirs-mband-20201007075915-20201007080744.nc new file mode 100644 index 0000000000000000000000000000000000000000..96ebf62777cb3f7a155b333c71e6700e3b08f333 GIT binary patch literal 20402 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 NB481)2z+D^_%9zj_Cx>x literal 0 HcmV?d00001 diff --git a/satpy/tests/testingcfwriter22021253101610-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter22021253101610-viirs-mband-20201007075915-20201007080744.nc new file mode 100644 index 0000000000000000000000000000000000000000..2f88dd8ca2e41f575ed2d26f8552c0a981ef0c04 GIT binary patch literal 20402 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 literal 0 HcmV?d00001 diff --git a/satpy/tests/testingcfwriter32021253101610-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter32021253101610-viirs-mband-20201007075915-20201007080744.nc new file mode 100644 index 0000000000000000000000000000000000000000..1acce70904281d11beb6af7640966d94076edc38 GIT binary patch literal 18318 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 Date: Fri, 10 Sep 2021 19:38:23 +0800 Subject: [PATCH 06/33] Revert "tests" This reverts commit 630baaf03df5c9cfdb8da8329dc82efc8704082c. --- .../364e2cdb-08a4-4c1d-a217-1f12daa49251.nc | Bin 23272 -> 0 bytes .../4483f4b4-543a-4f34-89e2-b69688a35a20.nc | Bin 23272 -> 0 bytes satpy/tests/dask-worker-space/global.lock | 0 satpy/tests/dask-worker-space/purge.lock | 0 ...c.nc21fb662d-1220-11ec-aa6f-0a1f71143ab9.nc | Bin 25395 -> 0 bytes ...c.nc220b60bd-1220-11ec-ae94-0a1f71143ab9.nc | Bin 25395 -> 0 bytes ...c.nc3a19c5f9-121f-11ec-a56f-0a1f71143ab9.nc | Bin 25395 -> 0 bytes ...c.nc3a2b1f30-121f-11ec-97d1-0a1f71143ab9.nc | Bin 25395 -> 0 bytes ...c.nc222122aa-1220-11ec-91c0-0a1f71143ab9.nc | Bin 189138 -> 0 bytes ...c.nc3a4241e9-121f-11ec-9ac7-0a1f71143ab9.nc | Bin 189138 -> 0 bytes ...c.nc222cb381-1220-11ec-9719-0a1f71143ab9.nc | Bin 12192 -> 0 bytes ...c.nc3a4ee25e-121f-11ec-af87-0a1f71143ab9.nc | Bin 12192 -> 0 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 18322 -> 0 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 20402 -> 0 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 20402 -> 0 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 18318 -> 0 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 18318 -> 0 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 40463 -> 0 bytes ...iirs-mband-20201007075915-20201007080744.nc | Bin 40463 -> 0 bytes 19 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 satpy/tests/364e2cdb-08a4-4c1d-a217-1f12daa49251.nc delete mode 100644 satpy/tests/4483f4b4-543a-4f34-89e2-b69688a35a20.nc delete mode 100644 satpy/tests/dask-worker-space/global.lock delete mode 100644 satpy/tests/dask-worker-space/purge.lock delete mode 100644 satpy/tests/test_file_vii_base_nc.nc21fb662d-1220-11ec-aa6f-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_base_nc.nc220b60bd-1220-11ec-ae94-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_base_nc.nc3a19c5f9-121f-11ec-a56f-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_base_nc.nc3a2b1f30-121f-11ec-97d1-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_l1b_nc.nc222122aa-1220-11ec-91c0-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_l1b_nc.nc3a4241e9-121f-11ec-9ac7-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_l2_nc.nc222cb381-1220-11ec-9719-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_l2_nc.nc3a4ee25e-121f-11ec-af87-0a1f71143ab9.nc delete mode 100644 satpy/tests/testingcfwriter2021253100940-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter22021253100940-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter22021253101610-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter32021253100940-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter32021253101610-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter42021253100940-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter42021253101610-viirs-mband-20201007075915-20201007080744.nc diff --git a/satpy/tests/364e2cdb-08a4-4c1d-a217-1f12daa49251.nc b/satpy/tests/364e2cdb-08a4-4c1d-a217-1f12daa49251.nc deleted file mode 100644 index 9a0745497330de2fd1c2c354c9dd6164b7c79fa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23272 zcmeHPduSZT8K1p7$!B@3hofL8xcDr)!AXU*Ydg>>mu>E;Pkmpm-eV5Nqyp$`zGQ$ zx;uA8mbY7x7I`qrwYbjoye=XvD%sdbzu$<^uMqtz6QY(kgs@Yz9Tm2SiN1(i#fsS~yMAGgsvW7+roV1}Yl+gH zu&icC7ZJ;{>SzOr^Jp{at7+{T(g9LJtc;75-@;an)MT_yY4Xe}d0ITKGI9NCSs_|0 zrdxpbNm11JTGjMyPo}SLie@{v-<|92+rFdM>C0w%a@u4Uw8@6`g-8skuO5a%6P;c+ z94HKSbb3XvAR0jjZnv%{P;y4PRNu5_N4EQGsxNn_D&ih4SH+6j^>onEC7>C9thmoD zIl&-|HZoT9%f9575a*hX93q)ESWAScQT^=A+?|u%OhXQ}sejljC-9d~_->f(>`D~C z0Ke=7eq!HPnDB$Ja_T_7in(iX-SO5G-4{5 z6c-cq7iJofDa-kMjd*smYW;L0#;*3wxKC^Nii{|GHH#4^?mzxg#fa}LQGMxD*;FIS zA;gNYepVIphrHrg(Ww}7B!Ac~l|R#Dd;ht0M;HB`Otg!SFYf*7Omp&>%DFaYVwSPB zjz-<+Evng{JQQC+y^mU_Z%|s;pq0U+Y;0k>$P8ZeLMjX}uat zF+2K&e5v60`J$SYSE3TJVYC$NcLzcYqRwFq%-mVKM@<$Dn7*Nn$_&%9y{});g=tzR zA=Fcv4_OJ-`5CPSI=14}4{p9QyQ4>*m(LW`LX~te!7~EWl#lZuqsJO~O{&SqHECxY zubD$WPg5+PS+DP)NjZF+%W=-vT{=xZmuKEiFTZSBdG4=1EH2G*lk+)~8x0r@7!4Q= z7!4Q=7!4Q=7!4Q=7!4Q=7!CZtXn;Hu?4e=r_6FT}@@YiH$uFwiNyo{3i`Tb59z69g zYLW7$ywRerv_)Ug&XGr)+~qQ=;q+#AmV!~Y6ngLkQCx${lcNFw2=YO1ZEuBJ8Xonn z9c`Q2Qmw;o2Ydir0zLu$0f;-$c_0qhKqJr$tO8a8 z31B_20cZu1KnJiH*aD=1PM{m;0d@lYz;56{U@uSrhJg`a6bOMsz(c?|@Gvj|dKYkGvH0&=YUB@14aWz14aWz16QtrnSri?7RLF)16{w@L7-!n62-xz$eh6=o91^s z*!&lPF1nU_YWl22T^6BxmF5%Z`ud*N(v=6Vzpqy{w`&Qta*2f%i|Kvq@aeUB6IuNB z+y5*BTnJFnVu7m@po&29yRR)BnC$_THLD&_yKhr%`CmMs{vq?1XD2x$wG=_5jk&@> zrs@0h=a4eto{g$Up~@x~q+BKjjz{AKGKdsRiF3_X&7v*(seivJBm}MhnVMoZz4y%u zXMTsJK$PxMnczhVHG02ZE;b5$*O6iEkMvp%I=gz^yRDKy4=$8I+;+~X4;PCp8a44;eD!VWO2URCmw}|+Z)j0^Y zavYTNUvfYbawu_sS<4r+iMi#U{`2Eg)H1%+SdMjwCDq`|ER-kR(9Lfu~L=XmwwGLBQ}pt1+m0xfBw#IMy|=B23JR4$4y zJvP%@J|lrYAaj{guJA=vXE?KF6Yp*}kGkGV!W?+Q!-w zTCG7}V}$gwTlAb_et%GM@FCCgLd2y{_V3P+I9kRtMV#kffjIHzHi+A$R&Ly&T8FPB jlt<~Kk_TL8H1Pb;8Fsy);cy|%6l0A?G9UhX*>C;>e%@vI diff --git a/satpy/tests/4483f4b4-543a-4f34-89e2-b69688a35a20.nc b/satpy/tests/4483f4b4-543a-4f34-89e2-b69688a35a20.nc deleted file mode 100644 index 9a0745497330de2fd1c2c354c9dd6164b7c79fa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23272 zcmeHPduSZT8K1p7$!B@3hofL8xcDr)!AXU*Ydg>>mu>E;Pkmpm-eV5Nqyp$`zGQ$ zx;uA8mbY7x7I`qrwYbjoye=XvD%sdbzu$<^uMqtz6QY(kgs@Yz9Tm2SiN1(i#fsS~yMAGgsvW7+roV1}Yl+gH zu&icC7ZJ;{>SzOr^Jp{at7+{T(g9LJtc;75-@;an)MT_yY4Xe}d0ITKGI9NCSs_|0 zrdxpbNm11JTGjMyPo}SLie@{v-<|92+rFdM>C0w%a@u4Uw8@6`g-8skuO5a%6P;c+ z94HKSbb3XvAR0jjZnv%{P;y4PRNu5_N4EQGsxNn_D&ih4SH+6j^>onEC7>C9thmoD zIl&-|HZoT9%f9575a*hX93q)ESWAScQT^=A+?|u%OhXQ}sejljC-9d~_->f(>`D~C z0Ke=7eq!HPnDB$Ja_T_7in(iX-SO5G-4{5 z6c-cq7iJofDa-kMjd*smYW;L0#;*3wxKC^Nii{|GHH#4^?mzxg#fa}LQGMxD*;FIS zA;gNYepVIphrHrg(Ww}7B!Ac~l|R#Dd;ht0M;HB`Otg!SFYf*7Omp&>%DFaYVwSPB zjz-<+Evng{JQQC+y^mU_Z%|s;pq0U+Y;0k>$P8ZeLMjX}uat zF+2K&e5v60`J$SYSE3TJVYC$NcLzcYqRwFq%-mVKM@<$Dn7*Nn$_&%9y{});g=tzR zA=Fcv4_OJ-`5CPSI=14}4{p9QyQ4>*m(LW`LX~te!7~EWl#lZuqsJO~O{&SqHECxY zubD$WPg5+PS+DP)NjZF+%W=-vT{=xZmuKEiFTZSBdG4=1EH2G*lk+)~8x0r@7!4Q= z7!4Q=7!4Q=7!4Q=7!4Q=7!CZtXn;Hu?4e=r_6FT}@@YiH$uFwiNyo{3i`Tb59z69g zYLW7$ywRerv_)Ug&XGr)+~qQ=;q+#AmV!~Y6ngLkQCx${lcNFw2=YO1ZEuBJ8Xonn z9c`Q2Qmw;o2Ydir0zLu$0f;-$c_0qhKqJr$tO8a8 z31B_20cZu1KnJiH*aD=1PM{m;0d@lYz;56{U@uSrhJg`a6bOMsz(c?|@Gvj|dKYkGvH0&=YUB@14aWz14aWz16QtrnSri?7RLF)16{w@L7-!n62-xz$eh6=o91^s z*!&lPF1nU_YWl22T^6BxmF5%Z`ud*N(v=6Vzpqy{w`&Qta*2f%i|Kvq@aeUB6IuNB z+y5*BTnJFnVu7m@po&29yRR)BnC$_THLD&_yKhr%`CmMs{vq?1XD2x$wG=_5jk&@> zrs@0h=a4eto{g$Up~@x~q+BKjjz{AKGKdsRiF3_X&7v*(seivJBm}MhnVMoZz4y%u zXMTsJK$PxMnczhVHG02ZE;b5$*O6iEkMvp%I=gz^yRDKy4=$8I+;+~X4;PCp8a44;eD!VWO2URCmw}|+Z)j0^Y zavYTNUvfYbawu_sS<4r+iMi#U{`2Eg)H1%+SdMjwCDq`|ER-kR(9Lfu~L=XmwwGLBQ}pt1+m0xfBw#IMy|=B23JR4$4y zJvP%@J|lrYAaj{guJA=vXE?KF6Yp*}kGkGV!W?+Q!-w zTCG7}V}$gwTlAb_et%GM@FCCgLd2y{_V3P+I9kRtMV#kffjIHzHi+A$R&Ly&T8FPB jlt<~Kk_TL8H1Pb;8Fsy);cy|%6l0A?G9UhX*>C;>e%@vI diff --git a/satpy/tests/dask-worker-space/global.lock b/satpy/tests/dask-worker-space/global.lock deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/satpy/tests/dask-worker-space/purge.lock b/satpy/tests/dask-worker-space/purge.lock deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/satpy/tests/test_file_vii_base_nc.nc21fb662d-1220-11ec-aa6f-0a1f71143ab9.nc b/satpy/tests/test_file_vii_base_nc.nc21fb662d-1220-11ec-aa6f-0a1f71143ab9.nc deleted file mode 100644 index a8357c13d03b1387971881ec2f15edcce1f61f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25395 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 z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ T0R|XgfB^;=V1R+Qx`F=yHXD@g diff --git a/satpy/tests/test_file_vii_l1b_nc.nc3a4241e9-121f-11ec-9ac7-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l1b_nc.nc3a4241e9-121f-11ec-9ac7-0a1f71143ab9.nc deleted file mode 100644 index c78066f6ea02ad6e15aa7ec928e9836aa3d6c853..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189138 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 T0R|XgfB^;=V1R+Qx`F=yHXD@g diff --git a/satpy/tests/test_file_vii_l2_nc.nc222cb381-1220-11ec-9719-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l2_nc.nc222cb381-1220-11ec-9719-0a1f71143ab9.nc deleted file mode 100644 index e851894b6eed90f851395dc4b3805aba22e33a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12192 zcmeHL-D(p-6rSCrFEeAl?ae&d!{~#uloeML0u}vomwf%s1bBbC}Je$xOCK zJFcnWFvGGX%j$X2l8_yZn<1?@nVD82Z`47*EuhFQ4C%C*%6yklKR7Bu>CS>>+q1vO z+R*_99el9PaI8n8;ClCf2q+1|*cp7-lRcOldfWj&AOmrpPTPV%1deU^(W+xN7aLC1 zsd*MG<)tJdbV4{HFIsJ}YAv|SPNi8@#bluY;UcT78(b=G&1t?uIR0vdcl-C_oonAa z;NvWvu(95PFQ>%8y30<*v#pBleZw8OjeUR1u3cK$@ZtB2D@qJzQ58keSrEX2YvwvkVlO6&-40?@`O%}Pucbo@wiGV_S%Jlswr2ovk+tm5T)@zPuWU_kM<#K4c^_o7r z=;^h(*X~-f8?HTDapJlx$piyHDj&a>MF5ahaJ+lvxv`8}b;~TuPovlx-3Q0#QpX7)E{!#S(lvZJLpma#Rkp> z{ax665IzhKJeTQy16%DA78R=Qu22&^11!b`!4C)u!l>69Ww&N~PIJ2~`0>FUf))mV zWk&dM2JQB7b@QRx($42fGwc}m0M$cIhO7?<5l2AllO^*IwEbL%H1%X{>v_?bypGGo zlyjQ*L5WmgDS#jW2&T=fIc*jU)AA8qz?_5hC1pcfSaTB64GUMJBNd#*IdO!D)Cd-%?0HgZv95FF6g!AF0t1 zo>F)+NR7qEQWQYM`fEXYKhyh}N7$63S0b+m{AO?s5 rVqhN_c)z}$qAzhk8Xygj21o;>0nz|zfHXiFAPtZPNCTvS{nfw^rmfTk diff --git a/satpy/tests/test_file_vii_l2_nc.nc3a4ee25e-121f-11ec-af87-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l2_nc.nc3a4ee25e-121f-11ec-af87-0a1f71143ab9.nc deleted file mode 100644 index e851894b6eed90f851395dc4b3805aba22e33a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12192 zcmeHL-D(p-6rSCrFEeAl?ae&d!{~#uloeML0u}vomwf%s1bBbC}Je$xOCK zJFcnWFvGGX%j$X2l8_yZn<1?@nVD82Z`47*EuhFQ4C%C*%6yklKR7Bu>CS>>+q1vO z+R*_99el9PaI8n8;ClCf2q+1|*cp7-lRcOldfWj&AOmrpPTPV%1deU^(W+xN7aLC1 zsd*MG<)tJdbV4{HFIsJ}YAv|SPNi8@#bluY;UcT78(b=G&1t?uIR0vdcl-C_oonAa z;NvWvu(95PFQ>%8y30<*v#pBleZw8OjeUR1u3cK$@ZtB2D@qJzQ58keSrEX2YvwvkVlO6&-40?@`O%}Pucbo@wiGV_S%Jlswr2ovk+tm5T)@zPuWU_kM<#K4c^_o7r z=;^h(*X~-f8?HTDapJlx$piyHDj&a>MF5ahaJ+lvxv`8}b;~TuPovlx-3Q0#QpX7)E{!#S(lvZJLpma#Rkp> z{ax665IzhKJeTQy16%DA78R=Qu22&^11!b`!4C)u!l>69Ww&N~PIJ2~`0>FUf))mV zWk&dM2JQB7b@QRx($42fGwc}m0M$cIhO7?<5l2AllO^*IwEbL%H1%X{>v_?bypGGo zlyjQ*L5WmgDS#jW2&T=fIc*jU)AA8qz?_5hC1pcfSaTB64GUMJBNd#*IdO!D)Cd-%?0HgZv95FF6g!AF0t1 zo>F)+NR7qEQWQYM`fEXYKhyh}N7$63S0b+m{AO?s5 rVqhN_c)z}$qAzhk8Xygj21o;>0nz|zfHXiFAPtZPNCTvS{nfw^rmfTk diff --git a/satpy/tests/testingcfwriter2021253100940-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter2021253100940-viirs-mband-20201007075915-20201007080744.nc deleted file mode 100644 index 702cbdff5ba95f1c75dd2c56f025774bfacc9844..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18322 zcmeHOVQiB{7{2!Fw$gorF$MxIrdfuf+iE+vxlIRKx(nkce;_d?c+cJUwq02_Bm#3nthAXGeC;-0&@`f!5%-Q{y^~qXOed4iW}?<))|*awTl_77W`AdM z!0!$CyZoJ9t$treyT8-lray&VG^R_z!E|bxE09R1GD0{82ql93%>m!@dI;)jY`J8P zgo7`e=}E)15{6_4EMT8D%nX;&-O`jYtXO=syVcj>3p9<#N87pszCepFzyx&i_s&D_ z9F@p2hohD^XHJL10XayNYdWy3<`c!S;>pX(JfLXLpv-^llPF)c8~h-+7+YN@8feQ{ z@$67p?**&IYB>tL`$$;m+!{=$&3GckLCwtS7RvGNM4}u8y;06lxeet&@9?ky5t9$4 z`nGKkg@?Bdh9kql-T{u~ax|Nrp1jz2b}+d0CDPheQfoQdvl0yUVu6^?c6R;+8Q`d3 zw_cD{U)UUa9kkK-`Vvbi+`By_w1kHEWW_+_H0ywl@aRiSB;vD?Ady{|l-#<=SkY8G zYQ`g}=!79;KW59GG}F6{7?xKg8;Rxcg-T_-y^Y*dDq+d>1bCs-1Y;+fe`#C1Me?T& z+lV~^g8P9k5{zb17RkvU({7qz#{RaK(I$H=^|jzwo{L*WR!5Z6j5( z=CIAM(Bhb33(wWc-`qD^*zcEiZKCO;eCDm#uJf*{s*3e>&ib0VeT>!jxDE(v`TDhA zo;-GLIp4@N2VEwo#YaY?J$wwu`14UEg@8gpA)pXY2q*-W3<6|lRItx&`!r{Sa$EVH zO-x}o-G_-eQ($5;wmE!lRnCBH0ESL($&-;(DwkGv*9wWbAFA+F20Mjmjd`!}_TI`h zpgEmz`5fG~hBJUaSekAaz)W*$H-*b5jaqaGHnKg-N}BrcyZ)tvQam0Au$AY(4nMKs z3QZ1UpVpw3v77<91|^4!tVS&vwQkymB5JaO?|+ZhS}jDb^llczV62C=Rnea+h+b7`wd}_Aa$) zmw}gC;H){u%D^e*A=lr9pQf=D%nuEQLj9qkP&gQh2o2h~NN5m`TG5PQfT?Iz`G1;5Kyot3>h92yFo5UvJe zKYi3c$m{3Php-tP%0W>B?v?d= zwHRnmZGVcaU*ca z;FP=5mf+xk7$qL4Jkf};(UItB2YE=vbb2EaoeoxLFA|;P(9^P*PUpr%Cpi_eTlTn} z`+e=tT{wQ>%*2J`8~whvj%H5i5QL`%2eqf1`o%6nDyDlRIY*~{Z8Ez)$B87>sazqT z5Kssx1QY@a0fm4J1$s;UQt}IUXR!%jYogV8=&!s6&({%O?2@xHXbqk?RtX@oAXFM1jpqs*TKfb zL8OSt)H`G}Yo)x)Xd0Pxa!SNX6~~BD>=WhJ5w|-aFXGv8yKhIQjiiwpv&Pvve&rEC zQ~1ahZgESKT2qe5B?_)XG?TuO@oRng;H})9KY76qEYO_?<9hk15Q{4#VHYD77g12q zi}XSC)49vndgcxGJA|mI#f-(Jm@&#J@|7ziQgN^!#ne)L;MD0?3N^kfdibGfOmj>c wQ<*fT@}48#epkw4S}4HmlLb5`inJqiRIU(E2q**;0tx|zfI>hau(T2Q2m4LPssI20 diff --git a/satpy/tests/testingcfwriter22021253100940-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter22021253100940-viirs-mband-20201007075915-20201007080744.nc deleted file mode 100644 index 96ebf62777cb3f7a155b333c71e6700e3b08f333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20402 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 NB481)2z+D^_%9zj_Cx>x diff --git a/satpy/tests/testingcfwriter22021253101610-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter22021253101610-viirs-mband-20201007075915-20201007080744.nc deleted file mode 100644 index 2f88dd8ca2e41f575ed2d26f8552c0a981ef0c04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20402 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 diff --git a/satpy/tests/testingcfwriter32021253101610-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter32021253101610-viirs-mband-20201007075915-20201007080744.nc deleted file mode 100644 index 1acce70904281d11beb6af7640966d94076edc38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18318 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 Date: Fri, 10 Sep 2021 19:38:55 +0800 Subject: [PATCH 07/33] Revert "Merge branch 'main' into feature-daynightcompositor" This reverts commit 80ed09a0aeb1107ba723af1d432a614e291836f0, reversing changes made to 2ceb218d7ed5c0048f5e3e0ff10c6dba4587fecd. --- doc/source/enhancements.rst | 2 +- satpy/composites/__init__.py | 6 +- satpy/etc/readers/modis_l1b.yaml | 32 +- satpy/modifiers/_crefl.py | 8 +- satpy/readers/hdfeos_base.py | 33 +- satpy/readers/modis_l1b.py | 7 +- satpy/readers/modis_l2.py | 1 - .../ab011ed1-62c7-4693-b3e6-48898e2c303b.nc | Bin 0 -> 23662 bytes .../b71971c3-1792-490e-a4cb-3c5e6e8abf36.nc | Bin 0 -> 23272 bytes satpy/tests/modifier_tests/test_crefl.py | 128 +++---- satpy/tests/reader_tests/test_modis_l1b.py | 321 ------------------ satpy/tests/reader_tests/test_modis_l2.py | 25 -- satpy/tests/test_composites.py | 10 +- ....nc4dbaf523-1225-11ec-9dc0-0a1f71143ab9.nc | Bin 0 -> 25395 bytes ....nc4dcb3eba-1225-11ec-90b9-0a1f71143ab9.nc | Bin 0 -> 25395 bytes ....nce37252fa-1229-11ec-a839-0a1f71143ab9.nc | Bin 0 -> 25795 bytes ....nce3831063-1229-11ec-b972-0a1f71143ab9.nc | Bin 0 -> 25795 bytes ....nc4de127a8-1225-11ec-9bc4-0a1f71143ab9.nc | Bin 0 -> 189138 bytes ....nce39a0c29-1229-11ec-9912-0a1f71143ab9.nc | Bin 0 -> 189641 bytes ....nc4ded0774-1225-11ec-bf73-0a1f71143ab9.nc | Bin 0 -> 12192 bytes ....nce3a65fc0-1229-11ec-ba9a-0a1f71143ab9.nc | Bin 0 -> 12192 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 0 -> 34392 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 0 -> 20402 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 0 -> 21197 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 0 -> 18318 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 0 -> 18864 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 0 -> 40463 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 0 -> 40248 bytes satpy/tests/writer_tests/test_ninjotiff.py | 14 - satpy/writers/ninjotiff.py | 2 - 30 files changed, 66 insertions(+), 523 deletions(-) create mode 100644 satpy/tests/ab011ed1-62c7-4693-b3e6-48898e2c303b.nc create mode 100644 satpy/tests/b71971c3-1792-490e-a4cb-3c5e6e8abf36.nc delete mode 100644 satpy/tests/reader_tests/test_modis_l1b.py create mode 100644 satpy/tests/test_file_vii_base_nc.nc4dbaf523-1225-11ec-9dc0-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_base_nc.nc4dcb3eba-1225-11ec-90b9-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_base_nc.nce37252fa-1229-11ec-a839-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_base_nc.nce3831063-1229-11ec-b972-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_l1b_nc.nc4de127a8-1225-11ec-9bc4-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_l1b_nc.nce39a0c29-1229-11ec-9912-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_l2_nc.nc4ded0774-1225-11ec-bf73-0a1f71143ab9.nc create mode 100644 satpy/tests/test_file_vii_l2_nc.nce3a65fc0-1229-11ec-ba9a-0a1f71143ab9.nc create mode 100644 satpy/tests/testingcfwriter2021253112603-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter22021253105311-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter22021253112603-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter32021253105311-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter32021253112603-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter42021253105310-viirs-mband-20201007075915-20201007080744.nc create mode 100644 satpy/tests/testingcfwriter42021253112602-viirs-mband-20201007075915-20201007080744.nc diff --git a/doc/source/enhancements.rst b/doc/source/enhancements.rst index 142be49531..d8178e2d23 100644 --- a/doc/source/enhancements.rst +++ b/doc/source/enhancements.rst @@ -27,7 +27,7 @@ on both ends of the scale, but these can be overridden with method: !!python/name:satpy.enhancements.stretch kwargs: stretch: linear - cutoffs: [0.003, 0.005] + cutoffs: (0.003, 0.005) .. note:: diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 1a89ec7583..49ecab429f 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -46,10 +46,12 @@ class IncompatibleAreas(Exception): """Error raised upon compositing things of different shapes.""" + class IncompatibleTimes(Exception): """Error raised upon compositing things from different times.""" + def check_times(projectables): """Check that *projectables* have compatible times.""" times = [] @@ -72,6 +74,7 @@ def check_times(projectables): # Is there a more gracious way to handle this ? if np.max(times) - np.min(times) > np.timedelta64(1, 's'): raise IncompatibleTimes + mid_time = (np.max(times) - np.min(times)) / 2 + np.min(times) return mid_time @@ -154,8 +157,7 @@ def apply_modifier_info(self, origin, destination): def match_data_arrays(self, data_arrays): """Match data arrays so that they can be used together in a composite.""" self.check_geolocation(data_arrays) - new_arrays = self.drop_coordinates(data_arrays) - return list(xr.unify_chunks(*new_arrays)) + return self.drop_coordinates(data_arrays) def drop_coordinates(self, data_arrays): """Drop neglible non-dimensional coordinates.""" diff --git a/satpy/etc/readers/modis_l1b.yaml b/satpy/etc/readers/modis_l1b.yaml index 7bb694dd7c..10a5c25770 100644 --- a/satpy/etc/readers/modis_l1b.yaml +++ b/satpy/etc/readers/modis_l1b.yaml @@ -438,52 +438,28 @@ datasets: solar_zenith_angle: name: solar_zenith_angle sensor: modis - resolution: - 1000: - file_type: [hdf_eos_geo, hdf_eos_data_1000m] - 500: - file_type: [hdf_eos_geo] - 250: - file_type: [hdf_eos_geo] + resolution: [1000, 500, 250] coordinates: [longitude, latitude] file_type: [hdf_eos_geo, hdf_eos_data_1000m] solar_azimuth_angle: name: solar_azimuth_angle sensor: modis - resolution: - 1000: - file_type: [hdf_eos_geo, hdf_eos_data_1000m] - 500: - file_type: [hdf_eos_geo] - 250: - file_type: [hdf_eos_geo] + resolution: [1000, 500, 250] coordinates: [longitude, latitude] file_type: [hdf_eos_geo, hdf_eos_data_1000m] satellite_zenith_angle: name: satellite_zenith_angle sensor: modis - resolution: - 1000: - file_type: [hdf_eos_geo, hdf_eos_data_1000m] - 500: - file_type: [hdf_eos_geo] - 250: - file_type: [hdf_eos_geo] + resolution: [1000, 500, 250] coordinates: [longitude, latitude] file_type: [hdf_eos_geo, hdf_eos_data_1000m] satellite_azimuth_angle: name: satellite_azimuth_angle sensor: modis - resolution: - 1000: - file_type: [hdf_eos_geo, hdf_eos_data_1000m] - 500: - file_type: [hdf_eos_geo] - 250: - file_type: [hdf_eos_geo] + resolution: [1000, 500, 250] coordinates: [longitude, latitude] file_type: [hdf_eos_geo, hdf_eos_data_1000m] diff --git a/satpy/modifiers/_crefl.py b/satpy/modifiers/_crefl.py index ffbb187220..72f3a719ff 100644 --- a/satpy/modifiers/_crefl.py +++ b/satpy/modifiers/_crefl.py @@ -149,20 +149,20 @@ def _read_fill_value_from_hdf4(var, dtype): return np.iinfo(dtype).min def _get_data_and_angles(self, datasets, optional_datasets): - vis, angles = self._extract_angle_data_arrays(datasets, optional_datasets) + angles = self._extract_angle_data_arrays(datasets, optional_datasets) angles = [xr.DataArray(dask_arr, dims=('y', 'x')) for dask_arr in angles] - return [vis] + angles + return [datasets[0]] + angles def _extract_angle_data_arrays(self, datasets, optional_datasets): all_datasets = datasets + optional_datasets if len(all_datasets) == 1: vis = self.match_data_arrays(datasets)[0] - return vis, self.get_angles(vis) + return self.get_angles(vis) if len(all_datasets) == 5: vis, *angles = self.match_data_arrays( datasets + optional_datasets) # get the dask array underneath - return vis, [data_arr.data for data_arr in angles] + return [data_arr.data for data_arr in angles] raise ValueError("Not sure how to handle provided dependencies. " "Either all 4 angles must be provided or none of " "of them.") diff --git a/satpy/readers/hdfeos_base.py b/satpy/readers/hdfeos_base.py index 4020f88669..7dd93073fe 100644 --- a/satpy/readers/hdfeos_base.py +++ b/satpy/readers/hdfeos_base.py @@ -27,7 +27,7 @@ from pyhdf.error import HDF4Error from pyhdf.SD import SD -from satpy import CHUNK_SIZE, DataID +from satpy import CHUNK_SIZE from satpy.readers.file_handlers import BaseFileHandler logger = logging.getLogger(__name__) @@ -120,12 +120,6 @@ def read_mda(attribute): current_dict[key] = val return mda - @property - def metadata_platform_name(self): - """Platform name from the internal file metadata.""" - return self.metadata['INVENTORYMETADATA']['ASSOCIATEDPLATFORMINSTRUMENTSENSOR'][ - 'ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER']['ASSOCIATEDPLATFORMSHORTNAME']['VALUE'] - @property def start_time(self): """Get the start time of the dataset.""" @@ -171,33 +165,11 @@ def load_dataset(self, dataset_name): scale_factor = data.attrs.get('scale_factor') if scale_factor is not None: - data = data * np.float32(scale_factor) + data = data * scale_factor data = data.where(good_mask, new_fill) return data - def _add_satpy_metadata(self, data_id: DataID, data_arr: xr.DataArray): - """Add metadata that is specific to Satpy.""" - new_attrs = { - 'platform_name': 'EOS-' + self.metadata_platform_name, - 'sensor': 'modis', - } - - res = data_id["resolution"] - rps = self._resolution_to_rows_per_scan(res) - new_attrs["rows_per_scan"] = rps - - data_arr.attrs.update(new_attrs) - - def _resolution_to_rows_per_scan(self, resolution: int) -> int: - known_rps = { - 5000: 2, - 1000: 10, - 500: 20, - 250: 40, - } - return known_rps.get(resolution, 10) - class HDFEOSGeoReader(HDFEOSBaseFileReader): """Handler for the geographical datasets.""" @@ -321,6 +293,5 @@ def get_dataset(self, dataset_keys, dataset_info): for key in ('standard_name', 'units'): if key in dataset_info: data.attrs[key] = dataset_info[key] - self._add_satpy_metadata(dataset_keys, data) return data diff --git a/satpy/readers/modis_l1b.py b/satpy/readers/modis_l1b.py index 46b00b05b6..a4e888c612 100644 --- a/satpy/readers/modis_l1b.py +++ b/satpy/readers/modis_l1b.py @@ -81,6 +81,12 @@ def get_dataset(self, key, info): 'EV_500_RefSB'], 250: ['EV_250_RefSB']} + platform_name = self.metadata['INVENTORYMETADATA']['ASSOCIATEDPLATFORMINSTRUMENTSENSOR'][ + 'ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER']['ASSOCIATEDPLATFORMSHORTNAME']['VALUE'] + + info.update({'platform_name': 'EOS-' + platform_name}) + info.update({'sensor': 'modis'}) + if self.resolution != key['resolution']: return @@ -175,7 +181,6 @@ def get_dataset(self, key, info): # satscene[band].area = geometry.SwathDefinition( # lons=satscene[band].area.lons[indices, :], # lats=satscene[band].area.lats[indices, :]) - self._add_satpy_metadata(key, projectable) return projectable diff --git a/satpy/readers/modis_l2.py b/satpy/readers/modis_l2.py index 7dc336c501..cf8c1914ce 100644 --- a/satpy/readers/modis_l2.py +++ b/satpy/readers/modis_l2.py @@ -163,7 +163,6 @@ def get_dataset(self, dataset_id, dataset_info): else: dataset = self.load_dataset(dataset_name_in_file) - self._add_satpy_metadata(dataset_id, dataset) return dataset diff --git a/satpy/tests/ab011ed1-62c7-4693-b3e6-48898e2c303b.nc b/satpy/tests/ab011ed1-62c7-4693-b3e6-48898e2c303b.nc new file mode 100644 index 0000000000000000000000000000000000000000..934ceca5c951b6184b125d074a8aa45a5f16f403 GIT binary patch literal 23662 zcmeHPdu$xV8K1qg%_UqC1BRFglp}Q`i$vBr91VeloH;v9g0VwvAs$iJo7~#o$hUji zTZcqSg^3X02tia;Razkwg(wa56(K-r1tEd(P}{U11hNF8M3q_){K2C_{ilN8H#48_ z?3~kZJOa{;{kz$n$G0=z{BCCN`(}51ZReUfvlq-36cPzhCmQ7;e|)Zkze%O=Ip+`X z!3=Tl+Rlx!Iek`akt`5T=yEJ)dOSNOEGp6{oAH;JD&DVai3UCpB6$rRTOuhE_{%$y zW0!)_aEmL8T!c>&A%!81+)`v$6iQxAd6t+ZYZphHXfOy1vMN5P_8eeJZ7!6&UI=Ps zldKwf1=rpZY;!|r$hAw66Gl=BiI`gQVteCiv za^n^cN-LcrTzr|V7;g}qGd)hGshoxJp~1*?cl7n)eEJ}CuDhwLr*Bk zyf996g*c=lo%;A`!TV2|$PH_L;Tdez#gJXn9NN z^tj)lM2O1iqu~llwCZ^L=9YO726vWT)}#!N{x0_Ikf1$XD+#Cz>1S8$u1*3yg<{H5 zp;i)rfif@&>b{Z5;HvY~Ri={Qo)s$fB^8M?PX^=f>|atQ!M}CGJGpMJ5vreuSe8#KA@dZk=tty&aEn+hhWHlAFus+gifi=_5J7M1TodPZ1G_%f^ z`S?I6hQU^MON5!!-hnwf2=kurM6R0Zm&{Uyexf3^Z1b^--yZij(U>uD>t}4264|T! z6IO`X_~~PRkmJ6A+HHw>xVdN+<@Kz4T_5gIE=3Kx>7dpV>v%opIi@lm*A1t%7Y;x1 zpC9LXyJbEJK;W{Py@FRIrYfiNM5X5|d0nc{>1wo8dn(g4p(o3;eExQ@d}hA>UQU+h zbS}p+UsreUwDQcm>E+L-#vyPzw@0O7HKrRO6O0Co28;%b28;%b28;%b28;%b28;%b z28;&2=NcgE0$WsWX;q!sH&4aMrOGxu8^4Yd%9Y_n5!)xoUP8a}*2A=CM)WlLdAhar4brfqp!X6bN#@ak3VZSCo{ zACcI6>#`S=_%X65W$_P;0sDYsz`KCxfK>*da5m*qD4Pbdzy@FdC<0@^{lFezFR%|d z1RMsA0LOq=fLDPD;9cN7;3MF_fVcq~01`kFXat&oX5ca)1+)OIz)~O$WPodcl|UBg z1l9uGzy_cnxE0t03;=mx7#IPHKm=?Db^>F-F5n*EUf_OUH}C-PAg~Ac8Sr!97rew4(?Kr+jWi`mys$;*;Jb6;;?L2%$13Jv{pKwCHT_Ke-1iVB)9Flap+achFYMl9|i` z_B~BMubmz0UbjW+26t7uDeP%HgNs~qqY1k`ng#Fn$W1yo>7KaCt`B`DE_r}_j#V#_ zz{4x{+V%Cl4pWE)@yh z8uR5S&duhSn$PY~>OtkXYTk(x3pP_Lk`vgnB)?J-)V8r}P1nY*o?Mr$+^?5FAbC$| zn^(zI+pu&)t43cpL0QQhv#R;xtWzE?{%WxvjxWCCZ{NLMaqBq#f4zF=A04l%A6oQd z%fRTsaKLcDaKLcDaKLcDaKLcDaKLcDaKLcDaNt~VK$*#QS(bW+F0L#R{0o1&d2FWi z+RbL{=uTg!Y$Mr)DrUpk86F+LHhZ!V)n+(j%M8cVGq%Pgi*)>D&9y9v<4W5VZGo>m zXV*L1x@gP$u0Q`WE-hO}l*4|W_%2$uSVtVQtz#sCW(Y#A904_htW(T1+$=ZnnedZWiouXZHac#JBm=e+8-H#A-+#PVt E7m@*Nf&c&j literal 0 HcmV?d00001 diff --git a/satpy/tests/b71971c3-1792-490e-a4cb-3c5e6e8abf36.nc b/satpy/tests/b71971c3-1792-490e-a4cb-3c5e6e8abf36.nc new file mode 100644 index 0000000000000000000000000000000000000000..9a0745497330de2fd1c2c354c9dd6164b7c79fa0 GIT binary patch literal 23272 zcmeHPduSZT8K1p7$!B@3hofL8xcDr)!AXU*Ydg>>mu>E;Pkmpm-eV5Nqyp$`zGQ$ zx;uA8mbY7x7I`qrwYbjoye=XvD%sdbzu$<^uMqtz6QY(kgs@Yz9Tm2SiN1(i#fsS~yMAGgsvW7+roV1}Yl+gH zu&icC7ZJ;{>SzOr^Jp{at7+{T(g9LJtc;75-@;an)MT_yY4Xe}d0ITKGI9NCSs_|0 zrdxpbNm11JTGjMyPo}SLie@{v-<|92+rFdM>C0w%a@u4Uw8@6`g-8skuO5a%6P;c+ z94HKSbb3XvAR0jjZnv%{P;y4PRNu5_N4EQGsxNn_D&ih4SH+6j^>onEC7>C9thmoD zIl&-|HZoT9%f9575a*hX93q)ESWAScQT^=A+?|u%OhXQ}sejljC-9d~_->f(>`D~C z0Ke=7eq!HPnDB$Ja_T_7in(iX-SO5G-4{5 z6c-cq7iJofDa-kMjd*smYW;L0#;*3wxKC^Nii{|GHH#4^?mzxg#fa}LQGMxD*;FIS zA;gNYepVIphrHrg(Ww}7B!Ac~l|R#Dd;ht0M;HB`Otg!SFYf*7Omp&>%DFaYVwSPB zjz-<+Evng{JQQC+y^mU_Z%|s;pq0U+Y;0k>$P8ZeLMjX}uat zF+2K&e5v60`J$SYSE3TJVYC$NcLzcYqRwFq%-mVKM@<$Dn7*Nn$_&%9y{});g=tzR zA=Fcv4_OJ-`5CPSI=14}4{p9QyQ4>*m(LW`LX~te!7~EWl#lZuqsJO~O{&SqHECxY zubD$WPg5+PS+DP)NjZF+%W=-vT{=xZmuKEiFTZSBdG4=1EH2G*lk+)~8x0r@7!4Q= z7!4Q=7!4Q=7!4Q=7!4Q=7!CZtXn;Hu?4e=r_6FT}@@YiH$uFwiNyo{3i`Tb59z69g zYLW7$ywRerv_)Ug&XGr)+~qQ=;q+#AmV!~Y6ngLkQCx${lcNFw2=YO1ZEuBJ8Xonn z9c`Q2Qmw;o2Ydir0zLu$0f;-$c_0qhKqJr$tO8a8 z31B_20cZu1KnJiH*aD=1PM{m;0d@lYz;56{U@uSrhJg`a6bOMsz(c?|@Gvj|dKYkGvH0&=YUB@14aWz14aWz16QtrnSri?7RLF)16{w@L7-!n62-xz$eh6=o91^s z*!&lPF1nU_YWl22T^6BxmF5%Z`ud*N(v=6Vzpqy{w`&Qta*2f%i|Kvq@aeUB6IuNB z+y5*BTnJFnVu7m@po&29yRR)BnC$_THLD&_yKhr%`CmMs{vq?1XD2x$wG=_5jk&@> zrs@0h=a4eto{g$Up~@x~q+BKjjz{AKGKdsRiF3_X&7v*(seivJBm}MhnVMoZz4y%u zXMTsJK$PxMnczhVHG02ZE;b5$*O6iEkMvp%I=gz^yRDKy4=$8I+;+~X4;PCp8a44;eD!VWO2URCmw}|+Z)j0^Y zavYTNUvfYbawu_sS<4r+iMi#U{`2Eg)H1%+SdMjwCDq`|ER-kR(9Lfu~L=XmwwGLBQ}pt1+m0xfBw#IMy|=B23JR4$4y zJvP%@J|lrYAaj{guJA=vXE?KF6Yp*}kGkGV!W?+Q!-w zTCG7}V}$gwTlAb_et%GM@FCCgLd2y{_V3P+I9kRtMV#kffjIHzHi+A$R&Ly&T8FPB jlt<~Kk_TL8H1Pb;8Fsy);cy|%6l0A?G9UhX*>C;>e%@vI literal 0 HcmV?d00001 diff --git a/satpy/tests/modifier_tests/test_crefl.py b/satpy/tests/modifier_tests/test_crefl.py index 1781cea627..571d8c5a29 100644 --- a/satpy/tests/modifier_tests/test_crefl.py +++ b/satpy/tests/modifier_tests/test_crefl.py @@ -16,7 +16,6 @@ import unittest from unittest import mock from contextlib import contextmanager -from datetime import datetime import numpy as np import pytest @@ -121,20 +120,6 @@ def test_get_angles(self, get_satpos): self.assertEqual(args[6], 0) -def _make_viirs_xarray(data, area, name, standard_name, wavelength=None, units='degrees', calibration=None): - return xr.DataArray(data, dims=('y', 'x'), - attrs={ - 'start_orbit': 1708, 'end_orbit': 1708, 'wavelength': wavelength, - 'modifiers': None, 'calibration': calibration, - 'resolution': 371, 'name': name, - 'standard_name': standard_name, 'platform_name': 'Suomi-NPP', - 'polarization': None, 'sensor': 'viirs', 'units': units, - 'start_time': datetime(2012, 2, 25, 18, 1, 24, 570942), - 'end_time': datetime(2012, 2, 25, 18, 11, 21, 175760), 'area': area, - 'ancillary_variables': [] - }) - - class TestReflectanceCorrectorModifier: """Test the CREFL modifier.""" @@ -150,11 +135,11 @@ def data_area_ref_corrector(): cols, rows, (-5434894.954752679, -5434894.964451744, 5434894.964451744, 5434894.954752679)) - data = np.zeros((rows, cols)) + 25 - data[3, :] += 25 - data[4:, :] += 50 - data = da.from_array(data, chunks=100) - return area, data + dnb = np.zeros((rows, cols)) + 25 + dnb[3, :] += 25 + dnb[4:, :] += 50 + dnb = da.from_array(dnb, chunks=100) + return area, dnb def test_reflectance_corrector_abi(self): """Test ReflectanceCorrector modifier with ABI data.""" @@ -237,6 +222,7 @@ def test_reflectance_corrector_abi(self): ]) def test_reflectance_corrector_viirs(self, tmpdir, url, dem_mock_cm, dem_sds): """Test ReflectanceCorrector modifier with VIIRS data.""" + import datetime from satpy.modifiers._crefl import ReflectanceCorrector from satpy.tests.utils import make_dsq @@ -271,14 +257,28 @@ def test_reflectance_corrector_viirs(self, tmpdir, url, dem_mock_cm, dem_sds): make_dsq(name='solar_azimuth_angle'), make_dsq(name='solar_zenith_angle')] - area, data = self.data_area_ref_corrector() - c01 = _make_viirs_xarray(data, area, 'I01', 'toa_bidirectional_reflectance', - wavelength=(0.6, 0.64, 0.68), units='%', - calibration='reflectance') - c02 = _make_viirs_xarray(data, area, 'satellite_azimuth_angle', 'sensor_azimuth_angle') - c03 = _make_viirs_xarray(data, area, 'satellite_zenith_angle', 'sensor_zenith_angle') - c04 = _make_viirs_xarray(data, area, 'solar_azimuth_angle', 'solar_azimuth_angle') - c05 = _make_viirs_xarray(data, area, 'solar_zenith_angle', 'solar_zenith_angle') + area, dnb = self.data_area_ref_corrector() + + def make_xarray(name, standard_name, wavelength=None, units='degrees', calibration=None): + return xr.DataArray(dnb, dims=('y', 'x'), + attrs={ + 'start_orbit': 1708, 'end_orbit': 1708, 'wavelength': wavelength, 'level': None, + 'modifiers': None, 'calibration': calibration, + 'resolution': 371, 'name': name, + 'standard_name': standard_name, 'platform_name': 'Suomi-NPP', + 'polarization': None, 'sensor': 'viirs', 'units': units, + 'start_time': datetime.datetime(2012, 2, 25, 18, 1, 24, 570942), + 'end_time': datetime.datetime(2012, 2, 25, 18, 11, 21, 175760), 'area': area, + 'ancillary_variables': [] + }) + + c01 = make_xarray('I01', 'toa_bidirectional_reflectance', + wavelength=(0.6, 0.64, 0.68), units='%', + calibration='reflectance') + c02 = make_xarray('satellite_azimuth_angle', 'sensor_azimuth_angle') + c03 = make_xarray('satellite_zenith_angle', 'sensor_zenith_angle') + c04 = make_xarray('solar_azimuth_angle', 'solar_azimuth_angle') + c05 = make_xarray('solar_zenith_angle', 'solar_zenith_angle') with dem_mock_cm(tmpdir, url): res = ref_cor([c01], [c02, c03, c04, c05]) @@ -294,8 +294,8 @@ def test_reflectance_corrector_viirs(self, tmpdir, url, dem_mock_cm, dem_sds): assert res.attrs['platform_name'] == 'Suomi-NPP' assert res.attrs['sensor'] == 'viirs' assert res.attrs['units'] == '%' - assert res.attrs['start_time'] == datetime(2012, 2, 25, 18, 1, 24, 570942) - assert res.attrs['end_time'] == datetime(2012, 2, 25, 18, 11, 21, 175760) + assert res.attrs['start_time'] == datetime.datetime(2012, 2, 25, 18, 1, 24, 570942) + assert res.attrs['end_time'] == datetime.datetime(2012, 2, 25, 18, 11, 21, 175760) assert res.attrs['area'] == area assert res.attrs['ancillary_variables'] == [] data = res.values @@ -306,6 +306,7 @@ def test_reflectance_corrector_viirs(self, tmpdir, url, dem_mock_cm, dem_sds): def test_reflectance_corrector_modis(self): """Test ReflectanceCorrector modifier with MODIS data.""" + import datetime from satpy.modifiers._crefl import ReflectanceCorrector from satpy.tests.utils import make_dsq sataa_did = make_dsq(name='satellite_azimuth_angle') @@ -331,21 +332,22 @@ def test_reflectance_corrector_modis(self): area, dnb = self.data_area_ref_corrector() - def make_xarray(name, calibration, wavelength=None, modifiers=None, resolution=1000): + def make_xarray(name, calibration, wavelength=None, modifiers=None, resolution=1000, + file_type='hdf_eos_geo'): return xr.DataArray(dnb, dims=('y', 'x'), attrs={ 'wavelength': wavelength, 'level': None, 'modifiers': modifiers, - 'calibration': calibration, 'resolution': resolution, + 'calibration': calibration, 'resolution': resolution, 'file_type': file_type, 'name': name, 'coordinates': ['longitude', 'latitude'], 'platform_name': 'EOS-Aqua', 'polarization': None, 'sensor': 'modis', - 'units': '%', 'start_time': datetime(2012, 8, 13, 18, 46, 1, 439838), - 'end_time': datetime(2012, 8, 13, 18, 57, 47, 746296), 'area': area, + 'units': '%', 'start_time': datetime.datetime(2012, 8, 13, 18, 46, 1, 439838), + 'end_time': datetime.datetime(2012, 8, 13, 18, 57, 47, 746296), 'area': area, 'ancillary_variables': [] }) c01 = make_xarray('1', 'reflectance', wavelength=(0.62, 0.645, 0.67), modifiers='sunz_corrected', - resolution=500) + resolution=500, file_type='hdf_eos_data_500m') c02 = make_xarray('satellite_azimuth_angle', None) c03 = make_xarray('satellite_zenith_angle', None) c04 = make_xarray('solar_azimuth_angle', None) @@ -358,12 +360,13 @@ def make_xarray(name, calibration, wavelength=None, modifiers=None, resolution=1 assert res.attrs['modifiers'] == ('sunz_corrected', 'rayleigh_corrected_crefl',) assert res.attrs['calibration'] == 'reflectance' assert res.attrs['resolution'] == 500 + assert res.attrs['file_type'] == 'hdf_eos_data_500m' assert res.attrs['name'] == '1' assert res.attrs['platform_name'] == 'EOS-Aqua' assert res.attrs['sensor'] == 'modis' assert res.attrs['units'] == '%' - assert res.attrs['start_time'] == datetime(2012, 8, 13, 18, 46, 1, 439838) - assert res.attrs['end_time'] == datetime(2012, 8, 13, 18, 57, 47, 746296) + assert res.attrs['start_time'] == datetime.datetime(2012, 8, 13, 18, 46, 1, 439838) + assert res.attrs['end_time'] == datetime.datetime(2012, 8, 13, 18, 57, 47, 746296) assert res.attrs['area'] == area assert res.attrs['ancillary_variables'] == [] data = res.values @@ -380,54 +383,3 @@ def test_reflectance_corrector_bad_prereqs(self): pytest.raises(ValueError, ref_cor, [1], [2, 3, 4]) pytest.raises(ValueError, ref_cor, [1, 2, 3, 4], []) pytest.raises(ValueError, ref_cor, [], [1, 2, 3, 4]) - - @pytest.mark.parametrize( - 'url,dem_mock_cm,dem_sds', - [ - (None, mock_cmgdem, "average elevation"), - ("CMGDEM.hdf", mock_cmgdem, "averaged elevation"), - ("tbase.hdf", mock_tbase, "Elevation"), - ]) - def test_reflectance_corrector_different_chunks(self, tmpdir, url, dem_mock_cm, dem_sds): - """Test that the modifier works with different chunk sizes for inputs. - - The modifier uses dask's "map_blocks". If the input chunks aren't the - same an error is raised. - - """ - from satpy.modifiers._crefl import ReflectanceCorrector - from satpy.tests.utils import make_dsq - - ref_cor = ReflectanceCorrector( - optional_prerequisites=[ - make_dsq(name='satellite_azimuth_angle'), - make_dsq(name='satellite_zenith_angle'), - make_dsq(name='solar_azimuth_angle'), - make_dsq(name='solar_zenith_angle') - ], - name='I01', - prerequisites=[], - wavelength=(0.6, 0.64, 0.68), - resolution=371, - calibration='reflectance', - modifiers=('sunz_corrected_iband', 'rayleigh_corrected_crefl_iband'), - sensor='viirs', - url=url, - dem_sds=dem_sds, - ) - - area, data = self.data_area_ref_corrector() - c01 = _make_viirs_xarray(data, area, 'I01', 'toa_bidirectional_reflectance', - wavelength=(0.6, 0.64, 0.68), units='%', - calibration='reflectance') - c02 = _make_viirs_xarray(data, area, 'satellite_azimuth_angle', 'sensor_azimuth_angle') - c02.data = c02.data.rechunk((1, -1)) - c03 = _make_viirs_xarray(data, area, 'satellite_zenith_angle', 'sensor_zenith_angle') - c04 = _make_viirs_xarray(data, area, 'solar_azimuth_angle', 'solar_azimuth_angle') - c05 = _make_viirs_xarray(data, area, 'solar_zenith_angle', 'solar_zenith_angle') - - with dem_mock_cm(tmpdir, url): - res = ref_cor([c01], [c02, c03, c04, c05]) - - # make sure it can actually compute - res.compute() diff --git a/satpy/tests/reader_tests/test_modis_l1b.py b/satpy/tests/reader_tests/test_modis_l1b.py deleted file mode 100644 index 65bb5a5ea7..0000000000 --- a/satpy/tests/reader_tests/test_modis_l1b.py +++ /dev/null @@ -1,321 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (c) 2021 Satpy developers -# -# This file is part of satpy. -# -# satpy is free software: you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation, either version 3 of the License, or (at your option) any later -# version. -# -# satpy is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along with -# satpy. If not, see . -"""Unit tests for MODIS L1b HDF reader.""" - -import os -import unittest - -import numpy as np - -from pyhdf.SD import SD, SDC - -from satpy import available_readers, Scene - -# Mock MODIS HDF4 file -SCAN_WIDTH = 406 -SCAN_LEN = 270 -SCALE_FACTOR = 1 -TEST_LAT = np.repeat(np.linspace(35., 45., SCAN_WIDTH)[:, None], SCAN_LEN, 1) -TEST_LAT *= np.linspace(0.9, 1.1, SCAN_LEN) -TEST_LON = np.repeat(np.linspace(-45., -35., SCAN_LEN)[None, :], SCAN_WIDTH, 0) -TEST_LON *= np.linspace(0.9, 1.1, SCAN_WIDTH)[:, None] -TEST_SATZ = (np.repeat(abs(np.linspace(-65.2, 65.4, SCAN_LEN))[None, :], SCAN_WIDTH, 0) * 100).astype(np.int16) -TEST_DATA = { - 'Latitude': {'data': TEST_LAT.astype(np.float32), - 'type': SDC.FLOAT32, - 'fill_value': -999, - 'attrs': {'dim_labels': ['Cell_Along_Swath_5km:mod35', 'Cell_Across_Swath_5km:mod35']}}, - 'Longitude': {'data': TEST_LON.astype(np.float32), - 'type': SDC.FLOAT32, - 'fill_value': -999, - 'attrs': {'dim_labels': ['Cell_Along_Swath_5km:mod35', 'Cell_Across_Swath_5km:mod35']}}, - 'EV_1KM_RefSB': { - 'data': np.zeros((15, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint16), - 'type': SDC.UINT16, - 'fill_value': 0, - 'attrs': { - 'dim_labels': ['Band_1KM_RefSB:MODIS_SWATH_Type_L1B', - '10*nscans:MODIS_SWATH_Type_L1B', - 'Max_EV_frames:MODIS_SWATH_Type_L1B'], - 'valid_range': (0, 32767), - 'reflectance_scales': (1,) * 15, - 'reflectance_offsets': (0,) * 15, - 'band_names': '8,9,10,11,12,13lo,13hi,14lo,14hi,15,16,17,18,19,26', - }, - }, - 'EV_1KM_RefSB_Uncert_Indexes': { - 'data': np.zeros((15, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint8), - 'type': SDC.UINT8, - 'fill_value': 255, - 'attrs': { - 'dim_labels': ['Band_1KM_RefSB:MODIS_SWATH_Type_L1B', - '10*nscans:MODIS_SWATH_Type_L1B', - 'Max_EV_frames:MODIS_SWATH_Type_L1B'], - }, - }, - 'EV_500_Aggr1km_RefSB': { - 'data': np.zeros((5, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint16), - 'type': SDC.UINT16, - 'fill_value': 0, - 'attrs': { - 'dim_labels': ['Band_500M:MODIS_SWATH_Type_L1B', - '10*nscans:MODIS_SWATH_Type_L1B', - 'Max_EV_frames:MODIS_SWATH_Type_L1B'], - 'valid_range': (0, 32767), - 'reflectance_scales': (1,) * 5, - 'reflectance_offsets': (0,) * 5, - 'band_names': '3,4,5,6,7', - }, - }, - 'EV_500_Aggr1km_RefSB_Uncert_Indexes': { - 'data': np.zeros((5, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint8), - 'type': SDC.UINT8, - 'fill_value': 255, - 'attrs': { - 'dim_labels': ['Band_500M:MODIS_SWATH_Type_L1B', - '10*nscans:MODIS_SWATH_Type_L1B', - 'Max_EV_frames:MODIS_SWATH_Type_L1B'], - }, - }, - 'EV_250_Aggr1km_RefSB': { - 'data': np.zeros((2, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint16), - 'type': SDC.UINT16, - 'fill_value': 0, - 'attrs': { - 'dim_labels': ['Band_250M:MODIS_SWATH_Type_L1B', - '10*nscans:MODIS_SWATH_Type_L1B', - 'Max_EV_frames:MODIS_SWATH_Type_L1B'], - 'valid_range': (0, 32767), - 'reflectance_scales': (1,) * 2, - 'reflectance_offsets': (0,) * 2, - 'band_names': '1,2', - }, - }, - 'EV_250_Aggr1km_RefSB_Uncert_Indexes': { - 'data': np.zeros((2, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint8), - 'type': SDC.UINT8, - 'fill_value': 255, - 'attrs': { - 'dim_labels': ['Band_250M:MODIS_SWATH_Type_L1B', - '10*nscans:MODIS_SWATH_Type_L1B', - 'Max_EV_frames:MODIS_SWATH_Type_L1B'], - }, - }, - 'EV_1KM_Emmissive': { - 'data': np.zeros((16, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint16), - 'type': SDC.UINT16, - 'fill_value': 0, - 'attrs': { - 'dim_labels': ['Band_1KM_Emissive:MODIS_SWATH_Type_L1B', - '10*nscans:MODIS_SWATH_Type_L1B', - 'Max_EV_frames:MODIS_SWATH_Type_L1B'], - 'valid_range': (0, 32767), - 'band_names': '20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36', - }, - }, - 'EV_1KM_Emissive_Uncert_Indexes': { - 'data': np.zeros((16, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint8), - 'type': SDC.UINT8, - 'fill_value': 255, - 'attrs': { - 'dim_labels': ['Band_1KM_Emissive:MODIS_SWATH_Type_L1B', - '10*nscans:MODIS_SWATH_Type_L1B', - 'Max_EV_frames:MODIS_SWATH_Type_L1B'], - }, - }, - 'SensorZenith': {'data': TEST_SATZ, - 'type': SDC.INT16, - 'fill_value': -32767, - 'attrs': {'dim_labels': ['2*nscans:MODIS_SWATH_Type_L1B', '1KM_geo_dim:MODIS_SWATH_Type_L1B'], - 'scale_factor': 0.01}}, - 'SensorAzimuth': {'data': TEST_SATZ, - 'type': SDC.INT16, - 'fill_value': -32767, - 'attrs': {'dim_labels': ['2*nscans:MODIS_SWATH_Type_L1B', '1KM_geo_dim:MODIS_SWATH_Type_L1B'], - 'scale_factor': 0.01}}, -} - - -def generate_file_name(): - """Generate a file name that follows MODIS 35 L2 convention in a temporary directory.""" - import tempfile - from datetime import datetime - - file_name = 'MOD021km_A{0:%y%j_%H%M%S}_{0:%Y%j%H%M%S}.hdf'.format( - datetime.now() - ) - - base_dir = tempfile.mkdtemp() - file_name = os.path.join(base_dir, file_name) - return base_dir, file_name - - -def create_test_data(): - """Create a fake MODIS L1b HDF4 file with headers.""" - from datetime import datetime, timedelta - - base_dir, file_name = generate_file_name() - h = SD(file_name, SDC.WRITE | SDC.CREATE) - # Set hdf file attributes - beginning_date = datetime.now() - ending_date = beginning_date + timedelta(minutes=5) - core_metadata_header = "GROUP = INVENTORYMETADATA\nGROUPTYPE = MASTERGROUP\n\n" \ - "GROUP = RANGEDATETIME\n\nOBJECT = RANGEBEGINNINGDATE\nNUM_VAL = 1\nVALUE = \"{}\"\n" \ - "END_OBJECT = RANGEBEGINNINGDATE\n\nOBJECT = RANGEBEGINNINGTIME\n"\ - "NUM_VAL = 1\nVALUE = \"{}\"\n"\ - "END_OBJECT = RANGEBEGINNINGTIME\n\nOBJECT = RANGEENDINGDATE\nNUM_VAL = 1\nVALUE = \"{}\"\n"\ - "END_OBJECT = RANGEENDINGDATE\n\nOBJECT = RANGEENDINGTIME\nNUM_VAL = 1\nVALUE = \"{}\"\n" \ - "END_OBJECT = RANGEENDINGTIME\nEND_GROUP = RANGEDATETIME".format( - beginning_date.strftime("%Y-%m-%d"), - beginning_date.strftime("%H:%M:%S.%f"), - ending_date.strftime("%Y-%m-%d"), - ending_date.strftime("%H:%M:%S.%f") - ) - inst_metadata = "GROUP = ASSOCIATEDPLATFORMINSTRUMENTSENSOR\n\n"\ - "OBJECT = ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER\nCLASS = \"1\"\n\n" \ - "OBJECT = ASSOCIATEDSENSORSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ - "VALUE = \"MODIS\"\nEND_OBJECT = ASSOCIATEDSENSORSHORTNAME\n\n" \ - "OBJECT = ASSOCIATEDPLATFORMSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ - "VALUE = \"Terra\"\nEND_OBJECT = ASSOCIATEDPLATFORMSHORTNAME\n\n" \ - "OBJECT = ASSOCIATEDINSTRUMENTSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ - "VALUE = \"MODIS\"\nEND_OBJECT = ASSOCIATEDINSTRUMENTSHORTNAME\n\n" \ - "END_OBJECT = ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER\n\n" \ - "END_GROUP = ASSOCIATEDPLATFORMINSTRUMENTSENSOR\n\n" - collection_metadata = "GROUP = COLLECTIONDESCRIPTIONCLASS\n\nOBJECT = SHORTNAME\nNUM_VAL = 1\n"\ - "VALUE = \"MOD021KM\"\nEND_OBJECT = SHORTNAME\n\n"\ - "OBJECT = VERSIONID\nNUM_VAL = 1\nVALUE = 6\nEND_OBJECT = VERSIONID\n\n"\ - "END_GROUP = COLLECTIONDESCRIPTIONCLASS\n\n" - core_metadata_header += "\n\n" + inst_metadata + collection_metadata - struct_metadata_header = "GROUP=SwathStructure\n"\ - "GROUP=SWATH_1\n"\ - "GROUP=DimensionMap\n"\ - "OBJECT=DimensionMap_2\n"\ - "GeoDimension=\"2*nscans\"\n"\ - "END_OBJECT=DimensionMap_2\n"\ - "END_GROUP=DimensionMap\n"\ - "END_GROUP=SWATH_1\n"\ - "END_GROUP=SwathStructure\nEND" - archive_metadata_header = "GROUP = ARCHIVEDMETADATA\nEND_GROUP = ARCHIVEDMETADATA\nEND" - setattr(h, 'CoreMetadata.0', core_metadata_header) # noqa - setattr(h, 'StructMetadata.0', struct_metadata_header) # noqa - setattr(h, 'ArchiveMetadata.0', archive_metadata_header) # noqa - - # Fill datasets - for dataset in TEST_DATA: - v = h.create(dataset, TEST_DATA[dataset]['type'], TEST_DATA[dataset]['data'].shape) - v[:] = TEST_DATA[dataset]['data'] - dim_count = 0 - for dimension_name in TEST_DATA[dataset]['attrs']['dim_labels']: - v.dim(dim_count).setname(dimension_name) - dim_count += 1 - v.setfillvalue(TEST_DATA[dataset]['fill_value']) - v.scale_factor = TEST_DATA[dataset]['attrs'].get('scale_factor', SCALE_FACTOR) - for attr_key, attr_val in TEST_DATA[dataset]['attrs'].items(): - if attr_key == 'dim_labels': - continue - setattr(v, attr_key, attr_val) - h.end() - return base_dir, file_name - - -class TestModisL1b(unittest.TestCase): - """Test MODIS L1b reader.""" - - def setUp(self): - """Create fake HDF4 MODIS file.""" - self.base_dir, self.file_name = create_test_data() - - def tearDown(self): - """Remove the temporary directory created for the test.""" - try: - import shutil - shutil.rmtree(self.base_dir, ignore_errors=True) - except OSError: - pass - - @staticmethod - def _check_shared_metadata(data_arr): - assert data_arr.attrs["sensor"] == "modis" - assert data_arr.attrs["platform_name"] == "EOS-Terra" - assert "rows_per_scan" in data_arr.attrs - assert isinstance(data_arr.attrs["rows_per_scan"], int) - assert data_arr.attrs['reader'] == 'modis_l1b' - - def test_available_reader(self): - """Test that MODIS L1b reader is available.""" - self.assertIn('modis_l1b', available_readers()) - - def test_scene_available_datasets(self): - """Test that datasets are available.""" - scene = Scene(reader='modis_l1b', filenames=[self.file_name]) - available_datasets = scene.all_dataset_names() - assert len(available_datasets) > 0 - self.assertIn('longitude', available_datasets) - self.assertIn('latitude', available_datasets) - for chan_num in list(range(1, 13)) + ['13lo', '13hi', '14lo', '14hi'] + list(range(15, 37)): - self.assertIn(str(chan_num), available_datasets) - - def test_load_longitude_latitude(self): - """Test that longitude and latitude datasets are loaded correctly.""" - from satpy.tests.utils import make_dataid - - def test_func(dname, x, y): - if dname == 'longitude': - # assert less - np.testing.assert_array_less(x, y) - else: - # assert greater - # np.testing.assert_equal(x > y, True) - np.testing.assert_array_less(y, x) - - scene = Scene(reader='modis_l1b', filenames=[self.file_name]) - for dataset_name in ['longitude', 'latitude']: - # Default resolution should be the interpolated 1km - scene.load([dataset_name]) - longitude_1km_id = make_dataid(name=dataset_name, resolution=1000) - longitude_1km = scene[longitude_1km_id] - self.assertEqual(longitude_1km.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) - test_func(dataset_name, longitude_1km.values, 0) - self._check_shared_metadata(longitude_1km) - - # Specify original 5km scale - scene.load([dataset_name], resolution=5000) - longitude_5km_id = make_dataid(name=dataset_name, resolution=5000) - longitude_5km = scene[longitude_5km_id] - self.assertEqual(longitude_5km.shape, TEST_DATA[dataset_name.capitalize()]['data'].shape) - test_func(dataset_name, longitude_5km.values, 0) - self._check_shared_metadata(longitude_5km) - - def test_load_sat_zenith_angle(self): - """Test loading satellite zenith angle band.""" - scene = Scene(reader='modis_l1b', filenames=[self.file_name]) - dataset_name = 'satellite_zenith_angle' - scene.load([dataset_name]) - dataset = scene[dataset_name] - self.assertEqual(dataset.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) - assert dataset.attrs['resolution'] == 1000 - self._check_shared_metadata(dataset) - - def test_load_vis(self): - """Test loading visible band.""" - scene = Scene(reader='modis_l1b', filenames=[self.file_name]) - dataset_name = '1' - scene.load([dataset_name]) - dataset = scene[dataset_name] - self.assertEqual(dataset.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) - self._check_shared_metadata(dataset) diff --git a/satpy/tests/reader_tests/test_modis_l2.py b/satpy/tests/reader_tests/test_modis_l2.py index 876ddaf8d5..d3064f7f92 100644 --- a/satpy/tests/reader_tests/test_modis_l2.py +++ b/satpy/tests/reader_tests/test_modis_l2.py @@ -103,17 +103,6 @@ def create_test_data(): ending_date.strftime("%Y-%m-%d"), ending_date.strftime("%H:%M:%S.%f") ) - inst_metadata = "GROUP = ASSOCIATEDPLATFORMINSTRUMENTSENSOR\n\n"\ - "OBJECT = ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER\nCLASS = \"1\"\n\n" \ - "OBJECT = ASSOCIATEDSENSORSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ - "VALUE = \"MODIS\"\nEND_OBJECT = ASSOCIATEDSENSORSHORTNAME\n\n" \ - "OBJECT = ASSOCIATEDPLATFORMSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ - "VALUE = \"Terra\"\nEND_OBJECT = ASSOCIATEDPLATFORMSHORTNAME\n\n" \ - "OBJECT = ASSOCIATEDINSTRUMENTSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ - "VALUE = \"MODIS\"\nEND_OBJECT = ASSOCIATEDINSTRUMENTSHORTNAME\n\n" \ - "END_OBJECT = ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER\n\n" \ - "END_GROUP = ASSOCIATEDPLATFORMINSTRUMENTSENSOR\n\n" - core_metadata_header += "\n\n" + inst_metadata struct_metadata_header = "GROUP=SwathStructure\n"\ "GROUP=SWATH_1\n"\ "GROUP=DimensionMap\n"\ @@ -157,14 +146,6 @@ def tearDown(self): except OSError: pass - @staticmethod - def _check_shared_metadata(data_arr): - assert data_arr.attrs["sensor"] == "modis" - assert data_arr.attrs["platform_name"] == "EOS-Terra" - assert "rows_per_scan" in data_arr.attrs - assert isinstance(data_arr.attrs["rows_per_scan"], int) - assert data_arr.attrs['reader'] == 'modis_l2' - def test_available_reader(self): """Test that MODIS L2 reader is available.""" self.assertIn('modis_l2', available_readers()) @@ -199,15 +180,12 @@ def test_func(dname, x, y): longitude_1km = scene[longitude_1km_id] self.assertEqual(longitude_1km.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) test_func(dataset_name, longitude_1km.values, 0) - self._check_shared_metadata(longitude_1km) - # Specify original 5km scale scene.load([dataset_name], resolution=5000) longitude_5km_id = make_dataid(name=dataset_name, resolution=5000) longitude_5km = scene[longitude_5km_id] self.assertEqual(longitude_5km.shape, TEST_DATA[dataset_name.capitalize()]['data'].shape) test_func(dataset_name, longitude_5km.values, 0) - self._check_shared_metadata(longitude_5km) def test_load_quality_assurance(self): """Test loading quality assurance.""" @@ -219,7 +197,6 @@ def test_load_quality_assurance(self): self.assertIn(quality_assurance_id, scene) quality_assurance = scene[quality_assurance_id] self.assertEqual(quality_assurance.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) - self._check_shared_metadata(quality_assurance) def test_load_1000m_cloud_mask_dataset(self): """Test loading 1000m cloud mask.""" @@ -231,7 +208,6 @@ def test_load_1000m_cloud_mask_dataset(self): self.assertIn(cloud_mask_id, scene) cloud_mask = scene[cloud_mask_id] self.assertEqual(cloud_mask.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) - self._check_shared_metadata(cloud_mask) def test_load_250m_cloud_mask_dataset(self): """Test loading 250m cloud mask.""" @@ -243,4 +219,3 @@ def test_load_250m_cloud_mask_dataset(self): self.assertIn(cloud_mask_id, scene) cloud_mask = scene[cloud_mask_id] self.assertEqual(cloud_mask.shape, (4*5*SCAN_WIDTH, 4*(5*SCAN_LEN+4))) - self._check_shared_metadata(cloud_mask) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 67a0a8426b..67e8071fac 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -51,7 +51,7 @@ def test_single_ds(self): ds1 = self._get_test_ds() comp = CompositeBase('test_comp') ret_datasets = comp.match_data_arrays((ds1,)) - assert ret_datasets[0].identical(ds1) + self.assertIs(ret_datasets[0], ds1) def test_mult_ds_area(self): """Test multiple datasets successfully pass.""" @@ -60,8 +60,8 @@ def test_mult_ds_area(self): ds2 = self._get_test_ds() comp = CompositeBase('test_comp') ret_datasets = comp.match_data_arrays((ds1, ds2)) - assert ret_datasets[0].identical(ds1) - assert ret_datasets[1].identical(ds2) + self.assertIs(ret_datasets[0], ds1) + self.assertIs(ret_datasets[1], ds2) def test_mult_ds_no_area(self): """Test that all datasets must have an area attribute.""" @@ -96,8 +96,8 @@ def test_mult_ds_diff_dims(self): ds2 = self._get_test_ds(shape=(3, 100, 50), dims=('bands', 'x', 'y')) comp = CompositeBase('test_comp') ret_datasets = comp.match_data_arrays((ds1, ds2)) - assert ret_datasets[0].identical(ds1) - assert ret_datasets[1].identical(ds2) + self.assertIs(ret_datasets[0], ds1) + self.assertIs(ret_datasets[1], ds2) def test_mult_ds_diff_size(self): """Test that datasets with different sizes fail.""" diff --git a/satpy/tests/test_file_vii_base_nc.nc4dbaf523-1225-11ec-9dc0-0a1f71143ab9.nc b/satpy/tests/test_file_vii_base_nc.nc4dbaf523-1225-11ec-9dc0-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..a8357c13d03b1387971881ec2f15edcce1f61f02 GIT binary patch literal 25395 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 JD%HJb*1uSO+W!Cm literal 0 HcmV?d00001 diff --git a/satpy/tests/test_file_vii_base_nc.nce3831063-1229-11ec-b972-0a1f71143ab9.nc b/satpy/tests/test_file_vii_base_nc.nce3831063-1229-11ec-b972-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..4196aad0e37ef02962bdb632d419394b7b36653a GIT binary patch literal 25795 zcmeHQZERCj7(Tb{N;kR>Hedq*3q}HhwZ)E&$ihZfVD5`-;71~KrM=rO>DqdGi=YsY zC}JdvB!2zSkeJ{P6EP+jqCbsh;g_2D#{~7C2nmv)F_8$K_nhOiOtGzUFb!Pl#9q9&K)UBtEm_9qEa1Dzn6rWvSI4|}J=D-xBlGZoSv{3C zQX|o<6*H}wF1q(5Xv=|0EjPDrE+7@ zjImo!W-q9XxdmXF3t_GVm!y%>v%M9famLmvJ7sf9JJe9rRcssKFSd49AB3&uyIK#s zXBm1llQvRTHX4gtC*5+#+{zU@dxLAzn&nZhb7ia8X{VKWE?cR}6d-soDwFBdh+*Xt zI(t}p$V2>nyUZ<@MtytYHJ<+Prf#5<#{bQ^j!t?iQ9!1f(J2%Rw)mTyo4qZJ0l{a= zb~3TJ9yepdmfRfBv6g?Z%a)$CqFLJsDm(4UMk;HWIpD}mD(9X4+)>r@UyI+s>}uNZ(*re_wPk+|d(Z-XSQ{ScRz7*U=l{PNG&j zw^(b-sFC&Y|1n=mx5AwpdPOt0Kc3`!5@%5r(>u&`u8FFYlAJ%OBxjV5$hq z<9q({U(wPCBX`kG24N?Au|pz!QJVjAdAa8}EXU6A@sr<`Mi{w^c5(>s^xrE8Po2Z^ z3e;q7jYx#IYuYkEMU%s+J^muX$Ysnc#C;{kWiJeXFfO|U%$N4M#7K=fIZ}VJQXYc= zX>67|CmyLcgR917^U<)$9u33kw3#qcF@ALtE!{9Gs_P0~jnT@sm_3r$^6|c@V4Uyi z8r;IzJnjb9fkys;%R64Buobj0BAita!Meh{MEdH5>hl}J{XI~E_q1Y}XVr}Z!`mio zwRpX3DesRrQ4-nwdc0}D`ygxw*QH z9q(x=r`Ixz>ktEx4UvIJUpNw#I>cNq34jg(&tI~-(%4naQU>)3TX0rR_=~($9auM! zdV)#?T6~^??Nt7@&0DH>M^%OL>>c*@^k=>^&^xJIJ@ts}wUGQ_QM!2_2RUA2HC)~R zu|B-nOlNeHKTZN+3LYpdv3(iarJL{^pl#Jk{%C-!`fVY9i$An-G%?)V7W4-L{?#io zf3z`nU>$u31L6R2fH*)LAPx`*hy%m{;s9}gI6xdA4%}G|6iOa7A{>^n;}A2+la~j$ zKyYQ1&;vy9WX!TmSt#@X2-`r30g8HFO1?4O!8j;KEfpbT`Mt-$NyjvW<3Pv@gtuT| z<*f_Hfgl(_8N+iR_$Bw@++&5u4#hZIt{RtG&fO`-VR#T)3>`);eZw^)NSI&P{rr>A zTQ{hJ1>w#vP!qeAms>>6=A*f1Je!Lp4Qo%Wirv|F`RBLt8rZ=&G{xAUG>nJO+Q}^< zyEGR@CCy9Z%$UW+u4sB#1dvA)`iL1z=!pYSSqX!yFUsvhcF-x5C@0@!~x;}aez2L93T!52Z#g20ph@&<$zSN_}fweWO&f^NWFB3k9h(mp35UV&V|UIU2il zvKT~y70P1pE?4c5&^v{DfwGu5ioD!gma-V%agh*f%31H=L10C9jgaA!Fngrxj*jW|IK3KPY)>bmI~-&Zecy@J2^3xiaa!peNO zOG9ChO2$kla&hY!J^>IU_X_yV&tlkA=nFA4(Tu6{Ngb`xZQz)%fb;d-SYgb_!W59! zc3Gj}u@xUl&8&DjJdE){JGqIjeo$dL_rO$QzExA44o`}4N8fB6vQ-SsatXWR=FE2xpBsoQegr38>qY{cfmJFROi?W|MVT4?j!x~U2vquWV}U3dij+_ zYec+?`ZEQHQ6;>PV_5oF7N_jRzY>9xN*#C<{sn?vJ7ndxubEeGN}lm@dey3!JlIPF JD%HJb*1uSO+W!Cm literal 0 HcmV?d00001 diff --git a/satpy/tests/test_file_vii_l1b_nc.nc4de127a8-1225-11ec-9bc4-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l1b_nc.nc4de127a8-1225-11ec-9bc4-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..c78066f6ea02ad6e15aa7ec928e9836aa3d6c853 GIT binary patch literal 189138 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 T0R|XgfB^;=V1R+Qx`F=yHXD@g literal 0 HcmV?d00001 diff --git a/satpy/tests/test_file_vii_l1b_nc.nce39a0c29-1229-11ec-9912-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l1b_nc.nce39a0c29-1229-11ec-9912-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..fbb39f2014c6daaa802755c7111671bd1da9fde0 GIT binary patch literal 189641 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 F;J+fTRv-WX literal 0 HcmV?d00001 diff --git a/satpy/tests/test_file_vii_l2_nc.nc4ded0774-1225-11ec-bf73-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l2_nc.nc4ded0774-1225-11ec-bf73-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..e851894b6eed90f851395dc4b3805aba22e33a25 GIT binary patch literal 12192 zcmeHL-D(p-6rSCrFEeAl?ae&d!{~#uloeML0u}vomwf%s1bBbC}Je$xOCK zJFcnWFvGGX%j$X2l8_yZn<1?@nVD82Z`47*EuhFQ4C%C*%6yklKR7Bu>CS>>+q1vO z+R*_99el9PaI8n8;ClCf2q+1|*cp7-lRcOldfWj&AOmrpPTPV%1deU^(W+xN7aLC1 zsd*MG<)tJdbV4{HFIsJ}YAv|SPNi8@#bluY;UcT78(b=G&1t?uIR0vdcl-C_oonAa z;NvWvu(95PFQ>%8y30<*v#pBleZw8OjeUR1u3cK$@ZtB2D@qJzQ58keSrEX2YvwvkVlO6&-40?@`O%}Pucbo@wiGV_S%Jlswr2ovk+tm5T)@zPuWU_kM<#K4c^_o7r z=;^h(*X~-f8?HTDapJlx$piyHDj&a>MF5ahaJ+lvxv`8}b;~TuPovlx-3Q0#QpX7)E{!#S(lvZJLpma#Rkp> z{ax665IzhKJeTQy16%DA78R=Qu22&^11!b`!4C)u!l>69Ww&N~PIJ2~`0>FUf))mV zWk&dM2JQB7b@QRx($42fGwc}m0M$cIhO7?<5l2AllO^*IwEbL%H1%X{>v_?bypGGo zlyjQ*L5WmgDS#jW2&T=fIc*jU)AA8qz?_5hC1pcfSaTB64GUMJBNd#*IdO!D)Cd-%?0HgZv95FF6g!AF0t1 zo>F)+NR7qEQWQYM`fEXYKhyh}N7$63S0b+m{AO?s5 rVqhN_c)z}$qAzhk8Xygj21o;>0nz|zfHXiFAPtZPNCTvS{nfw^rmfTk literal 0 HcmV?d00001 diff --git a/satpy/tests/test_file_vii_l2_nc.nce3a65fc0-1229-11ec-ba9a-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l2_nc.nce3a65fc0-1229-11ec-ba9a-0a1f71143ab9.nc new file mode 100644 index 0000000000000000000000000000000000000000..408b43d50c4e2fa8d2669f123e09d99555da5413 GIT binary patch literal 12192 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 B^L+pS literal 0 HcmV?d00001 diff --git a/satpy/tests/testingcfwriter22021253105311-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter22021253105311-viirs-mband-20201007075915-20201007080744.nc new file mode 100644 index 0000000000000000000000000000000000000000..cabad65bf66c6c3ff3f51e667d4f719d563b66d9 GIT binary patch literal 20402 zcmeHPZ){sv6+iZK5+`-qw6yD10#BNLS>ZA@ZJps5m~uuTj!VCom73D{coLzx5&gjCM&-h1pg zi<_=$Dc$ak{O)__o_p@Ozx(H%dvor4cxW)y-nOnS7!H$!izYlbswpv(@a$dDKaCCz zjs@FC0>Sl)=ro%&$+IwS3sL|q9UZtn5yX{fP)8KG6*mqoqcDYt3Z;tgO;5QcpFYO) zCjKEqc4pG^B57ht4l^p&$wI|1dvl7f&+sKYH|x9k=%Kmj;W^(c7mJ^*Wc|Z)(Q+x; z6YGg@j&0u@k459L9b32Th{wC*eZ5<5-yZoiN^vNn1t-d-8CIZBE>)CpR1iueQk&!5 zw?~pt*P-Q_IWv;j=amn;o?mb^J759(jO$fc#?GEiCD+g8$9ML2Z|jb4n#_-H-N_~Q zbjL|Sr|)09`{;R%ECm9qIXeXdfdJ$nNbE#_Wd}DDW5pp#O>Lk!pTRTV9MdSDF&TcZ zxQNztstismEo>cmjtqd+q1B867oQnXI`<~ZWiMYSF{qWgVxb%tr-HBSGFjdIcBOxNW zh)}IxRQzlypY`&YQg+H!vez2fhrRNBZVufmGndI#@r6oFoZlcfT`KsxKLK9oG)46F zqp$3|dY$B-2DU?{1_Jjr?IftpRp}%r{!k7}0~7tnbfaCSF3oBP1wsH0AuxN=(RaAs z_x8XqYI!s5I_0=wSgLc(($a0U@@)8g51sq%!ClgP63^b7JNR;_y}e~!XK?+h&SOOD z`$G>aYV*3Ae|+NUpDpKsyy}sV$F%&R@oYcW;c1>9ZLkPf1S|p;0gHe|;D$j!?2HyV z-LI9d8lh|}U$%*SNvY0T(C> z>jMEsdA>XT$y?u)#vyug6;g?+2INh63WUUJbc$L3f-w}4GB^6QH;~&|4UsFOpI6l& z>Zjgi)O(S$MFvqCR<^6viYiqo7QdJ+PP>b8H(F2;z4svOWvo`(SPmmORn8a23%t5q zToCgj!@M=>``03X9O!VR3jTE7johObFDs}6y4DtH!+X;E=@#b1`V9@JaxStm1+Ev? z@Pz{;&wmDnFTZ=_kH9OeaCQO{P2kk>5Jw)sI?bUK6oUq1$y9PIIg&_blm>k)5*p;Q zezxNJHC6Hj-YdW|o5J%~#fz<-rS+r-e0wFzt@Vf#KUo!phO%_fshmFdh{@7?v*HgK z)v4(~Iyn~qky>gHz4e{c=>mJ&{uP{(HSvq)vtAT0-Qwh>*2Q8-q8Egells74;>gF#+Pt@QKHA&qF*^u&E; z_}0Jiv`~5D(fvBlb-7M|_OH`sP3wgsM`vVfodioL~Y?4L5B481)2v`Ix0u}*_zzu{zBfHW3`@3OH z9-rq`!;r3Ds%t*5-*|CXJe6ioSrYxk2Tfv;7ovSMOI`e^Q#|8+ zC%$14uef;N!0!FSDMsR1&#k4`3Bgln_uA`c#}oaWY{NA}K(&8s9qx7QR@cmR-K4HZ)HQxx=c#M-x(45L?*q|m zRxc~~@(`H+o_XKtg8$ij2Gan7yl3QD-ZS!iE>0_@79QIW zfFx!-xHjex&HdRKx9FB8{7JfnzdryEX8bfSpSxJ(s|0vOh^ISd>l!lEqxbrpJrbcM zpNWZbJz@eMZh9p5wHkY N1S|p;fe#G={{;z%_R0VN literal 0 HcmV?d00001 diff --git a/satpy/tests/testingcfwriter22021253112603-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter22021253112603-viirs-mband-20201007075915-20201007080744.nc new file mode 100644 index 0000000000000000000000000000000000000000..6181e8ab2a3cb22e1c700b7665d4d656317c66d4 GIT binary patch literal 21197 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 literal 0 HcmV?d00001 diff --git a/satpy/tests/testingcfwriter32021253105311-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter32021253105311-viirs-mband-20201007075915-20201007080744.nc new file mode 100644 index 0000000000000000000000000000000000000000..8ef01d51e7ee0133ca4c4785e9bc02b0807e91fb GIT binary patch literal 18318 zcmeHOZ)lT87{BE0pP0V2wN{<3j8JrQYa5eVYwcENNmCVTyR{+=w#Br0+oq&Reerbscvl zx!iNlJ@?%2?%wx#uFoCa)zw|;UFUUsJdDz9m5%R}lz^(ZeCgxw`gV2oyDNKL?s`Eq z%2XY-Da^fY<^oG~HNM|<l+G8JtnDj>gkY%FYPBR>c>xt*B$ge1jR^M8>gGiNvOK)S1ZmQb}KPpgGtS*wz#b z_=170~m?;H^QpqW*R& z4LxV4CM?^DTaq2HfPKoc(_BVJb7RtShGN4VE&eutuyHgtyrm=P4>tRQOh6}pZ)-X_ zAdzJ*S1oVO+%A_3a*!xDOki2fCyHamlaG~pK{1{}ng2K}QJzr^eiB@at*R3ZjAg8F zcBpK2g4JNP90lHeq*v(N5=y1)SUkx=P0#8U%JJ?*q8tUYLC#T`g0iP`U_gL~$%j&1 zyZ45B2X^=MMg~HiJsivBXf``N{&mCozR<2cq;*MAt>tLXOEB0od15|zVcTDj0giHZ z^J!W2nc^_(ppC)Tmsm=@oqNMVOK6BsMhrwwvkB-3kFNN5JT@B%64{PP$*zmE6HUgV zb}W*Nj$1^iwxFgpS;Dt`(jGfy$_UYm+l0Ow} zgK7i>_kCR?7|o(AlGB${9-3gr{#MIqyBbTG*g~!n0Egt7K4ZvV_#XSE^HQ#Dq*B(L zPz(z#j%l{=T&?)k^IJ2!{=s704xBipmIsHqRX>t8x3h2wz$r9A(2;;{`^ zX>u5QzXr98Wev#HD7i|=YBUm2=Y}#AQIqL=<43eMY9Vrk?^!Vn#&)ol3f6L)H#57? z8$8=u;Zb$R6N&xN#H2MRcQJ>Gv0H~=FT-2$aycBy@l-569OvHU+=4hS8szz?clsiL z9O&>t#huBRWxgn#mnv2bU2{%a&+dVJY%S-6|Aq+^E$8q|f$NP`{EH_@&MyPQ3pWp5 z0bU+~v*8*k1*epU+Xp38Tp*`pP3dqEKSX{xzWPf%8-b|;=I zNJb)+r1?ZS`PJ|H{=2)gae>{rjE?}&^FfW=hwX{wi&a9~6{k=$-<<8w-=2|&wmrEr zBIQpf2tWTZIwLp7dY5ZGD0lPfDtchnfThDxPzPoQ_^TD^ZQ7fnlznCG?+|4%E0`HH zrdO8dLA**-|t)WWD#{t5-PX&a^Ys z*CR%W2P#iAVr+CIdfGuAQX!q*h(xD@721nLCpq-AETq%9G0{m*x$Krbs`7xpb@Rnj z7e61rcxq$7zoo5-6WRpfNx?zwDW`t1i;xQGUP;c!Vu7ahqFZ8sLhMptMAGy)m{jetf#BcKuZKO%szve|LL zGW3e#g3WrwE*U)fQ{DiLMV#n}h-#vXmqViwJJ4$SWZ0Zn@*y}bcexHhOgM-Pnr$+Y zwL;!ww5@b1F)8At3gbg5?uqhih}rFtm+(}~?kmwLD`6!^oKd!xUw1^n6h5+rN8He) z)|4Y^i2~~o$z*P1{7PRga4UP?PhRc=3-soJxIR82#No;)*u{v$MFbS|B7G3~G&Xao zYTiJewlDh%|am|Ch2o;mw`zQ%V%4nHuBX^u%_DwD=kKKRbJ o-xu?i778wVZvk(KqU;DAoofU%0vZ90fJQ(gpb^jrENuk-0mF&J(EtDd literal 0 HcmV?d00001 diff --git a/satpy/tests/testingcfwriter32021253112603-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter32021253112603-viirs-mband-20201007075915-20201007080744.nc new file mode 100644 index 0000000000000000000000000000000000000000..6b84a4afc480dfe07d58de59d212730272c87624 GIT binary patch literal 18864 zcmeHOU2IfE6rQ`g-LCEJ59O~^9u^)90$p}XDFsAmcDGP0ZPOB>(YP$#Te`U2ZSLOI zt|mf!F_@SbUrY=LQF%}aL81u{7z`$AVj_|7U}AjGXwo-%@Bx1!o^R%!cC+>tLTIFB zhHPi=nRCv}d}r=(&g_{JdlTJtH7zv)B@_|?(I~(2pWAM^(4#2)%0yVe5|LkuJH*2ERAv)Kll`T!j&>x@x>6eB1HeP`J!V_j9Ga{H7}*AO17)# z^yH{*n+G9aNP&U#owwD%U4SVe@IjslAp~eSPhbe$>P0TLqqh8dBVcffh>uh{mH(ep8menP`s-* zDNF(ZR;!XyeO>#LV1pE9z)~f5nXK`nRfzMdl7HX%{M?TI_}(XYgaOYHs-^b50zy1i zrek2q`u)&hwktc=OG~Hvq$%1H*|BVfxXV$5Fpm!3&0XczE;{LaCT(X@`Sh4Yt(ebB z`mn^fT{vnDV+Ey3so_Gw&SdknEX_4A14B5G&pJg{7=kQ3_T$nUUoWKfg}72j{ZZMY zs{h#fQ?B(_;+?1RimK$_8$X?R36@i~ZE8?W?&1}}Wq39M{5BX<*W48Z`pv?{HTQ0H znB$(UK2>J*n}418*>i27mv5H7Q9{jc1nQ}0hYx)gsH>}PS?ycfwE8&hCc6VCBsJL5 z{PDSypVrfYX?ita6D@OiB)yxYPSSp=i$*{rpb^jrXaqC@iv|Jqaf0GE88C?%&-^Z( zMjsW0kG#Kz)sQ5?^oc`kI#K=g_a<#(4RrHKCk|TFmMjYS|!FLvZpFj8rzNi61 z7rJ1-zsl3^7p^x8Nw@rZ_R`Y~sSuappHrD}8&}}T2(Yi{r_luKK~rVA%!DL@NnNp)zLG!~XGHEAWwA^C{DDo&g+Dw*CDGvFvzo;=vqLd*d+E>jU#xmyXUC)Dx^i|KPUSyZn4Rhm z_f0?RcD-Ob)y9}I2;LKXun_KPr+R%)Lt=KPI=x(}<--g01{eYNOhfo{g*>kfa1L&G z^RnKlX!j&@%)e7TL}>APBoL1*&{l%ExFMlDoDn6|sk}O8)TX#g<;_hL> zi17>m_R;GXng1^8J@NitsS}$U6`nEgQ{184-l@Hk&ifM6`8b8wAJbV654e)fr^8HV zJ=JnlLOkr&bndzN>Y1ybj9opmE*ja=*-C^?NqAIpusqk?FRY1DNms|;vvlrPaSJhB z_P;#SbgdE42xtT}0vZ90fJQ(gpb^jrXaqC@8iB=zz=6SJ5~s+Vw8OP~km@;|YaGbC z9DF{&HOJYW3Uq@;KqH_L&3YU((q_<(hwM zX86m0Ed}kZ=?fotdC4-Hm<8vkf6-p@9H?lLMnEH=5zq)|1T+E~f&VW8Drd3AZ>+-{ z?>f8M>xw4j6(g^Ta}ZEcNn^+YtdYFP^5YAd#40aof}dq#WR_044Fi+yDRo literal 0 HcmV?d00001 diff --git a/satpy/tests/testingcfwriter42021253105310-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter42021253105310-viirs-mband-20201007075915-20201007080744.nc new file mode 100644 index 0000000000000000000000000000000000000000..8539470a831b6868a4d0795a4baa9d0c3c3095b0 GIT binary patch literal 40463 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 YK_j3M&x9660YErHSO5S3 literal 0 HcmV?d00001 diff --git a/satpy/tests/writer_tests/test_ninjotiff.py b/satpy/tests/writer_tests/test_ninjotiff.py index ed9db0f8d4..76fc42638c 100644 --- a/satpy/tests/writer_tests/test_ninjotiff.py +++ b/satpy/tests/writer_tests/test_ninjotiff.py @@ -128,17 +128,3 @@ def test_convert_units_other(self): ds_in = sc["rain_rate"] with pytest.raises(NotImplementedError): convert_units(ds_in, "millimeter/hour", "m/s") - - @mock.patch('satpy.writers.ninjotiff.NinjoTIFFWriter.save_dataset') - @mock.patch('satpy.writers.ninjotiff.ImageWriter.save_image') - @mock.patch('satpy.writers.ninjotiff.nt', pyninjotiff_mock.ninjotiff) - def test_P_image_is_uint8(self, iwsi, save_dataset): - """Test that a P-mode image is converted to uint8s.""" - nt = pyninjotiff_mock.ninjotiff - nt.reset_mock() - from satpy.writers.ninjotiff import NinjoTIFFWriter - ntw = NinjoTIFFWriter() - dataset = xr.DataArray([1, 2, 3]).astype(int) - img = FakeImage(dataset, 'P') - ntw.save_image(img, filename='bla.tif', compute=False) - assert nt.save.mock_calls[0][1][0].data.dtype == np.uint8 diff --git a/satpy/writers/ninjotiff.py b/satpy/writers/ninjotiff.py index 033a25859d..54756d8340 100644 --- a/satpy/writers/ninjotiff.py +++ b/satpy/writers/ninjotiff.py @@ -173,8 +173,6 @@ def save_image(self, img, filename=None, compute=True, **kwargs): # floating_po raise NotImplementedError( "Don't know how to handle non-scale/offset-based enhancements yet." ) - if img.mode.startswith("P"): - img.data = img.data.astype(np.uint8) return nt.save(img, filename, data_is_scaled_01=True, compute=compute, **kwargs) def save_dataset( From 6bcf7eb19d79d319980bf0056d5332a99b96e7ce Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 10 Sep 2021 19:43:34 +0800 Subject: [PATCH 08/33] Revert "Revert "Merge branch 'main' into feature-daynightcompositor"" This reverts commit baf85010df4c6ff9883df9f4f082cfe61c289b7a. --- doc/source/enhancements.rst | 2 +- satpy/composites/__init__.py | 6 +- satpy/etc/readers/modis_l1b.yaml | 32 +- satpy/modifiers/_crefl.py | 8 +- satpy/readers/hdfeos_base.py | 33 +- satpy/readers/modis_l1b.py | 7 +- satpy/readers/modis_l2.py | 1 + .../ab011ed1-62c7-4693-b3e6-48898e2c303b.nc | Bin 23662 -> 0 bytes .../b71971c3-1792-490e-a4cb-3c5e6e8abf36.nc | Bin 23272 -> 0 bytes satpy/tests/modifier_tests/test_crefl.py | 128 ++++--- satpy/tests/reader_tests/test_modis_l1b.py | 321 ++++++++++++++++++ satpy/tests/reader_tests/test_modis_l2.py | 25 ++ satpy/tests/test_composites.py | 10 +- ....nc4dbaf523-1225-11ec-9dc0-0a1f71143ab9.nc | Bin 25395 -> 0 bytes ....nc4dcb3eba-1225-11ec-90b9-0a1f71143ab9.nc | Bin 25395 -> 0 bytes ....nce37252fa-1229-11ec-a839-0a1f71143ab9.nc | Bin 25795 -> 0 bytes ....nce3831063-1229-11ec-b972-0a1f71143ab9.nc | Bin 25795 -> 0 bytes ....nc4de127a8-1225-11ec-9bc4-0a1f71143ab9.nc | Bin 189138 -> 0 bytes ....nce39a0c29-1229-11ec-9912-0a1f71143ab9.nc | Bin 189641 -> 0 bytes ....nc4ded0774-1225-11ec-bf73-0a1f71143ab9.nc | Bin 12192 -> 0 bytes ....nce3a65fc0-1229-11ec-ba9a-0a1f71143ab9.nc | Bin 12192 -> 0 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 34392 -> 0 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 20402 -> 0 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 21197 -> 0 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 18318 -> 0 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 18864 -> 0 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 40463 -> 0 bytes ...irs-mband-20201007075915-20201007080744.nc | Bin 40248 -> 0 bytes satpy/tests/writer_tests/test_ninjotiff.py | 14 + satpy/writers/ninjotiff.py | 2 + 30 files changed, 523 insertions(+), 66 deletions(-) delete mode 100644 satpy/tests/ab011ed1-62c7-4693-b3e6-48898e2c303b.nc delete mode 100644 satpy/tests/b71971c3-1792-490e-a4cb-3c5e6e8abf36.nc create mode 100644 satpy/tests/reader_tests/test_modis_l1b.py delete mode 100644 satpy/tests/test_file_vii_base_nc.nc4dbaf523-1225-11ec-9dc0-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_base_nc.nc4dcb3eba-1225-11ec-90b9-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_base_nc.nce37252fa-1229-11ec-a839-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_base_nc.nce3831063-1229-11ec-b972-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_l1b_nc.nc4de127a8-1225-11ec-9bc4-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_l1b_nc.nce39a0c29-1229-11ec-9912-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_l2_nc.nc4ded0774-1225-11ec-bf73-0a1f71143ab9.nc delete mode 100644 satpy/tests/test_file_vii_l2_nc.nce3a65fc0-1229-11ec-ba9a-0a1f71143ab9.nc delete mode 100644 satpy/tests/testingcfwriter2021253112603-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter22021253105311-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter22021253112603-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter32021253105311-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter32021253112603-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter42021253105310-viirs-mband-20201007075915-20201007080744.nc delete mode 100644 satpy/tests/testingcfwriter42021253112602-viirs-mband-20201007075915-20201007080744.nc diff --git a/doc/source/enhancements.rst b/doc/source/enhancements.rst index d8178e2d23..142be49531 100644 --- a/doc/source/enhancements.rst +++ b/doc/source/enhancements.rst @@ -27,7 +27,7 @@ on both ends of the scale, but these can be overridden with method: !!python/name:satpy.enhancements.stretch kwargs: stretch: linear - cutoffs: (0.003, 0.005) + cutoffs: [0.003, 0.005] .. note:: diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 49ecab429f..1a89ec7583 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -46,12 +46,10 @@ class IncompatibleAreas(Exception): """Error raised upon compositing things of different shapes.""" - class IncompatibleTimes(Exception): """Error raised upon compositing things from different times.""" - def check_times(projectables): """Check that *projectables* have compatible times.""" times = [] @@ -74,7 +72,6 @@ def check_times(projectables): # Is there a more gracious way to handle this ? if np.max(times) - np.min(times) > np.timedelta64(1, 's'): raise IncompatibleTimes - mid_time = (np.max(times) - np.min(times)) / 2 + np.min(times) return mid_time @@ -157,7 +154,8 @@ def apply_modifier_info(self, origin, destination): def match_data_arrays(self, data_arrays): """Match data arrays so that they can be used together in a composite.""" self.check_geolocation(data_arrays) - return self.drop_coordinates(data_arrays) + new_arrays = self.drop_coordinates(data_arrays) + return list(xr.unify_chunks(*new_arrays)) def drop_coordinates(self, data_arrays): """Drop neglible non-dimensional coordinates.""" diff --git a/satpy/etc/readers/modis_l1b.yaml b/satpy/etc/readers/modis_l1b.yaml index 10a5c25770..7bb694dd7c 100644 --- a/satpy/etc/readers/modis_l1b.yaml +++ b/satpy/etc/readers/modis_l1b.yaml @@ -438,28 +438,52 @@ datasets: solar_zenith_angle: name: solar_zenith_angle sensor: modis - resolution: [1000, 500, 250] + resolution: + 1000: + file_type: [hdf_eos_geo, hdf_eos_data_1000m] + 500: + file_type: [hdf_eos_geo] + 250: + file_type: [hdf_eos_geo] coordinates: [longitude, latitude] file_type: [hdf_eos_geo, hdf_eos_data_1000m] solar_azimuth_angle: name: solar_azimuth_angle sensor: modis - resolution: [1000, 500, 250] + resolution: + 1000: + file_type: [hdf_eos_geo, hdf_eos_data_1000m] + 500: + file_type: [hdf_eos_geo] + 250: + file_type: [hdf_eos_geo] coordinates: [longitude, latitude] file_type: [hdf_eos_geo, hdf_eos_data_1000m] satellite_zenith_angle: name: satellite_zenith_angle sensor: modis - resolution: [1000, 500, 250] + resolution: + 1000: + file_type: [hdf_eos_geo, hdf_eos_data_1000m] + 500: + file_type: [hdf_eos_geo] + 250: + file_type: [hdf_eos_geo] coordinates: [longitude, latitude] file_type: [hdf_eos_geo, hdf_eos_data_1000m] satellite_azimuth_angle: name: satellite_azimuth_angle sensor: modis - resolution: [1000, 500, 250] + resolution: + 1000: + file_type: [hdf_eos_geo, hdf_eos_data_1000m] + 500: + file_type: [hdf_eos_geo] + 250: + file_type: [hdf_eos_geo] coordinates: [longitude, latitude] file_type: [hdf_eos_geo, hdf_eos_data_1000m] diff --git a/satpy/modifiers/_crefl.py b/satpy/modifiers/_crefl.py index 72f3a719ff..ffbb187220 100644 --- a/satpy/modifiers/_crefl.py +++ b/satpy/modifiers/_crefl.py @@ -149,20 +149,20 @@ def _read_fill_value_from_hdf4(var, dtype): return np.iinfo(dtype).min def _get_data_and_angles(self, datasets, optional_datasets): - angles = self._extract_angle_data_arrays(datasets, optional_datasets) + vis, angles = self._extract_angle_data_arrays(datasets, optional_datasets) angles = [xr.DataArray(dask_arr, dims=('y', 'x')) for dask_arr in angles] - return [datasets[0]] + angles + return [vis] + angles def _extract_angle_data_arrays(self, datasets, optional_datasets): all_datasets = datasets + optional_datasets if len(all_datasets) == 1: vis = self.match_data_arrays(datasets)[0] - return self.get_angles(vis) + return vis, self.get_angles(vis) if len(all_datasets) == 5: vis, *angles = self.match_data_arrays( datasets + optional_datasets) # get the dask array underneath - return [data_arr.data for data_arr in angles] + return vis, [data_arr.data for data_arr in angles] raise ValueError("Not sure how to handle provided dependencies. " "Either all 4 angles must be provided or none of " "of them.") diff --git a/satpy/readers/hdfeos_base.py b/satpy/readers/hdfeos_base.py index 7dd93073fe..4020f88669 100644 --- a/satpy/readers/hdfeos_base.py +++ b/satpy/readers/hdfeos_base.py @@ -27,7 +27,7 @@ from pyhdf.error import HDF4Error from pyhdf.SD import SD -from satpy import CHUNK_SIZE +from satpy import CHUNK_SIZE, DataID from satpy.readers.file_handlers import BaseFileHandler logger = logging.getLogger(__name__) @@ -120,6 +120,12 @@ def read_mda(attribute): current_dict[key] = val return mda + @property + def metadata_platform_name(self): + """Platform name from the internal file metadata.""" + return self.metadata['INVENTORYMETADATA']['ASSOCIATEDPLATFORMINSTRUMENTSENSOR'][ + 'ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER']['ASSOCIATEDPLATFORMSHORTNAME']['VALUE'] + @property def start_time(self): """Get the start time of the dataset.""" @@ -165,11 +171,33 @@ def load_dataset(self, dataset_name): scale_factor = data.attrs.get('scale_factor') if scale_factor is not None: - data = data * scale_factor + data = data * np.float32(scale_factor) data = data.where(good_mask, new_fill) return data + def _add_satpy_metadata(self, data_id: DataID, data_arr: xr.DataArray): + """Add metadata that is specific to Satpy.""" + new_attrs = { + 'platform_name': 'EOS-' + self.metadata_platform_name, + 'sensor': 'modis', + } + + res = data_id["resolution"] + rps = self._resolution_to_rows_per_scan(res) + new_attrs["rows_per_scan"] = rps + + data_arr.attrs.update(new_attrs) + + def _resolution_to_rows_per_scan(self, resolution: int) -> int: + known_rps = { + 5000: 2, + 1000: 10, + 500: 20, + 250: 40, + } + return known_rps.get(resolution, 10) + class HDFEOSGeoReader(HDFEOSBaseFileReader): """Handler for the geographical datasets.""" @@ -293,5 +321,6 @@ def get_dataset(self, dataset_keys, dataset_info): for key in ('standard_name', 'units'): if key in dataset_info: data.attrs[key] = dataset_info[key] + self._add_satpy_metadata(dataset_keys, data) return data diff --git a/satpy/readers/modis_l1b.py b/satpy/readers/modis_l1b.py index a4e888c612..46b00b05b6 100644 --- a/satpy/readers/modis_l1b.py +++ b/satpy/readers/modis_l1b.py @@ -81,12 +81,6 @@ def get_dataset(self, key, info): 'EV_500_RefSB'], 250: ['EV_250_RefSB']} - platform_name = self.metadata['INVENTORYMETADATA']['ASSOCIATEDPLATFORMINSTRUMENTSENSOR'][ - 'ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER']['ASSOCIATEDPLATFORMSHORTNAME']['VALUE'] - - info.update({'platform_name': 'EOS-' + platform_name}) - info.update({'sensor': 'modis'}) - if self.resolution != key['resolution']: return @@ -181,6 +175,7 @@ def get_dataset(self, key, info): # satscene[band].area = geometry.SwathDefinition( # lons=satscene[band].area.lons[indices, :], # lats=satscene[band].area.lats[indices, :]) + self._add_satpy_metadata(key, projectable) return projectable diff --git a/satpy/readers/modis_l2.py b/satpy/readers/modis_l2.py index cf8c1914ce..7dc336c501 100644 --- a/satpy/readers/modis_l2.py +++ b/satpy/readers/modis_l2.py @@ -163,6 +163,7 @@ def get_dataset(self, dataset_id, dataset_info): else: dataset = self.load_dataset(dataset_name_in_file) + self._add_satpy_metadata(dataset_id, dataset) return dataset diff --git a/satpy/tests/ab011ed1-62c7-4693-b3e6-48898e2c303b.nc b/satpy/tests/ab011ed1-62c7-4693-b3e6-48898e2c303b.nc deleted file mode 100644 index 934ceca5c951b6184b125d074a8aa45a5f16f403..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23662 zcmeHPdu$xV8K1qg%_UqC1BRFglp}Q`i$vBr91VeloH;v9g0VwvAs$iJo7~#o$hUji zTZcqSg^3X02tia;Razkwg(wa56(K-r1tEd(P}{U11hNF8M3q_){K2C_{ilN8H#48_ z?3~kZJOa{;{kz$n$G0=z{BCCN`(}51ZReUfvlq-36cPzhCmQ7;e|)Zkze%O=Ip+`X z!3=Tl+Rlx!Iek`akt`5T=yEJ)dOSNOEGp6{oAH;JD&DVai3UCpB6$rRTOuhE_{%$y zW0!)_aEmL8T!c>&A%!81+)`v$6iQxAd6t+ZYZphHXfOy1vMN5P_8eeJZ7!6&UI=Ps zldKwf1=rpZY;!|r$hAw66Gl=BiI`gQVteCiv za^n^cN-LcrTzr|V7;g}qGd)hGshoxJp~1*?cl7n)eEJ}CuDhwLr*Bk zyf996g*c=lo%;A`!TV2|$PH_L;Tdez#gJXn9NN z^tj)lM2O1iqu~llwCZ^L=9YO726vWT)}#!N{x0_Ikf1$XD+#Cz>1S8$u1*3yg<{H5 zp;i)rfif@&>b{Z5;HvY~Ri={Qo)s$fB^8M?PX^=f>|atQ!M}CGJGpMJ5vreuSe8#KA@dZk=tty&aEn+hhWHlAFus+gifi=_5J7M1TodPZ1G_%f^ z`S?I6hQU^MON5!!-hnwf2=kurM6R0Zm&{Uyexf3^Z1b^--yZij(U>uD>t}4264|T! z6IO`X_~~PRkmJ6A+HHw>xVdN+<@Kz4T_5gIE=3Kx>7dpV>v%opIi@lm*A1t%7Y;x1 zpC9LXyJbEJK;W{Py@FRIrYfiNM5X5|d0nc{>1wo8dn(g4p(o3;eExQ@d}hA>UQU+h zbS}p+UsreUwDQcm>E+L-#vyPzw@0O7HKrRO6O0Co28;%b28;%b28;%b28;%b28;%b z28;&2=NcgE0$WsWX;q!sH&4aMrOGxu8^4Yd%9Y_n5!)xoUP8a}*2A=CM)WlLdAhar4brfqp!X6bN#@ak3VZSCo{ zACcI6>#`S=_%X65W$_P;0sDYsz`KCxfK>*da5m*qD4Pbdzy@FdC<0@^{lFezFR%|d z1RMsA0LOq=fLDPD;9cN7;3MF_fVcq~01`kFXat&oX5ca)1+)OIz)~O$WPodcl|UBg z1l9uGzy_cnxE0t03;=mx7#IPHKm=?Db^>F-F5n*EUf_OUH}C-PAg~Ac8Sr!97rew4(?Kr+jWi`mys$;*;Jb6;;?L2%$13Jv{pKwCHT_Ke-1iVB)9Flap+achFYMl9|i` z_B~BMubmz0UbjW+26t7uDeP%HgNs~qqY1k`ng#Fn$W1yo>7KaCt`B`DE_r}_j#V#_ zz{4x{+V%Cl4pWE)@yh z8uR5S&duhSn$PY~>OtkXYTk(x3pP_Lk`vgnB)?J-)V8r}P1nY*o?Mr$+^?5FAbC$| zn^(zI+pu&)t43cpL0QQhv#R;xtWzE?{%WxvjxWCCZ{NLMaqBq#f4zF=A04l%A6oQd z%fRTsaKLcDaKLcDaKLcDaKLcDaKLcDaKLcDaNt~VK$*#QS(bW+F0L#R{0o1&d2FWi z+RbL{=uTg!Y$Mr)DrUpk86F+LHhZ!V)n+(j%M8cVGq%Pgi*)>D&9y9v<4W5VZGo>m zXV*L1x@gP$u0Q`WE-hO}l*4|W_%2$uSVtVQtz#sCW(Y#A904_htW(T1+$=ZnnedZWiouXZHac#JBm=e+8-H#A-+#PVt E7m@*Nf&c&j diff --git a/satpy/tests/b71971c3-1792-490e-a4cb-3c5e6e8abf36.nc b/satpy/tests/b71971c3-1792-490e-a4cb-3c5e6e8abf36.nc deleted file mode 100644 index 9a0745497330de2fd1c2c354c9dd6164b7c79fa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23272 zcmeHPduSZT8K1p7$!B@3hofL8xcDr)!AXU*Ydg>>mu>E;Pkmpm-eV5Nqyp$`zGQ$ zx;uA8mbY7x7I`qrwYbjoye=XvD%sdbzu$<^uMqtz6QY(kgs@Yz9Tm2SiN1(i#fsS~yMAGgsvW7+roV1}Yl+gH zu&icC7ZJ;{>SzOr^Jp{at7+{T(g9LJtc;75-@;an)MT_yY4Xe}d0ITKGI9NCSs_|0 zrdxpbNm11JTGjMyPo}SLie@{v-<|92+rFdM>C0w%a@u4Uw8@6`g-8skuO5a%6P;c+ z94HKSbb3XvAR0jjZnv%{P;y4PRNu5_N4EQGsxNn_D&ih4SH+6j^>onEC7>C9thmoD zIl&-|HZoT9%f9575a*hX93q)ESWAScQT^=A+?|u%OhXQ}sejljC-9d~_->f(>`D~C z0Ke=7eq!HPnDB$Ja_T_7in(iX-SO5G-4{5 z6c-cq7iJofDa-kMjd*smYW;L0#;*3wxKC^Nii{|GHH#4^?mzxg#fa}LQGMxD*;FIS zA;gNYepVIphrHrg(Ww}7B!Ac~l|R#Dd;ht0M;HB`Otg!SFYf*7Omp&>%DFaYVwSPB zjz-<+Evng{JQQC+y^mU_Z%|s;pq0U+Y;0k>$P8ZeLMjX}uat zF+2K&e5v60`J$SYSE3TJVYC$NcLzcYqRwFq%-mVKM@<$Dn7*Nn$_&%9y{});g=tzR zA=Fcv4_OJ-`5CPSI=14}4{p9QyQ4>*m(LW`LX~te!7~EWl#lZuqsJO~O{&SqHECxY zubD$WPg5+PS+DP)NjZF+%W=-vT{=xZmuKEiFTZSBdG4=1EH2G*lk+)~8x0r@7!4Q= z7!4Q=7!4Q=7!4Q=7!4Q=7!CZtXn;Hu?4e=r_6FT}@@YiH$uFwiNyo{3i`Tb59z69g zYLW7$ywRerv_)Ug&XGr)+~qQ=;q+#AmV!~Y6ngLkQCx${lcNFw2=YO1ZEuBJ8Xonn z9c`Q2Qmw;o2Ydir0zLu$0f;-$c_0qhKqJr$tO8a8 z31B_20cZu1KnJiH*aD=1PM{m;0d@lYz;56{U@uSrhJg`a6bOMsz(c?|@Gvj|dKYkGvH0&=YUB@14aWz14aWz16QtrnSri?7RLF)16{w@L7-!n62-xz$eh6=o91^s z*!&lPF1nU_YWl22T^6BxmF5%Z`ud*N(v=6Vzpqy{w`&Qta*2f%i|Kvq@aeUB6IuNB z+y5*BTnJFnVu7m@po&29yRR)BnC$_THLD&_yKhr%`CmMs{vq?1XD2x$wG=_5jk&@> zrs@0h=a4eto{g$Up~@x~q+BKjjz{AKGKdsRiF3_X&7v*(seivJBm}MhnVMoZz4y%u zXMTsJK$PxMnczhVHG02ZE;b5$*O6iEkMvp%I=gz^yRDKy4=$8I+;+~X4;PCp8a44;eD!VWO2URCmw}|+Z)j0^Y zavYTNUvfYbawu_sS<4r+iMi#U{`2Eg)H1%+SdMjwCDq`|ER-kR(9Lfu~L=XmwwGLBQ}pt1+m0xfBw#IMy|=B23JR4$4y zJvP%@J|lrYAaj{guJA=vXE?KF6Yp*}kGkGV!W?+Q!-w zTCG7}V}$gwTlAb_et%GM@FCCgLd2y{_V3P+I9kRtMV#kffjIHzHi+A$R&Ly&T8FPB jlt<~Kk_TL8H1Pb;8Fsy);cy|%6l0A?G9UhX*>C;>e%@vI diff --git a/satpy/tests/modifier_tests/test_crefl.py b/satpy/tests/modifier_tests/test_crefl.py index 571d8c5a29..1781cea627 100644 --- a/satpy/tests/modifier_tests/test_crefl.py +++ b/satpy/tests/modifier_tests/test_crefl.py @@ -16,6 +16,7 @@ import unittest from unittest import mock from contextlib import contextmanager +from datetime import datetime import numpy as np import pytest @@ -120,6 +121,20 @@ def test_get_angles(self, get_satpos): self.assertEqual(args[6], 0) +def _make_viirs_xarray(data, area, name, standard_name, wavelength=None, units='degrees', calibration=None): + return xr.DataArray(data, dims=('y', 'x'), + attrs={ + 'start_orbit': 1708, 'end_orbit': 1708, 'wavelength': wavelength, + 'modifiers': None, 'calibration': calibration, + 'resolution': 371, 'name': name, + 'standard_name': standard_name, 'platform_name': 'Suomi-NPP', + 'polarization': None, 'sensor': 'viirs', 'units': units, + 'start_time': datetime(2012, 2, 25, 18, 1, 24, 570942), + 'end_time': datetime(2012, 2, 25, 18, 11, 21, 175760), 'area': area, + 'ancillary_variables': [] + }) + + class TestReflectanceCorrectorModifier: """Test the CREFL modifier.""" @@ -135,11 +150,11 @@ def data_area_ref_corrector(): cols, rows, (-5434894.954752679, -5434894.964451744, 5434894.964451744, 5434894.954752679)) - dnb = np.zeros((rows, cols)) + 25 - dnb[3, :] += 25 - dnb[4:, :] += 50 - dnb = da.from_array(dnb, chunks=100) - return area, dnb + data = np.zeros((rows, cols)) + 25 + data[3, :] += 25 + data[4:, :] += 50 + data = da.from_array(data, chunks=100) + return area, data def test_reflectance_corrector_abi(self): """Test ReflectanceCorrector modifier with ABI data.""" @@ -222,7 +237,6 @@ def test_reflectance_corrector_abi(self): ]) def test_reflectance_corrector_viirs(self, tmpdir, url, dem_mock_cm, dem_sds): """Test ReflectanceCorrector modifier with VIIRS data.""" - import datetime from satpy.modifiers._crefl import ReflectanceCorrector from satpy.tests.utils import make_dsq @@ -257,28 +271,14 @@ def test_reflectance_corrector_viirs(self, tmpdir, url, dem_mock_cm, dem_sds): make_dsq(name='solar_azimuth_angle'), make_dsq(name='solar_zenith_angle')] - area, dnb = self.data_area_ref_corrector() - - def make_xarray(name, standard_name, wavelength=None, units='degrees', calibration=None): - return xr.DataArray(dnb, dims=('y', 'x'), - attrs={ - 'start_orbit': 1708, 'end_orbit': 1708, 'wavelength': wavelength, 'level': None, - 'modifiers': None, 'calibration': calibration, - 'resolution': 371, 'name': name, - 'standard_name': standard_name, 'platform_name': 'Suomi-NPP', - 'polarization': None, 'sensor': 'viirs', 'units': units, - 'start_time': datetime.datetime(2012, 2, 25, 18, 1, 24, 570942), - 'end_time': datetime.datetime(2012, 2, 25, 18, 11, 21, 175760), 'area': area, - 'ancillary_variables': [] - }) - - c01 = make_xarray('I01', 'toa_bidirectional_reflectance', - wavelength=(0.6, 0.64, 0.68), units='%', - calibration='reflectance') - c02 = make_xarray('satellite_azimuth_angle', 'sensor_azimuth_angle') - c03 = make_xarray('satellite_zenith_angle', 'sensor_zenith_angle') - c04 = make_xarray('solar_azimuth_angle', 'solar_azimuth_angle') - c05 = make_xarray('solar_zenith_angle', 'solar_zenith_angle') + area, data = self.data_area_ref_corrector() + c01 = _make_viirs_xarray(data, area, 'I01', 'toa_bidirectional_reflectance', + wavelength=(0.6, 0.64, 0.68), units='%', + calibration='reflectance') + c02 = _make_viirs_xarray(data, area, 'satellite_azimuth_angle', 'sensor_azimuth_angle') + c03 = _make_viirs_xarray(data, area, 'satellite_zenith_angle', 'sensor_zenith_angle') + c04 = _make_viirs_xarray(data, area, 'solar_azimuth_angle', 'solar_azimuth_angle') + c05 = _make_viirs_xarray(data, area, 'solar_zenith_angle', 'solar_zenith_angle') with dem_mock_cm(tmpdir, url): res = ref_cor([c01], [c02, c03, c04, c05]) @@ -294,8 +294,8 @@ def make_xarray(name, standard_name, wavelength=None, units='degrees', calibrati assert res.attrs['platform_name'] == 'Suomi-NPP' assert res.attrs['sensor'] == 'viirs' assert res.attrs['units'] == '%' - assert res.attrs['start_time'] == datetime.datetime(2012, 2, 25, 18, 1, 24, 570942) - assert res.attrs['end_time'] == datetime.datetime(2012, 2, 25, 18, 11, 21, 175760) + assert res.attrs['start_time'] == datetime(2012, 2, 25, 18, 1, 24, 570942) + assert res.attrs['end_time'] == datetime(2012, 2, 25, 18, 11, 21, 175760) assert res.attrs['area'] == area assert res.attrs['ancillary_variables'] == [] data = res.values @@ -306,7 +306,6 @@ def make_xarray(name, standard_name, wavelength=None, units='degrees', calibrati def test_reflectance_corrector_modis(self): """Test ReflectanceCorrector modifier with MODIS data.""" - import datetime from satpy.modifiers._crefl import ReflectanceCorrector from satpy.tests.utils import make_dsq sataa_did = make_dsq(name='satellite_azimuth_angle') @@ -332,22 +331,21 @@ def test_reflectance_corrector_modis(self): area, dnb = self.data_area_ref_corrector() - def make_xarray(name, calibration, wavelength=None, modifiers=None, resolution=1000, - file_type='hdf_eos_geo'): + def make_xarray(name, calibration, wavelength=None, modifiers=None, resolution=1000): return xr.DataArray(dnb, dims=('y', 'x'), attrs={ 'wavelength': wavelength, 'level': None, 'modifiers': modifiers, - 'calibration': calibration, 'resolution': resolution, 'file_type': file_type, + 'calibration': calibration, 'resolution': resolution, 'name': name, 'coordinates': ['longitude', 'latitude'], 'platform_name': 'EOS-Aqua', 'polarization': None, 'sensor': 'modis', - 'units': '%', 'start_time': datetime.datetime(2012, 8, 13, 18, 46, 1, 439838), - 'end_time': datetime.datetime(2012, 8, 13, 18, 57, 47, 746296), 'area': area, + 'units': '%', 'start_time': datetime(2012, 8, 13, 18, 46, 1, 439838), + 'end_time': datetime(2012, 8, 13, 18, 57, 47, 746296), 'area': area, 'ancillary_variables': [] }) c01 = make_xarray('1', 'reflectance', wavelength=(0.62, 0.645, 0.67), modifiers='sunz_corrected', - resolution=500, file_type='hdf_eos_data_500m') + resolution=500) c02 = make_xarray('satellite_azimuth_angle', None) c03 = make_xarray('satellite_zenith_angle', None) c04 = make_xarray('solar_azimuth_angle', None) @@ -360,13 +358,12 @@ def make_xarray(name, calibration, wavelength=None, modifiers=None, resolution=1 assert res.attrs['modifiers'] == ('sunz_corrected', 'rayleigh_corrected_crefl',) assert res.attrs['calibration'] == 'reflectance' assert res.attrs['resolution'] == 500 - assert res.attrs['file_type'] == 'hdf_eos_data_500m' assert res.attrs['name'] == '1' assert res.attrs['platform_name'] == 'EOS-Aqua' assert res.attrs['sensor'] == 'modis' assert res.attrs['units'] == '%' - assert res.attrs['start_time'] == datetime.datetime(2012, 8, 13, 18, 46, 1, 439838) - assert res.attrs['end_time'] == datetime.datetime(2012, 8, 13, 18, 57, 47, 746296) + assert res.attrs['start_time'] == datetime(2012, 8, 13, 18, 46, 1, 439838) + assert res.attrs['end_time'] == datetime(2012, 8, 13, 18, 57, 47, 746296) assert res.attrs['area'] == area assert res.attrs['ancillary_variables'] == [] data = res.values @@ -383,3 +380,54 @@ def test_reflectance_corrector_bad_prereqs(self): pytest.raises(ValueError, ref_cor, [1], [2, 3, 4]) pytest.raises(ValueError, ref_cor, [1, 2, 3, 4], []) pytest.raises(ValueError, ref_cor, [], [1, 2, 3, 4]) + + @pytest.mark.parametrize( + 'url,dem_mock_cm,dem_sds', + [ + (None, mock_cmgdem, "average elevation"), + ("CMGDEM.hdf", mock_cmgdem, "averaged elevation"), + ("tbase.hdf", mock_tbase, "Elevation"), + ]) + def test_reflectance_corrector_different_chunks(self, tmpdir, url, dem_mock_cm, dem_sds): + """Test that the modifier works with different chunk sizes for inputs. + + The modifier uses dask's "map_blocks". If the input chunks aren't the + same an error is raised. + + """ + from satpy.modifiers._crefl import ReflectanceCorrector + from satpy.tests.utils import make_dsq + + ref_cor = ReflectanceCorrector( + optional_prerequisites=[ + make_dsq(name='satellite_azimuth_angle'), + make_dsq(name='satellite_zenith_angle'), + make_dsq(name='solar_azimuth_angle'), + make_dsq(name='solar_zenith_angle') + ], + name='I01', + prerequisites=[], + wavelength=(0.6, 0.64, 0.68), + resolution=371, + calibration='reflectance', + modifiers=('sunz_corrected_iband', 'rayleigh_corrected_crefl_iband'), + sensor='viirs', + url=url, + dem_sds=dem_sds, + ) + + area, data = self.data_area_ref_corrector() + c01 = _make_viirs_xarray(data, area, 'I01', 'toa_bidirectional_reflectance', + wavelength=(0.6, 0.64, 0.68), units='%', + calibration='reflectance') + c02 = _make_viirs_xarray(data, area, 'satellite_azimuth_angle', 'sensor_azimuth_angle') + c02.data = c02.data.rechunk((1, -1)) + c03 = _make_viirs_xarray(data, area, 'satellite_zenith_angle', 'sensor_zenith_angle') + c04 = _make_viirs_xarray(data, area, 'solar_azimuth_angle', 'solar_azimuth_angle') + c05 = _make_viirs_xarray(data, area, 'solar_zenith_angle', 'solar_zenith_angle') + + with dem_mock_cm(tmpdir, url): + res = ref_cor([c01], [c02, c03, c04, c05]) + + # make sure it can actually compute + res.compute() diff --git a/satpy/tests/reader_tests/test_modis_l1b.py b/satpy/tests/reader_tests/test_modis_l1b.py new file mode 100644 index 0000000000..65bb5a5ea7 --- /dev/null +++ b/satpy/tests/reader_tests/test_modis_l1b.py @@ -0,0 +1,321 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2021 Satpy developers +# +# This file is part of satpy. +# +# satpy is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# satpy is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# satpy. If not, see . +"""Unit tests for MODIS L1b HDF reader.""" + +import os +import unittest + +import numpy as np + +from pyhdf.SD import SD, SDC + +from satpy import available_readers, Scene + +# Mock MODIS HDF4 file +SCAN_WIDTH = 406 +SCAN_LEN = 270 +SCALE_FACTOR = 1 +TEST_LAT = np.repeat(np.linspace(35., 45., SCAN_WIDTH)[:, None], SCAN_LEN, 1) +TEST_LAT *= np.linspace(0.9, 1.1, SCAN_LEN) +TEST_LON = np.repeat(np.linspace(-45., -35., SCAN_LEN)[None, :], SCAN_WIDTH, 0) +TEST_LON *= np.linspace(0.9, 1.1, SCAN_WIDTH)[:, None] +TEST_SATZ = (np.repeat(abs(np.linspace(-65.2, 65.4, SCAN_LEN))[None, :], SCAN_WIDTH, 0) * 100).astype(np.int16) +TEST_DATA = { + 'Latitude': {'data': TEST_LAT.astype(np.float32), + 'type': SDC.FLOAT32, + 'fill_value': -999, + 'attrs': {'dim_labels': ['Cell_Along_Swath_5km:mod35', 'Cell_Across_Swath_5km:mod35']}}, + 'Longitude': {'data': TEST_LON.astype(np.float32), + 'type': SDC.FLOAT32, + 'fill_value': -999, + 'attrs': {'dim_labels': ['Cell_Along_Swath_5km:mod35', 'Cell_Across_Swath_5km:mod35']}}, + 'EV_1KM_RefSB': { + 'data': np.zeros((15, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint16), + 'type': SDC.UINT16, + 'fill_value': 0, + 'attrs': { + 'dim_labels': ['Band_1KM_RefSB:MODIS_SWATH_Type_L1B', + '10*nscans:MODIS_SWATH_Type_L1B', + 'Max_EV_frames:MODIS_SWATH_Type_L1B'], + 'valid_range': (0, 32767), + 'reflectance_scales': (1,) * 15, + 'reflectance_offsets': (0,) * 15, + 'band_names': '8,9,10,11,12,13lo,13hi,14lo,14hi,15,16,17,18,19,26', + }, + }, + 'EV_1KM_RefSB_Uncert_Indexes': { + 'data': np.zeros((15, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint8), + 'type': SDC.UINT8, + 'fill_value': 255, + 'attrs': { + 'dim_labels': ['Band_1KM_RefSB:MODIS_SWATH_Type_L1B', + '10*nscans:MODIS_SWATH_Type_L1B', + 'Max_EV_frames:MODIS_SWATH_Type_L1B'], + }, + }, + 'EV_500_Aggr1km_RefSB': { + 'data': np.zeros((5, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint16), + 'type': SDC.UINT16, + 'fill_value': 0, + 'attrs': { + 'dim_labels': ['Band_500M:MODIS_SWATH_Type_L1B', + '10*nscans:MODIS_SWATH_Type_L1B', + 'Max_EV_frames:MODIS_SWATH_Type_L1B'], + 'valid_range': (0, 32767), + 'reflectance_scales': (1,) * 5, + 'reflectance_offsets': (0,) * 5, + 'band_names': '3,4,5,6,7', + }, + }, + 'EV_500_Aggr1km_RefSB_Uncert_Indexes': { + 'data': np.zeros((5, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint8), + 'type': SDC.UINT8, + 'fill_value': 255, + 'attrs': { + 'dim_labels': ['Band_500M:MODIS_SWATH_Type_L1B', + '10*nscans:MODIS_SWATH_Type_L1B', + 'Max_EV_frames:MODIS_SWATH_Type_L1B'], + }, + }, + 'EV_250_Aggr1km_RefSB': { + 'data': np.zeros((2, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint16), + 'type': SDC.UINT16, + 'fill_value': 0, + 'attrs': { + 'dim_labels': ['Band_250M:MODIS_SWATH_Type_L1B', + '10*nscans:MODIS_SWATH_Type_L1B', + 'Max_EV_frames:MODIS_SWATH_Type_L1B'], + 'valid_range': (0, 32767), + 'reflectance_scales': (1,) * 2, + 'reflectance_offsets': (0,) * 2, + 'band_names': '1,2', + }, + }, + 'EV_250_Aggr1km_RefSB_Uncert_Indexes': { + 'data': np.zeros((2, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint8), + 'type': SDC.UINT8, + 'fill_value': 255, + 'attrs': { + 'dim_labels': ['Band_250M:MODIS_SWATH_Type_L1B', + '10*nscans:MODIS_SWATH_Type_L1B', + 'Max_EV_frames:MODIS_SWATH_Type_L1B'], + }, + }, + 'EV_1KM_Emmissive': { + 'data': np.zeros((16, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint16), + 'type': SDC.UINT16, + 'fill_value': 0, + 'attrs': { + 'dim_labels': ['Band_1KM_Emissive:MODIS_SWATH_Type_L1B', + '10*nscans:MODIS_SWATH_Type_L1B', + 'Max_EV_frames:MODIS_SWATH_Type_L1B'], + 'valid_range': (0, 32767), + 'band_names': '20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36', + }, + }, + 'EV_1KM_Emissive_Uncert_Indexes': { + 'data': np.zeros((16, 5*SCAN_WIDTH, 5*SCAN_LEN+4), dtype=np.uint8), + 'type': SDC.UINT8, + 'fill_value': 255, + 'attrs': { + 'dim_labels': ['Band_1KM_Emissive:MODIS_SWATH_Type_L1B', + '10*nscans:MODIS_SWATH_Type_L1B', + 'Max_EV_frames:MODIS_SWATH_Type_L1B'], + }, + }, + 'SensorZenith': {'data': TEST_SATZ, + 'type': SDC.INT16, + 'fill_value': -32767, + 'attrs': {'dim_labels': ['2*nscans:MODIS_SWATH_Type_L1B', '1KM_geo_dim:MODIS_SWATH_Type_L1B'], + 'scale_factor': 0.01}}, + 'SensorAzimuth': {'data': TEST_SATZ, + 'type': SDC.INT16, + 'fill_value': -32767, + 'attrs': {'dim_labels': ['2*nscans:MODIS_SWATH_Type_L1B', '1KM_geo_dim:MODIS_SWATH_Type_L1B'], + 'scale_factor': 0.01}}, +} + + +def generate_file_name(): + """Generate a file name that follows MODIS 35 L2 convention in a temporary directory.""" + import tempfile + from datetime import datetime + + file_name = 'MOD021km_A{0:%y%j_%H%M%S}_{0:%Y%j%H%M%S}.hdf'.format( + datetime.now() + ) + + base_dir = tempfile.mkdtemp() + file_name = os.path.join(base_dir, file_name) + return base_dir, file_name + + +def create_test_data(): + """Create a fake MODIS L1b HDF4 file with headers.""" + from datetime import datetime, timedelta + + base_dir, file_name = generate_file_name() + h = SD(file_name, SDC.WRITE | SDC.CREATE) + # Set hdf file attributes + beginning_date = datetime.now() + ending_date = beginning_date + timedelta(minutes=5) + core_metadata_header = "GROUP = INVENTORYMETADATA\nGROUPTYPE = MASTERGROUP\n\n" \ + "GROUP = RANGEDATETIME\n\nOBJECT = RANGEBEGINNINGDATE\nNUM_VAL = 1\nVALUE = \"{}\"\n" \ + "END_OBJECT = RANGEBEGINNINGDATE\n\nOBJECT = RANGEBEGINNINGTIME\n"\ + "NUM_VAL = 1\nVALUE = \"{}\"\n"\ + "END_OBJECT = RANGEBEGINNINGTIME\n\nOBJECT = RANGEENDINGDATE\nNUM_VAL = 1\nVALUE = \"{}\"\n"\ + "END_OBJECT = RANGEENDINGDATE\n\nOBJECT = RANGEENDINGTIME\nNUM_VAL = 1\nVALUE = \"{}\"\n" \ + "END_OBJECT = RANGEENDINGTIME\nEND_GROUP = RANGEDATETIME".format( + beginning_date.strftime("%Y-%m-%d"), + beginning_date.strftime("%H:%M:%S.%f"), + ending_date.strftime("%Y-%m-%d"), + ending_date.strftime("%H:%M:%S.%f") + ) + inst_metadata = "GROUP = ASSOCIATEDPLATFORMINSTRUMENTSENSOR\n\n"\ + "OBJECT = ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER\nCLASS = \"1\"\n\n" \ + "OBJECT = ASSOCIATEDSENSORSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ + "VALUE = \"MODIS\"\nEND_OBJECT = ASSOCIATEDSENSORSHORTNAME\n\n" \ + "OBJECT = ASSOCIATEDPLATFORMSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ + "VALUE = \"Terra\"\nEND_OBJECT = ASSOCIATEDPLATFORMSHORTNAME\n\n" \ + "OBJECT = ASSOCIATEDINSTRUMENTSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ + "VALUE = \"MODIS\"\nEND_OBJECT = ASSOCIATEDINSTRUMENTSHORTNAME\n\n" \ + "END_OBJECT = ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER\n\n" \ + "END_GROUP = ASSOCIATEDPLATFORMINSTRUMENTSENSOR\n\n" + collection_metadata = "GROUP = COLLECTIONDESCRIPTIONCLASS\n\nOBJECT = SHORTNAME\nNUM_VAL = 1\n"\ + "VALUE = \"MOD021KM\"\nEND_OBJECT = SHORTNAME\n\n"\ + "OBJECT = VERSIONID\nNUM_VAL = 1\nVALUE = 6\nEND_OBJECT = VERSIONID\n\n"\ + "END_GROUP = COLLECTIONDESCRIPTIONCLASS\n\n" + core_metadata_header += "\n\n" + inst_metadata + collection_metadata + struct_metadata_header = "GROUP=SwathStructure\n"\ + "GROUP=SWATH_1\n"\ + "GROUP=DimensionMap\n"\ + "OBJECT=DimensionMap_2\n"\ + "GeoDimension=\"2*nscans\"\n"\ + "END_OBJECT=DimensionMap_2\n"\ + "END_GROUP=DimensionMap\n"\ + "END_GROUP=SWATH_1\n"\ + "END_GROUP=SwathStructure\nEND" + archive_metadata_header = "GROUP = ARCHIVEDMETADATA\nEND_GROUP = ARCHIVEDMETADATA\nEND" + setattr(h, 'CoreMetadata.0', core_metadata_header) # noqa + setattr(h, 'StructMetadata.0', struct_metadata_header) # noqa + setattr(h, 'ArchiveMetadata.0', archive_metadata_header) # noqa + + # Fill datasets + for dataset in TEST_DATA: + v = h.create(dataset, TEST_DATA[dataset]['type'], TEST_DATA[dataset]['data'].shape) + v[:] = TEST_DATA[dataset]['data'] + dim_count = 0 + for dimension_name in TEST_DATA[dataset]['attrs']['dim_labels']: + v.dim(dim_count).setname(dimension_name) + dim_count += 1 + v.setfillvalue(TEST_DATA[dataset]['fill_value']) + v.scale_factor = TEST_DATA[dataset]['attrs'].get('scale_factor', SCALE_FACTOR) + for attr_key, attr_val in TEST_DATA[dataset]['attrs'].items(): + if attr_key == 'dim_labels': + continue + setattr(v, attr_key, attr_val) + h.end() + return base_dir, file_name + + +class TestModisL1b(unittest.TestCase): + """Test MODIS L1b reader.""" + + def setUp(self): + """Create fake HDF4 MODIS file.""" + self.base_dir, self.file_name = create_test_data() + + def tearDown(self): + """Remove the temporary directory created for the test.""" + try: + import shutil + shutil.rmtree(self.base_dir, ignore_errors=True) + except OSError: + pass + + @staticmethod + def _check_shared_metadata(data_arr): + assert data_arr.attrs["sensor"] == "modis" + assert data_arr.attrs["platform_name"] == "EOS-Terra" + assert "rows_per_scan" in data_arr.attrs + assert isinstance(data_arr.attrs["rows_per_scan"], int) + assert data_arr.attrs['reader'] == 'modis_l1b' + + def test_available_reader(self): + """Test that MODIS L1b reader is available.""" + self.assertIn('modis_l1b', available_readers()) + + def test_scene_available_datasets(self): + """Test that datasets are available.""" + scene = Scene(reader='modis_l1b', filenames=[self.file_name]) + available_datasets = scene.all_dataset_names() + assert len(available_datasets) > 0 + self.assertIn('longitude', available_datasets) + self.assertIn('latitude', available_datasets) + for chan_num in list(range(1, 13)) + ['13lo', '13hi', '14lo', '14hi'] + list(range(15, 37)): + self.assertIn(str(chan_num), available_datasets) + + def test_load_longitude_latitude(self): + """Test that longitude and latitude datasets are loaded correctly.""" + from satpy.tests.utils import make_dataid + + def test_func(dname, x, y): + if dname == 'longitude': + # assert less + np.testing.assert_array_less(x, y) + else: + # assert greater + # np.testing.assert_equal(x > y, True) + np.testing.assert_array_less(y, x) + + scene = Scene(reader='modis_l1b', filenames=[self.file_name]) + for dataset_name in ['longitude', 'latitude']: + # Default resolution should be the interpolated 1km + scene.load([dataset_name]) + longitude_1km_id = make_dataid(name=dataset_name, resolution=1000) + longitude_1km = scene[longitude_1km_id] + self.assertEqual(longitude_1km.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) + test_func(dataset_name, longitude_1km.values, 0) + self._check_shared_metadata(longitude_1km) + + # Specify original 5km scale + scene.load([dataset_name], resolution=5000) + longitude_5km_id = make_dataid(name=dataset_name, resolution=5000) + longitude_5km = scene[longitude_5km_id] + self.assertEqual(longitude_5km.shape, TEST_DATA[dataset_name.capitalize()]['data'].shape) + test_func(dataset_name, longitude_5km.values, 0) + self._check_shared_metadata(longitude_5km) + + def test_load_sat_zenith_angle(self): + """Test loading satellite zenith angle band.""" + scene = Scene(reader='modis_l1b', filenames=[self.file_name]) + dataset_name = 'satellite_zenith_angle' + scene.load([dataset_name]) + dataset = scene[dataset_name] + self.assertEqual(dataset.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) + assert dataset.attrs['resolution'] == 1000 + self._check_shared_metadata(dataset) + + def test_load_vis(self): + """Test loading visible band.""" + scene = Scene(reader='modis_l1b', filenames=[self.file_name]) + dataset_name = '1' + scene.load([dataset_name]) + dataset = scene[dataset_name] + self.assertEqual(dataset.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) + self._check_shared_metadata(dataset) diff --git a/satpy/tests/reader_tests/test_modis_l2.py b/satpy/tests/reader_tests/test_modis_l2.py index d3064f7f92..876ddaf8d5 100644 --- a/satpy/tests/reader_tests/test_modis_l2.py +++ b/satpy/tests/reader_tests/test_modis_l2.py @@ -103,6 +103,17 @@ def create_test_data(): ending_date.strftime("%Y-%m-%d"), ending_date.strftime("%H:%M:%S.%f") ) + inst_metadata = "GROUP = ASSOCIATEDPLATFORMINSTRUMENTSENSOR\n\n"\ + "OBJECT = ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER\nCLASS = \"1\"\n\n" \ + "OBJECT = ASSOCIATEDSENSORSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ + "VALUE = \"MODIS\"\nEND_OBJECT = ASSOCIATEDSENSORSHORTNAME\n\n" \ + "OBJECT = ASSOCIATEDPLATFORMSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ + "VALUE = \"Terra\"\nEND_OBJECT = ASSOCIATEDPLATFORMSHORTNAME\n\n" \ + "OBJECT = ASSOCIATEDINSTRUMENTSHORTNAME\nCLASS = \"1\"\nNUM_VAL = 1\n" \ + "VALUE = \"MODIS\"\nEND_OBJECT = ASSOCIATEDINSTRUMENTSHORTNAME\n\n" \ + "END_OBJECT = ASSOCIATEDPLATFORMINSTRUMENTSENSORCONTAINER\n\n" \ + "END_GROUP = ASSOCIATEDPLATFORMINSTRUMENTSENSOR\n\n" + core_metadata_header += "\n\n" + inst_metadata struct_metadata_header = "GROUP=SwathStructure\n"\ "GROUP=SWATH_1\n"\ "GROUP=DimensionMap\n"\ @@ -146,6 +157,14 @@ def tearDown(self): except OSError: pass + @staticmethod + def _check_shared_metadata(data_arr): + assert data_arr.attrs["sensor"] == "modis" + assert data_arr.attrs["platform_name"] == "EOS-Terra" + assert "rows_per_scan" in data_arr.attrs + assert isinstance(data_arr.attrs["rows_per_scan"], int) + assert data_arr.attrs['reader'] == 'modis_l2' + def test_available_reader(self): """Test that MODIS L2 reader is available.""" self.assertIn('modis_l2', available_readers()) @@ -180,12 +199,15 @@ def test_func(dname, x, y): longitude_1km = scene[longitude_1km_id] self.assertEqual(longitude_1km.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) test_func(dataset_name, longitude_1km.values, 0) + self._check_shared_metadata(longitude_1km) + # Specify original 5km scale scene.load([dataset_name], resolution=5000) longitude_5km_id = make_dataid(name=dataset_name, resolution=5000) longitude_5km = scene[longitude_5km_id] self.assertEqual(longitude_5km.shape, TEST_DATA[dataset_name.capitalize()]['data'].shape) test_func(dataset_name, longitude_5km.values, 0) + self._check_shared_metadata(longitude_5km) def test_load_quality_assurance(self): """Test loading quality assurance.""" @@ -197,6 +219,7 @@ def test_load_quality_assurance(self): self.assertIn(quality_assurance_id, scene) quality_assurance = scene[quality_assurance_id] self.assertEqual(quality_assurance.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) + self._check_shared_metadata(quality_assurance) def test_load_1000m_cloud_mask_dataset(self): """Test loading 1000m cloud mask.""" @@ -208,6 +231,7 @@ def test_load_1000m_cloud_mask_dataset(self): self.assertIn(cloud_mask_id, scene) cloud_mask = scene[cloud_mask_id] self.assertEqual(cloud_mask.shape, (5*SCAN_WIDTH, 5*SCAN_LEN+4)) + self._check_shared_metadata(cloud_mask) def test_load_250m_cloud_mask_dataset(self): """Test loading 250m cloud mask.""" @@ -219,3 +243,4 @@ def test_load_250m_cloud_mask_dataset(self): self.assertIn(cloud_mask_id, scene) cloud_mask = scene[cloud_mask_id] self.assertEqual(cloud_mask.shape, (4*5*SCAN_WIDTH, 4*(5*SCAN_LEN+4))) + self._check_shared_metadata(cloud_mask) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 67e8071fac..67a0a8426b 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -51,7 +51,7 @@ def test_single_ds(self): ds1 = self._get_test_ds() comp = CompositeBase('test_comp') ret_datasets = comp.match_data_arrays((ds1,)) - self.assertIs(ret_datasets[0], ds1) + assert ret_datasets[0].identical(ds1) def test_mult_ds_area(self): """Test multiple datasets successfully pass.""" @@ -60,8 +60,8 @@ def test_mult_ds_area(self): ds2 = self._get_test_ds() comp = CompositeBase('test_comp') ret_datasets = comp.match_data_arrays((ds1, ds2)) - self.assertIs(ret_datasets[0], ds1) - self.assertIs(ret_datasets[1], ds2) + assert ret_datasets[0].identical(ds1) + assert ret_datasets[1].identical(ds2) def test_mult_ds_no_area(self): """Test that all datasets must have an area attribute.""" @@ -96,8 +96,8 @@ def test_mult_ds_diff_dims(self): ds2 = self._get_test_ds(shape=(3, 100, 50), dims=('bands', 'x', 'y')) comp = CompositeBase('test_comp') ret_datasets = comp.match_data_arrays((ds1, ds2)) - self.assertIs(ret_datasets[0], ds1) - self.assertIs(ret_datasets[1], ds2) + assert ret_datasets[0].identical(ds1) + assert ret_datasets[1].identical(ds2) def test_mult_ds_diff_size(self): """Test that datasets with different sizes fail.""" diff --git a/satpy/tests/test_file_vii_base_nc.nc4dbaf523-1225-11ec-9dc0-0a1f71143ab9.nc b/satpy/tests/test_file_vii_base_nc.nc4dbaf523-1225-11ec-9dc0-0a1f71143ab9.nc deleted file mode 100644 index a8357c13d03b1387971881ec2f15edcce1f61f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25395 zcmeHQZEO@p7@q51kLz*Jqm*xylMe;NatAHcDA3v-(6qFbViXaVrME3>?#sJ9garH| z#)vV95lM_eg+`?s(?p}F#1LZ){zEZ@kQg-4#2*IHK>T4M&O0;j?e$uqn3m>}chbAL znSFP5=Go_FZ=ZeV?F(xgSC8{e_mz0P4AT{rmUhaTklK*_{#^u_??8rWrGlu@c>S#x~Nn zZd-9v&)S`ABDbmFFKBj2D7-v$H@q(mRfno-Yis{%JotG*_cd+^2@g}4WA{CCz{&-k z6e$oljZ8Le#?6GSM-AKfP>hl>&n>XsAIlk2||Of}|_BW-A@@8}Ty1@^!o8=KZe zT05HBTJ?^G`j!auKPW7uZsx#I%U6Mo0SRjKO>kh?S{tH!6^S;@$XqO5!{-! zgNdZ=Y}#(5En{oUtO}|W4l(EuKtG=OVX%6uX?I4usvE7i6=eZV3`y^x=o~*LPnV87 zcWNMpQMr*}K2!|vP^2nS48x%t#87@`8q4R-8HgeB5A&g6s4;z&1plx)2gt)~OwC2j zLpgbUu)Fu~ffyqHFdr(0=hVbpq!`{X59Nhz;cMLr!+Tt=xj>&1J|QCi5W~WD&XeCRl*DY3S#F-xu0Bsjz*J+Ed|KkuG)_wm$z(ceB@BKk=s!8} zNnDab&Z6o#&==-^M9!e)EC5Y86KqRU#|8#7ILy6M_zNzBa5*S!30gT&#@~2?ZTV#h zWIyCJueN`qnFhVH?K$7!#CK8-OjUwU3bZj z3Y`Z&N;5w%yM-Jr9vSJa4ejY<%1ra;9vPu~&*r9}plmnOAabu*vWV;6T(MqJT~%8Z zUbHRRRkI>o6<$&m?pZKn9Ai&&X_Q`s0dashKpY?r5C@0@!~x;}aez2L93T!52S$?v z`3l8?86X2N_7?d2@#LQaclsK4$`ew6@cuJwJ1t}YaEbsK04nMalqIDf5E~I678G^< zRgwjE5WTEQM$(G~1__=a(vc>moRl8pH6o$Y1(s*+-LwZlMOR;R5rk|1F@sf;_$lBK)*ooLAM$>;HLR!zRo8E_BAJ2?ULHi@QG*uE+ot=gjXDD zQH&j0A-AK175bsVf*yLnTPV*p*A2?uAJUe2ghQj_O+4oDtP!*9oo}~EgM;rkPf#wJ z*O&DQdvu{CwS%#f_tA?mAPx`*hy%m{;s9}gI6xdA4iE>31H=L1!02+|W@u5aIw>ZM zq84>oiAGn|qUL7*tQBgBT04ykoXTR!M7L#Uqb8~w9wGg?+_|MrF~b%HD8TGW)g2su z5eil?<%>|T;;Bb}a^GMgRL+y@rioDU1Un)WmS3%@=S#4H_4FbPhy%m{;s9}gI6xdA z4iE>31H=L10C9jgFuEKN5|9&c4@0k@M@wPu>lbkEBo9~vX_L$t4~y16d2WZY<6$x} znoV=TB$?2YU3w~=jAlFSp8MrK9^umB#Cw~XZwqcKd_ivm&Fsc%I z$Y4Iys7m{{%2p4{EEoBwSRzvem)ux{G^t?KoSn8frvi#9zzw4&tx_R!>R9zyR(*xb zVx{95*P*n97*dCeK5NkHtWQM>%x&vcP!>tHXQ%hH?CM1orHs|dvRCB+l~<~Ks>)}o zJg9O;i4Y(J2mwNX5FiAK2!Y}HEp)8Ne+#uoj=nQoSez(wELzWR3BiL_xdLJFqms_* z)`y3*cIb__F!=m<;4Mtt%0OiCHM`SB)QryAEO&4J@%(!^oOxIizK~*&=&Aqjw&#?>9pa)u8p2{5{zM$s z%G^N6Sa|pk33IqrlYIPL0i|w=8B>dsg!y1^<*E1;2j^c5Y14tG`8dymN|zg#=2UbW zse+jJFRE|DzHt|hL!?#sJ9garH| z#)vV95lM_eg+`?s(?p}F#1LZ){zEZ@kQg-4#2*IHK>T4M&O0;j?e$uqn3m>}chbAL znSFP5=Go_FZ=ZeV?F(xgSC8{e_mz0P4AT{rmUhaTklK*_{#^u_??8rWrGlu@c>S#x~Nn zZd-9v&)S`ABDbmFFKBj2D7-v$H@q(mRfno-Yis{%JotG*_cd+^2@g}4WA{CCz{&-k z6e$oljZ8Le#?6GSM-AKfP>hl>&n>XsAIlk2||Of}|_BW-A@@8}Ty1@^!o8=KZe zT05HBTJ?^G`j!auKPW7uZsx#I%U6Mo0SRjKO>kh?S{tH!6^S;@$XqO5!{-! zgNdZ=Y}#(5En{oUtO}|W4l(EuKtG=OVX%6uX?I4usvE7i6=eZV3`y^x=o~*LPnV87 zcWNMpQMr*}K2!|vP^2nS48x%t#87@`8q4R-8HgeB5A&g6s4;z&1plx)2gt)~OwC2j zLpgbUu)Fu~ffyqHFdr(0=hVbpq!`{X59Nhz;cMLr!+Tt=xj>&1J|QCi5W~WD&XeCRl*DY3S#F-xu0Bsjz*J+Ed|KkuG)_wm$z(ceB@BKk=s!8} zNnDab&Z6o#&==-^M9!e)EC5Y86KqRU#|8#7ILy6M_zNzBa5*S!30gT&#@~2?ZTV#h zWIyCJueN`qnFhVH?K$7!#CK8-OjUwU3bZj z3Y`Z&N;5w%yM-Jr9vSJa4ejY<%1ra;9vPu~&*r9}plmnOAabu*vWV;6T(MqJT~%8Z zUbHRRRkI>o6<$&m?pZKn9Ai&&X_Q`s0dashKpY?r5C@0@!~x;}aez2L93T!52S$?v z`3l8?86X2N_7?d2@#LQaclsK4$`ew6@cuJwJ1t}YaEbsK04nMalqIDf5E~I678G^< zRgwjE5WTEQM$(G~1__=a(vc>moRl8pH6o$Y1(s*+-LwZlMOR;R5rk|1F@sf;_$lBK)*ooLAM$>;HLR!zRo8E_BAJ2?ULHi@QG*uE+ot=gjXDD zQH&j0A-AK175bsVf*yLnTPV*p*A2?uAJUe2ghQj_O+4oDtP!*9oo}~EgM;rkPf#wJ z*O&DQdvu{CwS%#f_tA?mAPx`*hy%m{;s9}gI6xdA4iE>31H=L1!02+|W@u5aIw>ZM zq84>oiAGn|qUL7*tQBgBT04ykoXTR!M7L#Uqb8~w9wGg?+_|MrF~b%HD8TGW)g2su z5eil?<%>|T;;Bb}a^GMgRL+y@rioDU1Un)WmS3%@=S#4H_4FbPhy%m{;s9}gI6xdA z4iE>31H=L10C9jgFuEKN5|9&c4@0k@M@wPu>lbkEBo9~vX_L$t4~y16d2WZY<6$x} znoV=TB$?2YU3w~=jAlFSp8MrK9^umB#Cw~XZwqcKd_ivm&Fsc%I z$Y4Iys7m{{%2p4{EEoBwSRzvem)ux{G^t?KoSn8frvi#9zzw4&tx_R!>R9zyR(*xb zVx{95*P*n97*dCeK5NkHtWQM>%x&vcP!>tHXQ%hH?CM1orHs|dvRCB+l~<~Ks>)}o zJg9O;i4Y(J2mwNX5FiAK2!Y}HEp)8Ne+#uoj=nQoSez(wELzWR3BiL_xdLJFqms_* z)`y3*cIb__F!=m<;4Mtt%0OiCHM`SB)QryAEO&4J@%(!^oOxIizK~*&=&Aqjw&#?>9pa)u8p2{5{zM$s z%G^N6Sa|pk33IqrlYIPL0i|w=8B>dsg!y1^<*E1;2j^c5Y14tG`8dymN|zg#=2UbW zse+jJFRE|DzHt|hL!Hedq*3q}HhwZ)E&$ihZfVD5`-;71~KrM=rO>DqdGi=YsY zC}JdvB!2zSkeJ{P6EP+jqCbsh;g_2D#{~7C2nmv)F_8$K_nhOiOtGzUFb!Pl#9q9&K)UBtEm_9qEa1Dzn6rWvSI4|}J=D-xBlGZoSv{3C zQX|o<6*H}wF1q(5Xv=|0EjPDrE+7@ zjImo!W-q9XxdmXF3t_GVm!y%>v%M9famLmvJ7sf9JJe9rRcssKFSd49AB3&uyIK#s zXBm1llQvRTHX4gtC*5+#+{zU@dxLAzn&nZhb7ia8X{VKWE?cR}6d-soDwFBdh+*Xt zI(t}p$V2>nyUZ<@MtytYHJ<+Prf#5<#{bQ^j!t?iQ9!1f(J2%Rw)mTyo4qZJ0l{a= zb~3TJ9yepdmfRfBv6g?Z%a)$CqFLJsDm(4UMk;HWIpD}mD(9X4+)>r@UyI+s>}uNZ(*re_wPk+|d(Z-XSQ{ScRz7*U=l{PNG&j zw^(b-sFC&Y|1n=mx5AwpdPOt0Kc3`!5@%5r(>u&`u8FFYlAJ%OBxjV5$hq z<9q({U(wPCBX`kG24N?Au|pz!QJVjAdAa8}EXU6A@sr<`Mi{w^c5(>s^xrE8Po2Z^ z3e;q7jYx#IYuYkEMU%s+J^muX$Ysnc#C;{kWiJeXFfO|U%$N4M#7K=fIZ}VJQXYc= zX>67|CmyLcgR917^U<)$9u33kw3#qcF@ALtE!{9Gs_P0~jnT@sm_3r$^6|c@V4Uyi z8r;IzJnjb9fkys;%R64Buobj0BAita!Meh{MEdH5>hl}J{XI~E_q1Y}XVr}Z!`mio zwRpX3DesRrQ4-nwdc0}D`ygxw*QH z9q(x=r`Ixz>ktEx4UvIJUpNw#I>cNq34jg(&tI~-(%4naQU>)3TX0rR_=~($9auM! zdV)#?T6~^??Nt7@&0DH>M^%OL>>c*@^k=>^&^xJIJ@ts}wUGQ_QM!2_2RUA2HC)~R zu|B-nOlNeHKTZN+3LYpdv3(iarJL{^pl#Jk{%C-!`fVY9i$An-G%?)V7W4-L{?#io zf3z`nU>$u31L6R2fH*)LAPx`*hy%m{;s9}gI6xdA4%}G|6iOa7A{>^n;}A2+la~j$ zKyYQ1&;vy9WX!TmSt#@X2-`r30g8HFO1?4O!8j;KEfpbT`Mt-$NyjvW<3Pv@gtuT| z<*f_Hfgl(_8N+iR_$Bw@++&5u4#hZIt{RtG&fO`-VR#T)3>`);eZw^)NSI&P{rr>A zTQ{hJ1>w#vP!qeAms>>6=A*f1Je!Lp4Qo%Wirv|F`RBLt8rZ=&G{xAUG>nJO+Q}^< zyEGR@CCy9Z%$UW+u4sB#1dvA)`iL1z=!pYSSqX!yFUsvhcF-x5C@0@!~x;}aez2L93T!52Z#g20ph@&<$zSN_}fweWO&f^NWFB3k9h(mp35UV&V|UIU2il zvKT~y70P1pE?4c5&^v{DfwGu5ioD!gma-V%agh*f%31H=L10C9jgaA!Fngrxj*jW|IK3KPY)>bmI~-&Zecy@J2^3xiaa!peNO zOG9ChO2$kla&hY!J^>IU_X_yV&tlkA=nFA4(Tu6{Ngb`xZQz)%fb;d-SYgb_!W59! zc3Gj}u@xUl&8&DjJdE){JGqIjeo$dL_rO$QzExA44o`}4N8fB6vQ-SsatXWR=FE2xpBsoQegr38>qY{cfmJFROi?W|MVT4?j!x~U2vquWV}U3dij+_ zYec+?`ZEQHQ6;>PV_5oF7N_jRzY>9xN*#C<{sn?vJ7ndxubEeGN}lm@dey3!JlIPF JD%HJb*1uSO+W!Cm diff --git a/satpy/tests/test_file_vii_base_nc.nce3831063-1229-11ec-b972-0a1f71143ab9.nc b/satpy/tests/test_file_vii_base_nc.nce3831063-1229-11ec-b972-0a1f71143ab9.nc deleted file mode 100644 index 4196aad0e37ef02962bdb632d419394b7b36653a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25795 zcmeHQZERCj7(Tb{N;kR>Hedq*3q}HhwZ)E&$ihZfVD5`-;71~KrM=rO>DqdGi=YsY zC}JdvB!2zSkeJ{P6EP+jqCbsh;g_2D#{~7C2nmv)F_8$K_nhOiOtGzUFb!Pl#9q9&K)UBtEm_9qEa1Dzn6rWvSI4|}J=D-xBlGZoSv{3C zQX|o<6*H}wF1q(5Xv=|0EjPDrE+7@ zjImo!W-q9XxdmXF3t_GVm!y%>v%M9famLmvJ7sf9JJe9rRcssKFSd49AB3&uyIK#s zXBm1llQvRTHX4gtC*5+#+{zU@dxLAzn&nZhb7ia8X{VKWE?cR}6d-soDwFBdh+*Xt zI(t}p$V2>nyUZ<@MtytYHJ<+Prf#5<#{bQ^j!t?iQ9!1f(J2%Rw)mTyo4qZJ0l{a= zb~3TJ9yepdmfRfBv6g?Z%a)$CqFLJsDm(4UMk;HWIpD}mD(9X4+)>r@UyI+s>}uNZ(*re_wPk+|d(Z-XSQ{ScRz7*U=l{PNG&j zw^(b-sFC&Y|1n=mx5AwpdPOt0Kc3`!5@%5r(>u&`u8FFYlAJ%OBxjV5$hq z<9q({U(wPCBX`kG24N?Au|pz!QJVjAdAa8}EXU6A@sr<`Mi{w^c5(>s^xrE8Po2Z^ z3e;q7jYx#IYuYkEMU%s+J^muX$Ysnc#C;{kWiJeXFfO|U%$N4M#7K=fIZ}VJQXYc= zX>67|CmyLcgR917^U<)$9u33kw3#qcF@ALtE!{9Gs_P0~jnT@sm_3r$^6|c@V4Uyi z8r;IzJnjb9fkys;%R64Buobj0BAita!Meh{MEdH5>hl}J{XI~E_q1Y}XVr}Z!`mio zwRpX3DesRrQ4-nwdc0}D`ygxw*QH z9q(x=r`Ixz>ktEx4UvIJUpNw#I>cNq34jg(&tI~-(%4naQU>)3TX0rR_=~($9auM! zdV)#?T6~^??Nt7@&0DH>M^%OL>>c*@^k=>^&^xJIJ@ts}wUGQ_QM!2_2RUA2HC)~R zu|B-nOlNeHKTZN+3LYpdv3(iarJL{^pl#Jk{%C-!`fVY9i$An-G%?)V7W4-L{?#io zf3z`nU>$u31L6R2fH*)LAPx`*hy%m{;s9}gI6xdA4%}G|6iOa7A{>^n;}A2+la~j$ zKyYQ1&;vy9WX!TmSt#@X2-`r30g8HFO1?4O!8j;KEfpbT`Mt-$NyjvW<3Pv@gtuT| z<*f_Hfgl(_8N+iR_$Bw@++&5u4#hZIt{RtG&fO`-VR#T)3>`);eZw^)NSI&P{rr>A zTQ{hJ1>w#vP!qeAms>>6=A*f1Je!Lp4Qo%Wirv|F`RBLt8rZ=&G{xAUG>nJO+Q}^< zyEGR@CCy9Z%$UW+u4sB#1dvA)`iL1z=!pYSSqX!yFUsvhcF-x5C@0@!~x;}aez2L93T!52Z#g20ph@&<$zSN_}fweWO&f^NWFB3k9h(mp35UV&V|UIU2il zvKT~y70P1pE?4c5&^v{DfwGu5ioD!gma-V%agh*f%31H=L10C9jgaA!Fngrxj*jW|IK3KPY)>bmI~-&Zecy@J2^3xiaa!peNO zOG9ChO2$kla&hY!J^>IU_X_yV&tlkA=nFA4(Tu6{Ngb`xZQz)%fb;d-SYgb_!W59! zc3Gj}u@xUl&8&DjJdE){JGqIjeo$dL_rO$QzExA44o`}4N8fB6vQ-SsatXWR=FE2xpBsoQegr38>qY{cfmJFROi?W|MVT4?j!x~U2vquWV}U3dij+_ zYec+?`ZEQHQ6;>PV_5oF7N_jRzY>9xN*#C<{sn?vJ7ndxubEeGN}lm@dey3!JlIPF JD%HJb*1uSO+W!Cm diff --git a/satpy/tests/test_file_vii_l1b_nc.nc4de127a8-1225-11ec-9bc4-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l1b_nc.nc4de127a8-1225-11ec-9bc4-0a1f71143ab9.nc deleted file mode 100644 index c78066f6ea02ad6e15aa7ec928e9836aa3d6c853..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189138 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 T0R|XgfB^;=V1R+Qx`F=yHXD@g diff --git a/satpy/tests/test_file_vii_l1b_nc.nce39a0c29-1229-11ec-9912-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l1b_nc.nce39a0c29-1229-11ec-9912-0a1f71143ab9.nc deleted file mode 100644 index fbb39f2014c6daaa802755c7111671bd1da9fde0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189641 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 F;J+fTRv-WX diff --git a/satpy/tests/test_file_vii_l2_nc.nc4ded0774-1225-11ec-bf73-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l2_nc.nc4ded0774-1225-11ec-bf73-0a1f71143ab9.nc deleted file mode 100644 index e851894b6eed90f851395dc4b3805aba22e33a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12192 zcmeHL-D(p-6rSCrFEeAl?ae&d!{~#uloeML0u}vomwf%s1bBbC}Je$xOCK zJFcnWFvGGX%j$X2l8_yZn<1?@nVD82Z`47*EuhFQ4C%C*%6yklKR7Bu>CS>>+q1vO z+R*_99el9PaI8n8;ClCf2q+1|*cp7-lRcOldfWj&AOmrpPTPV%1deU^(W+xN7aLC1 zsd*MG<)tJdbV4{HFIsJ}YAv|SPNi8@#bluY;UcT78(b=G&1t?uIR0vdcl-C_oonAa z;NvWvu(95PFQ>%8y30<*v#pBleZw8OjeUR1u3cK$@ZtB2D@qJzQ58keSrEX2YvwvkVlO6&-40?@`O%}Pucbo@wiGV_S%Jlswr2ovk+tm5T)@zPuWU_kM<#K4c^_o7r z=;^h(*X~-f8?HTDapJlx$piyHDj&a>MF5ahaJ+lvxv`8}b;~TuPovlx-3Q0#QpX7)E{!#S(lvZJLpma#Rkp> z{ax665IzhKJeTQy16%DA78R=Qu22&^11!b`!4C)u!l>69Ww&N~PIJ2~`0>FUf))mV zWk&dM2JQB7b@QRx($42fGwc}m0M$cIhO7?<5l2AllO^*IwEbL%H1%X{>v_?bypGGo zlyjQ*L5WmgDS#jW2&T=fIc*jU)AA8qz?_5hC1pcfSaTB64GUMJBNd#*IdO!D)Cd-%?0HgZv95FF6g!AF0t1 zo>F)+NR7qEQWQYM`fEXYKhyh}N7$63S0b+m{AO?s5 rVqhN_c)z}$qAzhk8Xygj21o;>0nz|zfHXiFAPtZPNCTvS{nfw^rmfTk diff --git a/satpy/tests/test_file_vii_l2_nc.nce3a65fc0-1229-11ec-ba9a-0a1f71143ab9.nc b/satpy/tests/test_file_vii_l2_nc.nce3a65fc0-1229-11ec-ba9a-0a1f71143ab9.nc deleted file mode 100644 index 408b43d50c4e2fa8d2669f123e09d99555da5413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12192 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 B^L+pS diff --git a/satpy/tests/testingcfwriter22021253105311-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter22021253105311-viirs-mband-20201007075915-20201007080744.nc deleted file mode 100644 index cabad65bf66c6c3ff3f51e667d4f719d563b66d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20402 zcmeHPZ){sv6+iZK5+`-qw6yD10#BNLS>ZA@ZJps5m~uuTj!VCom73D{coLzx5&gjCM&-h1pg zi<_=$Dc$ak{O)__o_p@Ozx(H%dvor4cxW)y-nOnS7!H$!izYlbswpv(@a$dDKaCCz zjs@FC0>Sl)=ro%&$+IwS3sL|q9UZtn5yX{fP)8KG6*mqoqcDYt3Z;tgO;5QcpFYO) zCjKEqc4pG^B57ht4l^p&$wI|1dvl7f&+sKYH|x9k=%Kmj;W^(c7mJ^*Wc|Z)(Q+x; z6YGg@j&0u@k459L9b32Th{wC*eZ5<5-yZoiN^vNn1t-d-8CIZBE>)CpR1iueQk&!5 zw?~pt*P-Q_IWv;j=amn;o?mb^J759(jO$fc#?GEiCD+g8$9ML2Z|jb4n#_-H-N_~Q zbjL|Sr|)09`{;R%ECm9qIXeXdfdJ$nNbE#_Wd}DDW5pp#O>Lk!pTRTV9MdSDF&TcZ zxQNztstismEo>cmjtqd+q1B867oQnXI`<~ZWiMYSF{qWgVxb%tr-HBSGFjdIcBOxNW zh)}IxRQzlypY`&YQg+H!vez2fhrRNBZVufmGndI#@r6oFoZlcfT`KsxKLK9oG)46F zqp$3|dY$B-2DU?{1_Jjr?IftpRp}%r{!k7}0~7tnbfaCSF3oBP1wsH0AuxN=(RaAs z_x8XqYI!s5I_0=wSgLc(($a0U@@)8g51sq%!ClgP63^b7JNR;_y}e~!XK?+h&SOOD z`$G>aYV*3Ae|+NUpDpKsyy}sV$F%&R@oYcW;c1>9ZLkPf1S|p;0gHe|;D$j!?2HyV z-LI9d8lh|}U$%*SNvY0T(C> z>jMEsdA>XT$y?u)#vyug6;g?+2INh63WUUJbc$L3f-w}4GB^6QH;~&|4UsFOpI6l& z>Zjgi)O(S$MFvqCR<^6viYiqo7QdJ+PP>b8H(F2;z4svOWvo`(SPmmORn8a23%t5q zToCgj!@M=>``03X9O!VR3jTE7johObFDs}6y4DtH!+X;E=@#b1`V9@JaxStm1+Ev? z@Pz{;&wmDnFTZ=_kH9OeaCQO{P2kk>5Jw)sI?bUK6oUq1$y9PIIg&_blm>k)5*p;Q zezxNJHC6Hj-YdW|o5J%~#fz<-rS+r-e0wFzt@Vf#KUo!phO%_fshmFdh{@7?v*HgK z)v4(~Iyn~qky>gHz4e{c=>mJ&{uP{(HSvq)vtAT0-Qwh>*2Q8-q8Egells74;>gF#+Pt@QKHA&qF*^u&E; z_}0Jiv`~5D(fvBlb-7M|_OH`sP3wgsM`vVfodioL~Y?4L5B481)2v`Ix0u}*_zzu{zBfHW3`@3OH z9-rq`!;r3Ds%t*5-*|CXJe6ioSrYxk2Tfv;7ovSMOI`e^Q#|8+ zC%$14uef;N!0!FSDMsR1&#k4`3Bgln_uA`c#}oaWY{NA}K(&8s9qx7QR@cmR-K4HZ)HQxx=c#M-x(45L?*q|m zRxc~~@(`H+o_XKtg8$ij2Gan7yl3QD-ZS!iE>0_@79QIW zfFx!-xHjex&HdRKx9FB8{7JfnzdryEX8bfSpSxJ(s|0vOh^ISd>l!lEqxbrpJrbcM zpNWZbJz@eMZh9p5wHkY N1S|p;fe#G={{;z%_R0VN diff --git a/satpy/tests/testingcfwriter22021253112603-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter22021253112603-viirs-mband-20201007075915-20201007080744.nc deleted file mode 100644 index 6181e8ab2a3cb22e1c700b7665d4d656317c66d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21197 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 diff --git a/satpy/tests/testingcfwriter32021253105311-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter32021253105311-viirs-mband-20201007075915-20201007080744.nc deleted file mode 100644 index 8ef01d51e7ee0133ca4c4785e9bc02b0807e91fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18318 zcmeHOZ)lT87{BE0pP0V2wN{<3j8JrQYa5eVYwcENNmCVTyR{+=w#Br0+oq&Reerbscvl zx!iNlJ@?%2?%wx#uFoCa)zw|;UFUUsJdDz9m5%R}lz^(ZeCgxw`gV2oyDNKL?s`Eq z%2XY-Da^fY<^oG~HNM|<l+G8JtnDj>gkY%FYPBR>c>xt*B$ge1jR^M8>gGiNvOK)S1ZmQb}KPpgGtS*wz#b z_=170~m?;H^QpqW*R& z4LxV4CM?^DTaq2HfPKoc(_BVJb7RtShGN4VE&eutuyHgtyrm=P4>tRQOh6}pZ)-X_ zAdzJ*S1oVO+%A_3a*!xDOki2fCyHamlaG~pK{1{}ng2K}QJzr^eiB@at*R3ZjAg8F zcBpK2g4JNP90lHeq*v(N5=y1)SUkx=P0#8U%JJ?*q8tUYLC#T`g0iP`U_gL~$%j&1 zyZ45B2X^=MMg~HiJsivBXf``N{&mCozR<2cq;*MAt>tLXOEB0od15|zVcTDj0giHZ z^J!W2nc^_(ppC)Tmsm=@oqNMVOK6BsMhrwwvkB-3kFNN5JT@B%64{PP$*zmE6HUgV zb}W*Nj$1^iwxFgpS;Dt`(jGfy$_UYm+l0Ow} zgK7i>_kCR?7|o(AlGB${9-3gr{#MIqyBbTG*g~!n0Egt7K4ZvV_#XSE^HQ#Dq*B(L zPz(z#j%l{=T&?)k^IJ2!{=s704xBipmIsHqRX>t8x3h2wz$r9A(2;;{`^ zX>u5QzXr98Wev#HD7i|=YBUm2=Y}#AQIqL=<43eMY9Vrk?^!Vn#&)ol3f6L)H#57? z8$8=u;Zb$R6N&xN#H2MRcQJ>Gv0H~=FT-2$aycBy@l-569OvHU+=4hS8szz?clsiL z9O&>t#huBRWxgn#mnv2bU2{%a&+dVJY%S-6|Aq+^E$8q|f$NP`{EH_@&MyPQ3pWp5 z0bU+~v*8*k1*epU+Xp38Tp*`pP3dqEKSX{xzWPf%8-b|;=I zNJb)+r1?ZS`PJ|H{=2)gae>{rjE?}&^FfW=hwX{wi&a9~6{k=$-<<8w-=2|&wmrEr zBIQpf2tWTZIwLp7dY5ZGD0lPfDtchnfThDxPzPoQ_^TD^ZQ7fnlznCG?+|4%E0`HH zrdO8dLA**-|t)WWD#{t5-PX&a^Ys z*CR%W2P#iAVr+CIdfGuAQX!q*h(xD@721nLCpq-AETq%9G0{m*x$Krbs`7xpb@Rnj z7e61rcxq$7zoo5-6WRpfNx?zwDW`t1i;xQGUP;c!Vu7ahqFZ8sLhMptMAGy)m{jetf#BcKuZKO%szve|LL zGW3e#g3WrwE*U)fQ{DiLMV#n}h-#vXmqViwJJ4$SWZ0Zn@*y}bcexHhOgM-Pnr$+Y zwL;!ww5@b1F)8At3gbg5?uqhih}rFtm+(}~?kmwLD`6!^oKd!xUw1^n6h5+rN8He) z)|4Y^i2~~o$z*P1{7PRga4UP?PhRc=3-soJxIR82#No;)*u{v$MFbS|B7G3~G&Xao zYTiJewlDh%|am|Ch2o;mw`zQ%V%4nHuBX^u%_DwD=kKKRbJ o-xu?i778wVZvk(KqU;DAoofU%0vZ90fJQ(gpb^jrENuk-0mF&J(EtDd diff --git a/satpy/tests/testingcfwriter32021253112603-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter32021253112603-viirs-mband-20201007075915-20201007080744.nc deleted file mode 100644 index 6b84a4afc480dfe07d58de59d212730272c87624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18864 zcmeHOU2IfE6rQ`g-LCEJ59O~^9u^)90$p}XDFsAmcDGP0ZPOB>(YP$#Te`U2ZSLOI zt|mf!F_@SbUrY=LQF%}aL81u{7z`$AVj_|7U}AjGXwo-%@Bx1!o^R%!cC+>tLTIFB zhHPi=nRCv}d}r=(&g_{JdlTJtH7zv)B@_|?(I~(2pWAM^(4#2)%0yVe5|LkuJH*2ERAv)Kll`T!j&>x@x>6eB1HeP`J!V_j9Ga{H7}*AO17)# z^yH{*n+G9aNP&U#owwD%U4SVe@IjslAp~eSPhbe$>P0TLqqh8dBVcffh>uh{mH(ep8menP`s-* zDNF(ZR;!XyeO>#LV1pE9z)~f5nXK`nRfzMdl7HX%{M?TI_}(XYgaOYHs-^b50zy1i zrek2q`u)&hwktc=OG~Hvq$%1H*|BVfxXV$5Fpm!3&0XczE;{LaCT(X@`Sh4Yt(ebB z`mn^fT{vnDV+Ey3so_Gw&SdknEX_4A14B5G&pJg{7=kQ3_T$nUUoWKfg}72j{ZZMY zs{h#fQ?B(_;+?1RimK$_8$X?R36@i~ZE8?W?&1}}Wq39M{5BX<*W48Z`pv?{HTQ0H znB$(UK2>J*n}418*>i27mv5H7Q9{jc1nQ}0hYx)gsH>}PS?ycfwE8&hCc6VCBsJL5 z{PDSypVrfYX?ita6D@OiB)yxYPSSp=i$*{rpb^jrXaqC@iv|Jqaf0GE88C?%&-^Z( zMjsW0kG#Kz)sQ5?^oc`kI#K=g_a<#(4RrHKCk|TFmMjYS|!FLvZpFj8rzNi61 z7rJ1-zsl3^7p^x8Nw@rZ_R`Y~sSuappHrD}8&}}T2(Yi{r_luKK~rVA%!DL@NnNp)zLG!~XGHEAWwA^C{DDo&g+Dw*CDGvFvzo;=vqLd*d+E>jU#xmyXUC)Dx^i|KPUSyZn4Rhm z_f0?RcD-Ob)y9}I2;LKXun_KPr+R%)Lt=KPI=x(}<--g01{eYNOhfo{g*>kfa1L&G z^RnKlX!j&@%)e7TL}>APBoL1*&{l%ExFMlDoDn6|sk}O8)TX#g<;_hL> zi17>m_R;GXng1^8J@NitsS}$U6`nEgQ{184-l@Hk&ifM6`8b8wAJbV654e)fr^8HV zJ=JnlLOkr&bndzN>Y1ybj9opmE*ja=*-C^?NqAIpusqk?FRY1DNms|;vvlrPaSJhB z_P;#SbgdE42xtT}0vZ90fJQ(gpb^jrXaqC@8iB=zz=6SJ5~s+Vw8OP~km@;|YaGbC z9DF{&HOJYW3Uq@;KqH_L&3YU((q_<(hwM zX86m0Ed}kZ=?fotdC4-Hm<8vkf6-p@9H?lLMnEH=5zq)|1T+E~f&VW8Drd3AZ>+-{ z?>f8M>xw4j6(g^Ta}ZEcNn^+YtdYFP^5YAd#40aof}dq#WR_044Fi+yDRo diff --git a/satpy/tests/testingcfwriter42021253105310-viirs-mband-20201007075915-20201007080744.nc b/satpy/tests/testingcfwriter42021253105310-viirs-mband-20201007075915-20201007080744.nc deleted file mode 100644 index 8539470a831b6868a4d0795a4baa9d0c3c3095b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40463 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 YK_j3M&x9660YErHSO5S3 diff --git a/satpy/tests/writer_tests/test_ninjotiff.py b/satpy/tests/writer_tests/test_ninjotiff.py index 76fc42638c..ed9db0f8d4 100644 --- a/satpy/tests/writer_tests/test_ninjotiff.py +++ b/satpy/tests/writer_tests/test_ninjotiff.py @@ -128,3 +128,17 @@ def test_convert_units_other(self): ds_in = sc["rain_rate"] with pytest.raises(NotImplementedError): convert_units(ds_in, "millimeter/hour", "m/s") + + @mock.patch('satpy.writers.ninjotiff.NinjoTIFFWriter.save_dataset') + @mock.patch('satpy.writers.ninjotiff.ImageWriter.save_image') + @mock.patch('satpy.writers.ninjotiff.nt', pyninjotiff_mock.ninjotiff) + def test_P_image_is_uint8(self, iwsi, save_dataset): + """Test that a P-mode image is converted to uint8s.""" + nt = pyninjotiff_mock.ninjotiff + nt.reset_mock() + from satpy.writers.ninjotiff import NinjoTIFFWriter + ntw = NinjoTIFFWriter() + dataset = xr.DataArray([1, 2, 3]).astype(int) + img = FakeImage(dataset, 'P') + ntw.save_image(img, filename='bla.tif', compute=False) + assert nt.save.mock_calls[0][1][0].data.dtype == np.uint8 diff --git a/satpy/writers/ninjotiff.py b/satpy/writers/ninjotiff.py index 54756d8340..033a25859d 100644 --- a/satpy/writers/ninjotiff.py +++ b/satpy/writers/ninjotiff.py @@ -173,6 +173,8 @@ def save_image(self, img, filename=None, compute=True, **kwargs): # floating_po raise NotImplementedError( "Don't know how to handle non-scale/offset-based enhancements yet." ) + if img.mode.startswith("P"): + img.data = img.data.astype(np.uint8) return nt.save(img, filename, data_is_scaled_01=True, compute=compute, **kwargs) def save_dataset( From 82b84a653417101d072d1e120ee75bce97caf74f Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 10 Sep 2021 20:13:57 +0800 Subject: [PATCH 09/33] update add_bands_test --- satpy/tests/test_composites.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 67a0a8426b..6629ee71ef 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -865,13 +865,13 @@ def test_add_bands_l_rgb(self): """Test adding bands.""" from satpy.composites import add_bands - # L + RGB -> RGB + # L + RGB -> RGBA data = xr.DataArray(da.ones((1, 3, 3)), dims=('bands', 'y', 'x'), coords={'bands': ['L']}) new_bands = xr.DataArray(da.array(['R', 'G', 'B']), dims=('bands'), coords={'bands': ['R', 'G', 'B']}) res = add_bands(data, new_bands) - res_bands = ['R', 'G', 'B'] + res_bands = ['R', 'G', 'B', 'A'] self.assertEqual(res.attrs['mode'], ''.join(res_bands)) np.testing.assert_array_equal(res.bands, res_bands) np.testing.assert_array_equal(res.coords['bands'], res_bands) From a700799a170be20c4479b38e85f81c3141756dad Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 10 Sep 2021 20:34:46 +0800 Subject: [PATCH 10/33] update DayNightCompositor test --- satpy/tests/test_composites.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 6629ee71ef..4a8c7e4a10 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -323,19 +323,19 @@ def setUp(self): # not used except to check that it matches the data arrays self.sza.attrs['area'] = my_area - def test_basic_sza(self): - """Test compositor when SZA data is included.""" + def test_daynight_sza(self): + """Test compositor with both sides when SZA data is included.""" from satpy.composites import DayNightCompositor - comp = DayNightCompositor(name='dn_test') + comp = DayNightCompositor(name='dn_test', day_night="day_night") res = comp((self.data_a, self.data_b, self.sza)) res = res.compute() expected = np.array([[0., 0.22122352], [0.5, 1.]]) np.testing.assert_allclose(res.values[0], expected) def test_basic_area(self): - """Test compositor when SZA data is not provided.""" + """Test compositor with both sides when SZA data is not provided.""" from satpy.composites import DayNightCompositor - comp = DayNightCompositor(name='dn_test') + comp = DayNightCompositor(name='dn_test', day_night="day_night") res = comp((self.data_a, self.data_b)) res = res.compute() expected = np.array([[0., 0.33164983], [0.66835017, 1.]]) From 9bf4207ad2961c2c2def502f738548ca0d086bd7 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 10 Sep 2021 20:50:10 +0800 Subject: [PATCH 11/33] update DayNightCompositor test --- satpy/tests/test_composites.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 4a8c7e4a10..de9b2109d0 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -324,7 +324,7 @@ def setUp(self): self.sza.attrs['area'] = my_area def test_daynight_sza(self): - """Test compositor with both sides when SZA data is included.""" + """Test compositor with both day and night portions when SZA data is included.""" from satpy.composites import DayNightCompositor comp = DayNightCompositor(name='dn_test', day_night="day_night") res = comp((self.data_a, self.data_b, self.sza)) @@ -332,8 +332,8 @@ def test_daynight_sza(self): expected = np.array([[0., 0.22122352], [0.5, 1.]]) np.testing.assert_allclose(res.values[0], expected) - def test_basic_area(self): - """Test compositor with both sides when SZA data is not provided.""" + def test_daynight_area(self): + """Test compositor both day and night portions when SZA data is not provided.""" from satpy.composites import DayNightCompositor comp = DayNightCompositor(name='dn_test', day_night="day_night") res = comp((self.data_a, self.data_b)) From ca5c3e9e3793667cfd52dd056844fcda50008bea Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 11 Sep 2021 19:02:46 +0800 Subject: [PATCH 12/33] new structure --- satpy/composites/__init__.py | 31 ++++++++++++++++++++++++++++--- satpy/tests/test_composites.py | 4 ++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 1a89ec7583..de90f870e8 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -602,12 +602,37 @@ def __call__(self, projectables, **kwargs): foreground_data = enhance2dataset(foreground_data) background_data = enhance2dataset(background_data) + + # Add an alpha band for L or RGB mode + new_foreground_data = [foreground_data.sel(bands=band) for band in foreground_data['bands'].data] + new_background_data = [background_data.sel(bands=band) for band in background_data['bands'].data] + foreground_alpha = new_foreground_data[0].copy() + background_alpha = new_background_data[0].copy() + foreground_alpha.data = da.ones((foreground_data.sizes['y'], + foreground_data.sizes['x']), + chunks=new_foreground_data[0].chunks) + background_alpha.data = da.ones((background_data.sizes['y'], + background_data.sizes['x']), + chunks=new_background_data[0].chunks) + foreground_alpha['bands'] = 'A' + background_alpha['bands'] = 'A' + new_foreground_data.append(foreground_alpha) + new_background_data.append(background_alpha) + new_foreground_data = xr.concat(new_foreground_data, dim='bands') + new_background_data = xr.concat(new_background_data, dim='bands') + new_foreground_data.attrs['mode'] = foreground_data.attrs['mode'] + 'A' + new_background_data.attrs['mode'] = background_data.attrs['mode'] + 'A' + # Adjust bands so that they match + # L -> LA + # RGB -> RGBA # L/RGB -> RGB/RGB # LA/RGB -> RGBA/RGBA # RGB/RGBA -> RGBA/RGBA - foreground_data = add_bands(foreground_data, background_data['bands']) - background_data = add_bands(background_data, foreground_data['bands']) + background_bands = new_background_data['bands'] if 'A' not in background_data['bands'].data else background_data['bands'] + foreground_bands = new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data else foreground_data['bands'] + foreground_data = add_bands(foreground_data, background_bands) + background_data = add_bands(background_data, foreground_bands) # Replace missing channel data with zeros foreground_data = zero_missing_data(foreground_data, background_data) @@ -688,7 +713,7 @@ def add_bands(data, bands): data['bands'] = new_bands data.attrs['mode'] = mode # Add alpha band - if ('A' not in data['bands'].data and 'A' in bands.data) or ('A' not in data['bands'].data): + if 'A' not in data['bands'].data and 'A' in bands.data: new_data = [data.sel(bands=band) for band in data['bands'].data] # Create alpha band based on a copy of the first "real" band alpha = new_data[0].copy() diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index de9b2109d0..0cff8b112b 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -865,13 +865,13 @@ def test_add_bands_l_rgb(self): """Test adding bands.""" from satpy.composites import add_bands - # L + RGB -> RGBA + # L + RGB -> RGB data = xr.DataArray(da.ones((1, 3, 3)), dims=('bands', 'y', 'x'), coords={'bands': ['L']}) new_bands = xr.DataArray(da.array(['R', 'G', 'B']), dims=('bands'), coords={'bands': ['R', 'G', 'B']}) res = add_bands(data, new_bands) - res_bands = ['R', 'G', 'B', 'A'] + res_bands = ['R', 'G', 'B'] self.assertEqual(res.attrs['mode'], ''.join(res_bands)) np.testing.assert_array_equal(res.bands, res_bands) np.testing.assert_array_equal(res.coords['bands'], res_bands) From f5c873bf01ec54ce7f86d3fe6e239e92e24a2004 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 11 Sep 2021 19:04:51 +0800 Subject: [PATCH 13/33] Update __init__.py --- satpy/composites/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index de90f870e8..31d77f39d7 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -551,7 +551,7 @@ def _insert_palette_colors(channels, palette): class DayNightCompositor(GenericCompositor): """A compositor that blends a day data with night data.""" - def __init__(self, name, lim_low=85., lim_high=88., day_night="day_only", **kwargs): + def __init__(self, name, lim_low=85., lim_high=88., day_night="day_night", **kwargs): """Collect custom configuration values. Args: From 73c2cdce2da4f38eef6ddc3b7ce5457ae5ecb64b Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 11 Sep 2021 19:13:31 +0800 Subject: [PATCH 14/33] Update __init__.py --- satpy/composites/__init__.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 31d77f39d7..2164c9c96f 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -602,7 +602,6 @@ def __call__(self, projectables, **kwargs): foreground_data = enhance2dataset(foreground_data) background_data = enhance2dataset(background_data) - # Add an alpha band for L or RGB mode new_foreground_data = [foreground_data.sel(bands=band) for band in foreground_data['bands'].data] new_background_data = [background_data.sel(bands=band) for band in background_data['bands'].data] @@ -610,10 +609,10 @@ def __call__(self, projectables, **kwargs): background_alpha = new_background_data[0].copy() foreground_alpha.data = da.ones((foreground_data.sizes['y'], foreground_data.sizes['x']), - chunks=new_foreground_data[0].chunks) + chunks=new_foreground_data[0].chunks) background_alpha.data = da.ones((background_data.sizes['y'], background_data.sizes['x']), - chunks=new_background_data[0].chunks) + chunks=new_background_data[0].chunks) foreground_alpha['bands'] = 'A' background_alpha['bands'] = 'A' new_foreground_data.append(foreground_alpha) @@ -626,11 +625,13 @@ def __call__(self, projectables, **kwargs): # Adjust bands so that they match # L -> LA # RGB -> RGBA - # L/RGB -> RGB/RGB + # L/RGB -> RGBA/RGBA # LA/RGB -> RGBA/RGBA # RGB/RGBA -> RGBA/RGBA - background_bands = new_background_data['bands'] if 'A' not in background_data['bands'].data else background_data['bands'] - foreground_bands = new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data else foreground_data['bands'] + background_bands = new_background_data['bands'] if 'A' not in background_data['bands'].data \ + else background_data['bands'] + foreground_bands = new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data \ + else foreground_data['bands'] foreground_data = add_bands(foreground_data, background_bands) background_data = add_bands(background_data, foreground_bands) From 142e4a58496356c05604fecf92b3d8a71ca0c35c Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 11 Sep 2021 19:15:00 +0800 Subject: [PATCH 15/33] Update __init__.py --- satpy/composites/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 2164c9c96f..9c5bad74b3 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -629,9 +629,9 @@ def __call__(self, projectables, **kwargs): # LA/RGB -> RGBA/RGBA # RGB/RGBA -> RGBA/RGBA background_bands = new_background_data['bands'] if 'A' not in background_data['bands'].data \ - else background_data['bands'] + else background_data['bands'] foreground_bands = new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data \ - else foreground_data['bands'] + else foreground_data['bands'] foreground_data = add_bands(foreground_data, background_bands) background_data = add_bands(background_data, foreground_bands) From 8d58657087fd7a4d5cf80eabec27ba31f7c44a0f Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 11 Sep 2021 19:18:22 +0800 Subject: [PATCH 16/33] Update __init__.py --- satpy/composites/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 9c5bad74b3..dd9e233a42 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -628,10 +628,10 @@ def __call__(self, projectables, **kwargs): # L/RGB -> RGBA/RGBA # LA/RGB -> RGBA/RGBA # RGB/RGBA -> RGBA/RGBA - background_bands = new_background_data['bands'] if 'A' not in background_data['bands'].data \ - else background_data['bands'] - foreground_bands = new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data \ - else foreground_data['bands'] + background_bands = new_background_data['bands'] if 'A' not in background_data['bands'].data else \ + background_data['bands'] + foreground_bands = new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data else \ + foreground_data['bands'] foreground_data = add_bands(foreground_data, background_bands) background_data = add_bands(background_data, foreground_bands) From 926389ebe41909fa63e35f887d73ff1561bd6f91 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 11 Sep 2021 19:19:44 +0800 Subject: [PATCH 17/33] Update __init__.py --- satpy/composites/__init__.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index dd9e233a42..1122c2198e 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -628,10 +628,8 @@ def __call__(self, projectables, **kwargs): # L/RGB -> RGBA/RGBA # LA/RGB -> RGBA/RGBA # RGB/RGBA -> RGBA/RGBA - background_bands = new_background_data['bands'] if 'A' not in background_data['bands'].data else \ - background_data['bands'] - foreground_bands = new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data else \ - foreground_data['bands'] + background_bands = new_background_data['bands'] if 'A' not in background_data['bands'].data else background_data['bands'] + foreground_bands = new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data else foreground_data['bands'] foreground_data = add_bands(foreground_data, background_bands) background_data = add_bands(background_data, foreground_bands) From 70f43ee1809d56557aa7050d4f0b6e5c42051d07 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 11 Sep 2021 23:07:08 +0800 Subject: [PATCH 18/33] Update __init__.py --- satpy/composites/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 1122c2198e..d6e9ecde85 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -628,8 +628,10 @@ def __call__(self, projectables, **kwargs): # L/RGB -> RGBA/RGBA # LA/RGB -> RGBA/RGBA # RGB/RGBA -> RGBA/RGBA - background_bands = new_background_data['bands'] if 'A' not in background_data['bands'].data else background_data['bands'] - foreground_bands = new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data else foreground_data['bands'] + background_bands = (new_background_data['bands'] if 'A' not in background_data['bands'].data + else background_data['bands']) + foreground_bands = (new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data + else foreground_data['bands']) foreground_data = add_bands(foreground_data, background_bands) background_data = add_bands(background_data, foreground_bands) From 360d876f95f03a33523d4c86a43275f969792d3a Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 12 Sep 2021 00:26:30 +0800 Subject: [PATCH 19/33] Update test_composites.py --- satpy/tests/test_composites.py | 38 ++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 0cff8b112b..b312c0819a 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -341,6 +341,42 @@ def test_daynight_area(self): expected = np.array([[0., 0.33164983], [0.66835017, 1.]]) np.testing.assert_allclose(res.values[0], expected) + def test_night_only_sza(self): + """Test compositor with night portion when SZA data is included.""" + from satpy.composites import DayNightCompositor + comp = DayNightCompositor(name='dn_test', day_night="night_only") + res = comp((self.data_b, self.sza)) + res = res.compute() + expected = np.array([[np.nan, 0.], [0.5, 1.]]) + np.testing.assert_allclose(res.values[0], expected) + + def test_night_only_area(self): + """Test compositor with night portion when SZA data is not provided.""" + from satpy.composites import DayNightCompositor + comp = DayNightCompositor(name='dn_test', day_night="night_only") + res = comp((self.data_b)) + res = res.compute() + expected = np.array([[np.nan, 0.], [0., 0.]]) + np.testing.assert_allclose(res.values[0], expected) + + def test_day_only_sza(self): + """Test compositor with day portion when SZA data is included.""" + from satpy.composites import DayNightCompositor + comp = DayNightCompositor(name='dn_test', day_night="day_only") + res = comp((self.data_a, self.sza)) + res = res.compute() + expected = np.array([[0., 0.22122352], [0., 0.]]) + np.testing.assert_allclose(res.values[0], expected) + + def test_day_only_area(self): + """Test compositor with day portion when SZA data is not provided.""" + from satpy.composites import DayNightCompositor + comp = DayNightCompositor(name='dn_test', day_night="day_only") + res = comp((self.data_a)) + res = res.compute() + expected = np.array([[0., 0.33164983], [0.66835017, 1.]]) + np.testing.assert_allclose(res.values[0], expected) + class TestFillingCompositor(unittest.TestCase): """Test case for the filling compositor.""" @@ -1049,7 +1085,6 @@ class TestBackgroundCompositor(unittest.TestCase): def test_call(self): """Test the background compositing.""" from satpy.composites import BackgroundCompositor - import numpy as np comp = BackgroundCompositor("name") # L mode images @@ -1131,7 +1166,6 @@ def test_call(self): def test_multiple_sensors(self): """Test the background compositing from multiple sensor data.""" from satpy.composites import BackgroundCompositor - import numpy as np comp = BackgroundCompositor("name") # L mode images From 0f23b888ba0bd0faf855098c2e4d357ec8281abf Mon Sep 17 00:00:00 2001 From: yukaribbba <72339781+yukaribbba@users.noreply.github.com> Date: Mon, 13 Sep 2021 08:46:48 +0800 Subject: [PATCH 20/33] Update satpy/composites/__init__.py Co-authored-by: David Hoese --- satpy/composites/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index d6e9ecde85..b37ff836cb 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -549,7 +549,12 @@ def _insert_palette_colors(channels, palette): class DayNightCompositor(GenericCompositor): - """A compositor that blends a day data with night data.""" + """A compositor that blends day data with night data. + + Using the `day_night` flag it is also possible to provide only a day product + or only a night product and mask out (make transparent) the opposite portion + of the image (night or day). See the documentation below for more details. + """ def __init__(self, name, lim_low=85., lim_high=88., day_night="day_night", **kwargs): """Collect custom configuration values. From 1b14f7fafc6ba1e5c1af33198d4ef3b3684a471c Mon Sep 17 00:00:00 2001 From: David Hoese Date: Sun, 12 Sep 2021 19:57:08 -0500 Subject: [PATCH 21/33] Update satpy/composites/__init__.py --- satpy/composites/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index b37ff836cb..3677ac4b4f 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -550,7 +550,6 @@ def _insert_palette_colors(channels, palette): class DayNightCompositor(GenericCompositor): """A compositor that blends day data with night data. - Using the `day_night` flag it is also possible to provide only a day product or only a night product and mask out (make transparent) the opposite portion of the image (night or day). See the documentation below for more details. From a571014653b612197b7ce3517a56bf86e60cc7b9 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 13 Sep 2021 20:10:04 +0800 Subject: [PATCH 22/33] Update __init__.py --- satpy/composites/__init__.py | 53 +++++++++++++++++------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 3677ac4b4f..44c3802b14 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -578,12 +578,12 @@ def __call__(self, projectables, **kwargs): projectables = self.match_data_arrays(projectables) foreground_data = projectables[0] - background_data = projectables[1] if self.day_night == "day_night" else foreground_data + background_data = projectables[1] if len(projectables) > 1 else foreground_data lim_low = np.cos(np.deg2rad(self.lim_low)) lim_high = np.cos(np.deg2rad(self.lim_high)) try: - coszen = np.cos(np.deg2rad(projectables[2 if self.day_night == "day_night" else 1])) + coszen = np.cos(np.deg2rad(projectables[2 if len(projectables) == 3 else 1])) except IndexError: from pyorbital.astronomy import cos_zen LOG.debug("Computing sun zenith angles.") @@ -606,38 +606,16 @@ def __call__(self, projectables, **kwargs): foreground_data = enhance2dataset(foreground_data) background_data = enhance2dataset(background_data) - # Add an alpha band for L or RGB mode - new_foreground_data = [foreground_data.sel(bands=band) for band in foreground_data['bands'].data] - new_background_data = [background_data.sel(bands=band) for band in background_data['bands'].data] - foreground_alpha = new_foreground_data[0].copy() - background_alpha = new_background_data[0].copy() - foreground_alpha.data = da.ones((foreground_data.sizes['y'], - foreground_data.sizes['x']), - chunks=new_foreground_data[0].chunks) - background_alpha.data = da.ones((background_data.sizes['y'], - background_data.sizes['x']), - chunks=new_background_data[0].chunks) - foreground_alpha['bands'] = 'A' - background_alpha['bands'] = 'A' - new_foreground_data.append(foreground_alpha) - new_background_data.append(background_alpha) - new_foreground_data = xr.concat(new_foreground_data, dim='bands') - new_background_data = xr.concat(new_background_data, dim='bands') - new_foreground_data.attrs['mode'] = foreground_data.attrs['mode'] + 'A' - new_background_data.attrs['mode'] = background_data.attrs['mode'] + 'A' - # Adjust bands so that they match # L -> LA # RGB -> RGBA # L/RGB -> RGBA/RGBA # LA/RGB -> RGBA/RGBA # RGB/RGBA -> RGBA/RGBA - background_bands = (new_background_data['bands'] if 'A' not in background_data['bands'].data - else background_data['bands']) - foreground_bands = (new_foreground_data['bands'] if 'A' not in foreground_data['bands'].data - else foreground_data['bands']) - foreground_data = add_bands(foreground_data, background_bands) - background_data = add_bands(background_data, foreground_bands) + background_data_alpha = add_alpha_bands(background_data) + foreground_data_alpha = add_alpha_bands(foreground_data) + foreground_data = add_bands(foreground_data, foreground_data_alpha['bands']) + background_data = add_bands(background_data, background_data_alpha['bands']) # Replace missing channel data with zeros foreground_data = zero_missing_data(foreground_data, background_data) @@ -661,6 +639,25 @@ def __call__(self, projectables, **kwargs): return super(DayNightCompositor, self).__call__(data, **kwargs) +def add_alpha_bands (data): + """Only used for DayNightCompositor. + Add an alpha band to L or RGB composite as prerequisites for the following band matching + to make the masked-out area transparent. + """ + if 'A' not in data['bands'].data: + new_data = [data.sel(bands=band) for band in data['bands'].data] + # Create alpha band based on a copy of the first "real" band + alpha = new_data[0].copy() + alpha.data = da.ones((data.sizes['y'], + data.sizes['x']), + chunks=new_data[0].chunks) + # Rename band to indicate it's alpha + alpha['bands'] = 'A' + new_data.append(alpha) + new_data = xr.concat(new_data, dim='bands') + new_data.attrs['mode'] = data.attrs['mode'] + 'A' + data = new_data + return data def enhance2dataset(dset, convert_p=False): """Return the enhancement dataset *dset* as an array. From 4c00823e3732f6e97d48716b133c86718f6d1f7d Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 13 Sep 2021 20:11:28 +0800 Subject: [PATCH 23/33] Update __init__.py --- satpy/composites/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 44c3802b14..d29bc66e6c 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -639,7 +639,8 @@ def __call__(self, projectables, **kwargs): return super(DayNightCompositor, self).__call__(data, **kwargs) -def add_alpha_bands (data): + +def add_alpha_bands(data): """Only used for DayNightCompositor. Add an alpha band to L or RGB composite as prerequisites for the following band matching to make the masked-out area transparent. From 5c265b2c7ed78f680f94bd792e06079018a43785 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 13 Sep 2021 21:35:19 +0800 Subject: [PATCH 24/33] Update __init__.py --- satpy/composites/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index d29bc66e6c..10d45bc3ff 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -578,12 +578,12 @@ def __call__(self, projectables, **kwargs): projectables = self.match_data_arrays(projectables) foreground_data = projectables[0] - background_data = projectables[1] if len(projectables) > 1 else foreground_data + background_data = projectables[1] if self.day_night == "day_night" else foreground_data lim_low = np.cos(np.deg2rad(self.lim_low)) lim_high = np.cos(np.deg2rad(self.lim_high)) try: - coszen = np.cos(np.deg2rad(projectables[2 if len(projectables) == 3 else 1])) + coszen = np.cos(np.deg2rad(projectables[2 if self.day_night == "day_night" else 1])) except IndexError: from pyorbital.astronomy import cos_zen LOG.debug("Computing sun zenith angles.") From 4f32c4c8182beeee38c2e0a7e915e36688bd138b Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 13 Sep 2021 21:53:00 +0800 Subject: [PATCH 25/33] Update __init__.py --- satpy/composites/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 10d45bc3ff..0fb123dfae 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -660,6 +660,7 @@ def add_alpha_bands(data): data = new_data return data + def enhance2dataset(dset, convert_p=False): """Return the enhancement dataset *dset* as an array. From 8cdc9fa67e74ce9097d55f70c36ffc904f399100 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 14 Sep 2021 02:09:49 +0800 Subject: [PATCH 26/33] Update __init__.py --- satpy/composites/__init__.py | 69 ++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 0fb123dfae..6f57f885c7 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -575,10 +575,8 @@ def __init__(self, name, lim_low=85., lim_high=88., day_night="day_night", **kwa def __call__(self, projectables, **kwargs): """Generate the composite.""" - projectables = self.match_data_arrays(projectables) - + # At least one composite is requested. foreground_data = projectables[0] - background_data = projectables[1] if self.day_night == "day_night" else foreground_data lim_low = np.cos(np.deg2rad(self.lim_low)) lim_high = np.cos(np.deg2rad(self.lim_high)) @@ -602,35 +600,54 @@ def __call__(self, projectables, **kwargs): coszen /= np.abs(lim_low - lim_high) coszen = coszen.clip(0, 1) - # Apply enhancements to get images + # Apply enhancements foreground_data = enhance2dataset(foreground_data) - background_data = enhance2dataset(background_data) - # Adjust bands so that they match - # L -> LA - # RGB -> RGBA - # L/RGB -> RGBA/RGBA - # LA/RGB -> RGBA/RGBA - # RGB/RGBA -> RGBA/RGBA - background_data_alpha = add_alpha_bands(background_data) - foreground_data_alpha = add_alpha_bands(foreground_data) - foreground_data = add_bands(foreground_data, foreground_data_alpha['bands']) - background_data = add_bands(background_data, background_data_alpha['bands']) + if "only" in self.day_night: + # Only one portion (day or night) is selected. One composite is requested. - # Replace missing channel data with zeros - foreground_data = zero_missing_data(foreground_data, background_data) - background_data = zero_missing_data(background_data, foreground_data) + # Add alpha band to single L/RGB composite to make the masked-out portion transparent + # L -> LA + # RGB -> RGBA + foreground_data = add_alpha_bands(foreground_data) - # Get merged metadata - attrs = combine_metadata(foreground_data, background_data) + # No need to replace missing channel data with zeros + + # Get metadata + attrs = foreground_data.attrs.copy() - # Blend the two images together - day_data = foreground_data if "day" in self.day_night else None - night_data = foreground_data if self.day_night == "night_only" else None - night_data = background_data if self.day_night == "day_night" else night_data + # Determine the composite position + day_data = foreground_data if "day" in self.day_night else 0 + night_data = foreground_data if "night" in self.day_night else 0 - day_portion = coszen * (day_data if day_data is not None else 0) - night_portion = (1 - coszen) * (night_data if night_data is not None else 0) + else: + # Both day and night portions are selected. Two composites are requested. Get the second one merged. + background_data = projectables[1] + + # Apply enhancements + background_data = enhance2dataset(background_data) + + # Adjust bands so that they match + # L/RGB -> RGB/RGB + # LA/RGB -> RGBA/RGBA + # RGB/RGBA -> RGBA/RGBA + foreground_data = add_bands(foreground_data, background_data['bands']) + background_data = add_bands(background_data, foreground_data['bands']) + + # Replace missing channel data with zeros + foreground_data = zero_missing_data(foreground_data, background_data) + background_data = zero_missing_data(background_data, foreground_data) + + # Get merged metadata + attrs = combine_metadata(foreground_data, background_data) + + # Determine the composite position + day_data = foreground_data + night_data = background_data + + # Blend the two images together + day_portion = coszen * day_data + night_portion = (1 - coszen) * night_data data = night_portion + day_portion data.attrs = attrs From cd5554714226f8712a98aeccfa6fca8c49de8c7e Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 14 Sep 2021 02:13:38 +0800 Subject: [PATCH 27/33] Update __init__.py --- satpy/composites/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 6f57f885c7..5d0e80a708 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -605,15 +605,13 @@ def __call__(self, projectables, **kwargs): if "only" in self.day_night: # Only one portion (day or night) is selected. One composite is requested. - # Add alpha band to single L/RGB composite to make the masked-out portion transparent # L -> LA # RGB -> RGBA foreground_data = add_alpha_bands(foreground_data) # No need to replace missing channel data with zeros - - # Get metadata + # Get metadata attrs = foreground_data.attrs.copy() # Determine the composite position From 8d8377a160e44d985a08973aef23df35c1865125 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 14 Sep 2021 02:16:19 +0800 Subject: [PATCH 28/33] Update __init__.py --- satpy/composites/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 5d0e80a708..8d89b85cc3 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -632,7 +632,7 @@ def __call__(self, projectables, **kwargs): foreground_data = add_bands(foreground_data, background_data['bands']) background_data = add_bands(background_data, foreground_data['bands']) - # Replace missing channel data with zeros + # Replace missing channel data with zeros foreground_data = zero_missing_data(foreground_data, background_data) background_data = zero_missing_data(background_data, foreground_data) From af2c6ee88cd760d6befa9810b61ee981a1ec4818 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 15 Sep 2021 00:01:59 +0800 Subject: [PATCH 29/33] Update __init__.py --- satpy/composites/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 8d89b85cc3..4bd5919f0a 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -575,6 +575,7 @@ def __init__(self, name, lim_low=85., lim_high=88., day_night="day_night", **kwa def __call__(self, projectables, **kwargs): """Generate the composite.""" + projectables = self.match_data_arrays(projectables) # At least one composite is requested. foreground_data = projectables[0] From 0a75d4a5d30963380d031a1d2d3ca1880ec96c78 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 17 Sep 2021 00:28:07 +0800 Subject: [PATCH 30/33] Update __init__.py --- satpy/composites/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index b602abd50f..6193b62c79 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -553,6 +553,7 @@ def _insert_palette_colors(channels, palette): class DayNightCompositor(GenericCompositor): """A compositor that blends day data with night data. + Using the `day_night` flag it is also possible to provide only a day product or only a night product and mask out (make transparent) the opposite portion of the image (night or day). See the documentation below for more details. @@ -661,6 +662,7 @@ def __call__(self, projectables, **kwargs): def add_alpha_bands(data): """Only used for DayNightCompositor. + Add an alpha band to L or RGB composite as prerequisites for the following band matching to make the masked-out area transparent. """ From b59557fa2f389a679ae2ed75948088d9cef6f27f Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 17 Sep 2021 20:56:04 +0800 Subject: [PATCH 31/33] Update composites.rst --- doc/source/composites.rst | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/doc/source/composites.rst b/doc/source/composites.rst index 82f852a2cb..663f9baba4 100644 --- a/doc/source/composites.rst +++ b/doc/source/composites.rst @@ -107,15 +107,35 @@ first composite will be placed on the day-side of the scene, and the second one on the night side. The transition from day to night is done by calculating solar zenith angle (SZA) weighed average of the two composites. The SZA can optionally be given as third dataset, and -if not given, the angles will be calculated. Width of the blending -zone can be defined when initializing the compositor (default values -shown in the example below). +if not given, the angles will be calculated. Three arguments are used +to generate the image (default values shown in the example below). +They can be defined when initializing the compositor:: + + - lim_low (float): lower limit of Sun zenith angle for the + blending of the given channels + - lim_high (float): upper limit of Sun zenith angle for the + blending of the given channels + Together with `lim_low` they define the width + of the blending zone + - day_night (string): "day_night" means both day and night portions will be kept + "day_only" means only day portion will be kept + "night_only" means only night portion will be kept +Usage (with default values):: >>> from satpy.composites import DayNightCompositor - >>> compositor = DayNightCompositor("dnc", lim_low=85., lim_high=88.) + >>> compositor = DayNightCompositor("dnc", lim_low=85., lim_high=88., day_night="day_night") >>> composite = compositor([local_scene['true_color'], ... local_scene['night_fog']]) +As above, with `day_night` flag it is also available to use only +a day product or only a night product and mask out (make transparent) +the opposite portion of the image (night or day). The example below +provides only a day product with night portion masked-out:: + + >>> from satpy.composites import DayNightCompositor + >>> compositor = DayNightCompositor("dnc", lim_low=85., lim_high=88., day_night="day_only") + >>> composite = compositor([local_scene['true_color']) + RealisticColors --------------- @@ -340,7 +360,7 @@ the day side, and another for the night side:: - night_fog standard_name: natural_with_night_fog -This compositor has two additional keyword arguments that can be +This compositor has three additional keyword arguments that can be defined (shown with the default values, thus identical result as above):: @@ -350,7 +370,8 @@ above):: - natural_color - night_fog lim_low: 85.0 - lim_high: 95.0 + lim_high: 88.0 + day_night: "day_night" standard_name: natural_with_night_fog Defining other composites in-line From 9922f23b63e6f9346105e4a21133186e0d651892 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 17 Sep 2021 21:10:08 +0800 Subject: [PATCH 32/33] Update AUTHORS.md --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index dce4c52be0..f4c4cdf688 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -43,6 +43,7 @@ The following people have made contributions to this project: - [Ralph Kuehn (ralphk11)](https://github.com/ralphk11) - [Panu Lahtinen (pnuu)](https://github.com/pnuu) - [Thomas Leppelt (m4sth0)](https://github.com/m4sth0) +- [Lu Liu (yukaribbba)](https://github.com/yukaribbba) - [Andrea Meraner (ameraner)](https://github.com/ameraner) - [Aronne Merrelli (aronnem)](https://github.com/aronnem) - [Lucas Meyer (LTMeyer)](https://github.com/LTMeyer) From 872d95a4c96c7a30586814efb525e04cdb89635c Mon Sep 17 00:00:00 2001 From: David Hoese Date: Fri, 17 Sep 2021 08:33:21 -0500 Subject: [PATCH 33/33] Update doc/source/composites.rst --- doc/source/composites.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/composites.rst b/doc/source/composites.rst index 663f9baba4..cdfc0277a9 100644 --- a/doc/source/composites.rst +++ b/doc/source/composites.rst @@ -120,6 +120,7 @@ They can be defined when initializing the compositor:: - day_night (string): "day_night" means both day and night portions will be kept "day_only" means only day portion will be kept "night_only" means only night portion will be kept + Usage (with default values):: >>> from satpy.composites import DayNightCompositor