From e52fd96f17944841752fd3764c01fe39075a19d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20R=C3=B6sner?= Date: Mon, 1 Aug 2022 07:50:15 +0200 Subject: [PATCH 001/481] feat: add first draft of area list --- doc/source/area_def_list.py | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 doc/source/area_def_list.py diff --git a/doc/source/area_def_list.py b/doc/source/area_def_list.py new file mode 100644 index 0000000000..7b67002998 --- /dev/null +++ b/doc/source/area_def_list.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2022 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 . +"""Module for autogenerating a list and overview of available area definitions .""" + +from pyresample.area_config import _read_yaml_area_file_content + +from satpy.resample import get_area_def, get_area_file + + +def generate_area_def_list(): + """Create list of available area definitions with overview plot. + + Returns: + str + """ + area_list = [] + + template = ("{area_name}\n" + "----------\n" + ".. raw:: html\n" + " {content}\n\n") + + area_file = get_area_file()[0] + for aname in [list(_read_yaml_area_file_content(area_file).keys())[0]]: + area = get_area_def(aname) + if hasattr(area, "_repr_html_"): + area_list.append(template.format(area_name=aname, content=area._repr_html_())) + else: + pass + + return "".join(area_list) From 96ae5d82de6156403381386db5f6678462609105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20R=C3=B6sner?= Date: Mon, 1 Aug 2022 08:50:47 +0200 Subject: [PATCH 002/481] fix: indentation of raw html block --- doc/source/area_def_list.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/source/area_def_list.py b/doc/source/area_def_list.py index 7b67002998..9624f2937b 100644 --- a/doc/source/area_def_list.py +++ b/doc/source/area_def_list.py @@ -32,15 +32,17 @@ def generate_area_def_list(): area_list = [] template = ("{area_name}\n" - "----------\n" - ".. raw:: html\n" + "{n:->{header_title_length}}\n\n" + ".. raw:: html\n\n" " {content}\n\n") area_file = get_area_file()[0] for aname in [list(_read_yaml_area_file_content(area_file).keys())[0]]: area = get_area_def(aname) if hasattr(area, "_repr_html_"): - area_list.append(template.format(area_name=aname, content=area._repr_html_())) + content = "\n".join([x.rjust(len(x) + 5) for x in area._repr_html_().split("\n")]) + area_list.append(template.format(area_name=aname, n="", header_title_length=len(aname), + content=content)) else: pass From bdf89b7b30cb4b84a157168ba142c8395baee24a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20R=C3=B6sner?= Date: Tue, 2 Aug 2022 10:00:38 +0200 Subject: [PATCH 003/481] add: area_def_list.rst to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8990fa1d46..25eee3bf96 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ doc/source/_build/* satpy/version.py doc/source/api/*.rst doc/source/reader_table.rst +doc/source/area_def_list.rst From e310747b996f5856a1803d86a210718728644bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20R=C3=B6sner?= Date: Tue, 2 Aug 2022 10:03:26 +0200 Subject: [PATCH 004/481] add: area definition list to resample chapter --- doc/source/area_def_list.py | 8 +++++--- doc/source/conf.py | 4 ++++ satpy/resample.py | 7 ++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/doc/source/area_def_list.py b/doc/source/area_def_list.py index 9624f2937b..665c770569 100644 --- a/doc/source/area_def_list.py +++ b/doc/source/area_def_list.py @@ -19,6 +19,7 @@ """Module for autogenerating a list and overview of available area definitions .""" from pyresample.area_config import _read_yaml_area_file_content +from pyresample.formatting_html import area_repr from satpy.resample import get_area_def, get_area_file @@ -34,13 +35,14 @@ def generate_area_def_list(): template = ("{area_name}\n" "{n:->{header_title_length}}\n\n" ".. raw:: html\n\n" - " {content}\n\n") + "{content}\n\n" + "
\n\n") area_file = get_area_file()[0] - for aname in [list(_read_yaml_area_file_content(area_file).keys())[0]]: + for aname in list(_read_yaml_area_file_content(area_file).keys()): area = get_area_def(aname) if hasattr(area, "_repr_html_"): - content = "\n".join([x.rjust(len(x) + 5) for x in area._repr_html_().split("\n")]) + content = "\n".join([x.rjust(len(x) + 5) for x in area_repr(area, include_header=False).split("\n")]) area_list.append(template.format(area_name=aname, n="", header_title_length=len(aname), content=content)) else: diff --git a/doc/source/conf.py b/doc/source/conf.py index 10dbde5c98..975622b345 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -26,6 +26,7 @@ sys.path.append(os.path.abspath('../../')) sys.path.append(os.path.abspath(os.path.dirname(__file__))) +from area_def_list import generate_area_def_list # noqa: E402 from reader_table import generate_reader_table # noqa: E402 # The version info for the project you're documenting, acts as replacement for @@ -80,6 +81,9 @@ def __getattr__(cls, name): with open("reader_table.rst", mode="w") as f: f.write(generate_reader_table()) +with open("area_def_list.rst", mode="w") as f: + f.write(generate_area_def_list()) + # -- General configuration ----------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be extensions diff --git a/satpy/resample.py b/satpy/resample.py index a8230ae8ed..ed2e08a921 100644 --- a/satpy/resample.py +++ b/satpy/resample.py @@ -135,7 +135,12 @@ For examples of area definitions, see the file ``etc/areas.yaml`` that is included with Satpy and where all the area definitions shipped with Satpy are -defined. +defined. The section below gives an overview of these area definitions. + +Area definitions included in Satpy +---------------------------------- + +.. include:: area_def_list.rst """ import hashlib From d7893d50584f0ed1682894744b57f6440fe3c079 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Tue, 15 Nov 2022 09:27:03 +0100 Subject: [PATCH 005/481] refactor: move rst list generation function to pyresample --- doc/source/area_def_list.py | 51 ------------------------------------- doc/source/conf.py | 2 +- 2 files changed, 1 insertion(+), 52 deletions(-) delete mode 100644 doc/source/area_def_list.py diff --git a/doc/source/area_def_list.py b/doc/source/area_def_list.py deleted file mode 100644 index 665c770569..0000000000 --- a/doc/source/area_def_list.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (c) 2022 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 . -"""Module for autogenerating a list and overview of available area definitions .""" - -from pyresample.area_config import _read_yaml_area_file_content -from pyresample.formatting_html import area_repr - -from satpy.resample import get_area_def, get_area_file - - -def generate_area_def_list(): - """Create list of available area definitions with overview plot. - - Returns: - str - """ - area_list = [] - - template = ("{area_name}\n" - "{n:->{header_title_length}}\n\n" - ".. raw:: html\n\n" - "{content}\n\n" - "
\n\n") - - area_file = get_area_file()[0] - for aname in list(_read_yaml_area_file_content(area_file).keys()): - area = get_area_def(aname) - if hasattr(area, "_repr_html_"): - content = "\n".join([x.rjust(len(x) + 5) for x in area_repr(area, include_header=False).split("\n")]) - area_list.append(template.format(area_name=aname, n="", header_title_length=len(aname), - content=content)) - else: - pass - - return "".join(area_list) diff --git a/doc/source/conf.py b/doc/source/conf.py index 975622b345..43dd186e68 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -26,7 +26,7 @@ sys.path.append(os.path.abspath('../../')) sys.path.append(os.path.abspath(os.path.dirname(__file__))) -from area_def_list import generate_area_def_list # noqa: E402 +from pyresample.area_config import generate_area_def_list # noqa: E402 from reader_table import generate_reader_table # noqa: E402 # The version info for the project you're documenting, acts as replacement for From d6210898d56d6e92f702f395f311cc0f660881ad Mon Sep 17 00:00:00 2001 From: BENR0 Date: Tue, 15 Nov 2022 09:41:50 +0100 Subject: [PATCH 006/481] fix: missing area file argument --- doc/source/conf.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 43dd186e68..e84ad1cba5 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -29,6 +29,8 @@ from pyresample.area_config import generate_area_def_list # noqa: E402 from reader_table import generate_reader_table # noqa: E402 +from satpy.resample import get_area_file # noqa: E402 + # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. @@ -81,8 +83,9 @@ def __getattr__(cls, name): with open("reader_table.rst", mode="w") as f: f.write(generate_reader_table()) +area_file = get_area_file()[0] with open("area_def_list.rst", mode="w") as f: - f.write(generate_area_def_list()) + f.write(generate_area_def_list(area_file)) # -- General configuration ----------------------------------------------------- From 4b94939a472dc344249911c52f2cc7cb60125818 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Tue, 15 Nov 2022 09:47:55 +0100 Subject: [PATCH 007/481] fix: function name --- doc/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index e84ad1cba5..e69edac07e 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -26,7 +26,7 @@ sys.path.append(os.path.abspath('../../')) sys.path.append(os.path.abspath(os.path.dirname(__file__))) -from pyresample.area_config import generate_area_def_list # noqa: E402 +from pyresample.area_config import generate_area_def_rst_list # noqa: E402 from reader_table import generate_reader_table # noqa: E402 from satpy.resample import get_area_file # noqa: E402 @@ -85,7 +85,7 @@ def __getattr__(cls, name): area_file = get_area_file()[0] with open("area_def_list.rst", mode="w") as f: - f.write(generate_area_def_list(area_file)) + f.write(generate_area_def_rst_list(area_file)) # -- General configuration ----------------------------------------------------- From fd0879daba1abca651ddc85bb73790dca8eb82e3 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Mon, 5 Dec 2022 14:14:00 +0100 Subject: [PATCH 008/481] refactor: add class name argument to rst table header generation --- doc/source/reader_table.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/reader_table.py b/doc/source/reader_table.py index 1c6760a390..99499de26c 100644 --- a/doc/source/reader_table.py +++ b/doc/source/reader_table.py @@ -38,7 +38,7 @@ def rst_table_row(columns=None): return row -def rst_table_header(name=None, header=None, header_rows=1, widths="auto"): +def rst_table_header(name=None, header=None, header_rows=1, widths="auto", class_name="datatable"): """Create header for rst table. Args: @@ -59,7 +59,7 @@ def rst_table_header(name=None, header=None, header_rows=1, widths="auto"): table_header = (f".. list-table:: {name}\n" f" :header-rows: {header_rows}\n" f" :widths: {widths}\n" - f" :class: datatable\n\n" + f" :class: {class_name}\n\n" f"{header}") return table_header From 6edf540767498f79ec684661646eff94fb57d0b5 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Mon, 5 Dec 2022 14:15:05 +0100 Subject: [PATCH 009/481] refactor: add options for area table to datatable js init --- doc/source/_static/main.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/source/_static/main.js b/doc/source/_static/main.js index 188a335e71..8455d3e2ef 100644 --- a/doc/source/_static/main.js +++ b/doc/source/_static/main.js @@ -3,4 +3,10 @@ $(document).ready( function () { "paging": false, "dom": 'lfitp' } ); + + $('table.area-table').DataTable( { + "paging": true, + "pageLength": 15, + "dom": 'lfitp' +} ); } ); From b20180a487ff967a2632b1a9d542439329b9d72d Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 7 Apr 2023 09:13:47 -0500 Subject: [PATCH 010/481] Create aliases for CLAVRx product names that are the bidirectional reflectance derived information for the L1b channels at 2 km. --- satpy/readers/clavrx.py | 47 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index 9565fa7169..cd5d0461e6 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -68,6 +68,23 @@ 'abi': 2004, } +CHANNEL_ALIASES = { + "abi": {"refl_0_47um_nom": {"name": "C01", "wavelength": 0.47}, + "refl_0_65um_nom": {"name": "C02", "wavelength": 0.64}, + "refl_0_86um_nom": {"name": "C03", "wavelength": 0.865}, + "refl_1_38um_nom": {"name": "C04", "wavelength": 1.378}, + "refl_1_60um_nom": {"name": "C05", "wavelength": 1.61}, + "refl_2_10um_nom": {"name": "C06", "wavelength": 2.25}, + }, + "ahi": {"refl_0_47um_nom": {"name": "C01", "wavelength": 0.47}, + "refl_0_55um_nom": {"name": "C02", "wavelength": 0.51}, + "refl_0_65um_nom": {"name": "C03", "wavelength": 0.64}, + "refl_0_86um_nom": {"name": "C04", "wavelength": 0.86}, + "refl_1_60um_nom": {"name": "C05", "wavelength": 1.61}, + "refl_2_10um_nom": {"name": "C06", "wavelength": 2.25} + }, +} + def _get_sensor(sensor: str) -> str: """Get the sensor.""" @@ -273,6 +290,19 @@ def get_metadata(sensor: str, platform: str, attrs: dict, ds_info: dict) -> dict return attr_info + @staticmethod + def _lookup_alias(vname: str, sensor: str, is_polar: bool) -> str: + """Return variable name if channel name is an alias for a different variable.""" + # Why? The aliases provide built-in access to the base sensor RGB composites. + if is_polar: + # Not implemented + pass + else: + dd = CHANNEL_ALIASES[sensor] + key = next(key for key, value in dd.items() if value["name"] == vname) + + return key + class CLAVRXHDF4FileHandler(HDF4FileHandler, _CLAVRxHelper): """A file handler for CLAVRx files.""" @@ -294,7 +324,7 @@ def end_time(self): return self.filename_info.get('end_time', self.start_time) def get_dataset(self, dataset_id, ds_info): - """Get a dataset.""" + """Get a dataset for Polar Sensors.""" var_name = ds_info.get('file_key', dataset_id['name']) data = self[var_name] data = _CLAVRxHelper._get_data(data, dataset_id) @@ -414,7 +444,8 @@ def _get_ds_info_for_data_arr(self, var_name): } return ds_info - def _is_2d_yx_data_array(self, data_arr): + @staticmethod + def _is_2d_yx_data_array(data_arr): has_y_dim = data_arr.dims[0] == "y" has_x_dim = data_arr.dims[1] == "x" return has_y_dim and has_x_dim @@ -435,6 +466,14 @@ def _available_new_datasets(self, handled_vars): ds_info = self._get_ds_info_for_data_arr(var_name) yield True, ds_info + alias_info = CHANNEL_ALIASES[self.sensor].get(var_name, None) + if alias_info is not None: + if self.nc.attrs["RESOLUTION_KM"] is not None: + alias_info["resolution"] = self.nc.attrs.get("RESOLUTION_KM", "2") + alias_info["resolution"] = alias_info["resolution"] * 1000. + ds_info.update(alias_info) + yield True, ds_info + def available_datasets(self, configured_datasets=None): """Dynamically discover what variables can be loaded from this file. @@ -470,8 +509,9 @@ def get_area_def(self, key): return _CLAVRxHelper._read_axi_fixed_grid(self.filename, l1b_att) def get_dataset(self, dataset_id, ds_info): - """Get a dataset.""" + """Get a dataset for supported geostationary sensors.""" var_name = ds_info.get('name', dataset_id['name']) + var_name = _CLAVRxHelper._lookup_alias(var_name, self.sensor, self._is_polar()) data = self[var_name] data = _CLAVRxHelper._get_data(data, dataset_id) data.attrs = _CLAVRxHelper.get_metadata(self.sensor, self.platform, @@ -480,5 +520,6 @@ def get_dataset(self, dataset_id, ds_info): def __getitem__(self, item): """Wrap around `self.nc[item]`.""" + # Check if 'item' is an alias: data = self.nc[item] return data From c6d0122761f4fdc0919a67db98fbb51b904dda54 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Tue, 11 Apr 2023 08:51:25 -0500 Subject: [PATCH 011/481] Update how alias is used with "file_key" in ds_info, which eliminates the need for a special lookup within reader Add tests to make sure aliases are created. --- satpy/readers/clavrx.py | 25 +++------- satpy/tests/reader_tests/test_clavrx_nc.py | 55 +++++++++++++--------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index cd5d0461e6..f8cb35cf51 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -290,19 +290,6 @@ def get_metadata(sensor: str, platform: str, attrs: dict, ds_info: dict) -> dict return attr_info - @staticmethod - def _lookup_alias(vname: str, sensor: str, is_polar: bool) -> str: - """Return variable name if channel name is an alias for a different variable.""" - # Why? The aliases provide built-in access to the base sensor RGB composites. - if is_polar: - # Not implemented - pass - else: - dd = CHANNEL_ALIASES[sensor] - key = next(key for key, value in dd.items() if value["name"] == vname) - - return key - class CLAVRXHDF4FileHandler(HDF4FileHandler, _CLAVRxHelper): """A file handler for CLAVRx files.""" @@ -464,13 +451,16 @@ def _available_new_datasets(self, handled_vars): continue ds_info = self._get_ds_info_for_data_arr(var_name) + ds_info.update({"file_key": var_name}) yield True, ds_info alias_info = CHANNEL_ALIASES[self.sensor].get(var_name, None) if alias_info is not None: - if self.nc.attrs["RESOLUTION_KM"] is not None: - alias_info["resolution"] = self.nc.attrs.get("RESOLUTION_KM", "2") - alias_info["resolution"] = alias_info["resolution"] * 1000. + alias_info.update({"file_key": var_name}) + if "RESOLUTION_KM" in self.nc.attrs: + alias_info["resolution"] = self.nc.attrs["RESOLUTION_KM"] * 1000. + else: + alias_info["resolution"] = NADIR_RESOLUTION[self.sensor] ds_info.update(alias_info) yield True, ds_info @@ -510,8 +500,7 @@ def get_area_def(self, key): def get_dataset(self, dataset_id, ds_info): """Get a dataset for supported geostationary sensors.""" - var_name = ds_info.get('name', dataset_id['name']) - var_name = _CLAVRxHelper._lookup_alias(var_name, self.sensor, self._is_polar()) + var_name = ds_info.get("file_key", dataset_id['name']) data = self[var_name] data = _CLAVRxHelper._get_data(data, dataset_id) data.attrs = _CLAVRxHelper.get_metadata(self.sensor, self.platform, diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index ea0dcaed9b..a72e46c354 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -37,6 +37,7 @@ DEFAULT_LON_DATA = np.linspace(5, 45, DEFAULT_FILE_SHAPE[1]).astype(DEFAULT_FILE_DTYPE) DEFAULT_LON_DATA = np.repeat([DEFAULT_LON_DATA], DEFAULT_FILE_SHAPE[0], axis=0) AHI_FILE = 'clavrx_H08_20210603_1500_B01_FLDK_R.level2.nc' +FILL_VALUE = -32768 def fake_test_content(filename, **kwargs): @@ -51,7 +52,8 @@ def fake_test_content(filename, **kwargs): longitude = xr.DataArray(DEFAULT_LON_DATA, dims=('scan_lines_along_track_direction', 'pixel_elements_along_scan_direction'), - attrs={'_FillValue': np.nan, + attrs={'_FillValue': -999., + 'SCALED': 0, 'scale_factor': 1., 'add_offset': 0., 'standard_name': 'longitude', @@ -61,37 +63,37 @@ def fake_test_content(filename, **kwargs): latitude = xr.DataArray(DEFAULT_LAT_DATA, dims=('scan_lines_along_track_direction', 'pixel_elements_along_scan_direction'), - attrs={'_FillValue': np.nan, + attrs={'_FillValue': -999., + 'SCALED': 0, 'scale_factor': 1., 'add_offset': 0., 'standard_name': 'latitude', 'units': 'degrees_south' }) - variable1 = xr.DataArray(DEFAULT_FILE_DATA.astype(np.float32), + variable1 = xr.DataArray(DEFAULT_FILE_DATA.astype(np.int8), dims=('scan_lines_along_track_direction', 'pixel_elements_along_scan_direction'), - attrs={'_FillValue': np.nan, - 'scale_factor': 1., - 'add_offset': 0., + attrs={'_FillValue': -127, + 'SCALED': 0, 'units': '1', - 'valid_range': [-32767, 32767], }) - # data with fill values - variable2 = xr.DataArray(DEFAULT_FILE_DATA.astype(np.float32), + # data with fill values and a file_type alias + variable2 = xr.DataArray(DEFAULT_FILE_DATA.astype(np.int16), dims=('scan_lines_along_track_direction', 'pixel_elements_along_scan_direction'), - attrs={'_FillValue': np.nan, - 'scale_factor': 1., - 'add_offset': 0., - 'units': '1', + attrs={'_FillValue': FILL_VALUE, + 'SCALED': 1, + 'scale_factor': 0.001861629, + 'add_offset': 59., + 'units': '%', 'valid_range': [-32767, 32767], }) - variable2 = variable2.where(variable2 % 2 != 0) + variable2 = variable2.where(variable2 % 2 != 0, FILL_VALUE) # category - variable3 = xr.DataArray(DEFAULT_FILE_FLAGS, + variable3 = xr.DataArray(DEFAULT_FILE_FLAGS.astype(np.int8), dims=('scan_lines_along_track_direction', 'pixel_elements_along_scan_direction'), attrs={'SCALED': 0, @@ -103,7 +105,7 @@ def fake_test_content(filename, **kwargs): 'longitude': longitude, 'latitude': latitude, 'variable1': variable1, - 'variable2': variable2, + 'refl_0_65um_nom': variable2, 'variable3': variable3 } @@ -141,7 +143,7 @@ def test_reader_creation(self, filenames, expected_loadables): @pytest.mark.parametrize( ("filenames", "expected_datasets"), - [([AHI_FILE], ['variable1', 'variable2', 'variable3']), ] + [([AHI_FILE], ['variable1', 'refl_0_65um_nom', 'variable3']), ] ) def test_available_datasets(self, filenames, expected_datasets): """Test that variables are dynamically discovered.""" @@ -154,10 +156,13 @@ def test_available_datasets(self, filenames, expected_datasets): avails = list(r.available_dataset_names) for var_name in expected_datasets: assert var_name in avails + # check extra datasets created by alias or coordinates + for var_name in ["latitude", "longitude", "C03"]: + assert var_name in avails @pytest.mark.parametrize( ("filenames", "loadable_ids"), - [([AHI_FILE], ['variable1', 'variable2', 'variable3']), ] + [([AHI_FILE], ['variable1', 'refl_0_65um_nom', 'C03', 'variable3']), ] ) def test_load_all_new_donor(self, filenames, loadable_ids): """Test loading all test datasets with new donor.""" @@ -184,18 +189,24 @@ def test_load_all_new_donor(self, filenames, loadable_ids): ) fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] datasets = r.load(loadable_ids) - assert len(datasets) == 3 + assert len(datasets) == 4 for v in datasets.values(): assert 'calibration' not in v.attrs - assert v.attrs['units'] == '1' + assert "units" in v.attrs assert isinstance(v.attrs['area'], AreaDefinition) assert v.attrs['platform_name'] == 'himawari8' assert v.attrs['sensor'] == 'ahi' assert 'rows_per_scan' not in v.coords.get('longitude').attrs - if v.attrs["name"] in ["variable1", "variable2"]: + if v.attrs["name"] == 'variable1': + assert "valid_range" not in v.attrs + assert v.dtype == np.float64 + assert "_FillValue" not in v.attrs + # should have file variable and one alias for reflectance + elif v.attrs["name"] in ["refl_0_65um_nom", "C03"]: assert isinstance(v.attrs["valid_range"], list) - assert v.dtype == np.float32 + assert v.dtype == np.float64 assert "_FillValue" not in v.attrs.keys() + assert (v.attrs["file_key"] == "refl_0_65um_nom") else: assert (datasets['variable3'].attrs.get('flag_meanings')) is not None assert (datasets['variable3'].attrs.get('flag_meanings') == '') From 87066011bb95e361c5b7b3cc15a621dfceb7a925 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 5 May 2023 17:12:46 -0500 Subject: [PATCH 012/481] Fixed is_polar() error improperly identifying ABI as polar. Updated tests to use fake goes data to test existing alias creation Reduced aliases to ABI and VIIRS channels --- satpy/etc/enhancements/generic.yaml | 23 ++++++ satpy/readers/clavrx.py | 81 +++++++++++----------- satpy/tests/reader_tests/test_clavrx.py | 2 +- satpy/tests/reader_tests/test_clavrx_nc.py | 26 +++---- 4 files changed, 79 insertions(+), 53 deletions(-) diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index ce1ce1bb94..45ae789dde 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -262,6 +262,29 @@ enhancements: stretch: linear cutoffs: [0.005, 0.005] + four_level_cloud_mask: + standard_name: cloud_mask + reader: clavrx + operations: + - name: palettize + method: !!python/name:satpy.enhancements.palettize + kwargs: + palettes: + - {'values': [-127,# Fill Value + 0, # Clear + 1, # Probably Clear + 2, # Probably Cloudy + 3, # Cloudy + ], + 'colors': [[ 0, 0, 0], # black,-127 = Fill Value + [ 94, 79, 162], # blue, 0 = Clear + [ 73, 228, 242], # cyan, 1 = Probably Clear + [158, 1, 66], # red, 2 = Probably Cloudy + [255, 255, 255], # white, 3 = Cloudy + ], + 'color_scale': 255, + } + sar-ice: standard_name: sar-ice operations: diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index f8cb35cf51..289adf6e0a 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -69,21 +69,18 @@ } CHANNEL_ALIASES = { - "abi": {"refl_0_47um_nom": {"name": "C01", "wavelength": 0.47}, - "refl_0_65um_nom": {"name": "C02", "wavelength": 0.64}, - "refl_0_86um_nom": {"name": "C03", "wavelength": 0.865}, - "refl_1_38um_nom": {"name": "C04", "wavelength": 1.378}, - "refl_1_60um_nom": {"name": "C05", "wavelength": 1.61}, - "refl_2_10um_nom": {"name": "C06", "wavelength": 2.25}, + "abi": {"refl_0_47um_nom": {"name": "C01", "wavelength": 0.47, "modifiers": ("sunz_corrected",)}, + "refl_0_65um_nom": {"name": "C02", "wavelength": 0.64, "modifiers": ("sunz_corrected",)}, + "refl_0_86um_nom": {"name": "C03", "wavelength": 0.865, "modifiers": ("sunz_corrected",)}, + "refl_1_38um_nom": {"name": "C04", "wavelength": 1.38, "modifiers": ("sunz_corrected",)}, + "refl_1_60um_nom": {"name": "C05", "wavelength": 1.61, "modifiers": ("sunz_corrected",)}, + "refl_2_10um_nom": {"name": "C06", "wavelength": 2.25, "modifiers": ("sunz_corrected",)}, }, - "ahi": {"refl_0_47um_nom": {"name": "C01", "wavelength": 0.47}, - "refl_0_55um_nom": {"name": "C02", "wavelength": 0.51}, - "refl_0_65um_nom": {"name": "C03", "wavelength": 0.64}, - "refl_0_86um_nom": {"name": "C04", "wavelength": 0.86}, - "refl_1_60um_nom": {"name": "C05", "wavelength": 1.61}, - "refl_2_10um_nom": {"name": "C06", "wavelength": 2.25} - }, -} + "viirs": {"refl_0_65um_nom": {"name": "I01", "wavelength": 0.64, "modifiers": ("sunz_corrected",)}, + "refl_1_38um_nom": {"name": "M09", "wavelength": 1.38, "modifiers": ("sunz_corrected",)}, + "refl_1_60um_nom": {"name": "I03", "wavelength": 1.61, "modifiers": ("sunz_corrected",)} + } + } def _get_sensor(sensor: str) -> str: @@ -143,8 +140,6 @@ def _get_data(data, dataset_id: dict) -> xr.DataArray: factor = attrs.pop('scale_factor', (np.ones(1, dtype=data.dtype))[0]) offset = attrs.pop('add_offset', (np.zeros(1, dtype=data.dtype))[0]) valid_range = attrs.get('valid_range', [None]) - if isinstance(valid_range, np.ndarray): - attrs["valid_range"] = valid_range.tolist() flags = not data.attrs.get("SCALED", 1) and any(data.attrs.get("flag_values", [None])) if not flags: @@ -152,15 +147,14 @@ def _get_data(data, dataset_id: dict) -> xr.DataArray: data = _CLAVRxHelper._scale_data(data, factor, offset) # don't need _FillValue if it has been applied. attrs.pop('_FillValue', None) - - if all(valid_range): - valid_min = _CLAVRxHelper._scale_data(valid_range[0], factor, offset) - valid_max = _CLAVRxHelper._scale_data(valid_range[1], factor, offset) - if flags: - data = data.where((data >= valid_min) & (data <= valid_max), fill) - else: + if isinstance(valid_range, np.ndarray): + valid_min = _CLAVRxHelper._scale_data(valid_range[0], factor, offset) + valid_max = _CLAVRxHelper._scale_data(valid_range[1], factor, offset) data = data.where((data >= valid_min) & (data <= valid_max)) - attrs['valid_range'] = [valid_min, valid_max] + else: + flag_values = attrs.get('flag_values', None) + if flag_values is not None and isinstance(flag_values, np.ndarray): + data = data.where((data >= flag_values[0]) & (data <= flag_values[-1]), fill) data.attrs = _CLAVRxHelper._remove_attributes(attrs) @@ -330,6 +324,15 @@ def get_nadir_resolution(self, sensor): elif res is not None: return int(res) + def _available_aliases(self, ds_info, current_var): + """Add alias if there is a match.""" + alias_info = CHANNEL_ALIASES.get(self.sensor).get(current_var, None) + if alias_info is not None: + alias_info.update({"file_key": current_var}) + alias_info["resolution"] = self.get_nadir_resolution(self.sensor) + ds_info.update(alias_info) + yield True, ds_info + def available_datasets(self, configured_datasets=None): """Automatically determine datasets provided by this file.""" self.sensor = _get_sensor(self.file_content.get('/attr/sensor')) @@ -375,6 +378,9 @@ def available_datasets(self, configured_datasets=None): ds_info['coordinates'] = ['longitude', 'latitude'] yield True, ds_info + if CHANNEL_ALIASES.get(self.sensor) is not None: + yield from self._available_aliases(ds_info, var_name) + def get_shape(self, dataset_id, ds_info): """Get the shape.""" var_name = ds_info.get('file_key', dataset_id['name']) @@ -425,11 +431,20 @@ def __init__(self, filename, filename_info, filetype_info): {"name": "longitude"}) def _get_ds_info_for_data_arr(self, var_name): + """Set data name and, if applicable, aliases.""" + channel_info = None ds_info = { 'file_type': self.filetype_info['file_type'], 'name': var_name, } - return ds_info + yield True, ds_info + + if CHANNEL_ALIASES.get(self.sensor) is not None: + channel_info = CHANNEL_ALIASES.get(self.sensor).get(var_name, None) + if channel_info is not None: + channel_info["file_key"] = var_name + ds_info.update(channel_info) + yield True, ds_info @staticmethod def _is_2d_yx_data_array(data_arr): @@ -450,19 +465,7 @@ def _available_new_datasets(self, handled_vars): # we need 'traditional' y/x dimensions currently continue - ds_info = self._get_ds_info_for_data_arr(var_name) - ds_info.update({"file_key": var_name}) - yield True, ds_info - - alias_info = CHANNEL_ALIASES[self.sensor].get(var_name, None) - if alias_info is not None: - alias_info.update({"file_key": var_name}) - if "RESOLUTION_KM" in self.nc.attrs: - alias_info["resolution"] = self.nc.attrs["RESOLUTION_KM"] * 1000. - else: - alias_info["resolution"] = NADIR_RESOLUTION[self.sensor] - ds_info.update(alias_info) - yield True, ds_info + yield from self._get_ds_info_for_data_arr(var_name) def available_datasets(self, configured_datasets=None): """Dynamically discover what variables can be loaded from this file. @@ -488,7 +491,7 @@ def _is_polar(self): l1b_att, inst_att = (str(self.nc.attrs.get('L1B', None)), str(self.nc.attrs.get('sensor', None))) - return (inst_att != 'AHI' and 'GOES' not in inst_att) or (l1b_att is None) + return (inst_att not in ['ABI', 'AHI'] and 'GOES' not in inst_att) or (l1b_att is None) def get_area_def(self, key): """Get the area definition of the data at hand.""" diff --git a/satpy/tests/reader_tests/test_clavrx.py b/satpy/tests/reader_tests/test_clavrx.py index 86e0cf1fa7..5a90bf873a 100644 --- a/satpy/tests/reader_tests/test_clavrx.py +++ b/satpy/tests/reader_tests/test_clavrx.py @@ -386,7 +386,7 @@ def test_load_all_old_donor(self): else: self.assertNotIn('_FillValue', v.attrs) if v.attrs["name"] == 'variable1': - self.assertIsInstance(v.attrs["valid_range"], list) + self.assertIsInstance(v.attrs["valid_range"], tuple) else: self.assertNotIn('valid_range', v.attrs) if 'flag_values' in v.attrs: diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index a72e46c354..5f0ba812b7 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -36,17 +36,17 @@ DEFAULT_LAT_DATA = np.repeat([DEFAULT_LAT_DATA], DEFAULT_FILE_SHAPE[0], axis=0) DEFAULT_LON_DATA = np.linspace(5, 45, DEFAULT_FILE_SHAPE[1]).astype(DEFAULT_FILE_DTYPE) DEFAULT_LON_DATA = np.repeat([DEFAULT_LON_DATA], DEFAULT_FILE_SHAPE[0], axis=0) -AHI_FILE = 'clavrx_H08_20210603_1500_B01_FLDK_R.level2.nc' +ABI_FILE = 'clavrx_OR_ABI-L1b-RadC-M6C01_G16_s20231021601173.level2.nc' FILL_VALUE = -32768 def fake_test_content(filename, **kwargs): """Mimic reader input file content.""" attrs = { - 'platform': 'HIM8', - 'sensor': 'AHI', + 'platform': 'G16', + 'sensor': 'ABI', # this is a Level 2 file that came from a L1B file - 'L1B': 'clavrx_H08_20210603_1500_B01_FLDK_R', + 'L1B': '"clavrx_OR_ABI-L1b-RadC-M6C01_G16_s20231021601173', } longitude = xr.DataArray(DEFAULT_LON_DATA, @@ -127,7 +127,7 @@ def setup_method(self): @pytest.mark.parametrize( ("filenames", "expected_loadables"), - [([AHI_FILE], 1)] + [([ABI_FILE], 1)] ) def test_reader_creation(self, filenames, expected_loadables): """Test basic initialization.""" @@ -143,7 +143,7 @@ def test_reader_creation(self, filenames, expected_loadables): @pytest.mark.parametrize( ("filenames", "expected_datasets"), - [([AHI_FILE], ['variable1', 'refl_0_65um_nom', 'variable3']), ] + [([ABI_FILE], ['variable1', 'refl_0_65um_nom', 'variable3']), ] ) def test_available_datasets(self, filenames, expected_datasets): """Test that variables are dynamically discovered.""" @@ -157,12 +157,12 @@ def test_available_datasets(self, filenames, expected_datasets): for var_name in expected_datasets: assert var_name in avails # check extra datasets created by alias or coordinates - for var_name in ["latitude", "longitude", "C03"]: + for var_name in ["latitude", "longitude"]: assert var_name in avails @pytest.mark.parametrize( ("filenames", "loadable_ids"), - [([AHI_FILE], ['variable1', 'refl_0_65um_nom', 'C03', 'variable3']), ] + [([ABI_FILE], ['variable1', 'refl_0_65um_nom', 'C02', 'variable3']), ] ) def test_load_all_new_donor(self, filenames, loadable_ids): """Test loading all test datasets with new donor.""" @@ -181,8 +181,8 @@ def test_load_all_new_donor(self, filenames, loadable_ids): semi_major_axis=6378137, semi_minor_axis=6356752.3142, perspective_point_height=35791000, - longitude_of_projection_origin=140.7, - sweep_angle_axis='y', + longitude_of_projection_origin=-137.2, + sweep_angle_axis='x', ) d.return_value = fake_donor = mock.MagicMock( variables={'goes_imager_projection': proj, 'x': x, 'y': y}, @@ -194,15 +194,15 @@ def test_load_all_new_donor(self, filenames, loadable_ids): assert 'calibration' not in v.attrs assert "units" in v.attrs assert isinstance(v.attrs['area'], AreaDefinition) - assert v.attrs['platform_name'] == 'himawari8' - assert v.attrs['sensor'] == 'ahi' + assert v.attrs['platform_name'] == 'GOES-16' + assert v.attrs['sensor'] == 'abi' assert 'rows_per_scan' not in v.coords.get('longitude').attrs if v.attrs["name"] == 'variable1': assert "valid_range" not in v.attrs assert v.dtype == np.float64 assert "_FillValue" not in v.attrs # should have file variable and one alias for reflectance - elif v.attrs["name"] in ["refl_0_65um_nom", "C03"]: + elif v.attrs["name"] in ["refl_0_65um_nom", "C02"]: assert isinstance(v.attrs["valid_range"], list) assert v.dtype == np.float64 assert "_FillValue" not in v.attrs.keys() From a48111e023e73fbabba1338901fdb9bfc5201d4a Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Tue, 9 May 2023 13:55:26 -0500 Subject: [PATCH 013/481] attempt to address complexity of available_datasets --- satpy/readers/clavrx.py | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index 289adf6e0a..d5154dca91 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -333,6 +333,23 @@ def _available_aliases(self, ds_info, current_var): ds_info.update(alias_info) yield True, ds_info + def _dynamic_datasets(self, nadir_resolution): + """Get data from file and build aliases.""" + # add new datasets + for var_name, val in self.file_content.items(): + if isinstance(val, SDS): + ds_info = { + 'file_type': self.filetype_info['file_type'], + 'resolution': nadir_resolution, + 'name': var_name, + } + if self._is_polar(): + ds_info['coordinates'] = ['longitude', 'latitude'] + yield True, ds_info + + if CHANNEL_ALIASES.get(self.sensor) is not None: + yield from self._available_aliases(ds_info, var_name) + def available_datasets(self, configured_datasets=None): """Automatically determine datasets provided by this file.""" self.sensor = _get_sensor(self.file_content.get('/attr/sensor')) @@ -366,20 +383,7 @@ def available_datasets(self, configured_datasets=None): # then we should keep it going down the chain yield is_avail, ds_info - # add new datasets - for var_name, val in self.file_content.items(): - if isinstance(val, SDS): - ds_info = { - 'file_type': self.filetype_info['file_type'], - 'resolution': nadir_resolution, - 'name': var_name, - } - if self._is_polar(): - ds_info['coordinates'] = ['longitude', 'latitude'] - yield True, ds_info - - if CHANNEL_ALIASES.get(self.sensor) is not None: - yield from self._available_aliases(ds_info, var_name) + yield from self._dynamic_datasets(nadir_resolution) def get_shape(self, dataset_id, ds_info): """Get the shape.""" @@ -452,7 +456,7 @@ def _is_2d_yx_data_array(data_arr): has_x_dim = data_arr.dims[1] == "x" return has_y_dim and has_x_dim - def _available_new_datasets(self, handled_vars): + def _available_file_datasets(self, handled_vars): """Metadata for available variables other than BT.""" possible_vars = list(self.nc.items()) + list(self.nc.coords.items()) for var_name, data_arr in possible_vars: @@ -485,7 +489,7 @@ def available_datasets(self, configured_datasets=None): if self.file_type_matches(ds_info['file_type']): handled_vars.add(ds_info['name']) yield self.file_type_matches(ds_info['file_type']), ds_info - yield from self._available_new_datasets(handled_vars) + yield from self._available_file_datasets(handled_vars) def _is_polar(self): l1b_att, inst_att = (str(self.nc.attrs.get('L1B', None)), From db8b011633cfbb3e1f1e6d8ff0bc8ba4400e82cc Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Mon, 15 May 2023 10:43:45 -0500 Subject: [PATCH 014/481] Trying to adjust for complexity error in available datasets --- satpy/readers/clavrx.py | 45 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index d5154dca91..3add1ea380 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -294,6 +294,9 @@ def __init__(self, filename, filename_info, filetype_info): filename_info, filetype_info) + self.sensor = _get_sensor(self.file_content.get('/attr/sensor')) + self.platform = _get_platform(self.file_content.get('/attr/platform')) + @property def start_time(self): """Get the start time.""" @@ -333,9 +336,26 @@ def _available_aliases(self, ds_info, current_var): ds_info.update(alias_info) yield True, ds_info + def _add_info_if_appropriate(self, is_avail, ds_info, nadir_resolution): + """Add more information if this reader can provide it.""" + new_info = ds_info.copy() # don't change input + this_res = ds_info.get('resolution') + var_name = ds_info.get('file_key', ds_info['name']) + matches = self.file_type_matches(ds_info['file_type']) + # we can confidently say that we can provide this dataset and can + # provide more info + if matches and var_name in self and this_res != nadir_resolution: + new_info['resolution'] = nadir_resolution + if self._is_polar(): + new_info['coordinates'] = ds_info.get('coordinates', ('longitude', 'latitude')) + yield True, new_info + elif is_avail is None: + # if we didn't know how to handle this dataset and no one else did + # then we should keep it going down the chain + yield is_avail, ds_info + def _dynamic_datasets(self, nadir_resolution): """Get data from file and build aliases.""" - # add new datasets for var_name, val in self.file_content.items(): if isinstance(val, SDS): ds_info = { @@ -352,36 +372,15 @@ def _dynamic_datasets(self, nadir_resolution): def available_datasets(self, configured_datasets=None): """Automatically determine datasets provided by this file.""" - self.sensor = _get_sensor(self.file_content.get('/attr/sensor')) - self.platform = _get_platform(self.file_content.get('/attr/platform')) - nadir_resolution = self.get_nadir_resolution(self.sensor) - coordinates = ('longitude', 'latitude') - handled_variables = set() # update previously configured datasets for is_avail, ds_info in (configured_datasets or []): - this_res = ds_info.get('resolution') - this_coords = ds_info.get('coordinates') # some other file handler knows how to load this if is_avail is not None: yield is_avail, ds_info - var_name = ds_info.get('file_key', ds_info['name']) - matches = self.file_type_matches(ds_info['file_type']) - # we can confidently say that we can provide this dataset and can - # provide more info - if matches and var_name in self and this_res != nadir_resolution: - handled_variables.add(var_name) - new_info = ds_info.copy() # don't mess up the above yielded - new_info['resolution'] = nadir_resolution - if self._is_polar() and this_coords is None: - new_info['coordinates'] = coordinates - yield True, new_info - elif is_avail is None: - # if we didn't know how to handle this dataset and no one else did - # then we should keep it going down the chain - yield is_avail, ds_info + yield from self._add_info_if_appropriate(is_avail, ds_info, nadir_resolution) yield from self._dynamic_datasets(nadir_resolution) From 01608a1bc0372a459d00587667ad241a2ed1a03d Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 19 May 2023 11:53:39 -0500 Subject: [PATCH 015/481] Add minor tests and refactor netcdf test to use a mock class so that repeating parameterize decorators can be removed. --- satpy/readers/clavrx.py | 70 +++---- satpy/tests/reader_tests/test_clavrx.py | 70 +++++-- satpy/tests/reader_tests/test_clavrx_nc.py | 218 ++++++++++++--------- 3 files changed, 215 insertions(+), 143 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index 3add1ea380..3d7455d209 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -296,6 +296,7 @@ def __init__(self, filename, filename_info, filetype_info): self.sensor = _get_sensor(self.file_content.get('/attr/sensor')) self.platform = _get_platform(self.file_content.get('/attr/platform')) + self.resolution = self.get_nadir_resolution(self.sensor) @property def start_time(self): @@ -329,60 +330,63 @@ def get_nadir_resolution(self, sensor): def _available_aliases(self, ds_info, current_var): """Add alias if there is a match.""" + new_info = ds_info.copy() alias_info = CHANNEL_ALIASES.get(self.sensor).get(current_var, None) if alias_info is not None: alias_info.update({"file_key": current_var}) - alias_info["resolution"] = self.get_nadir_resolution(self.sensor) - ds_info.update(alias_info) - yield True, ds_info + new_info.update(alias_info) + yield True, new_info - def _add_info_if_appropriate(self, is_avail, ds_info, nadir_resolution): + def _supplement_configured(self, configured_datasets=None): """Add more information if this reader can provide it.""" - new_info = ds_info.copy() # don't change input - this_res = ds_info.get('resolution') - var_name = ds_info.get('file_key', ds_info['name']) - matches = self.file_type_matches(ds_info['file_type']) - # we can confidently say that we can provide this dataset and can - # provide more info - if matches and var_name in self and this_res != nadir_resolution: - new_info['resolution'] = nadir_resolution - if self._is_polar(): - new_info['coordinates'] = ds_info.get('coordinates', ('longitude', 'latitude')) - yield True, new_info - elif is_avail is None: - # if we didn't know how to handle this dataset and no one else did - # then we should keep it going down the chain - yield is_avail, ds_info + for is_avail, ds_info in (configured_datasets or []): + # some other file handler knows how to load this + print(is_avail, ds_info) + if is_avail is not None: + yield is_avail, ds_info + + new_info = ds_info.copy() # don't change input + this_res = ds_info.get('resolution') + var_name = ds_info.get('file_key', ds_info['name']) + matches = self.file_type_matches(ds_info['file_type']) + # we can confidently say that we can provide this dataset and can + # provide more info + if matches and var_name in self and this_res != self.resolution: + new_info['resolution'] = self.resolution + if self._is_polar(): + new_info['coordinates'] = ds_info.get('coordinates', ('longitude', 'latitude')) + yield True, new_info + elif is_avail is None: + # if we didn't know how to handle this dataset and no one else did + # then we should keep it going down the chain + yield is_avail, ds_info - def _dynamic_datasets(self, nadir_resolution): + def _dynamic_datasets(self): """Get data from file and build aliases.""" for var_name, val in self.file_content.items(): if isinstance(val, SDS): ds_info = { 'file_type': self.filetype_info['file_type'], - 'resolution': nadir_resolution, + 'resolution': self.resolution, 'name': var_name, } if self._is_polar(): ds_info['coordinates'] = ['longitude', 'latitude'] - yield True, ds_info + # always yield what we have + yield True, ds_info if CHANNEL_ALIASES.get(self.sensor) is not None: + # yield variable as it is + # yield any associated aliases yield from self._available_aliases(ds_info, var_name) def available_datasets(self, configured_datasets=None): """Automatically determine datasets provided by this file.""" - nadir_resolution = self.get_nadir_resolution(self.sensor) - # update previously configured datasets - for is_avail, ds_info in (configured_datasets or []): - # some other file handler knows how to load this - if is_avail is not None: - yield is_avail, ds_info - - yield from self._add_info_if_appropriate(is_avail, ds_info, nadir_resolution) + yield from self._supplement_configured(configured_datasets) - yield from self._dynamic_datasets(nadir_resolution) + # get data from file dynamically + yield from self._dynamic_datasets() def get_shape(self, dataset_id, ds_info): """Get the shape.""" @@ -433,7 +437,7 @@ def __init__(self, filename, filename_info, filetype_info): self.nc.coords["longitude"] = _CLAVRxHelper._get_data(self.nc.coords["longitude"], {"name": "longitude"}) - def _get_ds_info_for_data_arr(self, var_name): + def _dynamic_dataset_info(self, var_name): """Set data name and, if applicable, aliases.""" channel_info = None ds_info = { @@ -468,7 +472,7 @@ def _available_file_datasets(self, handled_vars): # we need 'traditional' y/x dimensions currently continue - yield from self._get_ds_info_for_data_arr(var_name) + yield from self._dynamic_dataset_info(var_name) def available_datasets(self, configured_datasets=None): """Dynamically discover what variables can be loaded from this file. diff --git a/satpy/tests/reader_tests/test_clavrx.py b/satpy/tests/reader_tests/test_clavrx.py index 5a90bf873a..94a3da097f 100644 --- a/satpy/tests/reader_tests/test_clavrx.py +++ b/satpy/tests/reader_tests/test_clavrx.py @@ -48,7 +48,6 @@ def get_test_content(self, filename, filename_info, filetype_info): '/attr/platform': 'SNPP', '/attr/sensor': 'VIIRS', } - file_content['longitude'] = xr.DataArray( da.from_array(DEFAULT_LON_DATA, chunks=4096), attrs={ @@ -104,6 +103,20 @@ def get_test_content(self, filename, filename_info, filetype_info): }) file_content['variable3/shape'] = DEFAULT_FILE_SHAPE + file_content['refl_1_38um_nom'] = xr.DataArray( + da.from_array(DEFAULT_FILE_DATA, chunks=4096).astype(np.float32), + attrs={ + 'SCALED': 1, + 'add_offset': 59.0, + 'scale_factor': 0.0018616290763020515, + 'units': '%', + '_FillValue': -32768, + 'valid_range': [-32767, 32767], + 'actual_range': [-2., 120.], + 'actual_missing': -999.0 + }) + file_content['refl_1_38um_nom/shape'] = DEFAULT_FILE_SHAPE + return file_content @@ -204,6 +217,24 @@ def test_available_datasets(self): self.assertTrue(new_ds_infos[8][0]) self.assertEqual(new_ds_infos[8][1]['resolution'], 742) + def test_available_datasets_with_alias(self): + """Test availability of aliased dataset.""" + import xarray as xr + + from satpy.readers import load_reader + r = load_reader(self.reader_configs) + with mock.patch('satpy.readers.clavrx.SDS', xr.DataArray): + loadables = r.select_files_from_pathnames([ + 'clavrx_npp_d20170520_t2053581_e2055223_b28822.level2.hdf', + ]) + r.create_filehandlers(loadables) + available_ds = list(r.file_handlers['clavrx_hdf4'][0].available_datasets()) + + self.assertEqual(available_ds[5][1]["name"], "refl_1_38um_nom") + + self.assertEqual(available_ds[6][1]["name"], "M09") + self.assertEqual(available_ds[6][1]["file_key"], "refl_1_38um_nom") + def test_load_all(self): """Test loading all test datasets.""" import xarray as xr @@ -216,17 +247,17 @@ def test_load_all(self): ]) r.create_filehandlers(loadables) - var_list = ['variable1', 'variable2', 'variable3'] + var_list = ["M09", 'variable2', 'variable3'] datasets = r.load(var_list) self.assertEqual(len(datasets), len(var_list)) for v in datasets.values(): - self.assertEqual(v.attrs['units'], '1') + self.assertIn(v.attrs['units'], ['1', '%']) self.assertEqual(v.attrs['platform_name'], 'npp') self.assertEqual(v.attrs['sensor'], 'viirs') self.assertIsInstance(v.attrs['area'], SwathDefinition) self.assertEqual(v.attrs['area'].lons.attrs['rows_per_scan'], 16) self.assertEqual(v.attrs['area'].lats.attrs['rows_per_scan'], 16) - self.assertIsInstance(datasets["variable3"].attrs.get("flag_meanings"), list) + self.assertIsInstance(datasets["variable3"].attrs.get("flag_meanings"), list) class FakeHDF4FileHandlerGeo(FakeHDF4FileHandler): @@ -263,17 +294,20 @@ def get_test_content(self, filename, filename_info, filetype_info): }) file_content['latitude/shape'] = DEFAULT_FILE_SHAPE - file_content['variable1'] = xr.DataArray( + file_content['refl_1_38um_nom'] = xr.DataArray( DEFAULT_FILE_DATA.astype(np.float32), dims=('y', 'x'), attrs={ - '_FillValue': -1, - 'scale_factor': 1., - 'add_offset': 0., - 'units': '1', - 'valid_range': (-32767, 32767), + 'SCALED': 1, + 'add_offset': 59.0, + 'scale_factor': 0.0018616290763020515, + 'units': '%', + '_FillValue': -32768, + 'valid_range': [-32767, 32767], + 'actual_range': [-2., 120.], + 'actual_missing': -999.0 }) - file_content['variable1/shape'] = DEFAULT_FILE_SHAPE + file_content['refl_1_38um_nom/shape'] = DEFAULT_FILE_SHAPE # data with fill values file_content['variable2'] = xr.DataArray( @@ -347,7 +381,7 @@ def test_no_nav_donor(self): 'clavrx_H08_20180806_1800.level2.hdf', ]) r.create_filehandlers(loadables) - self.assertRaises(IOError, r.load, ['variable1', 'variable2', 'variable3']) + self.assertRaises(IOError, r.load, ['refl_1_38um_nom', 'variable2', 'variable3']) def test_load_all_old_donor(self): """Test loading all test datasets with old donor.""" @@ -375,18 +409,18 @@ def test_load_all_old_donor(self): variables={'Projection': proj, 'x': x, 'y': y}, ) fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] - datasets = r.load(['variable1', 'variable2', 'variable3']) + datasets = r.load(['refl_1_38um_nom', 'variable2', 'variable3']) self.assertEqual(len(datasets), 3) for v in datasets.values(): self.assertNotIn('calibration', v.attrs) - self.assertEqual(v.attrs['units'], '1') + self.assertIn(v.attrs['units'], ['1', '%']) self.assertIsInstance(v.attrs['area'], AreaDefinition) if v.attrs.get("flag_values"): self.assertIn('_FillValue', v.attrs) else: self.assertNotIn('_FillValue', v.attrs) - if v.attrs["name"] == 'variable1': - self.assertIsInstance(v.attrs["valid_range"], tuple) + if v.attrs["name"] == 'refl_1_38um_nom': + self.assertIsInstance(v.attrs["valid_range"], list) else: self.assertNotIn('valid_range', v.attrs) if 'flag_values' in v.attrs: @@ -419,11 +453,11 @@ def test_load_all_new_donor(self): variables={'goes_imager_projection': proj, 'x': x, 'y': y}, ) fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] - datasets = r.load(['variable1', 'variable2', 'variable3']) + datasets = r.load(['refl_1_38um_nom', 'variable2', 'variable3']) self.assertEqual(len(datasets), 3) for v in datasets.values(): self.assertNotIn('calibration', v.attrs) - self.assertEqual(v.attrs['units'], '1') + self.assertIn(v.attrs['units'], ['1', '%']) self.assertIsInstance(v.attrs['area'], AreaDefinition) self.assertTrue(v.attrs['area'].is_geostationary) self.assertEqual(v.attrs['platform_name'], 'himawari8') diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index 5f0ba812b7..a7dba879e5 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (c) 2021 Satpy developers +# Copyright (c) 2018 Satpy developers # # This file is part of satpy. # @@ -18,13 +18,17 @@ """Module for testing the satpy.readers.clavrx module.""" import os +import unittest from unittest import mock import numpy as np -import pytest import xarray as xr from pyresample.geometry import AreaDefinition +from satpy.readers import load_reader +from satpy.tests.reader_tests.test_netCDF_utils import FakeNetCDF4FileHandler + +ABI_FILE = 'clavrx_OR_ABI-L1b-RadC-M6C01_G16_s20231021601173.level2.nc' DEFAULT_FILE_DTYPE = np.uint16 DEFAULT_FILE_SHAPE = (10, 300) DEFAULT_FILE_DATA = np.arange(DEFAULT_FILE_SHAPE[0] * DEFAULT_FILE_SHAPE[1], @@ -40,7 +44,7 @@ FILL_VALUE = -32768 -def fake_test_content(filename, **kwargs): +def fake_dataset(): """Mimic reader input file content.""" attrs = { 'platform': 'G16', @@ -115,99 +119,129 @@ def fake_test_content(filename, **kwargs): return ds -class TestCLAVRXReaderGeo: - """Test CLAVR-X Reader with Geo files.""" +class FakeNetCDF4FileHandlerCLAVRx(FakeNetCDF4FileHandler): + """Swap-in NetCDF4 File Handler.""" + + def get_test_content(self, filename, filename_info, filetype_info): + """Get a fake dataset.""" + return fake_dataset() + + +class TestCLAVRXReaderNetCDF(unittest.TestCase): + """Test CLAVR-X Reader with NetCDF files.""" yaml_file = "clavrx.yaml" + filename = ABI_FILE + loadable_ids = list(fake_dataset().keys()) - def setup_method(self): - """Read fake data.""" + def setUp(self): + """Wrap NetCDF file handler with a fake handler.""" from satpy._config import config_search_paths - self.reader_configs = config_search_paths(os.path.join('readers', self.yaml_file)) + from satpy.readers.clavrx import CLAVRXNetCDFFileHandler - @pytest.mark.parametrize( - ("filenames", "expected_loadables"), - [([ABI_FILE], 1)] - ) - def test_reader_creation(self, filenames, expected_loadables): - """Test basic initialization.""" - from satpy.readers import load_reader - with mock.patch('satpy.readers.clavrx.xr.open_dataset') as od: - od.side_effect = fake_test_content - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames(filenames) - assert len(loadables) == expected_loadables - r.create_filehandlers(loadables) - # make sure we have some files - assert r.file_handlers - - @pytest.mark.parametrize( - ("filenames", "expected_datasets"), - [([ABI_FILE], ['variable1', 'refl_0_65um_nom', 'variable3']), ] - ) - def test_available_datasets(self, filenames, expected_datasets): + self.reader_configs = config_search_paths(os.path.join('readers', self.yaml_file)) + # http://stackoverflow.com/questions/12219967/how-to-mock-a-base-class-with-python-mock-library + self.p = mock.patch.object(CLAVRXNetCDFFileHandler, '__bases__', + (FakeNetCDF4FileHandlerCLAVRx,), spec=True) + self.fake_open_dataset = mock.patch('satpy.readers.clavrx.xr.open_dataset', + return_value=fake_dataset()).start() + self.fake_handler = self.p.start() + self.p.is_local = True + + self.addCleanup(mock.patch.stopall) + + def test_init(self): + """Test basic init with no extra parameters.""" + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames([ABI_FILE]) + self.assertEqual(len(loadables), 1) + r.create_filehandlers(loadables) + # make sure we have some files + self.assertTrue(r.file_handlers) + + def test_available_datasets(self): """Test that variables are dynamically discovered.""" - from satpy.readers import load_reader - with mock.patch('satpy.readers.clavrx.xr.open_dataset') as od: - od.side_effect = fake_test_content - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames(filenames) - r.create_filehandlers(loadables) - avails = list(r.available_dataset_names) - for var_name in expected_datasets: - assert var_name in avails - # check extra datasets created by alias or coordinates - for var_name in ["latitude", "longitude"]: - assert var_name in avails - - @pytest.mark.parametrize( - ("filenames", "loadable_ids"), - [([ABI_FILE], ['variable1', 'refl_0_65um_nom', 'C02', 'variable3']), ] - ) - def test_load_all_new_donor(self, filenames, loadable_ids): + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames([ABI_FILE]) + r.create_filehandlers(loadables) + avails = list(r.available_dataset_names) + expected_datasets = self.loadable_ids + ["latitude", "longitude"] + self.assertEqual(avails.sort(), expected_datasets.sort()) + + def test_load_all_new_donor(self): """Test loading all test datasets with new donor.""" - from satpy.readers import load_reader - with mock.patch('satpy.readers.clavrx.xr.open_dataset') as od: - od.side_effect = fake_test_content - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames(filenames) - r.create_filehandlers(loadables) - with mock.patch('satpy.readers.clavrx.glob') as g, \ - mock.patch('satpy.readers.clavrx.netCDF4.Dataset') as d: - g.return_value = ['fake_donor.nc'] - x = np.linspace(-0.1518, 0.1518, 300) - y = np.linspace(0.1518, -0.1518, 10) - proj = mock.Mock( - semi_major_axis=6378137, - semi_minor_axis=6356752.3142, - perspective_point_height=35791000, - longitude_of_projection_origin=-137.2, - sweep_angle_axis='x', - ) - d.return_value = fake_donor = mock.MagicMock( - variables={'goes_imager_projection': proj, 'x': x, 'y': y}, - ) - fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] - datasets = r.load(loadable_ids) - assert len(datasets) == 4 - for v in datasets.values(): - assert 'calibration' not in v.attrs - assert "units" in v.attrs - assert isinstance(v.attrs['area'], AreaDefinition) - assert v.attrs['platform_name'] == 'GOES-16' - assert v.attrs['sensor'] == 'abi' - assert 'rows_per_scan' not in v.coords.get('longitude').attrs - if v.attrs["name"] == 'variable1': - assert "valid_range" not in v.attrs - assert v.dtype == np.float64 - assert "_FillValue" not in v.attrs - # should have file variable and one alias for reflectance - elif v.attrs["name"] in ["refl_0_65um_nom", "C02"]: - assert isinstance(v.attrs["valid_range"], list) - assert v.dtype == np.float64 - assert "_FillValue" not in v.attrs.keys() - assert (v.attrs["file_key"] == "refl_0_65um_nom") - else: - assert (datasets['variable3'].attrs.get('flag_meanings')) is not None - assert (datasets['variable3'].attrs.get('flag_meanings') == '') - assert np.issubdtype(v.dtype, np.integer) + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames([ABI_FILE]) + r.create_filehandlers(loadables) + with mock.patch('satpy.readers.clavrx.glob') as g, \ + mock.patch('satpy.readers.clavrx.netCDF4.Dataset') as d: + g.return_value = ['fake_donor.nc'] + x = np.linspace(-0.1518, 0.1518, 300) + y = np.linspace(0.1518, -0.1518, 10) + proj = mock.Mock( + semi_major_axis=6378137, + semi_minor_axis=6356752.3142, + perspective_point_height=35791000, + longitude_of_projection_origin=-137.2, + sweep_angle_axis='x', + ) + d.return_value = fake_donor = mock.MagicMock( + variables={'goes_imager_projection': proj, 'x': x, 'y': y}, + ) + fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] + + datasets = r.load(self.loadable_ids) + self.assertEqual(len(datasets), len(self.loadable_ids)) + for v in datasets.values(): + self.assertIsInstance(v.area, AreaDefinition) + self.assertEqual(v.platform_name, 'GOES-16') + self.assertEqual(v.sensor, 'abi') + + self.assertNotIn('calibration', v.attrs) + self.assertIn("units", v.attrs) + self.assertNotIn('rows_per_scan', v.coords.get('longitude').attrs) + # should have file variable and one alias for reflectance + if v.name == "variable1": + self.assertNotIn("valid_range", v.attrs) + self.assertNotIn("_FillValue", v.attrs) + self.assertEqual(np.float64, v.dtype) + elif v.name in ["refl_0_65um_nom", "C02"]: + self.assertIsInstance(v.valid_range, list) + self.assertEqual(np.float64, v.dtype) + self.assertNotIn("_FillValue", v.attrs) + if v.name == "C02": + self.assertEqual("refl_0_65um_nom", v.file_key) + else: + self.assertIsNotNone(datasets['variable3'].attrs.get('flag_meanings')) + self.assertEqual('', + datasets['variable3'].attrs.get('flag_meanings'), + ) + assert np.issubdtype(v.dtype, np.integer) + + def test_yaml_datasets(self): + """Test available_datasets with fake variables from YAML.""" + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames([ABI_FILE]) + r.create_filehandlers(loadables) + # mimic the YAML file being configured for more datasets + fake_dataset_info = [ + (None, {'name': 'yaml1', 'resolution': None, 'file_type': ['clavrx_nc']}), + (True, {'name': 'yaml2', 'resolution': 0.5, 'file_type': ['clavrx_nc']}), + ] + new_ds_infos = list(r.file_handlers['clavrx_nc'][0].available_datasets( + fake_dataset_info)) + self.assertEqual(len(new_ds_infos), 9) + + # we have this and can provide the resolution + self.assertTrue(new_ds_infos[0][0]) + self.assertEqual(new_ds_infos[0][1]['resolution'], 2004) # hardcoded + + # we have this, but previous file handler said it knew about it + # and it is producing the same resolution as what we have + self.assertTrue(new_ds_infos[1][0]) + self.assertEqual(new_ds_infos[1][1]['resolution'], 0.5) + + # we have this, but don't want to change the resolution + # because a previous handler said it has it + self.assertTrue(new_ds_infos[2][0]) + self.assertEqual(new_ds_infos[2][1]['resolution'], 2004) From f6caf710ba115118b1142e417eefe8d984cef85c Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 19 May 2023 12:23:20 -0500 Subject: [PATCH 016/481] Remove excessive if/then statements and actually test the alias name --- satpy/tests/reader_tests/test_clavrx_nc.py | 40 ++++++++++++---------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index a7dba879e5..b95a7dcce2 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -190,8 +190,27 @@ def test_load_all_new_donor(self): ) fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] - datasets = r.load(self.loadable_ids) - self.assertEqual(len(datasets), len(self.loadable_ids)) + datasets = r.load(self.loadable_ids + ["C02"]) + self.assertEqual(len(datasets), len(self.loadable_ids)+1) + + # should have file variable and one alias for reflectance + self.assertNotIn("valid_range", datasets["variable1"].attrs) + self.assertNotIn("_FillValue", datasets["variable1"].attrs) + self.assertEqual(np.float64, datasets["variable1"].dtype) + + assert np.issubdtype(datasets["variable3"].dtype, np.integer) + self.assertIsNotNone(datasets['variable3'].attrs.get('flag_meanings')) + self.assertEqual('', + datasets['variable3'].attrs.get('flag_meanings'), + ) + + self.assertIsInstance(datasets["refl_0_65um_nom"].valid_range, list) + self.assertEqual(np.float64, datasets["refl_0_65um_nom"].dtype) + self.assertNotIn("_FillValue", datasets["refl_0_65um_nom"].attrs) + + self.assertEqual("refl_0_65um_nom", datasets["C02"].file_key) + self.assertNotIn("_FillValue", datasets["C02"].attrs) + for v in datasets.values(): self.assertIsInstance(v.area, AreaDefinition) self.assertEqual(v.platform_name, 'GOES-16') @@ -200,23 +219,6 @@ def test_load_all_new_donor(self): self.assertNotIn('calibration', v.attrs) self.assertIn("units", v.attrs) self.assertNotIn('rows_per_scan', v.coords.get('longitude').attrs) - # should have file variable and one alias for reflectance - if v.name == "variable1": - self.assertNotIn("valid_range", v.attrs) - self.assertNotIn("_FillValue", v.attrs) - self.assertEqual(np.float64, v.dtype) - elif v.name in ["refl_0_65um_nom", "C02"]: - self.assertIsInstance(v.valid_range, list) - self.assertEqual(np.float64, v.dtype) - self.assertNotIn("_FillValue", v.attrs) - if v.name == "C02": - self.assertEqual("refl_0_65um_nom", v.file_key) - else: - self.assertIsNotNone(datasets['variable3'].attrs.get('flag_meanings')) - self.assertEqual('', - datasets['variable3'].attrs.get('flag_meanings'), - ) - assert np.issubdtype(v.dtype, np.integer) def test_yaml_datasets(self): """Test available_datasets with fake variables from YAML.""" From 26ad2b694a449434e67d7d41949b83d15e3804ba Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 19 May 2023 12:27:39 -0500 Subject: [PATCH 017/481] Remove extra space --- satpy/tests/reader_tests/test_clavrx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_clavrx.py b/satpy/tests/reader_tests/test_clavrx.py index 94a3da097f..7f1fecc2be 100644 --- a/satpy/tests/reader_tests/test_clavrx.py +++ b/satpy/tests/reader_tests/test_clavrx.py @@ -233,7 +233,7 @@ def test_available_datasets_with_alias(self): self.assertEqual(available_ds[5][1]["name"], "refl_1_38um_nom") self.assertEqual(available_ds[6][1]["name"], "M09") - self.assertEqual(available_ds[6][1]["file_key"], "refl_1_38um_nom") + self.assertEqual(available_ds[6][1]["file_key"], "refl_1_38um_nom") def test_load_all(self): """Test loading all test datasets.""" From d39a7cacd50e62dcb0c367aef54309c5e56e7133 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 26 May 2023 13:58:16 -0500 Subject: [PATCH 018/481] Fix mock cleanup error by using teardown rather than cleanup --- satpy/readers/clavrx.py | 116 +++++++++++---------- satpy/tests/reader_tests/test_clavrx.py | 1 + satpy/tests/reader_tests/test_clavrx_nc.py | 76 +++++++++++--- 3 files changed, 128 insertions(+), 65 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index 3d7455d209..f97c9cee19 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -33,7 +33,6 @@ LOG = logging.getLogger(__name__) - CF_UNITS = { 'none': '1', } @@ -69,18 +68,18 @@ } CHANNEL_ALIASES = { - "abi": {"refl_0_47um_nom": {"name": "C01", "wavelength": 0.47, "modifiers": ("sunz_corrected",)}, - "refl_0_65um_nom": {"name": "C02", "wavelength": 0.64, "modifiers": ("sunz_corrected",)}, - "refl_0_86um_nom": {"name": "C03", "wavelength": 0.865, "modifiers": ("sunz_corrected",)}, - "refl_1_38um_nom": {"name": "C04", "wavelength": 1.38, "modifiers": ("sunz_corrected",)}, - "refl_1_60um_nom": {"name": "C05", "wavelength": 1.61, "modifiers": ("sunz_corrected",)}, - "refl_2_10um_nom": {"name": "C06", "wavelength": 2.25, "modifiers": ("sunz_corrected",)}, - }, - "viirs": {"refl_0_65um_nom": {"name": "I01", "wavelength": 0.64, "modifiers": ("sunz_corrected",)}, - "refl_1_38um_nom": {"name": "M09", "wavelength": 1.38, "modifiers": ("sunz_corrected",)}, - "refl_1_60um_nom": {"name": "I03", "wavelength": 1.61, "modifiers": ("sunz_corrected",)} - } - } + "abi": {"refl_0_47um_nom": {"name": "C01", "wavelength": 0.47, "modifiers": ("sunz_corrected",)}, + "refl_0_65um_nom": {"name": "C02", "wavelength": 0.64, "modifiers": ("sunz_corrected",)}, + "refl_0_86um_nom": {"name": "C03", "wavelength": 0.865, "modifiers": ("sunz_corrected",)}, + "refl_1_38um_nom": {"name": "C04", "wavelength": 1.38, "modifiers": ("sunz_corrected",)}, + "refl_1_60um_nom": {"name": "C05", "wavelength": 1.61, "modifiers": ("sunz_corrected",)}, + "refl_2_10um_nom": {"name": "C06", "wavelength": 2.25, "modifiers": ("sunz_corrected",)}, + }, + "viirs": {"refl_0_65um_nom": {"name": "I01", "wavelength": 0.64, "modifiers": ("sunz_corrected",)}, + "refl_1_38um_nom": {"name": "M09", "wavelength": 1.38, "modifiers": ("sunz_corrected",)}, + "refl_1_60um_nom": {"name": "I03", "wavelength": 1.61, "modifiers": ("sunz_corrected",)} + } +} def _get_sensor(sensor: str) -> str: @@ -107,9 +106,29 @@ def _get_rows_per_scan(sensor: str) -> Optional[int]: return None +def _scale_data(data_arr: Union[xr.DataArray, int], scale_factor: float, add_offset: float) -> xr.DataArray: + """Scale data, if needed.""" + scaling_needed = not (scale_factor == 1.0 and add_offset == 0.0) + if scaling_needed: + data_arr = data_arr * scale_factor + add_offset + return data_arr + + class _CLAVRxHelper: """A base class for the CLAVRx File Handlers.""" + @staticmethod + def _get_nadir_resolution(sensor, resolution_from_filename_info): + """Get nadir resolution.""" + for k, v in NADIR_RESOLUTION.items(): + if sensor.startswith(k): + return v + res = resolution_from_filename_info + if res.endswith('m'): + return int(res[:-1]) + elif res is not None: + return int(res) + @staticmethod def _remove_attributes(attrs: dict) -> dict: """Remove attributes that described data before scaling.""" @@ -120,14 +139,6 @@ def _remove_attributes(attrs: dict) -> dict: attrs.pop(attr_key, None) return attrs - @staticmethod - def _scale_data(data_arr: Union[xr.DataArray, int], scale_factor: float, add_offset: float) -> xr.DataArray: - """Scale data, if needed.""" - scaling_needed = not (scale_factor == 1.0 and add_offset == 0.0) - if scaling_needed: - data_arr = data_arr * scale_factor + add_offset - return data_arr - @staticmethod def _get_data(data, dataset_id: dict) -> xr.DataArray: """Get a dataset.""" @@ -136,25 +147,28 @@ def _get_data(data, dataset_id: dict) -> xr.DataArray: attrs = data.attrs.copy() - fill = attrs.get('_FillValue') + # don't need these attributes after applied. factor = attrs.pop('scale_factor', (np.ones(1, dtype=data.dtype))[0]) offset = attrs.pop('add_offset', (np.zeros(1, dtype=data.dtype))[0]) + flag_values = data.attrs.get("flag_values", [None]) valid_range = attrs.get('valid_range', [None]) + if isinstance(valid_range, np.ndarray): + attrs["valid_range"] = valid_range.tolist() - flags = not data.attrs.get("SCALED", 1) and any(data.attrs.get("flag_values", [None])) - if not flags: + flags = not data.attrs.get("SCALED", 1) and any(flag_values) + if flags: + fill = attrs.get('_FillValue', None) + if isinstance(flag_values, np.ndarray) or isinstance(flag_values, list): + data = data.where((data >= flag_values[0]) & (data <= flag_values[-1]), fill) + else: + fill = attrs.pop('_FillValue', None) data = data.where(data != fill) - data = _CLAVRxHelper._scale_data(data, factor, offset) - # don't need _FillValue if it has been applied. - attrs.pop('_FillValue', None) - if isinstance(valid_range, np.ndarray): - valid_min = _CLAVRxHelper._scale_data(valid_range[0], factor, offset) - valid_max = _CLAVRxHelper._scale_data(valid_range[1], factor, offset) + data = _scale_data(data, factor, offset) + + if valid_range[0] is not None: + valid_min = _scale_data(valid_range[0], factor, offset) + valid_max = _scale_data(valid_range[1], factor, offset) data = data.where((data >= valid_min) & (data <= valid_max)) - else: - flag_values = attrs.get('flag_values', None) - if flag_values is not None and isinstance(flag_values, np.ndarray): - data = data.where((data >= flag_values[0]) & (data <= flag_values[-1]), fill) data.attrs = _CLAVRxHelper._remove_attributes(attrs) @@ -296,7 +310,8 @@ def __init__(self, filename, filename_info, filetype_info): self.sensor = _get_sensor(self.file_content.get('/attr/sensor')) self.platform = _get_platform(self.file_content.get('/attr/platform')) - self.resolution = self.get_nadir_resolution(self.sensor) + self.resolution = _CLAVRxHelper._get_nadir_resolution(self.sensor, + self.filename_info.get('resolution')) @property def start_time(self): @@ -317,17 +332,6 @@ def get_dataset(self, dataset_id, ds_info): data.attrs, ds_info) return data - def get_nadir_resolution(self, sensor): - """Get nadir resolution.""" - for k, v in NADIR_RESOLUTION.items(): - if sensor.startswith(k): - return v - res = self.filename_info.get('resolution') - if res.endswith('m'): - return int(res[:-1]) - elif res is not None: - return int(res) - def _available_aliases(self, ds_info, current_var): """Add alias if there is a match.""" new_info = ds_info.copy() @@ -341,7 +345,6 @@ def _supplement_configured(self, configured_datasets=None): """Add more information if this reader can provide it.""" for is_avail, ds_info in (configured_datasets or []): # some other file handler knows how to load this - print(is_avail, ds_info) if is_avail is not None: yield is_avail, ds_info @@ -431,6 +434,8 @@ def __init__(self, filename, filename_info, filetype_info): self.platform = _get_platform( self.filename_info.get('platform_shortname', None)) self.sensor = _get_sensor(self.nc.attrs.get('sensor', None)) + self.resolution = _CLAVRxHelper._get_nadir_resolution(self.sensor, + self.filename_info.get('resolution')) # coordinates need scaling and valid_range (mask_and_scale won't work on valid_range) self.nc.coords["latitude"] = _CLAVRxHelper._get_data(self.nc.coords["latitude"], {"name": "latitude"}) @@ -439,7 +444,6 @@ def __init__(self, filename, filename_info, filetype_info): def _dynamic_dataset_info(self, var_name): """Set data name and, if applicable, aliases.""" - channel_info = None ds_info = { 'file_type': self.filetype_info['file_type'], 'name': var_name, @@ -447,11 +451,12 @@ def _dynamic_dataset_info(self, var_name): yield True, ds_info if CHANNEL_ALIASES.get(self.sensor) is not None: + alias_info = ds_info.copy() channel_info = CHANNEL_ALIASES.get(self.sensor).get(var_name, None) if channel_info is not None: channel_info["file_key"] = var_name - ds_info.update(channel_info) - yield True, ds_info + alias_info.update(channel_info) + yield True, alias_info @staticmethod def _is_2d_yx_data_array(data_arr): @@ -488,10 +493,15 @@ def available_datasets(self, configured_datasets=None): # we don't know any more information than the previous # file handler so let's yield early yield is_avail, ds_info - continue - if self.file_type_matches(ds_info['file_type']): + + matches = self.file_type_matches(ds_info['file_type']) + if matches and ds_info.get('resolution') != self.resolution: + # reader knows something about this dataset (file type matches) + # add any information that this reader can add. + new_info = ds_info.copy() + new_info['resolution'] = self.resolution handled_vars.add(ds_info['name']) - yield self.file_type_matches(ds_info['file_type']), ds_info + yield True, new_info yield from self._available_file_datasets(handled_vars) def _is_polar(self): diff --git a/satpy/tests/reader_tests/test_clavrx.py b/satpy/tests/reader_tests/test_clavrx.py index 7f1fecc2be..f7c8f1f1cd 100644 --- a/satpy/tests/reader_tests/test_clavrx.py +++ b/satpy/tests/reader_tests/test_clavrx.py @@ -173,6 +173,7 @@ def test_available_datasets(self): (None, {'name': 'variable1', 'file_type': ['level_fake']}), (True, {'name': 'variable3', 'file_type': ['clavrx_hdf4']}), ] + new_ds_infos = list(r.file_handlers['clavrx_hdf4'][0].available_datasets( fake_dataset_info)) self.assertEqual(len(new_ds_infos), 9) diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index b95a7dcce2..0d3e6680cb 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU General Public License along with # satpy. If not, see . """Module for testing the satpy.readers.clavrx module.""" - import os import unittest from unittest import mock @@ -30,11 +29,13 @@ ABI_FILE = 'clavrx_OR_ABI-L1b-RadC-M6C01_G16_s20231021601173.level2.nc' DEFAULT_FILE_DTYPE = np.uint16 -DEFAULT_FILE_SHAPE = (10, 300) +DEFAULT_FILE_SHAPE = (5, 5) DEFAULT_FILE_DATA = np.arange(DEFAULT_FILE_SHAPE[0] * DEFAULT_FILE_SHAPE[1], dtype=DEFAULT_FILE_DTYPE).reshape(DEFAULT_FILE_SHAPE) DEFAULT_FILE_FLAGS = np.arange(DEFAULT_FILE_SHAPE[0] * DEFAULT_FILE_SHAPE[1], dtype=np.byte).reshape(DEFAULT_FILE_SHAPE) +DEFAULT_FILE_FLAGS_BEYOND_FILL = DEFAULT_FILE_FLAGS +DEFAULT_FILE_FLAGS_BEYOND_FILL[-1][:-2] = [-127, -127, -128] DEFAULT_FILE_FACTORS = np.array([2.0, 1.0], dtype=np.float32) DEFAULT_LAT_DATA = np.linspace(45, 65, DEFAULT_FILE_SHAPE[1]).astype(DEFAULT_FILE_DTYPE) DEFAULT_LAT_DATA = np.repeat([DEFAULT_LAT_DATA], DEFAULT_FILE_SHAPE[0], axis=0) @@ -97,7 +98,7 @@ def fake_dataset(): variable2 = variable2.where(variable2 % 2 != 0, FILL_VALUE) # category - variable3 = xr.DataArray(DEFAULT_FILE_FLAGS.astype(np.int8), + var_flags = xr.DataArray(DEFAULT_FILE_FLAGS.astype(np.int8), dims=('scan_lines_along_track_direction', 'pixel_elements_along_scan_direction'), attrs={'SCALED': 0, @@ -105,12 +106,21 @@ def fake_dataset(): 'units': '1', 'flag_values': [0, 1, 2, 3]}) + out_of_range_flags = xr.DataArray(DEFAULT_FILE_FLAGS_BEYOND_FILL.astype(np.int8), + dims=('scan_lines_along_track_direction', + 'pixel_elements_along_scan_direction'), + attrs={'SCALED': 0, + '_FillValue': -127, + 'units': '1', + 'flag_values': [0, 1, 2, 3]}) + ds_vars = { 'longitude': longitude, 'latitude': latitude, 'variable1': variable1, 'refl_0_65um_nom': variable2, - 'variable3': variable3 + 'var_flags': var_flags, + 'out_of_range_flags': out_of_range_flags, } ds = xr.Dataset(ds_vars, attrs=attrs) @@ -142,13 +152,19 @@ def setUp(self): self.reader_configs = config_search_paths(os.path.join('readers', self.yaml_file)) # http://stackoverflow.com/questions/12219967/how-to-mock-a-base-class-with-python-mock-library self.p = mock.patch.object(CLAVRXNetCDFFileHandler, '__bases__', - (FakeNetCDF4FileHandlerCLAVRx,), spec=True) + (FakeNetCDF4FileHandlerCLAVRx,)) self.fake_open_dataset = mock.patch('satpy.readers.clavrx.xr.open_dataset', return_value=fake_dataset()).start() + self.expected_dataset = mock.patch('xarray.load_dataset', + return_value=fake_dataset()).start() self.fake_handler = self.p.start() self.p.is_local = True - self.addCleanup(mock.patch.stopall) + def tearDown(self): + """Stop wrapping the NetCDF4 file handler.""" + self.p.stop() + self.fake_open_dataset.stop() + self.expected_dataset.stop() def test_init(self): """Test basic init with no extra parameters.""" @@ -176,8 +192,8 @@ def test_load_all_new_donor(self): with mock.patch('satpy.readers.clavrx.glob') as g, \ mock.patch('satpy.readers.clavrx.netCDF4.Dataset') as d: g.return_value = ['fake_donor.nc'] - x = np.linspace(-0.1518, 0.1518, 300) - y = np.linspace(0.1518, -0.1518, 10) + x = np.linspace(-0.1518, 0.1518, 5) + y = np.linspace(0.1518, -0.1518, 5) proj = mock.Mock( semi_major_axis=6378137, semi_minor_axis=6356752.3142, @@ -198,11 +214,12 @@ def test_load_all_new_donor(self): self.assertNotIn("_FillValue", datasets["variable1"].attrs) self.assertEqual(np.float64, datasets["variable1"].dtype) - assert np.issubdtype(datasets["variable3"].dtype, np.integer) - self.assertIsNotNone(datasets['variable3'].attrs.get('flag_meanings')) + assert np.issubdtype(datasets["var_flags"].dtype, np.integer) + self.assertIsNotNone(datasets['var_flags'].attrs.get('flag_meanings')) self.assertEqual('', - datasets['variable3'].attrs.get('flag_meanings'), + datasets['var_flags'].attrs.get('flag_meanings'), ) + assert np.issubdtype(datasets["out_of_range_flags"].dtype, np.integer) self.assertIsInstance(datasets["refl_0_65um_nom"].valid_range, list) self.assertEqual(np.float64, datasets["refl_0_65um_nom"].dtype) @@ -232,7 +249,7 @@ def test_yaml_datasets(self): ] new_ds_infos = list(r.file_handlers['clavrx_nc'][0].available_datasets( fake_dataset_info)) - self.assertEqual(len(new_ds_infos), 9) + self.assertEqual(len(new_ds_infos), 10) # we have this and can provide the resolution self.assertTrue(new_ds_infos[0][0]) @@ -247,3 +264,38 @@ def test_yaml_datasets(self): # because a previous handler said it has it self.assertTrue(new_ds_infos[2][0]) self.assertEqual(new_ds_infos[2][1]['resolution'], 2004) + + def test_scale_data(self): + """Test that data is scaled when necessary and not scaled data are flags.""" + from satpy.readers.clavrx import _scale_data + """Test scale data and results.""" + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames([ABI_FILE]) + r.create_filehandlers(loadables) + with mock.patch('satpy.readers.clavrx.glob') as g, \ + mock.patch('satpy.readers.clavrx.netCDF4.Dataset') as d: + g.return_value = ['fake_donor.nc'] + x = np.linspace(-0.1518, 0.1518, 5) + y = np.linspace(0.1518, -0.1518, 5) + proj = mock.Mock( + semi_major_axis=6378137, + semi_minor_axis=6356752.3142, + perspective_point_height=35791000, + longitude_of_projection_origin=-137.2, + sweep_angle_axis='x', + ) + d.return_value = fake_donor = mock.MagicMock( + variables={'goes_imager_projection': proj, 'x': x, 'y': y}, + ) + fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] + + ds_scale = ["variable1", "refl_0_65um_nom"] + ds_no_scale = ["var_flags", "out_of_range_flags"] + + with mock.patch("satpy.readers.clavrx._scale_data", wraps=_scale_data) as scale_data: + r.load(ds_scale) + scale_data.assert_called() + + with mock.patch("satpy.readers.clavrx._scale_data", wraps=_scale_data) as scale_data2: + r.load(ds_no_scale) + scale_data2.assert_not_called() From 6433eb0efd361eca7ecdcb1361f6397ddefd6999 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 26 May 2023 15:22:14 -0500 Subject: [PATCH 019/481] Fix poor capitalization bug --- satpy/tests/reader_tests/test_clavrx_nc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index 0d3e6680cb..338d83cf0e 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -25,7 +25,7 @@ from pyresample.geometry import AreaDefinition from satpy.readers import load_reader -from satpy.tests.reader_tests.test_netCDF_utils import FakeNetCDF4FileHandler +from satpy.tests.reader_tests.test_netcdf_utils import FakeNetCDF4FileHandler ABI_FILE = 'clavrx_OR_ABI-L1b-RadC-M6C01_G16_s20231021601173.level2.nc' DEFAULT_FILE_DTYPE = np.uint16 From dace7ab5794e8df9464223fa71b9043704569d43 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Sat, 27 May 2023 07:46:02 -0500 Subject: [PATCH 020/481] Fix donor name bug revealed when switching from AHI to ABI in tests Fix indent when creating info for alias --- satpy/readers/clavrx.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index f97c9cee19..1970bd641f 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -207,13 +207,17 @@ def _read_pug_fixed_grid(projection_coordinates: netCDF4.Variable, distance_mult return proj_dict @staticmethod - def _find_input_nc(filename: str, l1b_base: str) -> str: + def _find_input_nc(filename: str, sensor: str, l1b_base: str) -> str: dirname = os.path.dirname(filename) l1b_filename = os.path.join(dirname, l1b_base + '.nc') if os.path.exists(l1b_filename): return str(l1b_filename) - glob_pat = os.path.join(dirname, l1b_base + '*R20*.nc') + if sensor == "AHI": + glob_pat = os.path.join(dirname, l1b_base + '*R20*.nc') + else: + glob_pat = os.path.join(dirname, l1b_base + '*.nc') + LOG.debug("searching for {0}".format(glob_pat)) found_l1b_filenames = list(glob(glob_pat)) if len(found_l1b_filenames) == 0: @@ -223,7 +227,7 @@ def _find_input_nc(filename: str, l1b_base: str) -> str: return found_l1b_filenames[0] @staticmethod - def _read_axi_fixed_grid(filename: str, l1b_attr) -> geometry.AreaDefinition: + def _read_axi_fixed_grid(filename: str, sensor: str, l1b_attr) -> geometry.AreaDefinition: """Read a fixed grid. CLAVR-x does not transcribe fixed grid parameters to its output @@ -238,7 +242,7 @@ def _read_axi_fixed_grid(filename: str, l1b_attr) -> geometry.AreaDefinition: """ LOG.debug(f"looking for corresponding input file for {l1b_attr}" " to act as fixed grid navigation donor") - l1b_path = _CLAVRxHelper._find_input_nc(filename, l1b_attr) + l1b_path = _CLAVRxHelper._find_input_nc(filename, sensor, l1b_attr) LOG.info(f"CLAVR-x does not include fixed-grid parameters, use input file {l1b_path} as donor") l1b = netCDF4.Dataset(l1b_path) proj = None @@ -408,7 +412,7 @@ def get_area_def(self, key): return super(CLAVRXHDF4FileHandler, self).get_area_def(key) l1b_att = str(self.file_content.get('/attr/L1B', None)) - area_def = _CLAVRxHelper._read_axi_fixed_grid(self.filename, l1b_att) + area_def = _CLAVRxHelper._read_axi_fixed_grid(self.filename, self.sensor, l1b_att) return area_def @@ -453,10 +457,10 @@ def _dynamic_dataset_info(self, var_name): if CHANNEL_ALIASES.get(self.sensor) is not None: alias_info = ds_info.copy() channel_info = CHANNEL_ALIASES.get(self.sensor).get(var_name, None) - if channel_info is not None: - channel_info["file_key"] = var_name - alias_info.update(channel_info) - yield True, alias_info + if channel_info is not None: + channel_info["file_key"] = var_name + alias_info.update(channel_info) + yield True, alias_info @staticmethod def _is_2d_yx_data_array(data_arr): @@ -516,7 +520,7 @@ def get_area_def(self, key): return super(CLAVRXNetCDFFileHandler, self).get_area_def(key) l1b_att = str(self.nc.attrs.get('L1B', None)) - return _CLAVRxHelper._read_axi_fixed_grid(self.filename, l1b_att) + return _CLAVRxHelper._read_axi_fixed_grid(self.filename, self.sensor, l1b_att) def get_dataset(self, dataset_id, ds_info): """Get a dataset for supported geostationary sensors.""" From 6f685767aea14bd41394e8a5df17ace7a3ede571 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Sat, 27 May 2023 07:48:12 -0500 Subject: [PATCH 021/481] Go back to using parameterize and add tests for alias. Clean up logic in some of the tests for yaml and expected datasets --- satpy/tests/reader_tests/test_clavrx_nc.py | 295 +++++++++++---------- 1 file changed, 157 insertions(+), 138 deletions(-) diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index 0d3e6680cb..0a6bdddfec 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -17,15 +17,14 @@ # satpy. If not, see . """Module for testing the satpy.readers.clavrx module.""" import os -import unittest from unittest import mock import numpy as np +import pytest import xarray as xr from pyresample.geometry import AreaDefinition from satpy.readers import load_reader -from satpy.tests.reader_tests.test_netCDF_utils import FakeNetCDF4FileHandler ABI_FILE = 'clavrx_OR_ABI-L1b-RadC-M6C01_G16_s20231021601173.level2.nc' DEFAULT_FILE_DTYPE = np.uint16 @@ -41,17 +40,18 @@ DEFAULT_LAT_DATA = np.repeat([DEFAULT_LAT_DATA], DEFAULT_FILE_SHAPE[0], axis=0) DEFAULT_LON_DATA = np.linspace(5, 45, DEFAULT_FILE_SHAPE[1]).astype(DEFAULT_FILE_DTYPE) DEFAULT_LON_DATA = np.repeat([DEFAULT_LON_DATA], DEFAULT_FILE_SHAPE[0], axis=0) -ABI_FILE = 'clavrx_OR_ABI-L1b-RadC-M6C01_G16_s20231021601173.level2.nc' +L1B_FILE = 'clavrx_OR_ABI-L1b-RadC-M6C01_G16_s20231021601173' +ABI_FILE = f'{L1B_FILE}.level2.nc' FILL_VALUE = -32768 -def fake_dataset(): +def fake_test_content(filename, **kwargs): """Mimic reader input file content.""" attrs = { 'platform': 'G16', 'sensor': 'ABI', # this is a Level 2 file that came from a L1B file - 'L1B': '"clavrx_OR_ABI-L1b-RadC-M6C01_G16_s20231021601173', + 'L1B': L1B_FILE, } longitude = xr.DataArray(DEFAULT_LON_DATA, @@ -129,149 +129,168 @@ def fake_dataset(): return ds -class FakeNetCDF4FileHandlerCLAVRx(FakeNetCDF4FileHandler): - """Swap-in NetCDF4 File Handler.""" - - def get_test_content(self, filename, filename_info, filetype_info): - """Get a fake dataset.""" - return fake_dataset() - - -class TestCLAVRXReaderNetCDF(unittest.TestCase): - """Test CLAVR-X Reader with NetCDF files.""" +class TestCLAVRXReaderGeo: + """Test CLAVR-X Reader with Geo files.""" yaml_file = "clavrx.yaml" - filename = ABI_FILE - loadable_ids = list(fake_dataset().keys()) - def setUp(self): - """Wrap NetCDF file handler with a fake handler.""" + def setup_method(self): + """Read fake data.""" from satpy._config import config_search_paths - from satpy.readers.clavrx import CLAVRXNetCDFFileHandler - self.reader_configs = config_search_paths(os.path.join('readers', self.yaml_file)) - # http://stackoverflow.com/questions/12219967/how-to-mock-a-base-class-with-python-mock-library - self.p = mock.patch.object(CLAVRXNetCDFFileHandler, '__bases__', - (FakeNetCDF4FileHandlerCLAVRx,)) - self.fake_open_dataset = mock.patch('satpy.readers.clavrx.xr.open_dataset', - return_value=fake_dataset()).start() - self.expected_dataset = mock.patch('xarray.load_dataset', - return_value=fake_dataset()).start() - self.fake_handler = self.p.start() - self.p.is_local = True - - def tearDown(self): - """Stop wrapping the NetCDF4 file handler.""" - self.p.stop() - self.fake_open_dataset.stop() - self.expected_dataset.stop() - - def test_init(self): - """Test basic init with no extra parameters.""" - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames([ABI_FILE]) - self.assertEqual(len(loadables), 1) - r.create_filehandlers(loadables) - # make sure we have some files - self.assertTrue(r.file_handlers) - - def test_available_datasets(self): + + @pytest.mark.parametrize( + ("filenames", "expected_loadables"), + [([ABI_FILE], 1)] + ) + def test_reader_creation(self, filenames, expected_loadables): + """Test basic initialization.""" + with mock.patch('satpy.readers.clavrx.xr.open_dataset') as od: + od.side_effect = fake_test_content + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames(filenames) + assert len(loadables) == expected_loadables + r.create_filehandlers(loadables) + # make sure we have some files + assert r.file_handlers + + @pytest.mark.parametrize( + ("filenames", "expected_datasets"), + [([ABI_FILE], ['variable1', 'refl_0_65um_nom', 'C02', 'var_flags', + 'out_of_range_flags', 'longitude', 'latitude']), ] + ) + def test_available_datasets(self, filenames, expected_datasets): """Test that variables are dynamically discovered.""" - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames([ABI_FILE]) - r.create_filehandlers(loadables) - avails = list(r.available_dataset_names) - expected_datasets = self.loadable_ids + ["latitude", "longitude"] - self.assertEqual(avails.sort(), expected_datasets.sort()) - - def test_load_all_new_donor(self): + from satpy.readers import load_reader + with mock.patch('satpy.readers.clavrx.xr.open_dataset') as od: + od.side_effect = fake_test_content + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames(filenames) + r.create_filehandlers(loadables) + avails = list(r.available_dataset_names) + for var_name in expected_datasets: + assert var_name in avails + + @pytest.mark.parametrize( + ("filenames", "loadable_ids"), + [([ABI_FILE], ['variable1', 'refl_0_65um_nom', 'var_flags', 'out_of_range_flags']), ] + ) + def test_load_all_new_donor(self, filenames, loadable_ids): """Test loading all test datasets with new donor.""" - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames([ABI_FILE]) - r.create_filehandlers(loadables) - with mock.patch('satpy.readers.clavrx.glob') as g, \ - mock.patch('satpy.readers.clavrx.netCDF4.Dataset') as d: - g.return_value = ['fake_donor.nc'] - x = np.linspace(-0.1518, 0.1518, 5) - y = np.linspace(0.1518, -0.1518, 5) - proj = mock.Mock( - semi_major_axis=6378137, - semi_minor_axis=6356752.3142, - perspective_point_height=35791000, - longitude_of_projection_origin=-137.2, - sweep_angle_axis='x', - ) - d.return_value = fake_donor = mock.MagicMock( - variables={'goes_imager_projection': proj, 'x': x, 'y': y}, - ) - fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] - - datasets = r.load(self.loadable_ids + ["C02"]) - self.assertEqual(len(datasets), len(self.loadable_ids)+1) - - # should have file variable and one alias for reflectance - self.assertNotIn("valid_range", datasets["variable1"].attrs) - self.assertNotIn("_FillValue", datasets["variable1"].attrs) - self.assertEqual(np.float64, datasets["variable1"].dtype) - - assert np.issubdtype(datasets["var_flags"].dtype, np.integer) - self.assertIsNotNone(datasets['var_flags'].attrs.get('flag_meanings')) - self.assertEqual('', - datasets['var_flags'].attrs.get('flag_meanings'), - ) - assert np.issubdtype(datasets["out_of_range_flags"].dtype, np.integer) - - self.assertIsInstance(datasets["refl_0_65um_nom"].valid_range, list) - self.assertEqual(np.float64, datasets["refl_0_65um_nom"].dtype) - self.assertNotIn("_FillValue", datasets["refl_0_65um_nom"].attrs) - - self.assertEqual("refl_0_65um_nom", datasets["C02"].file_key) - self.assertNotIn("_FillValue", datasets["C02"].attrs) - - for v in datasets.values(): - self.assertIsInstance(v.area, AreaDefinition) - self.assertEqual(v.platform_name, 'GOES-16') - self.assertEqual(v.sensor, 'abi') - - self.assertNotIn('calibration', v.attrs) - self.assertIn("units", v.attrs) - self.assertNotIn('rows_per_scan', v.coords.get('longitude').attrs) - - def test_yaml_datasets(self): + with mock.patch('satpy.readers.clavrx.xr.open_dataset') as od: + od.side_effect = fake_test_content + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames(filenames) + r.create_filehandlers(loadables) + with mock.patch('satpy.readers.clavrx.glob') as g, \ + mock.patch('satpy.readers.clavrx.netCDF4.Dataset') as d: + g.return_value = ['fake_donor.nc'] + x = np.linspace(-0.1518, 0.1518, DEFAULT_FILE_SHAPE[1]) + y = np.linspace(0.1518, -0.1518, DEFAULT_FILE_SHAPE[0]) + proj = mock.Mock( + semi_major_axis=6378137, + semi_minor_axis=6356752.3142, + perspective_point_height=35791000, + longitude_of_projection_origin=140.7, + sweep_angle_axis='y', + ) + d.return_value = fake_donor = mock.MagicMock( + variables={'goes_imager_projection': proj, 'x': x, 'y': y}, + ) + fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] + + datasets = r.load(loadable_ids + ["C02"]) + assert len(datasets) == len(loadable_ids)+1 + + # should have file variable and one alias for reflectance + assert "valid_range" not in datasets["variable1"].attrs + assert "_FillValue" not in datasets["variable1"].attrs + assert np.float64 == datasets["variable1"].dtype + + assert np.issubdtype(datasets["var_flags"].dtype, np.integer) + assert datasets['var_flags'].attrs.get('flag_meanings') is not None + assert '' == datasets['var_flags'].attrs.get('flag_meanings') + assert np.issubdtype(datasets["out_of_range_flags"].dtype, np.integer) + + assert isinstance(datasets["refl_0_65um_nom"].valid_range, list) + assert np.float64 == datasets["refl_0_65um_nom"].dtype + assert "_FillValue" not in datasets["refl_0_65um_nom"].attrs + + assert "refl_0_65um_nom" == datasets["C02"].file_key + assert "_FillValue" not in datasets["C02"].attrs + + for v in datasets.values(): + assert isinstance(v.area, AreaDefinition) + assert v.platform_name == 'GOES-16' + assert v.sensor == 'abi' + + assert 'calibration' not in v.attrs + assert 'rows_per_scan' not in v.coords.get('longitude').attrs + assert "units" in v.attrs + + @pytest.mark.parametrize( + ("filenames", "expected_loadables"), + [([ABI_FILE], 1)] + ) + def test_yaml_datasets(self, filenames, expected_loadables): """Test available_datasets with fake variables from YAML.""" - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames([ABI_FILE]) - r.create_filehandlers(loadables) - # mimic the YAML file being configured for more datasets - fake_dataset_info = [ - (None, {'name': 'yaml1', 'resolution': None, 'file_type': ['clavrx_nc']}), - (True, {'name': 'yaml2', 'resolution': 0.5, 'file_type': ['clavrx_nc']}), - ] - new_ds_infos = list(r.file_handlers['clavrx_nc'][0].available_datasets( - fake_dataset_info)) - self.assertEqual(len(new_ds_infos), 10) - - # we have this and can provide the resolution - self.assertTrue(new_ds_infos[0][0]) - self.assertEqual(new_ds_infos[0][1]['resolution'], 2004) # hardcoded - - # we have this, but previous file handler said it knew about it - # and it is producing the same resolution as what we have - self.assertTrue(new_ds_infos[1][0]) - self.assertEqual(new_ds_infos[1][1]['resolution'], 0.5) - - # we have this, but don't want to change the resolution - # because a previous handler said it has it - self.assertTrue(new_ds_infos[2][0]) - self.assertEqual(new_ds_infos[2][1]['resolution'], 2004) - - def test_scale_data(self): + with mock.patch('satpy.readers.clavrx.xr.open_dataset') as od: + od.side_effect = fake_test_content + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames(filenames) + r.create_filehandlers(loadables) + + with mock.patch('satpy.readers.clavrx.glob') as g, \ + mock.patch('satpy.readers.clavrx.netCDF4.Dataset') as d: + g.return_value = ['fake_donor.nc'] + x = np.linspace(-0.1518, 0.1518, 5) + y = np.linspace(0.1518, -0.1518, 5) + proj = mock.Mock( + semi_major_axis=6378137, + semi_minor_axis=6356752.3142, + perspective_point_height=35791000, + longitude_of_projection_origin=-137.2, + sweep_angle_axis='x', + ) + d.return_value = fake_donor = mock.MagicMock( + variables={'goes_imager_projection': proj, 'x': x, 'y': y}, + ) + fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] + # mimic the YAML file being configured for more datasets + fake_dataset_info = [ + (None, {'name': 'yaml1', 'resolution': None, 'file_type': ['clavrx_nc']}), + (True, {'name': 'yaml2', 'resolution': 0.5, 'file_type': ['clavrx_nc']}), + ] + new_ds_infos = list(r.file_handlers['clavrx_nc'][0].available_datasets( + fake_dataset_info)) + assert len(new_ds_infos) == 10 + + # we have this and can provide the resolution + assert (new_ds_infos[0][0]) + assert new_ds_infos[0][1]['resolution'] == 2004 # hardcoded + + # we have this, but previous file handler said it knew about it + # and it is producing the same resolution as what we have + assert (new_ds_infos[1][0]) + assert new_ds_infos[1][1]['resolution'] == 0.5 + + # we have this, but don't want to change the resolution + # because a previous handler said it has it + assert (new_ds_infos[2][0]) + assert new_ds_infos[2][1]['resolution'] == 2004 + + @pytest.mark.parametrize( + ("filenames", "loadable_ids"), + [([ABI_FILE], ['variable1', 'refl_0_65um_nom', 'var_flags', 'out_of_range_flags']), ] + ) + def test_scale_data(self, filenames, loadable_ids): """Test that data is scaled when necessary and not scaled data are flags.""" from satpy.readers.clavrx import _scale_data - """Test scale data and results.""" - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames([ABI_FILE]) - r.create_filehandlers(loadables) + with mock.patch('satpy.readers.clavrx.xr.open_dataset') as od: + od.side_effect = fake_test_content + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames(filenames) + r.create_filehandlers(loadables) with mock.patch('satpy.readers.clavrx.glob') as g, \ mock.patch('satpy.readers.clavrx.netCDF4.Dataset') as d: g.return_value = ['fake_donor.nc'] From b1bacff103225385faea670283ae16a589392a61 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Mon, 5 Jun 2023 11:46:12 +0200 Subject: [PATCH 022/481] feat: add searchable reader table --- doc/source/conf.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index f45a83333b..82098eeb0a 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -26,8 +26,8 @@ sys.path.append(os.path.abspath('../../')) sys.path.append(os.path.abspath(os.path.dirname(__file__))) -from pyresample.area_config import generate_area_def_rst_list # noqa: E402 -from reader_table import generate_reader_table # noqa: E402 +from pyresample.area_config import _read_yaml_area_file_content, generate_area_def_rst_list # noqa: E402 +from reader_table import generate_reader_table, rst_table_header, rst_table_row # noqa: E402 from satpy.resample import get_area_file # noqa: E402 @@ -83,8 +83,20 @@ def __getattr__(cls, name): with open("reader_table.rst", mode="w") as f: f.write(generate_reader_table()) +# create table from area definition yaml file area_file = get_area_file()[0] + +area_dict = _read_yaml_area_file_content(area_file) +area_table = [rst_table_header("Area Definitions", header=["Name", "Description", "Projection"], + widths=[45, 60, 10], class_name="area-table")] + +for aname, params in area_dict.items(): + area_table.append(rst_table_row([f"`{aname}`_", params.get("description", ""), + params.get("projection").get("proj")])) + with open("area_def_list.rst", mode="w") as f: + f.write("".join(area_table)) + f.write("\n\n") f.write(generate_area_def_rst_list(area_file)) # -- General configuration ----------------------------------------------------- From f7664571219b487277e1d9c7e27dd743f5fab0eb Mon Sep 17 00:00:00 2001 From: BENR0 Date: Mon, 5 Jun 2023 11:46:37 +0200 Subject: [PATCH 023/481] fix: areas yaml --- satpy/etc/areas.yaml | 97 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 4 deletions(-) diff --git a/satpy/etc/areas.yaml b/satpy/etc/areas.yaml index 6abbc18c82..946b73c6db 100644 --- a/satpy/etc/areas.yaml +++ b/satpy/etc/areas.yaml @@ -301,7 +301,7 @@ EastEurope: lower_left_xy: [654112.8864287604, 2989901.7547366405] upper_right_xy: [4553111.804127298, 5390224.287390241] -AfHorn: +AfHorn_geos: description: Eastern disk MSG image 0 degrees projection: proj: geos @@ -316,7 +316,7 @@ AfHorn: lower_left_xy: [2263804.1886089267, -1327678.4008740226] upper_right_xy: [5564247.671007627, 3472966.6644331776] -SouthAmerica: +SouthAmerica_geos: description: Lower West part of Southern disk MSG image 0 degrees projection: proj: geos @@ -716,6 +716,7 @@ australia: area_extent: lower_left_xy: [-2504688.5428486555, -5591295.9185533915] upper_right_xy: [2504688.5428486555, -1111475.102852225] + mali: description: mali projection: @@ -729,6 +730,7 @@ mali: area_extent: lower_left_xy: [-1224514.3987260093, 1111475.1028522244] upper_right_xy: [1224514.3987260093, 3228918.5790461157] + mali_eqc: description: mali projection: @@ -742,6 +744,7 @@ mali_eqc: area_extent: lower_left_xy: [-1224514.3987260093, -1001875.4171394627] upper_right_xy: [1224514.3987260093, 1001875.4171394617] + sve: description: Sweden and baltic sea @@ -753,6 +756,7 @@ sve: area_extent: lower_left_xy: [-342379.698, 6032580.06] upper_right_xy: [1423701.52, 8029648.75] + brazil2: description: brazil, platecarree projection: @@ -765,6 +769,7 @@ brazil2: lower_left_xy: [-7792364.355529149, -4452779.631730943] upper_right_xy: [-2226389.8158654715, 1669792.3618991035] units: m + sudeste: description: sudeste, platecarree projection: @@ -777,6 +782,7 @@ sudeste: lower_left_xy: [-6122571.993630046, -3005626.251418386] upper_right_xy: [-4230140.650144396, -1447153.3803125564] units: m + SouthAmerica_flat: description: South America flat projection: @@ -790,6 +796,7 @@ SouthAmerica_flat: lower_left_xy: [-8326322.82790897, -4609377.085697311] upper_right_xy: [-556597.4539663679, 1535833.8895192828] units: m + south_america: description: south_america, platecarree projection: @@ -802,6 +809,7 @@ south_america: lower_left_xy: [-8126322.82790897, -5009377.085697311] upper_right_xy: [-556597.4539663679, 1335833.8895192828] units: m + brazil: description: brazil, platecarree projection: @@ -814,6 +822,7 @@ brazil: lower_left_xy: [-8348961.809495518, -3896182.1777645745] upper_right_xy: [-3784862.6869713017, 1001875.4171394621] units: m + worldeqc3km70: description: World in 3km, platecarree projection: @@ -826,6 +835,7 @@ worldeqc3km70: lower_left_xy: [-20037508.3428, -7792364.355533333] upper_right_xy: [20037508.3428, 7792364.355533333] units: m + worldeqc30km70: description: World in 3km, platecarree projection: @@ -838,6 +848,7 @@ worldeqc30km70: lower_left_xy: [-20037508.3428, -7792364.355533333] upper_right_xy: [20037508.3428, 7792364.355533333] units: m + worldeqc3km73: description: World in 3km, platecarree projection: @@ -850,6 +861,7 @@ worldeqc3km73: lower_left_xy: [-20037508.3428, -8181982.573309999] upper_right_xy: [20037508.3428, 8181982.573309999] units: m + worldeqc3km: description: World in 3km, platecarree projection: @@ -862,6 +874,7 @@ worldeqc3km: lower_left_xy: [-20037508.3428, -10018754.1714] upper_right_xy: [20037508.3428, 10018754.1714] units: m + worldeqc30km: description: World in 3km, platecarree projection: @@ -874,6 +887,7 @@ worldeqc30km: lower_left_xy: [-20037508.3428, -10018754.1714] upper_right_xy: [20037508.3428, 10018754.1714] units: m + libya: description: libya area projection: @@ -888,6 +902,7 @@ libya: lower_left_xy: [-1921632.0902750609, 1725320.2028891125] upper_right_xy: [1918367.9097249391, 4797320.202889113] units: m + phil: description: kuwait area projection: @@ -903,6 +918,7 @@ phil: lower_left_xy: [-2200000.0, 0.0] upper_right_xy: [2200000.0, 2200000.0] units: m + phil_small: description: kuwait area projection: @@ -918,6 +934,7 @@ phil_small: lower_left_xy: [-600000.0, 0.0] upper_right_xy: [1600000.0, 2200000.0] units: m + kuwait: description: kuwait area projection: @@ -932,6 +949,7 @@ kuwait: lower_left_xy: [-1280000.0, 1820000.0] upper_right_xy: [1280000.0, 4380000.0] units: m + afghanistan: description: Afghanistan projection: @@ -960,7 +978,8 @@ maspalomas: area_extent: lower_left_xy: [-1200000.0, 2900000.0] upper_right_xy: [900000.0, 4000000.0] -afhorn: + +afhorn_merc: description: Africa horn 3km resolution projection: proj: merc @@ -972,6 +991,7 @@ afhorn: area_extent: lower_left_xy: [-2432000.0, -1130348.139543] upper_right_xy: [2432000.0, 3733651.860457] + spain: description: Spain projection: @@ -988,6 +1008,7 @@ spain: area_extent: lower_left_xy: [-500000.0, -500000.0] upper_right_xy: [500000.0, 500000.0] + germ: description: Germany projection: @@ -1004,6 +1025,7 @@ germ: area_extent: lower_left_xy: [-155100.436345, -4441495.37946] upper_right_xy: [868899.563655, -3417495.37946] + germ2: description: Germany projection: @@ -1020,6 +1042,7 @@ germ2: area_extent: lower_left_xy: [-165100.436345, -4441495.37946] upper_right_xy: [878899.563655, -3417495.37946] + euro4: description: Euro 4km area - Europe projection: @@ -1034,6 +1057,7 @@ euro4: area_extent: lower_left_xy: [-2717181.7304994687, -5571048.14031214] upper_right_xy: [1378818.2695005313, -1475048.1403121399] + euro1: description: Euro 4km area - Europe projection: @@ -1048,6 +1072,7 @@ euro1: area_extent: lower_left_xy: [-2717181.7304994687, -5571048.14031214] upper_right_xy: [1378818.2695005313, -1475048.1403121399] + scan: description: Scandinavia projection: @@ -1062,6 +1087,7 @@ scan: area_extent: lower_left_xy: [-1268854.126638295, -4150234.8425892727] upper_right_xy: [779145.8733617051, -2102234.8425892727] + scan2: description: Scandinavia - 2km area projection: @@ -1076,6 +1102,7 @@ scan2: area_extent: lower_left_xy: [-1268854.126638295, -4150234.8425892727] upper_right_xy: [779145.8733617051, -2102234.8425892727] + scan1: description: Scandinavia - 1km area projection: @@ -1090,6 +1117,7 @@ scan1: area_extent: lower_left_xy: [-1268854.126638295, -4150234.8425892727] upper_right_xy: [779145.8733617051, -2062234.8425892727] + scan500m: description: Scandinavia - 500m area projection: @@ -1104,6 +1132,7 @@ scan500m: area_extent: lower_left_xy: [-1268854.126638295, -4150234.8425892727] upper_right_xy: [779145.8733617051, -2062234.8425892727] + mesanX: description: Mesan-X rotated lon/lat 1.8km projection: @@ -1121,6 +1150,7 @@ mesanX: area_extent: lower_left_xy: [1067435.7598983962, -1278764.890341909] upper_right_xy: [3791765.9965939857, 1690140.6680267097] + mesanE: description: Europe Mesan rotated lon/lat 1.8km projection: @@ -1138,6 +1168,7 @@ mesanE: area_extent: lower_left_xy: [289083.0005619671, -2957836.6467769896] upper_right_xy: [5381881.121371055, 3335826.68502126] + baws: description: BAWS projection: @@ -1152,6 +1183,7 @@ baws: area_extent: lower_left_xy: [-475617.0, 5324430.0] upper_right_xy: [924383.0, 6724430.0] + eurotv: description: Europe TV - 6.2x5.0km projection: @@ -1168,6 +1200,7 @@ eurotv: area_extent: lower_left_xy: [-3503748.8201907813, -6589593.134058789] upper_right_xy: [2842567.6359087573, -1499856.5846593212] + eurotv4n: description: Europe TV4 - 4.1x4.1km projection: @@ -1184,6 +1217,7 @@ eurotv4n: area_extent: lower_left_xy: [-5103428.678666952, -6772478.60053407] upper_right_xy: [3293371.321333048, -2049278.6005340703] + eurol: description: Euro 3.0km area - Europe projection: @@ -1198,6 +1232,7 @@ eurol: area_extent: lower_left_xy: [-3780000.0, -7644000.0] upper_right_xy: [3900000.0, -1500000.0] + eurol1: description: Euro 3.0km area - Europe projection: @@ -1212,6 +1247,7 @@ eurol1: area_extent: lower_left_xy: [-3780000.0, -7644000.0] upper_right_xy: [3900000.0, -1500000.0] + scanl: description: Scandinavia - Large projection: @@ -1226,6 +1262,7 @@ scanl: area_extent: lower_left_xy: [-900000.0, -4500000.0] upper_right_xy: [2000000.0, -1600000.0] + euron1: description: Northern Europe - 1km projection: @@ -1240,6 +1277,7 @@ euron1: area_extent: lower_left_xy: [-1000000.0, -4500000.0] upper_right_xy: [2072000.0, -1428000.0] + euron0250: description: Northern Europe - 1km projection: @@ -1254,6 +1292,7 @@ euron0250: area_extent: lower_left_xy: [-1000000.0, -4500000.0] upper_right_xy: [2072000.0, -1428000.0] + nsea: description: North Baltic Sea projection: @@ -1267,6 +1306,7 @@ nsea: area_extent: lower_left_xy: [-322789.07638000086, 7784901.986829306] upper_right_xy: [1725210.923619999, 9832901.986829307] + ssea: description: South Baltic Sea projection: @@ -1280,6 +1320,7 @@ ssea: area_extent: lower_left_xy: [-801407.3620468981, 7003690.663643802] upper_right_xy: [1246592.637953102, 9051690.663643802] + nsea250: description: North Baltic Sea projection: @@ -1293,6 +1334,7 @@ nsea250: area_extent: lower_left_xy: [-322789.07638000086, 7784901.986829306] upper_right_xy: [1725210.923619999, 9832901.986829307] + ssea250: description: South Baltic Sea projection: @@ -1306,6 +1348,7 @@ ssea250: area_extent: lower_left_xy: [-801407.3620468981, 7003690.663643802] upper_right_xy: [1246592.637953102, 9051690.663643802] + bsea250: description: South Baltic Sea projection: @@ -1319,6 +1362,7 @@ bsea250: area_extent: lower_left_xy: [512000.0, 3525000.0] upper_right_xy: [1700000.0, 4933000.0] + test250: description: South Baltic Sea projection: @@ -1332,6 +1376,7 @@ test250: area_extent: lower_left_xy: [512000.0, 3525000.0] upper_right_xy: [1700000.0, 4933000.0] + bsea1000: description: South Baltic Sea projection: @@ -1345,6 +1390,7 @@ bsea1000: area_extent: lower_left_xy: [512000.0, 3525000.0] upper_right_xy: [1700000.0, 4933000.0] + euro: description: Euro area - Europe projection: @@ -1359,6 +1405,7 @@ euro: area_extent: lower_left_xy: [-2717181.7304994687, -5571048.14031214] upper_right_xy: [1378818.2695005313, -1475048.1403121399] + baltrad_lambert: description: Baltrad Lambert projection: @@ -1373,6 +1420,7 @@ baltrad_lambert: area_extent: lower_left_xy: [-994211.85388, -1291605.15396] upper_right_xy: [635788.14612, 1098394.84604] + eport: description: eport projection: @@ -1387,6 +1435,7 @@ eport: lower_left_xy: [-5283418.625834752, -5283418.625834753] upper_right_xy: [5283418.625834753, 5283418.625834752] units: m + eport1: description: eport projection: @@ -1401,6 +1450,7 @@ eport1: lower_left_xy: [-5283418.625834752, -5283418.625834753] upper_right_xy: [5283418.625834753, 5283418.625834752] units: m + eport10: description: eport reduced resolution projection: @@ -1415,6 +1465,7 @@ eport10: lower_left_xy: [-5283418.625834752, -5283418.625834753] upper_right_xy: [5283418.625834753, 5283418.625834752] units: m + eport4: description: eport reduced resolution projection: @@ -1429,6 +1480,7 @@ eport4: lower_left_xy: [-5283418.625834752, -5283418.625834753] upper_right_xy: [5283418.625834753, 5283418.625834752] units: m + eport2: description: eport reduced resolution projection: @@ -1443,6 +1495,7 @@ eport2: lower_left_xy: [-5283418.625834752, -5283418.625834753] upper_right_xy: [5283418.625834753, 5283418.625834752] units: m + npp_sample_m: description: North America - NPP sample data - M-bands projection: @@ -1457,6 +1510,7 @@ npp_sample_m: area_extent: lower_left_xy: [-1700000.0, -1400000.0] upper_right_xy: [1100000.0, 1400000.0] + arctic_europe_1km: description: Arctic and Europe projection: @@ -1471,6 +1525,7 @@ arctic_europe_1km: area_extent: lower_left_xy: [-3100000.0, -7100000.0] upper_right_xy: [6000000.0, 2000000.0] + arctic_europe_9km: description: Arctic and Europe projection: @@ -1485,6 +1540,7 @@ arctic_europe_9km: area_extent: lower_left_xy: [-3100000.0, -7100000.0] upper_right_xy: [6000000.0, 2000000.0] + sswe: description: Southern Sweden projection: @@ -1501,6 +1557,7 @@ sswe: area_extent: lower_left_xy: [-400884.23045, -3946631.71387] upper_right_xy: [623115.76955, -2922631.71387] + nswe: description: Northern Sweden projection: @@ -1517,6 +1574,7 @@ nswe: area_extent: lower_left_xy: [-392288.010506, -3105279.35252] upper_right_xy: [631711.989494, -2081279.35252] + sval: description: Svalbard projection: @@ -1531,6 +1589,7 @@ sval: area_extent: lower_left_xy: [-287554.9489620461, -1630805.15418955] upper_right_xy: [736445.0510379539, -606805.1541895501] + ease_sh: description: Antarctic EASE grid projection: @@ -1546,6 +1605,7 @@ ease_sh: lower_left_xy: [-5326849.0625, -5326849.0625] upper_right_xy: [5326849.0625, 5326849.0625] units: m + ease_nh: description: Arctic EASE grid projection: @@ -1561,6 +1621,7 @@ ease_nh: lower_left_xy: [-5326849.0625, -5326849.0625] upper_right_xy: [5326849.0625, 5326849.0625] units: m + barents_sea: description: Barents and Greenland seas projection: @@ -1575,6 +1636,7 @@ barents_sea: area_extent: lower_left_xy: [-1600000.0, -2000000.0] upper_right_xy: [1400000.0, -300000.0] + antarctica: description: Antarctica - 1km projection: @@ -1589,6 +1651,7 @@ antarctica: area_extent: lower_left_xy: [-2858899.2042342643, -2858899.204234264] upper_right_xy: [2858899.204234264, 2858899.2042342643] + arctica: description: arctica - 1km projection: @@ -1603,6 +1666,7 @@ arctica: area_extent: lower_left_xy: [-1458899.2042342643, -1458899.2042342639] upper_right_xy: [1458899.2042342639, 1458899.2042342643] + euroasia: description: Euroasia - Global 1km USGS Landuse database projection: @@ -1617,6 +1681,7 @@ euroasia: area_extent: lower_left_xy: [-3000000.0, -4999000.0] upper_right_xy: [9999000.0, 8000000.0] + euroasia_10km: description: Euroasia - Global 1km USGS Landuse database projection: @@ -1631,6 +1696,7 @@ euroasia_10km: area_extent: lower_left_xy: [-3000000.0, -4999000.0] upper_right_xy: [9999000.0, 8000000.0] + euroasia_asia: description: Euroasia - optimised for Asia - @@ -1647,6 +1713,7 @@ euroasia_asia: area_extent: lower_left_xy: [-8000000.0, -5499000.0] upper_right_xy: [4999000.0, 6500000.0] + euroasia_asia_10km: description: Euroasia - optimised for Asia - Global 1km USGS Landuse database projection: @@ -1661,6 +1728,7 @@ euroasia_asia_10km: area_extent: lower_left_xy: [-8000000.0, -5499000.0] upper_right_xy: [4999000.0, 6500000.0] + australia_pacific: description: Austalia/Pacific - Global 1km USGS Landuse database projection: @@ -1675,6 +1743,7 @@ australia_pacific: area_extent: lower_left_xy: [-5000000.0, -3944890.0] upper_right_xy: [4299000.0, 4054110.0] + australia_pacific_10km: description: Austalia/Pacific - Global 1km USGS Landuse database projection: @@ -1689,6 +1758,7 @@ australia_pacific_10km: area_extent: lower_left_xy: [-5000000.0, -3944890.0] upper_right_xy: [4299000.0, 4054110.0] + africa: description: Africa - Global 1km USGS Landuse database projection: @@ -1703,6 +1773,7 @@ africa: area_extent: lower_left_xy: [-4458000.0, -4795000.0] upper_right_xy: [3891000.0, 4480000.0] + africa_10km: description: Africa - Global 1km USGS Landuse database projection: @@ -1717,7 +1788,8 @@ africa_10km: area_extent: lower_left_xy: [-4458000.0, -4795000.0] upper_right_xy: [3891000.0, 4480000.0] -southamerica: + +southamerica_laea: description: South America - Global 1km USGS Landuse database projection: proj: laea @@ -1731,6 +1803,7 @@ southamerica: area_extent: lower_left_xy: [-3000000.0, -4899000.0] upper_right_xy: [2999000.0, 3100000.0] + southamerica_10km: description: South America - Global 1km USGS Landuse database projection: @@ -1745,6 +1818,7 @@ southamerica_10km: area_extent: lower_left_xy: [-3000000.0, -4899000.0] upper_right_xy: [2999000.0, 3100000.0] + northamerica: description: North America - Global 1km USGS Landuse database projection: @@ -1759,6 +1833,7 @@ northamerica: area_extent: lower_left_xy: [-4487000.0, -4515000.0] upper_right_xy: [4735000.0, 4480000.0] + northamerica_10km: description: North America - Global 1km USGS Landuse database projection: @@ -1773,6 +1848,7 @@ northamerica_10km: area_extent: lower_left_xy: [-4487000.0, -4515000.0] upper_right_xy: [4735000.0, 4480000.0] + romania: description: Romania - 3km projection: @@ -1787,6 +1863,7 @@ romania: area_extent: lower_left_xy: [-2226837.662574135, -1684219.2829063328] upper_right_xy: [2299196.337425865, 881436.7170936672] + stere_asia_test: description: stere projection: @@ -1799,6 +1876,7 @@ stere_asia_test: area_extent: lower_left_xy: [-3589072.840299738, -3568228.07278016] upper_right_xy: [3611014.256314698, 3594111.7022882444] + bocheng_test: description: stere projection: @@ -1811,6 +1889,7 @@ bocheng_test: area_extent: lower_left_xy: [-3589072.840299738, -3568228.07278016] upper_right_xy: [3611014.256314698, 3594111.7022882444] + nsper_swe: description: nsper_swe projection: @@ -1825,6 +1904,7 @@ nsper_swe: area_extent: lower_left_xy: [-5000000.0, -5000000.0] upper_right_xy: [5000000.0, 5000000.0] + new_bsea250: description: new_bsea250 projection: @@ -1838,6 +1918,7 @@ new_bsea250: area_extent: lower_left_xy: [-638072.2772287376, -680339.8397175331] upper_right_xy: [638072.277228737, 757253.9342263378] + scanice: description: Scandinavia and Iceland projection: @@ -1852,6 +1933,7 @@ scanice: area_extent: lower_left_xy: [-1920000.0, -1536000.0] upper_right_xy: [1920000.0, 1536000.0] + baws250: description: BAWS, 250m resolution projection: @@ -1866,6 +1948,7 @@ baws250: area_extent: lower_left_xy: [-475617.0, 5324430.0] upper_right_xy: [924383.0, 6724430.0] + moll: description: moll projection: @@ -1879,6 +1962,7 @@ moll: area_extent: lower_left_xy: [-18040095.696147293, -9020047.848073646] upper_right_xy: [18040095.696147293, 9020047.848073646] + robinson: description: robinson projection: @@ -1912,6 +1996,7 @@ met07globe: # obsolete platform number area_extent: lower_left_xy: [-5621225.237846375, -5621225.237846375] upper_right_xy: [5621225.237846375, 5621225.237846375] + met09globe: # obsolete platform number description: Cropped disk MSG image 0 degrees projection: @@ -1926,6 +2011,7 @@ met09globe: # obsolete platform number area_extent: lower_left_xy: [-5432229.931711678, -5429229.528545862] upper_right_xy: [5429229.528545862, 5432229.931711678] + met09globeFull: # superseded by msg_seviri_fes_3km description: Full disk MSG image 0 degrees projection: @@ -1940,6 +2026,7 @@ met09globeFull: # superseded by msg_seviri_fes_3km area_extent: lower_left_xy: [-5570248.477339261, -5567248.074173444] upper_right_xy: [5567248.074173444, 5570248.477339261] + seviri_0deg: # superseded by msg_seviri_fes_3km description: Full disk MSG image 0 degrees projection: @@ -1954,6 +2041,7 @@ seviri_0deg: # superseded by msg_seviri_fes_3km area_extent: lower_left_xy: [-5570248.686685662, -5567248.28340708] upper_right_xy: [5567248.28340708, 5570248.686685662] + seviri_iodc: # superseded by msg_seviri_iodc_3km description: Full disk MSG image 41.5 degrees projection: @@ -1968,6 +2056,7 @@ seviri_iodc: # superseded by msg_seviri_iodc_3km area_extent: lower_left_xy: [-5570248.686685662, -5567248.28340708] upper_right_xy: [5567248.28340708, 5570248.686685662] + msg_resample_area: description: Full disk MSG image 20.75 degrees projection: From 6a7e1c07f5f225fdc6e8bd76494e6c6da413b32e Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Mon, 5 Jun 2023 09:14:28 -0500 Subject: [PATCH 024/481] Trying to make sure valid range is given for non-flag variables (this is important for AWIPS) It also seems important that integer (flag data) does not have a valid range provided. Add tests to flag this problem if it appears again. --- satpy/readers/clavrx.py | 1 + satpy/tests/reader_tests/test_clavrx.py | 1 + satpy/tests/reader_tests/test_clavrx_nc.py | 3 +++ 3 files changed, 5 insertions(+) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index fdcd5ff8cf..23255adda9 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -171,6 +171,7 @@ def _get_data(data, dataset_id: dict) -> xr.DataArray: valid_min = _scale_data(valid_range[0], factor, offset) valid_max = _scale_data(valid_range[1], factor, offset) data = data.where((data >= valid_min) & (data <= valid_max)) + attrs['valid_range'] = [valid_min, valid_max] data.attrs = _CLAVRxHelper._remove_attributes(attrs) diff --git a/satpy/tests/reader_tests/test_clavrx.py b/satpy/tests/reader_tests/test_clavrx.py index f7c8f1f1cd..71d666b93d 100644 --- a/satpy/tests/reader_tests/test_clavrx.py +++ b/satpy/tests/reader_tests/test_clavrx.py @@ -421,6 +421,7 @@ def test_load_all_old_donor(self): else: self.assertNotIn('_FillValue', v.attrs) if v.attrs["name"] == 'refl_1_38um_nom': + self.assertIn("valid_range", v.attrs) self.assertIsInstance(v.attrs["valid_range"], list) else: self.assertNotIn('valid_range', v.attrs) diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index 0a6bdddfec..8487db48c7 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -206,15 +206,18 @@ def test_load_all_new_donor(self, filenames, loadable_ids): assert "valid_range" not in datasets["variable1"].attrs assert "_FillValue" not in datasets["variable1"].attrs assert np.float64 == datasets["variable1"].dtype + assert "valid_range" not in datasets["variable1"].attrs assert np.issubdtype(datasets["var_flags"].dtype, np.integer) assert datasets['var_flags'].attrs.get('flag_meanings') is not None assert '' == datasets['var_flags'].attrs.get('flag_meanings') assert np.issubdtype(datasets["out_of_range_flags"].dtype, np.integer) + assert "valid_range" not in datasets["out_of_range_flags"].attrs assert isinstance(datasets["refl_0_65um_nom"].valid_range, list) assert np.float64 == datasets["refl_0_65um_nom"].dtype assert "_FillValue" not in datasets["refl_0_65um_nom"].attrs + assert "valid_range" in datasets["refl_0_65um_nom"].attrs assert "refl_0_65um_nom" == datasets["C02"].file_key assert "_FillValue" not in datasets["C02"].attrs From 5c3cc8c3a80fd509ae6a4b1d51d532659b5f55b0 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Thu, 15 Jun 2023 13:46:44 -0500 Subject: [PATCH 025/481] BUG FIX: added back the handled variables which was lost when trying to reduce complexity. --- satpy/readers/clavrx.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index 23255adda9..39b3afc007 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -348,8 +348,9 @@ def _available_aliases(self, ds_info, current_var): new_info.update(alias_info) yield True, new_info - def _supplement_configured(self, configured_datasets=None): + def available_datasets(self, configured_datasets=None): """Add more information if this reader can provide it.""" + handled_variables = set() for is_avail, ds_info in (configured_datasets or []): # some other file handler knows how to load this if is_avail is not None: @@ -362,6 +363,7 @@ def _supplement_configured(self, configured_datasets=None): # we can confidently say that we can provide this dataset and can # provide more info if matches and var_name in self and this_res != self.resolution: + handled_variables.add(var_name) new_info['resolution'] = self.resolution if self._is_polar(): new_info['coordinates'] = ds_info.get('coordinates', ('longitude', 'latitude')) @@ -371,6 +373,9 @@ def _supplement_configured(self, configured_datasets=None): # then we should keep it going down the chain yield is_avail, ds_info + # get data from file dynamically + yield from self._dynamic_datasets() + def _dynamic_datasets(self): """Get data from file and build aliases.""" for var_name, val in self.file_content.items(): @@ -390,14 +395,6 @@ def _dynamic_datasets(self): # yield any associated aliases yield from self._available_aliases(ds_info, var_name) - def available_datasets(self, configured_datasets=None): - """Automatically determine datasets provided by this file.""" - # update previously configured datasets - yield from self._supplement_configured(configured_datasets) - - # get data from file dynamically - yield from self._dynamic_datasets() - def get_shape(self, dataset_id, ds_info): """Get the shape.""" var_name = ds_info.get('file_key', dataset_id['name']) From 3ad23ec0c3a6b84be337c873409520d261e45329 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Mon, 9 Oct 2023 15:07:56 +0200 Subject: [PATCH 026/481] Read also proj_time0 --- satpy/etc/readers/viirs_vgac_l1c_nc.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/satpy/etc/readers/viirs_vgac_l1c_nc.yaml b/satpy/etc/readers/viirs_vgac_l1c_nc.yaml index bf3c254f80..039f9629ce 100644 --- a/satpy/etc/readers/viirs_vgac_l1c_nc.yaml +++ b/satpy/etc/readers/viirs_vgac_l1c_nc.yaml @@ -252,3 +252,8 @@ datasets: resolution: 5000 file_type: vgac_nc nc_key: time + + proj_time0: + name: proj_time0 + file_type: vgac_nc + nc_key: proj_time0 \ No newline at end of file From 0976ba3ed536292091a39b827926aafa99c3ca3f Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Tue, 10 Oct 2023 14:42:52 +0200 Subject: [PATCH 027/481] Rename time to scanline_timestamp and decode it --- satpy/etc/readers/viirs_vgac_l1c_nc.yaml | 4 ++-- satpy/readers/viirs_vgac_l1c_nc.py | 27 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/satpy/etc/readers/viirs_vgac_l1c_nc.yaml b/satpy/etc/readers/viirs_vgac_l1c_nc.yaml index 039f9629ce..875cdfa2c5 100644 --- a/satpy/etc/readers/viirs_vgac_l1c_nc.yaml +++ b/satpy/etc/readers/viirs_vgac_l1c_nc.yaml @@ -247,8 +247,8 @@ datasets: units: degrees_east nc_key: lon - time: - name: time + scanline_timestamps: + name: scanline_timestamps resolution: 5000 file_type: vgac_nc nc_key: time diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index e4a29c27f1..d85c44d04f 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -73,6 +73,32 @@ def set_time_attrs(self, data): self._end_time = data.attrs["end_time"] self._start_time = data.attrs["start_time"] + def dt64_to_datetime(self, dt64): + """Conversion of numpy.datetime64 to datetime objects.""" + # https://stackoverflow.com/questions/13703720/converting-between-datetime-timestamp-and-datetime64/46921593#46921593 + if type(dt64) == np.datetime64: + unix_epoch = np.datetime64(0, 's') + one_second = np.timedelta64(1, 's') + seconds_since_epoch = (dt64 - unix_epoch) / one_second + dt = datetime.utcfromtimestamp(seconds_since_epoch) + return dt + return dt64 + + def decode_time_variable(self, data, nc): + """Decode time variable.""" + if data.units == "hours since proj_time0": + reference_time = np.datetime64(datetime.strptime(nc['proj_time0'].attrs["units"], + 'days since %d/%m/%YT%H:%M:%S')) + delta_days = float(nc['proj_time0'].values) * np.timedelta64(1, 'D').astype('timedelta64[ms]') + delta_hours = data.values * np.timedelta64(1, 'h').astype('timedelta64[ms]') + time_data = xr.DataArray(reference_time + delta_days + delta_hours, + coords=data.coords, attrs={"long_name": "Scanline time"}) + self._start_time = self.dt64_to_datetime(time_data[0].values) + self._end_time = self.dt64_to_datetime(time_data[-1].values) + return time_data + else: + return data + def get_dataset(self, key, yaml_info): """Get dataset.""" logger.debug("Getting data for: %s", yaml_info['name']) @@ -82,6 +108,7 @@ def get_dataset(self, key, yaml_info): file_key = yaml_info.get('nc_key', name) data = nc[file_key] data = self.calibrate(data, yaml_info, file_key, nc) + data = self.decode_time_variable(data, nc) data.attrs.update(nc.attrs) # For now add global attributes to all datasets data.attrs.update(yaml_info) self.set_time_attrs(data) From 50361aca8fd9433771fedb5acb414c54d1f66cdb Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Tue, 10 Oct 2023 15:14:42 +0200 Subject: [PATCH 028/481] Fix tests --- satpy/readers/viirs_vgac_l1c_nc.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index d85c44d04f..445313a807 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -63,7 +63,7 @@ def convert_to_bt(self, data, data_lut, scale_factor): def fix_radiances_not_in_percent(self, data): """Scale radiances to percent. This was not done in first version of data.""" - return 100*data + return 100 * data def set_time_attrs(self, data): """Set time from attributes.""" @@ -86,7 +86,7 @@ def dt64_to_datetime(self, dt64): def decode_time_variable(self, data, nc): """Decode time variable.""" - if data.units == "hours since proj_time0": + if data.attrs["units"] == "hours since proj_time0": reference_time = np.datetime64(datetime.strptime(nc['proj_time0'].attrs["units"], 'days since %d/%m/%YT%H:%M:%S')) delta_days = float(nc['proj_time0'].values) * np.timedelta64(1, 'D').astype('timedelta64[ms]') @@ -108,7 +108,8 @@ def get_dataset(self, key, yaml_info): file_key = yaml_info.get('nc_key', name) data = nc[file_key] data = self.calibrate(data, yaml_info, file_key, nc) - data = self.decode_time_variable(data, nc) + if file_key == "time": + data = self.decode_time_variable(data, nc) data.attrs.update(nc.attrs) # For now add global attributes to all datasets data.attrs.update(yaml_info) self.set_time_attrs(data) From 92910cec18d96416f43f2482ce69dc7d6da33da1 Mon Sep 17 00:00:00 2001 From: Nina Date: Wed, 11 Oct 2023 10:45:58 +0200 Subject: [PATCH 029/481] Update satpy/readers/viirs_vgac_l1c_nc.py Co-authored-by: Martin Raspaud --- satpy/readers/viirs_vgac_l1c_nc.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index 445313a807..09c361f9a7 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -75,13 +75,8 @@ def set_time_attrs(self, data): def dt64_to_datetime(self, dt64): """Conversion of numpy.datetime64 to datetime objects.""" - # https://stackoverflow.com/questions/13703720/converting-between-datetime-timestamp-and-datetime64/46921593#46921593 - if type(dt64) == np.datetime64: - unix_epoch = np.datetime64(0, 's') - one_second = np.timedelta64(1, 's') - seconds_since_epoch = (dt64 - unix_epoch) / one_second - dt = datetime.utcfromtimestamp(seconds_since_epoch) - return dt + if isinstance(dt64, np.datetime64): + return dt64.astype(datetime) return dt64 def decode_time_variable(self, data, nc): From c9c3459e1e1e1e272d889ae65ba7a6324d56fda6 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Thu, 12 Oct 2023 09:21:17 +0200 Subject: [PATCH 030/481] Split full_days and part_of_days raise exception when units are not of expected format Use um instead of ms for better accuracy --- satpy/readers/viirs_vgac_l1c_nc.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index 09c361f9a7..5fc9fd0415 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -84,15 +84,17 @@ def decode_time_variable(self, data, nc): if data.attrs["units"] == "hours since proj_time0": reference_time = np.datetime64(datetime.strptime(nc['proj_time0'].attrs["units"], 'days since %d/%m/%YT%H:%M:%S')) - delta_days = float(nc['proj_time0'].values) * np.timedelta64(1, 'D').astype('timedelta64[ms]') - delta_hours = data.values * np.timedelta64(1, 'h').astype('timedelta64[ms]') - time_data = xr.DataArray(reference_time + delta_days + delta_hours, - coords=data.coords, attrs={"long_name": "Scanline time"}) + delta_part_of_day, delta_full_days = np.modf(nc['proj_time0'].values) + delta_full_days = np.timedelta64(int(delta_full_days), 'D') + delta_part_of_day = delta_part_of_day * np.timedelta64(1, 'D').astype('timedelta64[us]') + delta_hours = data.values * np.timedelta64(1, 'h').astype('timedelta64[us]') + time_data = xr.DataArray(reference_time + delta_full_days + delta_part_of_day + delta_hours, + coords=data.coords, attrs={'long_name': 'Scanline time'}) self._start_time = self.dt64_to_datetime(time_data[0].values) self._end_time = self.dt64_to_datetime(time_data[-1].values) return time_data else: - return data + raise AttributeError('Unit of time variable in VGAC nc file is not "hours since proj_time0"') def get_dataset(self, key, yaml_info): """Get dataset.""" From 4facdafe90250e46fd43f742a8c3efff16576521 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Thu, 12 Oct 2023 09:21:36 +0200 Subject: [PATCH 031/481] Test to read also scanline_timestamps --- .../reader_tests/test_viirs_vgac_l1c_nc.py | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index 2f926a0e47..d74e3725fb 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -42,6 +42,7 @@ def _nc_filename(tmp_path): nc.createDimension('npix', npix) nc.createDimension('nscn', nscn) nc.createDimension('n_lut', n_lut) + nc.createDimension('one', 1) nc.StartTime = "2023-03-28T09:08:07" nc.EndTime = "2023-03-28T10:11:12" for ind in range(1, 11, 1): @@ -60,6 +61,23 @@ def _nc_filename(tmp_path): setattr(tb_b, attr, attrs[attr]) tb_lut = nc.createVariable(ch_name + "_LUT", np.float32, dimensions=('n_lut')) tb_lut[:] = np.array(range(0, n_lut)) * 0.5 + setattr(tb_lut, 'units', "Kelvin") + reference_time = np.datetime64("2010-01-01T00:00:00") + start_time = np.datetime64("2023-03-28T09:08:07") + np.timedelta64(123, "ms") + delta_days = start_time - reference_time + delta_full_days = delta_days.astype('timedelta64[D]') + hidden_reference_time = reference_time + delta_full_days + delta_part_of_days = start_time - hidden_reference_time + proj_time0 = nc.createVariable('proj_time0', np.float64, ("one",)) + proj_time0[:] = (delta_full_days.astype(int) + + 0.000001 * delta_part_of_days.astype('timedelta64[us]').astype(np.int64) / (60 * 60 * 24)) + proj_time0.units = 'days since 01/01/2010T00:00:00' + time_v = nc.createVariable('time', np.float64, ('nscn',)) + delta_h = np.datetime64(nc.EndTime) - start_time + delta_hours = 0.000001 * delta_h.astype('timedelta64[us]').astype(int) / (60 * 60) + time_v[:] = np.linspace(0, delta_hours, num=nscn) + time_v.units = 'hours since proj_time0' + return filename_str @@ -74,7 +92,15 @@ def test_read_vgac(self, _nc_filename): scn_ = Scene( reader='viirs_vgac_l1c_nc', filenames=[_nc_filename]) - scn_.load(["M05", "M15"]) + scn_.load(["M05", "M15", "scanline_timestamps"]) + print(scn_["scanline_timestamps"][-1]) + assert ((scn_["scanline_timestamps"][0] - + np.datetime64("2023-03-28T09:08:07") - np.timedelta64(123, "ms")) < np.timedelta64(5, "us")) + assert ((scn_["scanline_timestamps"][-1] - np.datetime64("2023-03-28T10:11:12")) < np.timedelta64(5, "us")) + assert ((np.datetime64("2023-03-28T09:08:07") + np.timedelta64(123, "ms") - + scn_["scanline_timestamps"][0]) < np.timedelta64(5, "us")) + assert ((np.datetime64("2023-03-28T10:11:12") - scn_["scanline_timestamps"][-1]) < np.timedelta64(5, "us")) + assert (scn_["M05"][0, 0] == 100) assert (scn_["M15"][0, 0] == 400) assert scn_.start_time == datetime.datetime(year=2023, month=3, day=28, From e96db8158e087d5c3fc6a987362714d506a1e3c6 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Thu, 12 Oct 2023 13:27:13 +0200 Subject: [PATCH 032/481] Try to make codebeat happy --- satpy/readers/viirs_vgac_l1c_nc.py | 35 +++++++++++-------- .../reader_tests/test_viirs_vgac_l1c_nc.py | 2 +- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index 5fc9fd0415..e34d95fb92 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -79,20 +79,26 @@ def dt64_to_datetime(self, dt64): return dt64.astype(datetime) return dt64 - def decode_time_variable(self, data, nc): - """Decode time variable.""" + def extract_time_data(self, data, nc): + """Decode time data.""" + reference_time = np.datetime64(datetime.strptime(nc['proj_time0'].attrs["units"], + 'days since %d/%m/%YT%H:%M:%S')) + delta_part_of_day, delta_full_days = np.modf(nc['proj_time0'].values) + delta_full_days = np.timedelta64(int(delta_full_days), 'D') + delta_part_of_day = delta_part_of_day * np.timedelta64(1, 'D').astype('timedelta64[us]') + delta_hours = data.values * np.timedelta64(1, 'h').astype('timedelta64[us]') + time_data = xr.DataArray(reference_time + delta_full_days + delta_part_of_day + delta_hours, + coords=data.coords, attrs={'long_name': 'Scanline time'}) + self._start_time = self.dt64_to_datetime(time_data[0].values) + self._end_time = self.dt64_to_datetime(time_data[-1].values) + return time_data + + def decode_time_variable(self, data, file_key, nc): + """Decide if time data should be decoded.""" + if file_key != "time": + return data if data.attrs["units"] == "hours since proj_time0": - reference_time = np.datetime64(datetime.strptime(nc['proj_time0'].attrs["units"], - 'days since %d/%m/%YT%H:%M:%S')) - delta_part_of_day, delta_full_days = np.modf(nc['proj_time0'].values) - delta_full_days = np.timedelta64(int(delta_full_days), 'D') - delta_part_of_day = delta_part_of_day * np.timedelta64(1, 'D').astype('timedelta64[us]') - delta_hours = data.values * np.timedelta64(1, 'h').astype('timedelta64[us]') - time_data = xr.DataArray(reference_time + delta_full_days + delta_part_of_day + delta_hours, - coords=data.coords, attrs={'long_name': 'Scanline time'}) - self._start_time = self.dt64_to_datetime(time_data[0].values) - self._end_time = self.dt64_to_datetime(time_data[-1].values) - return time_data + return self.extract_time_data(data, nc) else: raise AttributeError('Unit of time variable in VGAC nc file is not "hours since proj_time0"') @@ -105,8 +111,7 @@ def get_dataset(self, key, yaml_info): file_key = yaml_info.get('nc_key', name) data = nc[file_key] data = self.calibrate(data, yaml_info, file_key, nc) - if file_key == "time": - data = self.decode_time_variable(data, nc) + data = self.decode_time_variable(data, file_key, nc) data.attrs.update(nc.attrs) # For now add global attributes to all datasets data.attrs.update(yaml_info) self.set_time_attrs(data) diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index d74e3725fb..2159af3864 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -61,7 +61,7 @@ def _nc_filename(tmp_path): setattr(tb_b, attr, attrs[attr]) tb_lut = nc.createVariable(ch_name + "_LUT", np.float32, dimensions=('n_lut')) tb_lut[:] = np.array(range(0, n_lut)) * 0.5 - setattr(tb_lut, 'units', "Kelvin") + tb_lut.units = "Kelvin" reference_time = np.datetime64("2010-01-01T00:00:00") start_time = np.datetime64("2023-03-28T09:08:07") + np.timedelta64(123, "ms") delta_days = start_time - reference_time From 333f0f2902d7f115c48a874d37bee210d531995e Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 11 Dec 2023 14:16:08 +0200 Subject: [PATCH 033/481] Add ASII-GW and ASII-TF datasets for v2021 --- satpy/etc/readers/nwcsaf-geo.yaml | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/satpy/etc/readers/nwcsaf-geo.yaml b/satpy/etc/readers/nwcsaf-geo.yaml index e22ae09fc1..8ab3db9500 100644 --- a/satpy/etc/readers/nwcsaf-geo.yaml +++ b/satpy/etc/readers/nwcsaf-geo.yaml @@ -689,11 +689,13 @@ datasets: file_type: nc_nwcsaf_rdt # ----ASII products in multiple files ------------ + # until v2018 asii_turb_trop_prob: name: asii_turb_trop_prob resolution: 3000 file_type: [nc_nwcsaf_asii_tf, nc_nwcsaf_asii] + # until v2018 asii_turb_prob_pal: name: asii_turb_prob_pal resolution: 3000 @@ -701,6 +703,24 @@ datasets: # ----ASII-TF product ------------ + # v2021 onwards + asiitf_prob: + name: asiitf_prob + resolution: 3000 + file_type: nc_nwcsaf_asii_tf + + # v2021 onwards + asiitf_prob_pal: + name: asiitf_prob_pal + file_type: nc_nwcsaf_asii_tf + + # v2021 onwards + asiitf_status_flag: + name: asiitf_status_flag + resolution: 3000 + file_type: nc_nwcsaf_asii_tf + + # until v2018 asii_turb_prob_status_flag: name: asii_turb_trop_prob_status_flag resolution: 3000 @@ -718,11 +738,30 @@ datasets: # ----ASII-GW product ------------ + # v2021 onwards + asiigw_wv_prob: + name: asiigw_wv_prob + resolution: 3000 + file_type: nc_nwcsaf_asii_gw + + # v2021 onwards + asiigw_status_flag: + name: asiigw_status_flag + resolution: 3000 + file_type: nc_nwcsaf_asii_gw + + # v2021 onwards + asiigw_wv_prob_pal: + name: asiigw_wv_prob_pal + file_type: nc_nwcsaf_asii_gw + + # until v2018 asii_turb_wave_prob: name: asii_turb_wave_prob resolution: 3000 file_type: nc_nwcsaf_asii_gw + # until v2018 asii_turb_wave_prob_status_flag: name: asii_turb_wave_prob_status_flag resolution: 3000 From 241a2d7db19c72c061e75fb5390b8865fc22d3f0 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 11 Dec 2023 14:16:38 +0200 Subject: [PATCH 034/481] Add missing cma_quality and ct_status_flag datasets --- satpy/etc/readers/nwcsaf-geo.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/satpy/etc/readers/nwcsaf-geo.yaml b/satpy/etc/readers/nwcsaf-geo.yaml index 8ab3db9500..3ab2bf8536 100644 --- a/satpy/etc/readers/nwcsaf-geo.yaml +++ b/satpy/etc/readers/nwcsaf-geo.yaml @@ -77,6 +77,11 @@ datasets: resolution: 3000 file_type: nc_nwcsaf_cma + cma_quality: + name: cma_quality + resolution: 3000 + file_type: nc_nwcsaf_cma + cma_pal: name: cma_pal resolution: 3000 @@ -129,6 +134,11 @@ datasets: resolution: 3000 file_type: nc_nwcsaf_ct + ct_status_flag: + name: ct_status_flag + resolution: 3000 + file_type: nc_nwcsaf_ct + ct_pal: name: ct_pal resolution: 3000 From 4829c4a02b602a1531b574d21634351de0ff6804 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 11 Dec 2023 14:22:21 +0200 Subject: [PATCH 035/481] Fix crrph palette and status flag names --- satpy/etc/readers/nwcsaf-geo.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/etc/readers/nwcsaf-geo.yaml b/satpy/etc/readers/nwcsaf-geo.yaml index 3ab2bf8536..c003d6f6e7 100644 --- a/satpy/etc/readers/nwcsaf-geo.yaml +++ b/satpy/etc/readers/nwcsaf-geo.yaml @@ -380,7 +380,7 @@ datasets: file_type: nc_nwcsaf_crr-ph crrph_pal: - name: crrph_intensity_pal + name: crrph_pal resolution: 3000 file_type: nc_nwcsaf_crr-ph @@ -400,7 +400,7 @@ datasets: file_type: nc_nwcsaf_crr-ph crrph_status_flag: - name: crrph_status + name: crrph_status_flag resolution: 3000 file_type: nc_nwcsaf_crr-ph From ac5301e092134a4b8884ffc8e1f6ae6d84f797a0 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 11 Dec 2023 13:09:42 +0000 Subject: [PATCH 036/481] Bump expected xarray version number --- satpy/tests/writer_tests/test_cf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/tests/writer_tests/test_cf.py b/satpy/tests/writer_tests/test_cf.py index 7fabb04f10..d33b195977 100644 --- a/satpy/tests/writer_tests/test_cf.py +++ b/satpy/tests/writer_tests/test_cf.py @@ -566,9 +566,9 @@ def _should_use_compression_keyword(): # xarray currently ignores the "compression" keyword, see # https://github.com/pydata/xarray/issues/7388. There's already an open # PR, so we assume that this will be fixed in the next minor release - # (current release is 2023.02). If not, tests will fail and remind us. + # (current release is 2023.12). If not, tests will fail and remind us. versions = _get_backend_versions() return ( versions["libnetcdf"] >= Version("4.9.0") and - versions["xarray"] >= Version("2023.12") + versions["xarray"] >= Version("2024.02") ) From a59fdd59c14be620a509feec8ef1e6aedbd57436 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 11 Dec 2023 13:11:10 +0000 Subject: [PATCH 037/481] Make attribute encoding public --- satpy/cf/attrs.py | 8 ++++---- satpy/tests/cf_tests/test_attrs.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/satpy/cf/attrs.py b/satpy/cf/attrs.py index cdec8500d4..adcc2ba60a 100644 --- a/satpy/cf/attrs.py +++ b/satpy/cf/attrs.py @@ -128,8 +128,8 @@ def _encode_to_cf(obj): return _encode_python_objects(obj) -def _encode_nc_attrs(attrs): - """Encode dataset attributes in a netcdf compatible datatype. +def encode_attrs_to_cf(attrs): + """Encode dataset attributes as a netcdf compatible datatype. Args: attrs (dict): @@ -161,7 +161,7 @@ def preprocess_attrs( if flatten_attrs: data_arr.attrs = flatten_dict(data_arr.attrs) - data_arr.attrs = _encode_nc_attrs(data_arr.attrs) + data_arr.attrs = encode_attrs_to_cf(data_arr.attrs) return data_arr @@ -224,7 +224,7 @@ def preprocess_header_attrs(header_attrs, flatten_attrs=False): if header_attrs is not None: if flatten_attrs: header_attrs = flatten_dict(header_attrs) - header_attrs = _encode_nc_attrs(header_attrs) # OrderedDict + header_attrs = encode_attrs_to_cf(header_attrs) # OrderedDict else: header_attrs = {} header_attrs = _add_history(header_attrs) diff --git a/satpy/tests/cf_tests/test_attrs.py b/satpy/tests/cf_tests/test_attrs.py index 082dea602c..4772d5e428 100644 --- a/satpy/tests/cf_tests/test_attrs.py +++ b/satpy/tests/cf_tests/test_attrs.py @@ -24,14 +24,14 @@ class TestCFAttributeEncoding: def test__encode_nc_attrs(self): """Test attributes encoding.""" - from satpy.cf.attrs import _encode_nc_attrs + from satpy.cf.attrs import encode_attrs_to_cf from satpy.tests.cf_tests._test_data import get_test_attrs from satpy.tests.utils import assert_dict_array_equality attrs, expected, _ = get_test_attrs() # Test encoding - encoded = _encode_nc_attrs(attrs) + encoded = encode_attrs_to_cf(attrs) assert_dict_array_equality(expected, encoded) # Test decoding of json-encoded attributes From cc33e1c1fa680ec9e10121824cb2a245cf017fb1 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 11 Dec 2023 13:22:35 +0000 Subject: [PATCH 038/481] Revert "Bump expected xarray version number" This reverts commit ac5301e092134a4b8884ffc8e1f6ae6d84f797a0. --- satpy/tests/writer_tests/test_cf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/tests/writer_tests/test_cf.py b/satpy/tests/writer_tests/test_cf.py index d33b195977..7fabb04f10 100644 --- a/satpy/tests/writer_tests/test_cf.py +++ b/satpy/tests/writer_tests/test_cf.py @@ -566,9 +566,9 @@ def _should_use_compression_keyword(): # xarray currently ignores the "compression" keyword, see # https://github.com/pydata/xarray/issues/7388. There's already an open # PR, so we assume that this will be fixed in the next minor release - # (current release is 2023.12). If not, tests will fail and remind us. + # (current release is 2023.02). If not, tests will fail and remind us. versions = _get_backend_versions() return ( versions["libnetcdf"] >= Version("4.9.0") and - versions["xarray"] >= Version("2024.02") + versions["xarray"] >= Version("2023.12") ) From fe50d42cc928c390b4582978045e25edc17c8137 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 11 Dec 2023 15:14:50 +0200 Subject: [PATCH 039/481] Update xarray version in compression tests for compression kwarg --- satpy/tests/writer_tests/test_cf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/writer_tests/test_cf.py b/satpy/tests/writer_tests/test_cf.py index 7fabb04f10..62c9995cde 100644 --- a/satpy/tests/writer_tests/test_cf.py +++ b/satpy/tests/writer_tests/test_cf.py @@ -570,5 +570,5 @@ def _should_use_compression_keyword(): versions = _get_backend_versions() return ( versions["libnetcdf"] >= Version("4.9.0") and - versions["xarray"] >= Version("2023.12") + versions["xarray"] >= Version("2024.1") ) From 2948a6f5aac96a0496cc1cac93f8c0fe75e7001f Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Wed, 13 Dec 2023 09:41:24 +0000 Subject: [PATCH 040/481] Add test triggering the error --- satpy/tests/reader_tests/test_satpy_cf_nc.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/satpy/tests/reader_tests/test_satpy_cf_nc.py b/satpy/tests/reader_tests/test_satpy_cf_nc.py index 0c22f5b3f1..6528a80723 100644 --- a/satpy/tests/reader_tests/test_satpy_cf_nc.py +++ b/satpy/tests/reader_tests/test_satpy_cf_nc.py @@ -147,6 +147,10 @@ def cf_scene(): "nadir_longitude": 1, "nadir_latitude": 1, "only_in_1": False + }, + "time_parameters": { + "nominal_start_time": tstart, + "nominal_end_time": tend } }) @@ -388,18 +392,17 @@ def test_read_prefixed_channels_by_user_no_prefix(self, cf_scene, nc_filename): np.testing.assert_array_equal(scn_["1"].data, cf_scene["1"].data) np.testing.assert_array_equal(scn_["1"].coords["lon"], cf_scene["lon"].data) # lon loded as coord - def test_orbital_parameters(self, cf_scene, nc_filename): - """Test that the orbital parameters in attributes are handled correctly.""" + def test_decoding_of_dict_type_attributes(self, cf_scene, nc_filename): + """Test decoding of dict type attributes.""" cf_scene.save_datasets(writer="cf", filename=nc_filename) scn_ = Scene(reader="satpy_cf_nc", filenames=[nc_filename]) scn_.load(["image0"]) - orig_attrs = cf_scene["image0"].attrs["orbital_parameters"] - new_attrs = scn_["image0"].attrs["orbital_parameters"] - assert isinstance(new_attrs, dict) - for key in orig_attrs: - assert orig_attrs[key] == new_attrs[key] + for attr_name in ["orbital_parameters", "time_parameters"]: + orig_attrs = cf_scene["image0"].attrs[attr_name] + new_attrs = scn_["image0"].attrs[attr_name] + assert new_attrs == orig_attrs def test_write_and_read_from_two_files(self, nc_filename, nc_filename_i): """Save two datasets with different resolution and read the solar_zenith_angle again.""" From 6ee324821f85d93f11ade113a987b743c0eef011 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Wed, 13 Dec 2023 10:04:10 +0000 Subject: [PATCH 041/481] Decode time parameters to datetime --- satpy/readers/satpy_cf_nc.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/satpy/readers/satpy_cf_nc.py b/satpy/readers/satpy_cf_nc.py index 7a26ead72b..bf8908e604 100644 --- a/satpy/readers/satpy_cf_nc.py +++ b/satpy/readers/satpy_cf_nc.py @@ -313,7 +313,12 @@ def get_dataset(self, ds_id, ds_info): data.attrs.update(nc.attrs) # For now add global attributes to all datasets if "orbital_parameters" in data.attrs: data.attrs["orbital_parameters"] = _str2dict(data.attrs["orbital_parameters"]) - + if "time_parameters" in data.attrs: + time_params = _str2dict(data.attrs["time_parameters"]) + from dateutil.parser import isoparse + for key, val in time_params.items(): + time_params[key] = isoparse(val) + data.attrs["time_parameters"] = time_params return data def get_area_def(self, dataset_id): From cd4743ccddf1b943b540de9d792af9437526df1f Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Wed, 13 Dec 2023 10:21:09 +0000 Subject: [PATCH 042/481] Refactor dict type decoding --- satpy/readers/satpy_cf_nc.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/satpy/readers/satpy_cf_nc.py b/satpy/readers/satpy_cf_nc.py index bf8908e604..2e85a166f8 100644 --- a/satpy/readers/satpy_cf_nc.py +++ b/satpy/readers/satpy_cf_nc.py @@ -311,16 +311,13 @@ def get_dataset(self, ds_id, ds_info): if name != ds_id["name"]: data = data.rename(ds_id["name"]) data.attrs.update(nc.attrs) # For now add global attributes to all datasets - if "orbital_parameters" in data.attrs: - data.attrs["orbital_parameters"] = _str2dict(data.attrs["orbital_parameters"]) - if "time_parameters" in data.attrs: - time_params = _str2dict(data.attrs["time_parameters"]) - from dateutil.parser import isoparse - for key, val in time_params.items(): - time_params[key] = isoparse(val) - data.attrs["time_parameters"] = time_params + self._decode_dict_type_attrs(data) return data + def _decode_dict_type_attrs(self, data): + for key in ["orbital_parameters", "time_parameters"]: + data.attrs[key] = _str2dict(data.attrs[key]) + def get_area_def(self, dataset_id): """Get area definition from CF complient netcdf.""" try: @@ -334,8 +331,18 @@ def get_area_def(self, dataset_id): raise NotImplementedError +def _datetime_parser(json_dict): + import dateutil.parser + for key, value in json_dict.items(): + try: + json_dict[key] = dateutil.parser.parse(value) + except (TypeError, ValueError): + pass + return json_dict + + def _str2dict(val): """Convert string to dictionary.""" if isinstance(val, str): - val = json.loads(val) + val = json.loads(val, object_hook=_datetime_parser) return val From 8b29b8fb45848b8c96228385a8181dfee42ff4e6 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Wed, 13 Dec 2023 10:57:04 +0000 Subject: [PATCH 043/481] Only decode attributes if available --- satpy/readers/satpy_cf_nc.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/satpy/readers/satpy_cf_nc.py b/satpy/readers/satpy_cf_nc.py index 2e85a166f8..b9c932b852 100644 --- a/satpy/readers/satpy_cf_nc.py +++ b/satpy/readers/satpy_cf_nc.py @@ -316,7 +316,10 @@ def get_dataset(self, ds_id, ds_info): def _decode_dict_type_attrs(self, data): for key in ["orbital_parameters", "time_parameters"]: - data.attrs[key] = _str2dict(data.attrs[key]) + try: + data.attrs[key] = _str2dict(data.attrs[key]) + except KeyError: + continue def get_area_def(self, dataset_id): """Get area definition from CF complient netcdf.""" From 42a863d560aabb9af32f04044671d153d8f3ab7f Mon Sep 17 00:00:00 2001 From: andream Date: Fri, 15 Dec 2023 15:37:38 +0100 Subject: [PATCH 044/481] add ir_sandwich and ir_sandwich_with_night_colorized_ir_clouds --- satpy/etc/composites/fci.yaml | 40 +++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index 0f0e98f4e0..2da7b9f593 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -47,15 +47,6 @@ composites: modifiers: [ sunz_corrected ] standard_name: toa_bidirectional_reflectance - binary_cloud_mask: - # This will set all clear pixels to '0', all pixles with cloudy features (meteorological/dust/ash clouds) to '1' and - # missing/undefined pixels to 'nan'. This can be used for the the official EUMETSAT cloud mask product (CLM). - compositor: !!python/name:satpy.composites.CategoricalDataCompositor - prerequisites: - - name: 'cloud_state' - lut: [.nan, 0, 1, 1, 1, 1, 1, 1, 0, .nan] - standard_name: binary_cloud_mask - true_color: compositor: !!python/name:satpy.composites.SelfSharpenedRGB description: > @@ -180,3 +171,34 @@ composites: prerequisites: - geo_color_high_clouds - geo_color_background_with_low_clouds + + ir_sandwich: + compositor: !!python/name:satpy.composites.SandwichCompositor + standard_name: ir_sandwich + prerequisites: + - name: 'vis_06' + modifiers: [ sunz_corrected ] + - name: colorized_ir_clouds + + colorized_ir_clouds: + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - name: 'ir_105' + standard_name: colorized_ir_clouds + + ir_sandwich_with_night_colorized_ir_clouds: + compositor: !!python/name:satpy.composites.DayNightCompositor + standard_name: fci_day_night_blend + lim_low: 73 + lim_high: 82 + prerequisites: + - ir_sandwich + - colorized_ir_clouds + binary_cloud_mask: + # This will set all clear pixels to '0', all pixles with cloudy features (meteorological/dust/ash clouds) to '1' and + # missing/undefined pixels to 'nan'. This can be used for the the official EUMETSAT cloud mask product (CLM). + compositor: !!python/name:satpy.composites.CategoricalDataCompositor + prerequisites: + - name: 'cloud_state' + lut: [ .nan, 0, 1, 1, 1, 1, 1, 1, 0, .nan ] + standard_name: binary_cloud_mask From 4f3eb61678199b0f1273eac0fe2f1fef9d352813 Mon Sep 17 00:00:00 2001 From: andream Date: Fri, 15 Dec 2023 15:38:27 +0100 Subject: [PATCH 045/481] fix comment typos --- satpy/etc/composites/fci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index 2da7b9f593..aae4de313d 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -195,8 +195,8 @@ composites: - ir_sandwich - colorized_ir_clouds binary_cloud_mask: - # This will set all clear pixels to '0', all pixles with cloudy features (meteorological/dust/ash clouds) to '1' and - # missing/undefined pixels to 'nan'. This can be used for the the official EUMETSAT cloud mask product (CLM). + # This will set all clear pixels to '0', all pixels with cloudy features (meteorological/dust/ash clouds) to '1' and + # missing/undefined pixels to 'nan'. This can be used for the official EUMETSAT cloud mask product (CLM). compositor: !!python/name:satpy.composites.CategoricalDataCompositor prerequisites: - name: 'cloud_state' From 7a15b6d220f2a563818268f6fdc7ccb956a8a07a Mon Sep 17 00:00:00 2001 From: andream Date: Fri, 15 Dec 2023 15:47:30 +0100 Subject: [PATCH 046/481] add cloud_type and cloud_phase --- satpy/etc/composites/fci.yaml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index aae4de313d..5fa8997731 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -194,6 +194,39 @@ composites: prerequisites: - ir_sandwich - colorized_ir_clouds + + cloud_type: + description: > + Equal to cimss_cloud_type, but with additional sunz_reducer modifier to avoid saturation at the terminator. + references: + EUMETRAIN Quick Guide: https://resources.eumetrain.org/rgb_quick_guides/quick_guides/CloudTypeRGB.pdf + Recipe: https://resources.eumetrain.org/RGBguide/recipes/RGB_recipes.pdf + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: nir_13 + modifiers: [ sunz_corrected, sunz_reduced ] + - name: vis_06 + modifiers: [ sunz_corrected, sunz_reduced ] + - name: nir_16 + modifiers: [ sunz_corrected, sunz_reduced ] + standard_name: cimss_cloud_type + + cloud_phase: + description: > + Equal to cloud_phase, but with additional sunz_reducer modifier to avoid saturation at the terminator. + references: + EUMETRAIN Quick Guide: https://resources.eumetrain.org/rgb_quick_guides/quick_guides/CloudPhaseRGB.pdf + Recipe: https://resources.eumetrain.org/RGBguide/recipes/RGB_recipes.pdf + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: nir_16 + modifiers: [sunz_corrected, sunz_reduced] + - name: nir_22 + modifiers: [sunz_corrected, sunz_reduced] + - name: vis_06 + modifiers: [sunz_corrected, rayleigh_corrected, sunz_reduced] + standard_name: cloud_phase + binary_cloud_mask: # This will set all clear pixels to '0', all pixels with cloudy features (meteorological/dust/ash clouds) to '1' and # missing/undefined pixels to 'nan'. This can be used for the official EUMETSAT cloud mask product (CLM). From 6f4ca385748516b3ee11c718051d773b3334e509 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 13:04:37 +0800 Subject: [PATCH 047/481] Update __init__.py --- satpy/composites/__init__.py | 49 +++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index a70bbea86f..46dbe1b6fc 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1679,9 +1679,10 @@ def __call__(self, *args, **kwargs): class BackgroundCompositor(GenericCompositor): """A compositor that overlays one composite on top of another.""" - def __call__(self, projectables, *args, **kwargs): + def __call__(self, projectables, bg_fill_in=True, *args, **kwargs): """Call the compositor.""" projectables = self.match_data_arrays(projectables) + self.bg_fill_in = bg_fill_in # Get enhanced datasets foreground = enhance2dataset(projectables[0], convert_p=True) background = enhance2dataset(projectables[1], convert_p=True) @@ -1717,17 +1718,41 @@ def _get_merged_image_data(foreground: xr.DataArray, background: xr.DataArray ) -> list[xr.DataArray]: if "A" in foreground.attrs["mode"]: - # Use alpha channel as weight and blend the two composites - alpha = foreground.sel(bands="A") - data = [] - # NOTE: there's no alpha band in the output image, it will - # be added by the data writer - for band in foreground.mode[:-1]: - fg_band = foreground.sel(bands=band) - bg_band = background.sel(bands=band) - chan = (fg_band * alpha + bg_band * (1 - alpha)) - chan = xr.where(chan.isnull(), bg_band, chan) - data.append(chan) + if "A" not in background.attrs["mode"]: + # Use alpha channel as weight and blend the two composites + alpha = foreground.sel(bands="A") + data = [] + # NOTE: there's no alpha band in the output image, it will + # be added by the data writer + for band in foreground.mode[:-1]: + fg_band = foreground.sel(bands=band) + bg_band = background.sel(bands=band) + chan = (fg_band * alpha + bg_band * (1 - alpha)) + # Fill the area where foreground is Nan with background + if self.bg_fill_in: + chan = xr.where(chan.isnull(), bg_band, chan) + data.append(chan) + + else: + # Both foreground and background have alpha channels + # Use them to build a new alpha channel and blend the two composites + alpha_fore = foreground.sel(bands="A") + alpha_back = background.sel(bands="A") + data = [] + new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) + + for band in foreground.mode: + fg_band = foreground.sel(bands=band) + bg_band = background.sel(bands=band) + if band != "A": + chan = (fg_band * alpha_fore + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha + else: + chan = new_alpha + # Fill the area where foreground is Nan with background + if self.bg_fill_in: + chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) + data.append(chan) + else: data_arr = xr.where(foreground.isnull(), background, foreground) # Split to separate bands so the mode is correct From c21651a02d0366c0448bb2aeaa11a89be03a5b0d Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 14:03:59 +0800 Subject: [PATCH 048/481] Update __init__.py --- satpy/composites/__init__.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 46dbe1b6fc..079f07fbd4 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1677,7 +1677,13 @@ def __call__(self, *args, **kwargs): class BackgroundCompositor(GenericCompositor): - """A compositor that overlays one composite on top of another.""" + """A compositor that overlays one composite on top of another. + + Args: + bg_fill_in (bool): True means the compositor will fill the area where + foreground is Nan with background. + False means it will just leave the area blank. + """ def __call__(self, projectables, bg_fill_in=True, *args, **kwargs): """Call the compositor.""" @@ -1694,7 +1700,10 @@ def __call__(self, projectables, bg_fill_in=True, *args, **kwargs): background = add_bands(background, foreground["bands"]) attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) - data = self._get_merged_image_data(foreground, background) + if self.bg_fill_in: + data = self._get_merged_image_data(foreground, background, bg_fill_in=True) + else: + data = self._get_merged_image_data(foreground, background, bg_fill_in=False) res = super(BackgroundCompositor, self).__call__(data, **kwargs) res.attrs.update(attrs) return res @@ -1715,7 +1724,8 @@ def _combine_metadata_with_mode_and_sensor(self, @staticmethod def _get_merged_image_data(foreground: xr.DataArray, - background: xr.DataArray + background: xr.DataArray, + bg_fill_in=True ) -> list[xr.DataArray]: if "A" in foreground.attrs["mode"]: if "A" not in background.attrs["mode"]: @@ -1729,7 +1739,7 @@ def _get_merged_image_data(foreground: xr.DataArray, bg_band = background.sel(bands=band) chan = (fg_band * alpha + bg_band * (1 - alpha)) # Fill the area where foreground is Nan with background - if self.bg_fill_in: + if bg_fill_in: chan = xr.where(chan.isnull(), bg_band, chan) data.append(chan) @@ -1749,7 +1759,7 @@ def _get_merged_image_data(foreground: xr.DataArray, else: chan = new_alpha # Fill the area where foreground is Nan with background - if self.bg_fill_in: + if bg_fill_in: chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) data.append(chan) From 09c281eaeab61042fecf148aefc5521db61d3f14 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 15:33:48 +0800 Subject: [PATCH 049/481] Update test_composites.py --- satpy/tests/test_composites.py | 38 +++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index b5d5a54b96..39e8485475 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1497,28 +1497,46 @@ def setup_class(cls): @mock.patch("satpy.composites.enhance2dataset", _enhance2dataset) @pytest.mark.parametrize( - ("foreground_bands", "background_bands", "exp_bands", "exp_result"), + ("foreground_bands", "background_bands", "bg_fill_in", "exp_bands", "exp_result"), [ - ("L", "L", "L", np.array([[1.0, 0.5], [0.0, 1.0]])), - ("LA", "LA", "L", np.array([[1.0, 0.75], [0.5, 1.0]])), - ("RGB", "RGB", "RGB", np.array([ + ("L", "L", True, "L", np.array([[1.0, 0.5], [0.0, 1.0]])), + ("L", "L", False, "L", np.array([[1.0, 0.5], [0.0, 1.0]])), + ("LA", "LA", True, "LA", np.array([[[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), + ("LA", "LA", False, "LA", np.array([[[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), + ("RGB", "RGB", True, "RGB", np.array([ [[1., 0.5], [0., 1.]], [[1., 0.5], [0., 1.]], [[1., 0.5], [0., 1.]]])), - ("RGBA", "RGBA", "RGB", np.array([ + ("RGB", "RGB", False, "RGB", np.array([ + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]]])), + ("RGBA", "RGBA", True, "RGBA", np.array([ + [[1., 0.75], [0.5, 1.]], + [[1., 0.75], [0.5, 1.]], + [[1., 0.75], [0.5, 1.]], + [[1.0, 1.0], [1.0, 1.0]]])), + ("RGBA", "RGBA", False, "RGBA", np.array([ [[1., 0.75], [0.5, 1.]], [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]]])), - ("RGBA", "RGB", "RGB", np.array([ [[1., 0.75], [0.5, 1.]], + [[1.0, 1.0], [1.0, 1.0]]])), + ("RGBA", "RGB", True, "RGBA", np.array([ [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]]])), + [[1., 0.75], [0.5, 1.]], + [[1., 0.75], [0.5, 1.]], + [[1.0, 1.0], [1.0, 1.0]]])), + ("RGBA", "RGB", False, "RGBA", np.array([ + [[1., 0.75], [0.5, 1.]], + [[1., 0.75], [0.5, 1.]], + [[1., 0.75], [0.5, 1.]], + [[1.0, 1.0], [1.0, 1.0]]])), ] ) - def test_call(self, foreground_bands, background_bands, exp_bands, exp_result): + def test_call(self, foreground_bands, background_bands, bg_fill_in, exp_bands, exp_result): """Test the background compositing.""" from satpy.composites import BackgroundCompositor - comp = BackgroundCompositor("name") + comp = BackgroundCompositor("name", bg_fill_in=bg_fill_in) # L mode images foreground_data = self.foreground_data[foreground_bands] From d82057a8c544978788f7d64fc7f396f649294017 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 16:21:00 +0800 Subject: [PATCH 050/481] Update __init__.py --- satpy/composites/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 079f07fbd4..e99201740d 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1722,6 +1722,10 @@ def _combine_metadata_with_mode_and_sensor(self, attrs["sensor"] = self._get_sensors([foreground, background]) return attrs + @staticmethod + def _fill_nan_area(channel, filler): + return xr.where(channel.isnull(), filler, chan) + @staticmethod def _get_merged_image_data(foreground: xr.DataArray, background: xr.DataArray, @@ -1740,7 +1744,7 @@ def _get_merged_image_data(foreground: xr.DataArray, chan = (fg_band * alpha + bg_band * (1 - alpha)) # Fill the area where foreground is Nan with background if bg_fill_in: - chan = xr.where(chan.isnull(), bg_band, chan) + chan = BackgroundCompositor._fill_nan_area(chan, bg_band) data.append(chan) else: @@ -1760,7 +1764,7 @@ def _get_merged_image_data(foreground: xr.DataArray, chan = new_alpha # Fill the area where foreground is Nan with background if bg_fill_in: - chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) + chan = BackgroundCompositor._fill_nan_area(chan, bg_band * alpha_back) data.append(chan) else: From 557853a6ea2e794133bd48f5bfebf7ae4952da98 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 16:22:24 +0800 Subject: [PATCH 051/481] 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 e99201740d..8b652e37cb 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1724,7 +1724,7 @@ def _combine_metadata_with_mode_and_sensor(self, @staticmethod def _fill_nan_area(channel, filler): - return xr.where(channel.isnull(), filler, chan) + return xr.where(channel.isnull(), filler) @staticmethod def _get_merged_image_data(foreground: xr.DataArray, From 61930e6d9fd25f8e77ff19df9ab678ffb0559e80 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 16:23:37 +0800 Subject: [PATCH 052/481] 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 8b652e37cb..431f8bd66e 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1724,7 +1724,7 @@ def _combine_metadata_with_mode_and_sensor(self, @staticmethod def _fill_nan_area(channel, filler): - return xr.where(channel.isnull(), filler) + return xr.where(channel.isnull(), filler, channel) @staticmethod def _get_merged_image_data(foreground: xr.DataArray, From 1d12212a0afe4c0e780e0fec45a66eb26a891fa9 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 16:46:06 +0800 Subject: [PATCH 053/481] Update __init__.py --- satpy/composites/__init__.py | 62 ++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 431f8bd66e..43405d4b6b 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1722,49 +1722,49 @@ def _combine_metadata_with_mode_and_sensor(self, attrs["sensor"] = self._get_sensors([foreground, background]) return attrs - @staticmethod - def _fill_nan_area(channel, filler): - return xr.where(channel.isnull(), filler, channel) - @staticmethod def _get_merged_image_data(foreground: xr.DataArray, background: xr.DataArray, bg_fill_in=True ) -> list[xr.DataArray]: if "A" in foreground.attrs["mode"]: - if "A" not in background.attrs["mode"]: - # Use alpha channel as weight and blend the two composites - alpha = foreground.sel(bands="A") - data = [] - # NOTE: there's no alpha band in the output image, it will - # be added by the data writer - for band in foreground.mode[:-1]: - fg_band = foreground.sel(bands=band) - bg_band = background.sel(bands=band) - chan = (fg_band * alpha + bg_band * (1 - alpha)) + # Use alpha channel as weight and blend the two composites + # If both foreground and background have alpha channels + # Use them to build a new alpha channel and blend the two composites + alpha_fore = foreground.sel(bands="A") + alpha_back = background.sel(bands="A") if "A" in background.attrs["mode"] else None + new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) + + data = [] + + if "A" in background.attrs["mode"]: + cutoff = 0 + else: + cutoff = -1 + + for band in foreground.mode[: cutoff]: + fg_band = foreground.sel(bands=band) + bg_band = background.sel(bands=band) + + if "A" in background.attrs["mode"]: + chan = (fg_band * alpha_fore + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha \ + if band != "A" else new_alpha + # Fill the area where foreground is Nan with background if bg_fill_in: - chan = BackgroundCompositor._fill_nan_area(chan, bg_band) + chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) + data.append(chan) - else: - # Both foreground and background have alpha channels - # Use them to build a new alpha channel and blend the two composites - alpha_fore = foreground.sel(bands="A") - alpha_back = background.sel(bands="A") - data = [] - new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) - - for band in foreground.mode: - fg_band = foreground.sel(bands=band) - bg_band = background.sel(bands=band) - if band != "A": - chan = (fg_band * alpha_fore + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha - else: - chan = new_alpha + else: + # NOTE: there's no alpha band in the output image, it will + # be added by the data writer + chan = (fg_band * alpha_fore + bg_band * (1 - alpha_fore)) + # Fill the area where foreground is Nan with background if bg_fill_in: - chan = BackgroundCompositor._fill_nan_area(chan, bg_band * alpha_back) + chan = xr.where(chan.isnull(), bg_band, chan) + data.append(chan) else: From d1b9dd89a1b0adaeea93d408bc716a7701ea4498 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 16:53:16 +0800 Subject: [PATCH 054/481] Update __init__.py --- satpy/composites/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 43405d4b6b..54f756fed0 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1738,11 +1738,11 @@ def _get_merged_image_data(foreground: xr.DataArray, data = [] if "A" in background.attrs["mode"]: - cutoff = 0 + band_list = foreground.mode else: - cutoff = -1 + band_list = foreground.mode[: -1] - for band in foreground.mode[: cutoff]: + for band in band_list: fg_band = foreground.sel(bands=band) bg_band = background.sel(bands=band) From 0ef787d9886c7891b3cded5d5c6b59dcdf783ca8 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 17:15:08 +0800 Subject: [PATCH 055/481] Update __init__.py --- satpy/composites/__init__.py | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 54f756fed0..d29854aabf 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1732,7 +1732,7 @@ def _get_merged_image_data(foreground: xr.DataArray, # If both foreground and background have alpha channels # Use them to build a new alpha channel and blend the two composites alpha_fore = foreground.sel(bands="A") - alpha_back = background.sel(bands="A") if "A" in background.attrs["mode"] else None + alpha_back = background.sel(bands="A") if "A" in background.attrs["mode"] else 1 new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) data = [] @@ -1740,32 +1740,20 @@ def _get_merged_image_data(foreground: xr.DataArray, if "A" in background.attrs["mode"]: band_list = foreground.mode else: - band_list = foreground.mode[: -1] + band_list = foreground.mode[:-1] for band in band_list: fg_band = foreground.sel(bands=band) bg_band = background.sel(bands=band) - if "A" in background.attrs["mode"]: - chan = (fg_band * alpha_fore + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha \ - if band != "A" else new_alpha + chan = (fg_band * alpha_fore + + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha if band != "A" else new_alpha - # Fill the area where foreground is Nan with background - if bg_fill_in: - chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) + # Fill the area where foreground is Nan with background + if bg_fill_in: + chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) - data.append(chan) - - else: - # NOTE: there's no alpha band in the output image, it will - # be added by the data writer - chan = (fg_band * alpha_fore + bg_band * (1 - alpha_fore)) - - # Fill the area where foreground is Nan with background - if bg_fill_in: - chan = xr.where(chan.isnull(), bg_band, chan) - - data.append(chan) + data.append(chan) else: data_arr = xr.where(foreground.isnull(), background, foreground) From afd9f8acec651cee94c5b0ad42af44e6dd89a088 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 17:20:57 +0800 Subject: [PATCH 056/481] Update __init__.py --- satpy/composites/__init__.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index d29854aabf..28250ed0b8 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1729,8 +1729,6 @@ def _get_merged_image_data(foreground: xr.DataArray, ) -> list[xr.DataArray]: if "A" in foreground.attrs["mode"]: # Use alpha channel as weight and blend the two composites - # If both foreground and background have alpha channels - # Use them to build a new alpha channel and blend the two composites alpha_fore = foreground.sel(bands="A") alpha_back = background.sel(bands="A") if "A" in background.attrs["mode"] else 1 new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) @@ -1749,9 +1747,7 @@ def _get_merged_image_data(foreground: xr.DataArray, chan = (fg_band * alpha_fore + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha if band != "A" else new_alpha - # Fill the area where foreground is Nan with background - if bg_fill_in: - chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) + chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) if bg_fill_in else chan data.append(chan) From 19e41df8cfad4ceaa83473839463db6d6d0f7bb0 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 17:38:35 +0800 Subject: [PATCH 057/481] Update __init__.py --- satpy/composites/__init__.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 28250ed0b8..259e8c04bb 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1700,10 +1700,7 @@ def __call__(self, projectables, bg_fill_in=True, *args, **kwargs): background = add_bands(background, foreground["bands"]) attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) - if self.bg_fill_in: - data = self._get_merged_image_data(foreground, background, bg_fill_in=True) - else: - data = self._get_merged_image_data(foreground, background, bg_fill_in=False) + data = self._get_merged_image_data(foreground, background, bg_fill_in=self.bg_fill_in) res = super(BackgroundCompositor, self).__call__(data, **kwargs) res.attrs.update(attrs) return res @@ -1734,11 +1731,7 @@ def _get_merged_image_data(foreground: xr.DataArray, new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) data = [] - - if "A" in background.attrs["mode"]: - band_list = foreground.mode - else: - band_list = foreground.mode[:-1] + band_list = foreground.mode if "A" in background.attrs["mode"] else foreground.mode[:-1] for band in band_list: fg_band = foreground.sel(bands=band) From 13896c371f44e1d6096bdc9b0686c57f0ca22ba8 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 17:54:09 +0800 Subject: [PATCH 058/481] 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 259e8c04bb..abe9439812 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1740,7 +1740,8 @@ def _get_merged_image_data(foreground: xr.DataArray, chan = (fg_band * alpha_fore + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha if band != "A" else new_alpha - chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) if bg_fill_in else chan + chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) if ( + bg_fill_in and chan != new_alpha) else chan data.append(chan) From 23ddfba76d327f3a923c254a4b8e8ee0001e851d Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 16 Dec 2023 18:08:46 +0800 Subject: [PATCH 059/481] 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 abe9439812..29708c402d 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1741,7 +1741,7 @@ def _get_merged_image_data(foreground: xr.DataArray, bg_band * alpha_back * (1 - alpha_fore)) / new_alpha if band != "A" else new_alpha chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) if ( - bg_fill_in and chan != new_alpha) else chan + bg_fill_in and band != "A") else chan data.append(chan) From a87631eaff33b3cbd22d8f7c255500a54d362491 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 17 Dec 2023 23:48:45 +0800 Subject: [PATCH 060/481] Update __init__.py --- satpy/composites/__init__.py | 102 ++++++++++++++++++++++++++++++----- 1 file changed, 88 insertions(+), 14 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 29708c402d..3cc4401b6c 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1679,19 +1679,57 @@ def __call__(self, *args, **kwargs): class BackgroundCompositor(GenericCompositor): """A compositor that overlays one composite on top of another. - Args: - bg_fill_in (bool): True means the compositor will fill the area where - foreground is Nan with background. - False means it will just leave the area blank. + Beside foreground and background, a third optional dataset could be passed + to the compositor to use its Nan area for masking. This is useful when you + reproject a specific local-area image (e.g. a geostationary satellite view) + to global extent, and put it on a global background (e.g. NASA's Black Marble) + while making other areas of the world transparent, only keeping the local one. + + To use this function in a YAML configuration file, add the third dataset + as ``optional_prerequisites``: + + .. code-block:: yaml + + night_cloud_alpha_2000_with_background: + compositor: !!python/name:satpy.composites.BackgroundCompositor + prerequisites: + - name: night_cloud_alpha_2000 + - name: static_night + optional_prerequisites: + - name: IR105 + """ + def __init__(self, name, mask_value=None, **kwargs): # noqa: D417 + """Collect custom configuration values. - def __call__(self, projectables, bg_fill_in=True, *args, **kwargs): + Args: + mask_value (float / None): If it's a float, all the pixels where the third dataset + values that are equal to this will be masked out. + If it's a string, it only accepts strings related to + ``np.nan``, e.g. "np.nan" / "nan" / "Nan" / "Null". + Otherwise, it will be set to ``np.nan``. + If not set by the user, it will also be ``np.nan``. + This argument could be helpful when you try to use a + StaticImageCompositor for mask. Please note: If you + are using ``mask_value`` then your mask dataset + shouldn't include an alpha channel. + + """ + self.mask_value = mask_value if mask_value is not None else np.nan + + super(BackgroundCompositor, self).__init__(name, **kwargs) + + def __call__(self, projectables, optional_datasets=None, *args, **kwargs): """Call the compositor.""" - projectables = self.match_data_arrays(projectables) - self.bg_fill_in = bg_fill_in + optional_datasets = tuple() if optional_datasets is None else optional_datasets + projectables = self.match_data_arrays(projectables + optional_datasets) # Get enhanced datasets foreground = enhance2dataset(projectables[0], convert_p=True) background = enhance2dataset(projectables[1], convert_p=True) + mask_dataset = enhance2dataset(projectables[2], convert_p=True) if not optional_datasets == [] else None + + original_bg_mode = background.attrs["mode"] + # Adjust bands so that they match # L/RGB -> RGB/RGB # LA/RGB -> RGBA/RGBA @@ -1699,8 +1737,16 @@ def __call__(self, projectables, bg_fill_in=True, *args, **kwargs): foreground = add_bands(foreground, background["bands"]) background = add_bands(background, foreground["bands"]) + # True means the alpha channel of the background was initially generated, e.g. by CloudCompositor + # not newly added through 'add_bands' + # False means it was newly added, or it just doesn't exist + # This is important in the next steps + original_bg_alpha = True if ("A" in original_bg_mode and "A" in background.attrs["mode"]) else False + + mask = self._get_mask(mask_dataset, self.mask_value) + attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) - data = self._get_merged_image_data(foreground, background, bg_fill_in=self.bg_fill_in) + data = self._get_merged_image_data(foreground, background, original_bg_alpha=original_bg_alpha, mask=mask) res = super(BackgroundCompositor, self).__call__(data, **kwargs) res.attrs.update(attrs) return res @@ -1719,19 +1765,48 @@ def _combine_metadata_with_mode_and_sensor(self, attrs["sensor"] = self._get_sensors([foreground, background]) return attrs + @staticmethod + def _get_mask(dataset: xr.DataArray, mask_value): + if dataset is None: + mask = None + else: + # If the mask_dataset already has an alpha channel, just use it as mask + # Otherwise build one + if "A" in dataset.attrs["mode"]: + mask = dataset.sel(bands="A") + else: + if np.isnan(mask_value): + mask = xr.where(dataset.isnull(), 0, 1) + else: + mask = xr.where(dataset == mask_value, 0, 1) + + return mask + @staticmethod def _get_merged_image_data(foreground: xr.DataArray, background: xr.DataArray, - bg_fill_in=True + original_bg_alpha: bool, + mask: xr.DataArray ) -> list[xr.DataArray]: if "A" in foreground.attrs["mode"]: - # Use alpha channel as weight and blend the two composites + # Use alpha channels as weights and blend the two composites alpha_fore = foreground.sel(bands="A") - alpha_back = background.sel(bands="A") if "A" in background.attrs["mode"] else 1 + # If the background alpha is authentic just use it + # If not, it is full of 1 meaning it's a forged one, or it doesn't exist(but we still need it) + alpha_back = background.sel(bands="A") if original_bg_alpha else xr.full_like(alpha_fore, 1) + # Any way we need a new alpha for the new image new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) + # Do the area-masking job + if mask is not None: + alpha_fore.data = np.minimum(alpha_fore.data, mask.data[0]) + alpha_back.data = np.minimum(alpha_back.data, mask.data[0]) + new_alpha.data = np.minimum(new_alpha.data, mask.data[0]) data = [] - band_list = foreground.mode if "A" in background.attrs["mode"] else foreground.mode[:-1] + # If the background alpha is authentic or area-masking is effective + # The compositor will pass the new_alpha to the writer + # Otherwise it will leave the writer to decide + band_list = foreground.mode if (original_bg_alpha or mask is not None)else foreground.mode[:-1] for band in band_list: fg_band = foreground.sel(bands=band) @@ -1740,8 +1815,7 @@ def _get_merged_image_data(foreground: xr.DataArray, chan = (fg_band * alpha_fore + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha if band != "A" else new_alpha - chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) if ( - bg_fill_in and band != "A") else chan + chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) data.append(chan) From 9d306e59df1faa01e4fba5bdbdd9e5ff31172404 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 18 Dec 2023 16:32:23 +0800 Subject: [PATCH 061/481] composite and test --- satpy/composites/__init__.py | 148 ++++++++++++++++++--------------- satpy/tests/test_composites.py | 95 +++++++++++++-------- 2 files changed, 144 insertions(+), 99 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 3cc4401b6c..176ccc5764 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1680,7 +1680,8 @@ class BackgroundCompositor(GenericCompositor): """A compositor that overlays one composite on top of another. Beside foreground and background, a third optional dataset could be passed - to the compositor to use its Nan area for masking. This is useful when you + to the compositor to use it for masking. If this dataset contains + more than one band, only the first band will be used. This is useful when you reproject a specific local-area image (e.g. a geostationary satellite view) to global extent, and put it on a global background (e.g. NASA's Black Marble) while making other areas of the world transparent, only keeping the local one. @@ -1703,16 +1704,12 @@ def __init__(self, name, mask_value=None, **kwargs): # noqa: D417 """Collect custom configuration values. Args: - mask_value (float / None): If it's a float, all the pixels where the third dataset - values that are equal to this will be masked out. - If it's a string, it only accepts strings related to - ``np.nan``, e.g. "np.nan" / "nan" / "Nan" / "Null". - Otherwise, it will be set to ``np.nan``. - If not set by the user, it will also be ``np.nan``. + mask_value (float / None): All the pixels on the stacked image where the values + of the third dataset that are equal to this will be + masked out. + If not set by the user, it will be ``np.nan``. This argument could be helpful when you try to use a - StaticImageCompositor for mask. Please note: If you - are using ``mask_value`` then your mask dataset - shouldn't include an alpha channel. + local image(StaticImageCompositor) for masking. """ self.mask_value = mask_value if mask_value is not None else np.nan @@ -1721,14 +1718,12 @@ def __init__(self, name, mask_value=None, **kwargs): # noqa: D417 def __call__(self, projectables, optional_datasets=None, *args, **kwargs): """Call the compositor.""" - optional_datasets = tuple() if optional_datasets is None else optional_datasets + optional_datasets = [] if optional_datasets is None else optional_datasets projectables = self.match_data_arrays(projectables + optional_datasets) # Get enhanced datasets foreground = enhance2dataset(projectables[0], convert_p=True) background = enhance2dataset(projectables[1], convert_p=True) - mask_dataset = enhance2dataset(projectables[2], convert_p=True) if not optional_datasets == [] else None - - original_bg_mode = background.attrs["mode"] + mask_dataset = projectables[2] if not optional_datasets == [] else None # Adjust bands so that they match # L/RGB -> RGB/RGB @@ -1737,16 +1732,14 @@ def __call__(self, projectables, optional_datasets=None, *args, **kwargs): foreground = add_bands(foreground, background["bands"]) background = add_bands(background, foreground["bands"]) - # True means the alpha channel of the background was initially generated, e.g. by CloudCompositor - # not newly added through 'add_bands' - # False means it was newly added, or it just doesn't exist - # This is important in the next steps - original_bg_alpha = True if ("A" in original_bg_mode and "A" in background.attrs["mode"]) else False - mask = self._get_mask(mask_dataset, self.mask_value) + alpha_fore = self._get_alpha(foreground) + alpha_back = self._get_alpha(background) + output_mode = self._get_output_mode(foreground, background, mask) attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) - data = self._get_merged_image_data(foreground, background, original_bg_alpha=original_bg_alpha, mask=mask) + data = self._get_merged_image_data(foreground, background, mask=mask, + alpha_fore=alpha_fore, alpha_back=alpha_back, output_mode=output_mode) res = super(BackgroundCompositor, self).__call__(data, **kwargs) res.attrs.update(attrs) return res @@ -1770,59 +1763,84 @@ def _get_mask(dataset: xr.DataArray, mask_value): if dataset is None: mask = None else: - # If the mask_dataset already has an alpha channel, just use it as mask - # Otherwise build one - if "A" in dataset.attrs["mode"]: - mask = dataset.sel(bands="A") + dataset = dataset.isel(bands=0) + if np.isnan(mask_value): + mask = xr.where(dataset.isnull(), 0, 1) else: - if np.isnan(mask_value): - mask = xr.where(dataset.isnull(), 0, 1) - else: - mask = xr.where(dataset == mask_value, 0, 1) + mask = xr.where(dataset == mask_value, 0, 1) return mask + @staticmethod + def _get_alpha(dataset: xr.DataArray): + # If the dataset contains an alpha channel, just use it + # If not, we still need one. So build it and fill it with 1 + if "A" in dataset.attrs['mode']: + alpha = dataset.sel(bands="A") + else: + first_band = dataset.isel(bands=0) + alpha = xr.full_like(first_band, 1) + alpha['bands'] = "A" + + # There could be Nans in the alpha, especially for original ones + # Replace them with 0, so they won't affect new_alpha + alpha = xr.where(alpha.isnull(), 0, alpha) + + return alpha + + @staticmethod + def _get_output_mode(foreground: xr.DataArray, + background: xr.DataArray, + mask: xr.DataArray): + # Get the output bands of the stacked image + # Actually, it's about deciding whether to pass the new alpha band of the stacked image to the writer + # Or just leave the write for decision + + # If both images have alpha band or just background has one, the new alpha band will be passed to the writer + # If area-masking is needed, the same + # If neither of the images has alpha band but area-masking is still needed, the same + if "A" in foreground.attrs['mode']: + if "A" in background.attrs['mode']: + output_mode = background.mode + else: + output_mode = background.mode if mask is None else foreground.mode + else: + if "A" in background.attrs['mode']: + output_mode = background.mode + else: + output_mode = foreground.mode if mask is None else foreground.mode + "A" + + return output_mode + @staticmethod def _get_merged_image_data(foreground: xr.DataArray, background: xr.DataArray, - original_bg_alpha: bool, - mask: xr.DataArray + mask: xr.DataArray, + alpha_fore: xr.DataArray, + alpha_back: xr.DataArray, + output_mode: str, ) -> list[xr.DataArray]: - if "A" in foreground.attrs["mode"]: - # Use alpha channels as weights and blend the two composites - alpha_fore = foreground.sel(bands="A") - # If the background alpha is authentic just use it - # If not, it is full of 1 meaning it's a forged one, or it doesn't exist(but we still need it) - alpha_back = background.sel(bands="A") if original_bg_alpha else xr.full_like(alpha_fore, 1) - # Any way we need a new alpha for the new image - new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) - # Do the area-masking job - if mask is not None: - alpha_fore.data = np.minimum(alpha_fore.data, mask.data[0]) - alpha_back.data = np.minimum(alpha_back.data, mask.data[0]) - new_alpha.data = np.minimum(new_alpha.data, mask.data[0]) - - data = [] - # If the background alpha is authentic or area-masking is effective - # The compositor will pass the new_alpha to the writer - # Otherwise it will leave the writer to decide - band_list = foreground.mode if (original_bg_alpha or mask is not None)else foreground.mode[:-1] - - for band in band_list: - fg_band = foreground.sel(bands=band) - bg_band = background.sel(bands=band) - - chan = (fg_band * alpha_fore + - bg_band * alpha_back * (1 - alpha_fore)) / new_alpha if band != "A" else new_alpha - - chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) - - data.append(chan) - else: - data_arr = xr.where(foreground.isnull(), background, foreground) - # Split to separate bands so the mode is correct - data = [data_arr.sel(bands=b) for b in data_arr["bands"]] + new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) + + # Do the masking job + if mask is not None: + alpha_fore.data = np.minimum(alpha_fore.data, mask.data) + alpha_back.data = np.minimum(alpha_back.data, mask.data) + new_alpha.data = np.minimum(new_alpha.data, mask.data) + + data = [] + + for band in output_mode: + fg_band = foreground.sel(bands=band) if band != "A" else new_alpha + bg_band = background.sel(bands=band) if band != "A" else new_alpha + + chan = (fg_band * alpha_fore + + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha if band != "A" else new_alpha + + chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) + + data.append(chan) return data diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 39e8485475..725eb23895 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1493,53 +1493,74 @@ def setup_class(cls): [[1.0, 0.5], [0.0, np.nan]], [[0.5, 0.5], [0.5, 0.5]]]), } + mask_data = { + "L": np.array([[[1., 0.5], [0., np.nan]]]), + "RGB": np.array([ + [[1., 0.5], [0., np.nan]], + [[1., 0.5], [0., np.nan]], + [[1., 0.5], [0., np.nan]]]), + } cls.foreground_data = foreground_data + cls.mask_data = mask_data @mock.patch("satpy.composites.enhance2dataset", _enhance2dataset) @pytest.mark.parametrize( - ("foreground_bands", "background_bands", "bg_fill_in", "exp_bands", "exp_result"), + ("foreground_bands", "background_bands", "mask", "mask_bands", "mask_value", "exp_bands", "exp_result"), [ - ("L", "L", True, "L", np.array([[1.0, 0.5], [0.0, 1.0]])), - ("L", "L", False, "L", np.array([[1.0, 0.5], [0.0, 1.0]])), - ("LA", "LA", True, "LA", np.array([[[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), - ("LA", "LA", False, "LA", np.array([[[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), - ("RGB", "RGB", True, "RGB", np.array([ - [[1., 0.5], [0., 1.]], - [[1., 0.5], [0., 1.]], - [[1., 0.5], [0., 1.]]])), - ("RGB", "RGB", False, "RGB", np.array([ - [[1., 0.5], [0., 1.]], - [[1., 0.5], [0., 1.]], - [[1., 0.5], [0., 1.]]])), - ("RGBA", "RGBA", True, "RGBA", np.array([ - [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]], - [[1.0, 1.0], [1.0, 1.0]]])), - ("RGBA", "RGBA", False, "RGBA", np.array([ - [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]], + ("L", "L", True, "L", None, "LA", np.array([[[1.0, 0.5], [0.0, 0.0]],[[1.0, 1.0], [1.0, 0.0]]])), + ("L", "L", True, "RGB", None, "LA", np.array([[[1.0, 0.5], [0.0, 0.0]], [[1.0, 1.0], [1.0, 0.0]]])), + ("L", "LA", False, "L", None, "LA", np.array([[[1.0, 0.5], [0.0, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), + ("LA", "LA", False, "RGB", None, "LA", np.array([[[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), + ("LA", "RGB", True, "L", None, "RGBA", np.array([ + [[1.0, 0.75], [0.5, 0.0]], + [[1.0, 0.75], [0.5, 0.0]], + [[1.0, 0.75], [0.5, 0.0]], + [[1.0, 1.0], [1.0, 0.0]]])), + ("RGB", "RGB", True, "L", 1, "RGBA", np.array([ + [[0.0, 0.5], [0.0, 1.0]], + [[0.0, 0.5], [0.0, 1.0]], + [[0.0, 0.5], [0.0, 1.0]], + [[0.0, 1.0], [1.0, 1.0]]])), + ("RGB", "RGB", True, "RGB", 0.5, "RGBA", np.array([ + [[1.0, 0.0], [0.0, 1.0]], + [[1.0, 0.0], [0.0, 1.0]], + [[1.0, 0.0], [0.0, 1.0]], + [[1.0, 0.0], [1.0, 1.0]]])), + ("RGB", "RGBA", False, "L", 1, "RGBA", np.array([ + [[1.0, 0.5], [0.0, 1.0]], + [[1.0, 0.5], [0.0, 1.0]], + [[1.0, 0.5], [0.0, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), - ("RGBA", "RGB", True, "RGBA", np.array([ - [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]], - [[1.0, 1.0], [1.0, 1.0]]])), - ("RGBA", "RGB", False, "RGBA", np.array([ - [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]], - [[1., 0.75], [0.5, 1.]], + ("RGBA", "RGB", True, "L", None, "RGBA", np.array([ + [[1.0, 0.75], [0.5, 0.0]], + [[1.0, 0.75], [0.5, 0.0]], + [[1.0, 0.75], [0.5, 0.0]], + [[1.0, 1.0], [1.0, 0.0]]])), + ("RGBA", "RGB", True, "RGB", 0, "RGBA", np.array([ + [[1.0, 0.75], [0.0, 1.0]], + [[1.0, 0.75], [0.0, 1.0]], + [[1.0, 0.75], [0.0, 1.0]], + [[1.0, 1.0], [0.0, 1.0]]])), + ("RGBA", "RGBA", True, "L", 0.5, "RGBA", np.array([ + [[1.0, 0.0], [0.5, 1.0]], + [[1.0, 0.0], [0.5, 1.0]], + [[1.0, 0.0], [0.5, 1.0]], + [[1.0, 0.0], [1.0, 1.0]]])), + ("RGBA", "RGBA", False, "RGB", 0, "RGBA", np.array([ + [[1.0, 0.75], [0.5, 1.0]], + [[1.0, 0.75], [0.5, 1.0]], + [[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), ] ) - def test_call(self, foreground_bands, background_bands, bg_fill_in, exp_bands, exp_result): + def test_call(self, foreground_bands, background_bands, mask, mask_bands, mask_value, exp_bands, exp_result): """Test the background compositing.""" from satpy.composites import BackgroundCompositor - comp = BackgroundCompositor("name", bg_fill_in=bg_fill_in) + comp = BackgroundCompositor("name", mask_value=mask_value) # L mode images foreground_data = self.foreground_data[foreground_bands] + mask_data = self.mask_data[mask_bands] attrs = {"mode": foreground_bands, "area": "foo"} foreground = xr.DataArray(da.from_array(foreground_data), dims=("bands", "y", "x"), @@ -1549,7 +1570,13 @@ def test_call(self, foreground_bands, background_bands, bg_fill_in, exp_bands, e background = xr.DataArray(da.ones((len(background_bands), 2, 2)), dims=("bands", "y", "x"), coords={"bands": [c for c in attrs["mode"]]}, attrs=attrs) - res = comp([foreground, background]) + attrs = {"mode": mask_bands, "area": "foo"} + mask_dataset = xr.DataArray(da.from_array(mask_data), + dims=("bands", "y", "x"), + coords={"bands": [c for c in attrs["mode"]]}, + attrs=attrs) + res = comp([foreground, background], optional_datasets=[mask_dataset]) if mask else \ + comp([foreground, background]) assert res.attrs["area"] == "foo" np.testing.assert_allclose(res, exp_result) assert res.attrs["mode"] == exp_bands From 01af472a36ea037f5f891eaa6fbfe0ec9bc63133 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 08:34:41 +0000 Subject: [PATCH 062/481] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- 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 176ccc5764..a76c58d71c 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1795,7 +1795,7 @@ def _get_output_mode(foreground: xr.DataArray, # Get the output bands of the stacked image # Actually, it's about deciding whether to pass the new alpha band of the stacked image to the writer # Or just leave the write for decision - + # If both images have alpha band or just background has one, the new alpha band will be passed to the writer # If area-masking is needed, the same # If neither of the images has alpha band but area-masking is still needed, the same From d1ef7dc8f0489c0ed30ad9ea2f1576bed0fbc575 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 18 Dec 2023 16:36:23 +0800 Subject: [PATCH 063/481] Update __init__.py --- satpy/composites/__init__.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 176ccc5764..3c59ca9635 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1775,12 +1775,12 @@ def _get_mask(dataset: xr.DataArray, mask_value): def _get_alpha(dataset: xr.DataArray): # If the dataset contains an alpha channel, just use it # If not, we still need one. So build it and fill it with 1 - if "A" in dataset.attrs['mode']: + if "A" in dataset.attrs["mode"]: alpha = dataset.sel(bands="A") else: first_band = dataset.isel(bands=0) alpha = xr.full_like(first_band, 1) - alpha['bands'] = "A" + alpha["bands"] = "A" # There could be Nans in the alpha, especially for original ones # Replace them with 0, so they won't affect new_alpha @@ -1799,13 +1799,13 @@ def _get_output_mode(foreground: xr.DataArray, # If both images have alpha band or just background has one, the new alpha band will be passed to the writer # If area-masking is needed, the same # If neither of the images has alpha band but area-masking is still needed, the same - if "A" in foreground.attrs['mode']: - if "A" in background.attrs['mode']: + if "A" in foreground.attrs["mode"]: + if "A" in background.attrs["mode"]: output_mode = background.mode else: output_mode = background.mode if mask is None else foreground.mode else: - if "A" in background.attrs['mode']: + if "A" in background.attrs["mode"]: output_mode = background.mode else: output_mode = foreground.mode if mask is None else foreground.mode + "A" From 1d20d45d15ed5baee7ef41a7a700d78c3f3a2692 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 18 Dec 2023 16:47:46 +0800 Subject: [PATCH 064/481] Update __init__.py --- 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 12496f42b1..c6717aa141 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1763,7 +1763,12 @@ def _get_mask(dataset: xr.DataArray, mask_value): if dataset is None: mask = None else: - dataset = dataset.isel(bands=0) + # If mask dataset is a composite, then extract its first band + try: + dataset = dataset.isel(bands=0) + except ValueError: + pass + if np.isnan(mask_value): mask = xr.where(dataset.isnull(), 0, 1) else: From 89818ad1ba03dc8a0edbdac25780f193cffcf6a3 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 18 Dec 2023 17:31:21 +0800 Subject: [PATCH 065/481] Update test_composites.py --- satpy/tests/test_composites.py | 59 ++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 725eb23895..29f77c25ed 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1500,67 +1500,82 @@ def setup_class(cls): [[1., 0.5], [0., np.nan]], [[1., 0.5], [0., np.nan]]]), } + mask_no_bands_data = np.array([[1., 0.5], [0., np.nan]]) cls.foreground_data = foreground_data cls.mask_data = mask_data + cls.mask_no_bands_data = mask_no_bands_data @mock.patch("satpy.composites.enhance2dataset", _enhance2dataset) @pytest.mark.parametrize( - ("foreground_bands", "background_bands", "mask", "mask_bands", "mask_value", "exp_bands", "exp_result"), + ("foreground_bands", "background_bands", "mask", "mask_no_bands", + "mask_bands", "mask_value", "exp_bands", "exp_result"), [ - ("L", "L", True, "L", None, "LA", np.array([[[1.0, 0.5], [0.0, 0.0]],[[1.0, 1.0], [1.0, 0.0]]])), - ("L", "L", True, "RGB", None, "LA", np.array([[[1.0, 0.5], [0.0, 0.0]], [[1.0, 1.0], [1.0, 0.0]]])), - ("L", "LA", False, "L", None, "LA", np.array([[[1.0, 0.5], [0.0, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), - ("LA", "LA", False, "RGB", None, "LA", np.array([[[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), - ("LA", "RGB", True, "L", None, "RGBA", np.array([ + ("L", "L", True, False, "L", None, "LA", np.array([[[1.0, 0.5], [0.0, 0.0]],[[1.0, 1.0], [1.0, 0.0]]])), + ("L", "L", True, False, "RGB", None, "LA", np.array([[[1.0, 0.5], [0.0, 0.0]], [[1.0, 1.0], [1.0, 0.0]]])), + ("L", "LA", False, False, "L", None, "LA", np.array([[[1.0, 0.5], [0.0, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), + ("LA", "LA", False, False, "RGB", None, "LA", np.array([[[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), + ("LA", "RGB", True, False, "L", None, "RGBA", np.array([ [[1.0, 0.75], [0.5, 0.0]], [[1.0, 0.75], [0.5, 0.0]], [[1.0, 0.75], [0.5, 0.0]], [[1.0, 1.0], [1.0, 0.0]]])), - ("RGB", "RGB", True, "L", 1, "RGBA", np.array([ + ("RGB", "RGB", True, False, "L", 1, "RGBA", np.array([ [[0.0, 0.5], [0.0, 1.0]], [[0.0, 0.5], [0.0, 1.0]], [[0.0, 0.5], [0.0, 1.0]], [[0.0, 1.0], [1.0, 1.0]]])), - ("RGB", "RGB", True, "RGB", 0.5, "RGBA", np.array([ + ("RGB", "RGB", True, False, "RGB", 0.5, "RGBA", np.array([ [[1.0, 0.0], [0.0, 1.0]], [[1.0, 0.0], [0.0, 1.0]], [[1.0, 0.0], [0.0, 1.0]], [[1.0, 0.0], [1.0, 1.0]]])), - ("RGB", "RGBA", False, "L", 1, "RGBA", np.array([ + ("RGB", "RGBA", False, False, "L", 1, "RGBA", np.array([ [[1.0, 0.5], [0.0, 1.0]], [[1.0, 0.5], [0.0, 1.0]], [[1.0, 0.5], [0.0, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), - ("RGBA", "RGB", True, "L", None, "RGBA", np.array([ + ("RGBA", "RGB", True, False, "L", None, "RGBA", np.array([ [[1.0, 0.75], [0.5, 0.0]], [[1.0, 0.75], [0.5, 0.0]], [[1.0, 0.75], [0.5, 0.0]], [[1.0, 1.0], [1.0, 0.0]]])), - ("RGBA", "RGB", True, "RGB", 0, "RGBA", np.array([ + ("RGBA", "RGB", True, False, "RGB", 0, "RGBA", np.array([ [[1.0, 0.75], [0.0, 1.0]], [[1.0, 0.75], [0.0, 1.0]], [[1.0, 0.75], [0.0, 1.0]], [[1.0, 1.0], [0.0, 1.0]]])), - ("RGBA", "RGBA", True, "L", 0.5, "RGBA", np.array([ + ("RGBA", "RGB", False, False, "RGB", 0, "RGBA", np.array([ + [[1.0, 0.75], [0.5, 1.0]], + [[1.0, 0.75], [0.5, 1.0]], + [[1.0, 0.75], [0.5, 1.0]], + [[1.0, 1.0], [1.0, 1.0]]])), + ("RGBA", "RGBA", True, False, "L", 0.5, "RGBA", np.array([ [[1.0, 0.0], [0.5, 1.0]], [[1.0, 0.0], [0.5, 1.0]], [[1.0, 0.0], [0.5, 1.0]], [[1.0, 0.0], [1.0, 1.0]]])), - ("RGBA", "RGBA", False, "RGB", 0, "RGBA", np.array([ + ("RGBA", "RGBA", False, False, "RGB", 0, "RGBA", np.array([ [[1.0, 0.75], [0.5, 1.0]], [[1.0, 0.75], [0.5, 1.0]], [[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), + ("RGBA", "RGBA", True, True, "L", None, "RGBA", np.array([ + [[1.0, 0.75], [0.5, 0.0]], + [[1.0, 0.75], [0.5, 0.0]], + [[1.0, 0.75], [0.5, 0.0]], + [[1.0, 1.0], [1.0, 0.0]]])), ] ) - def test_call(self, foreground_bands, background_bands, mask, mask_bands, mask_value, exp_bands, exp_result): + def test_call(self, foreground_bands, background_bands, mask, mask_no_bands, mask_bands, mask_value, + exp_bands, exp_result): """Test the background compositing.""" from satpy.composites import BackgroundCompositor comp = BackgroundCompositor("name", mask_value=mask_value) # L mode images foreground_data = self.foreground_data[foreground_bands] - mask_data = self.mask_data[mask_bands] + mask_data = self.mask_data[mask_bands] if not mask_no_bands else self.mask_data["L"] + attrs = {"mode": foreground_bands, "area": "foo"} foreground = xr.DataArray(da.from_array(foreground_data), dims=("bands", "y", "x"), @@ -1575,8 +1590,18 @@ def test_call(self, foreground_bands, background_bands, mask, mask_bands, mask_v dims=("bands", "y", "x"), coords={"bands": [c for c in attrs["mode"]]}, attrs=attrs) - res = comp([foreground, background], optional_datasets=[mask_dataset]) if mask else \ - comp([foreground, background]) + attrs = {"area": "foo"} + mask_no_bands_dataset = xr.DataArray(da.from_array(self.mask_no_bands_data), + dims=("y", "x"), + attrs=attrs) + if mask and not mask_no_bands: + res = comp([foreground, background], optional_datasets=[mask_dataset]) + elif mask and mask_no_bands: + res = comp([foreground, background], optional_datasets=[mask_no_bands_dataset]) + else: + res = comp([foreground, background]) + print(res.data.compute()) + assert res.attrs["area"] == "foo" np.testing.assert_allclose(res, exp_result) assert res.attrs["mode"] == exp_bands From 27eb1582cf3275c83c348064f28288e786837c0a Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 18 Dec 2023 18:08:38 +0800 Subject: [PATCH 066/481] EDIT --- satpy/composites/__init__.py | 15 ++++++--------- satpy/tests/test_composites.py | 4 ++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index c6717aa141..2bb8163129 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1804,16 +1804,13 @@ def _get_output_mode(foreground: xr.DataArray, # If both images have alpha band or just background has one, the new alpha band will be passed to the writer # If area-masking is needed, the same # If neither of the images has alpha band but area-masking is still needed, the same - if "A" in foreground.attrs["mode"]: - if "A" in background.attrs["mode"]: - output_mode = background.mode - else: - output_mode = background.mode if mask is None else foreground.mode + if "A" in background.attrs["mode"]: + output_mode = background.mode else: - if "A" in background.attrs["mode"]: - output_mode = background.mode - else: - output_mode = foreground.mode if mask is None else foreground.mode + "A" + output_mode = ( + background.mode if "A" in foreground.attrs["mode"] and mask is None else + foreground.mode if mask is None else foreground.mode + "A" + ) return output_mode diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 29f77c25ed..e50389a326 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1519,7 +1519,7 @@ def setup_class(cls): [[1.0, 0.75], [0.5, 0.0]], [[1.0, 0.75], [0.5, 0.0]], [[1.0, 1.0], [1.0, 0.0]]])), - ("RGB", "RGB", True, False, "L", 1, "RGBA", np.array([ + ("RGB", "RGB", True, True, "L", 1, "RGBA", np.array([ [[0.0, 0.5], [0.0, 1.0]], [[0.0, 0.5], [0.0, 1.0]], [[0.0, 0.5], [0.0, 1.0]], @@ -1549,7 +1549,7 @@ def setup_class(cls): [[1.0, 0.75], [0.5, 1.0]], [[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), - ("RGBA", "RGBA", True, False, "L", 0.5, "RGBA", np.array([ + ("RGBA", "RGBA", True, True, "L", 0.5, "RGBA", np.array([ [[1.0, 0.0], [0.5, 1.0]], [[1.0, 0.0], [0.5, 1.0]], [[1.0, 0.0], [0.5, 1.0]], From d9ec74428ca2cdbc31ee87ae65be7f6110070b9c Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 18 Dec 2023 10:09:10 +0000 Subject: [PATCH 067/481] Convert any attribute starting with "{" to string --- satpy/readers/satpy_cf_nc.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/satpy/readers/satpy_cf_nc.py b/satpy/readers/satpy_cf_nc.py index b9c932b852..24c5ef438f 100644 --- a/satpy/readers/satpy_cf_nc.py +++ b/satpy/readers/satpy_cf_nc.py @@ -315,11 +315,8 @@ def get_dataset(self, ds_id, ds_info): return data def _decode_dict_type_attrs(self, data): - for key in ["orbital_parameters", "time_parameters"]: - try: - data.attrs[key] = _str2dict(data.attrs[key]) - except KeyError: - continue + for key, val in data.attrs.items(): + data.attrs[key] = _str2dict(val) def get_area_def(self, dataset_id): """Get area definition from CF complient netcdf.""" @@ -346,6 +343,6 @@ def _datetime_parser(json_dict): def _str2dict(val): """Convert string to dictionary.""" - if isinstance(val, str): + if isinstance(val, str) and val.startswith("{"): val = json.loads(val, object_hook=_datetime_parser) return val From ff4cb2ee737856ae49b08b8698dedc03bcaca412 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 18 Dec 2023 18:20:27 +0800 Subject: [PATCH 068/481] Update test_composites.py --- satpy/tests/test_composites.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index e50389a326..8a69ee69a3 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1594,12 +1594,11 @@ def test_call(self, foreground_bands, background_bands, mask, mask_no_bands, mas mask_no_bands_dataset = xr.DataArray(da.from_array(self.mask_no_bands_data), dims=("y", "x"), attrs=attrs) - if mask and not mask_no_bands: - res = comp([foreground, background], optional_datasets=[mask_dataset]) - elif mask and mask_no_bands: - res = comp([foreground, background], optional_datasets=[mask_no_bands_dataset]) - else: - res = comp([foreground, background]) + optional_datasets = [mask_dataset] if mask and not mask_no_bands else [ + mask_no_bands_dataset] if mask and mask_no_bands else [] + + res = comp([foreground, background], optional_datasets=optional_datasets) + print(res.data.compute()) assert res.attrs["area"] == "foo" From f01cbe117dd948d9da07458fb92f649d06c90443 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 18 Dec 2023 10:34:47 +0000 Subject: [PATCH 069/481] Refactor test scene setup (vis006) --- satpy/tests/reader_tests/test_satpy_cf_nc.py | 122 +++++++++++-------- 1 file changed, 69 insertions(+), 53 deletions(-) diff --git a/satpy/tests/reader_tests/test_satpy_cf_nc.py b/satpy/tests/reader_tests/test_satpy_cf_nc.py index 6528a80723..20ab15ad0b 100644 --- a/satpy/tests/reader_tests/test_satpy_cf_nc.py +++ b/satpy/tests/reader_tests/test_satpy_cf_nc.py @@ -88,10 +88,76 @@ def _create_test_netcdf(filename, resolution=742): @pytest.fixture(scope="session") -def cf_scene(): +def area(): + """Get fake area definition.""" + area_extent = (339045.5577, 4365586.6063, 1068143.527, 4803645.4685) + proj_dict = {"a": 6378169.0, "b": 6356583.8, "h": 35785831.0, + "lon_0": 0.0, "proj": "geos", "units": "m"} + area = AreaDefinition("test", + "test", + "test", + proj_dict, + 2, + 2, + area_extent) + return area + + +@pytest.fixture(scope="session") +def common_attrs(area): + """Get common dataset attributes.""" + return { + "start_time": datetime(2019, 4, 1, 12, 0), + "end_time": datetime(2019, 4, 1, 12, 15), + "platform_name": "tirosn", + "orbit_number": 99999, + "area": area + } + + +@pytest.fixture(scope="session") +def vis006(area, common_attrs): + """Get fake VIS006 dataset.""" + x, y = area.get_proj_coords() + y_visir = y[:, 0] + x_visir = x[0, :] + attrs = { + "name": "image0", + "id_tag": "ch_r06", + "coordinates": "lat lon", + "resolution": 1000, + "calibration": "reflectance", + "wavelength": WavelengthRange(min=0.58, central=0.63, max=0.68, unit="µm"), + "orbital_parameters": { + "projection_longitude": 1, + "projection_latitude": 1, + "projection_altitude": 1, + "satellite_nominal_longitude": 1, + "satellite_nominal_latitude": 1, + "satellite_actual_longitude": 1, + "satellite_actual_latitude": 1, + "satellite_actual_altitude": 1, + "nadir_longitude": 1, + "nadir_latitude": 1, + "only_in_1": False + }, + "time_parameters": { + "nominal_start_time": common_attrs["start_time"], + "nominal_end_time": common_attrs["end_time"] + } + } + attrs.update(common_attrs) + coords = {"y": y_visir, "x": x_visir, "acq_time": ("y", [1, 2])} + vis006 = xr.DataArray(np.array([[1, 2], [3, 4]]), + dims=("y", "x"), + coords=coords, + attrs=attrs) + return vis006 + + +@pytest.fixture(scope="session") +def cf_scene(vis006, common_attrs, area): """Create a cf scene.""" - tstart = datetime(2019, 4, 1, 12, 0) - tend = datetime(2019, 4, 1, 12, 15) data_visir = np.array([[1, 2], [3, 4]]) z_visir = [1, 2, 3, 4, 5, 6, 7] qual_data = [[1, 2, 3, 4, 5, 6, 7], @@ -100,60 +166,10 @@ def cf_scene(): lat = 33.0 * np.array([[1, 2], [3, 4]]) lon = -13.0 * np.array([[1, 2], [3, 4]]) - proj_dict = { - "a": 6378169.0, "b": 6356583.8, "h": 35785831.0, - "lon_0": 0.0, "proj": "geos", "units": "m" - } - x_size, y_size = data_visir.shape - area_extent = (339045.5577, 4365586.6063, 1068143.527, 4803645.4685) - area = AreaDefinition( - "test", - "test", - "test", - proj_dict, - x_size, - y_size, - area_extent, - ) - x, y = area.get_proj_coords() y_visir = y[:, 0] x_visir = x[0, :] - common_attrs = { - "start_time": tstart, - "end_time": tend, - "platform_name": "tirosn", - "orbit_number": 99999, - "area": area - } - - vis006 = xr.DataArray(data_visir, - dims=("y", "x"), - coords={"y": y_visir, "x": x_visir, "acq_time": ("y", time_vis006)}, - attrs={ - "name": "image0", "id_tag": "ch_r06", - "coordinates": "lat lon", "resolution": 1000, "calibration": "reflectance", - "wavelength": WavelengthRange(min=0.58, central=0.63, max=0.68, unit="µm"), - "orbital_parameters": { - "projection_longitude": 1, - "projection_latitude": 1, - "projection_altitude": 1, - "satellite_nominal_longitude": 1, - "satellite_nominal_latitude": 1, - "satellite_actual_longitude": 1, - "satellite_actual_latitude": 1, - "satellite_actual_altitude": 1, - "nadir_longitude": 1, - "nadir_latitude": 1, - "only_in_1": False - }, - "time_parameters": { - "nominal_start_time": tstart, - "nominal_end_time": tend - } - }) - ir_108 = xr.DataArray(data_visir, dims=("y", "x"), coords={"y": y_visir, "x": x_visir, "acq_time": ("y", time_vis006)}, From 6e0fdf57b21f94c74639a936bffc4065e73f3802 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 18 Dec 2023 10:44:57 +0000 Subject: [PATCH 070/481] Refactor test scene setup (ir_108) --- satpy/tests/reader_tests/test_satpy_cf_nc.py | 67 +++++++++++++------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/satpy/tests/reader_tests/test_satpy_cf_nc.py b/satpy/tests/reader_tests/test_satpy_cf_nc.py index 20ab15ad0b..674f895b22 100644 --- a/satpy/tests/reader_tests/test_satpy_cf_nc.py +++ b/satpy/tests/reader_tests/test_satpy_cf_nc.py @@ -89,7 +89,7 @@ def _create_test_netcdf(filename, resolution=742): @pytest.fixture(scope="session") def area(): - """Get fake area definition.""" + """Get area definition.""" area_extent = (339045.5577, 4365586.6063, 1068143.527, 4803645.4685) proj_dict = {"a": 6378169.0, "b": 6356583.8, "h": 35785831.0, "lon_0": 0.0, "proj": "geos", "units": "m"} @@ -116,11 +116,18 @@ def common_attrs(area): @pytest.fixture(scope="session") -def vis006(area, common_attrs): - """Get fake VIS006 dataset.""" +def xy_coords(area): + """Get projection coordinates.""" x, y = area.get_proj_coords() - y_visir = y[:, 0] - x_visir = x[0, :] + y = y[:, 0] + x = x[0, :] + return x, y + + +@pytest.fixture(scope="session") +def vis006(xy_coords, common_attrs): + """Get VIS006 dataset.""" + x, y = xy_coords attrs = { "name": "image0", "id_tag": "ch_r06", @@ -147,7 +154,7 @@ def vis006(area, common_attrs): } } attrs.update(common_attrs) - coords = {"y": y_visir, "x": x_visir, "acq_time": ("y", [1, 2])} + coords = {"y": y, "x": x, "acq_time": ("y", [1, 2])} vis006 = xr.DataArray(np.array([[1, 2], [3, 4]]), dims=("y", "x"), coords=coords, @@ -156,13 +163,38 @@ def vis006(area, common_attrs): @pytest.fixture(scope="session") -def cf_scene(vis006, common_attrs, area): - """Create a cf scene.""" - data_visir = np.array([[1, 2], [3, 4]]) - z_visir = [1, 2, 3, 4, 5, 6, 7] +def ir_108(xy_coords): + """Get IR_108 dataset.""" + x, y = xy_coords + coords = {"y": y, "x": x, "acq_time": ("y", [1, 2])} + attrs = {"name": "image1", "id_tag": "ch_tb11", "coordinates": "lat lon"} + ir_108 = xr.DataArray(np.array([[1, 2], [3, 4]]), + dims=("y", "x"), + coords=coords, + attrs=attrs) + return ir_108 + + +@pytest.fixture(scope="session") +def qual_flags(xy_coords): + """Get quality flags.""" qual_data = [[1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7]] - time_vis006 = [1, 2] + x, y = xy_coords + z = [1, 2, 3, 4, 5, 6, 7] + coords = {"y": y, "z": z, "acq_time": ("y", [1, 2])} + qual_f = xr.DataArray(qual_data, + dims=("y", "z"), + coords=coords, + attrs={"name": "qual_flags", + "id_tag": "qual_flags"}) + return qual_f + + +@pytest.fixture(scope="session") +def cf_scene(vis006, ir_108, qual_flags, common_attrs, area): + """Create a cf scene.""" + data_visir = np.array([[1, 2], [3, 4]]) lat = 33.0 * np.array([[1, 2], [3, 4]]) lon = -13.0 * np.array([[1, 2], [3, 4]]) @@ -170,17 +202,6 @@ def cf_scene(vis006, common_attrs, area): y_visir = y[:, 0] x_visir = x[0, :] - ir_108 = xr.DataArray(data_visir, - dims=("y", "x"), - coords={"y": y_visir, "x": x_visir, "acq_time": ("y", time_vis006)}, - attrs={"name": "image1", "id_tag": "ch_tb11", "coordinates": "lat lon"}) - qual_f = xr.DataArray(qual_data, - dims=("y", "z"), - coords={"y": y_visir, "z": z_visir, "acq_time": ("y", time_vis006)}, - attrs={ - "name": "qual_flags", - "id_tag": "qual_flags" - }) lat = xr.DataArray(lat, dims=("y", "x"), coords={"y": y_visir, "x": x_visir}, @@ -223,7 +244,7 @@ def cf_scene(vis006, common_attrs, area): "1": prefix_data, "lat": lat, "lon": lon, - "qual_flags": qual_f + "qual_flags": qual_flags } for key in scene_dict: From a9354759421460df803b1bcfeca5cf4eb955b79b Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 18 Dec 2023 18:45:29 +0800 Subject: [PATCH 071/481] Update test_composites.py --- satpy/tests/test_composites.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 8a69ee69a3..a3c8145762 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1510,10 +1510,18 @@ def setup_class(cls): ("foreground_bands", "background_bands", "mask", "mask_no_bands", "mask_bands", "mask_value", "exp_bands", "exp_result"), [ - ("L", "L", True, False, "L", None, "LA", np.array([[[1.0, 0.5], [0.0, 0.0]],[[1.0, 1.0], [1.0, 0.0]]])), - ("L", "L", True, False, "RGB", None, "LA", np.array([[[1.0, 0.5], [0.0, 0.0]], [[1.0, 1.0], [1.0, 0.0]]])), - ("L", "LA", False, False, "L", None, "LA", np.array([[[1.0, 0.5], [0.0, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), - ("LA", "LA", False, False, "RGB", None, "LA", np.array([[[1.0, 0.75], [0.5, 1.0]], [[1.0, 1.0], [1.0, 1.0]]])), + ("L", "L", True, False, "L", None, "LA", np.array([ + [[1.0, 0.5], [0.0, 0.0]], + [[1.0, 1.0], [1.0, 0.0]]])), + ("L", "L", True, False, "RGB", None, "LA", np.array([ + [[1.0, 0.5], [0.0, 0.0]], + [[1.0, 1.0], [1.0, 0.0]]])), + ("L", "LA", False, False, "L", None, "LA", np.array([ + [[1.0, 0.5], [0.0, 1.0]], + [[1.0, 1.0], [1.0, 1.0]]])), + ("LA", "LA", False, False, "RGB", None, "LA", np.array([ + [[1.0, 0.75], [0.5, 1.0]], + [[1.0, 1.0], [1.0, 1.0]]])), ("LA", "RGB", True, False, "L", None, "RGBA", np.array([ [[1.0, 0.75], [0.5, 0.0]], [[1.0, 0.75], [0.5, 0.0]], From e06657f28dbab8b315cb71e3c37c6c3716a1f6ce Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 18 Dec 2023 18:45:41 +0800 Subject: [PATCH 072/481] Update test_composites.py --- satpy/tests/test_composites.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index a3c8145762..4fce43fe05 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1607,8 +1607,6 @@ def test_call(self, foreground_bands, background_bands, mask, mask_no_bands, mas res = comp([foreground, background], optional_datasets=optional_datasets) - print(res.data.compute()) - assert res.attrs["area"] == "foo" np.testing.assert_allclose(res, exp_result) assert res.attrs["mode"] == exp_bands From 168ced2040cb088d95929598ee8e1d80b2db215d Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 18 Dec 2023 10:59:58 +0000 Subject: [PATCH 073/481] Refactor test scene setup (rest) --- satpy/tests/reader_tests/test_satpy_cf_nc.py | 99 ++++++++++---------- 1 file changed, 52 insertions(+), 47 deletions(-) diff --git a/satpy/tests/reader_tests/test_satpy_cf_nc.py b/satpy/tests/reader_tests/test_satpy_cf_nc.py index 674f895b22..0710aae57c 100644 --- a/satpy/tests/reader_tests/test_satpy_cf_nc.py +++ b/satpy/tests/reader_tests/test_satpy_cf_nc.py @@ -153,7 +153,6 @@ def vis006(xy_coords, common_attrs): "nominal_end_time": common_attrs["end_time"] } } - attrs.update(common_attrs) coords = {"y": y, "x": x, "acq_time": ("y", [1, 2])} vis006 = xr.DataArray(np.array([[1, 2], [3, 4]]), dims=("y", "x"), @@ -192,63 +191,69 @@ def qual_flags(xy_coords): @pytest.fixture(scope="session") -def cf_scene(vis006, ir_108, qual_flags, common_attrs, area): - """Create a cf scene.""" - data_visir = np.array([[1, 2], [3, 4]]) +def lonlats(xy_coords): + """Get longitudes and latitudes.""" + x, y = xy_coords lat = 33.0 * np.array([[1, 2], [3, 4]]) lon = -13.0 * np.array([[1, 2], [3, 4]]) + attrs = {"name": "lat", + "standard_name": "latitude", + "modifiers": np.array([])} + dims = ("y", "x") + coords = {"y": y, "x": x} + lat = xr.DataArray(lat, dims=dims, coords=coords, attrs=attrs) + lon = xr.DataArray(lon, dims=dims, coords=coords, attrs=attrs) + return lon, lat - x, y = area.get_proj_coords() - y_visir = y[:, 0] - x_visir = x[0, :] - lat = xr.DataArray(lat, - dims=("y", "x"), - coords={"y": y_visir, "x": x_visir}, - attrs={ - "name": "lat", - "standard_name": "latitude", - "modifiers": np.array([]) - }) - lon = xr.DataArray(lon, - dims=("y", "x"), - coords={"y": y_visir, "x": x_visir}, - attrs={ - "name": "lon", - "standard_name": "longitude", - "modifiers": np.array([]) - }) - - # for prefix testing - prefix_data = xr.DataArray(data_visir, +@pytest.fixture(scope="session") +def prefix_data(xy_coords, area): + """Get dataset whose name should be prefixed.""" + x, y = xy_coords + attrs = {"name": "1", + "id_tag": "ch_r06", + "coordinates": "lat lon", + "resolution": 1000, + "calibration": "reflectance", + "wavelength": WavelengthRange(min=0.58, central=0.63, max=0.68, unit="µm"), + "area": area} + prefix_data = xr.DataArray(np.array([[1, 2], [3, 4]]), dims=("y", "x"), - coords={"y": y_visir, "x": x_visir}, - attrs={ - "name": "1", "id_tag": "ch_r06", - "coordinates": "lat lon", "resolution": 1000, "calibration": "reflectance", - "wavelength": WavelengthRange(min=0.58, central=0.63, max=0.68, unit="µm"), - "area": area - }) - - # for swath testing + coords={"y": y, "x": x}, + attrs=attrs) + return prefix_data + + +@pytest.fixture(scope="session") +def swath_data(prefix_data, lonlats): + """Get swath data.""" + lon, lat = lonlats area = SwathDefinition(lons=lon, lats=lat) swath_data = prefix_data.copy() swath_data.attrs.update({"name": "swath_data", "area": area}) + return swath_data + +@pytest.fixture(scope="session") +def datasets(vis006, ir_108, qual_flags, lonlats, prefix_data, swath_data): + """Get datasets belonging to the scene.""" + lon, lat = lonlats + return {"image0": vis006, + "image1": ir_108, + "swath_data": swath_data, + "1": prefix_data, + "lat": lat, + "lon": lon, + "qual_flags": qual_flags} + + +@pytest.fixture(scope="session") +def cf_scene(datasets, common_attrs): + """Create a cf scene.""" scene = Scene() scene.attrs["sensor"] = ["avhrr-1", "avhrr-2", "avhrr-3"] - scene_dict = { - "image0": vis006, - "image1": ir_108, - "swath_data": swath_data, - "1": prefix_data, - "lat": lat, - "lon": lon, - "qual_flags": qual_flags - } - - for key in scene_dict: - scene[key] = scene_dict[key] + for key in datasets: + scene[key] = datasets[key] if key != "swath_data": scene[key].attrs.update(common_attrs) return scene From bf989febc6dd2aa17e76aa0cd40376a6b6b7b6ed Mon Sep 17 00:00:00 2001 From: BengtRydberg Date: Mon, 18 Dec 2023 17:42:11 +0100 Subject: [PATCH 074/481] correcting pixel position from tiepoints reconsttruction --- satpy/readers/ici_l1b_nc.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/satpy/readers/ici_l1b_nc.py b/satpy/readers/ici_l1b_nc.py index b063c51c4f..7adef62e4b 100644 --- a/satpy/readers/ici_l1b_nc.py +++ b/satpy/readers/ici_l1b_nc.py @@ -197,7 +197,10 @@ def _interpolate_geo( n_subs = longitude.n_subs lons = da.zeros((n_scan.size, n_samples, horns.size)) lats = da.zeros((n_scan.size, n_samples, horns.size)) - n_subs = np.linspace(0, n_samples - 1, n_subs.size).astype(int) + n_subs = np.append( + np.arange(0, n_samples, np.ceil(n_samples / n_subs.size)), + n_samples - 1 + ).astype(int) for horn in horns.values: satint = GeoInterpolator( (longitude.values[:, :, horn], latitude.values[:, :, horn]), From 2aef549ef105952a8087c7ae0cb1d940629b1f00 Mon Sep 17 00:00:00 2001 From: BengtRydberg Date: Mon, 18 Dec 2023 18:37:05 +0100 Subject: [PATCH 075/481] adding test --- satpy/tests/reader_tests/test_ici_l1b_nc.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/satpy/tests/reader_tests/test_ici_l1b_nc.py b/satpy/tests/reader_tests/test_ici_l1b_nc.py index 498ca88705..a5909b249d 100644 --- a/satpy/tests/reader_tests/test_ici_l1b_nc.py +++ b/satpy/tests/reader_tests/test_ici_l1b_nc.py @@ -445,8 +445,14 @@ def test_interpolate_geo(self, reader): """Test interpolate geographic coordinates.""" shape = (N_SCAN, N_SUBS, N_HORNS) dims = ("n_scan", "n_subs", "n_horns") + sub_pos = np.append( + np.arange(0, N_SAMPLES, np.ceil(N_SAMPLES / N_SUBS)), + N_SAMPLES - 1 + ) longitude = xr.DataArray( - 2. * np.ones(shape), + np.tile( # longitudes between 0 and 10 + 10 * sub_pos / sub_pos[-1], (N_SCAN, N_HORNS, 1) + ).swapaxes(1, 2), dims=dims, coords={ "n_horns": np.arange(N_HORNS), @@ -462,7 +468,9 @@ def test_interpolate_geo(self, reader): expect_shape = (N_SCAN, N_SAMPLES, N_HORNS) assert lon.shape == expect_shape assert lat.shape == expect_shape - np.testing.assert_allclose(lon, 2.0) + np.testing.assert_allclose(lon[:, 0, :], 0.) + np.testing.assert_allclose(lon[:, -1, :], 10.) + np.testing.assert_allclose(np.diff(lon[0, :, 0]), 10 / (N_SAMPLES - 1)) np.testing.assert_allclose(lat, 1.0) def test_interpolate_viewing_angle(self, reader): From 393451ff04b3907660ab3143e88124ed587165b3 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 19 Dec 2023 18:57:50 +0800 Subject: [PATCH 076/481] update structure --- satpy/composites/__init__.py | 90 ++++++++++----------- satpy/tests/test_composites.py | 141 ++++++++++++++++----------------- 2 files changed, 109 insertions(+), 122 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 2bb8163129..8ea76825d7 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1720,9 +1720,12 @@ def __call__(self, projectables, optional_datasets=None, *args, **kwargs): """Call the compositor.""" optional_datasets = [] if optional_datasets is None else optional_datasets projectables = self.match_data_arrays(projectables + optional_datasets) + # Get enhanced datasets foreground = enhance2dataset(projectables[0], convert_p=True) background = enhance2dataset(projectables[1], convert_p=True) + before_bg_mode = background.attrs["mode"] + mask_dataset = projectables[2] if not optional_datasets == [] else None # Adjust bands so that they match @@ -1731,15 +1734,17 @@ def __call__(self, projectables, optional_datasets=None, *args, **kwargs): # RGB/RGBA -> RGBA/RGBA foreground = add_bands(foreground, background["bands"]) background = add_bands(background, foreground["bands"]) + after_bg_mode = background.attrs["mode"] + + # It's important to judge whether the alpha band of background is initially generated, e.g. by CloudCompositor + # Or it's just added through 'add_bands' + # The result will be used to decide the output image mode + initial_bg_alpha = True if "A" in before_bg_mode and "A" in after_bg_mode else False mask = self._get_mask(mask_dataset, self.mask_value) - alpha_fore = self._get_alpha(foreground) - alpha_back = self._get_alpha(background) - output_mode = self._get_output_mode(foreground, background, mask) attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) - data = self._get_merged_image_data(foreground, background, mask=mask, - alpha_fore=alpha_fore, alpha_back=alpha_back, output_mode=output_mode) + data = self._get_merged_image_data(foreground, background, mask=mask, initial_bg_alpha=initial_bg_alpha) res = super(BackgroundCompositor, self).__call__(data, **kwargs) res.attrs.update(attrs) return res @@ -1763,7 +1768,7 @@ def _get_mask(dataset: xr.DataArray, mask_value): if dataset is None: mask = None else: - # If mask dataset is a composite, then extract its first band + # If mask dataset is a composite, extract its first band try: dataset = dataset.isel(bands=0) except ValueError: @@ -1776,53 +1781,30 @@ def _get_mask(dataset: xr.DataArray, mask_value): return mask - @staticmethod - def _get_alpha(dataset: xr.DataArray): - # If the dataset contains an alpha channel, just use it - # If not, we still need one. So build it and fill it with 1 - if "A" in dataset.attrs["mode"]: - alpha = dataset.sel(bands="A") - else: - first_band = dataset.isel(bands=0) - alpha = xr.full_like(first_band, 1) - alpha["bands"] = "A" - - # There could be Nans in the alpha, especially for original ones - # Replace them with 0, so they won't affect new_alpha - alpha = xr.where(alpha.isnull(), 0, alpha) - - return alpha - - @staticmethod - def _get_output_mode(foreground: xr.DataArray, - background: xr.DataArray, - mask: xr.DataArray): - # Get the output bands of the stacked image - # Actually, it's about deciding whether to pass the new alpha band of the stacked image to the writer - # Or just leave the write for decision - - # If both images have alpha band or just background has one, the new alpha band will be passed to the writer - # If area-masking is needed, the same - # If neither of the images has alpha band but area-masking is still needed, the same - if "A" in background.attrs["mode"]: - output_mode = background.mode - else: - output_mode = ( - background.mode if "A" in foreground.attrs["mode"] and mask is None else - foreground.mode if mask is None else foreground.mode + "A" - ) - - return output_mode - @staticmethod def _get_merged_image_data(foreground: xr.DataArray, background: xr.DataArray, mask: xr.DataArray, - alpha_fore: xr.DataArray, - alpha_back: xr.DataArray, - output_mode: str, + initial_bg_alpha: bool, ) -> list[xr.DataArray]: + def _get_alpha(dataset: xr.DataArray): + # If the dataset contains an alpha channel, just use it + # If not, we still need one. So build it and fill it with 1 + if "A" in dataset.attrs["mode"]: + alpha = dataset.sel(bands="A") + else: + first_band = dataset.isel(bands=0) + alpha = xr.full_like(first_band, 1) + alpha["bands"] = "A" + # There could be Nans in the alpha, especially through 'add_bands' + # Replace them with 0 to prevent cases like 1 + nan = nan, so they won't affect new_alpha + alpha = xr.where(alpha.isnull(), 0, alpha) + + return alpha + + alpha_fore = _get_alpha(foreground) + alpha_back = _get_alpha(background) new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) # Do the masking job @@ -1833,14 +1815,24 @@ def _get_merged_image_data(foreground: xr.DataArray, data = [] + # Unless background has an initial alpha band, there will be no alpha band in the output image + # Let the writer decide + output_mode = background.mode if initial_bg_alpha else background.mode.replace("A", "") + + # If we let the writer decide alpha band, we must fill the transparent areas in the image with np.nan first + # The best way is through the new alpha + new_alpha_nan = xr.where(alpha_fore + alpha_back == 0, np.nan, new_alpha) if "A" not in output_mode \ + else new_alpha + for band in output_mode: fg_band = foreground.sel(bands=band) if band != "A" else new_alpha bg_band = background.sel(bands=band) if band != "A" else new_alpha chan = (fg_band * alpha_fore + - bg_band * alpha_back * (1 - alpha_fore)) / new_alpha if band != "A" else new_alpha + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha_nan if band != "A" else new_alpha - chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) + if mask is None: + chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) data.append(chan) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 4fce43fe05..6006957d3e 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1488,10 +1488,10 @@ def setup_class(cls): [[1., 0.5], [0., np.nan]], [[1., 0.5], [0., np.nan]]]), "RGBA": np.array([ - [[1.0, 0.5], [0.0, np.nan]], - [[1.0, 0.5], [0.0, np.nan]], - [[1.0, 0.5], [0.0, np.nan]], - [[0.5, 0.5], [0.5, 0.5]]]), + [[1.0, 0.5], [0., np.nan]], + [[1.0, 0.5], [0., np.nan]], + [[1.0, 0.5], [0., np.nan]], + [[0.5, 0.5], [0., 0.5]]]), } mask_data = { "L": np.array([[[1., 0.5], [0., np.nan]]]), @@ -1507,82 +1507,53 @@ def setup_class(cls): @mock.patch("satpy.composites.enhance2dataset", _enhance2dataset) @pytest.mark.parametrize( - ("foreground_bands", "background_bands", "mask", "mask_no_bands", - "mask_bands", "mask_value", "exp_bands", "exp_result"), + ("foreground_bands", "background_bands", "mask", "mask_value", "exp_bands", "exp_result"), [ - ("L", "L", True, False, "L", None, "LA", np.array([ - [[1.0, 0.5], [0.0, 0.0]], - [[1.0, 1.0], [1.0, 0.0]]])), - ("L", "L", True, False, "RGB", None, "LA", np.array([ - [[1.0, 0.5], [0.0, 0.0]], - [[1.0, 1.0], [1.0, 0.0]]])), - ("L", "LA", False, False, "L", None, "LA", np.array([ - [[1.0, 0.5], [0.0, 1.0]], - [[1.0, 1.0], [1.0, 1.0]]])), - ("LA", "LA", False, False, "RGB", None, "LA", np.array([ - [[1.0, 0.75], [0.5, 1.0]], - [[1.0, 1.0], [1.0, 1.0]]])), - ("LA", "RGB", True, False, "L", None, "RGBA", np.array([ - [[1.0, 0.75], [0.5, 0.0]], - [[1.0, 0.75], [0.5, 0.0]], - [[1.0, 0.75], [0.5, 0.0]], - [[1.0, 1.0], [1.0, 0.0]]])), - ("RGB", "RGB", True, True, "L", 1, "RGBA", np.array([ - [[0.0, 0.5], [0.0, 1.0]], - [[0.0, 0.5], [0.0, 1.0]], - [[0.0, 0.5], [0.0, 1.0]], - [[0.0, 1.0], [1.0, 1.0]]])), - ("RGB", "RGB", True, False, "RGB", 0.5, "RGBA", np.array([ - [[1.0, 0.0], [0.0, 1.0]], - [[1.0, 0.0], [0.0, 1.0]], - [[1.0, 0.0], [0.0, 1.0]], + ("L", "L", "L", None, "L", np.array([ + [1.0, 0.5], [0., np.nan]])), + ("L", "LA", "RGB", 0.5, "LA", np.array([ + [[1.0, np.nan], [0.0, np.nan]], [[1.0, 0.0], [1.0, 1.0]]])), - ("RGB", "RGBA", False, False, "L", 1, "RGBA", np.array([ - [[1.0, 0.5], [0.0, 1.0]], + ("LA", "LA", "L", None, "LA", np.array([ + [[1.0, 0.75], [0.5, np.nan]], + [[1.0, 1.0], [1.0, 0.0]]])), + ("LA", "RGB", "L", 1, "RGB", np.array([ + [[np.nan, 0.75], [0.5, np.nan]], + [[np.nan, 0.75], [0.5, np.nan]], + [[np.nan, 0.75], [0.5, np.nan]]])), + ("RGB", "RGB", "None", None, "RGB", np.array([ [[1.0, 0.5], [0.0, 1.0]], [[1.0, 0.5], [0.0, 1.0]], - [[1.0, 1.0], [1.0, 1.0]]])), - ("RGBA", "RGB", True, False, "L", None, "RGBA", np.array([ - [[1.0, 0.75], [0.5, 0.0]], - [[1.0, 0.75], [0.5, 0.0]], - [[1.0, 0.75], [0.5, 0.0]], - [[1.0, 1.0], [1.0, 0.0]]])), - ("RGBA", "RGB", True, False, "RGB", 0, "RGBA", np.array([ - [[1.0, 0.75], [0.0, 1.0]], - [[1.0, 0.75], [0.0, 1.0]], - [[1.0, 0.75], [0.0, 1.0]], - [[1.0, 1.0], [0.0, 1.0]]])), - ("RGBA", "RGB", False, False, "RGB", 0, "RGBA", np.array([ - [[1.0, 0.75], [0.5, 1.0]], - [[1.0, 0.75], [0.5, 1.0]], - [[1.0, 0.75], [0.5, 1.0]], - [[1.0, 1.0], [1.0, 1.0]]])), - ("RGBA", "RGBA", True, True, "L", 0.5, "RGBA", np.array([ - [[1.0, 0.0], [0.5, 1.0]], - [[1.0, 0.0], [0.5, 1.0]], - [[1.0, 0.0], [0.5, 1.0]], + [[1.0, 0.5], [0.0, 1.0]]])), + ("RGB", "RGBA", "L", 1, "RGBA", np.array([ + [[np.nan, 0.5], [0.0, np.nan]], + [[np.nan, 0.5], [0.0, np.nan]], + [[np.nan, 0.5], [0.0, np.nan]], + [[0.0, 1.0], [1.0, 1.0]]])), + ("RGBA", "RGB", "L", None, "RGB", np.array([ + [[1.0, 0.75], [1.0, np.nan]], + [[1.0, 0.75], [1.0, np.nan]], + [[1.0, 0.75], [1.0, np.nan]]])), + ("RGBA", "RGB", "None", None, "RGB", np.array([ + [[1.0, 0.75], [1.0, 1.0]], + [[1.0, 0.75], [1.0, 1.0]], + [[1.0, 0.75], [1.0, 1.0]]])), + ("RGBA", "RGBA", "RGB", 0.5, "RGBA", np.array([ + [[1.0, np.nan], [1.0, np.nan]], + [[1.0, np.nan], [1.0, np.nan]], + [[1.0, np.nan], [1.0, np.nan]], [[1.0, 0.0], [1.0, 1.0]]])), - ("RGBA", "RGBA", False, False, "RGB", 0, "RGBA", np.array([ - [[1.0, 0.75], [0.5, 1.0]], - [[1.0, 0.75], [0.5, 1.0]], - [[1.0, 0.75], [0.5, 1.0]], - [[1.0, 1.0], [1.0, 1.0]]])), - ("RGBA", "RGBA", True, True, "L", None, "RGBA", np.array([ - [[1.0, 0.75], [0.5, 0.0]], - [[1.0, 0.75], [0.5, 0.0]], - [[1.0, 0.75], [0.5, 0.0]], - [[1.0, 1.0], [1.0, 0.0]]])), ] ) - def test_call(self, foreground_bands, background_bands, mask, mask_no_bands, mask_bands, mask_value, - exp_bands, exp_result): + def test_call(self, foreground_bands, background_bands, mask, mask_value, exp_bands, exp_result): """Test the background compositing.""" from satpy.composites import BackgroundCompositor comp = BackgroundCompositor("name", mask_value=mask_value) # L mode images foreground_data = self.foreground_data[foreground_bands] - mask_data = self.mask_data[mask_bands] if not mask_no_bands else self.mask_data["L"] + mask_bands = mask if mask != "None" else "L" + mask_data = self.mask_data[mask_bands] attrs = {"mode": foreground_bands, "area": "foo"} foreground = xr.DataArray(da.from_array(foreground_data), @@ -1598,12 +1569,8 @@ def test_call(self, foreground_bands, background_bands, mask, mask_no_bands, mas dims=("bands", "y", "x"), coords={"bands": [c for c in attrs["mode"]]}, attrs=attrs) - attrs = {"area": "foo"} - mask_no_bands_dataset = xr.DataArray(da.from_array(self.mask_no_bands_data), - dims=("y", "x"), - attrs=attrs) - optional_datasets = [mask_dataset] if mask and not mask_no_bands else [ - mask_no_bands_dataset] if mask and mask_no_bands else [] + + optional_datasets = [mask_dataset] if mask != "None" else [] res = comp([foreground, background], optional_datasets=optional_datasets) @@ -1635,6 +1602,34 @@ def test_multiple_sensors(self): assert res.attrs["mode"] == "L" assert res.attrs["sensor"] == {"abi", "glm"} + @mock.patch("satpy.composites.enhance2dataset", _enhance2dataset) + def test_mask_with_no_bands(self): + """Test the background compositing with mask that doesn't have 'bands' in its coords.""" + from satpy.composites import BackgroundCompositor + comp = BackgroundCompositor("name", mask_value=None) + + attrs = {"mode": "RGBA", "area": "foo"} + foreground = xr.DataArray(da.from_array(self.foreground_data["RGBA"]), + dims=("bands", "y", "x"), + coords={"bands": [c for c in attrs["mode"]]}, + attrs=attrs) + attrs = {"mode": "RGB", "area": "foo"} + background = xr.DataArray(da.ones((len("RGB"), 2, 2)), dims=("bands", "y", "x"), + coords={"bands": [c for c in attrs["mode"]]}, + attrs=attrs) + attrs = {"area": "foo"} + mask_no_bands_dataset = xr.DataArray(da.from_array(self.mask_no_bands_data), + dims=("y", "x"), + attrs=attrs) + + res = comp([foreground, background], optional_datasets=[mask_no_bands_dataset]) + + assert res.attrs["area"] == "foo" + assert res.attrs["mode"] == "RGB" + np.testing.assert_allclose(res, np.array([[[1.0, 0.75], [1.0, np.nan]], + [[1.0, 0.75], [1.0, np.nan]], + [[1.0, 0.75], [1.0, np.nan]]])) + class TestMaskingCompositor: """Test case for the simple masking compositor.""" From a9b876a2cb5f1bc21cb6b7eb10f7c4756e1de1ca Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Tue, 19 Dec 2023 11:41:30 +0000 Subject: [PATCH 077/481] Factorize attribute decoding --- satpy/readers/satpy_cf_nc.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/satpy/readers/satpy_cf_nc.py b/satpy/readers/satpy_cf_nc.py index 24c5ef438f..4a814dd586 100644 --- a/satpy/readers/satpy_cf_nc.py +++ b/satpy/readers/satpy_cf_nc.py @@ -311,13 +311,10 @@ def get_dataset(self, ds_id, ds_info): if name != ds_id["name"]: data = data.rename(ds_id["name"]) data.attrs.update(nc.attrs) # For now add global attributes to all datasets - self._decode_dict_type_attrs(data) + decoder = DatasetAttributeDecoder() + decoder.decode_attrs(data) return data - def _decode_dict_type_attrs(self, data): - for key, val in data.attrs.items(): - data.attrs[key] = _str2dict(val) - def get_area_def(self, dataset_id): """Get area definition from CF complient netcdf.""" try: @@ -331,6 +328,24 @@ def get_area_def(self, dataset_id): raise NotImplementedError +class DatasetAttributeDecoder: + """Decode attributes from cf-compatible to Python object.""" + + def decode_attrs(self, dataset): + """Decode dataset attributes.""" + self._decode_dict_type_attrs(dataset) + + def _decode_dict_type_attrs(self, data): + for key, val in data.attrs.items(): + data.attrs[key] = self._str2dict(val) + + def _str2dict(self, val): + """Convert string to dictionary.""" + if isinstance(val, str) and val.startswith("{"): + val = json.loads(val, object_hook=_datetime_parser) + return val + + def _datetime_parser(json_dict): import dateutil.parser for key, value in json_dict.items(): @@ -339,10 +354,3 @@ def _datetime_parser(json_dict): except (TypeError, ValueError): pass return json_dict - - -def _str2dict(val): - """Convert string to dictionary.""" - if isinstance(val, str) and val.startswith("{"): - val = json.loads(val, object_hook=_datetime_parser) - return val From edf933a0a1811b443d1dc35cb4ae4ab2317b29fe Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Tue, 19 Dec 2023 12:01:07 +0000 Subject: [PATCH 078/481] Use datetime to parse timestamps --- satpy/readers/satpy_cf_nc.py | 4 ++-- satpy/tests/reader_tests/test_satpy_cf_nc.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/readers/satpy_cf_nc.py b/satpy/readers/satpy_cf_nc.py index 4a814dd586..c8188da77f 100644 --- a/satpy/readers/satpy_cf_nc.py +++ b/satpy/readers/satpy_cf_nc.py @@ -179,6 +179,7 @@ import itertools import json import logging +from datetime import datetime import xarray as xr from pyresample import AreaDefinition @@ -347,10 +348,9 @@ def _str2dict(self, val): def _datetime_parser(json_dict): - import dateutil.parser for key, value in json_dict.items(): try: - json_dict[key] = dateutil.parser.parse(value) + json_dict[key] = datetime.fromisoformat(value) except (TypeError, ValueError): pass return json_dict diff --git a/satpy/tests/reader_tests/test_satpy_cf_nc.py b/satpy/tests/reader_tests/test_satpy_cf_nc.py index 0710aae57c..e3540a4df7 100644 --- a/satpy/tests/reader_tests/test_satpy_cf_nc.py +++ b/satpy/tests/reader_tests/test_satpy_cf_nc.py @@ -107,7 +107,7 @@ def area(): def common_attrs(area): """Get common dataset attributes.""" return { - "start_time": datetime(2019, 4, 1, 12, 0), + "start_time": datetime(2019, 4, 1, 12, 0, 0, 123456), "end_time": datetime(2019, 4, 1, 12, 15), "platform_name": "tirosn", "orbit_number": 99999, From 414f2d6ff182aa2b9cd8a9006cb3dacd96ab9059 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Tue, 19 Dec 2023 12:37:40 +0000 Subject: [PATCH 079/481] Decode all timestamps to datetime --- satpy/readers/satpy_cf_nc.py | 33 ++++++++++++++------ satpy/tests/reader_tests/test_satpy_cf_nc.py | 11 ++++++- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/satpy/readers/satpy_cf_nc.py b/satpy/readers/satpy_cf_nc.py index c8188da77f..73c26fccdd 100644 --- a/satpy/readers/satpy_cf_nc.py +++ b/satpy/readers/satpy_cf_nc.py @@ -334,23 +334,36 @@ class DatasetAttributeDecoder: def decode_attrs(self, dataset): """Decode dataset attributes.""" - self._decode_dict_type_attrs(dataset) + self._decode_dict_type_attrs(dataset.attrs) + self._decode_timestamps(dataset.attrs) - def _decode_dict_type_attrs(self, data): - for key, val in data.attrs.items(): - data.attrs[key] = self._str2dict(val) + def _decode_dict_type_attrs(self, attrs): + for key, val in attrs.items(): + attrs[key] = self._str2dict(val) def _str2dict(self, val): """Convert string to dictionary.""" if isinstance(val, str) and val.startswith("{"): - val = json.loads(val, object_hook=_datetime_parser) + val = json.loads(val, object_hook=_datetime_parser_json) return val + def _decode_timestamps(self, attrs): + for key, value in attrs.items(): + timestamp = _str2datetime(value) + if timestamp: + attrs[key] = timestamp -def _datetime_parser(json_dict): + +def _datetime_parser_json(json_dict): for key, value in json_dict.items(): - try: - json_dict[key] = datetime.fromisoformat(value) - except (TypeError, ValueError): - pass + timestamp = _str2datetime(value) + if timestamp: + json_dict[key] = timestamp return json_dict + + +def _str2datetime(string): + try: + return datetime.fromisoformat(string) + except (TypeError, ValueError): + return None diff --git a/satpy/tests/reader_tests/test_satpy_cf_nc.py b/satpy/tests/reader_tests/test_satpy_cf_nc.py index e3540a4df7..d2c50ee908 100644 --- a/satpy/tests/reader_tests/test_satpy_cf_nc.py +++ b/satpy/tests/reader_tests/test_satpy_cf_nc.py @@ -111,7 +111,8 @@ def common_attrs(area): "end_time": datetime(2019, 4, 1, 12, 15), "platform_name": "tirosn", "orbit_number": 99999, - "area": area + "area": area, + "my_timestamp": datetime(2000, 1, 1) } @@ -446,6 +447,14 @@ def test_decoding_of_dict_type_attributes(self, cf_scene, nc_filename): new_attrs = scn_["image0"].attrs[attr_name] assert new_attrs == orig_attrs + def test_decoding_of_timestamps(self, cf_scene, nc_filename): + """Test decoding of timestamps.""" + cf_scene.save_datasets(writer="cf", filename=nc_filename) + scn = Scene(reader="satpy_cf_nc", filenames=[nc_filename]) + scn.load(["image0"]) + expected = cf_scene["image0"].attrs["my_timestamp"] + assert scn["image0"].attrs["my_timestamp"] == expected + def test_write_and_read_from_two_files(self, nc_filename, nc_filename_i): """Save two datasets with different resolution and read the solar_zenith_angle again.""" _create_test_netcdf(nc_filename, resolution=742) From 453c485041c08e4ca2dc514ecc4a48ad683435e4 Mon Sep 17 00:00:00 2001 From: yukaribbba <72339781+yukaribbba@users.noreply.github.com> Date: Wed, 20 Dec 2023 09:15:31 +0800 Subject: [PATCH 080/481] Update satpy/composites/__init__.py Co-authored-by: David Hoese --- satpy/composites/__init__.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 8ea76825d7..c172f80b23 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1704,12 +1704,10 @@ def __init__(self, name, mask_value=None, **kwargs): # noqa: D417 """Collect custom configuration values. Args: - mask_value (float / None): All the pixels on the stacked image where the values - of the third dataset that are equal to this will be - masked out. - If not set by the user, it will be ``np.nan``. - This argument could be helpful when you try to use a - local image(StaticImageCompositor) for masking. + mask_value (float | None): Value of the third dataset used to generate + the mask for the stacked image. Defaults to ``np.nan``. This is + useful when wanting additional masking for a static image + (e.g. :class:`StaticImageCompositor`). """ self.mask_value = mask_value if mask_value is not None else np.nan From 1187e1f65159a6df7834f9be8ef85adb197fb336 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 20 Dec 2023 09:16:25 +0800 Subject: [PATCH 081/481] 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 c172f80b23..6f2ddd2574 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1724,7 +1724,7 @@ def __call__(self, projectables, optional_datasets=None, *args, **kwargs): background = enhance2dataset(projectables[1], convert_p=True) before_bg_mode = background.attrs["mode"] - mask_dataset = projectables[2] if not optional_datasets == [] else None + mask_dataset = projectables[2] if len(projecables) >= 3 else None # Adjust bands so that they match # L/RGB -> RGB/RGB From 707334f531f63517d4fac34560a33a0bb3857151 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 20 Dec 2023 09:17:38 +0800 Subject: [PATCH 082/481] 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 6f2ddd2574..e987bb4127 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1724,7 +1724,7 @@ def __call__(self, projectables, optional_datasets=None, *args, **kwargs): background = enhance2dataset(projectables[1], convert_p=True) before_bg_mode = background.attrs["mode"] - mask_dataset = projectables[2] if len(projecables) >= 3 else None + mask_dataset = projectables[2] if len(projectables) >= 3 else None # Adjust bands so that they match # L/RGB -> RGB/RGB From 621f10c76048bd1f1d0e611df9495e42e250cbc2 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 20 Dec 2023 10:11:28 +0800 Subject: [PATCH 083/481] Remove masking function --- satpy/composites/__init__.py | 76 ++------------------- satpy/tests/test_composites.py | 120 +++++++++------------------------ 2 files changed, 38 insertions(+), 158 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index e987bb4127..d9d8fec00b 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1677,55 +1677,17 @@ def __call__(self, *args, **kwargs): class BackgroundCompositor(GenericCompositor): - """A compositor that overlays one composite on top of another. + """A compositor that overlays one composite on top of another.""" - Beside foreground and background, a third optional dataset could be passed - to the compositor to use it for masking. If this dataset contains - more than one band, only the first band will be used. This is useful when you - reproject a specific local-area image (e.g. a geostationary satellite view) - to global extent, and put it on a global background (e.g. NASA's Black Marble) - while making other areas of the world transparent, only keeping the local one. - - To use this function in a YAML configuration file, add the third dataset - as ``optional_prerequisites``: - - .. code-block:: yaml - - night_cloud_alpha_2000_with_background: - compositor: !!python/name:satpy.composites.BackgroundCompositor - prerequisites: - - name: night_cloud_alpha_2000 - - name: static_night - optional_prerequisites: - - name: IR105 - - """ - def __init__(self, name, mask_value=None, **kwargs): # noqa: D417 - """Collect custom configuration values. - - Args: - mask_value (float | None): Value of the third dataset used to generate - the mask for the stacked image. Defaults to ``np.nan``. This is - useful when wanting additional masking for a static image - (e.g. :class:`StaticImageCompositor`). - - """ - self.mask_value = mask_value if mask_value is not None else np.nan - - super(BackgroundCompositor, self).__init__(name, **kwargs) - - def __call__(self, projectables, optional_datasets=None, *args, **kwargs): + def __call__(self, projectables, *args, **kwargs): """Call the compositor.""" - optional_datasets = [] if optional_datasets is None else optional_datasets - projectables = self.match_data_arrays(projectables + optional_datasets) + projectables = self.match_data_arrays(projectables) # Get enhanced datasets foreground = enhance2dataset(projectables[0], convert_p=True) background = enhance2dataset(projectables[1], convert_p=True) before_bg_mode = background.attrs["mode"] - mask_dataset = projectables[2] if len(projectables) >= 3 else None - # Adjust bands so that they match # L/RGB -> RGB/RGB # LA/RGB -> RGBA/RGBA @@ -1739,10 +1701,8 @@ def __call__(self, projectables, optional_datasets=None, *args, **kwargs): # The result will be used to decide the output image mode initial_bg_alpha = True if "A" in before_bg_mode and "A" in after_bg_mode else False - mask = self._get_mask(mask_dataset, self.mask_value) - attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) - data = self._get_merged_image_data(foreground, background, mask=mask, initial_bg_alpha=initial_bg_alpha) + data = self._get_merged_image_data(foreground, background, initial_bg_alpha=initial_bg_alpha) res = super(BackgroundCompositor, self).__call__(data, **kwargs) res.attrs.update(attrs) return res @@ -1761,28 +1721,9 @@ def _combine_metadata_with_mode_and_sensor(self, attrs["sensor"] = self._get_sensors([foreground, background]) return attrs - @staticmethod - def _get_mask(dataset: xr.DataArray, mask_value): - if dataset is None: - mask = None - else: - # If mask dataset is a composite, extract its first band - try: - dataset = dataset.isel(bands=0) - except ValueError: - pass - - if np.isnan(mask_value): - mask = xr.where(dataset.isnull(), 0, 1) - else: - mask = xr.where(dataset == mask_value, 0, 1) - - return mask - @staticmethod def _get_merged_image_data(foreground: xr.DataArray, background: xr.DataArray, - mask: xr.DataArray, initial_bg_alpha: bool, ) -> list[xr.DataArray]: def _get_alpha(dataset: xr.DataArray): @@ -1805,12 +1746,6 @@ def _get_alpha(dataset: xr.DataArray): alpha_back = _get_alpha(background) new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) - # Do the masking job - if mask is not None: - alpha_fore.data = np.minimum(alpha_fore.data, mask.data) - alpha_back.data = np.minimum(alpha_back.data, mask.data) - new_alpha.data = np.minimum(new_alpha.data, mask.data) - data = [] # Unless background has an initial alpha band, there will be no alpha band in the output image @@ -1829,8 +1764,7 @@ def _get_alpha(dataset: xr.DataArray): chan = (fg_band * alpha_fore + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha_nan if band != "A" else new_alpha - if mask is None: - chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) + chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) data.append(chan) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 6006957d3e..f5c85dbfec 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1488,72 +1488,52 @@ def setup_class(cls): [[1., 0.5], [0., np.nan]], [[1., 0.5], [0., np.nan]]]), "RGBA": np.array([ - [[1.0, 0.5], [0., np.nan]], - [[1.0, 0.5], [0., np.nan]], - [[1.0, 0.5], [0., np.nan]], - [[0.5, 0.5], [0., 0.5]]]), - } - mask_data = { - "L": np.array([[[1., 0.5], [0., np.nan]]]), - "RGB": np.array([ [[1., 0.5], [0., np.nan]], [[1., 0.5], [0., np.nan]], - [[1., 0.5], [0., np.nan]]]), + [[1., 0.5], [0., np.nan]], + [[0.5, 0.5], [0., 0.5]]]), } - mask_no_bands_data = np.array([[1., 0.5], [0., np.nan]]) cls.foreground_data = foreground_data - cls.mask_data = mask_data - cls.mask_no_bands_data = mask_no_bands_data @mock.patch("satpy.composites.enhance2dataset", _enhance2dataset) @pytest.mark.parametrize( - ("foreground_bands", "background_bands", "mask", "mask_value", "exp_bands", "exp_result"), + ("foreground_bands", "background_bands", "exp_bands", "exp_result"), [ - ("L", "L", "L", None, "L", np.array([ - [1.0, 0.5], [0., np.nan]])), - ("L", "LA", "RGB", 0.5, "LA", np.array([ - [[1.0, np.nan], [0.0, np.nan]], - [[1.0, 0.0], [1.0, 1.0]]])), - ("LA", "LA", "L", None, "LA", np.array([ - [[1.0, 0.75], [0.5, np.nan]], - [[1.0, 1.0], [1.0, 0.0]]])), - ("LA", "RGB", "L", 1, "RGB", np.array([ - [[np.nan, 0.75], [0.5, np.nan]], - [[np.nan, 0.75], [0.5, np.nan]], - [[np.nan, 0.75], [0.5, np.nan]]])), - ("RGB", "RGB", "None", None, "RGB", np.array([ - [[1.0, 0.5], [0.0, 1.0]], - [[1.0, 0.5], [0.0, 1.0]], - [[1.0, 0.5], [0.0, 1.0]]])), - ("RGB", "RGBA", "L", 1, "RGBA", np.array([ - [[np.nan, 0.5], [0.0, np.nan]], - [[np.nan, 0.5], [0.0, np.nan]], - [[np.nan, 0.5], [0.0, np.nan]], - [[0.0, 1.0], [1.0, 1.0]]])), - ("RGBA", "RGB", "L", None, "RGB", np.array([ - [[1.0, 0.75], [1.0, np.nan]], - [[1.0, 0.75], [1.0, np.nan]], - [[1.0, 0.75], [1.0, np.nan]]])), - ("RGBA", "RGB", "None", None, "RGB", np.array([ - [[1.0, 0.75], [1.0, 1.0]], - [[1.0, 0.75], [1.0, 1.0]], - [[1.0, 0.75], [1.0, 1.0]]])), - ("RGBA", "RGBA", "RGB", 0.5, "RGBA", np.array([ - [[1.0, np.nan], [1.0, np.nan]], - [[1.0, np.nan], [1.0, np.nan]], - [[1.0, np.nan], [1.0, np.nan]], - [[1.0, 0.0], [1.0, 1.0]]])), + ("L", "L", "L", np.array([[1., 0.5], [0., 1.]])), + ("LA", "LA", "LA", np.array([ + [[1., 0.75], [0.5, 1.]], + [[1., 1.], [1., 1.]]])), + ("LA", "RGB", "RGB", np.array([ + [[1., 0.75], [0.5, 1.]], + [[1., 0.75], [0.5, 1.]], + [[1., 0.75], [0.5, 1.]]])), + ("RGB", "RGB", "RGB", np.array([ + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]]])), + ("RGB", "RGBA", "RGBA", np.array([ + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]], + [[1., 1.], [1., 1.]]])), + ("RGBA", "RGBA", "RGBA", np.array([ + [[1., 0.75], [1., 1.]], + [[1., 0.75], [1., 1.]], + [[1., 0.75], [1., 1.]], + [[1., 1.], [1., 1.]]])), + ("RGBA", "RGB", "RGB", np.array([ + [[1., 0.75], [1., 1.]], + [[1., 0.75], [1., 1.]], + [[1., 0.75], [1., 1.]]])), ] ) - def test_call(self, foreground_bands, background_bands, mask, mask_value, exp_bands, exp_result): + def test_call(self, foreground_bands, background_bands, exp_bands, exp_result): """Test the background compositing.""" from satpy.composites import BackgroundCompositor - comp = BackgroundCompositor("name", mask_value=mask_value) + comp = BackgroundCompositor("name") # L mode images foreground_data = self.foreground_data[foreground_bands] - mask_bands = mask if mask != "None" else "L" - mask_data = self.mask_data[mask_bands] attrs = {"mode": foreground_bands, "area": "foo"} foreground = xr.DataArray(da.from_array(foreground_data), @@ -1564,15 +1544,9 @@ def test_call(self, foreground_bands, background_bands, mask, mask_value, exp_ba background = xr.DataArray(da.ones((len(background_bands), 2, 2)), dims=("bands", "y", "x"), coords={"bands": [c for c in attrs["mode"]]}, attrs=attrs) - attrs = {"mode": mask_bands, "area": "foo"} - mask_dataset = xr.DataArray(da.from_array(mask_data), - dims=("bands", "y", "x"), - coords={"bands": [c for c in attrs["mode"]]}, - attrs=attrs) - - optional_datasets = [mask_dataset] if mask != "None" else [] - res = comp([foreground, background], optional_datasets=optional_datasets) + res = comp([foreground, background]) + print(res.data.compute()) assert res.attrs["area"] == "foo" np.testing.assert_allclose(res, exp_result) @@ -1602,34 +1576,6 @@ def test_multiple_sensors(self): assert res.attrs["mode"] == "L" assert res.attrs["sensor"] == {"abi", "glm"} - @mock.patch("satpy.composites.enhance2dataset", _enhance2dataset) - def test_mask_with_no_bands(self): - """Test the background compositing with mask that doesn't have 'bands' in its coords.""" - from satpy.composites import BackgroundCompositor - comp = BackgroundCompositor("name", mask_value=None) - - attrs = {"mode": "RGBA", "area": "foo"} - foreground = xr.DataArray(da.from_array(self.foreground_data["RGBA"]), - dims=("bands", "y", "x"), - coords={"bands": [c for c in attrs["mode"]]}, - attrs=attrs) - attrs = {"mode": "RGB", "area": "foo"} - background = xr.DataArray(da.ones((len("RGB"), 2, 2)), dims=("bands", "y", "x"), - coords={"bands": [c for c in attrs["mode"]]}, - attrs=attrs) - attrs = {"area": "foo"} - mask_no_bands_dataset = xr.DataArray(da.from_array(self.mask_no_bands_data), - dims=("y", "x"), - attrs=attrs) - - res = comp([foreground, background], optional_datasets=[mask_no_bands_dataset]) - - assert res.attrs["area"] == "foo" - assert res.attrs["mode"] == "RGB" - np.testing.assert_allclose(res, np.array([[[1.0, 0.75], [1.0, np.nan]], - [[1.0, 0.75], [1.0, np.nan]], - [[1.0, 0.75], [1.0, np.nan]]])) - class TestMaskingCompositor: """Test case for the simple masking compositor.""" From 786f09bbee995d3f18c3ae10423c3f9b1bf9a5e5 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 20 Dec 2023 10:13:35 +0800 Subject: [PATCH 084/481] Update test_composites.py --- satpy/tests/test_composites.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index f5c85dbfec..9654441c92 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1546,7 +1546,6 @@ def test_call(self, foreground_bands, background_bands, exp_bands, exp_result): attrs=attrs) res = comp([foreground, background]) - print(res.data.compute()) assert res.attrs["area"] == "foo" np.testing.assert_allclose(res, exp_result) From 37853ad8595feea8aded3cce9154ae38fd41b31e Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Wed, 20 Dec 2023 16:59:38 +0000 Subject: [PATCH 085/481] Move encoding to separate module --- satpy/cf/decoding.py | 74 +++++++++++++++++++++++++++ satpy/readers/satpy_cf_nc.py | 46 +---------------- satpy/tests/cf_tests/test_decoding.py | 64 +++++++++++++++++++++++ 3 files changed, 140 insertions(+), 44 deletions(-) create mode 100644 satpy/cf/decoding.py create mode 100644 satpy/tests/cf_tests/test_decoding.py diff --git a/satpy/cf/decoding.py b/satpy/cf/decoding.py new file mode 100644 index 0000000000..0d7a9d22be --- /dev/null +++ b/satpy/cf/decoding.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2023 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 . +"""CF decoding.""" +import copy +import json +from datetime import datetime + + +def decode_attrs(attrs): + """Decode CF-encoded attributes to Python object. + + Converts timestamps to datetime and strings starting with "{" to + dictionary. + + Args: + attrs (dict): Attributes to be decoded + + Returns (dict): Decoded attributes + """ + attrs = copy.deepcopy(attrs) + _decode_dict_type_attrs(attrs) + _decode_timestamps(attrs) + return attrs + + +def _decode_dict_type_attrs(attrs): + for key, val in attrs.items(): + attrs[key] = _str2dict(val) + + +def _str2dict(val): + """Convert string to dictionary.""" + if isinstance(val, str) and val.startswith("{"): + val = json.loads(val, object_hook=_datetime_parser_json) + return val + + +def _decode_timestamps(attrs): + for key, value in attrs.items(): + timestamp = _str2datetime(value) + if timestamp: + attrs[key] = timestamp + + +def _datetime_parser_json(json_dict): + """Traverse JSON dictionary and parse timestamps.""" + for key, value in json_dict.items(): + timestamp = _str2datetime(value) + if timestamp: + json_dict[key] = timestamp + return json_dict + + +def _str2datetime(string): + """Convert string to datetime object.""" + try: + return datetime.fromisoformat(string) + except (TypeError, ValueError): + return None diff --git a/satpy/readers/satpy_cf_nc.py b/satpy/readers/satpy_cf_nc.py index 73c26fccdd..5fab6e6235 100644 --- a/satpy/readers/satpy_cf_nc.py +++ b/satpy/readers/satpy_cf_nc.py @@ -177,13 +177,12 @@ """ import itertools -import json import logging -from datetime import datetime import xarray as xr from pyresample import AreaDefinition +import satpy.cf.decoding from satpy.dataset.dataid import WavelengthRange from satpy.readers.file_handlers import BaseFileHandler from satpy.utils import get_legacy_chunk_size @@ -312,8 +311,7 @@ def get_dataset(self, ds_id, ds_info): if name != ds_id["name"]: data = data.rename(ds_id["name"]) data.attrs.update(nc.attrs) # For now add global attributes to all datasets - decoder = DatasetAttributeDecoder() - decoder.decode_attrs(data) + data.attrs = satpy.cf.decoding.decode_attrs(data.attrs) return data def get_area_def(self, dataset_id): @@ -327,43 +325,3 @@ def get_area_def(self, dataset_id): # with the yaml_reader NotImplementedError is raised. logger.debug("No AreaDefinition to load from nc file. Falling back to SwathDefinition.") raise NotImplementedError - - -class DatasetAttributeDecoder: - """Decode attributes from cf-compatible to Python object.""" - - def decode_attrs(self, dataset): - """Decode dataset attributes.""" - self._decode_dict_type_attrs(dataset.attrs) - self._decode_timestamps(dataset.attrs) - - def _decode_dict_type_attrs(self, attrs): - for key, val in attrs.items(): - attrs[key] = self._str2dict(val) - - def _str2dict(self, val): - """Convert string to dictionary.""" - if isinstance(val, str) and val.startswith("{"): - val = json.loads(val, object_hook=_datetime_parser_json) - return val - - def _decode_timestamps(self, attrs): - for key, value in attrs.items(): - timestamp = _str2datetime(value) - if timestamp: - attrs[key] = timestamp - - -def _datetime_parser_json(json_dict): - for key, value in json_dict.items(): - timestamp = _str2datetime(value) - if timestamp: - json_dict[key] = timestamp - return json_dict - - -def _str2datetime(string): - try: - return datetime.fromisoformat(string) - except (TypeError, ValueError): - return None diff --git a/satpy/tests/cf_tests/test_decoding.py b/satpy/tests/cf_tests/test_decoding.py new file mode 100644 index 0000000000..c20cddf6da --- /dev/null +++ b/satpy/tests/cf_tests/test_decoding.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2023 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 . +"""Tests for CF decoding.""" +from datetime import datetime + +import pytest + +import satpy.cf.decoding + + +class TestDecodeAttrs: + """Test decoding of CF-encoded attributes.""" + + @pytest.fixture() + def attrs(self): + """Get CF-encoded attributes.""" + return { + "my_integer": 0, + "my_float": 0.0, + "my_list": [1, 2, 3], + "my_timestamp1": "2000-01-01", + "my_timestamp2": "2000-01-01 12:15:33", + "my_timestamp3": "2000-01-01 12:15:33.123456", + "my_dict": '{"a": {"b": [1, 2, 3]}, "c": {"d": "2000-01-01 12:15:33.123456"}}' + } + + @pytest.fixture() + def expected(self): + """Get expected decoded results.""" + return { + "my_integer": 0, + "my_float": 0.0, + "my_list": [1, 2, 3], + "my_timestamp1": datetime(2000, 1, 1), + "my_timestamp2": datetime(2000, 1, 1, 12, 15, 33), + "my_timestamp3": datetime(2000, 1, 1, 12, 15, 33, 123456), + "my_dict": {"a": {"b": [1, 2, 3]}, + "c": {"d": datetime(2000, 1, 1, 12, 15, 33, 123456)}} + } + + def test_decoding(self, attrs, expected): + """Test decoding of CF-encoded attributes.""" + res = satpy.cf.decoding.decode_attrs(attrs) + assert res == expected + + def test_decoding_doesnt_modify_original(self, attrs): + """Test that decoding doesn't modify the original attributes.""" + satpy.cf.decoding.decode_attrs(attrs) + assert isinstance(attrs["my_dict"], str) From 26eaaf13f99eec86fc7d4b554d60ea5e144592c5 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 21 Dec 2023 10:37:13 +0800 Subject: [PATCH 086/481] 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 d9d8fec00b..5701842a2b 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1765,6 +1765,7 @@ def _get_alpha(dataset: xr.DataArray): bg_band * alpha_back * (1 - alpha_fore)) / new_alpha_nan if band != "A" else new_alpha chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) + chan["bands"] = band data.append(chan) From a53068e9050dab6a2c530e73889bc4054c3862af Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 22 Dec 2023 00:25:53 +0800 Subject: [PATCH 087/481] something changed in metadata combination --- satpy/composites/__init__.py | 3 ++- satpy/tests/test_composites.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 5701842a2b..5a20530a8f 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1704,7 +1704,8 @@ def __call__(self, projectables, *args, **kwargs): attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) data = self._get_merged_image_data(foreground, background, initial_bg_alpha=initial_bg_alpha) res = super(BackgroundCompositor, self).__call__(data, **kwargs) - res.attrs.update(attrs) + attrs.update(res.attrs) + res.attrs = attrs return res def _combine_metadata_with_mode_and_sensor(self, diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 9654441c92..ef866ac341 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1573,7 +1573,7 @@ def test_multiple_sensors(self): assert res.attrs["area"] == "foo" np.testing.assert_allclose(res, np.array([[1., 0.5], [0., 1.]])) assert res.attrs["mode"] == "L" - assert res.attrs["sensor"] == {"abi", "glm"} + assert res.attrs["sensor"] is None class TestMaskingCompositor: From f4569bf275f0e9861d3d47f4a02c50be6b43808e Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 22 Dec 2023 10:36:36 +0800 Subject: [PATCH 088/481] update metadata --- satpy/composites/__init__.py | 2 ++ satpy/tests/test_composites.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 5a20530a8f..fc476b3658 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1703,6 +1703,8 @@ def __call__(self, projectables, *args, **kwargs): attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) data = self._get_merged_image_data(foreground, background, initial_bg_alpha=initial_bg_alpha) + for data_arr in data: + data_arr.attrs = attrs res = super(BackgroundCompositor, self).__call__(data, **kwargs) attrs.update(res.attrs) res.attrs = attrs diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index ef866ac341..9654441c92 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1573,7 +1573,7 @@ def test_multiple_sensors(self): assert res.attrs["area"] == "foo" np.testing.assert_allclose(res, np.array([[1., 0.5], [0., 1.]])) assert res.attrs["mode"] == "L" - assert res.attrs["sensor"] is None + assert res.attrs["sensor"] == {"abi", "glm"} class TestMaskingCompositor: From 8d41b76e822f4451df8cc10432d1022133d191ac Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 23 Dec 2023 09:10:41 +0800 Subject: [PATCH 089/481] 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 fc476b3658..eefd5258ef 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1753,7 +1753,7 @@ def _get_alpha(dataset: xr.DataArray): # Unless background has an initial alpha band, there will be no alpha band in the output image # Let the writer decide - output_mode = background.mode if initial_bg_alpha else background.mode.replace("A", "") + output_mode = background.attrs["mode"] if initial_bg_alpha else background.attrs["mode"].replace("A", "") # If we let the writer decide alpha band, we must fill the transparent areas in the image with np.nan first # The best way is through the new alpha From 814c5fe4df9ee16189cf4df73f1012091ed6b6fe Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 5 Jan 2024 23:21:20 +0800 Subject: [PATCH 090/481] Update __init__.py --- satpy/composites/__init__.py | 44 +++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index eefd5258ef..46e11447e3 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1694,15 +1694,16 @@ def __call__(self, projectables, *args, **kwargs): # RGB/RGBA -> RGBA/RGBA foreground = add_bands(foreground, background["bands"]) background = add_bands(background, foreground["bands"]) - after_bg_mode = background.attrs["mode"] # It's important to judge whether the alpha band of background is initially generated, e.g. by CloudCompositor - # Or it's just added through 'add_bands' # The result will be used to decide the output image mode - initial_bg_alpha = True if "A" in before_bg_mode and "A" in after_bg_mode else False + initial_bg_alpha = "A" in before_bg_mode attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) - data = self._get_merged_image_data(foreground, background, initial_bg_alpha=initial_bg_alpha) + if "A" not in foreground.attrs["mode"] and "A" not in background.attrs["mode"]: + data = self._simple_overlay(foreground, background) + else: + data = self._get_merged_image_data(foreground, background, initial_bg_alpha=initial_bg_alpha) for data_arr in data: data_arr.attrs = attrs res = super(BackgroundCompositor, self).__call__(data, **kwargs) @@ -1739,7 +1740,7 @@ def _get_alpha(dataset: xr.DataArray): alpha = xr.full_like(first_band, 1) alpha["bands"] = "A" - # There could be Nans in the alpha, especially through 'add_bands' + # There could be Nans in the alpha # Replace them with 0 to prevent cases like 1 + nan = nan, so they won't affect new_alpha alpha = xr.where(alpha.isnull(), 0, alpha) @@ -1751,27 +1752,44 @@ def _get_alpha(dataset: xr.DataArray): data = [] - # Unless background has an initial alpha band, there will be no alpha band in the output image - # Let the writer decide - output_mode = background.attrs["mode"] if initial_bg_alpha else background.attrs["mode"].replace("A", "") + # Pass the image data (alpha band will be dropped temporally) to the writer + output_mode = background.attrs["mode"].replace("A", "") - # If we let the writer decide alpha band, we must fill the transparent areas in the image with np.nan first - # The best way is through the new alpha + # For more info about alpha compositing please review https://en.wikipedia.org/wiki/Alpha_compositing + # Whether there's no initial alpha band, or it has been dropped, we're actually asking the writer for decision + # So first, we must fill the transparent areas in the image with np.nan + # The best way is through a modified version of new alpha new_alpha_nan = xr.where(alpha_fore + alpha_back == 0, np.nan, new_alpha) if "A" not in output_mode \ else new_alpha for band in output_mode: - fg_band = foreground.sel(bands=band) if band != "A" else new_alpha - bg_band = background.sel(bands=band) if band != "A" else new_alpha + fg_band = foreground.sel(bands=band) + bg_band = background.sel(bands=band) chan = (fg_band * alpha_fore + - bg_band * alpha_back * (1 - alpha_fore)) / new_alpha_nan if band != "A" else new_alpha + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha_nan chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) chan["bands"] = band data.append(chan) + # If background has an initial alpha band, it will also be passed to the writer + if initial_bg_alpha: + new_alpha["bands"] = "A" + data.append(new_alpha) + + return data + + @staticmethod + def _simple_overlay(foreground: xr.DataArray, + background: xr.DataArray,) -> list[xr.DataArray]: + # This is for the case when no alpha bands are involved + # Just simply lay the foreground upon background + data_arr = xr.where(foreground.isnull(), background, foreground) + # Split to separate bands so the mode is correct + data = [data_arr.sel(bands=b) for b in data_arr["bands"]] + return data From e5890b0d1b64d7035e639cf1a0bd67115208cab8 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 24 Jul 2023 15:34:53 +0200 Subject: [PATCH 091/481] convert enumeration type information into flag_meanings / flag_values attributes --- satpy/readers/fci_l2_nc.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index cb5924b448..83f560c35a 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -20,6 +20,7 @@ import numpy as np import xarray as xr +import netCDF4 from pyresample import geometry from satpy._compat import cached_property @@ -93,6 +94,21 @@ def _set_attributes(self, variable, dataset_info, segmented=False): variable.attrs.setdefault("units", None) variable.attrs.update(dataset_info) variable.attrs.update(self._get_global_attributes()) + + if ('import_enum_information' in dataset_info): + if (dataset_info['import_enum_information']): + netCDF4_dataset = netCDF4.Dataset(self.filename, 'r') + # This currently assumes a flat netCDF file + enum = netCDF4_dataset.variables[dataset_info['file_key']].datatype.enum_dict + flag_values = [] + flag_meanings = [] + for item in enumerate(enum): + flag_values.append(item[0]) + flag_meanings.append(item[1]) + + variable.attrs['flag_values'] = flag_values + variable.attrs['flag_meanings'] = flag_meanings + netCDF4_dataset.close() return variable From 16892404e214a3493e5e6950c571a416be8f24d7 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 24 Jul 2023 15:43:16 +0200 Subject: [PATCH 092/481] update for clm --- satpy/etc/readers/fci_l2_nc.yaml | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 1ad5d576a0..7755259cea 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -82,54 +82,58 @@ datasets: resolution: 2000 file_type: nc_fci_clm file_key: cloud_state - long_name: cloud_mask_classification + standard_name: cloud_mask_classification + import_enum_information: True quality_illumination_clm: name: quality_illumination_clm resolution: 2000 file_type: nc_fci_clm file_key: quality_illumination - long_name: illumination_classification + standard_name: illumination_classification + import_enum_information: True quality_nwp_parameters_clm: name: quality_nwp_parameters_clm resolution: 2000 file_type: nc_fci_clm file_key: quality_nwp_parameters - long_name: quality_index - + standard_name: forecast_availibility_classification + import_enum_information: True + quality_MTG_parameters_clm: name: quality_MTG_parameters_clm resolution: 2000 file_type: nc_fci_clm file_key: quality_MTG_parameters - long_name: quality_index + standard_name: platform_data_availibility_classification fill_value: -127 + import_enum_information: True quality_overall_processing_clm: name: quality_overall_processing_clm resolution: 2000 file_type: nc_fci_clm file_key: quality_overall_processing - long_name: quality_index + standard_name: quality_flag product_quality_clm: name: product_quality_clm file_type: nc_fci_clm file_key: product_quality - long_name: product_quality_index + standard_name: quality_flag product_completeness_clm: name: product_completeness_clm file_type: nc_fci_clm file_key: product_completeness - long_name: product_completeness_index + standard_name: quality_flag product_timeliness_clm: name: product_timeliness_clm file_type: nc_fci_clm file_key: product_timeliness - long_name: product_timeliness_index + standard_name: quality_flag # FCI CT L2 cloud_phase: From 88259dfd327224df183f717288f5ed43c8e0ead1 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Fri, 1 Dec 2023 10:15:21 +0100 Subject: [PATCH 093/481] Merging FCI standard names and flag meanings and Fixing standard names for AMV quality flags --- satpy/etc/readers/fci_l2_nc.yaml | 2174 +++++++++++++++++------------- 1 file changed, 1205 insertions(+), 969 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 7755259cea..ba8d3b1c46 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -83,6 +83,7 @@ datasets: file_type: nc_fci_clm file_key: cloud_state standard_name: cloud_mask_classification + fill_value: -127 import_enum_information: True quality_illumination_clm: @@ -90,7 +91,8 @@ datasets: resolution: 2000 file_type: nc_fci_clm file_key: quality_illumination - standard_name: illumination_classification + standard_name: status_flag + fill_value: -127 import_enum_information: True quality_nwp_parameters_clm: @@ -98,15 +100,16 @@ datasets: resolution: 2000 file_type: nc_fci_clm file_key: quality_nwp_parameters - standard_name: forecast_availibility_classification + standard_name: status_flag + fill_value: -127 import_enum_information: True - + quality_MTG_parameters_clm: name: quality_MTG_parameters_clm resolution: 2000 file_type: nc_fci_clm file_key: quality_MTG_parameters - standard_name: platform_data_availibility_classification + standard_name: status_flag fill_value: -127 import_enum_information: True @@ -116,24 +119,26 @@ datasets: file_type: nc_fci_clm file_key: quality_overall_processing standard_name: quality_flag + fill_value: -127 + import_enum_information: True product_quality_clm: name: product_quality_clm file_type: nc_fci_clm file_key: product_quality - standard_name: quality_flag + standard_name: product_quality product_completeness_clm: name: product_completeness_clm file_type: nc_fci_clm file_key: product_completeness - standard_name: quality_flag + standard_name: product_completeness product_timeliness_clm: name: product_timeliness_clm file_type: nc_fci_clm file_key: product_timeliness - standard_name: quality_flag + standard_name: product_timeliness # FCI CT L2 cloud_phase: @@ -141,60 +146,72 @@ datasets: resolution: 2000 file_type: nc_fci_ct file_key: cloud_phase - long_name: cloud_phase + standar_name: cloud_phase_classification + fill_value: -127 + import_enum_information: True cloud_type: name: cloud_type resolution: 2000 file_type: nc_fci_ct file_key: cloud_type - long_name: cloud_type + standard_name: cloud_type_classification + fill_value: -127 + import_enum_information: True quality_illumination_ct: name: quality_illumination_ct resolution: 2000 file_type: nc_fci_ct file_key: quality_illumination - long_name: illumination_classification + standard_name: status_flag + fill_value: -127 + import_enum_information: True quality_nwp_parameters_ct: name: quality_nwp_parameters_ct resolution: 2000 file_type: nc_fci_ct file_key: quality_nwp_parameters - long_name: quality_index + standard_name: status_flag + fill_value: -127 + import_enum_information: True quality_MTG_parameters_ct: name: quality_MTG_parameters_ct resolution: 2000 file_type: nc_fci_ct file_key: quality_MTG_parameters - long_name: quality_index + standard_name: status_flag + fill_value: -127 + import_enum_information: True quality_overall_processing_ct: name: quality_overall_processing_ct resolution: 2000 file_type: nc_fci_ct file_key: quality_overall_processing - long_name: quality_index + standard_name: quality_flag + fill_value: -127 + import_enum_information: True product_quality_ct: name: product_quality_ct file_type: nc_fci_ct file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness_ct: name: product_completeness_ct file_type: nc_fci_ct file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness_ct: name: product_timeliness_ct file_type: nc_fci_ct file_key: product_timeliness - long_name: product_timeliness_index + standard_name: product_timeliness # FCI CTTH Product cloud_top_aviation_height: @@ -202,94 +219,116 @@ datasets: resolution: 2000 file_type: nc_fci_ctth file_key: cloud_top_aviation_height + standard_name: height_at_cloud_top_for_aviation cloud_top_height: name: cloud_top_height resolution: 2000 file_type: nc_fci_ctth file_key: cloud_top_height - fill_value: 32769 + standard_name: height_at_cloud_top cloud_top_pressure: name: cloud_top_pressure resolution: 2000 file_type: nc_fci_ctth file_key: cloud_top_pressure - fill_value: 3276.9001 + standard_name: air_pressure_at_cloud_top cloud_top_temperature: name: cloud_top_temperature resolution: 2000 file_type: nc_fci_ctth file_key: cloud_top_temperature - fill_value: 327.69 + standard_name: air_temperature_at_cloud_top effective_cloudiness: name: effective_cloudiness resolution: 2000 file_type: nc_fci_ctth file_key: effective_cloudiness + standard_name: effective_cloud_cover quality_status_ctth: name: quality_status_ctth resolution: 2000 file_type: nc_fci_ctth file_key: quality_status + standard_name: status_flag + fill_value: -127 + import_enum_information: True quality_rtm_ctth: name: quality_rtm_ctth resolution: 2000 file_type: nc_fci_ctth file_key: quality_rtm + standard_name: status_flag + fill_value: -127 + import_enum_information: True quality_method_ctth: name: quality_method_ctth resolution: 2000 file_type: nc_fci_ctth file_key: quality_method + standard_name: status_flag + fill_value: -127 + import_enum_information: True quality_nwp_parameters_ctth: name: quality_nwp_parameters_ctth resolution: 2000 file_type: nc_fci_ctth file_key: quality_nwp_parameters + standard_name: status_flag + fill_value: -127 + import_enum_information: True quality_MTG_parameters_ctth: name: quality_MTG_parameters_ctth resolution: 2000 file_type: nc_fci_ctth file_key: quality_MTG_parameters + standard_name: status_flag fill_value: -127 + import_enum_information: True quality_overall_processing_ctth: name: quality_overall_processing_ctth resolution: 2000 file_type: nc_fci_ctth file_key: quality_overall_processing + standard_name: quality_flag + fill_value: -127 + import_enum_information: True quality_overall_processing_aviation_ctth: name: quality_overall_processing_aviation_ctth resolution: 2000 file_type: nc_fci_ctth file_key: quality_overall_processing_aviation + standard_name: quality_flag + fill_value: -127 + import_enum_information: True product_quality_ctth: name: product_quality_ctth file_type: nc_fci_ctth file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness_ctth: name: product_completeness_ctth file_type: nc_fci_ctth file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness_ctth: name: product_timeliness_ctth file_type: nc_fci_ctth file_key: product_timeliness - long_name: product_timeliness_index + standard_name: product_timeliness # OCA retrieved_cloud_phase: @@ -297,14 +336,16 @@ datasets: resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_phase - standard_name: thermodynamic_phase_of_cloud_water_particles_at_cloud_top + standard_name: thermodynamic_phase_of_cloud_particles_classification + fill_value: -127 + import_enum_information: True retrieved_cloud_optical_thickness: name: retrieved_cloud_optical_thickness resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_optical_thickness - long_name: cloud_optical_depth + standard_name: atmosphere_optical_thickness_due_to_cloud retrieved_cloud_optical_thickness_upper_layer: name: retrieved_cloud_optical_thickness_upper_layer @@ -312,7 +353,15 @@ datasets: file_type: nc_fci_oca file_key: retrieved_cloud_optical_thickness layer: 0 - long_name: cloud_optical_depth + standard_name: atmosphere_optical_thickness_due_to_cloud + + retrieval_error_cloud_optical_thickness_upper_layer: + name: retrieval_error_cloud_optical_thickness_upper_layer + resolution: 2000 + file_type: nc_fci_oca + file_key: retrieval_error_cloud_optical_thickness + layer: 0 + standard_name: atmosphere_optical_thickness_due_to_cloud standard_error retrieved_cloud_optical_thickness_lower_layer: name: retrieved_cloud_optical_thickness_lower_layer @@ -320,21 +369,29 @@ datasets: file_type: nc_fci_oca file_key: retrieved_cloud_optical_thickness layer: 1 - long_name: cloud_optical_depth + standard_name: atmosphere_optical_thickness_due_to_cloud + + retrieval_error_cloud_optical_thickness_lower_layer: + name: retrieval_error_cloud_optical_thickness_lower_layer + resolution: 2000 + file_type: nc_fci_oca + file_key: retrieval_error_cloud_optical_thickness + layer: 1 + standard_name: atmosphere_optical_thickness_due_to_cloud standard_error retrieved_cloud_particle_effective_radius: - name: retrieved_cloud_particle_effective_radius + name: retrieved_cloud_particle_effective_radius_upper_layer resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_particle_effective_radius - standard_name: effective_radius_of_cloud_condensed_water_particles_at_cloud_top + standard_name: effective_radius_of_cloud_particles - retrieved_cloud_top_temperature: - name: retrieved_cloud_top_temperature + retrieval_error_cloud_particle_effective_radius: + name: retrieval_error_cloud_particle_effective_radius_upper_layer resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_top_temperature - standard_name: air_temperature_at_cloud_top + file_key: retrieval_error_cloud_particle_effective_radius + standard_name: effective_radius_of_cloud_particles standard_error retrieved_cloud_top_pressure_upper_layer: name: retrieved_cloud_top_pressure_upper_layer @@ -344,6 +401,14 @@ datasets: layer: 0 standard_name: air_pressure_at_cloud_top + retrieval_error_cloud_top_pressure_upper_layer: + name: retrieval_error_cloud_top_pressure_upper_layer + resolution: 2000 + file_type: nc_fci_oca + file_key: retrieval_error_cloud_top_pressure + layer: 0 + standard_name: air_pressure_at_cloud_top standard_error + retrieved_cloud_top_pressure_lower_layer: name: retrieved_cloud_top_pressure_lower_layer resolution: 2000 @@ -352,76 +417,52 @@ datasets: layer: 1 standard_name: air_pressure_at_cloud_top - retrieved_cloud_top_height: - name: retrieved_cloud_top_height - resolution: 2000 - file_type: nc_fci_oca - file_key: retrieved_cloud_top_height - standard_name: height_at_cloud_top - - retrieval_error_cloud_optical_thickness_upper_layer: - name: retrieval_error_cloud_optical_thickness_upper_layer - resolution: 2000 - file_type: nc_fci_oca - file_key: retrieval_error_cloud_optical_thickness - layer: 0 - long_name: cloud_optical_depth - - retrieval_error_cloud_optical_thickness_lower_layer: - name: retrieval_error_cloud_optical_thickness_lower_layer + retrieval_error_cloud_top_pressure_lower_layer: + name: retrieval_error_cloud_top_pressure_lower_layer resolution: 2000 file_type: nc_fci_oca - file_key: retrieval_error_cloud_optical_thickness + file_key: retrieval_error_cloud_top_pressure layer: 1 - long_name: cloud_optical_depth - - retrieval_error_cloud_particle_effective_radius: - name: retrieval_error_cloud_particle_effective_radius - resolution: 2000 - file_type: nc_fci_oca - file_key: retrieval_error_cloud_particle_effective_radius - standard_name: effective_radius_of_cloud_condensed_water_particles_at_cloud_top_standard_error + standard_name: air_pressure_at_cloud_top standard_erro - retrieval_error_cloud_top_pressure_upper_layer: - name: retrieval_error_cloud_top_pressure_upper_layer + retrieved_cloud_top_temperature: + name: retrieved_cloud_top_temperature_upper_layer resolution: 2000 file_type: nc_fci_oca - file_key: retrieval_error_cloud_top_pressure - layer: 0 - standard_name: air_pressure_at_cloud_top_standard_error + file_key: retrieved_cloud_top_temperature + standard_name: air_temperature_at_cloud_top - retrieval_error_cloud_top_pressure_lower_layer: - name: retrieval_error_cloud_top_pressure_lower_layer + retrieved_cloud_top_height: + name: retrieved_cloud_top_height_upper_layer resolution: 2000 file_type: nc_fci_oca - file_key: retrieval_error_cloud_top_pressure - layer: 1 - standard_name: air_pressure_at_cloud_top_standard_error + file_key: retrieved_cloud_top_height + standard_name: height_at_cloud_top quality_jmeas: name: quality_jmeas resolution: 2000 file_type: nc_fci_oca file_key: quality_jmeas - long_name: cost_function + standard_name: cost_function_part_due_to_measurements product_quality_oca: name: product_quality_oca file_type: nc_fci_oca file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness_oca: name: product_completeness_oca file_type: nc_fci_oca file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness_oca: name: product_timeliness_oca file_type: nc_fci_oca file_key: product_timeliness - long_name: product_timeliness_index + standard_name: product_timeliness # FIR fire_probability: @@ -429,30 +470,34 @@ datasets: resolution: 2000 file_type: nc_fci_fir file_key: fire_probability + standard_name: fire_probability fire_result: name: fire_result resolution: 2000 file_type: nc_fci_fir file_key: fire_result + standard_name: active_fire_classification + fill_value: -127 + import_enum_information: True product_quality_fir: name: product_quality_fir file_type: nc_fci_fir file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness_fir: name: product_completeness_fir file_type: nc_fci_fir file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness_fir: name: product_timeliness_fir file_type: nc_fci_fir file_key: product_timeliness - long_name: product_timeliness_index + standard_name: product_timeliness # OLR olr: @@ -460,39 +505,43 @@ datasets: resolution: 2000 file_type: nc_fci_olr file_key: olr_value - long_name: outgoing_longwave_radiation + standard_name: outgoing_longwave_radiation cloud_type_olr: name: cloud_type_olr resolution: 2000 file_type: nc_fci_olr file_key: cloud_type - long_name: cloud_type_olr + standard_name: cloud_type_classification + fill_value: -127 + import_enum_information: True quality_overall_processing_olr: name: quality_overall_processing_olr resolution: 2000 file_type: nc_fci_olr file_key: quality_overall_processing - long_name: quality_index + standard_name: quality_flag + fill_value: -127 + import_enum_information: True product_quality_olr: name: product_quality_olr file_type: nc_fci_olr file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness_olr: name: product_completeness_olr file_type: nc_fci_olr file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness_olr: name: product_timeliness_olr file_type: nc_fci_olr file_key: product_timeliness - long_name: product_timeliness_index + standard_name: product_timeliness # CRM crm: @@ -500,7 +549,7 @@ datasets: resolution: 1000 file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - long_name: mean_clear_sky_reflectance + standard_name: toa_bidirectional_reflectance crm_vis04: name: crm_vis04 @@ -508,7 +557,7 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - long_name: mean_clear_sky_reflectance_vis04 + standard_name: toa_bidirectional_reflectance vis_channel_id: 0 crm_vis05: @@ -517,7 +566,7 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - long_name: mean_clear_sky_reflectance_vis05 + standard_name: toa_bidirectional_reflectance vis_channel_id: 1 crm_vis06: @@ -526,7 +575,7 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - long_name: mean_clear_sky_reflectance_vis06 + standard_name: toa_bidirectional_reflectance vis_channel_id: 2 crm_vis08: @@ -535,7 +584,7 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - long_name: mean_clear_sky_reflectance_vis08 + standard_name: toa_bidirectional_reflectance vis_channel_id: 3 crm_vis09: @@ -544,7 +593,7 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - long_name: mean_clear_sky_reflectance_vis09 + standard_name: toa_bidirectional_reflectance vis_channel_id: 4 crm_nir13: @@ -553,7 +602,7 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - long_name: mean_clear_sky_reflectance_nir13 + standard_name: toa_bidirectional_reflectance vis_channel_id: 5 crm_nir16: @@ -562,7 +611,7 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - long_name: mean_clear_sky_reflectance_nir16 + standard_name: toa_bidirectional_reflectance vis_channel_id: 6 crm_nir22: @@ -571,7 +620,7 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - long_name: mean_clear_sky_reflectance_nir22 + standard_name: toa_bidirectional_reflectance vis_channel_id: 7 mean_sza: @@ -579,46 +628,46 @@ datasets: resolution: 1000 file_type: nc_fci_crm file_key: mean_solar_zenith - long_name: mean_solar_zenith_angle + standard_name: solar_zenith_angle mean_rel_azi: name: mean_rel_azi resolution: 1000 file_type: nc_fci_crm file_key: mean_rel_solar_sat_azimuth - long_name: mean_relative_solar_satellite_azimuth_angle + standard_name: relative_sun_sensor_azimuth_angle n_acc: name: n_acc resolution: 1000 file_type: nc_fci_crm file_key: number_of_accumulations - long_name: number_of_accumulations + standard_name: number_of_accumulations historical_data: name: historical_data resolution: 1000 file_type: nc_fci_crm file_key: historical_data - long_name: historical_data + standard_name: status_flag product_quality_crm: name: product_quality_crm file_type: nc_fci_crm file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness_crm: name: product_completeness_crm file_type: nc_fci_crm file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness_crm: name: product_timeliness_crm file_type: nc_fci_crm file_key: product_timeliness - long_name: product_timeliness_index + standard_name: product_timeliness # LAT/LON FOR SEGMENTED PRODUCTS @@ -645,160 +694,98 @@ datasets: resolution: 6000 file_type: nc_fci_gii file_key: k_index - long_name: k_index coordinates: - longitude - latitude + standard_name: atmosphere_stability_lifted_index lifted_index: name: lifted_index resolution: 6000 file_type: nc_fci_gii file_key: lifted_index - long_name: lifted_index coordinates: - longitude - latitude + standard_name: atmosphere_stability_k_index prec_water_high: name: prec_water_high resolution: 6000 file_type: nc_fci_gii file_key: prec_water_high - long_name: prec_water_high coordinates: - longitude - latitude + standard_name: atmosphere_mass_content_of_water_vapor prec_water_low: name: prec_water_low resolution: 6000 file_type: nc_fci_gii file_key: prec_water_low - long_name: prec_water_low coordinates: - longitude - latitude + standard_name: atmosphere_mass_content_of_water_vapor prec_water_mid: name: prec_water_mid resolution: 6000 file_type: nc_fci_gii file_key: prec_water_mid - long_name: prec_water_mid coordinates: - longitude - latitude + standard_name: atmosphere_mass_content_of_water_vapor prec_water_total: name: prec_water_total resolution: 6000 file_type: nc_fci_gii file_key: prec_water_total - long_name: prec_water_total coordinates: - longitude - latitude + standard_name: atmosphere_mass_content_of_water_vapor percent_cloud_free_gii: name: percent_cloud_free_gii resolution: 6000 file_type: nc_fci_gii file_key: percent_cloud_free - long_name: percent_cloud_free coordinates: - longitude - latitude + standard_name: cloud_free_area_fraction number_of_iterations_gii: name: number_of_iterations_gii resolution: 6000 file_type: nc_fci_gii file_key: number_of_iterations - long_name: number_of_iterations coordinates: - longitude - latitude + standard_name: number_of_iterations product_quality_gii: name: product_quality_gii file_type: nc_fci_gii file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness_gii: name: product_completeness_gii file_type: nc_fci_gii file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness_gii: name: product_timeliness_gii file_type: nc_fci_gii file_key: product_timeliness - long_name: product_timeliness_index - - -# TOZ - total_ozone: - name: total_ozone - resolution: 6000 - file_type: nc_fci_toz - file_key: total_ozone - long_name: total_ozone - coordinates: - - longitude - - latitude - - percent_pixels_toz: - name: percent_pixels_toz - resolution: 6000 - file_type: nc_fci_toz - file_key: percent_pixels - long_name: percent_pixels - coordinates: - - longitude - - latitude - - number_of_iterations_toz: - name: number_of_iterations_toz - resolution: 6000 - file_type: nc_fci_toz - file_key: number_of_iterations - long_name: number_of_iterations - coordinates: - - longitude - - latitude - - retrieval_type_toz: - name: retrieval_type_toz - resolution: 6000 - file_type: nc_fci_toz - file_key: retrieval_type - long_name: retrieval_type - coordinates: - - longitude - - latitude - - product_quality_toz: - name: product_quality_toz - file_type: nc_fci_toz - file_key: product_quality - long_name: product_quality_index - - product_completeness_toz: - name: product_completeness_toz - file_type: nc_fci_toz - file_key: product_completeness - long_name: product_completeness_index - - product_timeliness_toz: - name: product_timeliness_toz - file_type: nc_fci_toz - file_key: product_timeliness - long_name: product_timeliness_index - - + standard_name: product_timeliness # CLM Test cloud_test_sit1_flag: @@ -806,1927 +793,2176 @@ datasets: resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_sit1_flag extract_byte: 0 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt1_flag: name: cloud_test_cmt1_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt1_flag extract_byte: 1 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt2_flag: name: cloud_test_cmt2_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt2_flag extract_byte: 2 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt3_flag: name: cloud_test_cmt3_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt3_flag extract_byte: 3 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt4_flag: name: cloud_test_cmt4_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt4_flag extract_byte: 4 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt5_flag: name: cloud_test_cmt5_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt5_flag extract_byte: 5 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt6_flag: name: cloud_test_cmt6_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt6_flag extract_byte: 6 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt7_flag: name: cloud_test_cmt7_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt7_flag extract_byte: 7 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt8_flag: name: cloud_test_cmt8_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt8_flag extract_byte: 8 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt9_flag: name: cloud_test_cmt9_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt9_flag extract_byte: 9 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt10_flag: name: cloud_test_cmt10_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt0_flag extract_byte: 10 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt11_flag: name: cloud_test_cmt11_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt11_flag extract_byte: 11 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt12_flag: name: cloud_test_cmt12_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt12_flag extract_byte: 12 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt13_flag: name: cloud_test_cmt13_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt13_flag extract_byte: 13 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmt14_flag: name: cloud_test_cmt14_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmt14_flag extract_byte: 14 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_opqt_flag: name: cloud_test_opqt_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_opqt_flag extract_byte: 15 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmrt1_flag: name: cloud_test_cmrt1_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmrt1_flag extract_byte: 16 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmrt2_flag: name: cloud_test_cmrt2_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmrt2_flag extract_byte: 17 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmrt3_flag: name: cloud_test_cmrt3_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmrt3_flag extract_byte: 18 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmrt4_flag: name: cloud_test_cmrt4_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmrt4_flag extract_byte: 19 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmrt5_flag: name: cloud_test_cmrt5_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmrt5_flag extract_byte: 20 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_cmrt6_flag: name: cloud_test_cmrt6_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_cmrt6_flag extract_byte: 21 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_dust_flag: name: cloud_test_dust_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_dust_flag extract_byte: 22 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_ash_flag: name: cloud_test_ash_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_ash_flag extract_byte: 23 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_dust_ash_flag: name: cloud_test_dust_ash_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag - long_name: cloud_mask_test_dust_ash_flag extract_byte: 24 + flag_values: [0,1] + flag_meanings: ['Test not carried out','Test carried out'] + standard_name: status_flag cloud_test_sit1: name: cloud_test_sit1 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_sit1 extract_byte: 0 + flag_values: [0,1] + flag_meanings: [' Snow/Ice undetected',' Snow/Ice detected'] + standard_name: status_flag cloud_test_cmt1: name: cloud_test_cmt1 resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt1 extract_byte: 1 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt2: name: cloud_test_cmt2 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt2 extract_byte: 2 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt3: name: cloud_test_cmt3 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt3 extract_byte: 3 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt4: name: cloud_test_cmt4 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt4 extract_byte: 4 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt5: name: cloud_test_cmt5 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt5 - extract_byte: 5 + sextract_byte: 5 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt6: name: cloud_test_cmt6 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt6 extract_byte: 6 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt7: name: cloud_test_cmt7 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt7 extract_byte: 7 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag + cloud_test_cmt8: name: cloud_test_cmt8 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt8 extract_byte: 8 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt9: name: cloud_test_cmt9 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt9 extract_byte: 9 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt10: name: cloud_test_cmt10 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt10 extract_byte: 10 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt11: name: cloud_test_cmt11 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt11 extract_byte: 11 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt12: name: cloud_test_cmt12 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt12 extract_byte: 12 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt13: name: cloud_test_cmt13 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt13 extract_byte: 13 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmt14: name: cloud_test_cmt14 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmt14 extract_byte: 14 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_opqt: name: cloud_test_opqt resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_opqt extract_byte: 15 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmrt1: name: cloud_test_cmrt1 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmrt1 extract_byte: 16 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmrt2: name: cloud_test_cmrt2 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmrt2 extract_byte: 17 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmrt3: name: cloud_test_cmrt3 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmrt3 extract_byte: 18 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmrt4: name: cloud_test_cmrt4 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmrt4 extract_byte: 19 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmrt5: name: cloud_test_cmrt5 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_cmrt5 extract_byte: 20 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_dust: name: cloud_test_dust resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_dust extract_byte: 21 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_ash: name: cloud_test_ash resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_ash extract_byte: 22 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_dust_ash: name: cloud_test_dust_ash resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - long_name: cloud_mask_test_dust_ash extract_byte: 23 + flag_values: [0,1] + flag_meanings: ['Cloud undetected','Cloud detected'] + standard_name: status_flag cloud_test_cmrt6: name: cloud_test_cmrt6 resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_cmrt6_test_result - long_name: cloud_mask_cmrt6_result + fill_value: -127 + standard_name: status_flag + import_enum_information: True product_quality_clmtest: name: product_quality_clmtest file_type: nc_fci_test_clm file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness_clmtest: name: product_completeness_clmtest file_type: nc_fci_test_clm file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness_clmtest: name: product_timeliness_clmtest file_type: nc_fci_test_clm file_key: product_timeliness - long_name: product_timeliness_index - + standard_name: product_timeliness # ASR - bt_max: - name: bt_max + radiance_min: + name: radiance_min resolution: 32000 + wavelength: [] file_type: nc_fci_asr - file_key: bt_max - long_name: maximum_brightness_temperature_in_segment + file_key: radiance_min + long_name: TOA min Radiance + standard_name: toa_radiance + cell_method: area:minimum coordinates: - longitude - latitude - bt_mean: - name: bt_mean + radiance_max: + name: radiance_max resolution: 32000 + wavelength: [] file_type: nc_fci_asr - file_key: bt_mean - long_name: mean_brightness_temperature_in_segment + file_key: radiance_max + long_name: TOA max Radiance + standard_name: toa_radiance + cell_method: area:maximum coordinates: - longitude - latitude - bt_min: - name: bt_min + radiance_mean: + name: radiance_mean resolution: 32000 + wavelength: [] file_type: nc_fci_asr - file_key: bt_min - long_name: minimum_brightness_temperature_in_segment + file_key: radiance_mean + long_name: TOA mean Radiance + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_std: - name: bt_std + radiance_mean_all_vis04: + name: radiance_mean_all_vis04 resolution: 32000 + wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: bt_std - long_name: brightness_temperature_standard_deviation_in_segment + file_key: radiance_mean + category_id: 0 + channel_id: 0 + long_name: TOA mean Radiance over all pixels for vis04 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - radiance_max: - name: radiance_max + radiance_mean_clear_vis04: + name: radiance_mean_clear_vis04 resolution: 32000 + wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: radiance_max - long_name: maximum_radiance_in_segment + file_key: radiance_mean + category_id: 1 + channel_id: 0 + long_name: TOA mean Radiance over clear pixels for vis04 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - radiance_mean: - name: radiance_mean + radiance_mean_cloudy_vis04: + name: radiance_mean_cloudy_vis04 resolution: 32000 + wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: radiance_mean - long_name: mean_radiance_in_segment + category_id: 2 + channel_id: 0 + long_name: TOA mean Radiance over cloudy pixels for vis04 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - radiance_min: - name: radiance_min + radiance_mean_all_vis05: + name: radiance_mean_all_vis05 resolution: 32000 + wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: radiance_min - long_name: minimum_radiance_in_segment + file_key: radiance_mean + category_id: 0 + channel_id: 1 + long_name: TOA mean Radiance over all pixels for vis05 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - radiance_std: - name: radiance_std + radiance_mean_clear_vis05: + name: radiance_mean_clear_vis05 resolution: 32000 + wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: radiance_std - long_name: radiance_standard_deviation_in_segment + file_key: radiance_mean + category_id: 1 + channel_id: 1 + long_name: TOA mean Radiance over clear pixels for vis05 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_max: - name: reflectance_max + radiance_mean_cloudy_vis05: + name: radiance_mean_cloudy_vis05 resolution: 32000 + wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: reflectance_max - long_name: maximum_reflectance_in_segment + file_key: radiance_mean + category_id: 2 + channel_id: 1 + long_name: TOA mean Radiance over cloudy pixels for vis05 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean: - name: reflectance_mean + radiance_mean_all_vis06: + name: radiance_mean_all_vis06 resolution: 32000 + wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: mean_reflectance_in_segment + file_key: radiance_mean + category_id: 0 + channel_id: 2 + long_name: TOA mean Radiance over all pixels for vis06 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_min: - name: reflectance_min + radiance_mean_clear_vis06: + name: radiance_mean_clear_vis06 resolution: 32000 + wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: reflectance_min - long_name: minimum_reflectance_in_segment + file_key: radiance_mean + category_id: 1 + channel_id: 2 + long_name: TOA mean Radiance over clear pixels for vis06 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_std: - name: reflectance_std + radiance_mean_cloudy_vis06: + name: radiance_mean_cloudy_vis06 resolution: 32000 + wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: reflectance_std - long_name: reflectance_standard_deviation_in_segment + file_key: radiance_mean + category_id: 2 + channel_id: 2 + long_name: TOA mean Radiance over cloudy pixels for vis06 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - quality_bt: - name: quality_bt + radiance_mean_all_vis08: + name: radiance_mean_all_vis08 resolution: 32000 + wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: quality_bt - long_name: brightness_temperature_quality - fill_value: -1 + file_key: radiance_mean + category_id: 0 + channel_id: 3 + long_name: TOA mean Radiance over all pixels for vis08 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance: - name: quality_reflectance + radiance_mean_clear_vis08: + name: radiance_mean_clear_vis08 resolution: 32000 + wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: reflectance_quality - fill_value: -1 + file_key: radiance_mean + category_id: 1 + channel_id: 3 + long_name: TOA mean Radiance over clear pixels for vis08 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - quality_radiance: - name: quality_radiance + radiance_mean_cloudy_vis08: + name: radiance_mean_cloudy_vis08 resolution: 32000 + wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: quality_radiance - long_name: radiance_quality - fill_value: -1 + file_key: radiance_mean + category_id: 2 + channel_id: 3 + long_name: TOA mean Radiance over cloudy pixels for vis08 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - land_pixel_percent: - name: land_pixel_percent + radiance_mean_all_vis09: + name: radiance_mean_all_vis09 resolution: 32000 + wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: land_pixel_percent - long_name: land_pixel_percentage_in_segment + file_key: radiance_mean + category_id: 0 + channel_id: 4 + long_name: TOA mean Radiance over all pixels for vis09 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - water_pixel_percent: - name: water_pixel_percent + radiance_mean_clear_vis09: + name: radiance_mean_clear_vis09 resolution: 32000 + wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: water_pixel_percent - long_name: water_pixel_percentage_in_segment + file_key: radiance_mean + category_id: 1 + channel_id: 4 + long_name: TOA mean Radiance over clear pixels for vis09 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - pixel_percentage: - name: pixel_percentage + radiance_mean_cloudy_vis09: + name: radiance_mean_cloudy_vis09 resolution: 32000 + wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: pixel_percentage - long_name: pixel_percentage_used_in_segment + file_key: radiance_mean + category_id: 2 + channel_id: 4 + long_name: TOA mean Radiance over cloudy pixels for vis09 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_all_vis04: - name: reflectance_mean_all_vis04 + radiance_mean_all_nir13: + name: radiance_mean_all_nir13 resolution: 32000 - wavelength: [0.384, 0.444, 0.504] + wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_all - vis_channel_id: 0 + file_key: radiance_mean category_id: 0 + channel_id: 5 + long_name: TOA mean Radiance over all pixels for nir13 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_clear_vis04: - name: reflectance_mean_clear_vis04 - resolution: 32000 - wavelength: [0.384, 0.444, 0.504] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_clear - vis_channel_id: 0 - category_id: 1 - coordinates: - - longitude - - latitude - - reflectance_mean_cloudy_vis04: - name: reflectance_mean_cloudy_vis04 - resolution: 32000 - wavelength: [0.384, 0.444, 0.504] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_cloudy - vis_channel_id: 0 - category_id: 2 - coordinates: - - longitude - - latitude - - reflectance_mean_all_vis05: - name: reflectance_mean_all_vis05 - resolution: 32000 - wavelength: [0.47, 0.51, 0.55] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_all - vis_channel_id: 1 - category_id: 0 - coordinates: - - longitude - - latitude - - reflectance_mean_clear_vis05: - name: reflectance_mean_clear_vis05 - resolution: 32000 - wavelength: [0.47, 0.51, 0.55] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_clear - vis_channel_id: 1 - category_id: 1 - coordinates: - - longitude - - latitude - - reflectance_mean_cloudy_vis05: - name: reflectance_mean_cloudy_vis05 - resolution: 32000 - wavelength: [0.47, 0.51, 0.55] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_cloudy - vis_channel_id: 1 - category_id: 2 - coordinates: - - longitude - - latitude - - reflectance_mean_all_vis06: - name: reflectance_mean_all_vis06 - resolution: 32000 - wavelength: [0.59, 0.64, 0.69] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_all - vis_channel_id: 2 - category_id: 0 - coordinates: - - longitude - - latitude - - reflectance_mean_clear_vis06: - name: reflectance_mean_clear_vis06 - resolution: 32000 - wavelength: [0.59, 0.64, 0.69] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_clear - vis_channel_id: 2 - category_id: 1 - coordinates: - - longitude - - latitude - - reflectance_mean_cloudy_vis06: - name: reflectance_mean_cloudy_vis06 - resolution: 32000 - wavelength: [0.59, 0.64, 0.69] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_cloudy - vis_channel_id: 2 - category_id: 2 - coordinates: - - longitude - - latitude - - reflectance_mean_all_vis08: - name: reflectance_mean_all_vis08 - resolution: 32000 - wavelength: [0.815, 0.865, 0.915] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_all - vis_channel_id: 3 - category_id: 0 - coordinates: - - longitude - - latitude - - reflectance_mean_clear_vis08: - name: reflectance_mean_clear_vis08 - resolution: 32000 - wavelength: [0.815, 0.865, 0.915] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_clear - vis_channel_id: 3 - category_id: 1 - coordinates: - - longitude - - latitude - - reflectance_mean_cloudy_vis08: - name: reflectance_mean_cloudy_vis08 - resolution: 32000 - wavelength: [0.815, 0.865, 0.915] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_cloudy - vis_channel_id: 3 - category_id: 2 - coordinates: - - longitude - - latitude - - reflectance_mean_all_vis09: - name: reflectance_mean_all_vis09 - resolution: 32000 - wavelength: [0.894, 0.914, 0.934] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_all - vis_channel_id: 4 - category_id: 0 - coordinates: - - longitude - - latitude - - reflectance_mean_clear_vis09: - name: reflectance_mean_clear_vis09 - resolution: 32000 - wavelength: [0.894, 0.914, 0.934] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_clear - vis_channel_id: 4 - category_id: 1 - coordinates: - - longitude - - latitude - - reflectance_mean_cloudy_vis09: - name: reflectance_mean_cloudy_vis09 - resolution: 32000 - wavelength: [0.894, 0.914, 0.934] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_cloudy - vis_channel_id: 4 - category_id: 2 - coordinates: - - longitude - - latitude - - reflectance_mean_all_nir13: - name: reflectance_mean_all_nir13 + radiance_mean_clear_nir13: + name: radiance_mean_clear_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_all - vis_channel_id: 5 - category_id: 0 - coordinates: - - longitude - - latitude - - reflectance_mean_clear_nir13: - name: reflectance_mean_clear_nir13 - resolution: 32000 - wavelength: [1.35, 1.38, 1.41] - file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_clear - vis_channel_id: 5 + file_key: radiance_mean category_id: 1 + channel_id: 5 + long_name: TOA mean Radiance over clear pixels for nir13 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_cloudy_nir13: - name: reflectance_mean_cloudy_nir13 + radiance_mean_cloudy_nir13: + name: radiance_mean_cloudy_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_cloudy - vis_channel_id: 5 + file_key: radiance_mean category_id: 2 + channel_id: 5 + long_name: TOA mean Radiance over cloudy pixels for nir13 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_all_nir16: - name: reflectance_mean_all_nir16 + radiance_mean_all_nir16: + name: radiance_mean_all_nir16 resolution: 32000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_all - vis_channel_id: 6 + file_key: radiance_mean category_id: 0 + channel_id: 6 + long_name: TOA mean Radiance over all pixels for nir16 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_clear_nir16: - name: reflectance_mean_clear_nir16 + radiance_mean_clear_nir16: + name: radiance_mean_clear_nir16 resolution: 32000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_clear - vis_channel_id: 6 + file_key: radiance_mean category_id: 1 + channel_id: 6 + long_name: TOA mean Radiance over clear pixels for nir16 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_cloudy_nir16: - name: reflectance_mean_cloudy_nir16 + radiance_mean_cloudy_nir16: + name: radiance_mean_cloudy_nir16 resolution: 32000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_cloudy - vis_channel_id: 6 + file_key: radiance_mean category_id: 2 + channel_id: 6 + long_name: TOA mean Radiance over cloudy pixels for nir16 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_all_nir22: - name: reflectance_mean_all_nir22 + radiance_mean_all_nir22: + name: radiance_mean_all_nir22 resolution: 32000 wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_all - vis_channel_id: 7 + file_key: radiance_mean category_id: 0 + channel_id: 7 + long_name: TOA mean Radiance over all pixels for nir22 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_clear_nir22: - name: reflectance_mean_clear_nir22 + radiance_mean_clear_nir22: + name: radiance_mean_clear_nir22 resolution: 32000 wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_clear - vis_channel_id: 7 + file_key: radiance_mean category_id: 1 + channel_id: 7 + long_name: TOA mean Radiance over clear pixels for nir22 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_cloudy_nir22: - name: reflectance_mean_cloudy_nir22 + radiance_mean_cloudy_nir22: + name: radiance_mean_cloudy_nir22 resolution: 32000 wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: reflectance_mean_cloudy - vis_channel_id: 7 + file_key: radiance_mean category_id: 2 + channel_id: 7 + long_name: TOA mean Radiance over cloudy pixels for nir22 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir38: - name: bt_mean_all_ir38 + radiance_mean_all_ir38: + name: radiance_mean_all_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_all - ir_channel_id: 0 + file_key: radiance_mean category_id: 0 + channel_id: 8 + long_name: TOA mean Radiance over all pixels for ir38 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir38: - name: bt_mean_clear_ir38 + radiance_mean_clear_ir38: + name: radiance_mean_clear_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_clear - ir_channel_id: 0 + file_key: radiance_mean category_id: 1 + channel_id: 8 + long_name: TOA mean Radiance over clear pixels for ir38 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir38: - name: bt_mean_cloudy_ir38 + radiance_mean_cloudy_ir38: + name: radiance_mean_cloudy_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_cloudy - ir_channel_id: 0 + file_key: radiance_mean category_id: 2 + channel_id: 8 + long_name: TOA mean Radiance over cloudy pixels for ir38 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_wv63: - name: bt_mean_all_wv63 + radiance_mean_all_wv63: + name: radiance_mean_all_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_all - ir_channel_id: 1 + file_key: radiance_mean category_id: 0 + channel_id: 9 + long_name: TOA mean Radiance over all pixels for wv63 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_wv63: - name: bt_mean_clear_wv63 + radiance_mean_clear_wv63: + name: radiance_mean_clear_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_clear - ir_channel_id: 1 + file_key: radiance_mean category_id: 1 + channel_id: 9 + long_name: TOA mean Radiance over clear pixels for wv63 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_wv63: - name: bt_mean_cloudy_wv63 + radiance_mean_cloudy_wv63: + name: radiance_mean_cloudy_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_cloudy - ir_channel_id: 1 + file_key: radiance_mean category_id: 2 + channel_id: 9 + long_name: TOA mean Radiance over cloudy pixels for wv63 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_wv73: - name: bt_mean_all_wv73 + radiance_mean_all_wv73: + name: radiance_mean_all_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_all - ir_channel_id: 2 + file_key: radiance_mean category_id: 0 + channel_id: 10 + long_name: TOA mean Radiance over all pixels for wv73 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_wv73: - name: bt_mean_clear_wv73 + radiance_mean_clear_wv73: + name: radiance_mean_clear_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_clear - ir_channel_id: 2 + file_key: radiance_mean category_id: 1 + channel_id: 10 + long_name: TOA mean Radiance over clear pixels for wv73 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_wv73: - name: bt_mean_cloudy_wv73 + radiance_mean_cloudy_wv73: + name: radiance_mean_cloudy_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_cloudy - ir_channel_id: 2 + file_key: radiance_mean category_id: 2 + channel_id: 10 + long_name: TOA mean Radiance over cloudy pixels for wv73 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir87: - name: bt_mean_all_ir87 + radiance_mean_all_ir87: + name: radiance_mean_all_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_all - ir_channel_id: 3 + file_key: radiance_mean category_id: 0 + channel_id: 11 + long_name: TOA mean Radiance over all pixels for ir87 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir87: - name: bt_mean_clear_ir87 + radiance_mean_clear_ir87: + name: radiance_mean_clear_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_clear - ir_channel_id: 3 + file_key: radiance_mean category_id: 1 + channel_id: 11 + long_name: TOA mean Radiance over clear pixels for ir87 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir87: - name: bt_mean_cloudy_ir87 + radiance_mean_cloudy_ir87: + name: radiance_mean_cloudy_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_cloudy - ir_channel_id: 3 + file_key: radiance_mean category_id: 2 + channel_id: 11 + long_name: TOA mean Radiance over cloudy pixels for ir87 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir97: - name: bt_mean_all_ir97 + radiance_mean_all_ir97: + name: radiance_mean_all_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_all - ir_channel_id: 4 + file_key: radiance_mean category_id: 0 + channel_id: 12 + long_name: TOA mean Radiance over all pixels for ir97 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir97: - name: bt_mean_clear_ir97 + radiance_mean_clear_ir97: + name: radiance_mean_clear_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_clear - ir_channel_id: 4 + file_key: radiance_mean category_id: 1 + channel_id: 12 + long_name: TOA mean Radiance over clear pixels for ir97 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir97: - name: bt_mean_cloudy_ir97 + radiance_mean_cloudy_ir97: + name: radiance_mean_cloudy_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_cloudy - ir_channel_id: 4 + file_key: radiance_mean category_id: 2 + channel_id: 12 + long_name: TOA mean Radiance over cloudy pixels for ir97 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir105: - name: bt_mean_all_ir105 + radiance_mean_all_ir105: + name: radiance_mean_all_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_all - ir_channel_id: 5 + file_key: radiance_mean category_id: 0 + channel_id: 13 + long_name: TOA mean Radiance over all pixels for ir105 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir105: - name: bt_mean_clear_ir105 + radiance_mean_clear_ir105: + name: radiance_mean_clear_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_clear - ir_channel_id: 5 + file_key: radiance_mean category_id: 1 + channel_id: 13 + long_name: TOA mean Radiance over clear pixels for ir105 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir105: - name: bt_mean_cloudy_ir105 + radiance_mean_cloudy_ir105: + name: radiance_mean_cloudy_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_cloudy - ir_channel_id: 5 + file_key: radiance_mean category_id: 2 + channel_id: 13 + long_name: TOA mean Radiance over cloudy pixels for ir105 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir123: - name: bt_mean_all_ir123 + radiance_mean_all_ir123: + name: radiance_mean_all_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_all - ir_channel_id: 6 + file_key: radiance_mean category_id: 0 + channel_id: 14 + long_name: TOA mean Radiance over all pixels for ir123 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir123: - name: bt_mean_clear_ir123 + radiance_mean_clear_ir123: + name: radiance_mean_clear_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_clear - ir_channel_id: 6 + file_key: radiance_mean category_id: 1 + channel_id: 14 + long_name: TOA mean Radiance over clear pixels for ir123 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir123: - name: bt_mean_cloudy_ir123 + radiance_mean_cloudy_ir123: + name: radiance_mean_cloudy_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_cloudy - ir_channel_id: 6 + file_key: radiance_mean category_id: 2 + channel_id: 14 + long_name: TOA mean Radiance over cloudy pixels for ir123 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir133: - name: bt_mean_all_ir133 + radiance_mean_all_ir133: + name: radiance_mean_all_ir133 resolution: 32000 wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_all - ir_channel_id: 7 + file_key: radiance_mean category_id: 0 + channel_id: 15 + long_name: TOA mean Radiance over all pixels for ir133 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir133: - name: bt_mean_clear_ir133 + radiance_mean_clear_ir133: + name: radiance_mean_clear_ir133 resolution: 32000 wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_clear - ir_channel_id: 7 + file_key: radiance_mean category_id: 1 + channel_id: 15 + long_name: TOA mean Radiance over clear pixels for ir133 channel + standard_name: toa_radiance + cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir133: - name: bt_mean_cloudy_ir133 + radiance_mean_cloudy_ir133: + name: radiance_mean_cloudy_ir133 resolution: 32000 wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: bt_mean - long_name: bt_mean_cloudy - ir_channel_id: 7 + file_key: radiance_mean category_id: 2 + channel_id: 15 + long_name: TOA mean Radiance over cloudy pixels for ir133 channel + standard_name: toa_radiance + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_std: + name: radiance_std + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: radiance_std + long_name: TOA Radiance standard deviation over None pixels for None channel + standard_name: toa_radiance + cell_method: area:standard_deviation + coordinates: + - longitude + - latitude + + radiance_quality: + name: radiance_quality + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: radiance_quality + long_name: TOA Radiance Quality + standard_name: radiance_quality + coordinates: + - longitude + - latitude + + reflectance_min: + name: reflectance_min + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: reflectance_min + long_name: TOA min Reflectance + standard_name: toa_reflectance + cell_method: area:minimum + coordinates: + - longitude + - latitude + + reflectance_max: + name: reflectance_max + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: reflectance_max + long_name: TOA max Reflectance + standard_name: toa_reflectance + cell_method: area:maximum + coordinates: + - longitude + - latitude + + reflectance_mean: + name: reflectance_mean + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: reflectance_mean + long_name: TOA mean Reflectance + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_all_vis04: - name: quality_reflectance_all_vis04 + reflectance_mean_all_vis04: + name: reflectance_mean_all_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_all - vis_channel_id: 0 + file_key: reflectance_mean category_id: 0 - fill_value: -1 + vis_channel_id: 0 + long_name: TOA mean Reflectance over all pixels for vis04 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_clear_vis04: - name: quality_reflectance_clear_vis04 + reflectance_mean_clear_vis04: + name: reflectance_mean_clear_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_clear - vis_channel_id: 0 + file_key: reflectance_mean category_id: 1 - fill_value: -1 + vis_channel_id: 0 + long_name: TOA mean Reflectance over clear pixels for vis04 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_cloudy_vis04: - name: quality_reflectance_cloudy_vis04 + reflectance_mean_cloudy_vis04: + name: reflectance_mean_cloudy_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_cloudy - vis_channel_id: 0 + file_key: reflectance_mean category_id: 2 - fill_value: -1 + vis_channel_id: 0 + long_name: TOA mean Reflectance over cloudy pixels for vis04 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_all_vis05: - name: quality_reflectance_all_vis05 + reflectance_mean_all_vis05: + name: reflectance_mean_all_vis05 resolution: 32000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_all - vis_channel_id: 1 + file_key: reflectance_mean category_id: 0 - fill_value: -1 + vis_channel_id: 1 + long_name: TOA mean Reflectance over all pixels for vis05 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_clear_vis05: - name: quality_reflectance_clear_vis05 + reflectance_mean_clear_vis05: + name: reflectance_mean_clear_vis05 resolution: 32000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_clear - vis_channel_id: 1 + file_key: reflectance_mean category_id: 1 - fill_value: -1 + vis_channel_id: 1 + long_name: TOA mean Reflectance over clear pixels for vis05 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_cloudy_vis05: - name: quality_reflectance_cloudy_vis05 + reflectance_mean_cloudy_vis05: + name: reflectance_mean_cloudy_vis05 resolution: 32000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_cloudy - vis_channel_id: 1 + file_key: reflectance_mean category_id: 2 - fill_value: -1 + vis_channel_id: 1 + long_name: TOA mean Reflectance over cloudy pixels for vis05 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_all_vis06: - name: quality_reflectance_all_vis06 + reflectance_mean_all_vis06: + name: reflectance_mean_all_vis06 resolution: 32000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_all - vis_channel_id: 2 + file_key: reflectance_mean category_id: 0 - fill_value: -1 + vis_channel_id: 2 + long_name: TOA mean Reflectance over all pixels for vis06 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_clear_vis06: - name: quality_reflectance_clear_vis06 + reflectance_mean_clear_vis06: + name: reflectance_mean_clear_vis06 resolution: 32000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_clear - vis_channel_id: 2 + file_key: reflectance_mean category_id: 1 - fill_value: -1 + vis_channel_id: 2 + long_name: TOA mean Reflectance over clear pixels for vis06 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_cloudy_vis06: - name: quality_reflectance_cloudy_vis06 + reflectance_mean_cloudy_vis06: + name: reflectance_mean_cloudy_vis06 resolution: 32000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_cloudy - vis_channel_id: 2 + file_key: reflectance_mean category_id: 2 - fill_value: -1 + vis_channel_id: 2 + long_name: TOA mean Reflectance over cloudy pixels for vis06 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_all_vis08: - name: quality_reflectance_all_vis08 + reflectance_mean_all_vis08: + name: reflectance_mean_all_vis08 resolution: 32000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_all - vis_channel_id: 3 + file_key: reflectance_mean category_id: 0 - fill_value: -1 + vis_channel_id: 3 + long_name: TOA mean Reflectance over all pixels for vis08 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_clear_vis08: - name: quality_reflectance_clear_vis08 + reflectance_mean_clear_vis08: + name: reflectance_mean_clear_vis08 resolution: 32000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_clear - vis_channel_id: 3 + file_key: reflectance_mean category_id: 1 - fill_value: -1 + vis_channel_id: 3 + long_name: TOA mean Reflectance over clear pixels for vis08 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_cloudy_vis08: - name: quality_reflectance_cloudy_vis08 + reflectance_mean_cloudy_vis08: + name: reflectance_mean_cloudy_vis08 resolution: 32000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_cloudy - vis_channel_id: 3 + file_key: reflectance_mean category_id: 2 - fill_value: -1 + vis_channel_id: 3 + long_name: TOA mean Reflectance over cloudy pixels for vis08 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_all_vis09: - name: quality_reflectance_all_vis09 + reflectance_mean_all_vis09: + name: reflectance_mean_all_vis09 resolution: 32000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_all - vis_channel_id: 4 + file_key: reflectance_mean category_id: 0 - fill_value: -1 + vis_channel_id: 4 + long_name: TOA mean Reflectance over all pixels for vis09 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_clear_vis09: - name: quality_reflectance_clear_vis09 + reflectance_mean_clear_vis09: + name: reflectance_mean_clear_vis09 resolution: 32000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_clear - vis_channel_id: 4 + file_key: reflectance_mean category_id: 1 - fill_value: -1 + vis_channel_id: 4 + long_name: TOA mean Reflectance over clear pixels for vis09 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_cloudy_vis09: - name: quality_reflectance_cloudy_vis09 + reflectance_mean_cloudy_vis09: + name: reflectance_mean_cloudy_vis09 resolution: 32000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_cloudy - vis_channel_id: 4 + file_key: reflectance_mean category_id: 2 - fill_value: -1 + vis_channel_id: 4 + long_name: TOA mean Reflectance over cloudy pixels for vis09 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_all_nir13: - name: quality_reflectance_all_nir13 + reflectance_mean_all_nir13: + name: reflectance_mean_all_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_all - vis_channel_id: 5 + file_key: reflectance_mean category_id: 0 - fill_value: -1 + vis_channel_id: 5 + long_name: TOA mean Reflectance over all pixels for nir13 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_clear_nir13: - name: quality_reflectance_clear_nir13 + reflectance_mean_clear_nir13: + name: reflectance_mean_clear_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_clear - vis_channel_id: 5 + file_key: reflectance_mean category_id: 1 - fill_value: -1 + vis_channel_id: 5 + long_name: TOA mean Reflectance over clear pixels for nir13 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_cloudy_nir13: - name: quality_reflectance_cloudy_nir13 + reflectance_mean_cloudy_nir13: + name: reflectance_mean_cloudy_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_cloudy - vis_channel_id: 5 + file_key: reflectance_mean category_id: 2 - fill_value: -1 + vis_channel_id: 5 + long_name: TOA mean Reflectance over cloudy pixels for nir13 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_all_nir16: - name: quality_reflectance_all_nir16 + reflectance_mean_all_nir16: + name: reflectance_mean_all_nir16 resolution: 32000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_all - vis_channel_id: 6 + file_key: reflectance_mean category_id: 0 - fill_value: -1 + vis_channel_id: 6 + long_name: TOA mean Reflectance over all pixels for nir16 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_clear_nir16: - name: quality_reflectance_clear_nir16 + reflectance_mean_clear_nir16: + name: reflectance_mean_clear_nir16 resolution: 32000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_clear - vis_channel_id: 6 + file_key: reflectance_mean category_id: 1 - fill_value: -1 + vis_channel_id: 6 + long_name: TOA mean Reflectance over clear pixels for nir16 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_cloudy_nir16: - name: quality_reflectance_cloudy_nir16 + reflectance_mean_cloudy_nir16: + name: reflectance_mean_cloudy_nir16 resolution: 32000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_cloudy - vis_channel_id: 6 + file_key: reflectance_mean category_id: 2 - fill_value: -1 + vis_channel_id: 6 + long_name: TOA mean Reflectance over cloudy pixels for nir16 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_all_nir22: - name: quality_reflectance_all_nir22 + reflectance_mean_all_nir22: + name: reflectance_mean_all_nir22 resolution: 32000 wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_all - vis_channel_id: 7 + file_key: reflectance_mean category_id: 0 - fill_value: -1 + vis_channel_id: 7 + long_name: TOA mean Reflectance over all pixels for nir22 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_clear_nir22: - name: quality_reflectance_clear_nir22 + reflectance_mean_clear_nir22: + name: reflectance_mean_clear_nir22 resolution: 32000 wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_clear - vis_channel_id: 7 + file_key: reflectance_mean category_id: 1 - fill_value: -1 + vis_channel_id: 7 + long_name: TOA mean Reflectance over clear pixels for nir22 channel + standard_name: toa_reflectance + cell_method: area:mean coordinates: - longitude - latitude - quality_reflectance_cloudy_nir22: - name: quality_reflectance_cloudy_nir22 + reflectance_mean_cloudy_nir22: + name: reflectance_mean_cloudy_nir22 resolution: 32000 wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: quality_reflectance - long_name: quality_reflectance_cloudy - vis_channel_id: 7 + file_key: reflectance_mean category_id: 2 - fill_value: -1 + vis_channel_id: 7 + long_name: TOA mean Reflectance over cloudy pixels for nir22 channel + standard_name: toa_reflectance + cell_method: area:mean + coordinates: + - longitude + - latitude + + reflectance_std: + name: reflectance_std + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: reflectance_std + long_name: TOA Reflectance standard deviation + standard_name: toa_reflectance + cell_method: area:standard_deviation + coordinates: + - longitude + - latitude + + reflectance_quality: + name: reflectance_quality + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: reflectance_quality + long_name: TOA Reflectance Quality + standard_name: reflectance_quality + coordinates: + - longitude + - latitude + + bt_min: + name: bt_min + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: bt_min + long_name: TOA min Brightess Temperature + standard_name: toa_brightess_temperature + cell_method: area:minimum + coordinates: + - longitude + - latitude + + bt_max: + name: bt_max + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: bt_max + long_name: TOA max Brightess Temperature + standard_name: toa_brightess_temperature + cell_method: area:maximum + coordinates: + - longitude + - latitude + + bt_mean: + name: bt_mean + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: bt_mean + long_name: TOA mean Brightess Temperature + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_all_ir38: - name: quality_bt_all_ir38 + bt_mean_all_ir38: + name: bt_mean_all_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_all - ir_channel_id: 0 + file_key: bt_mean category_id: 0 - fill_value: -1 + ir_channel_id: 0 + long_name: TOA mean Brightess Temperature over all pixels for ir38 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_clear_ir38: - name: quality_bt_clear_ir38 + bt_mean_clear_ir38: + name: bt_mean_clear_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_clear - ir_channel_id: 0 + file_key: bt_mean category_id: 1 - fill_value: -1 + ir_channel_id: 0 + long_name: TOA mean Brightess Temperature over clear pixels for ir38 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_cloudy_ir38: - name: quality_bt_cloudy_ir38 + bt_mean_cloudy_ir38: + name: bt_mean_cloudy_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_cloudy - ir_channel_id: 0 + file_key: bt_mean category_id: 2 - fill_value: -1 + ir_channel_id: 0 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir38 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_all_wv63: - name: quality_bt_all_wv63 + bt_mean_all_wv63: + name: bt_mean_all_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_all - ir_channel_id: 1 + file_key: bt_mean category_id: 0 - fill_value: -1 + ir_channel_id: 1 + long_name: TOA mean Brightess Temperature over all pixels for wv63 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_clear_wv63: - name: quality_bt_clear_wv63 + bt_mean_clear_wv63: + name: bt_mean_clear_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_clear - ir_channel_id: 1 + file_key: bt_mean category_id: 1 - fill_value: -1 + ir_channel_id: 1 + long_name: TOA mean Brightess Temperature over clear pixels for wv63 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_cloudy_wv63: - name: quality_bt_cloudy_wv63 + bt_mean_cloudy_wv63: + name: bt_mean_cloudy_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_cloudy - ir_channel_id: 1 + file_key: bt_mean category_id: 2 - fill_value: -1 + ir_channel_id: 1 + long_name: TOA mean Brightess Temperature over cloudy pixels for wv63 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_all_wv73: - name: quality_bt_all_wv73 + bt_mean_all_wv73: + name: bt_mean_all_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_all - ir_channel_id: 2 + file_key: bt_mean category_id: 0 - fill_value: -1 + ir_channel_id: 2 + long_name: TOA mean Brightess Temperature over all pixels for wv73 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_clear_wv73: - name: quality_bt_clear_wv73 + bt_mean_clear_wv73: + name: bt_mean_clear_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_clear - ir_channel_id: 2 + file_key: bt_mean category_id: 1 - fill_value: -1 + ir_channel_id: 2 + long_name: TOA mean Brightess Temperature over clear pixels for wv73 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_cloudy_wv73: - name: quality_bt_cloudy_wv73 + bt_mean_cloudy_wv73: + name: bt_mean_cloudy_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_cloudy - ir_channel_id: 2 + file_key: bt_mean category_id: 2 - fill_value: -1 + ir_channel_id: 2 + long_name: TOA mean Brightess Temperature over cloudy pixels for wv73 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_all_ir87: - name: quality_bt_all_ir87 + bt_mean_all_ir87: + name: bt_mean_all_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_all - ir_channel_id: 3 + file_key: bt_mean category_id: 0 - fill_value: -1 + ir_channel_id: 3 + long_name: TOA mean Brightess Temperature over all pixels for ir87 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_clear_ir87: - name: quality_bt_clear_ir87 + bt_mean_clear_ir87: + name: bt_mean_clear_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_clear - ir_channel_id: 3 + file_key: bt_mean category_id: 1 - fill_value: -1 + ir_channel_id: 3 + long_name: TOA mean Brightess Temperature over clear pixels for ir87 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_cloudy_ir87: - name: quality_bt_cloudy_ir87 + bt_mean_cloudy_ir87: + name: bt_mean_cloudy_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_cloudy - ir_channel_id: 3 + file_key: bt_mean category_id: 2 - fill_value: -1 + ir_channel_id: 3 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir87 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_all_ir97: - name: quality_bt_all_ir97 + bt_mean_all_ir97: + name: bt_mean_all_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_all - ir_channel_id: 4 + file_key: bt_mean category_id: 0 - fill_value: -1 + ir_channel_id: 4 + long_name: TOA mean Brightess Temperature over all pixels for ir97 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_clear_ir97: - name: quality_bt_clear_ir97 + bt_mean_clear_ir97: + name: bt_mean_clear_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_clear - ir_channel_id: 4 + file_key: bt_mean category_id: 1 - fill_value: -1 + ir_channel_id: 4 + long_name: TOA mean Brightess Temperature over clear pixels for ir97 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_cloudy_ir97: - name: quality_bt_cloudy_ir97 + bt_mean_cloudy_ir97: + name: bt_mean_cloudy_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_cloudy - ir_channel_id: 4 + file_key: bt_mean category_id: 2 - fill_value: -1 + ir_channel_id: 4 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir97 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_all_ir105: - name: quality_bt_all_ir105 + bt_mean_all_ir105: + name: bt_mean_all_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_all - ir_channel_id: 5 + file_key: bt_mean category_id: 0 - fill_value: -1 + ir_channel_id: 5 + long_name: TOA mean Brightess Temperature over all pixels for ir105 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_clear_ir105: - name: quality_bt_clear_ir105 + bt_mean_clear_ir105: + name: bt_mean_clear_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_clear - ir_channel_id: 5 + file_key: bt_mean category_id: 1 - fill_value: -1 + ir_channel_id: 5 + long_name: TOA mean Brightess Temperature over clear pixels for ir105 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_cloudy_ir105: - name: quality_bt_cloudy_ir105 + bt_mean_cloudy_ir105: + name: bt_mean_cloudy_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_cloudy - ir_channel_id: 5 + file_key: bt_mean category_id: 2 - fill_value: -1 + ir_channel_id: 5 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir105 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_all_ir123: - name: quality_bt_all_ir123 + bt_mean_all_ir123: + name: bt_mean_all_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_all - ir_channel_id: 6 + file_key: bt_mean category_id: 0 - fill_value: -1 + ir_channel_id: 6 + long_name: TOA mean Brightess Temperature over all pixels for ir123 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_clear_ir123: - name: quality_bt_clear_ir123 + bt_mean_clear_ir123: + name: bt_mean_clear_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_clear - ir_channel_id: 6 + file_key: bt_mean category_id: 1 - fill_value: -1 + ir_channel_id: 6 + long_name: TOA mean Brightess Temperature over clear pixels for ir123 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_cloudy_ir123: - name: quality_bt_cloudy_ir123 + bt_mean_cloudy_ir123: + name: bt_mean_cloudy_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_cloudy - ir_channel_id: 6 + file_key: bt_mean category_id: 2 - fill_value: -1 + ir_channel_id: 6 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir123 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_all_ir133: - name: quality_bt_all_ir133 + bt_mean_all_ir133: + name: bt_mean_all_ir133 resolution: 32000 wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_all - ir_channel_id: 7 + file_key: bt_mean category_id: 0 - fill_value: -1 + ir_channel_id: 7 + long_name: TOA mean Brightess Temperature over all pixels for ir133 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_clear_ir133: - name: quality_bt_clear_ir133 + bt_mean_clear_ir133: + name: bt_mean_clear_ir133 resolution: 32000 wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_clear - ir_channel_id: 7 + file_key: bt_mean category_id: 1 - fill_value: -1 + ir_channel_id: 7 + long_name: TOA mean Brightess Temperature over clear pixels for ir133 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - quality_bt_cloudy_ir133: - name: quality_bt_cloudy_ir133 + bt_mean_cloudy_ir133: + name: bt_mean_cloudy_ir133 resolution: 32000 wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: quality_bt - long_name: quality_bt_cloudy - ir_channel_id: 7 + file_key: bt_mean category_id: 2 - fill_value: -1 + ir_channel_id: 7 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir133 channel + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - pixel_percentage_all: - name: pixel_percentage_all + bt_std: + name: bt_std resolution: 32000 + wavelength: [] file_type: nc_fci_asr - file_key: pixel_percentage - long_name: pixel_percentage_all - category_id: 0 + file_key: bt_std + long_name: TOA Brightess Temperature standard deviation + standard_name: toa_brightess_temperature + cell_method: area:standard_deviation coordinates: - longitude - latitude - pixel_percentage_clear: - name: pixel_percentage_clear + bt_quality: + name: bt_quality resolution: 32000 + wavelength: [] file_type: nc_fci_asr - file_key: pixel_percentage - long_name: pixel_percentage_clear - category_id: 1 + file_key: bt_quality + long_name: TOA Brightess Temperature Quality + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - pixel_percentage_cloudy: - name: pixel_percentage_cloudy + pixel_percentage: + name: pixel_percentage resolution: 32000 file_type: nc_fci_asr file_key: pixel_percentage - long_name: pixel_percentage_cloudy - category_id: 2 + standard_name: pixels_used_fraction + coordinates: + - longitude + - latitude + + land_pixel_percent: + name: land_pixel_percent + resolution: 32000 + file_type: nc_fci_asr + file_key: land_pixel_percent + standard_name: land_area_fraction + coordinates: + - longitude + - latitude + + water_pixel_percent: + name: water_pixel_percent + resolution: 32000 + file_type: nc_fci_asr + file_key: water_pixel_percent + standard_name: water_area_fraction coordinates: - longitude - latitude @@ -2735,19 +2971,19 @@ datasets: name: product_quality_asr file_type: nc_fci_asr file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness_asr: name: product_completeness_asr file_type: nc_fci_asr file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness_asr: name: product_timeliness_asr file_type: nc_fci_asr file_key: product_timeliness - long_name: product_timeliness_index + standard_name: product_timeliness # AMV Intermediate Product intm_latitude: @@ -2992,16 +3228,16 @@ datasets: name: product_quality file_type: nc_fci_amv file_key: product_quality - long_name: product_quality_index + standard_name: product_quality product_completeness: name: product_completeness file_type: nc_fci_amv file_key: product_completeness - long_name: product_completeness_index + standard_name: product_completeness product_timeliness: name: product_timeliness file_type: nc_fci_amv file_key: product_timeliness - long_name: product_timeliness_index + standard_name: product_timeliness From b6a3523940fbc798de2eac7b22613aa129c550f1 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 4 Dec 2023 11:41:47 +0100 Subject: [PATCH 094/481] remove unnecessary wavelength attributes --- satpy/etc/readers/fci_l2_nc.yaml | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index ba8d3b1c46..e5f52a29ae 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1308,7 +1308,6 @@ datasets: radiance_min: name: radiance_min resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: radiance_min long_name: TOA min Radiance @@ -1321,7 +1320,6 @@ datasets: radiance_max: name: radiance_max resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: radiance_max long_name: TOA max Radiance @@ -1334,7 +1332,6 @@ datasets: radiance_mean: name: radiance_mean resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: radiance_mean long_name: TOA mean Radiance @@ -2067,7 +2064,7 @@ datasets: radiance_std: name: radiance_std resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: radiance_std long_name: TOA Radiance standard deviation over None pixels for None channel @@ -2080,7 +2077,7 @@ datasets: radiance_quality: name: radiance_quality resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: radiance_quality long_name: TOA Radiance Quality @@ -2092,7 +2089,7 @@ datasets: reflectance_min: name: reflectance_min resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: reflectance_min long_name: TOA min Reflectance @@ -2105,7 +2102,7 @@ datasets: reflectance_max: name: reflectance_max resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: reflectance_max long_name: TOA max Reflectance @@ -2118,7 +2115,7 @@ datasets: reflectance_mean: name: reflectance_mean resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: reflectance_mean long_name: TOA mean Reflectance @@ -2491,7 +2488,7 @@ datasets: reflectance_std: name: reflectance_std resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: reflectance_std long_name: TOA Reflectance standard deviation @@ -2504,7 +2501,7 @@ datasets: reflectance_quality: name: reflectance_quality resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: reflectance_quality long_name: TOA Reflectance Quality @@ -2516,7 +2513,7 @@ datasets: bt_min: name: bt_min resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: bt_min long_name: TOA min Brightess Temperature @@ -2529,7 +2526,7 @@ datasets: bt_max: name: bt_max resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: bt_max long_name: TOA max Brightess Temperature @@ -2542,7 +2539,7 @@ datasets: bt_mean: name: bt_mean resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: bt_mean long_name: TOA mean Brightess Temperature @@ -2915,7 +2912,7 @@ datasets: bt_std: name: bt_std resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: bt_std long_name: TOA Brightess Temperature standard deviation @@ -2928,7 +2925,7 @@ datasets: bt_quality: name: bt_quality resolution: 32000 - wavelength: [] + wavelength: [0,0,0] file_type: nc_fci_asr file_key: bt_quality long_name: TOA Brightess Temperature Quality From 6c310634f54f0d017f3d338d896315ea8596a7fe Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Tue, 12 Dec 2023 17:43:48 +0100 Subject: [PATCH 095/481] Various fixes --- satpy/etc/readers/fci_l2_nc.yaml | 34 ++++++++------------------------ satpy/readers/fci_l2_nc.py | 27 +++++++++++++++---------- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index e5f52a29ae..df5111334a 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1194,7 +1194,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 15 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Opaqueness undetected','Opaqueness detected'] standard_name: status_flag cloud_test_cmrt1: @@ -1214,7 +1214,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 17 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Clear unchanged','Cloud detected'] standard_name: status_flag cloud_test_cmrt3: @@ -1224,7 +1224,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 18 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Clear unchanged','Cloud detected'] standard_name: status_flag cloud_test_cmrt4: @@ -1234,7 +1234,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 19 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Clear unchanged','Cloud detected'] standard_name: status_flag cloud_test_cmrt5: @@ -1244,7 +1244,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 20 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Cloud undetected','Cloud unchanged'] standard_name: status_flag cloud_test_dust: @@ -1254,7 +1254,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 21 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Dust undetected','Dust detected'] standard_name: status_flag cloud_test_ash: @@ -1264,7 +1264,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 22 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Ash undetected','Ash detected'] standard_name: status_flag cloud_test_dust_ash: @@ -1274,7 +1274,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 23 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Dust detected','Ash detected'] standard_name: status_flag cloud_test_cmrt6: @@ -1286,24 +1286,6 @@ datasets: standard_name: status_flag import_enum_information: True - product_quality_clmtest: - name: product_quality_clmtest - file_type: nc_fci_test_clm - file_key: product_quality - standard_name: product_quality - - product_completeness_clmtest: - name: product_completeness_clmtest - file_type: nc_fci_test_clm - file_key: product_completeness - standard_name: product_completeness - - product_timeliness_clmtest: - name: product_timeliness_clmtest - file_type: nc_fci_test_clm - file_key: product_timeliness - standard_name: product_timeliness - # ASR radiance_min: name: radiance_min diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index 83f560c35a..d5b6ce95bb 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -18,9 +18,9 @@ import logging from contextlib import suppress +import netCDF4 import numpy as np import xarray as xr -import netCDF4 from pyresample import geometry from satpy._compat import cached_property @@ -92,22 +92,29 @@ def _set_attributes(self, variable, dataset_info, segmented=False): variable = variable.rename({ydim: "y", xdim: "x"}) variable.attrs.setdefault("units", None) + if "unit" in variable.attrs: + # Need to convert this attribute to the expected satpy entry + variable.attrs.update({"units": variable.attrs["unit"]}) + del variable.attrs["unit"] + variable.attrs.update(dataset_info) variable.attrs.update(self._get_global_attributes()) - - if ('import_enum_information' in dataset_info): - if (dataset_info['import_enum_information']): - netCDF4_dataset = netCDF4.Dataset(self.filename, 'r') - # This currently assumes a flat netCDF file - enum = netCDF4_dataset.variables[dataset_info['file_key']].datatype.enum_dict + + import_enum_information = dataset_info.get("import_enum_information", False) + if (import_enum_information): + netCDF4_dataset = netCDF4.Dataset(self.filename, "r") + # This currently assumes a flat netCDF file + dataType=netCDF4_dataset.variables[dataset_info["file_key"]].datatype + if (hasattr(dataType,"enum_dict")): + enum = dataType.enum_dict flag_values = [] flag_meanings = [] for item in enumerate(enum): flag_values.append(item[0]) flag_meanings.append(item[1]) - - variable.attrs['flag_values'] = flag_values - variable.attrs['flag_meanings'] = flag_meanings + + variable.attrs["flag_values"] = flag_values + variable.attrs["flag_meanings"] = flag_meanings netCDF4_dataset.close() return variable From 0c79715fdd67159d9efd454797ed763a90c39851 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Wed, 13 Dec 2023 17:25:16 +0100 Subject: [PATCH 096/481] Fix ASR long names --- satpy/etc/readers/fci_l2_nc.yaml | 434 +++++++++++++++---------------- 1 file changed, 217 insertions(+), 217 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index df5111334a..a7d64d5f53 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1292,7 +1292,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_min - long_name: TOA min Radiance + long_name: TOA Radiance segment min standard_name: toa_radiance cell_method: area:minimum coordinates: @@ -1304,7 +1304,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_max - long_name: TOA max Radiance + long_name: TOA Radiance segment max standard_name: toa_radiance cell_method: area:maximum coordinates: @@ -1316,7 +1316,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_mean - long_name: TOA mean Radiance + long_name: TOA Radiance segment mean standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1329,9 +1329,9 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 0 - long_name: TOA mean Radiance over all pixels for vis04 channel + category_id: 0 + long_name: TOA Radiance segment mean at 0.4um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1344,9 +1344,9 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 0 - long_name: TOA mean Radiance over clear pixels for vis04 channel + category_id: 1 + long_name: TOA Radiance segment mean at 0.4um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1359,9 +1359,9 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 0 - long_name: TOA mean Radiance over cloudy pixels for vis04 channel + category_id: 2 + long_name: TOA Radiance segment mean at 0.4um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1374,9 +1374,9 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 1 - long_name: TOA mean Radiance over all pixels for vis05 channel + category_id: 0 + long_name: TOA Radiance segment mean at 0.5um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1389,9 +1389,9 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 1 - long_name: TOA mean Radiance over clear pixels for vis05 channel + category_id: 1 + long_name: TOA Radiance segment mean at 0.5um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1404,9 +1404,9 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 1 - long_name: TOA mean Radiance over cloudy pixels for vis05 channel + category_id: 2 + long_name: TOA Radiance segment mean at 0.5um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1419,9 +1419,9 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 2 - long_name: TOA mean Radiance over all pixels for vis06 channel + category_id: 0 + long_name: TOA Radiance segment mean at 0.6um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1434,9 +1434,9 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 2 - long_name: TOA mean Radiance over clear pixels for vis06 channel + category_id: 1 + long_name: TOA Radiance segment mean at 0.6um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1449,9 +1449,9 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 2 - long_name: TOA mean Radiance over cloudy pixels for vis06 channel + category_id: 2 + long_name: TOA Radiance segment mean at 0.6um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1464,9 +1464,9 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 3 - long_name: TOA mean Radiance over all pixels for vis08 channel + category_id: 0 + long_name: TOA Radiance segment mean at 0.9um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1479,9 +1479,9 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 3 - long_name: TOA mean Radiance over clear pixels for vis08 channel + category_id: 1 + long_name: TOA Radiance segment mean at 0.9um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1494,9 +1494,9 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 3 - long_name: TOA mean Radiance over cloudy pixels for vis08 channel + category_id: 2 + long_name: TOA Radiance segment mean at 0.9um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1509,9 +1509,9 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 4 - long_name: TOA mean Radiance over all pixels for vis09 channel + category_id: 0 + long_name: TOA Radiance segment mean at 0.9um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1524,9 +1524,9 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 4 - long_name: TOA mean Radiance over clear pixels for vis09 channel + category_id: 1 + long_name: TOA Radiance segment mean at 0.9um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1539,9 +1539,9 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 4 - long_name: TOA mean Radiance over cloudy pixels for vis09 channel + category_id: 2 + long_name: TOA Radiance segment mean at 0.9um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1554,9 +1554,9 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 5 - long_name: TOA mean Radiance over all pixels for nir13 channel + category_id: 0 + long_name: TOA Radiance segment mean at 1.4um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1569,9 +1569,9 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 5 - long_name: TOA mean Radiance over clear pixels for nir13 channel + category_id: 1 + long_name: TOA Radiance segment mean at 1.4um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1584,9 +1584,9 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 5 - long_name: TOA mean Radiance over cloudy pixels for nir13 channel + category_id: 2 + long_name: TOA Radiance segment mean at 1.4um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1599,9 +1599,9 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 6 - long_name: TOA mean Radiance over all pixels for nir16 channel + category_id: 0 + long_name: TOA Radiance segment mean at 1.6um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1614,9 +1614,9 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 6 - long_name: TOA mean Radiance over clear pixels for nir16 channel + category_id: 1 + long_name: TOA Radiance segment mean at 1.6um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1629,9 +1629,9 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 6 - long_name: TOA mean Radiance over cloudy pixels for nir16 channel + category_id: 2 + long_name: TOA Radiance segment mean at 1.6um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1644,9 +1644,9 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 7 - long_name: TOA mean Radiance over all pixels for nir22 channel + category_id: 0 + long_name: TOA Radiance segment mean at 2.2um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1659,9 +1659,9 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 7 - long_name: TOA mean Radiance over clear pixels for nir22 channel + category_id: 1 + long_name: TOA Radiance segment mean at 2.2um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1674,9 +1674,9 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 7 - long_name: TOA mean Radiance over cloudy pixels for nir22 channel + category_id: 2 + long_name: TOA Radiance segment mean at 2.2um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1689,9 +1689,9 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 8 - long_name: TOA mean Radiance over all pixels for ir38 channel + category_id: 0 + long_name: TOA Radiance segment mean at 3.8um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1704,9 +1704,9 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 8 - long_name: TOA mean Radiance over clear pixels for ir38 channel + category_id: 1 + long_name: TOA Radiance segment mean at 3.8um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1719,9 +1719,9 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 8 - long_name: TOA mean Radiance over cloudy pixels for ir38 channel + category_id: 2 + long_name: TOA Radiance segment mean at 3.8um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1734,9 +1734,9 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 9 - long_name: TOA mean Radiance over all pixels for wv63 channel + category_id: 0 + long_name: TOA Radiance segment mean at 6.3um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1749,9 +1749,9 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 9 - long_name: TOA mean Radiance over clear pixels for wv63 channel + category_id: 1 + long_name: TOA Radiance segment mean at 6.3um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1764,9 +1764,9 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 9 - long_name: TOA mean Radiance over cloudy pixels for wv63 channel + category_id: 2 + long_name: TOA Radiance segment mean at 6.3um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1779,9 +1779,9 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 10 - long_name: TOA mean Radiance over all pixels for wv73 channel + category_id: 0 + long_name: TOA Radiance segment mean at 7.3um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1794,9 +1794,9 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 10 - long_name: TOA mean Radiance over clear pixels for wv73 channel + category_id: 1 + long_name: TOA Radiance segment mean at 7.3um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1809,9 +1809,9 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 10 - long_name: TOA mean Radiance over cloudy pixels for wv73 channel + category_id: 2 + long_name: TOA Radiance segment mean at 7.3um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1824,9 +1824,9 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 11 - long_name: TOA mean Radiance over all pixels for ir87 channel + category_id: 0 + long_name: TOA Radiance segment mean at 8.7um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1839,9 +1839,9 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 11 - long_name: TOA mean Radiance over clear pixels for ir87 channel + category_id: 1 + long_name: TOA Radiance segment mean at 8.7um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1854,9 +1854,9 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 11 - long_name: TOA mean Radiance over cloudy pixels for ir87 channel + category_id: 2 + long_name: TOA Radiance segment mean at 8.7um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1869,9 +1869,9 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 12 - long_name: TOA mean Radiance over all pixels for ir97 channel + category_id: 0 + long_name: TOA Radiance segment mean at 9.7um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1884,9 +1884,9 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 12 - long_name: TOA mean Radiance over clear pixels for ir97 channel + category_id: 1 + long_name: TOA Radiance segment mean at 9.7um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1899,9 +1899,9 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 12 - long_name: TOA mean Radiance over cloudy pixels for ir97 channel + category_id: 2 + long_name: TOA Radiance segment mean at 9.7um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1914,9 +1914,9 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 13 - long_name: TOA mean Radiance over all pixels for ir105 channel + category_id: 0 + long_name: TOA Radiance segment mean at 10.5um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1929,9 +1929,9 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 13 - long_name: TOA mean Radiance over clear pixels for ir105 channel + category_id: 1 + long_name: TOA Radiance segment mean at 10.5um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1944,9 +1944,9 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 13 - long_name: TOA mean Radiance over cloudy pixels for ir105 channel + category_id: 2 + long_name: TOA Radiance segment mean at 10.5um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1959,9 +1959,9 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 14 - long_name: TOA mean Radiance over all pixels for ir123 channel + category_id: 0 + long_name: TOA Radiance segment mean at 12.3um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1974,9 +1974,9 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 14 - long_name: TOA mean Radiance over clear pixels for ir123 channel + category_id: 1 + long_name: TOA Radiance segment mean at 12.3um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1989,9 +1989,9 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 14 - long_name: TOA mean Radiance over cloudy pixels for ir123 channel + category_id: 2 + long_name: TOA Radiance segment mean at 12.3um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -2004,9 +2004,9 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: radiance_mean - category_id: 0 channel_id: 15 - long_name: TOA mean Radiance over all pixels for ir133 channel + category_id: 0 + long_name: TOA Radiance segment mean at 13.3um (all pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -2019,9 +2019,9 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: radiance_mean - category_id: 1 channel_id: 15 - long_name: TOA mean Radiance over clear pixels for ir133 channel + category_id: 1 + long_name: TOA Radiance segment mean at 13.3um (clear pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -2034,9 +2034,9 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: radiance_mean - category_id: 2 channel_id: 15 - long_name: TOA mean Radiance over cloudy pixels for ir133 channel + category_id: 2 + long_name: TOA Radiance segment mean at 13.3um (cloudy pixels) standard_name: toa_radiance cell_method: area:mean coordinates: @@ -2046,10 +2046,10 @@ datasets: radiance_std: name: radiance_std resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: radiance_std - long_name: TOA Radiance standard deviation over None pixels for None channel + long_name: TOA Radiance standard deviation standard_name: toa_radiance cell_method: area:standard_deviation coordinates: @@ -2059,10 +2059,10 @@ datasets: radiance_quality: name: radiance_quality resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: radiance_quality - long_name: TOA Radiance Quality + long_name: TOA Radiance % confidence standard_name: radiance_quality coordinates: - longitude @@ -2071,10 +2071,10 @@ datasets: reflectance_min: name: reflectance_min resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: reflectance_min - long_name: TOA min Reflectance + long_name: TOA Reflectance segment min standard_name: toa_reflectance cell_method: area:minimum coordinates: @@ -2084,10 +2084,10 @@ datasets: reflectance_max: name: reflectance_max resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: reflectance_max - long_name: TOA max Reflectance + long_name: TOA Reflectance segment max standard_name: toa_reflectance cell_method: area:maximum coordinates: @@ -2097,10 +2097,10 @@ datasets: reflectance_mean: name: reflectance_mean resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: reflectance_mean - long_name: TOA mean Reflectance + long_name: TOA Reflectance segment mean standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2113,9 +2113,9 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 0 vis_channel_id: 0 - long_name: TOA mean Reflectance over all pixels for vis04 channel + category_id: 0 + long_name: TOA Reflectance segment mean at 0.4um (all pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2128,9 +2128,9 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 1 vis_channel_id: 0 - long_name: TOA mean Reflectance over clear pixels for vis04 channel + category_id: 1 + long_name: TOA Reflectance segment mean at 0.4um (clear pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2143,9 +2143,9 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 2 vis_channel_id: 0 - long_name: TOA mean Reflectance over cloudy pixels for vis04 channel + category_id: 2 + long_name: TOA Reflectance segment mean at 0.4um (cloudy pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2158,9 +2158,9 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 0 vis_channel_id: 1 - long_name: TOA mean Reflectance over all pixels for vis05 channel + category_id: 0 + long_name: TOA Reflectance segment mean at 0.5um (all pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2173,9 +2173,9 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 1 vis_channel_id: 1 - long_name: TOA mean Reflectance over clear pixels for vis05 channel + category_id: 1 + long_name: TOA Reflectance segment mean at 0.5um (clear pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2188,9 +2188,9 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 2 vis_channel_id: 1 - long_name: TOA mean Reflectance over cloudy pixels for vis05 channel + category_id: 2 + long_name: TOA Reflectance segment mean at 0.5um (cloudy pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2203,9 +2203,9 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 0 vis_channel_id: 2 - long_name: TOA mean Reflectance over all pixels for vis06 channel + category_id: 0 + long_name: TOA Reflectance segment mean at 0.6um (all pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2218,9 +2218,9 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 1 vis_channel_id: 2 - long_name: TOA mean Reflectance over clear pixels for vis06 channel + category_id: 1 + long_name: TOA Reflectance segment mean at 0.6um (clear pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2233,9 +2233,9 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 2 vis_channel_id: 2 - long_name: TOA mean Reflectance over cloudy pixels for vis06 channel + category_id: 2 + long_name: TOA Reflectance segment mean at 0.6um (cloudy pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2248,9 +2248,9 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 0 vis_channel_id: 3 - long_name: TOA mean Reflectance over all pixels for vis08 channel + category_id: 0 + long_name: TOA Reflectance segment mean at 0.9um (all pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2263,9 +2263,9 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 1 vis_channel_id: 3 - long_name: TOA mean Reflectance over clear pixels for vis08 channel + category_id: 1 + long_name: TOA Reflectance segment mean at 0.9um (clear pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2278,9 +2278,9 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 2 vis_channel_id: 3 - long_name: TOA mean Reflectance over cloudy pixels for vis08 channel + category_id: 2 + long_name: TOA Reflectance segment mean at 0.9um (cloudy pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2293,9 +2293,9 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 0 vis_channel_id: 4 - long_name: TOA mean Reflectance over all pixels for vis09 channel + category_id: 0 + long_name: TOA Reflectance segment mean at 0.9um (all pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2308,9 +2308,9 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 1 vis_channel_id: 4 - long_name: TOA mean Reflectance over clear pixels for vis09 channel + category_id: 1 + long_name: TOA Reflectance segment mean at 0.9um (clear pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2323,9 +2323,9 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 2 vis_channel_id: 4 - long_name: TOA mean Reflectance over cloudy pixels for vis09 channel + category_id: 2 + long_name: TOA Reflectance segment mean at 0.9um (cloudy pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2338,9 +2338,9 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 0 vis_channel_id: 5 - long_name: TOA mean Reflectance over all pixels for nir13 channel + category_id: 0 + long_name: TOA Reflectance segment mean at 1.4um (all pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2353,9 +2353,9 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 1 vis_channel_id: 5 - long_name: TOA mean Reflectance over clear pixels for nir13 channel + category_id: 1 + long_name: TOA Reflectance segment mean at 1.4um (clear pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2368,9 +2368,9 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 2 vis_channel_id: 5 - long_name: TOA mean Reflectance over cloudy pixels for nir13 channel + category_id: 2 + long_name: TOA Reflectance segment mean at 1.4um (cloudy pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2383,9 +2383,9 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 0 vis_channel_id: 6 - long_name: TOA mean Reflectance over all pixels for nir16 channel + category_id: 0 + long_name: TOA Reflectance segment mean at 1.6um (all pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2398,9 +2398,9 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 1 vis_channel_id: 6 - long_name: TOA mean Reflectance over clear pixels for nir16 channel + category_id: 1 + long_name: TOA Reflectance segment mean at 1.6um (clear pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2413,9 +2413,9 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 2 vis_channel_id: 6 - long_name: TOA mean Reflectance over cloudy pixels for nir16 channel + category_id: 2 + long_name: TOA Reflectance segment mean at 1.6um (cloudy pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2428,9 +2428,9 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 0 vis_channel_id: 7 - long_name: TOA mean Reflectance over all pixels for nir22 channel + category_id: 0 + long_name: TOA Reflectance segment mean at 2.2um (all pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2443,9 +2443,9 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 1 vis_channel_id: 7 - long_name: TOA mean Reflectance over clear pixels for nir22 channel + category_id: 1 + long_name: TOA Reflectance segment mean at 2.2um (clear pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2458,9 +2458,9 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: reflectance_mean - category_id: 2 vis_channel_id: 7 - long_name: TOA mean Reflectance over cloudy pixels for nir22 channel + category_id: 2 + long_name: TOA Reflectance segment mean at 2.2um (cloudy pixels) standard_name: toa_reflectance cell_method: area:mean coordinates: @@ -2470,7 +2470,7 @@ datasets: reflectance_std: name: reflectance_std resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: reflectance_std long_name: TOA Reflectance standard deviation @@ -2483,10 +2483,10 @@ datasets: reflectance_quality: name: reflectance_quality resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: reflectance_quality - long_name: TOA Reflectance Quality + long_name: TOA Reflectance % confidence standard_name: reflectance_quality coordinates: - longitude @@ -2495,10 +2495,10 @@ datasets: bt_min: name: bt_min resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: bt_min - long_name: TOA min Brightess Temperature + long_name: TOA Brightess Temperature segment min standard_name: toa_brightess_temperature cell_method: area:minimum coordinates: @@ -2508,10 +2508,10 @@ datasets: bt_max: name: bt_max resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: bt_max - long_name: TOA max Brightess Temperature + long_name: TOA Brightess Temperature segment max standard_name: toa_brightess_temperature cell_method: area:maximum coordinates: @@ -2521,10 +2521,10 @@ datasets: bt_mean: name: bt_mean resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: bt_mean - long_name: TOA mean Brightess Temperature + long_name: TOA Brightess Temperature segment mean standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2537,9 +2537,9 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: bt_mean - category_id: 0 ir_channel_id: 0 - long_name: TOA mean Brightess Temperature over all pixels for ir38 channel + category_id: 0 + long_name: TOA Brightess Temperature segment mean at 3.8um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2552,9 +2552,9 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: bt_mean - category_id: 1 ir_channel_id: 0 - long_name: TOA mean Brightess Temperature over clear pixels for ir38 channel + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 3.8um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2567,9 +2567,9 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: bt_mean - category_id: 2 ir_channel_id: 0 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir38 channel + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 3.8um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2582,9 +2582,9 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: bt_mean - category_id: 0 ir_channel_id: 1 - long_name: TOA mean Brightess Temperature over all pixels for wv63 channel + category_id: 0 + long_name: TOA Brightess Temperature segment mean at 6.3um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2597,9 +2597,9 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: bt_mean - category_id: 1 ir_channel_id: 1 - long_name: TOA mean Brightess Temperature over clear pixels for wv63 channel + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 6.3um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2612,9 +2612,9 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: bt_mean - category_id: 2 ir_channel_id: 1 - long_name: TOA mean Brightess Temperature over cloudy pixels for wv63 channel + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 6.3um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2627,9 +2627,9 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: bt_mean - category_id: 0 ir_channel_id: 2 - long_name: TOA mean Brightess Temperature over all pixels for wv73 channel + category_id: 0 + long_name: TOA Brightess Temperature segment mean at 7.3um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2642,9 +2642,9 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: bt_mean - category_id: 1 ir_channel_id: 2 - long_name: TOA mean Brightess Temperature over clear pixels for wv73 channel + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 7.3um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2657,9 +2657,9 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: bt_mean - category_id: 2 ir_channel_id: 2 - long_name: TOA mean Brightess Temperature over cloudy pixels for wv73 channel + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 7.3um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2672,9 +2672,9 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: bt_mean - category_id: 0 ir_channel_id: 3 - long_name: TOA mean Brightess Temperature over all pixels for ir87 channel + category_id: 0 + long_name: TOA Brightess Temperature segment mean at 8.7um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2687,9 +2687,9 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: bt_mean - category_id: 1 ir_channel_id: 3 - long_name: TOA mean Brightess Temperature over clear pixels for ir87 channel + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 8.7um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2702,9 +2702,9 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: bt_mean - category_id: 2 ir_channel_id: 3 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir87 channel + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 8.7um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2717,9 +2717,9 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: bt_mean - category_id: 0 ir_channel_id: 4 - long_name: TOA mean Brightess Temperature over all pixels for ir97 channel + category_id: 0 + long_name: TOA Brightess Temperature segment mean at 9.7um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2732,9 +2732,9 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: bt_mean - category_id: 1 ir_channel_id: 4 - long_name: TOA mean Brightess Temperature over clear pixels for ir97 channel + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 9.7um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2747,9 +2747,9 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: bt_mean - category_id: 2 ir_channel_id: 4 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir97 channel + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 9.7um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2762,9 +2762,9 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: bt_mean - category_id: 0 ir_channel_id: 5 - long_name: TOA mean Brightess Temperature over all pixels for ir105 channel + category_id: 0 + long_name: TOA Brightess Temperature segment mean at 10.5um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2777,9 +2777,9 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: bt_mean - category_id: 1 ir_channel_id: 5 - long_name: TOA mean Brightess Temperature over clear pixels for ir105 channel + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 10.5um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2792,9 +2792,9 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: bt_mean - category_id: 2 ir_channel_id: 5 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir105 channel + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 10.5um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2807,9 +2807,9 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: bt_mean - category_id: 0 ir_channel_id: 6 - long_name: TOA mean Brightess Temperature over all pixels for ir123 channel + category_id: 0 + long_name: TOA Brightess Temperature segment mean at 12.3um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2822,9 +2822,9 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: bt_mean - category_id: 1 ir_channel_id: 6 - long_name: TOA mean Brightess Temperature over clear pixels for ir123 channel + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 12.3um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2837,9 +2837,9 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: bt_mean - category_id: 2 ir_channel_id: 6 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir123 channel + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 12.3um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2852,9 +2852,9 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: bt_mean - category_id: 0 ir_channel_id: 7 - long_name: TOA mean Brightess Temperature over all pixels for ir133 channel + category_id: 0 + long_name: TOA Brightess Temperature segment mean at 13.3um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2867,9 +2867,9 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: bt_mean - category_id: 1 ir_channel_id: 7 - long_name: TOA mean Brightess Temperature over clear pixels for ir133 channel + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 13.3um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2882,9 +2882,9 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: bt_mean - category_id: 2 ir_channel_id: 7 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir133 channel + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 13.3um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2894,7 +2894,7 @@ datasets: bt_std: name: bt_std resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: bt_std long_name: TOA Brightess Temperature standard deviation @@ -2907,10 +2907,10 @@ datasets: bt_quality: name: bt_quality resolution: 32000 - wavelength: [0,0,0] + wavelength: [] file_type: nc_fci_asr file_key: bt_quality - long_name: TOA Brightess Temperature Quality + long_name: TOA Brightess Temperature % confidence standard_name: brightness_temperature_quality coordinates: - longitude From 106bfaead2d1a89382e34c97f8215158d8b26232 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Wed, 13 Dec 2023 17:40:18 +0100 Subject: [PATCH 097/481] Fix ASR standard names --- satpy/etc/readers/fci_l2_nc.yaml | 334 +++++++++++++++---------------- 1 file changed, 161 insertions(+), 173 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index a7d64d5f53..6191b5e3ae 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1292,8 +1292,8 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_min - long_name: TOA Radiance segment min - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment min + standard_name: toa_outgoing_radiance cell_method: area:minimum coordinates: - longitude @@ -1304,8 +1304,8 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_max - long_name: TOA Radiance segment max - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment max + standard_name: toa_outgoing_radiance cell_method: area:maximum coordinates: - longitude @@ -1316,8 +1316,8 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_mean - long_name: TOA Radiance segment mean - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1331,8 +1331,8 @@ datasets: file_key: radiance_mean channel_id: 0 category_id: 0 - long_name: TOA Radiance segment mean at 0.4um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.4um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1346,8 +1346,8 @@ datasets: file_key: radiance_mean channel_id: 0 category_id: 1 - long_name: TOA Radiance segment mean at 0.4um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.4um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1361,8 +1361,8 @@ datasets: file_key: radiance_mean channel_id: 0 category_id: 2 - long_name: TOA Radiance segment mean at 0.4um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.4um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1376,8 +1376,8 @@ datasets: file_key: radiance_mean channel_id: 1 category_id: 0 - long_name: TOA Radiance segment mean at 0.5um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.5um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1391,8 +1391,8 @@ datasets: file_key: radiance_mean channel_id: 1 category_id: 1 - long_name: TOA Radiance segment mean at 0.5um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.5um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1406,8 +1406,8 @@ datasets: file_key: radiance_mean channel_id: 1 category_id: 2 - long_name: TOA Radiance segment mean at 0.5um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.5um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1421,8 +1421,8 @@ datasets: file_key: radiance_mean channel_id: 2 category_id: 0 - long_name: TOA Radiance segment mean at 0.6um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.6um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1436,8 +1436,8 @@ datasets: file_key: radiance_mean channel_id: 2 category_id: 1 - long_name: TOA Radiance segment mean at 0.6um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.6um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1451,8 +1451,8 @@ datasets: file_key: radiance_mean channel_id: 2 category_id: 2 - long_name: TOA Radiance segment mean at 0.6um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.6um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1466,8 +1466,8 @@ datasets: file_key: radiance_mean channel_id: 3 category_id: 0 - long_name: TOA Radiance segment mean at 0.9um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.9um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1481,8 +1481,8 @@ datasets: file_key: radiance_mean channel_id: 3 category_id: 1 - long_name: TOA Radiance segment mean at 0.9um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.9um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1496,8 +1496,8 @@ datasets: file_key: radiance_mean channel_id: 3 category_id: 2 - long_name: TOA Radiance segment mean at 0.9um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.9um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1511,8 +1511,8 @@ datasets: file_key: radiance_mean channel_id: 4 category_id: 0 - long_name: TOA Radiance segment mean at 0.9um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.9um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1526,8 +1526,8 @@ datasets: file_key: radiance_mean channel_id: 4 category_id: 1 - long_name: TOA Radiance segment mean at 0.9um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.9um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1541,8 +1541,8 @@ datasets: file_key: radiance_mean channel_id: 4 category_id: 2 - long_name: TOA Radiance segment mean at 0.9um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 0.9um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1556,8 +1556,8 @@ datasets: file_key: radiance_mean channel_id: 5 category_id: 0 - long_name: TOA Radiance segment mean at 1.4um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 1.4um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1571,8 +1571,8 @@ datasets: file_key: radiance_mean channel_id: 5 category_id: 1 - long_name: TOA Radiance segment mean at 1.4um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 1.4um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1586,8 +1586,8 @@ datasets: file_key: radiance_mean channel_id: 5 category_id: 2 - long_name: TOA Radiance segment mean at 1.4um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 1.4um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1601,8 +1601,8 @@ datasets: file_key: radiance_mean channel_id: 6 category_id: 0 - long_name: TOA Radiance segment mean at 1.6um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 1.6um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1616,8 +1616,8 @@ datasets: file_key: radiance_mean channel_id: 6 category_id: 1 - long_name: TOA Radiance segment mean at 1.6um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 1.6um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1631,8 +1631,8 @@ datasets: file_key: radiance_mean channel_id: 6 category_id: 2 - long_name: TOA Radiance segment mean at 1.6um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 1.6um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1646,8 +1646,8 @@ datasets: file_key: radiance_mean channel_id: 7 category_id: 0 - long_name: TOA Radiance segment mean at 2.2um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 2.2um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1661,8 +1661,8 @@ datasets: file_key: radiance_mean channel_id: 7 category_id: 1 - long_name: TOA Radiance segment mean at 2.2um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 2.2um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1676,8 +1676,8 @@ datasets: file_key: radiance_mean channel_id: 7 category_id: 2 - long_name: TOA Radiance segment mean at 2.2um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 2.2um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1691,8 +1691,8 @@ datasets: file_key: radiance_mean channel_id: 8 category_id: 0 - long_name: TOA Radiance segment mean at 3.8um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 3.8um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1706,8 +1706,8 @@ datasets: file_key: radiance_mean channel_id: 8 category_id: 1 - long_name: TOA Radiance segment mean at 3.8um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 3.8um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1721,8 +1721,8 @@ datasets: file_key: radiance_mean channel_id: 8 category_id: 2 - long_name: TOA Radiance segment mean at 3.8um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 3.8um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1736,8 +1736,8 @@ datasets: file_key: radiance_mean channel_id: 9 category_id: 0 - long_name: TOA Radiance segment mean at 6.3um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 6.3um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1751,8 +1751,8 @@ datasets: file_key: radiance_mean channel_id: 9 category_id: 1 - long_name: TOA Radiance segment mean at 6.3um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 6.3um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1766,8 +1766,8 @@ datasets: file_key: radiance_mean channel_id: 9 category_id: 2 - long_name: TOA Radiance segment mean at 6.3um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 6.3um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1781,8 +1781,8 @@ datasets: file_key: radiance_mean channel_id: 10 category_id: 0 - long_name: TOA Radiance segment mean at 7.3um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 7.3um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1796,8 +1796,8 @@ datasets: file_key: radiance_mean channel_id: 10 category_id: 1 - long_name: TOA Radiance segment mean at 7.3um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 7.3um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1811,8 +1811,8 @@ datasets: file_key: radiance_mean channel_id: 10 category_id: 2 - long_name: TOA Radiance segment mean at 7.3um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 7.3um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1826,8 +1826,8 @@ datasets: file_key: radiance_mean channel_id: 11 category_id: 0 - long_name: TOA Radiance segment mean at 8.7um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 8.7um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1841,8 +1841,8 @@ datasets: file_key: radiance_mean channel_id: 11 category_id: 1 - long_name: TOA Radiance segment mean at 8.7um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 8.7um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1856,8 +1856,8 @@ datasets: file_key: radiance_mean channel_id: 11 category_id: 2 - long_name: TOA Radiance segment mean at 8.7um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 8.7um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1871,8 +1871,8 @@ datasets: file_key: radiance_mean channel_id: 12 category_id: 0 - long_name: TOA Radiance segment mean at 9.7um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 9.7um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1886,8 +1886,8 @@ datasets: file_key: radiance_mean channel_id: 12 category_id: 1 - long_name: TOA Radiance segment mean at 9.7um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 9.7um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1901,8 +1901,8 @@ datasets: file_key: radiance_mean channel_id: 12 category_id: 2 - long_name: TOA Radiance segment mean at 9.7um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 9.7um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1916,8 +1916,8 @@ datasets: file_key: radiance_mean channel_id: 13 category_id: 0 - long_name: TOA Radiance segment mean at 10.5um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 10.5um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1931,8 +1931,8 @@ datasets: file_key: radiance_mean channel_id: 13 category_id: 1 - long_name: TOA Radiance segment mean at 10.5um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 10.5um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1946,8 +1946,8 @@ datasets: file_key: radiance_mean channel_id: 13 category_id: 2 - long_name: TOA Radiance segment mean at 10.5um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 10.5um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1961,8 +1961,8 @@ datasets: file_key: radiance_mean channel_id: 14 category_id: 0 - long_name: TOA Radiance segment mean at 12.3um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 12.3um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1976,8 +1976,8 @@ datasets: file_key: radiance_mean channel_id: 14 category_id: 1 - long_name: TOA Radiance segment mean at 12.3um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 12.3um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1991,8 +1991,8 @@ datasets: file_key: radiance_mean channel_id: 14 category_id: 2 - long_name: TOA Radiance segment mean at 12.3um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 12.3um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -2006,8 +2006,8 @@ datasets: file_key: radiance_mean channel_id: 15 category_id: 0 - long_name: TOA Radiance segment mean at 13.3um (all pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 13.3um (all pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -2021,8 +2021,8 @@ datasets: file_key: radiance_mean channel_id: 15 category_id: 1 - long_name: TOA Radiance segment mean at 13.3um (clear pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 13.3um (clear pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -2036,8 +2036,8 @@ datasets: file_key: radiance_mean channel_id: 15 category_id: 2 - long_name: TOA Radiance segment mean at 13.3um (cloudy pixels) - standard_name: toa_radiance + long_name: TOA Outgoing Radiance segment mean at 13.3um (cloudy pixels) + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -2046,11 +2046,10 @@ datasets: radiance_std: name: radiance_std resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: radiance_std - long_name: TOA Radiance standard deviation - standard_name: toa_radiance + long_name: TOA Outgoing Radiance standard deviation + standard_name: toa_outgoing_radiance cell_method: area:standard_deviation coordinates: - longitude @@ -2059,7 +2058,6 @@ datasets: radiance_quality: name: radiance_quality resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: radiance_quality long_name: TOA Radiance % confidence @@ -2071,11 +2069,10 @@ datasets: reflectance_min: name: reflectance_min resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: reflectance_min - long_name: TOA Reflectance segment min - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment min + standard_name: toa_bidirectional_reflectance cell_method: area:minimum coordinates: - longitude @@ -2084,11 +2081,10 @@ datasets: reflectance_max: name: reflectance_max resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: reflectance_max - long_name: TOA Reflectance segment max - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment max + standard_name: toa_bidirectional_reflectance cell_method: area:maximum coordinates: - longitude @@ -2097,11 +2093,10 @@ datasets: reflectance_mean: name: reflectance_mean resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: reflectance_mean - long_name: TOA Reflectance segment mean - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2115,8 +2110,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 0 category_id: 0 - long_name: TOA Reflectance segment mean at 0.4um (all pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.4um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2130,8 +2125,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 0 category_id: 1 - long_name: TOA Reflectance segment mean at 0.4um (clear pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.4um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2145,8 +2140,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 0 category_id: 2 - long_name: TOA Reflectance segment mean at 0.4um (cloudy pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.4um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2160,8 +2155,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 1 category_id: 0 - long_name: TOA Reflectance segment mean at 0.5um (all pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.5um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2175,8 +2170,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 1 category_id: 1 - long_name: TOA Reflectance segment mean at 0.5um (clear pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.5um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2190,8 +2185,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 1 category_id: 2 - long_name: TOA Reflectance segment mean at 0.5um (cloudy pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.5um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2205,8 +2200,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 2 category_id: 0 - long_name: TOA Reflectance segment mean at 0.6um (all pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.6um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2220,8 +2215,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 2 category_id: 1 - long_name: TOA Reflectance segment mean at 0.6um (clear pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.6um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2235,8 +2230,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 2 category_id: 2 - long_name: TOA Reflectance segment mean at 0.6um (cloudy pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.6um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2250,8 +2245,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 3 category_id: 0 - long_name: TOA Reflectance segment mean at 0.9um (all pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2265,8 +2260,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 3 category_id: 1 - long_name: TOA Reflectance segment mean at 0.9um (clear pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2280,8 +2275,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 3 category_id: 2 - long_name: TOA Reflectance segment mean at 0.9um (cloudy pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2295,8 +2290,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 4 category_id: 0 - long_name: TOA Reflectance segment mean at 0.9um (all pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2310,8 +2305,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 4 category_id: 1 - long_name: TOA Reflectance segment mean at 0.9um (clear pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2325,8 +2320,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 4 category_id: 2 - long_name: TOA Reflectance segment mean at 0.9um (cloudy pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2340,8 +2335,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 5 category_id: 0 - long_name: TOA Reflectance segment mean at 1.4um (all pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 1.4um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2355,8 +2350,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 5 category_id: 1 - long_name: TOA Reflectance segment mean at 1.4um (clear pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 1.4um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2370,8 +2365,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 5 category_id: 2 - long_name: TOA Reflectance segment mean at 1.4um (cloudy pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 1.4um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2385,8 +2380,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 6 category_id: 0 - long_name: TOA Reflectance segment mean at 1.6um (all pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 1.6um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2400,8 +2395,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 6 category_id: 1 - long_name: TOA Reflectance segment mean at 1.6um (clear pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 1.6um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2415,8 +2410,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 6 category_id: 2 - long_name: TOA Reflectance segment mean at 1.6um (cloudy pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 1.6um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2430,8 +2425,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 7 category_id: 0 - long_name: TOA Reflectance segment mean at 2.2um (all pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 2.2um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2445,8 +2440,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 7 category_id: 1 - long_name: TOA Reflectance segment mean at 2.2um (clear pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 2.2um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2460,8 +2455,8 @@ datasets: file_key: reflectance_mean vis_channel_id: 7 category_id: 2 - long_name: TOA Reflectance segment mean at 2.2um (cloudy pixels) - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance segment mean at 2.2um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude @@ -2470,11 +2465,10 @@ datasets: reflectance_std: name: reflectance_std resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: reflectance_std - long_name: TOA Reflectance standard deviation - standard_name: toa_reflectance + long_name: TOA Bidirectional Reflectance standard deviation + standard_name: toa_bidirectional_reflectance cell_method: area:standard_deviation coordinates: - longitude @@ -2483,10 +2477,9 @@ datasets: reflectance_quality: name: reflectance_quality resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: reflectance_quality - long_name: TOA Reflectance % confidence + long_name: TOA Bidirectional Reflectance % confidence standard_name: reflectance_quality coordinates: - longitude @@ -2495,7 +2488,6 @@ datasets: bt_min: name: bt_min resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: bt_min long_name: TOA Brightess Temperature segment min @@ -2508,7 +2500,6 @@ datasets: bt_max: name: bt_max resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: bt_max long_name: TOA Brightess Temperature segment max @@ -2521,7 +2512,6 @@ datasets: bt_mean: name: bt_mean resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: bt_mean long_name: TOA Brightess Temperature segment mean @@ -2894,7 +2884,6 @@ datasets: bt_std: name: bt_std resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: bt_std long_name: TOA Brightess Temperature standard deviation @@ -2907,7 +2896,6 @@ datasets: bt_quality: name: bt_quality resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: bt_quality long_name: TOA Brightess Temperature % confidence From a8a9a00b35694345fd46ffdb7675fee1b973e510 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Fri, 15 Dec 2023 11:51:58 +0100 Subject: [PATCH 098/481] Change CRM long names --- satpy/etc/readers/fci_l2_nc.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 6191b5e3ae..c610c8c0ec 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -550,6 +550,7 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance crm_vis04: name: crm_vis04 @@ -559,6 +560,7 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 0 + long_name: TOA Bidirectional Reflectance at 0.41um (temporal average) crm_vis05: name: crm_vis05 @@ -568,6 +570,7 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 1 + long_name: TOA Bidirectional Reflectance at 0.51um (temporal average) crm_vis06: name: crm_vis06 @@ -577,6 +580,7 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 2 + long_name: TOA Bidirectional Reflectance at 0.64um (temporal average) crm_vis08: name: crm_vis08 @@ -586,6 +590,7 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 3 + long_name: TOA Bidirectional Reflectance at 0.865um (temporal average) crm_vis09: name: crm_vis09 @@ -595,6 +600,7 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 4 + long_name: TOA Bidirectional Reflectance at 0.914um (temporal average) crm_nir13: name: crm_nir13 @@ -604,6 +610,7 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 5 + long_name: TOA Bidirectional Reflectance at 1.38um (temporal average) crm_nir16: name: crm_nir16 @@ -613,6 +620,7 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 6 + long_name: TOA Bidirectional Reflectance at 1.61um (temporal average) crm_nir22: name: crm_nir22 @@ -622,6 +630,7 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 7 + long_name: TOA Bidirectional Reflectance at 2.25um (temporal average) mean_sza: name: mean_sza From bd1238eab17276fa9874b5c1a383684f4df8178b Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Fri, 15 Dec 2023 14:25:52 +0100 Subject: [PATCH 099/481] Added CRM long names --- satpy/etc/readers/fci_l2_nc.yaml | 630 ++++++++++++++++--------------- 1 file changed, 327 insertions(+), 303 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index c610c8c0ec..360fde4a5d 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -550,7 +550,6 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance crm_vis04: name: crm_vis04 @@ -560,7 +559,6 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 0 - long_name: TOA Bidirectional Reflectance at 0.41um (temporal average) crm_vis05: name: crm_vis05 @@ -570,7 +568,6 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 1 - long_name: TOA Bidirectional Reflectance at 0.51um (temporal average) crm_vis06: name: crm_vis06 @@ -580,7 +577,6 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 2 - long_name: TOA Bidirectional Reflectance at 0.64um (temporal average) crm_vis08: name: crm_vis08 @@ -590,7 +586,6 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 3 - long_name: TOA Bidirectional Reflectance at 0.865um (temporal average) crm_vis09: name: crm_vis09 @@ -600,7 +595,6 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 4 - long_name: TOA Bidirectional Reflectance at 0.914um (temporal average) crm_nir13: name: crm_nir13 @@ -610,7 +604,6 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 5 - long_name: TOA Bidirectional Reflectance at 1.38um (temporal average) crm_nir16: name: crm_nir16 @@ -620,7 +613,6 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 6 - long_name: TOA Bidirectional Reflectance at 1.61um (temporal average) crm_nir22: name: crm_nir22 @@ -630,7 +622,6 @@ datasets: file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance vis_channel_id: 7 - long_name: TOA Bidirectional Reflectance at 2.25um (temporal average) mean_sza: name: mean_sza @@ -1203,7 +1194,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 15 flag_values: [0,1] - flag_meanings: ['Opaqueness undetected','Opaqueness detected'] + flag_meanings: ['Cloud undetected','Cloud detected'] standard_name: status_flag cloud_test_cmrt1: @@ -1223,7 +1214,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 17 flag_values: [0,1] - flag_meanings: ['Clear unchanged','Cloud detected'] + flag_meanings: ['Clear unchanged', 'Cloud detected (restored from clear sky)'] standard_name: status_flag cloud_test_cmrt3: @@ -1233,7 +1224,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 18 flag_values: [0,1] - flag_meanings: ['Clear unchanged','Cloud detected'] + flag_meanings: ['Cloud undetected','Cloud detected'] standard_name: status_flag cloud_test_cmrt4: @@ -1243,7 +1234,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 19 flag_values: [0,1] - flag_meanings: ['Clear unchanged','Cloud detected'] + flag_meanings: ['Clear unchanged', 'Cloud detected (restored from clear sky)'] standard_name: status_flag cloud_test_cmrt5: @@ -1253,7 +1244,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 20 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud unchanged'] + flag_meanings: ['Clear sky restored', 'Cloud unchanged'] standard_name: status_flag cloud_test_dust: @@ -1263,7 +1254,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 21 flag_values: [0,1] - flag_meanings: ['Dust undetected','Dust detected'] + flag_meanings: ['Cloud undetected','Cloud detected'] standard_name: status_flag cloud_test_ash: @@ -1273,7 +1264,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 22 flag_values: [0,1] - flag_meanings: ['Ash undetected','Ash detected'] + flag_meanings: ['Cloud undetected','Cloud detected'] standard_name: status_flag cloud_test_dust_ash: @@ -1283,7 +1274,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 23 flag_values: [0,1] - flag_meanings: ['Dust detected','Ash detected'] + flag_meanings: ['Cloud undetected','Cloud detected'] standard_name: status_flag cloud_test_cmrt6: @@ -1295,14 +1286,33 @@ datasets: standard_name: status_flag import_enum_information: True + product_quality_clmtest: + name: product_quality_clmtest + file_type: nc_fci_test_clm + file_key: product_quality + standard_name: product_quality + + product_completeness_clmtest: + name: product_completeness_clmtest + file_type: nc_fci_test_clm + file_key: product_completeness + standard_name: product_completeness + + product_timeliness_clmtest: + name: product_timeliness_clmtest + file_type: nc_fci_test_clm + file_key: product_timeliness + standard_name: product_timeliness + # ASR radiance_min: name: radiance_min resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: radiance_min - long_name: TOA Outgoing Radiance segment min - standard_name: toa_outgoing_radiance + long_name: TOA min Radiance + standard_name: toa_radiance cell_method: area:minimum coordinates: - longitude @@ -1311,10 +1321,11 @@ datasets: radiance_max: name: radiance_max resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: radiance_max - long_name: TOA Outgoing Radiance segment max - standard_name: toa_outgoing_radiance + long_name: TOA max Radiance + standard_name: toa_radiance cell_method: area:maximum coordinates: - longitude @@ -1323,10 +1334,11 @@ datasets: radiance_mean: name: radiance_mean resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: radiance_mean - long_name: TOA Outgoing Radiance segment mean - standard_name: toa_outgoing_radiance + long_name: TOA mean Radiance + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1338,10 +1350,10 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 0 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 0.4um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 0 + long_name: TOA mean Radiance over all pixels for vis04 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1353,10 +1365,10 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 0 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 0.4um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 0 + long_name: TOA mean Radiance over clear pixels for vis04 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1368,10 +1380,10 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 0 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 0.4um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 0 + long_name: TOA mean Radiance over cloudy pixels for vis04 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1383,10 +1395,10 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 1 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 0.5um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 1 + long_name: TOA mean Radiance over all pixels for vis05 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1398,10 +1410,10 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 1 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 0.5um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 1 + long_name: TOA mean Radiance over clear pixels for vis05 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1413,10 +1425,10 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 1 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 0.5um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 1 + long_name: TOA mean Radiance over cloudy pixels for vis05 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1428,10 +1440,10 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 2 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 0.6um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 2 + long_name: TOA mean Radiance over all pixels for vis06 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1443,10 +1455,10 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 2 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 0.6um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 2 + long_name: TOA mean Radiance over clear pixels for vis06 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1458,10 +1470,10 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 2 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 0.6um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 2 + long_name: TOA mean Radiance over cloudy pixels for vis06 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1473,10 +1485,10 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 3 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 0.9um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 3 + long_name: TOA mean Radiance over all pixels for vis08 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1488,10 +1500,10 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 3 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 0.9um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 3 + long_name: TOA mean Radiance over clear pixels for vis08 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1503,10 +1515,10 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 3 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 0.9um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 3 + long_name: TOA mean Radiance over cloudy pixels for vis08 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1518,10 +1530,10 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 4 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 0.9um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 4 + long_name: TOA mean Radiance over all pixels for vis09 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1533,10 +1545,10 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 4 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 0.9um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 4 + long_name: TOA mean Radiance over clear pixels for vis09 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1548,10 +1560,10 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 4 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 0.9um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 4 + long_name: TOA mean Radiance over cloudy pixels for vis09 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1563,10 +1575,10 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 5 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 1.4um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 5 + long_name: TOA mean Radiance over all pixels for nir13 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1578,10 +1590,10 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 5 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 1.4um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 5 + long_name: TOA mean Radiance over clear pixels for nir13 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1593,10 +1605,10 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 5 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 1.4um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 5 + long_name: TOA mean Radiance over cloudy pixels for nir13 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1608,10 +1620,10 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 6 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 1.6um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 6 + long_name: TOA mean Radiance over all pixels for nir16 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1623,10 +1635,10 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 6 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 1.6um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 6 + long_name: TOA mean Radiance over clear pixels for nir16 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1638,10 +1650,10 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 6 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 1.6um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 6 + long_name: TOA mean Radiance over cloudy pixels for nir16 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1653,10 +1665,10 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 7 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 2.2um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 7 + long_name: TOA mean Radiance over all pixels for nir22 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1668,10 +1680,10 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 7 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 2.2um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 7 + long_name: TOA mean Radiance over clear pixels for nir22 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1683,10 +1695,10 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 7 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 2.2um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 7 + long_name: TOA mean Radiance over cloudy pixels for nir22 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1698,10 +1710,10 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 8 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 3.8um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 8 + long_name: TOA mean Radiance over all pixels for ir38 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1713,10 +1725,10 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 8 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 3.8um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 8 + long_name: TOA mean Radiance over clear pixels for ir38 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1728,10 +1740,10 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 8 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 3.8um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 8 + long_name: TOA mean Radiance over cloudy pixels for ir38 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1743,10 +1755,10 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 9 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 6.3um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 9 + long_name: TOA mean Radiance over all pixels for wv63 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1758,10 +1770,10 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 9 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 6.3um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 9 + long_name: TOA mean Radiance over clear pixels for wv63 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1773,10 +1785,10 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 9 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 6.3um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 9 + long_name: TOA mean Radiance over cloudy pixels for wv63 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1788,10 +1800,10 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 10 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 7.3um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 10 + long_name: TOA mean Radiance over all pixels for wv73 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1803,10 +1815,10 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 10 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 7.3um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 10 + long_name: TOA mean Radiance over clear pixels for wv73 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1818,10 +1830,10 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 10 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 7.3um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 10 + long_name: TOA mean Radiance over cloudy pixels for wv73 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1833,10 +1845,10 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 11 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 8.7um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 11 + long_name: TOA mean Radiance over all pixels for ir87 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1848,10 +1860,10 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 11 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 8.7um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 11 + long_name: TOA mean Radiance over clear pixels for ir87 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1863,10 +1875,10 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 11 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 8.7um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 11 + long_name: TOA mean Radiance over cloudy pixels for ir87 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1878,10 +1890,10 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 12 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 9.7um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 12 + long_name: TOA mean Radiance over all pixels for ir97 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1893,10 +1905,10 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 12 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 9.7um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 12 + long_name: TOA mean Radiance over clear pixels for ir97 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1908,10 +1920,10 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 12 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 9.7um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 12 + long_name: TOA mean Radiance over cloudy pixels for ir97 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1923,10 +1935,10 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 13 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 10.5um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 13 + long_name: TOA mean Radiance over all pixels for ir105 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1938,10 +1950,10 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 13 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 10.5um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 13 + long_name: TOA mean Radiance over clear pixels for ir105 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1953,10 +1965,10 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 13 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 10.5um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 13 + long_name: TOA mean Radiance over cloudy pixels for ir105 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1968,10 +1980,10 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 14 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 12.3um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 14 + long_name: TOA mean Radiance over all pixels for ir123 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1983,10 +1995,10 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 14 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 12.3um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 14 + long_name: TOA mean Radiance over clear pixels for ir123 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -1998,10 +2010,10 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 14 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 12.3um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 14 + long_name: TOA mean Radiance over cloudy pixels for ir123 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -2013,10 +2025,10 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 15 category_id: 0 - long_name: TOA Outgoing Radiance segment mean at 13.3um (all pixels) - standard_name: toa_outgoing_radiance + channel_id: 15 + long_name: TOA mean Radiance over all pixels for ir133 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -2028,10 +2040,10 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 15 category_id: 1 - long_name: TOA Outgoing Radiance segment mean at 13.3um (clear pixels) - standard_name: toa_outgoing_radiance + channel_id: 15 + long_name: TOA mean Radiance over clear pixels for ir133 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -2043,10 +2055,10 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: radiance_mean - channel_id: 15 category_id: 2 - long_name: TOA Outgoing Radiance segment mean at 13.3um (cloudy pixels) - standard_name: toa_outgoing_radiance + channel_id: 15 + long_name: TOA mean Radiance over cloudy pixels for ir133 channel + standard_name: toa_radiance cell_method: area:mean coordinates: - longitude @@ -2055,10 +2067,11 @@ datasets: radiance_std: name: radiance_std resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: radiance_std - long_name: TOA Outgoing Radiance standard deviation - standard_name: toa_outgoing_radiance + long_name: TOA Radiance standard deviation over None pixels for None channel + standard_name: toa_radiance cell_method: area:standard_deviation coordinates: - longitude @@ -2067,9 +2080,10 @@ datasets: radiance_quality: name: radiance_quality resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: radiance_quality - long_name: TOA Radiance % confidence + long_name: TOA Radiance Quality standard_name: radiance_quality coordinates: - longitude @@ -2078,10 +2092,11 @@ datasets: reflectance_min: name: reflectance_min resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: reflectance_min - long_name: TOA Bidirectional Reflectance segment min - standard_name: toa_bidirectional_reflectance + long_name: TOA min Reflectance + standard_name: toa_reflectance cell_method: area:minimum coordinates: - longitude @@ -2090,10 +2105,11 @@ datasets: reflectance_max: name: reflectance_max resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: reflectance_max - long_name: TOA Bidirectional Reflectance segment max - standard_name: toa_bidirectional_reflectance + long_name: TOA max Reflectance + standard_name: toa_reflectance cell_method: area:maximum coordinates: - longitude @@ -2102,10 +2118,11 @@ datasets: reflectance_mean: name: reflectance_mean resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: reflectance_mean - long_name: TOA Bidirectional Reflectance segment mean - standard_name: toa_bidirectional_reflectance + long_name: TOA mean Reflectance + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2117,10 +2134,10 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 0 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.4um (all pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 0 + long_name: TOA mean Reflectance over all pixels for vis04 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2132,10 +2149,10 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 0 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.4um (clear pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 0 + long_name: TOA mean Reflectance over clear pixels for vis04 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2147,10 +2164,10 @@ datasets: wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 0 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.4um (cloudy pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 0 + long_name: TOA mean Reflectance over cloudy pixels for vis04 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2162,10 +2179,10 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 1 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.5um (all pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 1 + long_name: TOA mean Reflectance over all pixels for vis05 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2177,10 +2194,10 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 1 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.5um (clear pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 1 + long_name: TOA mean Reflectance over clear pixels for vis05 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2192,10 +2209,10 @@ datasets: wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 1 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.5um (cloudy pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 1 + long_name: TOA mean Reflectance over cloudy pixels for vis05 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2207,10 +2224,10 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 2 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.6um (all pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 2 + long_name: TOA mean Reflectance over all pixels for vis06 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2222,10 +2239,10 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 2 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.6um (clear pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 2 + long_name: TOA mean Reflectance over clear pixels for vis06 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2237,10 +2254,10 @@ datasets: wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 2 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.6um (cloudy pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 2 + long_name: TOA mean Reflectance over cloudy pixels for vis06 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2252,10 +2269,10 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 3 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (all pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 3 + long_name: TOA mean Reflectance over all pixels for vis08 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2267,10 +2284,10 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 3 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (clear pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 3 + long_name: TOA mean Reflectance over clear pixels for vis08 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2282,10 +2299,10 @@ datasets: wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 3 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (cloudy pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 3 + long_name: TOA mean Reflectance over cloudy pixels for vis08 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2297,10 +2314,10 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 4 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (all pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 4 + long_name: TOA mean Reflectance over all pixels for vis09 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2312,10 +2329,10 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 4 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (clear pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 4 + long_name: TOA mean Reflectance over clear pixels for vis09 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2327,10 +2344,10 @@ datasets: wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 4 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (cloudy pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 4 + long_name: TOA mean Reflectance over cloudy pixels for vis09 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2342,10 +2359,10 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 5 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 1.4um (all pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 5 + long_name: TOA mean Reflectance over all pixels for nir13 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2357,10 +2374,10 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 5 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 1.4um (clear pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 5 + long_name: TOA mean Reflectance over clear pixels for nir13 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2372,10 +2389,10 @@ datasets: wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 5 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 1.4um (cloudy pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 5 + long_name: TOA mean Reflectance over cloudy pixels for nir13 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2387,10 +2404,10 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 6 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 1.6um (all pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 6 + long_name: TOA mean Reflectance over all pixels for nir16 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2402,10 +2419,10 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 6 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 1.6um (clear pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 6 + long_name: TOA mean Reflectance over clear pixels for nir16 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2417,10 +2434,10 @@ datasets: wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 6 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 1.6um (cloudy pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 6 + long_name: TOA mean Reflectance over cloudy pixels for nir16 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2432,10 +2449,10 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 7 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 2.2um (all pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 7 + long_name: TOA mean Reflectance over all pixels for nir22 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2447,10 +2464,10 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 7 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 2.2um (clear pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 7 + long_name: TOA mean Reflectance over clear pixels for nir22 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2462,10 +2479,10 @@ datasets: wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: reflectance_mean - vis_channel_id: 7 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 2.2um (cloudy pixels) - standard_name: toa_bidirectional_reflectance + vis_channel_id: 7 + long_name: TOA mean Reflectance over cloudy pixels for nir22 channel + standard_name: toa_reflectance cell_method: area:mean coordinates: - longitude @@ -2474,10 +2491,11 @@ datasets: reflectance_std: name: reflectance_std resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: reflectance_std - long_name: TOA Bidirectional Reflectance standard deviation - standard_name: toa_bidirectional_reflectance + long_name: TOA Reflectance standard deviation + standard_name: toa_reflectance cell_method: area:standard_deviation coordinates: - longitude @@ -2486,9 +2504,10 @@ datasets: reflectance_quality: name: reflectance_quality resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: reflectance_quality - long_name: TOA Bidirectional Reflectance % confidence + long_name: TOA Reflectance Quality standard_name: reflectance_quality coordinates: - longitude @@ -2497,9 +2516,10 @@ datasets: bt_min: name: bt_min resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: bt_min - long_name: TOA Brightess Temperature segment min + long_name: TOA min Brightess Temperature standard_name: toa_brightess_temperature cell_method: area:minimum coordinates: @@ -2509,9 +2529,10 @@ datasets: bt_max: name: bt_max resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: bt_max - long_name: TOA Brightess Temperature segment max + long_name: TOA max Brightess Temperature standard_name: toa_brightess_temperature cell_method: area:maximum coordinates: @@ -2521,9 +2542,10 @@ datasets: bt_mean: name: bt_mean resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: bt_mean - long_name: TOA Brightess Temperature segment mean + long_name: TOA mean Brightess Temperature standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2536,9 +2558,9 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 0 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 3.8um (all pixels) + ir_channel_id: 0 + long_name: TOA mean Brightess Temperature over all pixels for ir38 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2551,9 +2573,9 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 0 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 3.8um (clear pixels) + ir_channel_id: 0 + long_name: TOA mean Brightess Temperature over clear pixels for ir38 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2566,9 +2588,9 @@ datasets: wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 0 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 3.8um (cloudy pixels) + ir_channel_id: 0 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir38 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2581,9 +2603,9 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 1 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 6.3um (all pixels) + ir_channel_id: 1 + long_name: TOA mean Brightess Temperature over all pixels for wv63 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2596,9 +2618,9 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 1 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 6.3um (clear pixels) + ir_channel_id: 1 + long_name: TOA mean Brightess Temperature over clear pixels for wv63 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2611,9 +2633,9 @@ datasets: wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 1 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 6.3um (cloudy pixels) + ir_channel_id: 1 + long_name: TOA mean Brightess Temperature over cloudy pixels for wv63 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2626,9 +2648,9 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 2 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 7.3um (all pixels) + ir_channel_id: 2 + long_name: TOA mean Brightess Temperature over all pixels for wv73 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2641,9 +2663,9 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 2 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 7.3um (clear pixels) + ir_channel_id: 2 + long_name: TOA mean Brightess Temperature over clear pixels for wv73 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2656,9 +2678,9 @@ datasets: wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 2 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 7.3um (cloudy pixels) + ir_channel_id: 2 + long_name: TOA mean Brightess Temperature over cloudy pixels for wv73 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2671,9 +2693,9 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 3 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 8.7um (all pixels) + ir_channel_id: 3 + long_name: TOA mean Brightess Temperature over all pixels for ir87 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2686,9 +2708,9 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 3 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 8.7um (clear pixels) + ir_channel_id: 3 + long_name: TOA mean Brightess Temperature over clear pixels for ir87 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2701,9 +2723,9 @@ datasets: wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 3 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 8.7um (cloudy pixels) + ir_channel_id: 3 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir87 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2716,9 +2738,9 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 4 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 9.7um (all pixels) + ir_channel_id: 4 + long_name: TOA mean Brightess Temperature over all pixels for ir97 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2731,9 +2753,9 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 4 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 9.7um (clear pixels) + ir_channel_id: 4 + long_name: TOA mean Brightess Temperature over clear pixels for ir97 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2746,9 +2768,9 @@ datasets: wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 4 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 9.7um (cloudy pixels) + ir_channel_id: 4 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir97 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2761,9 +2783,9 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 5 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 10.5um (all pixels) + ir_channel_id: 5 + long_name: TOA mean Brightess Temperature over all pixels for ir105 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2776,9 +2798,9 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 5 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 10.5um (clear pixels) + ir_channel_id: 5 + long_name: TOA mean Brightess Temperature over clear pixels for ir105 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2791,9 +2813,9 @@ datasets: wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 5 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 10.5um (cloudy pixels) + ir_channel_id: 5 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir105 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2806,9 +2828,9 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 6 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 12.3um (all pixels) + ir_channel_id: 6 + long_name: TOA mean Brightess Temperature over all pixels for ir123 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2821,9 +2843,9 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 6 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 12.3um (clear pixels) + ir_channel_id: 6 + long_name: TOA mean Brightess Temperature over clear pixels for ir123 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2836,9 +2858,9 @@ datasets: wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 6 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 12.3um (cloudy pixels) + ir_channel_id: 6 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir123 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2851,9 +2873,9 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 7 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 13.3um (all pixels) + ir_channel_id: 7 + long_name: TOA mean Brightess Temperature over all pixels for ir133 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2866,9 +2888,9 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 7 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 13.3um (clear pixels) + ir_channel_id: 7 + long_name: TOA mean Brightess Temperature over clear pixels for ir133 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2881,9 +2903,9 @@ datasets: wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: bt_mean - ir_channel_id: 7 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 13.3um (cloudy pixels) + ir_channel_id: 7 + long_name: TOA mean Brightess Temperature over cloudy pixels for ir133 channel standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2893,6 +2915,7 @@ datasets: bt_std: name: bt_std resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: bt_std long_name: TOA Brightess Temperature standard deviation @@ -2905,9 +2928,10 @@ datasets: bt_quality: name: bt_quality resolution: 32000 + wavelength: [] file_type: nc_fci_asr file_key: bt_quality - long_name: TOA Brightess Temperature % confidence + long_name: TOA Brightess Temperature Quality standard_name: brightness_temperature_quality coordinates: - longitude From 6aad1bdee201abf848063cc7688841987518249c Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Fri, 15 Dec 2023 17:01:03 +0100 Subject: [PATCH 100/481] Fix ASR issues --- satpy/etc/readers/fci_l2_nc.yaml | 1745 ++++++++++++++++-------------- 1 file changed, 917 insertions(+), 828 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 360fde4a5d..b8c342dac1 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1305,23 +1305,57 @@ datasets: standard_name: product_timeliness # ASR - radiance_min: - name: radiance_min + bt_max: + name: bt_max resolution: 32000 - wavelength: [] file_type: nc_fci_asr - file_key: radiance_min - long_name: TOA min Radiance - standard_name: toa_radiance + file_key: bt_max + long_name: TOA Brightess Temperature segment max + standard_name: toa_brightess_temperature + cell_method: area:maximum + coordinates: + - longitude + - latitude + + bt_mean: + name: bt_mean + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + long_name: TOA Brightess Temperature segment mean + standard_name: toa_brightess_temperature + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_min: + name: bt_min + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_min + long_name: TOA Brightess Temperature segment min + standard_name: toa_brightess_temperature cell_method: area:minimum coordinates: - longitude - latitude + bt_std: + name: bt_std + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_std + long_name: TOA Brightess Temperature standard deviation + standard_name: toa_brightess_temperature + cell_method: area:standard_deviation + coordinates: + - longitude + - latitude + radiance_max: name: radiance_max resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: radiance_max long_name: TOA max Radiance @@ -1331,10 +1365,21 @@ datasets: - longitude - latitude + radiance_min: + name: radiance_min + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_min + long_name: TOA min Radiance + standard_name: toa_radiance + cell_method: area:minimum + coordinates: + - longitude + - latitude + radiance_mean: name: radiance_mean resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: radiance_mean long_name: TOA mean Radiance @@ -1344,1625 +1389,1669 @@ datasets: - longitude - latitude - radiance_mean_all_vis04: - name: radiance_mean_all_vis04 + radiance_std: + name: radiance_std + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_std + long_name: TOA Outgoing Radiance standard deviation + standard_name: toa_outgoing_radiance + cell_method: area:standard_deviation + coordinates: + - longitude + - latitude + + reflectance_max: + name: reflectance_max + resolution: 32000 + file_type: nc_fci_asr + file_key: reflectance_max + long_name: TOA Bidirectional Reflectance segment max + standard_name: toa_bidirectional_reflectance + cell_method: area:maximum + coordinates: + - longitude + - latitude + + reflectance_mean: + name: reflectance_mean + resolution: 32000 + file_type: nc_fci_asr + file_key: reflectance_mean + long_name: TOA Bidirectional Reflectance segment mean + standard_name: toa_bidirectional_reflectance + cell_method: area:mean + coordinates: + - longitude + - latitude + + reflectance_min: + name: reflectance_min + resolution: 32000 + file_type: nc_fci_asr + file_key: reflectance_min + long_name: TOA Bidirectional Reflectance segment min + standard_name: toa_bidirectional_reflectance + cell_method: area:minimum + coordinates: + - longitude + - latitude + + reflectance_std: + name: reflectance_std + resolution: 32000 + file_type: nc_fci_asr + file_key: reflectance_std + long_name: TOA Bidirectional Reflectance standard deviation + standard_name: toa_bidirectional_reflectance + cell_method: area:standard_deviation + coordinates: + - longitude + - latitude + + quality_bt: + name: quality_bt + resolution: 32000 + file_type: nc_fci_asr + file_key: quality_bt + fill_value: -1 + long_name: TOA Brightess Temperature % confidence + standard_name: brightness_temperature_quality + coordinates: + - longitude + - latitude + + quality_reflectance: + name: quality_reflectance + resolution: 32000 + file_type: nc_fci_asr + file_key: quality_reflectance + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence + standard_name: reflectance_quality + coordinates: + - longitude + - latitude + + quality_radiance: + name: quality_radiance + resolution: 32000 + wavelength: [] + file_type: nc_fci_asr + file_key: quality_radiance + fill_value: -1 + long_name: TOA Radiance % confidence + standard_name: radiance_quality + coordinates: + - longitude + - latitude + + land_pixel_percent: + name: land_pixel_percent + resolution: 32000 + file_type: nc_fci_asr + file_key: land_pixel_percent + standard_name: land_area_fraction + coordinates: + - longitude + - latitude + + water_pixel_percent: + name: water_pixel_percent + resolution: 32000 + file_type: nc_fci_asr + file_key: water_pixel_percent + standard_name: water_area_fraction + coordinates: + - longitude + - latitude + + pixel_percentage: + name: pixel_percentage + resolution: 32000 + file_type: nc_fci_asr + file_key: pixel_percentage + standard_name: pixels_used_fraction + coordinates: + - longitude + - latitude + + reflectance_mean_all_vis04: + name: reflectance_mean_all_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 0 category_id: 0 - channel_id: 0 - long_name: TOA mean Radiance over all pixels for vis04 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.4um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_vis04: - name: radiance_mean_clear_vis04 + reflectance_mean_clear_vis04: + name: reflectance_mean_clear_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 0 category_id: 1 - channel_id: 0 - long_name: TOA mean Radiance over clear pixels for vis04 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.4um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_vis04: - name: radiance_mean_cloudy_vis04 + reflectance_mean_cloudy_vis04: + name: reflectance_mean_cloudy_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 0 category_id: 2 - channel_id: 0 - long_name: TOA mean Radiance over cloudy pixels for vis04 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.4um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_vis05: - name: radiance_mean_all_vis05 + reflectance_mean_all_vis05: + name: reflectance_mean_all_vis05 resolution: 32000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 1 category_id: 0 - channel_id: 1 - long_name: TOA mean Radiance over all pixels for vis05 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.5um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_vis05: - name: radiance_mean_clear_vis05 + reflectance_mean_clear_vis05: + name: reflectance_mean_clear_vis05 resolution: 32000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 1 category_id: 1 - channel_id: 1 - long_name: TOA mean Radiance over clear pixels for vis05 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.5um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_vis05: - name: radiance_mean_cloudy_vis05 + reflectance_mean_cloudy_vis05: + name: reflectance_mean_cloudy_vis05 resolution: 32000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 1 category_id: 2 - channel_id: 1 - long_name: TOA mean Radiance over cloudy pixels for vis05 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.5um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_vis06: - name: radiance_mean_all_vis06 + reflectance_mean_all_vis06: + name: reflectance_mean_all_vis06 resolution: 32000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 2 category_id: 0 - channel_id: 2 - long_name: TOA mean Radiance over all pixels for vis06 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.6um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_vis06: - name: radiance_mean_clear_vis06 + reflectance_mean_clear_vis06: + name: reflectance_mean_clear_vis06 resolution: 32000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 2 category_id: 1 - channel_id: 2 - long_name: TOA mean Radiance over clear pixels for vis06 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.6um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_vis06: - name: radiance_mean_cloudy_vis06 + reflectance_mean_cloudy_vis06: + name: reflectance_mean_cloudy_vis06 resolution: 32000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 2 category_id: 2 - channel_id: 2 - long_name: TOA mean Radiance over cloudy pixels for vis06 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.6um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_vis08: - name: radiance_mean_all_vis08 + reflectance_mean_all_vis08: + name: reflectance_mean_all_vis08 resolution: 32000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 3 category_id: 0 - channel_id: 3 - long_name: TOA mean Radiance over all pixels for vis08 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_vis08: - name: radiance_mean_clear_vis08 + reflectance_mean_clear_vis08: + name: reflectance_mean_clear_vis08 resolution: 32000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 3 category_id: 1 - channel_id: 3 - long_name: TOA mean Radiance over clear pixels for vis08 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_vis08: - name: radiance_mean_cloudy_vis08 + reflectance_mean_cloudy_vis08: + name: reflectance_mean_cloudy_vis08 resolution: 32000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 3 category_id: 2 - channel_id: 3 - long_name: TOA mean Radiance over cloudy pixels for vis08 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_vis09: - name: radiance_mean_all_vis09 + reflectance_mean_all_vis09: + name: reflectance_mean_all_vis09 resolution: 32000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 4 category_id: 0 - channel_id: 4 - long_name: TOA mean Radiance over all pixels for vis09 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_vis09: - name: radiance_mean_clear_vis09 + reflectance_mean_clear_vis09: + name: reflectance_mean_clear_vis09 resolution: 32000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 4 category_id: 1 - channel_id: 4 - long_name: TOA mean Radiance over clear pixels for vis09 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_vis09: - name: radiance_mean_cloudy_vis09 + reflectance_mean_cloudy_vis09: + name: reflectance_mean_cloudy_vis09 resolution: 32000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 4 category_id: 2 - channel_id: 4 - long_name: TOA mean Radiance over cloudy pixels for vis09 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 0.9um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_nir13: - name: radiance_mean_all_nir13 + reflectance_mean_all_nir13: + name: reflectance_mean_all_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 5 category_id: 0 - channel_id: 5 - long_name: TOA mean Radiance over all pixels for nir13 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 1.4um (all pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_nir13: - name: radiance_mean_clear_nir13 + reflectance_mean_clear_nir13: + name: reflectance_mean_clear_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 5 category_id: 1 - channel_id: 5 - long_name: TOA mean Radiance over clear pixels for nir13 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 1.4um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_nir13: - name: radiance_mean_cloudy_nir13 + reflectance_mean_cloudy_nir13: + name: reflectance_mean_cloudy_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: radiance_mean + file_key: reflectance_mean + vis_channel_id: 5 category_id: 2 - channel_id: 5 - long_name: TOA mean Radiance over cloudy pixels for nir13 channel - standard_name: toa_radiance + long_name: TOA Bidirectional Reflectance segment mean at 1.4um (cloudy pixels) + standard_name: toa_bidirectional_reflectance + cell_method: area:mean + coordinates: + - longitude + - latitude + + reflectance_mean_all_nir16: + name: reflectance_mean_all_nir16 + resolution: 32000 + wavelength: [1.56, 1.61, 1.66] + file_type: nc_fci_asr + file_key: reflectance_mean + vis_channel_id: 6 + category_id: 0 + long_name: TOA Bidirectional Reflectance segment mean at 1.6um (all pixels) + standard_name: toa_bidirectional_reflectance + cell_method: area:mean + coordinates: + - longitude + - latitude + + reflectance_mean_clear_nir16: + name: reflectance_mean_clear_nir16 + resolution: 32000 + wavelength: [1.56, 1.61, 1.66] + file_type: nc_fci_asr + file_key: reflectance_mean + vis_channel_id: 6 + category_id: 1 + long_name: TOA Bidirectional Reflectance segment mean at 1.6um (clear pixels) + standard_name: toa_bidirectional_reflectance + cell_method: area:mean + coordinates: + - longitude + - latitude + + reflectance_mean_cloudy_nir16: + name: reflectance_mean_cloudy_nir16 + resolution: 32000 + wavelength: [1.56, 1.61, 1.66] + file_type: nc_fci_asr + file_key: reflectance_mean + vis_channel_id: 6 + category_id: 2 + long_name: TOA Bidirectional Reflectance segment mean at 1.6um (cloudy pixels) + standard_name: toa_bidirectional_reflectance + cell_method: area:mean + coordinates: + - longitude + - latitude + + reflectance_mean_all_nir22: + name: reflectance_mean_all_nir22 + resolution: 32000 + wavelength: [2.2, 2.25, 2.3] + file_type: nc_fci_asr + file_key: reflectance_mean + vis_channel_id: 7 + category_id: 0 + long_name: TOA Bidirectional Reflectance segment mean at 2.2um (all pixels) + standard_name: toa_bidirectional_reflectance + cell_method: area:mean + coordinates: + - longitude + - latitude + + reflectance_mean_clear_nir22: + name: reflectance_mean_clear_nir22 + resolution: 32000 + wavelength: [2.2, 2.25, 2.3] + file_type: nc_fci_asr + file_key: reflectance_mean + vis_channel_id: 7 + category_id: 1 + long_name: TOA Bidirectional Reflectance segment mean at 2.2um (clear pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_nir16: - name: radiance_mean_all_nir16 + reflectance_mean_cloudy_nir22: + name: reflectance_mean_cloudy_nir22 resolution: 32000 - wavelength: [1.56, 1.61, 1.66] + wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: radiance_mean - category_id: 0 - channel_id: 6 - long_name: TOA mean Radiance over all pixels for nir16 channel - standard_name: toa_radiance + file_key: reflectance_mean + vis_channel_id: 7 + category_id: 2 + long_name: TOA Bidirectional Reflectance segment mean at 2.2um (cloudy pixels) + standard_name: toa_bidirectional_reflectance cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_nir16: - name: radiance_mean_clear_nir16 + reflectance_min: + name: reflectance_min resolution: 32000 - wavelength: [1.56, 1.61, 1.66] + wavelength: [] file_type: nc_fci_asr - file_key: radiance_mean - category_id: 1 - channel_id: 6 - long_name: TOA mean Radiance over clear pixels for nir16 channel - standard_name: toa_radiance - cell_method: area:mean + file_key: reflectance_min + long_name: TOA Bidirectional Reflectance segment min + standard_name: toa_bidirectional_reflectance + cell_method: area:minimum coordinates: - longitude - latitude - radiance_mean_cloudy_nir16: - name: radiance_mean_cloudy_nir16 + reflectance_std: + name: reflectance_std resolution: 32000 - wavelength: [1.56, 1.61, 1.66] + wavelength: [] file_type: nc_fci_asr - file_key: radiance_mean - category_id: 2 - channel_id: 6 - long_name: TOA mean Radiance over cloudy pixels for nir16 channel - standard_name: toa_radiance - cell_method: area:mean + file_key: reflectance_std + long_name: TOA Bidirectional Reflectance standard deviation + standard_name: toa_bidirectional_reflectance + cell_method: area:standard_deviation coordinates: - longitude - latitude - radiance_mean_all_nir22: - name: radiance_mean_all_nir22 + quality_reflectance: + name: quality_reflectance resolution: 32000 - wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: radiance_mean - category_id: 0 - channel_id: 7 - long_name: TOA mean Radiance over all pixels for nir22 channel - standard_name: toa_radiance - cell_method: area:mean + file_key: quality_reflectance + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence + standard_name: reflectance_quality coordinates: - longitude - latitude - radiance_mean_clear_nir22: - name: radiance_mean_clear_nir22 + bt_max: + name: bt_max resolution: 32000 - wavelength: [2.2, 2.25, 2.3] + wavelength: [] file_type: nc_fci_asr - file_key: radiance_mean - category_id: 1 - channel_id: 7 - long_name: TOA mean Radiance over clear pixels for nir22 channel - standard_name: toa_radiance - cell_method: area:mean + file_key: bt_max + long_name: TOA Brightess Temperature segment max + standard_name: toa_brightess_temperature + cell_method: area:maximum coordinates: - longitude - latitude - radiance_mean_cloudy_nir22: - name: radiance_mean_cloudy_nir22 + bt_mean: + name: bt_mean resolution: 32000 - wavelength: [2.2, 2.25, 2.3] + wavelength: [] file_type: nc_fci_asr - file_key: radiance_mean - category_id: 2 - channel_id: 7 - long_name: TOA mean Radiance over cloudy pixels for nir22 channel - standard_name: toa_radiance + file_key: bt_mean + long_name: TOA Brightess Temperature segment mean + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_ir38: - name: radiance_mean_all_ir38 + bt_mean_all_ir38: + name: bt_mean_all_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 0 category_id: 0 - channel_id: 8 - long_name: TOA mean Radiance over all pixels for ir38 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 3.8um (all pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_ir38: - name: radiance_mean_clear_ir38 + bt_mean_clear_ir38: + name: bt_mean_clear_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 0 category_id: 1 - channel_id: 8 - long_name: TOA mean Radiance over clear pixels for ir38 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 3.8um (clear pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_ir38: - name: radiance_mean_cloudy_ir38 + bt_mean_cloudy_ir38: + name: bt_mean_cloudy_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 0 category_id: 2 - channel_id: 8 - long_name: TOA mean Radiance over cloudy pixels for ir38 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 3.8um (cloudy pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_wv63: - name: radiance_mean_all_wv63 + bt_mean_all_wv63: + name: bt_mean_all_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 1 category_id: 0 - channel_id: 9 - long_name: TOA mean Radiance over all pixels for wv63 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 6.3um (all pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_wv63: - name: radiance_mean_clear_wv63 + bt_mean_clear_wv63: + name: bt_mean_clear_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 1 category_id: 1 - channel_id: 9 - long_name: TOA mean Radiance over clear pixels for wv63 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 6.3um (clear pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_wv63: - name: radiance_mean_cloudy_wv63 + bt_mean_cloudy_wv63: + name: bt_mean_cloudy_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 1 category_id: 2 - channel_id: 9 - long_name: TOA mean Radiance over cloudy pixels for wv63 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 6.3um (cloudy pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_wv73: - name: radiance_mean_all_wv73 + bt_mean_all_wv73: + name: bt_mean_all_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 2 category_id: 0 - channel_id: 10 - long_name: TOA mean Radiance over all pixels for wv73 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 7.3um (all pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_wv73: - name: radiance_mean_clear_wv73 + bt_mean_clear_wv73: + name: bt_mean_clear_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 2 category_id: 1 - channel_id: 10 - long_name: TOA mean Radiance over clear pixels for wv73 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 7.3um (clear pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_wv73: - name: radiance_mean_cloudy_wv73 + bt_mean_cloudy_wv73: + name: bt_mean_cloudy_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 2 category_id: 2 - channel_id: 10 - long_name: TOA mean Radiance over cloudy pixels for wv73 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 7.3um (cloudy pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_ir87: - name: radiance_mean_all_ir87 + bt_mean_all_ir87: + name: bt_mean_all_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 3 category_id: 0 - channel_id: 11 - long_name: TOA mean Radiance over all pixels for ir87 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 8.7um (all pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_ir87: - name: radiance_mean_clear_ir87 + bt_mean_clear_ir87: + name: bt_mean_clear_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 3 category_id: 1 - channel_id: 11 - long_name: TOA mean Radiance over clear pixels for ir87 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 8.7um (clear pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_ir87: - name: radiance_mean_cloudy_ir87 + bt_mean_cloudy_ir87: + name: bt_mean_cloudy_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 3 category_id: 2 - channel_id: 11 - long_name: TOA mean Radiance over cloudy pixels for ir87 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 8.7um (cloudy pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_ir97: - name: radiance_mean_all_ir97 + bt_mean_all_ir97: + name: bt_mean_all_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 4 category_id: 0 - channel_id: 12 - long_name: TOA mean Radiance over all pixels for ir97 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 9.7um (all pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_ir97: - name: radiance_mean_clear_ir97 + bt_mean_clear_ir97: + name: bt_mean_clear_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 4 category_id: 1 - channel_id: 12 - long_name: TOA mean Radiance over clear pixels for ir97 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 9.7um (clear pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_ir97: - name: radiance_mean_cloudy_ir97 + bt_mean_cloudy_ir97: + name: bt_mean_cloudy_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 4 category_id: 2 - channel_id: 12 - long_name: TOA mean Radiance over cloudy pixels for ir97 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 9.7um (cloudy pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_ir105: - name: radiance_mean_all_ir105 + bt_mean_all_ir105: + name: bt_mean_all_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 5 category_id: 0 - channel_id: 13 - long_name: TOA mean Radiance over all pixels for ir105 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 10.5um (all pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_clear_ir105: - name: radiance_mean_clear_ir105 + bt_mean_clear_ir105: + name: bt_mean_clear_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 5 category_id: 1 - channel_id: 13 - long_name: TOA mean Radiance over clear pixels for ir105 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 10.5um (clear pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_ir105: - name: radiance_mean_cloudy_ir105 + bt_mean_cloudy_ir105: + name: bt_mean_cloudy_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 5 category_id: 2 - channel_id: 13 - long_name: TOA mean Radiance over cloudy pixels for ir105 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 10.5um (cloudy pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_all_ir123: - name: radiance_mean_all_ir123 + bt_mean_all_ir123: + name: bt_mean_all_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: radiance_mean + file_key: bt_mean + ir_channel_id: 6 category_id: 0 - channel_id: 14 - long_name: TOA mean Radiance over all pixels for ir123 channel - standard_name: toa_radiance - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_ir123: - name: radiance_mean_clear_ir123 - resolution: 32000 - wavelength: [11.8, 12.3, 12.8] - file_type: nc_fci_asr - file_key: radiance_mean - category_id: 1 - channel_id: 14 - long_name: TOA mean Radiance over clear pixels for ir123 channel - standard_name: toa_radiance + long_name: TOA Brightess Temperature segment mean at 12.3um (all pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - radiance_mean_cloudy_ir123: - name: radiance_mean_cloudy_ir123 + bt_mean_clear_ir123: + name: bt_mean_clear_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] - file_type: nc_fci_asr - file_key: radiance_mean - category_id: 2 - channel_id: 14 - long_name: TOA mean Radiance over cloudy pixels for ir123 channel - standard_name: toa_radiance - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_ir133: - name: radiance_mean_all_ir133 - resolution: 32000 - wavelength: [12.7, 13.3, 13.9] - file_type: nc_fci_asr - file_key: radiance_mean - category_id: 0 - channel_id: 15 - long_name: TOA mean Radiance over all pixels for ir133 channel - standard_name: toa_radiance - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_ir133: - name: radiance_mean_clear_ir133 - resolution: 32000 - wavelength: [12.7, 13.3, 13.9] - file_type: nc_fci_asr - file_key: radiance_mean - category_id: 1 - channel_id: 15 - long_name: TOA mean Radiance over clear pixels for ir133 channel - standard_name: toa_radiance - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_ir133: - name: radiance_mean_cloudy_ir133 - resolution: 32000 - wavelength: [12.7, 13.3, 13.9] - file_type: nc_fci_asr - file_key: radiance_mean - category_id: 2 - channel_id: 15 - long_name: TOA mean Radiance over cloudy pixels for ir133 channel - standard_name: toa_radiance - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_std: - name: radiance_std - resolution: 32000 - wavelength: [] - file_type: nc_fci_asr - file_key: radiance_std - long_name: TOA Radiance standard deviation over None pixels for None channel - standard_name: toa_radiance - cell_method: area:standard_deviation + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 6 + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 12.3um (clear pixels) + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - radiance_quality: - name: radiance_quality + bt_mean_cloudy_ir123: + name: bt_mean_cloudy_ir123 resolution: 32000 - wavelength: [] + wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: radiance_quality - long_name: TOA Radiance Quality - standard_name: radiance_quality + file_key: bt_mean + ir_channel_id: 6 + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 12.3um (cloudy pixels) + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - reflectance_min: - name: reflectance_min + bt_mean_all_ir133: + name: bt_mean_all_ir133 resolution: 32000 - wavelength: [] + wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: reflectance_min - long_name: TOA min Reflectance - standard_name: toa_reflectance - cell_method: area:minimum + file_key: bt_mean + ir_channel_id: 7 + category_id: 0 + long_name: TOA Brightess Temperature segment mean at 13.3um (all pixels) + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - reflectance_max: - name: reflectance_max + bt_mean_clear_ir133: + name: bt_mean_clear_ir133 resolution: 32000 - wavelength: [] + wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: reflectance_max - long_name: TOA max Reflectance - standard_name: toa_reflectance - cell_method: area:maximum + file_key: bt_mean + ir_channel_id: 7 + category_id: 1 + long_name: TOA Brightess Temperature segment mean at 13.3um (clear pixels) + standard_name: toa_brightess_temperature + cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean: - name: reflectance_mean + bt_mean_cloudy_ir133: + name: bt_mean_cloudy_ir133 resolution: 32000 - wavelength: [] + wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: reflectance_mean - long_name: TOA mean Reflectance - standard_name: toa_reflectance + file_key: bt_mean + ir_channel_id: 7 + category_id: 2 + long_name: TOA Brightess Temperature segment mean at 13.3um (cloudy pixels) + standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - reflectance_mean_all_vis04: - name: reflectance_mean_all_vis04 + quality_reflectance_all_vis04: + name: quality_reflectance_all_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 0 + file_key: quality_reflectance vis_channel_id: 0 - long_name: TOA mean Reflectance over all pixels for vis04 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.4um (all pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_clear_vis04: - name: reflectance_mean_clear_vis04 + quality_reflectance_clear_vis04: + name: quality_reflectance_clear_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 1 + file_key: quality_reflectance vis_channel_id: 0 - long_name: TOA mean Reflectance over clear pixels for vis04 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.4um (clear pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_cloudy_vis04: - name: reflectance_mean_cloudy_vis04 + quality_reflectance_cloudy_vis04: + name: quality_reflectance_cloudy_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 2 + file_key: quality_reflectance vis_channel_id: 0 - long_name: TOA mean Reflectance over cloudy pixels for vis04 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.4um (cloudy pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_all_vis05: - name: reflectance_mean_all_vis05 + quality_reflectance_all_vis05: + name: quality_reflectance_all_vis05 resolution: 32000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 0 + file_key: quality_reflectance vis_channel_id: 1 - long_name: TOA mean Reflectance over all pixels for vis05 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.5um (all pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_clear_vis05: - name: reflectance_mean_clear_vis05 + quality_reflectance_clear_vis05: + name: quality_reflectance_clear_vis05 resolution: 32000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 1 + file_key: quality_reflectance vis_channel_id: 1 - long_name: TOA mean Reflectance over clear pixels for vis05 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.5um (clear pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_cloudy_vis05: - name: reflectance_mean_cloudy_vis05 + quality_reflectance_cloudy_vis05: + name: quality_reflectance_cloudy_vis05 resolution: 32000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 2 + file_key: quality_reflectance vis_channel_id: 1 - long_name: TOA mean Reflectance over cloudy pixels for vis05 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.5um (cloudy pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_all_vis06: - name: reflectance_mean_all_vis06 + quality_reflectance_all_vis06: + name: quality_reflectance_all_vis06 resolution: 32000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 0 + file_key: quality_reflectance vis_channel_id: 2 - long_name: TOA mean Reflectance over all pixels for vis06 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.6um (all pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_clear_vis06: - name: reflectance_mean_clear_vis06 + quality_reflectance_clear_vis06: + name: quality_reflectance_clear_vis06 resolution: 32000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 1 + file_key: quality_reflectance vis_channel_id: 2 - long_name: TOA mean Reflectance over clear pixels for vis06 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.6um (clear pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_cloudy_vis06: - name: reflectance_mean_cloudy_vis06 + quality_reflectance_cloudy_vis06: + name: quality_reflectance_cloudy_vis06 resolution: 32000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 2 + file_key: quality_reflectance vis_channel_id: 2 - long_name: TOA mean Reflectance over cloudy pixels for vis06 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.6um (cloudy pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_all_vis08: - name: reflectance_mean_all_vis08 + quality_reflectance_all_vis08: + name: quality_reflectance_all_vis08 resolution: 32000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 0 + file_key: quality_reflectance vis_channel_id: 3 - long_name: TOA mean Reflectance over all pixels for vis08 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.9um (all pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_clear_vis08: - name: reflectance_mean_clear_vis08 + quality_reflectance_clear_vis08: + name: quality_reflectance_clear_vis08 resolution: 32000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 1 + file_key: quality_reflectance vis_channel_id: 3 - long_name: TOA mean Reflectance over clear pixels for vis08 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.9um (clear pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_cloudy_vis08: - name: reflectance_mean_cloudy_vis08 + quality_reflectance_cloudy_vis08: + name: quality_reflectance_cloudy_vis08 resolution: 32000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 2 + file_key: quality_reflectance vis_channel_id: 3 - long_name: TOA mean Reflectance over cloudy pixels for vis08 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.9um (cloudy pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_all_vis09: - name: reflectance_mean_all_vis09 + quality_reflectance_all_vis09: + name: quality_reflectance_all_vis09 resolution: 32000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 0 + file_key: quality_reflectance vis_channel_id: 4 - long_name: TOA mean Reflectance over all pixels for vis09 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.9um (all pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_clear_vis09: - name: reflectance_mean_clear_vis09 + quality_reflectance_clear_vis09: + name: quality_reflectance_clear_vis09 resolution: 32000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 1 + file_key: quality_reflectance vis_channel_id: 4 - long_name: TOA mean Reflectance over clear pixels for vis09 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.9um (clear pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_cloudy_vis09: - name: reflectance_mean_cloudy_vis09 + quality_reflectance_cloudy_vis09: + name: quality_reflectance_cloudy_vis09 resolution: 32000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 2 + file_key: quality_reflectance vis_channel_id: 4 - long_name: TOA mean Reflectance over cloudy pixels for vis09 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 0.9um (cloudy pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_all_nir13: - name: reflectance_mean_all_nir13 + quality_reflectance_all_nir13: + name: quality_reflectance_all_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 0 + file_key: quality_reflectance vis_channel_id: 5 - long_name: TOA mean Reflectance over all pixels for nir13 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 1.4um (all pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_clear_nir13: - name: reflectance_mean_clear_nir13 + quality_reflectance_clear_nir13: + name: quality_reflectance_clear_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 1 + file_key: quality_reflectance vis_channel_id: 5 - long_name: TOA mean Reflectance over clear pixels for nir13 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 1.4um (clear pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_cloudy_nir13: - name: reflectance_mean_cloudy_nir13 + quality_reflectance_cloudy_nir13: + name: quality_reflectance_cloudy_nir13 resolution: 32000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 2 + file_key: quality_reflectance vis_channel_id: 5 - long_name: TOA mean Reflectance over cloudy pixels for nir13 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 1.4um (cloudy pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_all_nir16: - name: reflectance_mean_all_nir16 + quality_reflectance_all_nir16: + name: quality_reflectance_all_nir16 resolution: 32000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 0 + file_key: quality_reflectance vis_channel_id: 6 - long_name: TOA mean Reflectance over all pixels for nir16 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 1.6um (all pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_clear_nir16: - name: reflectance_mean_clear_nir16 + quality_reflectance_clear_nir16: + name: quality_reflectance_clear_nir16 resolution: 32000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 1 + file_key: quality_reflectance vis_channel_id: 6 - long_name: TOA mean Reflectance over clear pixels for nir16 channel - standard_name: toa_reflectance - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 1.6um (clear pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - reflectance_mean_cloudy_nir16: - name: reflectance_mean_cloudy_nir16 + quality_reflectance_cloudy_nir16: + name: quality_reflectance_cloudy_nir16 resolution: 32000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 2 + file_key: quality_reflectance vis_channel_id: 6 - long_name: TOA mean Reflectance over cloudy pixels for nir16 channel - standard_name: toa_reflectance - cell_method: area:mean - coordinates: - - longitude - - latitude - - reflectance_mean_all_nir22: - name: reflectance_mean_all_nir22 - resolution: 32000 - wavelength: [2.2, 2.25, 2.3] - file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 0 - vis_channel_id: 7 - long_name: TOA mean Reflectance over all pixels for nir22 channel - standard_name: toa_reflectance - cell_method: area:mean - coordinates: - - longitude - - latitude - - reflectance_mean_clear_nir22: - name: reflectance_mean_clear_nir22 - resolution: 32000 - wavelength: [2.2, 2.25, 2.3] - file_type: nc_fci_asr - file_key: reflectance_mean - category_id: 1 - vis_channel_id: 7 - long_name: TOA mean Reflectance over clear pixels for nir22 channel - standard_name: toa_reflectance - cell_method: area:mean - coordinates: - - longitude - - latitude - - reflectance_mean_cloudy_nir22: - name: reflectance_mean_cloudy_nir22 - resolution: 32000 - wavelength: [2.2, 2.25, 2.3] - file_type: nc_fci_asr - file_key: reflectance_mean category_id: 2 - vis_channel_id: 7 - long_name: TOA mean Reflectance over cloudy pixels for nir22 channel - standard_name: toa_reflectance - cell_method: area:mean - coordinates: - - longitude - - latitude - - reflectance_std: - name: reflectance_std - resolution: 32000 - wavelength: [] - file_type: nc_fci_asr - file_key: reflectance_std - long_name: TOA Reflectance standard deviation - standard_name: toa_reflectance - cell_method: area:standard_deviation - coordinates: - - longitude - - latitude - - reflectance_quality: - name: reflectance_quality - resolution: 32000 - wavelength: [] - file_type: nc_fci_asr - file_key: reflectance_quality - long_name: TOA Reflectance Quality + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 1.6um (cloudy pixels) standard_name: reflectance_quality coordinates: - longitude - latitude - bt_min: - name: bt_min + quality_reflectance_all_nir22: + name: quality_reflectance_all_nir22 resolution: 32000 - wavelength: [] + wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: bt_min - long_name: TOA min Brightess Temperature - standard_name: toa_brightess_temperature - cell_method: area:minimum + file_key: quality_reflectance + vis_channel_id: 7 + category_id: 0 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 2.2um (all pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - bt_max: - name: bt_max + quality_reflectance_clear_nir22: + name: quality_reflectance_clear_nir22 resolution: 32000 - wavelength: [] + wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: bt_max - long_name: TOA max Brightess Temperature - standard_name: toa_brightess_temperature - cell_method: area:maximum + file_key: quality_reflectance + vis_channel_id: 7 + category_id: 1 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 2.2um (clear pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - bt_mean: - name: bt_mean + quality_reflectance_cloudy_nir22: + name: quality_reflectance_cloudy_nir22 resolution: 32000 - wavelength: [] + wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr - file_key: bt_mean - long_name: TOA mean Brightess Temperature - standard_name: toa_brightess_temperature - cell_method: area:mean + file_key: quality_reflectance + vis_channel_id: 7 + category_id: 2 + fill_value: -1 + long_name: TOA Bidirectional Reflectance % confidence at 2.2um (cloudy pixels) + standard_name: reflectance_quality coordinates: - longitude - latitude - bt_mean_all_ir38: - name: bt_mean_all_ir38 + quality_bt_all_ir38: + name: quality_bt_all_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: bt_mean - category_id: 0 + file_key: quality_bt ir_channel_id: 0 - long_name: TOA mean Brightess Temperature over all pixels for ir38 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 3.8um (all pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_clear_ir38: - name: bt_mean_clear_ir38 + quality_bt_clear_ir38: + name: quality_bt_clear_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: bt_mean - category_id: 1 + file_key: quality_bt ir_channel_id: 0 - long_name: TOA mean Brightess Temperature over clear pixels for ir38 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 3.8um (clear pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_cloudy_ir38: - name: bt_mean_cloudy_ir38 + quality_bt_cloudy_ir38: + name: quality_bt_cloudy_ir38 resolution: 32000 wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr - file_key: bt_mean - category_id: 2 + file_key: quality_bt ir_channel_id: 0 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir38 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 3.8um (cloudy pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_all_wv63: - name: bt_mean_all_wv63 + quality_bt_all_wv63: + name: quality_bt_all_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: bt_mean - category_id: 0 + file_key: quality_bt ir_channel_id: 1 - long_name: TOA mean Brightess Temperature over all pixels for wv63 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 6.3um (all pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_clear_wv63: - name: bt_mean_clear_wv63 + quality_bt_clear_wv63: + name: quality_bt_clear_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: bt_mean - category_id: 1 + file_key: quality_bt ir_channel_id: 1 - long_name: TOA mean Brightess Temperature over clear pixels for wv63 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 6.3um (clear pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_cloudy_wv63: - name: bt_mean_cloudy_wv63 + quality_bt_cloudy_wv63: + name: quality_bt_cloudy_wv63 resolution: 32000 wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr - file_key: bt_mean - category_id: 2 + file_key: quality_bt ir_channel_id: 1 - long_name: TOA mean Brightess Temperature over cloudy pixels for wv63 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 6.3um (cloudy pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_all_wv73: - name: bt_mean_all_wv73 + quality_bt_all_wv73: + name: quality_bt_all_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: bt_mean - category_id: 0 + file_key: quality_bt ir_channel_id: 2 - long_name: TOA mean Brightess Temperature over all pixels for wv73 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 7.3um (all pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_clear_wv73: - name: bt_mean_clear_wv73 + quality_bt_clear_wv73: + name: quality_bt_clear_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: bt_mean - category_id: 1 + file_key: quality_bt ir_channel_id: 2 - long_name: TOA mean Brightess Temperature over clear pixels for wv73 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 7.3um (clear pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_cloudy_wv73: - name: bt_mean_cloudy_wv73 + quality_bt_cloudy_wv73: + name: quality_bt_cloudy_wv73 resolution: 32000 wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr - file_key: bt_mean - category_id: 2 + file_key: quality_bt ir_channel_id: 2 - long_name: TOA mean Brightess Temperature over cloudy pixels for wv73 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 7.3um (cloudy pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_all_ir87: - name: bt_mean_all_ir87 + quality_bt_all_ir87: + name: quality_bt_all_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: bt_mean - category_id: 0 + file_key: quality_bt ir_channel_id: 3 - long_name: TOA mean Brightess Temperature over all pixels for ir87 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 8.7um (all pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_clear_ir87: - name: bt_mean_clear_ir87 + quality_bt_clear_ir87: + name: quality_bt_clear_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: bt_mean - category_id: 1 + file_key: quality_bt ir_channel_id: 3 - long_name: TOA mean Brightess Temperature over clear pixels for ir87 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 8.7um (clear pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_cloudy_ir87: - name: bt_mean_cloudy_ir87 + quality_bt_cloudy_ir87: + name: quality_bt_cloudy_ir87 resolution: 32000 wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: bt_mean - category_id: 2 + file_key: quality_bt ir_channel_id: 3 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir87 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 8.7um (cloudy pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_all_ir97: - name: bt_mean_all_ir97 + quality_bt_all_ir97: + name: quality_bt_all_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: bt_mean - category_id: 0 + file_key: quality_bt ir_channel_id: 4 - long_name: TOA mean Brightess Temperature over all pixels for ir97 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 9.7um (all pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_clear_ir97: - name: bt_mean_clear_ir97 + quality_bt_clear_ir97: + name: quality_bt_clear_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: bt_mean - category_id: 1 + file_key: quality_bt ir_channel_id: 4 - long_name: TOA mean Brightess Temperature over clear pixels for ir97 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 9.7um (clear pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_cloudy_ir97: - name: bt_mean_cloudy_ir97 + quality_bt_cloudy_ir97: + name: quality_bt_cloudy_ir97 resolution: 32000 wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: bt_mean - category_id: 2 + file_key: quality_bt ir_channel_id: 4 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir97 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 9.7um (cloudy pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_all_ir105: - name: bt_mean_all_ir105 + quality_bt_all_ir105: + name: quality_bt_all_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: bt_mean - category_id: 0 + file_key: quality_bt ir_channel_id: 5 - long_name: TOA mean Brightess Temperature over all pixels for ir105 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 10.5um (all pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_clear_ir105: - name: bt_mean_clear_ir105 + quality_bt_clear_ir105: + name: quality_bt_clear_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: bt_mean - category_id: 1 + file_key: quality_bt ir_channel_id: 5 - long_name: TOA mean Brightess Temperature over clear pixels for ir105 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 10.5um (clear pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_cloudy_ir105: - name: bt_mean_cloudy_ir105 + quality_bt_cloudy_ir105: + name: quality_bt_cloudy_ir105 resolution: 32000 wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: bt_mean - category_id: 2 + file_key: quality_bt ir_channel_id: 5 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir105 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 10.5um (cloudy pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_all_ir123: - name: bt_mean_all_ir123 + quality_bt_all_ir123: + name: quality_bt_all_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: bt_mean - category_id: 0 + file_key: quality_bt ir_channel_id: 6 - long_name: TOA mean Brightess Temperature over all pixels for ir123 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 12.3um (all pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_clear_ir123: - name: bt_mean_clear_ir123 + quality_bt_clear_ir123: + name: quality_bt_clear_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: bt_mean - category_id: 1 + file_key: quality_bt ir_channel_id: 6 - long_name: TOA mean Brightess Temperature over clear pixels for ir123 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 12.3um (clear pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_cloudy_ir123: - name: bt_mean_cloudy_ir123 + quality_bt_cloudy_ir123: + name: quality_bt_cloudy_ir123 resolution: 32000 wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: bt_mean - category_id: 2 + file_key: quality_bt ir_channel_id: 6 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir123 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 2 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 12.3um (cloudy pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_all_ir133: - name: bt_mean_all_ir133 + quality_bt_all_ir133: + name: quality_bt_all_ir133 resolution: 32000 wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: bt_mean - category_id: 0 + file_key: quality_bt ir_channel_id: 7 - long_name: TOA mean Brightess Temperature over all pixels for ir133 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 0 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 13.3um (all pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_clear_ir133: - name: bt_mean_clear_ir133 + quality_bt_clear_ir133: + name: quality_bt_clear_ir133 resolution: 32000 wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: bt_mean - category_id: 1 + file_key: quality_bt ir_channel_id: 7 - long_name: TOA mean Brightess Temperature over clear pixels for ir133 channel - standard_name: toa_brightess_temperature - cell_method: area:mean + category_id: 1 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 13.3um (clear pixels) + standard_name: brightness_temperature_quality coordinates: - longitude - latitude - bt_mean_cloudy_ir133: - name: bt_mean_cloudy_ir133 + quality_bt_cloudy_ir133: + name: quality_bt_cloudy_ir133 resolution: 32000 wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: bt_mean - category_id: 2 + file_key: quality_bt ir_channel_id: 7 - long_name: TOA mean Brightess Temperature over cloudy pixels for ir133 channel - standard_name: toa_brightess_temperature - cell_method: area:mean - coordinates: - - longitude - - latitude - - bt_std: - name: bt_std - resolution: 32000 - wavelength: [] - file_type: nc_fci_asr - file_key: bt_std - long_name: TOA Brightess Temperature standard deviation - standard_name: toa_brightess_temperature - cell_method: area:standard_deviation - coordinates: - - longitude - - latitude - - bt_quality: - name: bt_quality - resolution: 32000 - wavelength: [] - file_type: nc_fci_asr - file_key: bt_quality - long_name: TOA Brightess Temperature Quality + category_id: 2 + fill_value: -1 + long_name: TOA Brightess Temperature % confidence at 13.3um (cloudy pixels) standard_name: brightness_temperature_quality coordinates: - longitude - latitude - pixel_percentage: - name: pixel_percentage + pixel_percentage_all: + name: pixel_percentage_all resolution: 32000 file_type: nc_fci_asr file_key: pixel_percentage + long_name: Percentage of FoR pixels used (all pixels) standard_name: pixels_used_fraction + category_id: 0 coordinates: - longitude - latitude - land_pixel_percent: - name: land_pixel_percent + pixel_percentage_clear: + name: pixel_percentage_clear resolution: 32000 file_type: nc_fci_asr - file_key: land_pixel_percent - standard_name: land_area_fraction + file_key: pixel_percentage + long_name: Percentage of FoR pixels used (clear pixels) + standard_name: pixels_used_fraction + category_id: 1 coordinates: - longitude - latitude - water_pixel_percent: - name: water_pixel_percent + pixel_percentage_cloudy: + name: pixel_percentage_cloudy resolution: 32000 file_type: nc_fci_asr - file_key: water_pixel_percent - standard_name: water_area_fraction + file_key: pixel_percentage + long_name: Percentage of FoR pixels used (cloudy pixels) + standard_name: pixels_used_fraction + category_id: 2 coordinates: - longitude - latitude From 86b96a67a5633848b00fb09e5e07a8d29676bd43 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Fri, 15 Dec 2023 17:10:49 +0100 Subject: [PATCH 101/481] Fix ASR issues --- satpy/etc/readers/fci_l2_nc.yaml | 86 ++++---------------------------- 1 file changed, 11 insertions(+), 75 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index b8c342dac1..1334448baa 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1365,26 +1365,26 @@ datasets: - longitude - latitude - radiance_min: - name: radiance_min + radiance_mean: + name: radiance_mean resolution: 32000 file_type: nc_fci_asr - file_key: radiance_min - long_name: TOA min Radiance + file_key: radiance_mean + long_name: TOA mean Radiance standard_name: toa_radiance - cell_method: area:minimum + cell_method: area:mean coordinates: - longitude - latitude - radiance_mean: - name: radiance_mean + radiance_min: + name: radiance_min resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean - long_name: TOA mean Radiance + file_key: radiance_min + long_name: TOA min Radiance standard_name: toa_radiance - cell_method: area:mean + cell_method: area:minimum coordinates: - longitude - latitude @@ -1876,70 +1876,6 @@ datasets: - longitude - latitude - reflectance_min: - name: reflectance_min - resolution: 32000 - wavelength: [] - file_type: nc_fci_asr - file_key: reflectance_min - long_name: TOA Bidirectional Reflectance segment min - standard_name: toa_bidirectional_reflectance - cell_method: area:minimum - coordinates: - - longitude - - latitude - - reflectance_std: - name: reflectance_std - resolution: 32000 - wavelength: [] - file_type: nc_fci_asr - file_key: reflectance_std - long_name: TOA Bidirectional Reflectance standard deviation - standard_name: toa_bidirectional_reflectance - cell_method: area:standard_deviation - coordinates: - - longitude - - latitude - - quality_reflectance: - name: quality_reflectance - resolution: 32000 - file_type: nc_fci_asr - file_key: quality_reflectance - fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence - standard_name: reflectance_quality - coordinates: - - longitude - - latitude - - bt_max: - name: bt_max - resolution: 32000 - wavelength: [] - file_type: nc_fci_asr - file_key: bt_max - long_name: TOA Brightess Temperature segment max - standard_name: toa_brightess_temperature - cell_method: area:maximum - coordinates: - - longitude - - latitude - - bt_mean: - name: bt_mean - resolution: 32000 - wavelength: [] - file_type: nc_fci_asr - file_key: bt_mean - long_name: TOA Brightess Temperature segment mean - standard_name: toa_brightess_temperature - cell_method: area:mean - coordinates: - - longitude - - latitude - bt_mean_all_ir38: name: bt_mean_all_ir38 resolution: 32000 @@ -2300,7 +2236,7 @@ datasets: - longitude - latitude - quality_reflectance_all_vis04: + quality_reflectance_all_vis04: name: quality_reflectance_all_vis04 resolution: 32000 wavelength: [0.384, 0.444, 0.504] From 22dc07b63672436958daf46c685eb1bec4434c1e Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Fri, 15 Dec 2023 17:20:55 +0100 Subject: [PATCH 102/481] Various fixes --- satpy/etc/readers/fci_l2_nc.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 1334448baa..f8e102e030 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1045,13 +1045,14 @@ datasets: file_key: cloud_mask_test_result extract_byte: 0 flag_values: [0,1] - flag_meanings: [' Snow/Ice undetected',' Snow/Ice detected'] + flag_meanings: ['No snow/Ice detected',' Snow/Ice detected'] standard_name: status_flag cloud_test_cmt1: name: cloud_test_cmt1 resolution: 2000 file_type: nc_fci_test_clm + file_key: cloud_mask_test_result extract_byte: 1 flag_values: [0,1] flag_meanings: ['Cloud undetected','Cloud detected'] @@ -1092,7 +1093,7 @@ datasets: resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result - sextract_byte: 5 + extract_byte: 5 flag_values: [0,1] flag_meanings: ['Cloud undetected','Cloud detected'] standard_name: status_flag From 47813c4d4ae3afa8a8099b0c8c3c5f069e3864a6 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Fri, 15 Dec 2023 17:33:03 +0100 Subject: [PATCH 103/481] Fix GII typos --- satpy/etc/readers/fci_l2_nc.yaml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index f8e102e030..0de8d47491 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -697,7 +697,7 @@ datasets: coordinates: - longitude - latitude - standard_name: atmosphere_stability_lifted_index + standard_name: atmosphere_stability_k_index lifted_index: name: lifted_index @@ -707,7 +707,7 @@ datasets: coordinates: - longitude - latitude - standard_name: atmosphere_stability_k_index + standard_name: atmosphere_stability_lifted_index prec_water_high: name: prec_water_high @@ -754,9 +754,11 @@ datasets: resolution: 6000 file_type: nc_fci_gii file_key: percent_cloud_free + units: '%' coordinates: - longitude - latitude + long_name: Percentage of Cloud Free Pixels Processed in FoR standard_name: cloud_free_area_fraction number_of_iterations_gii: @@ -1255,7 +1257,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 21 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No dust detected','Dust detected'] standard_name: status_flag cloud_test_ash: @@ -1265,7 +1267,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 22 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No ash detected','Ash detected'] standard_name: status_flag cloud_test_dust_ash: @@ -1275,7 +1277,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 23 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Dust detected','Ash detected'] standard_name: status_flag cloud_test_cmrt6: From a62485bffd05fe48a0e6f829650f3d82e812302b Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 8 Jan 2024 11:47:40 +0100 Subject: [PATCH 104/481] Various fixes (long_names,units) --- satpy/etc/readers/fci_l2_nc.yaml | 60 +++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 0de8d47491..b1600aff50 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -353,6 +353,7 @@ datasets: file_type: nc_fci_oca file_key: retrieved_cloud_optical_thickness layer: 0 + long_name: Cloud Optical Thickness (referenced to 0.55 µm and in log10(COT)) for Upper Layer standard_name: atmosphere_optical_thickness_due_to_cloud retrieval_error_cloud_optical_thickness_upper_layer: @@ -361,6 +362,7 @@ datasets: file_type: nc_fci_oca file_key: retrieval_error_cloud_optical_thickness layer: 0 + long_name: Cloud Optical Thickness Error (error in log10(COT)) for Upper Layer standard_name: atmosphere_optical_thickness_due_to_cloud standard_error retrieved_cloud_optical_thickness_lower_layer: @@ -369,6 +371,7 @@ datasets: file_type: nc_fci_oca file_key: retrieved_cloud_optical_thickness layer: 1 + long_name: Cloud Optical Thickness (referenced to 0.55 µm and in log10(COT)) for Lower Layer standard_name: atmosphere_optical_thickness_due_to_cloud retrieval_error_cloud_optical_thickness_lower_layer: @@ -377,21 +380,22 @@ datasets: file_type: nc_fci_oca file_key: retrieval_error_cloud_optical_thickness layer: 1 + long_name: Cloud Optical Thickness Error (error in log10(COT)) for Lower Layer standard_name: atmosphere_optical_thickness_due_to_cloud standard_error retrieved_cloud_particle_effective_radius: - name: retrieved_cloud_particle_effective_radius_upper_layer + name: retrieved_cloud_particle_effective_radius resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_particle_effective_radius - standard_name: effective_radius_of_cloud_particles + standard_name: effective_radius_of_cloud_particles_at_cloud_top retrieval_error_cloud_particle_effective_radius: - name: retrieval_error_cloud_particle_effective_radius_upper_layer + name: retrieval_error_cloud_particle_effective_radius resolution: 2000 file_type: nc_fci_oca file_key: retrieval_error_cloud_particle_effective_radius - standard_name: effective_radius_of_cloud_particles standard_error + standard_name: effective_radius_of_cloud_particles_at_cloud_top standard_error retrieved_cloud_top_pressure_upper_layer: name: retrieved_cloud_top_pressure_upper_layer @@ -399,6 +403,7 @@ datasets: file_type: nc_fci_oca file_key: retrieved_cloud_top_pressure layer: 0 + long_name: Cloud Top Pressure for Upper Layer standard_name: air_pressure_at_cloud_top retrieval_error_cloud_top_pressure_upper_layer: @@ -407,6 +412,7 @@ datasets: file_type: nc_fci_oca file_key: retrieval_error_cloud_top_pressure layer: 0 + long_name: Cloud Top Pressure Error for Upper Layer standard_name: air_pressure_at_cloud_top standard_error retrieved_cloud_top_pressure_lower_layer: @@ -415,6 +421,7 @@ datasets: file_type: nc_fci_oca file_key: retrieved_cloud_top_pressure layer: 1 + long_name: Cloud Top Pressure for Lower Layer standard_name: air_pressure_at_cloud_top retrieval_error_cloud_top_pressure_lower_layer: @@ -423,17 +430,18 @@ datasets: file_type: nc_fci_oca file_key: retrieval_error_cloud_top_pressure layer: 1 - standard_name: air_pressure_at_cloud_top standard_erro + long_name: Cloud Top Pressure Error for Lower Layer + standard_name: air_pressure_at_cloud_top standard_error retrieved_cloud_top_temperature: - name: retrieved_cloud_top_temperature_upper_layer + name: retrieved_cloud_top_temperature resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_top_temperature standard_name: air_temperature_at_cloud_top retrieved_cloud_top_height: - name: retrieved_cloud_top_height_upper_layer + name: retrieved_cloud_top_height resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_top_height @@ -650,6 +658,7 @@ datasets: file_type: nc_fci_crm file_key: historical_data standard_name: status_flag + import_enum_information: True product_quality_crm: name: product_quality_crm @@ -1227,7 +1236,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 18 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['Clear unchanged', 'Cloud detected (restored from clear sky)'] standard_name: status_flag cloud_test_cmrt4: @@ -1313,7 +1322,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: bt_max - long_name: TOA Brightess Temperature segment max + long_name: TOA Brightess Temperature Segment Max standard_name: toa_brightess_temperature cell_method: area:maximum coordinates: @@ -1325,7 +1334,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: bt_mean - long_name: TOA Brightess Temperature segment mean + long_name: TOA Brightess Temperature Segment Mean standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -1337,7 +1346,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: bt_min - long_name: TOA Brightess Temperature segment min + long_name: TOA Brightess Temperature Segment Min standard_name: toa_brightess_temperature cell_method: area:minimum coordinates: @@ -1349,7 +1358,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: bt_std - long_name: TOA Brightess Temperature standard deviation + long_name: TOA Brightess Temperature Segment Standard Deviation standard_name: toa_brightess_temperature cell_method: area:standard_deviation coordinates: @@ -1361,7 +1370,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_max - long_name: TOA max Radiance + long_name: TOA Radiance Segment Max standard_name: toa_radiance cell_method: area:maximum coordinates: @@ -1373,7 +1382,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_mean - long_name: TOA mean Radiance + long_name: TOA Radiance Segment Mean standard_name: toa_radiance cell_method: area:mean coordinates: @@ -1385,7 +1394,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_min - long_name: TOA min Radiance + long_name: TOA Radiance Segment Min standard_name: toa_radiance cell_method: area:minimum coordinates: @@ -1397,7 +1406,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: radiance_std - long_name: TOA Outgoing Radiance standard deviation + long_name: TOA Radiance Segment Standard Deviation standard_name: toa_outgoing_radiance cell_method: area:standard_deviation coordinates: @@ -1409,9 +1418,10 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: reflectance_max - long_name: TOA Bidirectional Reflectance segment max + long_name: TOA Bidirectional Reflectance Segment Max standard_name: toa_bidirectional_reflectance cell_method: area:maximum + units: '%' coordinates: - longitude - latitude @@ -1421,9 +1431,10 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: reflectance_mean - long_name: TOA Bidirectional Reflectance segment mean + long_name: TOA Bidirectional Reflectance Segment Mean standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1433,9 +1444,10 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: reflectance_min - long_name: TOA Bidirectional Reflectance segment min + long_name: TOA Bidirectional Reflectance Segment Min standard_name: toa_bidirectional_reflectance cell_method: area:minimum + units: '%' coordinates: - longitude - latitude @@ -1445,9 +1457,10 @@ datasets: resolution: 32000 file_type: nc_fci_asr file_key: reflectance_std - long_name: TOA Bidirectional Reflectance standard deviation + long_name: TOA Bidirectional Reflectance Segment Standard Deviation standard_name: toa_bidirectional_reflectance cell_method: area:standard_deviation + units: '%' coordinates: - longitude - latitude @@ -1479,7 +1492,6 @@ datasets: quality_radiance: name: quality_radiance resolution: 32000 - wavelength: [] file_type: nc_fci_asr file_key: quality_radiance fill_value: -1 @@ -1495,6 +1507,7 @@ datasets: file_type: nc_fci_asr file_key: land_pixel_percent standard_name: land_area_fraction + units: '%' coordinates: - longitude - latitude @@ -1505,6 +1518,7 @@ datasets: file_type: nc_fci_asr file_key: water_pixel_percent standard_name: water_area_fraction + units: '%' coordinates: - longitude - latitude @@ -1515,6 +1529,7 @@ datasets: file_type: nc_fci_asr file_key: pixel_percentage standard_name: pixels_used_fraction + units: '%' coordinates: - longitude - latitude @@ -2967,6 +2982,7 @@ datasets: long_name: Percentage of FoR pixels used (all pixels) standard_name: pixels_used_fraction category_id: 0 + units: '%' coordinates: - longitude - latitude @@ -2979,6 +2995,7 @@ datasets: long_name: Percentage of FoR pixels used (clear pixels) standard_name: pixels_used_fraction category_id: 1 + units: '%' coordinates: - longitude - latitude @@ -2991,6 +3008,7 @@ datasets: long_name: Percentage of FoR pixels used (cloudy pixels) standard_name: pixels_used_fraction category_id: 2 + units: '%' coordinates: - longitude - latitude From 6f9b49d8fb3ebcb3526eb0deecaaf2511ae9a268 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 8 Jan 2024 12:24:39 +0100 Subject: [PATCH 105/481] Change ASR long names (2 digits precision for channels % missing units) --- satpy/etc/readers/fci_l2_nc.yaml | 267 ++++++++++++++++++++----------- 1 file changed, 171 insertions(+), 96 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index b1600aff50..3653b9faf6 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1473,6 +1473,7 @@ datasets: fill_value: -1 long_name: TOA Brightess Temperature % confidence standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -1485,6 +1486,7 @@ datasets: fill_value: -1 long_name: TOA Bidirectional Reflectance % confidence standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -1497,6 +1499,7 @@ datasets: fill_value: -1 long_name: TOA Radiance % confidence standard_name: radiance_quality + units: '%' coordinates: - longitude - latitude @@ -1542,9 +1545,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 0 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.4um (all pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.44um (all pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1557,9 +1561,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 0 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.4um (clear pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.44um (clear pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1572,9 +1577,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 0 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.4um (cloudy pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.44um (cloudy pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1587,9 +1593,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 1 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.5um (all pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.51um (all pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1602,9 +1609,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 1 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.5um (clear pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.51um (clear pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1617,9 +1625,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 1 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.5um (cloudy pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.51um (cloudy pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1632,9 +1641,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 2 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.6um (all pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.64um (all pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1647,9 +1657,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 2 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.6um (clear pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.64um (clear pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1662,9 +1673,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 2 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.6um (cloudy pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.64um (cloudy pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1677,9 +1689,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 3 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (all pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.86um (all pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1692,9 +1705,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 3 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (clear pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.86um (clear pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1707,9 +1721,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 3 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (cloudy pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.86um (cloudy pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1722,9 +1737,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 4 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (all pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.91um (all pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1737,9 +1753,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 4 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (clear pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.91um (clear pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1752,9 +1769,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 4 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 0.9um (cloudy pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 0.91um (cloudy pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1767,9 +1785,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 5 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 1.4um (all pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 1.38um (all pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1782,9 +1801,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 5 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 1.4um (clear pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 1.38um (clear pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1797,9 +1817,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 5 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 1.4um (cloudy pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 1.38um (cloudy pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1812,9 +1833,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 6 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 1.6um (all pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 1.61um (all pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1827,9 +1849,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 6 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 1.6um (clear pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 1.61um (clear pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1842,9 +1865,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 6 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 1.6um (cloudy pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 1.61um (cloudy pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1857,9 +1881,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 7 category_id: 0 - long_name: TOA Bidirectional Reflectance segment mean at 2.2um (all pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 2.25um (all pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1872,9 +1897,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 7 category_id: 1 - long_name: TOA Bidirectional Reflectance segment mean at 2.2um (clear pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 2.25um (clear pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1887,9 +1913,10 @@ datasets: file_key: reflectance_mean vis_channel_id: 7 category_id: 2 - long_name: TOA Bidirectional Reflectance segment mean at 2.2um (cloudy pixels) + long_name: TOA Bidirectional Reflectance Segment mean at 2.25um (cloudy pixels) standard_name: toa_bidirectional_reflectance cell_method: area:mean + units: '%' coordinates: - longitude - latitude @@ -1902,7 +1929,7 @@ datasets: file_key: bt_mean ir_channel_id: 0 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 3.8um (all pixels) + long_name: TOA Brightess Temperature Segment mean at 3.80um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -1917,7 +1944,7 @@ datasets: file_key: bt_mean ir_channel_id: 0 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 3.8um (clear pixels) + long_name: TOA Brightess Temperature Segment mean at 3.80um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -1932,7 +1959,7 @@ datasets: file_key: bt_mean ir_channel_id: 0 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 3.8um (cloudy pixels) + long_name: TOA Brightess Temperature Segment mean at 3.80um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -1947,7 +1974,7 @@ datasets: file_key: bt_mean ir_channel_id: 1 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 6.3um (all pixels) + long_name: TOA Brightess Temperature Segment mean at 6.30um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -1962,7 +1989,7 @@ datasets: file_key: bt_mean ir_channel_id: 1 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 6.3um (clear pixels) + long_name: TOA Brightess Temperature Segment mean at 6.30um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -1977,7 +2004,7 @@ datasets: file_key: bt_mean ir_channel_id: 1 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 6.3um (cloudy pixels) + long_name: TOA Brightess Temperature Segment mean at 6.30um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -1992,7 +2019,7 @@ datasets: file_key: bt_mean ir_channel_id: 2 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 7.3um (all pixels) + long_name: TOA Brightess Temperature Segment mean at 7.35um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2007,7 +2034,7 @@ datasets: file_key: bt_mean ir_channel_id: 2 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 7.3um (clear pixels) + long_name: TOA Brightess Temperature Segment mean at 7.35um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2022,7 +2049,7 @@ datasets: file_key: bt_mean ir_channel_id: 2 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 7.3um (cloudy pixels) + long_name: TOA Brightess Temperature Segment mean at 7.35um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2037,7 +2064,7 @@ datasets: file_key: bt_mean ir_channel_id: 3 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 8.7um (all pixels) + long_name: TOA Brightess Temperature Segment mean at 8.70um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2052,7 +2079,7 @@ datasets: file_key: bt_mean ir_channel_id: 3 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 8.7um (clear pixels) + long_name: TOA Brightess Temperature Segment mean at 8.70um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2067,7 +2094,7 @@ datasets: file_key: bt_mean ir_channel_id: 3 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 8.7um (cloudy pixels) + long_name: TOA Brightess Temperature Segment mean at 8.70um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2082,7 +2109,7 @@ datasets: file_key: bt_mean ir_channel_id: 4 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 9.7um (all pixels) + long_name: TOA Brightess Temperature Segment mean at 9.66um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2097,7 +2124,7 @@ datasets: file_key: bt_mean ir_channel_id: 4 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 9.7um (clear pixels) + long_name: TOA Brightess Temperature Segment mean at 9.66um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2112,7 +2139,7 @@ datasets: file_key: bt_mean ir_channel_id: 4 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 9.7um (cloudy pixels) + long_name: TOA Brightess Temperature Segment mean at 9.66um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2127,7 +2154,7 @@ datasets: file_key: bt_mean ir_channel_id: 5 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 10.5um (all pixels) + long_name: TOA Brightess Temperature Segment mean at 10.50um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2142,7 +2169,7 @@ datasets: file_key: bt_mean ir_channel_id: 5 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 10.5um (clear pixels) + long_name: TOA Brightess Temperature Segment mean at 10.50um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2157,7 +2184,7 @@ datasets: file_key: bt_mean ir_channel_id: 5 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 10.5um (cloudy pixels) + long_name: TOA Brightess Temperature Segment mean at 10.50um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2172,7 +2199,7 @@ datasets: file_key: bt_mean ir_channel_id: 6 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 12.3um (all pixels) + long_name: TOA Brightess Temperature Segment mean at 12.30um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2187,7 +2214,7 @@ datasets: file_key: bt_mean ir_channel_id: 6 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 12.3um (clear pixels) + long_name: TOA Brightess Temperature Segment mean at 12.30um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2202,7 +2229,7 @@ datasets: file_key: bt_mean ir_channel_id: 6 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 12.3um (cloudy pixels) + long_name: TOA Brightess Temperature Segment mean at 12.30um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2217,7 +2244,7 @@ datasets: file_key: bt_mean ir_channel_id: 7 category_id: 0 - long_name: TOA Brightess Temperature segment mean at 13.3um (all pixels) + long_name: TOA Brightess Temperature Segment mean at 13.30um (all pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2232,7 +2259,7 @@ datasets: file_key: bt_mean ir_channel_id: 7 category_id: 1 - long_name: TOA Brightess Temperature segment mean at 13.3um (clear pixels) + long_name: TOA Brightess Temperature Segment mean at 13.30um (clear pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2247,7 +2274,7 @@ datasets: file_key: bt_mean ir_channel_id: 7 category_id: 2 - long_name: TOA Brightess Temperature segment mean at 13.3um (cloudy pixels) + long_name: TOA Brightess Temperature Segment mean at 13.30um (cloudy pixels) standard_name: toa_brightess_temperature cell_method: area:mean coordinates: @@ -2263,8 +2290,9 @@ datasets: vis_channel_id: 0 category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.4um (all pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (all pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2278,8 +2306,9 @@ datasets: vis_channel_id: 0 category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.4um (clear pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (clear pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2293,8 +2322,9 @@ datasets: vis_channel_id: 0 category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.4um (cloudy pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (cloudy pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2308,8 +2338,9 @@ datasets: vis_channel_id: 1 category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.5um (all pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.51um (all pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2323,8 +2354,9 @@ datasets: vis_channel_id: 1 category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.5um (clear pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.51um (clear pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2338,8 +2370,9 @@ datasets: vis_channel_id: 1 category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.5um (cloudy pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.51um (cloudy pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2353,8 +2386,9 @@ datasets: vis_channel_id: 2 category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.6um (all pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.64um (all pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2368,8 +2402,9 @@ datasets: vis_channel_id: 2 category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.6um (clear pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.64um (clear pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2383,8 +2418,9 @@ datasets: vis_channel_id: 2 category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.6um (cloudy pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.64um (cloudy pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2398,8 +2434,9 @@ datasets: vis_channel_id: 3 category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.9um (all pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.86um (all pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2413,8 +2450,9 @@ datasets: vis_channel_id: 3 category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.9um (clear pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.86um (clear pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2428,8 +2466,9 @@ datasets: vis_channel_id: 3 category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.9um (cloudy pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.86um (cloudy pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2443,8 +2482,9 @@ datasets: vis_channel_id: 4 category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.9um (all pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.91um (all pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2458,8 +2498,9 @@ datasets: vis_channel_id: 4 category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.9um (clear pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.91um (clear pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2473,8 +2514,9 @@ datasets: vis_channel_id: 4 category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 0.9um (cloudy pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 0.91um (cloudy pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2488,8 +2530,9 @@ datasets: vis_channel_id: 5 category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 1.4um (all pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 1.38um (all pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2503,8 +2546,9 @@ datasets: vis_channel_id: 5 category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 1.4um (clear pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 1.38um (clear pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2518,8 +2562,9 @@ datasets: vis_channel_id: 5 category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 1.4um (cloudy pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 1.38um (cloudy pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2533,8 +2578,9 @@ datasets: vis_channel_id: 6 category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 1.6um (all pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 1.61um (all pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2548,8 +2594,9 @@ datasets: vis_channel_id: 6 category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 1.6um (clear pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 1.61um (clear pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2563,8 +2610,9 @@ datasets: vis_channel_id: 6 category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 1.6um (cloudy pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 1.61um (cloudy pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2578,8 +2626,9 @@ datasets: vis_channel_id: 7 category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 2.2um (all pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 2.25um (all pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2593,8 +2642,9 @@ datasets: vis_channel_id: 7 category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 2.2um (clear pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 2.25um (clear pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2608,8 +2658,9 @@ datasets: vis_channel_id: 7 category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence at 2.2um (cloudy pixels) + long_name: TOA Bidirectional Reflectance % Confidence at 2.25um (cloudy pixels) standard_name: reflectance_quality + units: '%' coordinates: - longitude - latitude @@ -2623,8 +2674,9 @@ datasets: ir_channel_id: 0 category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 3.8um (all pixels) + long_name: TOA Brightess Temperature % Confidence at 3.80um (all pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2638,8 +2690,9 @@ datasets: ir_channel_id: 0 category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 3.8um (clear pixels) + long_name: TOA Brightess Temperature % Confidence at 3.80um (clear pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2653,8 +2706,9 @@ datasets: ir_channel_id: 0 category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 3.8um (cloudy pixels) + long_name: TOA Brightess Temperature % Confidence at 3.80um (cloudy pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2668,8 +2722,9 @@ datasets: ir_channel_id: 1 category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 6.3um (all pixels) + long_name: TOA Brightess Temperature % Confidence at 6.30um (all pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2683,8 +2738,9 @@ datasets: ir_channel_id: 1 category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 6.3um (clear pixels) + long_name: TOA Brightess Temperature % Confidence at 6.30um (clear pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2698,8 +2754,9 @@ datasets: ir_channel_id: 1 category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 6.3um (cloudy pixels) + long_name: TOA Brightess Temperature % Confidence at 6.30um (cloudy pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2713,8 +2770,9 @@ datasets: ir_channel_id: 2 category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 7.3um (all pixels) + long_name: TOA Brightess Temperature % Confidence at 7.35um (all pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2728,8 +2786,9 @@ datasets: ir_channel_id: 2 category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 7.3um (clear pixels) + long_name: TOA Brightess Temperature % Confidence at 7.35um (clear pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2743,8 +2802,9 @@ datasets: ir_channel_id: 2 category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 7.3um (cloudy pixels) + long_name: TOA Brightess Temperature % Confidence at 7.35um (cloudy pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2758,8 +2818,9 @@ datasets: ir_channel_id: 3 category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 8.7um (all pixels) + long_name: TOA Brightess Temperature % Confidence at 8.70um (all pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2773,8 +2834,9 @@ datasets: ir_channel_id: 3 category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 8.7um (clear pixels) + long_name: TOA Brightess Temperature % Confidence at 8.70um (clear pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2788,8 +2850,9 @@ datasets: ir_channel_id: 3 category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 8.7um (cloudy pixels) + long_name: TOA Brightess Temperature % Confidence at 8.70um (cloudy pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2803,8 +2866,9 @@ datasets: ir_channel_id: 4 category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 9.7um (all pixels) + long_name: TOA Brightess Temperature % Confidence at 9.66um (all pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2818,8 +2882,9 @@ datasets: ir_channel_id: 4 category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 9.7um (clear pixels) + long_name: TOA Brightess Temperature % Confidence at 9.66um (clear pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2833,8 +2898,9 @@ datasets: ir_channel_id: 4 category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 9.7um (cloudy pixels) + long_name: TOA Brightess Temperature % Confidence at 9.66um (cloudy pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2848,8 +2914,9 @@ datasets: ir_channel_id: 5 category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 10.5um (all pixels) + long_name: TOA Brightess Temperature % Confidence at 10.50um (all pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2863,8 +2930,9 @@ datasets: ir_channel_id: 5 category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 10.5um (clear pixels) + long_name: TOA Brightess Temperature % Confidence at 10.50um (clear pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2878,8 +2946,9 @@ datasets: ir_channel_id: 5 category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 10.5um (cloudy pixels) + long_name: TOA Brightess Temperature % Confidence at 10.50um (cloudy pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2893,8 +2962,9 @@ datasets: ir_channel_id: 6 category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 12.3um (all pixels) + long_name: TOA Brightess Temperature % Confidence at 12.30um (all pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2908,8 +2978,9 @@ datasets: ir_channel_id: 6 category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 12.3um (clear pixels) + long_name: TOA Brightess Temperature % Confidence at 12.30um (clear pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2923,8 +2994,9 @@ datasets: ir_channel_id: 6 category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 12.3um (cloudy pixels) + long_name: TOA Brightess Temperature % Confidence at 12.30um (cloudy pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2938,8 +3010,9 @@ datasets: ir_channel_id: 7 category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 13.3um (all pixels) + long_name: TOA Brightess Temperature % Confidence at 13.30um (all pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2953,8 +3026,9 @@ datasets: ir_channel_id: 7 category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 13.3um (clear pixels) + long_name: TOA Brightess Temperature % Confidence at 13.30um (clear pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude @@ -2968,8 +3042,9 @@ datasets: ir_channel_id: 7 category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % confidence at 13.3um (cloudy pixels) + long_name: TOA Brightess Temperature % Confidence at 13.30um (cloudy pixels) standard_name: brightness_temperature_quality + units: '%' coordinates: - longitude - latitude From 582070648ff21c5ea7f99ff57e43338226ad1e23 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Tue, 9 Jan 2024 16:52:22 +0100 Subject: [PATCH 106/481] Add unit test for enumeration types --- satpy/tests/reader_tests/test_fci_l2_nc.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/satpy/tests/reader_tests/test_fci_l2_nc.py b/satpy/tests/reader_tests/test_fci_l2_nc.py index 84681b0f02..89242409ac 100644 --- a/satpy/tests/reader_tests/test_fci_l2_nc.py +++ b/satpy/tests/reader_tests/test_fci_l2_nc.py @@ -102,6 +102,12 @@ def setUp(self): mtg_geos_projection.inverse_flattening = 298.257223563 mtg_geos_projection.perspective_point_height = 35786400. + # Add enumerated type + enum_dict = {"False": 0, "True": 1} + bool_type = nc.createEnumType(np.uint8,"bool_t",enum_dict) + nc.createVariable("quality_flag", bool_type, + dimensions=("number_of_rows", "number_of_columns")) + self.fh = FciL2NCFileHandler(filename=self.test_file, filename_info={}, filetype_info={}) def tearDown(self): @@ -215,6 +221,19 @@ def test_dataset_with_scalar(self): with pytest.raises(NotImplementedError): self.fh.get_area_def(None) + def test_emumerations(self): + """Test the conversion of enumerated type information into flag_values and flag_meanings.""" + dataset = self.fh.get_dataset(make_dataid(name="test_enum", resolution=2000), + {"name": "quality_flag", + "file_key": "quality_flag", + "file_type": "test_file_type", + "import_enum_information": True}) + attributes = dataset.attrs + assert "flag_values" in attributes + assert attributes["flag_values"] == [0,1] + assert "flag_meanings" in attributes + assert attributes["flag_meanings"] == ["False","True"] + class TestFciL2NCSegmentFileHandler(unittest.TestCase): """Test the FciL2NCSegmentFileHandler reader.""" From 64091a387bac92937eb7b93b87e4481a0c8cc685 Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Wed, 10 Jan 2024 09:25:11 +0100 Subject: [PATCH 107/481] Fix open points for CLMTest datasets. --- satpy/etc/readers/fci_l2_nc.yaml | 52 +++++++++++--------------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 3653b9faf6..76c18f1fe7 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1056,7 +1056,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 0 flag_values: [0,1] - flag_meanings: ['No snow/Ice detected',' Snow/Ice detected'] + flag_meanings: ['No snow/ice detected',' Snow/ice detected'] standard_name: status_flag cloud_test_cmt1: @@ -1066,7 +1066,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 1 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt2: @@ -1076,7 +1076,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 2 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt3: @@ -1086,7 +1086,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 3 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt4: @@ -1096,7 +1096,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 4 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt5: @@ -1106,7 +1106,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 5 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt6: @@ -1116,7 +1116,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 6 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt7: @@ -1126,7 +1126,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 7 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt8: @@ -1136,7 +1136,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 8 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt9: @@ -1146,7 +1146,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 9 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt10: @@ -1156,7 +1156,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 10 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt11: @@ -1166,7 +1166,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 11 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt12: @@ -1176,7 +1176,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 12 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt13: @@ -1186,7 +1186,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 13 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmt14: @@ -1196,7 +1196,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 14 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_opqt: @@ -1206,7 +1206,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 15 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No opaqueness detected', 'Opaqueness detected'] standard_name: status_flag cloud_test_cmrt1: @@ -1216,7 +1216,7 @@ datasets: file_key: cloud_mask_test_result extract_byte: 16 flag_values: [0,1] - flag_meanings: ['Cloud undetected','Cloud detected'] + flag_meanings: ['No cloud detected','Cloud detected'] standard_name: status_flag cloud_test_cmrt2: @@ -1298,24 +1298,6 @@ datasets: standard_name: status_flag import_enum_information: True - product_quality_clmtest: - name: product_quality_clmtest - file_type: nc_fci_test_clm - file_key: product_quality - standard_name: product_quality - - product_completeness_clmtest: - name: product_completeness_clmtest - file_type: nc_fci_test_clm - file_key: product_completeness - standard_name: product_completeness - - product_timeliness_clmtest: - name: product_timeliness_clmtest - file_type: nc_fci_test_clm - file_key: product_timeliness - standard_name: product_timeliness - # ASR bt_max: name: bt_max From d8290d1561c78293fb184862cc2e6f1dc2412b21 Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Wed, 10 Jan 2024 09:35:56 +0100 Subject: [PATCH 108/481] Fix open points for CRM datasets --- satpy/etc/readers/fci_l2_nc.yaml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 76c18f1fe7..cd1f91dfae 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -558,6 +558,8 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance (temporal average) + units: '%' crm_vis04: name: crm_vis04 @@ -566,6 +568,8 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance at 0.44um (temporal average) + units: '%' vis_channel_id: 0 crm_vis05: @@ -575,6 +579,8 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance at 0.51um (temporal average) + units: '%' vis_channel_id: 1 crm_vis06: @@ -584,6 +590,8 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance at 0.64um (temporal average) + units: '%' vis_channel_id: 2 crm_vis08: @@ -593,6 +601,8 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance at 0.86um (temporal average) + units: '%' vis_channel_id: 3 crm_vis09: @@ -602,6 +612,8 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance at 0.91um (temporal average) + units: '%' vis_channel_id: 4 crm_nir13: @@ -611,6 +623,8 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance at 1.38um (temporal average) + units: '%' vis_channel_id: 5 crm_nir16: @@ -620,6 +634,8 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance at 1.61um (temporal average) + units: '%' vis_channel_id: 6 crm_nir22: @@ -629,6 +645,8 @@ datasets: file_type: nc_fci_crm file_key: mean_clear_sky_reflectance standard_name: toa_bidirectional_reflectance + long_name: TOA Bidirectional Reflectance at 2.25um (temporal average) + units: '%' vis_channel_id: 7 mean_sza: @@ -637,6 +655,7 @@ datasets: file_type: nc_fci_crm file_key: mean_solar_zenith standard_name: solar_zenith_angle + long_name: Solar Zenith Angle (temporal average) mean_rel_azi: name: mean_rel_azi @@ -644,6 +663,7 @@ datasets: file_type: nc_fci_crm file_key: mean_rel_solar_sat_azimuth standard_name: relative_sun_sensor_azimuth_angle + long_name: Relative Solar Satellite Azimuth Angle (temporal average) n_acc: name: n_acc From a1ad98921059fbcc9107cda80b6190adfdcdab55 Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Wed, 10 Jan 2024 09:51:43 +0100 Subject: [PATCH 109/481] Set unit to None if 'none' in NetCDF file. --- satpy/readers/fci_l2_nc.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index d5b6ce95bb..0a750376fa 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -94,7 +94,10 @@ def _set_attributes(self, variable, dataset_info, segmented=False): variable.attrs.setdefault("units", None) if "unit" in variable.attrs: # Need to convert this attribute to the expected satpy entry - variable.attrs.update({"units": variable.attrs["unit"]}) + ncunit = variable.attrs["unit"] + if ncunit == 'none': + ncunit = None + variable.attrs.update({"units": ncunit}) del variable.attrs["unit"] variable.attrs.update(dataset_info) From 0f42766da54e49fc787ccb7f22bfa896bb8a88d8 Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Wed, 10 Jan 2024 09:54:56 +0100 Subject: [PATCH 110/481] Harmonize toa_outgoing_radiance standard_name --- satpy/etc/readers/fci_l2_nc.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index cd1f91dfae..525ffa11ec 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1373,7 +1373,7 @@ datasets: file_type: nc_fci_asr file_key: radiance_max long_name: TOA Radiance Segment Max - standard_name: toa_radiance + standard_name: toa_outgoing_radiance cell_method: area:maximum coordinates: - longitude @@ -1385,7 +1385,7 @@ datasets: file_type: nc_fci_asr file_key: radiance_mean long_name: TOA Radiance Segment Mean - standard_name: toa_radiance + standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1397,7 +1397,7 @@ datasets: file_type: nc_fci_asr file_key: radiance_min long_name: TOA Radiance Segment Min - standard_name: toa_radiance + standard_name: toa_outgoing_radiance cell_method: area:minimum coordinates: - longitude From e3947a8756657d8fd7a785dce0f032825f1ad135 Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Wed, 10 Jan 2024 09:59:00 +0100 Subject: [PATCH 111/481] Change to double quotes. --- satpy/readers/fci_l2_nc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index 0a750376fa..34623e3e07 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -95,7 +95,7 @@ def _set_attributes(self, variable, dataset_info, segmented=False): if "unit" in variable.attrs: # Need to convert this attribute to the expected satpy entry ncunit = variable.attrs["unit"] - if ncunit == 'none': + if ncunit == "none": ncunit = None variable.attrs.update({"units": ncunit}) del variable.attrs["unit"] From 0fddd56b3744be02a4032e5b5da6c60e4bad122e Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Wed, 10 Jan 2024 12:07:16 +0100 Subject: [PATCH 112/481] Move 'none' to None conversion to make it apply in all situations. --- satpy/readers/fci_l2_nc.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index 34623e3e07..6290f8161c 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -94,10 +94,7 @@ def _set_attributes(self, variable, dataset_info, segmented=False): variable.attrs.setdefault("units", None) if "unit" in variable.attrs: # Need to convert this attribute to the expected satpy entry - ncunit = variable.attrs["unit"] - if ncunit == "none": - ncunit = None - variable.attrs.update({"units": ncunit}) + variable.attrs.update({"units": variable.attrs["unit"]}) del variable.attrs["unit"] variable.attrs.update(dataset_info) @@ -120,6 +117,9 @@ def _set_attributes(self, variable, dataset_info, segmented=False): variable.attrs["flag_meanings"] = flag_meanings netCDF4_dataset.close() + if variable.attrs["units"] == "none": + variable.attrs.update({"units": None}) + return variable def _slice_dataset(self, variable, dataset_info, dimensions): From 176a66c9152b7f7bff46a0d882a4a3a4efcd0154 Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Wed, 10 Jan 2024 12:10:44 +0100 Subject: [PATCH 113/481] Add tests for unit extraction and assignment --- satpy/tests/reader_tests/test_fci_l2_nc.py | 36 +++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_fci_l2_nc.py b/satpy/tests/reader_tests/test_fci_l2_nc.py index 89242409ac..d59c472d7b 100644 --- a/satpy/tests/reader_tests/test_fci_l2_nc.py +++ b/satpy/tests/reader_tests/test_fci_l2_nc.py @@ -95,6 +95,7 @@ def setUp(self): "number_of_columns")) two_layers_dataset[0, :, :] = np.ones((100, 10)) two_layers_dataset[1, :, :] = 2 * np.ones((100, 10)) + two_layers_dataset.unit = "test_unit" mtg_geos_projection = nc.createVariable("mtg_geos_projection", int, dimensions=()) mtg_geos_projection.longitude_of_projection_origin = 0.0 @@ -173,7 +174,6 @@ def test_dataset(self): np.testing.assert_allclose(dataset.values, np.ones((100, 10))) assert dataset.attrs["test_attr"] == "attr" - assert dataset.attrs["units"] == "test_units" assert dataset.attrs["fill_value"] == -999 def test_dataset_with_layer(self): @@ -234,6 +234,40 @@ def test_emumerations(self): assert "flag_meanings" in attributes assert attributes["flag_meanings"] == ["False","True"] + def test_units_from_file(self): + """Test units extraction from NetCDF file.""" + dataset = self.fh.get_dataset(make_dataid(name="test_units_from_file", resolution=2000), + {"name": "test_one_layer", + "file_key": "test_one_layer", + "file_type": "test_file_type"}) + assert dataset.attrs["units"] == "test_units" + + def test_unit_from_file(self): + """Test that a unit stored with attribute `unit` in the file is assigned to the `units` attribute.""" + dataset = self.fh.get_dataset(make_dataid(name="test_unit_from_file", resolution=2000), + {"name": "test_two_layers", + "file_key": "test_two_layers", "layer": 1, + "file_type": "test_file_type"}) + assert dataset.attrs["units"] == "test_unit" + + def test_units_from_yaml(self): + """Test units extraction from yaml file.""" + dataset = self.fh.get_dataset(make_dataid(name="test_units_from_yaml", resolution=2000), + {"name": "test_one_layer", + "units": "test_unit_from_yaml", + "file_key": "test_one_layer", + "file_type": "test_file_type"}) + assert dataset.attrs["units"] == "test_unit_from_yaml" + + def test_units_none_conversion(self): + """Test that a units stored as 'none' is converted to None.""" + dataset = self.fh.get_dataset(make_dataid(name="test_units_none_conversion", resolution=2000), + {"name": "test_one_layer", + "units": "none", + "file_key": "test_one_layer", + "file_type": "test_file_type"}) + assert dataset.attrs["units"] is None + class TestFciL2NCSegmentFileHandler(unittest.TestCase): """Test the FciL2NCSegmentFileHandler reader.""" From d75b9e52e49b43e099bf7439caacb5e7798117fe Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Wed, 10 Jan 2024 12:22:08 +0100 Subject: [PATCH 114/481] Fix failing test --- satpy/tests/reader_tests/test_fci_l2_nc.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_fci_l2_nc.py b/satpy/tests/reader_tests/test_fci_l2_nc.py index d59c472d7b..3e77c1d51e 100644 --- a/satpy/tests/reader_tests/test_fci_l2_nc.py +++ b/satpy/tests/reader_tests/test_fci_l2_nc.py @@ -184,7 +184,6 @@ def test_dataset_with_layer(self): "fill_value": -999, "file_type": "test_file_type"}) np.testing.assert_allclose(dataset.values, 2 * np.ones((100, 10))) - assert dataset.attrs["units"] is None assert dataset.attrs["spacecraft_name"] == "test_platform" def test_dataset_with_invalid_filekey(self): From 7afbf0e32b57a0b5563a68585b2762c6e6ad1c3b Mon Sep 17 00:00:00 2001 From: Sauli Joro Date: Fri, 12 Jan 2024 14:27:08 +0100 Subject: [PATCH 115/481] Change order of yaml-key. --- satpy/etc/readers/fci_l2_nc.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 525ffa11ec..eada732555 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -79,10 +79,10 @@ datasets: # CLM cloud_state: name: cloud_state + standard_name: cloud_mask_classification resolution: 2000 file_type: nc_fci_clm file_key: cloud_state - standard_name: cloud_mask_classification fill_value: -127 import_enum_information: True From fa7ff057889083e6c6650da4835f6a20e25eec90 Mon Sep 17 00:00:00 2001 From: Sauli Joro Date: Fri, 12 Jan 2024 16:20:37 +0100 Subject: [PATCH 116/481] Refactor order of yaml-keys in fci_l2_nc.yaml. --- satpy/etc/readers/fci_l2_nc.yaml | 1092 +++++++++++++++--------------- 1 file changed, 551 insertions(+), 541 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index eada732555..dfa8b14ad4 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -74,9 +74,269 @@ file_types: file_patterns: - '{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+FCI-2-AMV-{channel}-{coverage}-{subsetting}-{component1}-{component2}-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc' + datasets: -# CLM +# AMV Intermediate - Atmospheric Motion Vectors Intermediate + intm_latitude: + name: intm_latitude + standard_name: latitude + file_type: nc_fci_amvi + file_key: intm_latitude + + intm_longitude: + name: intm_longitude + standard_name: longitude + file_type: nc_fci_amvi + file_key: intm_longitude + + intm_speed: + name: intm_speed + standard_name: wind_speed + file_type: nc_fci_amvi + file_key: intm_speed + coordinates: + - intm_longitude + - intm_latitude + + intm_u_component: + name: intm_u_component + standard_name: wind_speed_horizontal_component + file_type: nc_fci_amvi + file_key: intm_u_component + coordinates: + - intm_longitude + - intm_latitude + + intm_v_component: + name: intm_v_component + standard_name: wind_speed_vertical_component + file_type: nc_fci_amvi + file_key: intm_v_component + coordinates: + - intm_longitude + - intm_latitude + + intm_direction: + name: intm_direction + standard_name: wind_to_direction + file_type: nc_fci_amvi + file_key: intm_direction + coordinates: + - intm_longitude + - intm_latitude + + intm_pressure: + name: intm_pressure + standard_name: wind_pressure + file_type: nc_fci_amvi + file_key: intm_pressure + coordinates: + - intm_longitude + - intm_latitude + + intm_temperature: + name: intm_temperature + standard_name: wind_temperature + file_type: nc_fci_amvi + file_key: intm_temperature + coordinates: + - intm_longitude + - intm_latitude + + intm_target_type: + name: intm_target_type + standard_name: wind_target_type + file_type: nc_fci_amvi + file_key: target_type + coordinates: + - intm_longitude + - intm_latitude + + intm_wind_method: + name: intm_wind_method + standard_name: wind_wind_method + file_type: nc_fci_amvi + file_key: wind_method + coordinates: + - intm_longitude + - intm_latitude + + +# AMV Final - Atmospheric Motion Vectors Final + channel_id: + name: channel_id + standard_name: channel_id + file_type: nc_fci_amv + file_key: channel_id + + amv_latitude: + name: latitude + standard_name: latitude + file_type: nc_fci_amv + file_key: latitude + + amv_longitude: + name: longitude + standard_name: longitude + file_type: nc_fci_amv + file_key: longitude + + speed: + name: speed + standard_name: wind_speed + file_type: nc_fci_amv + file_key: speed + coordinates: + - longitude + - latitude + + speed_u_component: + name: speed_u_component + standard_name: wind_speed_horizontal_component + file_type: nc_fci_amv + file_key: speed_u_component + coordinates: + - longitude + - latitude + + speed_v_component: + name: speed_v_component + standard_name: wind_speed_vertical_component + file_type: nc_fci_amv + file_key: speed_v_component + coordinates: + - longitude + - latitude + + direction: + name: direction + standard_name: wind_to_direction + file_type: nc_fci_amv + file_key: direction + coordinates: + - longitude + - latitude + + pressure: + name: pressure + standard_name: wind_pressure + file_type: nc_fci_amv + file_key: pressure + coordinates: + - longitude + - latitude + + temperature: + name: temperature + standard_name: wind_temperature + file_type: nc_fci_amv + file_key: temperature + coordinates: + - longitude + - latitude + + target_type: + name: target_type + standard_name: wind_target_type + file_type: nc_fci_amv + file_key: target_type + coordinates: + - longitude + - latitude + + wind_method: + name: wind_method + standard_name: wind_wind_method + file_type: nc_fci_amv + file_key: wind_method + coordinates: + - longitude + - latitude + + fcst_u: + name: fcst_u + standard_name: wind_forecast_u_component + file_type: nc_fci_amv + file_key: forecast_u_component + coordinates: + - longitude + - latitude + + fcst_v: + name: fcst_v + standard_name: wind_forecast_v_component + file_type: nc_fci_amv + file_key: forecast_v_component + coordinates: + - longitude + - latitude + + best_fit_pres: + name: best_fit_pres + standard_name: wind_best_fit_pressure + file_type: nc_fci_amv + file_key: best_fit_pressure + coordinates: + - longitude + - latitude + + best_fit_u: + name: best_fit_u + standard_name: wind_best_fit_u_component + file_type: nc_fci_amv + file_key: best_fit_u_component + coordinates: + - longitude + - latitude + + best_fit_v: + name: best_fit_v + standard_name: wind_best_fit_v_component + file_type: nc_fci_amv + file_key: best_fit_v_component + coordinates: + - longitude + - latitude + + qi: + name: qi + standard_name: wind_overall_reliability + file_type: nc_fci_amv + file_key: overall_reliability + coordinates: + - longitude + - latitude + + qi_excl_fcst: + name: qi_excl_fcst + standard_name: wind_overall_reliability_exc_forecast + file_type: nc_fci_amv + file_key: overall_reliability_exc_forecast + coordinates: + - longitude + - latitude + + product_quality: + name: product_quality + standard_name: product_quality + file_type: nc_fci_amv + file_key: product_quality + + product_completeness: + name: product_completeness + standard_name: product_completeness + file_type: nc_fci_amv + file_key: product_completeness + + product_timeliness: + name: product_timeliness + standard_name: product_timeliness + file_type: nc_fci_amv + file_key: product_timeliness + + +# CLM - Cloud Mask cloud_state: name: cloud_state standard_name: cloud_mask_classification @@ -88,1237 +348,1244 @@ datasets: quality_illumination_clm: name: quality_illumination_clm + standard_name: status_flag resolution: 2000 file_type: nc_fci_clm file_key: quality_illumination - standard_name: status_flag fill_value: -127 import_enum_information: True quality_nwp_parameters_clm: name: quality_nwp_parameters_clm + standard_name: status_flag resolution: 2000 file_type: nc_fci_clm file_key: quality_nwp_parameters - standard_name: status_flag fill_value: -127 import_enum_information: True quality_MTG_parameters_clm: name: quality_MTG_parameters_clm + standard_name: status_flag resolution: 2000 file_type: nc_fci_clm file_key: quality_MTG_parameters - standard_name: status_flag fill_value: -127 import_enum_information: True quality_overall_processing_clm: name: quality_overall_processing_clm + standard_name: quality_flag resolution: 2000 file_type: nc_fci_clm file_key: quality_overall_processing - standard_name: quality_flag fill_value: -127 import_enum_information: True product_quality_clm: name: product_quality_clm + standard_name: product_quality file_type: nc_fci_clm file_key: product_quality - standard_name: product_quality product_completeness_clm: name: product_completeness_clm + standard_name: product_completeness file_type: nc_fci_clm file_key: product_completeness - standard_name: product_completeness product_timeliness_clm: name: product_timeliness_clm + standard_name: product_timeliness file_type: nc_fci_clm file_key: product_timeliness - standard_name: product_timeliness -# FCI CT L2 + +# CT - Cloud Type cloud_phase: name: cloud_phase + standard_name: cloud_phase_classification resolution: 2000 file_type: nc_fci_ct file_key: cloud_phase - standar_name: cloud_phase_classification fill_value: -127 import_enum_information: True cloud_type: name: cloud_type + standard_name: cloud_type_classification resolution: 2000 file_type: nc_fci_ct file_key: cloud_type - standard_name: cloud_type_classification fill_value: -127 import_enum_information: True quality_illumination_ct: name: quality_illumination_ct + standard_name: status_flag resolution: 2000 file_type: nc_fci_ct file_key: quality_illumination - standard_name: status_flag fill_value: -127 import_enum_information: True quality_nwp_parameters_ct: name: quality_nwp_parameters_ct + standard_name: status_flag resolution: 2000 file_type: nc_fci_ct file_key: quality_nwp_parameters - standard_name: status_flag fill_value: -127 import_enum_information: True quality_MTG_parameters_ct: name: quality_MTG_parameters_ct + standard_name: status_flag resolution: 2000 file_type: nc_fci_ct file_key: quality_MTG_parameters - standard_name: status_flag fill_value: -127 import_enum_information: True quality_overall_processing_ct: name: quality_overall_processing_ct + standard_name: quality_flag resolution: 2000 file_type: nc_fci_ct file_key: quality_overall_processing - standard_name: quality_flag fill_value: -127 import_enum_information: True product_quality_ct: name: product_quality_ct + standard_name: product_quality file_type: nc_fci_ct file_key: product_quality - standard_name: product_quality product_completeness_ct: name: product_completeness_ct + standard_name: product_completeness file_type: nc_fci_ct file_key: product_completeness - standard_name: product_completeness product_timeliness_ct: name: product_timeliness_ct + standard_name: product_timeliness file_type: nc_fci_ct file_key: product_timeliness - standard_name: product_timeliness - # FCI CTTH Product + + # CTTH - Cloud Top Temperature and Height cloud_top_aviation_height: name: cloud_top_aviation_height + standard_name: height_at_cloud_top_for_aviation resolution: 2000 file_type: nc_fci_ctth file_key: cloud_top_aviation_height - standard_name: height_at_cloud_top_for_aviation cloud_top_height: name: cloud_top_height + standard_name: height_at_cloud_top resolution: 2000 file_type: nc_fci_ctth file_key: cloud_top_height - standard_name: height_at_cloud_top cloud_top_pressure: name: cloud_top_pressure + standard_name: air_pressure_at_cloud_top resolution: 2000 file_type: nc_fci_ctth file_key: cloud_top_pressure - standard_name: air_pressure_at_cloud_top cloud_top_temperature: name: cloud_top_temperature + standard_name: air_temperature_at_cloud_top resolution: 2000 file_type: nc_fci_ctth file_key: cloud_top_temperature - standard_name: air_temperature_at_cloud_top effective_cloudiness: name: effective_cloudiness + standard_name: effective_cloud_cover resolution: 2000 file_type: nc_fci_ctth file_key: effective_cloudiness - standard_name: effective_cloud_cover quality_status_ctth: name: quality_status_ctth + standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth file_key: quality_status - standard_name: status_flag fill_value: -127 import_enum_information: True quality_rtm_ctth: name: quality_rtm_ctth + standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth file_key: quality_rtm - standard_name: status_flag fill_value: -127 import_enum_information: True quality_method_ctth: name: quality_method_ctth + standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth file_key: quality_method - standard_name: status_flag fill_value: -127 import_enum_information: True quality_nwp_parameters_ctth: name: quality_nwp_parameters_ctth + standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth file_key: quality_nwp_parameters - standard_name: status_flag fill_value: -127 import_enum_information: True quality_MTG_parameters_ctth: name: quality_MTG_parameters_ctth + standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth file_key: quality_MTG_parameters - standard_name: status_flag fill_value: -127 import_enum_information: True quality_overall_processing_ctth: name: quality_overall_processing_ctth + standard_name: quality_flag resolution: 2000 file_type: nc_fci_ctth file_key: quality_overall_processing - standard_name: quality_flag fill_value: -127 import_enum_information: True quality_overall_processing_aviation_ctth: name: quality_overall_processing_aviation_ctth + standard_name: quality_flag resolution: 2000 file_type: nc_fci_ctth file_key: quality_overall_processing_aviation - standard_name: quality_flag fill_value: -127 import_enum_information: True product_quality_ctth: name: product_quality_ctth + standard_name: product_quality file_type: nc_fci_ctth file_key: product_quality - standard_name: product_quality product_completeness_ctth: name: product_completeness_ctth + standard_name: product_completeness file_type: nc_fci_ctth file_key: product_completeness - standard_name: product_completeness product_timeliness_ctth: name: product_timeliness_ctth + standard_name: product_timeliness file_type: nc_fci_ctth file_key: product_timeliness + + + # FIR - Active Fire Monitoring + fire_probability: + name: fire_probability + standard_name: fire_probability + resolution: 2000 + file_type: nc_fci_fir + file_key: fire_probability + + fire_result: + name: fire_result + standard_name: active_fire_classification + resolution: 2000 + file_type: nc_fci_fir + file_key: fire_result + fill_value: -127 + import_enum_information: True + + product_quality_fir: + name: product_quality_fir + standard_name: product_quality + file_type: nc_fci_fir + file_key: product_quality + + product_completeness_fir: + name: product_completeness_fir + standard_name: product_completeness + file_type: nc_fci_fir + file_key: product_completeness + + product_timeliness_fir: + name: product_timeliness_fir + standard_name: product_timeliness + file_type: nc_fci_fir + file_key: product_timeliness + + + # GII - Global Instability Index + k_index: + name: k_index + standard_name: atmosphere_stability_k_index + resolution: 6000 + file_type: nc_fci_gii + file_key: k_index + coordinates: + - longitude + - latitude + + lifted_index: + name: lifted_index + standard_name: atmosphere_stability_lifted_index + resolution: 6000 + file_type: nc_fci_gii + file_key: lifted_index + coordinates: + - longitude + - latitude + + prec_water_high: + name: prec_water_high + standard_name: atmosphere_mass_content_of_water_vapor + resolution: 6000 + file_type: nc_fci_gii + file_key: prec_water_high + coordinates: + - longitude + - latitude + + prec_water_low: + name: prec_water_low + standard_name: atmosphere_mass_content_of_water_vapor + resolution: 6000 + file_type: nc_fci_gii + file_key: prec_water_low + coordinates: + - longitude + - latitude + + prec_water_mid: + name: prec_water_mid + standard_name: atmosphere_mass_content_of_water_vapor + resolution: 6000 + file_type: nc_fci_gii + file_key: prec_water_mid + coordinates: + - longitude + - latitude + + prec_water_total: + name: prec_water_total + standard_name: atmosphere_mass_content_of_water_vapor + resolution: 6000 + file_type: nc_fci_gii + file_key: prec_water_total + coordinates: + - longitude + - latitude + + percent_cloud_free_gii: + name: percent_cloud_free_gii + long_name: Percentage of Cloud Free Pixels Processed in FoR + standard_name: cloud_free_area_fraction + resolution: 6000 + file_type: nc_fci_gii + file_key: percent_cloud_free + units: '%' + coordinates: + - longitude + - latitude + + number_of_iterations_gii: + name: number_of_iterations_gii + standard_name: number_of_iterations + resolution: 6000 + file_type: nc_fci_gii + file_key: number_of_iterations + coordinates: + - longitude + - latitude + + product_quality_gii: + name: product_quality_gii + standard_name: product_quality + file_type: nc_fci_gii + file_key: product_quality + + product_completeness_gii: + name: product_completeness_gii + standard_name: product_completeness + file_type: nc_fci_gii + file_key: product_completeness + + product_timeliness_gii: + name: product_timeliness_gii standard_name: product_timeliness + file_type: nc_fci_gii + file_key: product_timeliness - # OCA + + # OCA - Optimal Cloud Analysis retrieved_cloud_phase: name: retrieved_cloud_phase + standard_name: thermodynamic_phase_of_cloud_particles_classification resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_phase - standard_name: thermodynamic_phase_of_cloud_particles_classification fill_value: -127 import_enum_information: True retrieved_cloud_optical_thickness: name: retrieved_cloud_optical_thickness + standard_name: atmosphere_optical_thickness_due_to_cloud resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_optical_thickness - standard_name: atmosphere_optical_thickness_due_to_cloud retrieved_cloud_optical_thickness_upper_layer: name: retrieved_cloud_optical_thickness_upper_layer + long_name: Cloud Optical Thickness (referenced to 0.55 µm and in log10(COT)) for Upper Layer + standard_name: atmosphere_optical_thickness_due_to_cloud resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_optical_thickness layer: 0 - long_name: Cloud Optical Thickness (referenced to 0.55 µm and in log10(COT)) for Upper Layer - standard_name: atmosphere_optical_thickness_due_to_cloud retrieval_error_cloud_optical_thickness_upper_layer: name: retrieval_error_cloud_optical_thickness_upper_layer + long_name: Cloud Optical Thickness Error (error in log10(COT)) for Upper Layer + standard_name: atmosphere_optical_thickness_due_to_cloud standard_error resolution: 2000 file_type: nc_fci_oca file_key: retrieval_error_cloud_optical_thickness layer: 0 - long_name: Cloud Optical Thickness Error (error in log10(COT)) for Upper Layer - standard_name: atmosphere_optical_thickness_due_to_cloud standard_error retrieved_cloud_optical_thickness_lower_layer: name: retrieved_cloud_optical_thickness_lower_layer + long_name: Cloud Optical Thickness (referenced to 0.55 µm and in log10(COT)) for Lower Layer + standard_name: atmosphere_optical_thickness_due_to_cloud resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_optical_thickness layer: 1 - long_name: Cloud Optical Thickness (referenced to 0.55 µm and in log10(COT)) for Lower Layer - standard_name: atmosphere_optical_thickness_due_to_cloud retrieval_error_cloud_optical_thickness_lower_layer: name: retrieval_error_cloud_optical_thickness_lower_layer + long_name: Cloud Optical Thickness Error (error in log10(COT)) for Lower Layer + standard_name: atmosphere_optical_thickness_due_to_cloud standard_error resolution: 2000 file_type: nc_fci_oca file_key: retrieval_error_cloud_optical_thickness layer: 1 - long_name: Cloud Optical Thickness Error (error in log10(COT)) for Lower Layer - standard_name: atmosphere_optical_thickness_due_to_cloud standard_error retrieved_cloud_particle_effective_radius: name: retrieved_cloud_particle_effective_radius + standard_name: effective_radius_of_cloud_particles_at_cloud_top resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_particle_effective_radius - standard_name: effective_radius_of_cloud_particles_at_cloud_top retrieval_error_cloud_particle_effective_radius: name: retrieval_error_cloud_particle_effective_radius + standard_name: effective_radius_of_cloud_particles_at_cloud_top standard_error resolution: 2000 file_type: nc_fci_oca file_key: retrieval_error_cloud_particle_effective_radius - standard_name: effective_radius_of_cloud_particles_at_cloud_top standard_error retrieved_cloud_top_pressure_upper_layer: name: retrieved_cloud_top_pressure_upper_layer + long_name: Cloud Top Pressure for Upper Layer + standard_name: air_pressure_at_cloud_top resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_top_pressure layer: 0 - long_name: Cloud Top Pressure for Upper Layer - standard_name: air_pressure_at_cloud_top retrieval_error_cloud_top_pressure_upper_layer: name: retrieval_error_cloud_top_pressure_upper_layer + long_name: Cloud Top Pressure Error for Upper Layer + standard_name: air_pressure_at_cloud_top standard_error resolution: 2000 file_type: nc_fci_oca file_key: retrieval_error_cloud_top_pressure layer: 0 - long_name: Cloud Top Pressure Error for Upper Layer - standard_name: air_pressure_at_cloud_top standard_error retrieved_cloud_top_pressure_lower_layer: name: retrieved_cloud_top_pressure_lower_layer + long_name: Cloud Top Pressure for Lower Layer + standard_name: air_pressure_at_cloud_top resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_top_pressure layer: 1 - long_name: Cloud Top Pressure for Lower Layer - standard_name: air_pressure_at_cloud_top retrieval_error_cloud_top_pressure_lower_layer: name: retrieval_error_cloud_top_pressure_lower_layer + long_name: Cloud Top Pressure Error for Lower Layer + standard_name: air_pressure_at_cloud_top standard_error resolution: 2000 file_type: nc_fci_oca file_key: retrieval_error_cloud_top_pressure layer: 1 - long_name: Cloud Top Pressure Error for Lower Layer - standard_name: air_pressure_at_cloud_top standard_error retrieved_cloud_top_temperature: name: retrieved_cloud_top_temperature + standard_name: air_temperature_at_cloud_top resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_top_temperature - standard_name: air_temperature_at_cloud_top retrieved_cloud_top_height: name: retrieved_cloud_top_height + standard_name: height_at_cloud_top resolution: 2000 file_type: nc_fci_oca file_key: retrieved_cloud_top_height - standard_name: height_at_cloud_top quality_jmeas: name: quality_jmeas + standard_name: cost_function_part_due_to_measurements resolution: 2000 file_type: nc_fci_oca file_key: quality_jmeas - standard_name: cost_function_part_due_to_measurements product_quality_oca: name: product_quality_oca + standard_name: product_quality file_type: nc_fci_oca file_key: product_quality - standard_name: product_quality product_completeness_oca: name: product_completeness_oca + standard_name: product_completeness file_type: nc_fci_oca file_key: product_completeness - standard_name: product_completeness product_timeliness_oca: name: product_timeliness_oca + standard_name: product_timeliness file_type: nc_fci_oca file_key: product_timeliness - standard_name: product_timeliness - - # FIR - fire_probability: - name: fire_probability - resolution: 2000 - file_type: nc_fci_fir - file_key: fire_probability - standard_name: fire_probability - - fire_result: - name: fire_result - resolution: 2000 - file_type: nc_fci_fir - file_key: fire_result - standard_name: active_fire_classification - fill_value: -127 - import_enum_information: True - - product_quality_fir: - name: product_quality_fir - file_type: nc_fci_fir - file_key: product_quality - standard_name: product_quality - - product_completeness_fir: - name: product_completeness_fir - file_type: nc_fci_fir - file_key: product_completeness - standard_name: product_completeness - product_timeliness_fir: - name: product_timeliness_fir - file_type: nc_fci_fir - file_key: product_timeliness - standard_name: product_timeliness - # OLR + # OLR - Outgoing Longwave Radiation olr: name: olr + standard_name: outgoing_longwave_radiation resolution: 2000 file_type: nc_fci_olr file_key: olr_value - standard_name: outgoing_longwave_radiation cloud_type_olr: name: cloud_type_olr + standard_name: cloud_type_classification resolution: 2000 file_type: nc_fci_olr file_key: cloud_type - standard_name: cloud_type_classification fill_value: -127 import_enum_information: True quality_overall_processing_olr: name: quality_overall_processing_olr + standard_name: quality_flag resolution: 2000 file_type: nc_fci_olr file_key: quality_overall_processing - standard_name: quality_flag fill_value: -127 import_enum_information: True product_quality_olr: name: product_quality_olr + standard_name: product_quality file_type: nc_fci_olr file_key: product_quality - standard_name: product_quality product_completeness_olr: name: product_completeness_olr + standard_name: product_completeness file_type: nc_fci_olr file_key: product_completeness - standard_name: product_completeness product_timeliness_olr: name: product_timeliness_olr + standard_name: product_timeliness file_type: nc_fci_olr file_key: product_timeliness - standard_name: product_timeliness - # CRM + + # CRM - Clear-Sky Reflectance Maps crm: name: crm + long_name: TOA Bidirectional Reflectance (temporal average) + standard_name: toa_bidirectional_reflectance resolution: 1000 file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance (temporal average) units: '%' crm_vis04: name: crm_vis04 + long_name: TOA Bidirectional Reflectance at 0.44um (temporal average) + standard_name: toa_bidirectional_reflectance resolution: 1000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance at 0.44um (temporal average) units: '%' vis_channel_id: 0 crm_vis05: name: crm_vis05 + long_name: TOA Bidirectional Reflectance at 0.51um (temporal average) + standard_name: toa_bidirectional_reflectance resolution: 1000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance at 0.51um (temporal average) units: '%' vis_channel_id: 1 crm_vis06: name: crm_vis06 + long_name: TOA Bidirectional Reflectance at 0.64um (temporal average) + standard_name: toa_bidirectional_reflectance resolution: 1000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance at 0.64um (temporal average) units: '%' vis_channel_id: 2 crm_vis08: name: crm_vis08 + long_name: TOA Bidirectional Reflectance at 0.86um (temporal average) + standard_name: toa_bidirectional_reflectance resolution: 1000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance at 0.86um (temporal average) units: '%' vis_channel_id: 3 crm_vis09: name: crm_vis09 + long_name: TOA Bidirectional Reflectance at 0.91um (temporal average) + standard_name: toa_bidirectional_reflectance resolution: 1000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance at 0.91um (temporal average) units: '%' vis_channel_id: 4 crm_nir13: name: crm_nir13 + long_name: TOA Bidirectional Reflectance at 1.38um (temporal average) + standard_name: toa_bidirectional_reflectance resolution: 1000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance at 1.38um (temporal average) units: '%' vis_channel_id: 5 crm_nir16: name: crm_nir16 + long_name: TOA Bidirectional Reflectance at 1.61um (temporal average) + standard_name: toa_bidirectional_reflectance resolution: 1000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance at 1.61um (temporal average) units: '%' vis_channel_id: 6 crm_nir22: name: crm_nir22 + long_name: TOA Bidirectional Reflectance at 2.25um (temporal average) + standard_name: toa_bidirectional_reflectance resolution: 1000 wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_crm file_key: mean_clear_sky_reflectance - standard_name: toa_bidirectional_reflectance - long_name: TOA Bidirectional Reflectance at 2.25um (temporal average) units: '%' vis_channel_id: 7 mean_sza: name: mean_sza + long_name: Solar Zenith Angle (temporal average) + standard_name: solar_zenith_angle resolution: 1000 file_type: nc_fci_crm file_key: mean_solar_zenith - standard_name: solar_zenith_angle - long_name: Solar Zenith Angle (temporal average) mean_rel_azi: name: mean_rel_azi + long_name: Relative Solar Satellite Azimuth Angle (temporal average) + standard_name: relative_sun_sensor_azimuth_angle resolution: 1000 file_type: nc_fci_crm file_key: mean_rel_solar_sat_azimuth - standard_name: relative_sun_sensor_azimuth_angle - long_name: Relative Solar Satellite Azimuth Angle (temporal average) n_acc: name: n_acc + standard_name: number_of_accumulations resolution: 1000 file_type: nc_fci_crm file_key: number_of_accumulations - standard_name: number_of_accumulations historical_data: name: historical_data + standard_name: status_flag resolution: 1000 file_type: nc_fci_crm file_key: historical_data - standard_name: status_flag import_enum_information: True product_quality_crm: name: product_quality_crm + standard_name: product_quality file_type: nc_fci_crm file_key: product_quality - standard_name: product_quality product_completeness_crm: name: product_completeness_crm + standard_name: product_completeness file_type: nc_fci_crm file_key: product_completeness - standard_name: product_completeness product_timeliness_crm: name: product_timeliness_crm + standard_name: product_timeliness file_type: nc_fci_crm file_key: product_timeliness - standard_name: product_timeliness # LAT/LON FOR SEGMENTED PRODUCTS latitude: name: latitude + standard_name: latitude file_key: latitude resolution: [6000, 6000, 32000] file_type: [ nc_fci_gii, nc_fci_toz, nc_fci_asr ] - standard_name: latitude units: degree_north longitude: name: longitude + standard_name: longitude file_key: longitude resolution: [6000, 6000, 32000] file_type: [ nc_fci_gii, nc_fci_toz, nc_fci_asr ] - standard_name: longitude units: degree_east - # GII - k_index: - name: k_index - resolution: 6000 - file_type: nc_fci_gii - file_key: k_index - coordinates: - - longitude - - latitude - standard_name: atmosphere_stability_k_index - - lifted_index: - name: lifted_index - resolution: 6000 - file_type: nc_fci_gii - file_key: lifted_index - coordinates: - - longitude - - latitude - standard_name: atmosphere_stability_lifted_index - - prec_water_high: - name: prec_water_high - resolution: 6000 - file_type: nc_fci_gii - file_key: prec_water_high - coordinates: - - longitude - - latitude - standard_name: atmosphere_mass_content_of_water_vapor - - prec_water_low: - name: prec_water_low - resolution: 6000 - file_type: nc_fci_gii - file_key: prec_water_low - coordinates: - - longitude - - latitude - standard_name: atmosphere_mass_content_of_water_vapor - - prec_water_mid: - name: prec_water_mid - resolution: 6000 - file_type: nc_fci_gii - file_key: prec_water_mid - coordinates: - - longitude - - latitude - standard_name: atmosphere_mass_content_of_water_vapor - - prec_water_total: - name: prec_water_total - resolution: 6000 - file_type: nc_fci_gii - file_key: prec_water_total - coordinates: - - longitude - - latitude - standard_name: atmosphere_mass_content_of_water_vapor - - percent_cloud_free_gii: - name: percent_cloud_free_gii - resolution: 6000 - file_type: nc_fci_gii - file_key: percent_cloud_free - units: '%' - coordinates: - - longitude - - latitude - long_name: Percentage of Cloud Free Pixels Processed in FoR - standard_name: cloud_free_area_fraction - - number_of_iterations_gii: - name: number_of_iterations_gii - resolution: 6000 - file_type: nc_fci_gii - file_key: number_of_iterations - coordinates: - - longitude - - latitude - standard_name: number_of_iterations - - product_quality_gii: - name: product_quality_gii - file_type: nc_fci_gii - file_key: product_quality - standard_name: product_quality - - product_completeness_gii: - name: product_completeness_gii - file_type: nc_fci_gii - file_key: product_completeness - standard_name: product_completeness - - product_timeliness_gii: - name: product_timeliness_gii - file_type: nc_fci_gii - file_key: product_timeliness - standard_name: product_timeliness - - # CLM Test + # CLM Test - Cloud Mask Test cloud_test_sit1_flag: name: cloud_test_sit1_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 0 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt1_flag: name: cloud_test_cmt1_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 1 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt2_flag: name: cloud_test_cmt2_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 2 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt3_flag: name: cloud_test_cmt3_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 3 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt4_flag: name: cloud_test_cmt4_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 4 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt5_flag: name: cloud_test_cmt5_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 5 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt6_flag: name: cloud_test_cmt6_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 6 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt7_flag: name: cloud_test_cmt7_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 7 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt8_flag: name: cloud_test_cmt8_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 8 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt9_flag: name: cloud_test_cmt9_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 9 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt10_flag: name: cloud_test_cmt10_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 10 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt11_flag: name: cloud_test_cmt11_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 11 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt12_flag: name: cloud_test_cmt12_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 12 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt13_flag: name: cloud_test_cmt13_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 13 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmt14_flag: name: cloud_test_cmt14_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 14 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_opqt_flag: name: cloud_test_opqt_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 15 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmrt1_flag: name: cloud_test_cmrt1_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 16 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmrt2_flag: name: cloud_test_cmrt2_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 17 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmrt3_flag: name: cloud_test_cmrt3_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 18 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmrt4_flag: name: cloud_test_cmrt4_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 19 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmrt5_flag: name: cloud_test_cmrt5_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 20 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_cmrt6_flag: name: cloud_test_cmrt6_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 21 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_dust_flag: name: cloud_test_dust_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 22 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_ash_flag: name: cloud_test_ash_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 23 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_dust_ash_flag: name: cloud_test_dust_ash_flag + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_flag extract_byte: 24 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] - standard_name: status_flag cloud_test_sit1: name: cloud_test_sit1 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 0 flag_values: [0,1] flag_meanings: ['No snow/ice detected',' Snow/ice detected'] - standard_name: status_flag cloud_test_cmt1: name: cloud_test_cmt1 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 1 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt2: name: cloud_test_cmt2 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 2 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt3: name: cloud_test_cmt3 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 3 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt4: name: cloud_test_cmt4 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 4 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt5: name: cloud_test_cmt5 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 5 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt6: name: cloud_test_cmt6 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 6 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt7: name: cloud_test_cmt7 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 7 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt8: name: cloud_test_cmt8 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 8 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt9: name: cloud_test_cmt9 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 9 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt10: name: cloud_test_cmt10 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 10 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt11: name: cloud_test_cmt11 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 11 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt12: name: cloud_test_cmt12 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 12 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt13: name: cloud_test_cmt13 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 13 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmt14: name: cloud_test_cmt14 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 14 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_opqt: name: cloud_test_opqt + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 15 flag_values: [0,1] flag_meanings: ['No opaqueness detected', 'Opaqueness detected'] - standard_name: status_flag cloud_test_cmrt1: name: cloud_test_cmrt1 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 16 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] - standard_name: status_flag cloud_test_cmrt2: name: cloud_test_cmrt2 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 17 flag_values: [0,1] flag_meanings: ['Clear unchanged', 'Cloud detected (restored from clear sky)'] - standard_name: status_flag cloud_test_cmrt3: name: cloud_test_cmrt3 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 18 flag_values: [0,1] flag_meanings: ['Clear unchanged', 'Cloud detected (restored from clear sky)'] - standard_name: status_flag cloud_test_cmrt4: name: cloud_test_cmrt4 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 19 flag_values: [0,1] flag_meanings: ['Clear unchanged', 'Cloud detected (restored from clear sky)'] - standard_name: status_flag cloud_test_cmrt5: name: cloud_test_cmrt5 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 20 flag_values: [0,1] flag_meanings: ['Clear sky restored', 'Cloud unchanged'] - standard_name: status_flag cloud_test_dust: name: cloud_test_dust + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 21 flag_values: [0,1] flag_meanings: ['No dust detected','Dust detected'] - standard_name: status_flag cloud_test_ash: name: cloud_test_ash + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 22 flag_values: [0,1] flag_meanings: ['No ash detected','Ash detected'] - standard_name: status_flag cloud_test_dust_ash: name: cloud_test_dust_ash + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_test_result extract_byte: 23 flag_values: [0,1] flag_meanings: ['Dust detected','Ash detected'] - standard_name: status_flag cloud_test_cmrt6: name: cloud_test_cmrt6 + standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm file_key: cloud_mask_cmrt6_test_result fill_value: -127 - standard_name: status_flag import_enum_information: True - # ASR + # ASR - All-Sky Radiances bt_max: name: bt_max resolution: 32000 @@ -3107,260 +3374,3 @@ datasets: file_type: nc_fci_asr file_key: product_timeliness standard_name: product_timeliness - -# AMV Intermediate Product - intm_latitude: - name: intm_latitude - file_type: nc_fci_amvi - file_key: intm_latitude - standard_name: latitude - - intm_longitude: - name: intm_longitude - file_type: nc_fci_amvi - file_key: intm_longitude - standard_name: longitude - - intm_speed: - name: intm_speed - file_type: nc_fci_amvi - file_key: intm_speed - standard_name: wind_speed - coordinates: - - intm_longitude - - intm_latitude - - intm_u_component: - name: intm_u_component - file_type: nc_fci_amvi - file_key: intm_u_component - standard_name: wind_speed_horizontal_component - coordinates: - - intm_longitude - - intm_latitude - - intm_v_component: - name: intm_v_component - file_type: nc_fci_amvi - file_key: intm_v_component - standard_name: wind_speed_vertical_component - coordinates: - - intm_longitude - - intm_latitude - - intm_direction: - name: intm_direction - file_type: nc_fci_amvi - file_key: intm_direction - standard_name: wind_to_direction - coordinates: - - intm_longitude - - intm_latitude - - intm_pressure: - name: intm_pressure - file_type: nc_fci_amvi - file_key: intm_pressure - standard_name: wind_pressure - coordinates: - - intm_longitude - - intm_latitude - - intm_temperature: - name: intm_temperature - file_type: nc_fci_amvi - file_key: intm_temperature - standard_name: wind_temperature - coordinates: - - intm_longitude - - intm_latitude - - intm_target_type: - name: intm_target_type - file_type: nc_fci_amvi - file_key: target_type - standard_name: wind_target_type - coordinates: - - intm_longitude - - intm_latitude - - intm_wind_method: - name: intm_wind_method - file_type: nc_fci_amvi - file_key: wind_method - standard_name: wind_wind_method - coordinates: - - intm_longitude - - intm_latitude - -# AMV Final Product - channel_id: - name: channel_id - file_type: nc_fci_amv - file_key: channel_id - standard_name: channel_id - - amv_latitude: - name: latitude - file_type: nc_fci_amv - file_key: latitude - standard_name: latitude - - amv_longitude: - name: longitude - file_type: nc_fci_amv - file_key: longitude - standard_name: longitude - - speed: - name: speed - file_type: nc_fci_amv - file_key: speed - standard_name: wind_speed - coordinates: - - longitude - - latitude - - speed_u_component: - name: speed_u_component - file_type: nc_fci_amv - file_key: speed_u_component - standard_name: wind_speed_horizontal_component - coordinates: - - longitude - - latitude - - speed_v_component: - name: speed_v_component - file_type: nc_fci_amv - file_key: speed_v_component - standard_name: wind_speed_vertical_component - coordinates: - - longitude - - latitude - - direction: - name: direction - file_type: nc_fci_amv - file_key: direction - standard_name: wind_to_direction - coordinates: - - longitude - - latitude - - pressure: - name: pressure - file_type: nc_fci_amv - file_key: pressure - standard_name: wind_pressure - coordinates: - - longitude - - latitude - - temperature: - name: temperature - file_type: nc_fci_amv - file_key: temperature - standard_name: wind_temperature - coordinates: - - longitude - - latitude - - target_type: - name: target_type - file_type: nc_fci_amv - file_key: target_type - standard_name: wind_target_type - coordinates: - - longitude - - latitude - - wind_method: - name: wind_method - file_type: nc_fci_amv - file_key: wind_method - standard_name: wind_wind_method - coordinates: - - longitude - - latitude - - fcst_u: - name: fcst_u - file_type: nc_fci_amv - file_key: forecast_u_component - standard_name: wind_forecast_u_component - coordinates: - - longitude - - latitude - - fcst_v: - name: fcst_v - file_type: nc_fci_amv - file_key: forecast_v_component - standard_name: wind_forecast_v_component - coordinates: - - longitude - - latitude - - best_fit_pres: - name: best_fit_pres - file_type: nc_fci_amv - file_key: best_fit_pressure - standard_name: wind_best_fit_pressure - coordinates: - - longitude - - latitude - - best_fit_u: - name: best_fit_u - file_type: nc_fci_amv - file_key: best_fit_u_component - standard_name: wind_best_fit_u_component - coordinates: - - longitude - - latitude - - best_fit_v: - name: best_fit_v - file_type: nc_fci_amv - file_key: best_fit_v_component - standard_name: wind_best_fit_v_component - coordinates: - - longitude - - latitude - - qi: - name: qi - file_type: nc_fci_amv - file_key: overall_reliability - standard_name: wind_overall_reliability - coordinates: - - longitude - - latitude - - qi_excl_fcst: - name: qi_excl_fcst - file_type: nc_fci_amv - file_key: overall_reliability_exc_forecast - standard_name: wind_overall_reliability_exc_forecast - coordinates: - - longitude - - latitude - - product_quality: - name: product_quality - file_type: nc_fci_amv - file_key: product_quality - standard_name: product_quality - - product_completeness: - name: product_completeness - file_type: nc_fci_amv - file_key: product_completeness - standard_name: product_completeness - - product_timeliness: - name: product_timeliness - file_type: nc_fci_amv - file_key: product_timeliness - standard_name: product_timeliness From 785abd607a18c3cf49a6f2ab704857d22b766843 Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Fri, 12 Jan 2024 16:14:22 +0000 Subject: [PATCH 117/481] Add support for the MERSI-RM instrument on FY-3G --- satpy/etc/composites/mersi-rm.yaml | 89 +++++++++ satpy/etc/readers/mersi_rm_l1b.yaml | 275 ++++++++++++++++++++++++++++ satpy/readers/mersi_l1b.py | 18 +- 3 files changed, 379 insertions(+), 3 deletions(-) create mode 100644 satpy/etc/composites/mersi-rm.yaml create mode 100644 satpy/etc/readers/mersi_rm_l1b.yaml diff --git a/satpy/etc/composites/mersi-rm.yaml b/satpy/etc/composites/mersi-rm.yaml new file mode 100644 index 0000000000..ab0317b62f --- /dev/null +++ b/satpy/etc/composites/mersi-rm.yaml @@ -0,0 +1,89 @@ +sensor_name: visir/mersi-rm + +modifiers: + rayleigh_corrected: + modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance + atmosphere: us-standard + aerosol_type: rayleigh_only + prerequisites: + - name: '1' + modifiers: [sunz_corrected] + optional_prerequisites: + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + sunz_corrected: + modifier: !!python/name:satpy.modifiers.SunZenithCorrector + prerequisites: + - solar_zenith_angle + + nir_reflectance: + modifier: !!python/name:satpy.modifiers.NIRReflectance + prerequisites: + - name: '7' + optional_prerequisites: + - solar_zenith_angle + + +composites: + natural_color: + compositor: !!python/name:satpy.composites.RatioSharpenedRGB + prerequisites: + - name: '5' + modifiers: [sunz_corrected] + - name: '3' + modifiers: [sunz_corrected] + - name: '1' + modifiers: [sunz_corrected] + standard_name: natural_color + + overview_raw: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: '1' + - name: '2' + - name: '7' + standard_name: overview + + overview: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: '1' + modifiers: [sunz_corrected] + - name: '2' + modifiers: [sunz_corrected] + - name: '7' + standard_name: overview + + cloudtop: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: '7' + - name: '8' + - name: '9' + standard_name: cloudtop + + day_microphysics: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: '2' + modifiers: [sunz_corrected] + - name: '7' + modifiers: [nir_reflectance] + - name: '8' + standard_name: day_microphysics + + night_fog: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: '8' + - name: '7' + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: '7' + - name: '6' + - name: '7' + standard_name: night_fog diff --git a/satpy/etc/readers/mersi_rm_l1b.yaml b/satpy/etc/readers/mersi_rm_l1b.yaml new file mode 100644 index 0000000000..fa70ad57a5 --- /dev/null +++ b/satpy/etc/readers/mersi_rm_l1b.yaml @@ -0,0 +1,275 @@ +reader: + name: mersi_rm_l1b + short_name: MERSI-RM l1b + long_name: MERSI-RM L1B data in HDF5 format + description: FY-3G Medium Resolution Spectral Imager - Rainfall Measurement (MERSI-RM) L1B Reader + status: Beta + supports_fsspec: false + sensors: [mersi-rm] + reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader + +file_types: + mersi_rm_l1b_500: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 10 + file_patterns: + # From National Meteorological Satellite Center + - '{platform_shortname}_MERSI_GRAN_L1_{start_time:%Y%m%d_%H%M}_0500M_V1.{ext:3s}' + + mersi_rm_l1b_500_geo: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 10 + file_patterns: + # From National Meteorological Satellite Center + - '{platform_shortname}_MERSI_GRAN_L1_{start_time:%Y%m%d_%H%M}_GEOHK_V1.{ext:3s}' + +# NOTE: Min/max wavelengths are defined here as the wavelength associated with a 1% SRF. +datasets: + '1': + name: '1' + wavelength: [0.60, 0.648, 0.70] + resolution: 500 + file_type: mersi_rm_l1b_500 + file_key: Data/EV_Reflectance + band_index: 0 + calibration_key: Calibration/RSB_Cal_Coeff + calibration_index: 0 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts + '2': + name: '2' + wavelength: [0.82, 0.862, 0.91] + resolution: 500 + file_type: mersi_rm_l1b_500 + file_key: Data/EV_Reflectance + band_index: 1 + calibration_key: Calibration/RSB_Cal_Coeff + calibration_index: 0 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts + '3': + name: '3' + wavelength: [0.89, 0.935, 0.97] + resolution: 500 + file_type: mersi_rm_l1b_500 + file_key: Data/EV_Reflectance + band_index: 2 + calibration_key: Calibration/RSB_Cal_Coeff + calibration_index: 0 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts + '4': + name: '4' + wavelength: [1.33, 1.377, 1.42] + resolution: 500 + file_type: mersi_rm_l1b_500 + file_key: Data/EV_Reflectance + band_index: 3 + calibration_key: Calibration/RSB_Cal_Coeff + calibration_index: 0 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts + '5': + name: '5' + wavelength: [1.58, 1.638, 1.69] + resolution: 500 + file_type: mersi_rm_l1b_500 + file_key: Data/EV_Reflectance + band_index: 4 + calibration_key: Calibration/RSB_Cal_Coeff + calibration_index: 0 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts + '6': + name: '6' + wavelength: [3.64, 3.809, 3.99] + resolution: 500 + file_type: mersi_rm_l1b_500 + file_key: Data/EV_Emissive + band_index: 0 + calibration_key: Calibration/IR_Cal_Coeff + calibration_index: 2 + coordinates: [longitude, latitude] + calibration: + brightness_temperature: + units: "K" + standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength + '7': + name: '7' + wavelength: [10.08, 10.736, 11.62] + resolution: 500 + file_type: mersi_rm_l1b_500 + file_key: Data/EV_Emissive + band_index: 1 + calibration_key: Calibration/IR_Cal_Coeff + calibration_index: 2 + coordinates: [longitude, latitude] + calibration: + brightness_temperature: + units: "K" + standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength + '8': + name: '8' + wavelength: [11.31, 12.019, 12.81] + resolution: 500 + file_type: mersi_rm_l1b_500 + file_key: Data/EV_Emissive + band_index: 2 + calibration_key: Calibration/IR_Cal_Coeff + calibration_index: 2 + coordinates: [longitude, latitude] + calibration: + brightness_temperature: + units: "K" + standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength + + longitude: + name: longitude + units: degrees_east + standard_name: longitude + resolution: 500 + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/Longitude + + latitude: + name: latitude + units: degrees_north + standard_name: latitude + resolution: 500 + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/Latitude + + solar_zenith_angle: + name: solar_zenith_angle + units: degree + standard_name: solar_zenith_angle + resolution: 500 + coordinates: [longitude, latitude] + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/SolarZenith + + solar_azimuth_angle: + name: solar_azimuth_angle + units: degree + standard_name: solar_azimuth_angle + resolution: 500 + coordinates: [longitude, latitude] + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/SolarAzimuth + + satellite_zenith_angle: + name: satellite_zenith_angle + units: degree + standard_name: sensor_zenith_angle + resolution: 500 + coordinates: [longitude, latitude] + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/SensorZenith + + satellite_azimuth_angle: + name: satellite_azimuth_angle + units: degree + standard_name: sensor_azimuth_angle + resolution: 500 + coordinates: [longitude, latitude] + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/SensorAzimuth + + moon_zenith_angle: + name: moon_zenith_angle + units: degree + standard_name: moon_zenith_angle + resolution: 500 + coordinates: [longitude, latitude] + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/MoonZenith + + moon_azimuth_angle: + name: moon_azimuth_angle + units: degree + standard_name: moon_azimuth_angle + resolution: 500 + coordinates: [longitude, latitude] + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/MoonAzimuth + + altitude: + name: altitude + units: degree + standard_name: altitude + resolution: 500 + coordinates: [longitude, latitude] + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/Altitude + + landcover: + name: landcover + units: degree + standard_name: landcover + resolution: 500 + coordinates: [longitude, latitude] + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/LandCover + + landseamask: + name: landseamask + units: degree + standard_name: landseamask + resolution: 500 + coordinates: [longitude, latitude] + file_type: mersi_rm_l1b_500_geo + file_key: Geolocation/LandSeaMask diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 7070131f51..7675bd1624 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -36,7 +36,7 @@ class MERSIL1B(HDF5FileHandler): - """MERSI-2/MERSI-LL L1B file reader.""" + """MERSI-2/MERSI-LL/MERSI-RM L1B file reader.""" def _strptime(self, date_attr, time_attr): """Parse date/time strings.""" @@ -63,9 +63,18 @@ def sensor_name(self): sensor = { "MERSI": "mersi-2", "MERSI LL": "mersi-ll", + "MERSI RM": "mersi-rm", }.get(file_sensor, file_sensor) return sensor + def get_refl_mult(self): + """Get reflectance multiplier.""" + if self.sensor_name == "mersi-rm": + # MERSI-RM has reflectance in the range 0-1, so we need to convert + return 100. + else: + return 1. + def _get_single_slope_intercept(self, slope, intercept, cal_index): try: # convert scalar arrays to scalar @@ -103,7 +112,7 @@ def get_dataset(self, dataset_id, ds_info): slope = attrs.pop("Slope", None) intercept = attrs.pop("Intercept", None) if slope is not None and dataset_id.get("calibration") != "counts": - if band_index is not None: + if band_index is not None and slope.size > 1: slope = slope[band_index] intercept = intercept[band_index] data = data * slope + intercept @@ -112,12 +121,12 @@ def get_dataset(self, dataset_id, ds_info): coeffs = self._get_coefficients(ds_info["calibration_key"], ds_info["calibration_index"]) data = coeffs[0] + coeffs[1] * data + coeffs[2] * data ** 2 + data = data * self.get_refl_mult() elif dataset_id.get("calibration") == "brightness_temperature": calibration_index = ds_info["calibration_index"] # Converts um^-1 (wavenumbers) and (mW/m^2)/(str/cm^-1) (radiance data) # to SI units m^-1, mW*m^-3*str^-1. wave_number = 1. / (dataset_id["wavelength"][1] / 1e6) - data = self._get_bt_dataset(data, calibration_index, wave_number) data.attrs = attrs @@ -195,6 +204,9 @@ def _get_bt_dataset(self, data, calibration_index, wave_number): corr_coeff_b = coeffs[calibration_index + N_TOT_IR_CHANS_LL] except KeyError: return data + else: + # MERSI-RM has no correction coefficients + corr_coeff_a = 0 if corr_coeff_a != 0: data = (data - corr_coeff_b) / corr_coeff_a From 817d8be55734eb8a5a2fadfe133906c31c08cada Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 15 Jan 2024 16:27:25 +0100 Subject: [PATCH 118/481] Harmonize key order for ASR --- satpy/etc/readers/fci_l2_nc.yaml | 1482 ++++++++++++++++++++++-------- 1 file changed, 1099 insertions(+), 383 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index dfa8b14ad4..dbf5db6a8a 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1588,11 +1588,11 @@ datasets: # ASR - All-Sky Radiances bt_max: name: bt_max + long_name: TOA Brightess Temperature Segment max + standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr file_key: bt_max - long_name: TOA Brightess Temperature Segment Max - standard_name: toa_brightess_temperature cell_method: area:maximum coordinates: - longitude @@ -1600,11 +1600,11 @@ datasets: bt_mean: name: bt_mean + long_name: TOA Brightess Temperature Segment mean + standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr file_key: bt_mean - long_name: TOA Brightess Temperature Segment Mean - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -1612,11 +1612,11 @@ datasets: bt_min: name: bt_min + long_name: TOA Brightess Temperature Segment min + standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr file_key: bt_min - long_name: TOA Brightess Temperature Segment Min - standard_name: toa_brightess_temperature cell_method: area:minimum coordinates: - longitude @@ -1624,11 +1624,11 @@ datasets: bt_std: name: bt_std + long_name: TOA Brightess Temperature Segment Standard Deviation + standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr file_key: bt_std - long_name: TOA Brightess Temperature Segment Standard Deviation - standard_name: toa_brightess_temperature cell_method: area:standard_deviation coordinates: - longitude @@ -1636,11 +1636,11 @@ datasets: radiance_max: name: radiance_max + long_name: TOA Radiance Segment max + standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr file_key: radiance_max - long_name: TOA Radiance Segment Max - standard_name: toa_outgoing_radiance cell_method: area:maximum coordinates: - longitude @@ -1648,11 +1648,11 @@ datasets: radiance_mean: name: radiance_mean + long_name: TOA Radiance Segment mean + standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr file_key: radiance_mean - long_name: TOA Radiance Segment Mean - standard_name: toa_outgoing_radiance cell_method: area:mean coordinates: - longitude @@ -1660,11 +1660,11 @@ datasets: radiance_min: name: radiance_min + long_name: TOA Radiance Segment min + standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr file_key: radiance_min - long_name: TOA Radiance Segment Min - standard_name: toa_outgoing_radiance cell_method: area:minimum coordinates: - longitude @@ -1672,11 +1672,11 @@ datasets: radiance_std: name: radiance_std + long_name: TOA Radiance Segment Standard Deviation + standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr file_key: radiance_std - long_name: TOA Radiance Segment Standard Deviation - standard_name: toa_outgoing_radiance cell_method: area:standard_deviation coordinates: - longitude @@ -1684,11 +1684,11 @@ datasets: reflectance_max: name: reflectance_max + long_name: TOA Bidirectional Reflectance Segment max + standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr file_key: reflectance_max - long_name: TOA Bidirectional Reflectance Segment Max - standard_name: toa_bidirectional_reflectance cell_method: area:maximum units: '%' coordinates: @@ -1697,11 +1697,11 @@ datasets: reflectance_mean: name: reflectance_mean + long_name: TOA Bidirectional Reflectance Segment mean + standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr file_key: reflectance_mean - long_name: TOA Bidirectional Reflectance Segment Mean - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1710,11 +1710,11 @@ datasets: reflectance_min: name: reflectance_min + long_name: TOA Bidirectional Reflectance Segment min + standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr file_key: reflectance_min - long_name: TOA Bidirectional Reflectance Segment Min - standard_name: toa_bidirectional_reflectance cell_method: area:minimum units: '%' coordinates: @@ -1723,11 +1723,11 @@ datasets: reflectance_std: name: reflectance_std + long_name: TOA Bidirectional Reflectance Segment Standard Deviation + standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr file_key: reflectance_std - long_name: TOA Bidirectional Reflectance Segment Standard Deviation - standard_name: toa_bidirectional_reflectance cell_method: area:standard_deviation units: '%' coordinates: @@ -1736,12 +1736,12 @@ datasets: quality_bt: name: quality_bt + long_name: TOA Brightess Temperature % Confidence + standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr file_key: quality_bt fill_value: -1 - long_name: TOA Brightess Temperature % confidence - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -1749,12 +1749,12 @@ datasets: quality_reflectance: name: quality_reflectance + long_name: TOA Bidirectional Reflectance % Confidence + standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr file_key: quality_reflectance fill_value: -1 - long_name: TOA Bidirectional Reflectance % confidence - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -1762,60 +1762,56 @@ datasets: quality_radiance: name: quality_radiance + long_name: TOA Radiance % Confidence + standard_name: radiance_quality resolution: 32000 file_type: nc_fci_asr file_key: quality_radiance fill_value: -1 - long_name: TOA Radiance % confidence - standard_name: radiance_quality - units: '%' coordinates: - longitude - latitude land_pixel_percent: name: land_pixel_percent + standard_name: land_area_fraction resolution: 32000 file_type: nc_fci_asr file_key: land_pixel_percent - standard_name: land_area_fraction - units: '%' coordinates: - longitude - latitude water_pixel_percent: name: water_pixel_percent + standard_name: water_area_fraction resolution: 32000 file_type: nc_fci_asr file_key: water_pixel_percent - standard_name: water_area_fraction - units: '%' coordinates: - longitude - latitude pixel_percentage: name: pixel_percentage + standard_name: water_area_fraction resolution: 32000 file_type: nc_fci_asr file_key: pixel_percentage - standard_name: pixels_used_fraction - units: '%' coordinates: - longitude - latitude reflectance_mean_all_vis04: name: reflectance_mean_all_vis04 + long_name: TOA Bidirectional Reflectance Segment mean at 0.44um (all pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 0 + wavelength: [0.384, 0.444, 0.504] category_id: 0 - long_name: TOA Bidirectional Reflectance Segment mean at 0.44um (all pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1824,14 +1820,14 @@ datasets: reflectance_mean_clear_vis04: name: reflectance_mean_clear_vis04 + long_name: TOA Bidirectional Reflectance Segment mean at 0.44um (clear pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 0 + wavelength: [0.384, 0.444, 0.504] category_id: 1 - long_name: TOA Bidirectional Reflectance Segment mean at 0.44um (clear pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1840,14 +1836,14 @@ datasets: reflectance_mean_cloudy_vis04: name: reflectance_mean_cloudy_vis04 + long_name: TOA Bidirectional Reflectance Segment mean at 0.44um (cloudy pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 0 + wavelength: [0.384, 0.444, 0.504] category_id: 2 - long_name: TOA Bidirectional Reflectance Segment mean at 0.44um (cloudy pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1856,14 +1852,14 @@ datasets: reflectance_mean_all_vis05: name: reflectance_mean_all_vis05 + long_name: TOA Bidirectional Reflectance Segment mean at 0.51um (all pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 1 + wavelength: [0.47, 0.51, 0.55] category_id: 0 - long_name: TOA Bidirectional Reflectance Segment mean at 0.51um (all pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1872,14 +1868,14 @@ datasets: reflectance_mean_clear_vis05: name: reflectance_mean_clear_vis05 + long_name: TOA Bidirectional Reflectance Segment mean at 0.51um (clear pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 1 + wavelength: [0.47, 0.51, 0.55] category_id: 1 - long_name: TOA Bidirectional Reflectance Segment mean at 0.51um (clear pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1888,14 +1884,14 @@ datasets: reflectance_mean_cloudy_vis05: name: reflectance_mean_cloudy_vis05 + long_name: TOA Bidirectional Reflectance Segment mean at 0.51um (cloudy pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 1 + wavelength: [0.47, 0.51, 0.55] category_id: 2 - long_name: TOA Bidirectional Reflectance Segment mean at 0.51um (cloudy pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1904,14 +1900,14 @@ datasets: reflectance_mean_all_vis06: name: reflectance_mean_all_vis06 + long_name: TOA Bidirectional Reflectance Segment mean at 0.64um (all pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 2 + wavelength: [0.59, 0.64, 0.69] category_id: 0 - long_name: TOA Bidirectional Reflectance Segment mean at 0.64um (all pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1920,14 +1916,14 @@ datasets: reflectance_mean_clear_vis06: name: reflectance_mean_clear_vis06 + long_name: TOA Bidirectional Reflectance Segment mean at 0.64um (clear pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 2 + wavelength: [0.59, 0.64, 0.69] category_id: 1 - long_name: TOA Bidirectional Reflectance Segment mean at 0.64um (clear pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1936,14 +1932,14 @@ datasets: reflectance_mean_cloudy_vis06: name: reflectance_mean_cloudy_vis06 + long_name: TOA Bidirectional Reflectance Segment mean at 0.64um (cloudy pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 2 + wavelength: [0.59, 0.64, 0.69] category_id: 2 - long_name: TOA Bidirectional Reflectance Segment mean at 0.64um (cloudy pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1952,14 +1948,14 @@ datasets: reflectance_mean_all_vis08: name: reflectance_mean_all_vis08 + long_name: TOA Bidirectional Reflectance Segment mean at 0.86um (all pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 3 + wavelength: [0.815, 0.865, 0.915] category_id: 0 - long_name: TOA Bidirectional Reflectance Segment mean at 0.86um (all pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1968,14 +1964,14 @@ datasets: reflectance_mean_clear_vis08: name: reflectance_mean_clear_vis08 + long_name: TOA Bidirectional Reflectance Segment mean at 0.86um (clear pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 3 + wavelength: [0.815, 0.865, 0.915] category_id: 1 - long_name: TOA Bidirectional Reflectance Segment mean at 0.86um (clear pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -1984,14 +1980,14 @@ datasets: reflectance_mean_cloudy_vis08: name: reflectance_mean_cloudy_vis08 + long_name: TOA Bidirectional Reflectance Segment mean at 0.86um (cloudy pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 3 + wavelength: [0.815, 0.865, 0.915] category_id: 2 - long_name: TOA Bidirectional Reflectance Segment mean at 0.86um (cloudy pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2000,14 +1996,14 @@ datasets: reflectance_mean_all_vis09: name: reflectance_mean_all_vis09 + long_name: TOA Bidirectional Reflectance Segment mean at 0.91um (all pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 4 + wavelength: [0.894, 0.914, 0.934] category_id: 0 - long_name: TOA Bidirectional Reflectance Segment mean at 0.91um (all pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2016,14 +2012,14 @@ datasets: reflectance_mean_clear_vis09: name: reflectance_mean_clear_vis09 + long_name: TOA Bidirectional Reflectance Segment mean at 0.91um (clear pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 4 + wavelength: [0.894, 0.914, 0.934] category_id: 1 - long_name: TOA Bidirectional Reflectance Segment mean at 0.91um (clear pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2032,14 +2028,14 @@ datasets: reflectance_mean_cloudy_vis09: name: reflectance_mean_cloudy_vis09 + long_name: TOA Bidirectional Reflectance Segment mean at 0.91um (cloudy pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 4 + wavelength: [0.894, 0.914, 0.934] category_id: 2 - long_name: TOA Bidirectional Reflectance Segment mean at 0.91um (cloudy pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2048,14 +2044,14 @@ datasets: reflectance_mean_all_nir13: name: reflectance_mean_all_nir13 + long_name: TOA Bidirectional Reflectance Segment mean at 1.38um (all pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 5 + wavelength: [1.35, 1.38, 1.41] category_id: 0 - long_name: TOA Bidirectional Reflectance Segment mean at 1.38um (all pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2064,14 +2060,14 @@ datasets: reflectance_mean_clear_nir13: name: reflectance_mean_clear_nir13 + long_name: TOA Bidirectional Reflectance Segment mean at 1.38um (clear pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 5 + wavelength: [1.35, 1.38, 1.41] category_id: 1 - long_name: TOA Bidirectional Reflectance Segment mean at 1.38um (clear pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2080,14 +2076,14 @@ datasets: reflectance_mean_cloudy_nir13: name: reflectance_mean_cloudy_nir13 + long_name: TOA Bidirectional Reflectance Segment mean at 1.38um (cloudy pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 5 + wavelength: [1.35, 1.38, 1.41] category_id: 2 - long_name: TOA Bidirectional Reflectance Segment mean at 1.38um (cloudy pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2096,14 +2092,14 @@ datasets: reflectance_mean_all_nir16: name: reflectance_mean_all_nir16 + long_name: TOA Bidirectional Reflectance Segment mean at 1.61um (all pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 6 + wavelength: [1.56, 1.61, 1.66] category_id: 0 - long_name: TOA Bidirectional Reflectance Segment mean at 1.61um (all pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2112,14 +2108,14 @@ datasets: reflectance_mean_clear_nir16: name: reflectance_mean_clear_nir16 + long_name: TOA Bidirectional Reflectance Segment mean at 1.61um (clear pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 6 + wavelength: [1.56, 1.61, 1.66] category_id: 1 - long_name: TOA Bidirectional Reflectance Segment mean at 1.61um (clear pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2128,14 +2124,14 @@ datasets: reflectance_mean_cloudy_nir16: name: reflectance_mean_cloudy_nir16 + long_name: TOA Bidirectional Reflectance Segment mean at 1.61um (cloudy pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 6 + wavelength: [1.56, 1.61, 1.66] category_id: 2 - long_name: TOA Bidirectional Reflectance Segment mean at 1.61um (cloudy pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2144,14 +2140,14 @@ datasets: reflectance_mean_all_nir22: name: reflectance_mean_all_nir22 + long_name: TOA Bidirectional Reflectance Segment mean at 2.25um (all pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 7 + wavelength: [2.2, 2.25, 2.3] category_id: 0 - long_name: TOA Bidirectional Reflectance Segment mean at 2.25um (all pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2160,14 +2156,14 @@ datasets: reflectance_mean_clear_nir22: name: reflectance_mean_clear_nir22 + long_name: TOA Bidirectional Reflectance Segment mean at 2.25um (clear pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 7 + wavelength: [2.2, 2.25, 2.3] category_id: 1 - long_name: TOA Bidirectional Reflectance Segment mean at 2.25um (clear pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2176,14 +2172,14 @@ datasets: reflectance_mean_cloudy_nir22: name: reflectance_mean_cloudy_nir22 + long_name: TOA Bidirectional Reflectance Segment mean at 2.25um (cloudy pixels) + standard_name: toa_bidirectional_reflectance resolution: 32000 - wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: reflectance_mean vis_channel_id: 7 + wavelength: [2.2, 2.25, 2.3] category_id: 2 - long_name: TOA Bidirectional Reflectance Segment mean at 2.25um (cloudy pixels) - standard_name: toa_bidirectional_reflectance cell_method: area:mean units: '%' coordinates: @@ -2192,14 +2188,14 @@ datasets: bt_mean_all_ir38: name: bt_mean_all_ir38 + long_name: TOA Brightess Temperature Segment mean at 3.80um (all pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 0 + wavelength: [3.4, 3.8, 4.2] category_id: 0 - long_name: TOA Brightess Temperature Segment mean at 3.80um (all pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2207,14 +2203,14 @@ datasets: bt_mean_clear_ir38: name: bt_mean_clear_ir38 + long_name: TOA Brightess Temperature Segment mean at 3.80um (clear pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 0 + wavelength: [3.4, 3.8, 4.2] category_id: 1 - long_name: TOA Brightess Temperature Segment mean at 3.80um (clear pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2222,14 +2218,14 @@ datasets: bt_mean_cloudy_ir38: name: bt_mean_cloudy_ir38 + long_name: TOA Brightess Temperature Segment mean at 3.80um (cloudy pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 0 + wavelength: [3.4, 3.8, 4.2] category_id: 2 - long_name: TOA Brightess Temperature Segment mean at 3.80um (cloudy pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2237,14 +2233,14 @@ datasets: bt_mean_all_wv63: name: bt_mean_all_wv63 + long_name: TOA Brightess Temperature Segment mean at 6.30um (all pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 1 + wavelength: [5.3, 6.3, 7.3] category_id: 0 - long_name: TOA Brightess Temperature Segment mean at 6.30um (all pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2252,14 +2248,14 @@ datasets: bt_mean_clear_wv63: name: bt_mean_clear_wv63 + long_name: TOA Brightess Temperature Segment mean at 6.30um (clear pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 1 + wavelength: [5.3, 6.3, 7.3] category_id: 1 - long_name: TOA Brightess Temperature Segment mean at 6.30um (clear pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2267,14 +2263,14 @@ datasets: bt_mean_cloudy_wv63: name: bt_mean_cloudy_wv63 + long_name: TOA Brightess Temperature Segment mean at 6.30um (cloudy pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 1 + wavelength: [5.3, 6.3, 7.3] category_id: 2 - long_name: TOA Brightess Temperature Segment mean at 6.30um (cloudy pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2282,14 +2278,14 @@ datasets: bt_mean_all_wv73: name: bt_mean_all_wv73 + long_name: TOA Brightess Temperature Segment mean at 7.35um (all pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 2 + wavelength: [6.85, 7.35, 7.85] category_id: 0 - long_name: TOA Brightess Temperature Segment mean at 7.35um (all pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2297,14 +2293,14 @@ datasets: bt_mean_clear_wv73: name: bt_mean_clear_wv73 + long_name: TOA Brightess Temperature Segment mean at 7.35um (clear pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 2 + wavelength: [6.85, 7.35, 7.85] category_id: 1 - long_name: TOA Brightess Temperature Segment mean at 7.35um (clear pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2312,14 +2308,14 @@ datasets: bt_mean_cloudy_wv73: name: bt_mean_cloudy_wv73 + long_name: TOA Brightess Temperature Segment mean at 7.35um (cloudy pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 2 + wavelength: [6.85, 7.35, 7.85] category_id: 2 - long_name: TOA Brightess Temperature Segment mean at 7.35um (cloudy pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2327,14 +2323,14 @@ datasets: bt_mean_all_ir87: name: bt_mean_all_ir87 + long_name: TOA Brightess Temperature Segment mean at 8.70um (all pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 3 + wavelength: [8.3, 8.7, 9.1] category_id: 0 - long_name: TOA Brightess Temperature Segment mean at 8.70um (all pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2342,14 +2338,14 @@ datasets: bt_mean_clear_ir87: name: bt_mean_clear_ir87 + long_name: TOA Brightess Temperature Segment mean at 8.70um (clear pixels) + standard_name: toa_brightess_temperature resolution: 32000 - wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: bt_mean ir_channel_id: 3 + wavelength: [8.3, 8.7, 9.1] category_id: 1 - long_name: TOA Brightess Temperature Segment mean at 8.70um (clear pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2357,194 +2353,914 @@ datasets: bt_mean_cloudy_ir87: name: bt_mean_cloudy_ir87 + long_name: TOA Brightess Temperature Segment mean at 8.70um (cloudy pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 3 + wavelength: [8.3, 8.7, 9.1] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_all_ir97: + name: bt_mean_all_ir97 + long_name: TOA Brightess Temperature Segment mean at 9.66um (all pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 4 + wavelength: [9.36, 9.66, 9.96] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_clear_ir97: + name: bt_mean_clear_ir97 + long_name: TOA Brightess Temperature Segment mean at 9.66um (clear pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 4 + wavelength: [9.36, 9.66, 9.96] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_cloudy_ir97: + name: bt_mean_cloudy_ir97 + long_name: TOA Brightess Temperature Segment mean at 9.66um (cloudy pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 4 + wavelength: [9.36, 9.66, 9.96] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_all_ir105: + name: bt_mean_all_ir105 + long_name: TOA Brightess Temperature Segment mean at 10.50um (all pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 5 + wavelength: [9.8, 10.5, 11.2] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_clear_ir105: + name: bt_mean_clear_ir105 + long_name: TOA Brightess Temperature Segment mean at 10.50um (clear pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 5 + wavelength: [9.8, 10.5, 11.2] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_cloudy_ir105: + name: bt_mean_cloudy_ir105 + long_name: TOA Brightess Temperature Segment mean at 10.50um (cloudy pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 5 + wavelength: [9.8, 10.5, 11.2] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_all_ir123: + name: bt_mean_all_ir123 + long_name: TOA Brightess Temperature Segment mean at 12.30um (all pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 6 + wavelength: [11.8, 12.3, 12.8] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_clear_ir123: + name: bt_mean_clear_ir123 + long_name: TOA Brightess Temperature Segment mean at 12.30um (clear pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 6 + wavelength: [11.8, 12.3, 12.8] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_cloudy_ir123: + name: bt_mean_cloudy_ir123 + long_name: TOA Brightess Temperature Segment mean at 12.30um (cloudy pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 6 + wavelength: [11.8, 12.3, 12.8] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_all_ir133: + name: bt_mean_all_ir133 + long_name: TOA Brightess Temperature Segment mean at 13.30um (all pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 7 + wavelength: [12.7, 13.3, 13.9] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_clear_ir133: + name: bt_mean_clear_ir133 + long_name: TOA Brightess Temperature Segment mean at 13.30um (clear pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 7 + wavelength: [12.7, 13.3, 13.9] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + bt_mean_cloudy_ir133: + name: bt_mean_cloudy_ir133 + long_name: TOA Brightess Temperature Segment mean at 13.30um (cloudy pixels) + standard_name: toa_brightess_temperature + resolution: 32000 + file_type: nc_fci_asr + file_key: bt_mean + ir_channel_id: 7 + wavelength: [12.7, 13.3, 13.9] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_vis04: + name: radiance_mean_all_vis04 + long_name: TOA Radiance Segment mean at 0.44um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 0 + wavelength: [0.384, 0.444, 0.504] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_vis04: + name: radiance_mean_clear_vis04 + long_name: TOA Radiance Segment mean at 0.44um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 0 + wavelength: [0.384, 0.444, 0.504] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_vis04: + name: radiance_mean_cloudy_vis04 + long_name: TOA Radiance Segment mean at 0.44um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 0 + wavelength: [0.384, 0.444, 0.504] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_vis05: + name: radiance_mean_all_vis05 + long_name: TOA Radiance Segment mean at 0.51um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 1 + wavelength: [0.47, 0.51, 0.55] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_vis05: + name: radiance_mean_clear_vis05 + long_name: TOA Radiance Segment mean at 0.51um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 1 + wavelength: [0.47, 0.51, 0.55] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_vis05: + name: radiance_mean_cloudy_vis05 + long_name: TOA Radiance Segment mean at 0.51um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 1 + wavelength: [0.47, 0.51, 0.55] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_vis06: + name: radiance_mean_all_vis06 + long_name: TOA Radiance Segment mean at 0.64um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 2 + wavelength: [0.59, 0.64, 0.69] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_vis06: + name: radiance_mean_clear_vis06 + long_name: TOA Radiance Segment mean at 0.64um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 2 + wavelength: [0.59, 0.64, 0.69] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_vis06: + name: radiance_mean_cloudy_vis06 + long_name: TOA Radiance Segment mean at 0.64um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 2 + wavelength: [0.59, 0.64, 0.69] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_vis08: + name: radiance_mean_all_vis08 + long_name: TOA Radiance Segment mean at 0.86um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 3 + wavelength: [0.815, 0.865, 0.915] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_vis08: + name: radiance_mean_clear_vis08 + long_name: TOA Radiance Segment mean at 0.86um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 3 + wavelength: [0.815, 0.865, 0.915] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_vis08: + name: radiance_mean_cloudy_vis08 + long_name: TOA Radiance Segment mean at 0.86um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 3 + wavelength: [0.815, 0.865, 0.915] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_vis09: + name: radiance_mean_all_vis09 + long_name: TOA Radiance Segment mean at 0.91um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 4 + wavelength: [0.894, 0.914, 0.934] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_vis09: + name: radiance_mean_clear_vis09 + long_name: TOA Radiance Segment mean at 0.91um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 4 + wavelength: [0.894, 0.914, 0.934] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_vis09: + name: radiance_mean_cloudy_vis09 + long_name: TOA Radiance Segment mean at 0.91um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 4 + wavelength: [0.894, 0.914, 0.934] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_nir13: + name: radiance_mean_all_nir13 + long_name: TOA Radiance Segment mean at 1.38um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 5 + wavelength: [1.35, 1.38, 1.41] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_nir13: + name: radiance_mean_clear_nir13 + long_name: TOA Radiance Segment mean at 1.38um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 5 + wavelength: [1.35, 1.38, 1.41] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_nir13: + name: radiance_mean_cloudy_nir13 + long_name: TOA Radiance Segment mean at 1.38um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 5 + wavelength: [1.35, 1.38, 1.41] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_nir16: + name: radiance_mean_all_nir16 + long_name: TOA Radiance Segment mean at 1.61um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 6 + wavelength: [1.56, 1.61, 1.66] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_nir16: + name: radiance_mean_clear_nir16 + long_name: TOA Radiance Segment mean at 1.61um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 6 + wavelength: [1.56, 1.61, 1.66] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_nir16: + name: radiance_mean_cloudy_nir16 + long_name: TOA Radiance Segment mean at 1.61um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 6 + wavelength: [1.56, 1.61, 1.66] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_nir22: + name: radiance_mean_all_nir22 + long_name: TOA Radiance Segment mean at 2.25um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 7 + wavelength: [2.2, 2.25, 2.3] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_nir22: + name: radiance_mean_clear_nir22 + long_name: TOA Radiance Segment mean at 2.25um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 7 + wavelength: [2.2, 2.25, 2.3] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_nir22: + name: radiance_mean_cloudy_nir22 + long_name: TOA Radiance Segment mean at 2.25um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 7 + wavelength: [2.2, 2.25, 2.3] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_ir38: + name: radiance_mean_all_ir38 + long_name: TOA Radiance Segment mean at 3.80um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 8 + wavelength: [3.4, 3.8, 4.2] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_ir38: + name: radiance_mean_clear_ir38 + long_name: TOA Radiance Segment mean at 3.80um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 8 + wavelength: [3.4, 3.8, 4.2] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_ir38: + name: radiance_mean_cloudy_ir38 + long_name: TOA Radiance Segment mean at 3.80um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 8 + wavelength: [3.4, 3.8, 4.2] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_wv63: + name: radiance_mean_all_wv63 + long_name: TOA Radiance Segment mean at 6.30um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 9 + wavelength: [5.3, 6.3, 7.3] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_wv63: + name: radiance_mean_clear_wv63 + long_name: TOA Radiance Segment mean at 6.30um (clear pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 3 + file_key: radiance_mean + channel_id: 9 + wavelength: [5.3, 6.3, 7.3] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_wv63: + name: radiance_mean_cloudy_wv63 + long_name: TOA Radiance Segment mean at 6.30um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 9 + wavelength: [5.3, 6.3, 7.3] category_id: 2 - long_name: TOA Brightess Temperature Segment mean at 8.70um (cloudy pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir97: - name: bt_mean_all_ir97 + radiance_mean_all_wv73: + name: radiance_mean_all_wv73 + long_name: TOA Radiance Segment mean at 7.35um (all pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 4 + file_key: radiance_mean + channel_id: 10 + wavelength: [6.85, 7.35, 7.85] category_id: 0 - long_name: TOA Brightess Temperature Segment mean at 9.66um (all pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir97: - name: bt_mean_clear_ir97 + radiance_mean_clear_wv73: + name: radiance_mean_clear_wv73 + long_name: TOA Radiance Segment mean at 7.35um (clear pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 4 + file_key: radiance_mean + channel_id: 10 + wavelength: [6.85, 7.35, 7.85] category_id: 1 - long_name: TOA Brightess Temperature Segment mean at 9.66um (clear pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir97: - name: bt_mean_cloudy_ir97 + radiance_mean_cloudy_wv73: + name: radiance_mean_cloudy_wv73 + long_name: TOA Radiance Segment mean at 7.35um (cloudy pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 4 + file_key: radiance_mean + channel_id: 10 + wavelength: [6.85, 7.35, 7.85] category_id: 2 - long_name: TOA Brightess Temperature Segment mean at 9.66um (cloudy pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir105: - name: bt_mean_all_ir105 + radiance_mean_all_ir87: + name: radiance_mean_all_ir87 + long_name: TOA Radiance Segment mean at 8.70um (all pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 5 + file_key: radiance_mean + channel_id: 11 + wavelength: [8.3, 8.7, 9.1] category_id: 0 - long_name: TOA Brightess Temperature Segment mean at 10.50um (all pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir105: - name: bt_mean_clear_ir105 + radiance_mean_clear_ir87: + name: radiance_mean_clear_ir87 + long_name: TOA Radiance Segment mean at 8.70um (clear pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 5 + file_key: radiance_mean + channel_id: 11 + wavelength: [8.3, 8.7, 9.1] category_id: 1 - long_name: TOA Brightess Temperature Segment mean at 10.50um (clear pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir105: - name: bt_mean_cloudy_ir105 + radiance_mean_cloudy_ir87: + name: radiance_mean_cloudy_ir87 + long_name: TOA Radiance Segment mean at 8.70um (cloudy pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 5 + file_key: radiance_mean + channel_id: 11 + wavelength: [8.3, 8.7, 9.1] category_id: 2 - long_name: TOA Brightess Temperature Segment mean at 10.50um (cloudy pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir123: - name: bt_mean_all_ir123 + radiance_mean_all_ir97: + name: radiance_mean_all_ir97 + long_name: TOA Radiance Segment mean at 9.66um (all pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 6 + file_key: radiance_mean + channel_id: 12 + wavelength: [9.36, 9.66, 9.96] category_id: 0 - long_name: TOA Brightess Temperature Segment mean at 12.30um (all pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir123: - name: bt_mean_clear_ir123 + radiance_mean_clear_ir97: + name: radiance_mean_clear_ir97 + long_name: TOA Radiance Segment mean at 9.66um (clear pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 6 + file_key: radiance_mean + channel_id: 12 + wavelength: [9.36, 9.66, 9.96] category_id: 1 - long_name: TOA Brightess Temperature Segment mean at 12.30um (clear pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir123: - name: bt_mean_cloudy_ir123 + radiance_mean_cloudy_ir97: + name: radiance_mean_cloudy_ir97 + long_name: TOA Radiance Segment mean at 9.66um (cloudy pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 6 + file_key: radiance_mean + channel_id: 12 + wavelength: [9.36, 9.66, 9.96] category_id: 2 - long_name: TOA Brightess Temperature Segment mean at 12.30um (cloudy pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_all_ir133: - name: bt_mean_all_ir133 + radiance_mean_all_ir105: + name: radiance_mean_all_ir105 + long_name: TOA Radiance Segment mean at 10.50um (all pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 7 + file_key: radiance_mean + channel_id: 13 + wavelength: [9.8, 10.5, 11.2] category_id: 0 - long_name: TOA Brightess Temperature Segment mean at 13.30um (all pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_clear_ir133: - name: bt_mean_clear_ir133 + radiance_mean_clear_ir105: + name: radiance_mean_clear_ir105 + long_name: TOA Radiance Segment mean at 10.50um (clear pixels) + standard_name: toa_outgoing_radiance resolution: 32000 - wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 7 + file_key: radiance_mean + channel_id: 13 + wavelength: [9.8, 10.5, 11.2] category_id: 1 - long_name: TOA Brightess Temperature Segment mean at 13.30um (clear pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude - latitude - bt_mean_cloudy_ir133: - name: bt_mean_cloudy_ir133 + radiance_mean_cloudy_ir105: + name: radiance_mean_cloudy_ir105 + long_name: TOA Radiance Segment mean at 10.50um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 13 + wavelength: [9.8, 10.5, 11.2] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_ir123: + name: radiance_mean_all_ir123 + long_name: TOA Radiance Segment mean at 12.30um (all pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 14 + wavelength: [11.8, 12.3, 12.8] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_ir123: + name: radiance_mean_clear_ir123 + long_name: TOA Radiance Segment mean at 12.30um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 14 + wavelength: [11.8, 12.3, 12.8] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_ir123: + name: radiance_mean_cloudy_ir123 + long_name: TOA Radiance Segment mean at 12.30um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 14 + wavelength: [11.8, 12.3, 12.8] + category_id: 2 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_all_ir133: + name: radiance_mean_all_ir133 + long_name: TOA Radiance Segment mean at 13.30um (all pixels) + standard_name: toa_outgoing_radiance resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 15 wavelength: [12.7, 13.3, 13.9] + category_id: 0 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_clear_ir133: + name: radiance_mean_clear_ir133 + long_name: TOA Radiance Segment mean at 13.30um (clear pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean - ir_channel_id: 7 + file_key: radiance_mean + channel_id: 15 + wavelength: [12.7, 13.3, 13.9] + category_id: 1 + cell_method: area:mean + coordinates: + - longitude + - latitude + + radiance_mean_cloudy_ir133: + name: radiance_mean_cloudy_ir133 + long_name: TOA Radiance Segment mean at 13.30um (cloudy pixels) + standard_name: toa_outgoing_radiance + resolution: 32000 + file_type: nc_fci_asr + file_key: radiance_mean + channel_id: 15 + wavelength: [12.7, 13.3, 13.9] category_id: 2 - long_name: TOA Brightess Temperature Segment mean at 13.30um (cloudy pixels) - standard_name: toa_brightess_temperature cell_method: area:mean coordinates: - longitude @@ -2552,15 +3268,15 @@ datasets: quality_reflectance_all_vis04: name: quality_reflectance_all_vis04 + long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (all pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 0 + wavelength: [0.384, 0.444, 0.504] category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (all pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2568,15 +3284,15 @@ datasets: quality_reflectance_clear_vis04: name: quality_reflectance_clear_vis04 + long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (clear pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 0 + wavelength: [0.384, 0.444, 0.504] category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (clear pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2584,15 +3300,15 @@ datasets: quality_reflectance_cloudy_vis04: name: quality_reflectance_cloudy_vis04 + long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (cloudy pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 0 + wavelength: [0.384, 0.444, 0.504] category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (cloudy pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2600,15 +3316,15 @@ datasets: quality_reflectance_all_vis05: name: quality_reflectance_all_vis05 + long_name: TOA Bidirectional Reflectance % Confidence at 0.51um (all pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 1 + wavelength: [0.47, 0.51, 0.55] category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.51um (all pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2616,15 +3332,15 @@ datasets: quality_reflectance_clear_vis05: name: quality_reflectance_clear_vis05 + long_name: TOA Bidirectional Reflectance % Confidence at 0.51um (clear pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 1 + wavelength: [0.47, 0.51, 0.55] category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.51um (clear pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2632,15 +3348,15 @@ datasets: quality_reflectance_cloudy_vis05: name: quality_reflectance_cloudy_vis05 + long_name: TOA Bidirectional Reflectance % Confidence at 0.51um (cloudy pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 1 + wavelength: [0.47, 0.51, 0.55] category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.51um (cloudy pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2648,15 +3364,15 @@ datasets: quality_reflectance_all_vis06: name: quality_reflectance_all_vis06 + long_name: TOA Bidirectional Reflectance % Confidence at 0.64um (all pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 2 + wavelength: [0.59, 0.64, 0.69] category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.64um (all pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2664,15 +3380,15 @@ datasets: quality_reflectance_clear_vis06: name: quality_reflectance_clear_vis06 + long_name: TOA Bidirectional Reflectance % Confidence at 0.64um (clear pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 2 + wavelength: [0.59, 0.64, 0.69] category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.64um (clear pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2680,15 +3396,15 @@ datasets: quality_reflectance_cloudy_vis06: name: quality_reflectance_cloudy_vis06 + long_name: TOA Bidirectional Reflectance % Confidence at 0.64um (cloudy pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 2 + wavelength: [0.59, 0.64, 0.69] category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.64um (cloudy pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2696,15 +3412,15 @@ datasets: quality_reflectance_all_vis08: name: quality_reflectance_all_vis08 + long_name: TOA Bidirectional Reflectance % Confidence at 0.86um (all pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 3 + wavelength: [0.815, 0.865, 0.915] category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.86um (all pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2712,15 +3428,15 @@ datasets: quality_reflectance_clear_vis08: name: quality_reflectance_clear_vis08 + long_name: TOA Bidirectional Reflectance % Confidence at 0.86um (clear pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 3 + wavelength: [0.815, 0.865, 0.915] category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.86um (clear pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2728,15 +3444,15 @@ datasets: quality_reflectance_cloudy_vis08: name: quality_reflectance_cloudy_vis08 + long_name: TOA Bidirectional Reflectance % Confidence at 0.86um (cloudy pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 3 + wavelength: [0.815, 0.865, 0.915] category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.86um (cloudy pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2744,15 +3460,15 @@ datasets: quality_reflectance_all_vis09: name: quality_reflectance_all_vis09 + long_name: TOA Bidirectional Reflectance % Confidence at 0.91um (all pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 4 + wavelength: [0.894, 0.914, 0.934] category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.91um (all pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2760,15 +3476,15 @@ datasets: quality_reflectance_clear_vis09: name: quality_reflectance_clear_vis09 + long_name: TOA Bidirectional Reflectance % Confidence at 0.91um (clear pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 4 + wavelength: [0.894, 0.914, 0.934] category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.91um (clear pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2776,15 +3492,15 @@ datasets: quality_reflectance_cloudy_vis09: name: quality_reflectance_cloudy_vis09 + long_name: TOA Bidirectional Reflectance % Confidence at 0.91um (cloudy pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 4 + wavelength: [0.894, 0.914, 0.934] category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 0.91um (cloudy pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2792,15 +3508,15 @@ datasets: quality_reflectance_all_nir13: name: quality_reflectance_all_nir13 + long_name: TOA Bidirectional Reflectance % Confidence at 1.38um (all pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 5 + wavelength: [1.35, 1.38, 1.41] category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 1.38um (all pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2808,15 +3524,15 @@ datasets: quality_reflectance_clear_nir13: name: quality_reflectance_clear_nir13 + long_name: TOA Bidirectional Reflectance % Confidence at 1.38um (clear pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 5 + wavelength: [1.35, 1.38, 1.41] category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 1.38um (clear pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2824,15 +3540,15 @@ datasets: quality_reflectance_cloudy_nir13: name: quality_reflectance_cloudy_nir13 + long_name: TOA Bidirectional Reflectance % Confidence at 1.38um (cloudy pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 5 + wavelength: [1.35, 1.38, 1.41] category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 1.38um (cloudy pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2840,15 +3556,15 @@ datasets: quality_reflectance_all_nir16: name: quality_reflectance_all_nir16 + long_name: TOA Bidirectional Reflectance % Confidence at 1.61um (all pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 6 + wavelength: [1.56, 1.61, 1.66] category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 1.61um (all pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2856,15 +3572,15 @@ datasets: quality_reflectance_clear_nir16: name: quality_reflectance_clear_nir16 + long_name: TOA Bidirectional Reflectance % Confidence at 1.61um (clear pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 6 + wavelength: [1.56, 1.61, 1.66] category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 1.61um (clear pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2872,15 +3588,15 @@ datasets: quality_reflectance_cloudy_nir16: name: quality_reflectance_cloudy_nir16 + long_name: TOA Bidirectional Reflectance % Confidence at 1.61um (cloudy pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 6 + wavelength: [1.56, 1.61, 1.66] category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 1.61um (cloudy pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2888,15 +3604,15 @@ datasets: quality_reflectance_all_nir22: name: quality_reflectance_all_nir22 + long_name: TOA Bidirectional Reflectance % Confidence at 2.25um (all pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 7 + wavelength: [2.2, 2.25, 2.3] category_id: 0 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 2.25um (all pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2904,15 +3620,15 @@ datasets: quality_reflectance_clear_nir22: name: quality_reflectance_clear_nir22 + long_name: TOA Bidirectional Reflectance % Confidence at 2.25um (clear pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 7 + wavelength: [2.2, 2.25, 2.3] category_id: 1 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 2.25um (clear pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2920,15 +3636,15 @@ datasets: quality_reflectance_cloudy_nir22: name: quality_reflectance_cloudy_nir22 + long_name: TOA Bidirectional Reflectance % Confidence at 2.25um (cloudy pixels) + standard_name: reflectance_quality resolution: 32000 - wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_asr file_key: quality_reflectance vis_channel_id: 7 + wavelength: [2.2, 2.25, 2.3] category_id: 2 fill_value: -1 - long_name: TOA Bidirectional Reflectance % Confidence at 2.25um (cloudy pixels) - standard_name: reflectance_quality units: '%' coordinates: - longitude @@ -2936,15 +3652,15 @@ datasets: quality_bt_all_ir38: name: quality_bt_all_ir38 + long_name: TOA Brightess Temperature % Confidence at 3.80um (all pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 0 + wavelength: [3.4, 3.8, 4.2] category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 3.80um (all pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -2952,15 +3668,15 @@ datasets: quality_bt_clear_ir38: name: quality_bt_clear_ir38 + long_name: TOA Brightess Temperature % Confidence at 3.80um (clear pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 0 + wavelength: [3.4, 3.8, 4.2] category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 3.80um (clear pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -2968,15 +3684,15 @@ datasets: quality_bt_cloudy_ir38: name: quality_bt_cloudy_ir38 + long_name: TOA Brightess Temperature % Confidence at 3.80um (cloudy pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [3.4, 3.8, 4.2] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 0 + wavelength: [3.4, 3.8, 4.2] category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 3.80um (cloudy pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -2984,15 +3700,15 @@ datasets: quality_bt_all_wv63: name: quality_bt_all_wv63 + long_name: TOA Brightess Temperature % Confidence at 6.30um (all pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 1 + wavelength: [5.3, 6.3, 7.3] category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 6.30um (all pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3000,15 +3716,15 @@ datasets: quality_bt_clear_wv63: name: quality_bt_clear_wv63 + long_name: TOA Brightess Temperature % Confidence at 6.30um (clear pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 1 + wavelength: [5.3, 6.3, 7.3] category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 6.30um (clear pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3016,15 +3732,15 @@ datasets: quality_bt_cloudy_wv63: name: quality_bt_cloudy_wv63 + long_name: TOA Brightess Temperature % Confidence at 6.30um (cloudy pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [5.3, 6.3, 7.3] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 1 + wavelength: [5.3, 6.3, 7.3] category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 6.30um (cloudy pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3032,15 +3748,15 @@ datasets: quality_bt_all_wv73: name: quality_bt_all_wv73 + long_name: TOA Brightess Temperature % Confidence at 7.35um (all pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 2 + wavelength: [6.85, 7.35, 7.85] category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 7.35um (all pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3048,15 +3764,15 @@ datasets: quality_bt_clear_wv73: name: quality_bt_clear_wv73 + long_name: TOA Brightess Temperature % Confidence at 7.35um (clear pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 2 + wavelength: [6.85, 7.35, 7.85] category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 7.35um (clear pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3064,15 +3780,15 @@ datasets: quality_bt_cloudy_wv73: name: quality_bt_cloudy_wv73 + long_name: TOA Brightess Temperature % Confidence at 7.35um (cloudy pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [6.85, 7.35, 7.85] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 2 + wavelength: [6.85, 7.35, 7.85] category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 7.35um (cloudy pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3080,15 +3796,15 @@ datasets: quality_bt_all_ir87: name: quality_bt_all_ir87 + long_name: TOA Brightess Temperature % Confidence at 8.70um (all pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 3 + wavelength: [8.3, 8.7, 9.1] category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 8.70um (all pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3096,15 +3812,15 @@ datasets: quality_bt_clear_ir87: name: quality_bt_clear_ir87 + long_name: TOA Brightess Temperature % Confidence at 8.70um (clear pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 3 + wavelength: [8.3, 8.7, 9.1] category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 8.70um (clear pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3112,15 +3828,15 @@ datasets: quality_bt_cloudy_ir87: name: quality_bt_cloudy_ir87 + long_name: TOA Brightess Temperature % Confidence at 8.70um (cloudy pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [8.3, 8.7, 9.1] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 3 + wavelength: [8.3, 8.7, 9.1] category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 8.70um (cloudy pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3128,15 +3844,15 @@ datasets: quality_bt_all_ir97: name: quality_bt_all_ir97 + long_name: TOA Brightess Temperature % Confidence at 9.66um (all pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 4 + wavelength: [9.36, 9.66, 9.96] category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 9.66um (all pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3144,15 +3860,15 @@ datasets: quality_bt_clear_ir97: name: quality_bt_clear_ir97 + long_name: TOA Brightess Temperature % Confidence at 9.66um (clear pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 4 + wavelength: [9.36, 9.66, 9.96] category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 9.66um (clear pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3160,15 +3876,15 @@ datasets: quality_bt_cloudy_ir97: name: quality_bt_cloudy_ir97 + long_name: TOA Brightess Temperature % Confidence at 9.66um (cloudy pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [9.36, 9.66, 9.96] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 4 + wavelength: [9.36, 9.66, 9.96] category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 9.66um (cloudy pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3176,15 +3892,15 @@ datasets: quality_bt_all_ir105: name: quality_bt_all_ir105 + long_name: TOA Brightess Temperature % Confidence at 10.50um (all pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 5 + wavelength: [9.8, 10.5, 11.2] category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 10.50um (all pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3192,15 +3908,15 @@ datasets: quality_bt_clear_ir105: name: quality_bt_clear_ir105 + long_name: TOA Brightess Temperature % Confidence at 10.50um (clear pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 5 + wavelength: [9.8, 10.5, 11.2] category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 10.50um (clear pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3208,15 +3924,15 @@ datasets: quality_bt_cloudy_ir105: name: quality_bt_cloudy_ir105 + long_name: TOA Brightess Temperature % Confidence at 10.50um (cloudy pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [9.8, 10.5, 11.2] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 5 + wavelength: [9.8, 10.5, 11.2] category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 10.50um (cloudy pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3224,15 +3940,15 @@ datasets: quality_bt_all_ir123: name: quality_bt_all_ir123 + long_name: TOA Brightess Temperature % Confidence at 12.30um (all pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 6 + wavelength: [11.8, 12.3, 12.8] category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 12.30um (all pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3240,15 +3956,15 @@ datasets: quality_bt_clear_ir123: name: quality_bt_clear_ir123 + long_name: TOA Brightess Temperature % Confidence at 12.30um (clear pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 6 + wavelength: [11.8, 12.3, 12.8] category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 12.30um (clear pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3256,15 +3972,15 @@ datasets: quality_bt_cloudy_ir123: name: quality_bt_cloudy_ir123 + long_name: TOA Brightess Temperature % Confidence at 12.30um (cloudy pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [11.8, 12.3, 12.8] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 6 + wavelength: [11.8, 12.3, 12.8] category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 12.30um (cloudy pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3272,15 +3988,15 @@ datasets: quality_bt_all_ir133: name: quality_bt_all_ir133 + long_name: TOA Brightess Temperature % Confidence at 13.30um (all pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 7 + wavelength: [12.7, 13.3, 13.9] category_id: 0 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 13.30um (all pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3288,15 +4004,15 @@ datasets: quality_bt_clear_ir133: name: quality_bt_clear_ir133 + long_name: TOA Brightess Temperature % Confidence at 13.30um (clear pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 7 + wavelength: [12.7, 13.3, 13.9] category_id: 1 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 13.30um (clear pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3304,15 +4020,15 @@ datasets: quality_bt_cloudy_ir133: name: quality_bt_cloudy_ir133 + long_name: TOA Brightess Temperature % Confidence at 13.30um (cloudy pixels) + standard_name: brightness_temperature_quality resolution: 32000 - wavelength: [12.7, 13.3, 13.9] file_type: nc_fci_asr file_key: quality_bt ir_channel_id: 7 + wavelength: [12.7, 13.3, 13.9] category_id: 2 fill_value: -1 - long_name: TOA Brightess Temperature % Confidence at 13.30um (cloudy pixels) - standard_name: brightness_temperature_quality units: '%' coordinates: - longitude @@ -3320,11 +4036,11 @@ datasets: pixel_percentage_all: name: pixel_percentage_all + long_name: Percentage of FoR pixels used (all pixels) + standard_name: pixels_used_fraction resolution: 32000 file_type: nc_fci_asr file_key: pixel_percentage - long_name: Percentage of FoR pixels used (all pixels) - standard_name: pixels_used_fraction category_id: 0 units: '%' coordinates: @@ -3333,11 +4049,11 @@ datasets: pixel_percentage_clear: name: pixel_percentage_clear + long_name: Percentage of FoR pixels used (clear pixels) + standard_name: pixels_used_fraction resolution: 32000 file_type: nc_fci_asr file_key: pixel_percentage - long_name: Percentage of FoR pixels used (clear pixels) - standard_name: pixels_used_fraction category_id: 1 units: '%' coordinates: @@ -3346,11 +4062,11 @@ datasets: pixel_percentage_cloudy: name: pixel_percentage_cloudy + long_name: Percentage of FoR pixels used (cloudy pixels) + standard_name: pixels_used_fraction resolution: 32000 file_type: nc_fci_asr file_key: pixel_percentage - long_name: Percentage of FoR pixels used (cloudy pixels) - standard_name: pixels_used_fraction category_id: 2 units: '%' coordinates: @@ -3359,18 +4075,18 @@ datasets: product_quality_asr: name: product_quality_asr + standard_name: product_quality file_type: nc_fci_asr file_key: product_quality - standard_name: product_quality product_completeness_asr: name: product_completeness_asr + standard_name: product_completeness file_type: nc_fci_asr file_key: product_completeness - standard_name: product_completeness product_timeliness_asr: name: product_timeliness_asr + standard_name: product_timeliness file_type: nc_fci_asr file_key: product_timeliness - standard_name: product_timeliness From 093921c8ca3bf070feb098a1f79ffd8e20bde30f Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 15 Jan 2024 16:54:32 +0100 Subject: [PATCH 119/481] changed file_key to nc_key --- satpy/etc/readers/fci_l2_nc.yaml | 678 ++++++++++----------- satpy/readers/fci_l2_nc.py | 18 +- satpy/tests/reader_tests/test_fci_l2_nc.py | 66 +- 3 files changed, 381 insertions(+), 381 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index dbf5db6a8a..daca83ada1 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -82,19 +82,19 @@ datasets: name: intm_latitude standard_name: latitude file_type: nc_fci_amvi - file_key: intm_latitude + nc_key: intm_latitude intm_longitude: name: intm_longitude standard_name: longitude file_type: nc_fci_amvi - file_key: intm_longitude + nc_key: intm_longitude intm_speed: name: intm_speed standard_name: wind_speed file_type: nc_fci_amvi - file_key: intm_speed + nc_key: intm_speed coordinates: - intm_longitude - intm_latitude @@ -103,7 +103,7 @@ datasets: name: intm_u_component standard_name: wind_speed_horizontal_component file_type: nc_fci_amvi - file_key: intm_u_component + nc_key: intm_u_component coordinates: - intm_longitude - intm_latitude @@ -112,7 +112,7 @@ datasets: name: intm_v_component standard_name: wind_speed_vertical_component file_type: nc_fci_amvi - file_key: intm_v_component + nc_key: intm_v_component coordinates: - intm_longitude - intm_latitude @@ -121,7 +121,7 @@ datasets: name: intm_direction standard_name: wind_to_direction file_type: nc_fci_amvi - file_key: intm_direction + nc_key: intm_direction coordinates: - intm_longitude - intm_latitude @@ -130,7 +130,7 @@ datasets: name: intm_pressure standard_name: wind_pressure file_type: nc_fci_amvi - file_key: intm_pressure + nc_key: intm_pressure coordinates: - intm_longitude - intm_latitude @@ -139,7 +139,7 @@ datasets: name: intm_temperature standard_name: wind_temperature file_type: nc_fci_amvi - file_key: intm_temperature + nc_key: intm_temperature coordinates: - intm_longitude - intm_latitude @@ -148,7 +148,7 @@ datasets: name: intm_target_type standard_name: wind_target_type file_type: nc_fci_amvi - file_key: target_type + nc_key: target_type coordinates: - intm_longitude - intm_latitude @@ -157,7 +157,7 @@ datasets: name: intm_wind_method standard_name: wind_wind_method file_type: nc_fci_amvi - file_key: wind_method + nc_key: wind_method coordinates: - intm_longitude - intm_latitude @@ -168,25 +168,25 @@ datasets: name: channel_id standard_name: channel_id file_type: nc_fci_amv - file_key: channel_id + nc_key: channel_id amv_latitude: name: latitude standard_name: latitude file_type: nc_fci_amv - file_key: latitude + nc_key: latitude amv_longitude: name: longitude standard_name: longitude file_type: nc_fci_amv - file_key: longitude + nc_key: longitude speed: name: speed standard_name: wind_speed file_type: nc_fci_amv - file_key: speed + nc_key: speed coordinates: - longitude - latitude @@ -195,7 +195,7 @@ datasets: name: speed_u_component standard_name: wind_speed_horizontal_component file_type: nc_fci_amv - file_key: speed_u_component + nc_key: speed_u_component coordinates: - longitude - latitude @@ -204,7 +204,7 @@ datasets: name: speed_v_component standard_name: wind_speed_vertical_component file_type: nc_fci_amv - file_key: speed_v_component + nc_key: speed_v_component coordinates: - longitude - latitude @@ -213,7 +213,7 @@ datasets: name: direction standard_name: wind_to_direction file_type: nc_fci_amv - file_key: direction + nc_key: direction coordinates: - longitude - latitude @@ -222,7 +222,7 @@ datasets: name: pressure standard_name: wind_pressure file_type: nc_fci_amv - file_key: pressure + nc_key: pressure coordinates: - longitude - latitude @@ -231,7 +231,7 @@ datasets: name: temperature standard_name: wind_temperature file_type: nc_fci_amv - file_key: temperature + nc_key: temperature coordinates: - longitude - latitude @@ -240,7 +240,7 @@ datasets: name: target_type standard_name: wind_target_type file_type: nc_fci_amv - file_key: target_type + nc_key: target_type coordinates: - longitude - latitude @@ -249,7 +249,7 @@ datasets: name: wind_method standard_name: wind_wind_method file_type: nc_fci_amv - file_key: wind_method + nc_key: wind_method coordinates: - longitude - latitude @@ -258,7 +258,7 @@ datasets: name: fcst_u standard_name: wind_forecast_u_component file_type: nc_fci_amv - file_key: forecast_u_component + nc_key: forecast_u_component coordinates: - longitude - latitude @@ -267,7 +267,7 @@ datasets: name: fcst_v standard_name: wind_forecast_v_component file_type: nc_fci_amv - file_key: forecast_v_component + nc_key: forecast_v_component coordinates: - longitude - latitude @@ -276,7 +276,7 @@ datasets: name: best_fit_pres standard_name: wind_best_fit_pressure file_type: nc_fci_amv - file_key: best_fit_pressure + nc_key: best_fit_pressure coordinates: - longitude - latitude @@ -285,7 +285,7 @@ datasets: name: best_fit_u standard_name: wind_best_fit_u_component file_type: nc_fci_amv - file_key: best_fit_u_component + nc_key: best_fit_u_component coordinates: - longitude - latitude @@ -294,7 +294,7 @@ datasets: name: best_fit_v standard_name: wind_best_fit_v_component file_type: nc_fci_amv - file_key: best_fit_v_component + nc_key: best_fit_v_component coordinates: - longitude - latitude @@ -303,7 +303,7 @@ datasets: name: qi standard_name: wind_overall_reliability file_type: nc_fci_amv - file_key: overall_reliability + nc_key: overall_reliability coordinates: - longitude - latitude @@ -312,7 +312,7 @@ datasets: name: qi_excl_fcst standard_name: wind_overall_reliability_exc_forecast file_type: nc_fci_amv - file_key: overall_reliability_exc_forecast + nc_key: overall_reliability_exc_forecast coordinates: - longitude - latitude @@ -321,19 +321,19 @@ datasets: name: product_quality standard_name: product_quality file_type: nc_fci_amv - file_key: product_quality + nc_key: product_quality product_completeness: name: product_completeness standard_name: product_completeness file_type: nc_fci_amv - file_key: product_completeness + nc_key: product_completeness product_timeliness: name: product_timeliness standard_name: product_timeliness file_type: nc_fci_amv - file_key: product_timeliness + nc_key: product_timeliness # CLM - Cloud Mask @@ -342,7 +342,7 @@ datasets: standard_name: cloud_mask_classification resolution: 2000 file_type: nc_fci_clm - file_key: cloud_state + nc_key: cloud_state fill_value: -127 import_enum_information: True @@ -351,7 +351,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_clm - file_key: quality_illumination + nc_key: quality_illumination fill_value: -127 import_enum_information: True @@ -360,7 +360,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_clm - file_key: quality_nwp_parameters + nc_key: quality_nwp_parameters fill_value: -127 import_enum_information: True @@ -369,7 +369,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_clm - file_key: quality_MTG_parameters + nc_key: quality_MTG_parameters fill_value: -127 import_enum_information: True @@ -378,7 +378,7 @@ datasets: standard_name: quality_flag resolution: 2000 file_type: nc_fci_clm - file_key: quality_overall_processing + nc_key: quality_overall_processing fill_value: -127 import_enum_information: True @@ -386,19 +386,19 @@ datasets: name: product_quality_clm standard_name: product_quality file_type: nc_fci_clm - file_key: product_quality + nc_key: product_quality product_completeness_clm: name: product_completeness_clm standard_name: product_completeness file_type: nc_fci_clm - file_key: product_completeness + nc_key: product_completeness product_timeliness_clm: name: product_timeliness_clm standard_name: product_timeliness file_type: nc_fci_clm - file_key: product_timeliness + nc_key: product_timeliness # CT - Cloud Type @@ -407,7 +407,7 @@ datasets: standard_name: cloud_phase_classification resolution: 2000 file_type: nc_fci_ct - file_key: cloud_phase + nc_key: cloud_phase fill_value: -127 import_enum_information: True @@ -416,7 +416,7 @@ datasets: standard_name: cloud_type_classification resolution: 2000 file_type: nc_fci_ct - file_key: cloud_type + nc_key: cloud_type fill_value: -127 import_enum_information: True @@ -425,7 +425,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_ct - file_key: quality_illumination + nc_key: quality_illumination fill_value: -127 import_enum_information: True @@ -434,7 +434,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_ct - file_key: quality_nwp_parameters + nc_key: quality_nwp_parameters fill_value: -127 import_enum_information: True @@ -443,7 +443,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_ct - file_key: quality_MTG_parameters + nc_key: quality_MTG_parameters fill_value: -127 import_enum_information: True @@ -452,7 +452,7 @@ datasets: standard_name: quality_flag resolution: 2000 file_type: nc_fci_ct - file_key: quality_overall_processing + nc_key: quality_overall_processing fill_value: -127 import_enum_information: True @@ -460,19 +460,19 @@ datasets: name: product_quality_ct standard_name: product_quality file_type: nc_fci_ct - file_key: product_quality + nc_key: product_quality product_completeness_ct: name: product_completeness_ct standard_name: product_completeness file_type: nc_fci_ct - file_key: product_completeness + nc_key: product_completeness product_timeliness_ct: name: product_timeliness_ct standard_name: product_timeliness file_type: nc_fci_ct - file_key: product_timeliness + nc_key: product_timeliness # CTTH - Cloud Top Temperature and Height @@ -481,42 +481,42 @@ datasets: standard_name: height_at_cloud_top_for_aviation resolution: 2000 file_type: nc_fci_ctth - file_key: cloud_top_aviation_height + nc_key: cloud_top_aviation_height cloud_top_height: name: cloud_top_height standard_name: height_at_cloud_top resolution: 2000 file_type: nc_fci_ctth - file_key: cloud_top_height + nc_key: cloud_top_height cloud_top_pressure: name: cloud_top_pressure standard_name: air_pressure_at_cloud_top resolution: 2000 file_type: nc_fci_ctth - file_key: cloud_top_pressure + nc_key: cloud_top_pressure cloud_top_temperature: name: cloud_top_temperature standard_name: air_temperature_at_cloud_top resolution: 2000 file_type: nc_fci_ctth - file_key: cloud_top_temperature + nc_key: cloud_top_temperature effective_cloudiness: name: effective_cloudiness standard_name: effective_cloud_cover resolution: 2000 file_type: nc_fci_ctth - file_key: effective_cloudiness + nc_key: effective_cloudiness quality_status_ctth: name: quality_status_ctth standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth - file_key: quality_status + nc_key: quality_status fill_value: -127 import_enum_information: True @@ -525,7 +525,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth - file_key: quality_rtm + nc_key: quality_rtm fill_value: -127 import_enum_information: True @@ -534,7 +534,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth - file_key: quality_method + nc_key: quality_method fill_value: -127 import_enum_information: True @@ -543,7 +543,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth - file_key: quality_nwp_parameters + nc_key: quality_nwp_parameters fill_value: -127 import_enum_information: True @@ -552,7 +552,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth - file_key: quality_MTG_parameters + nc_key: quality_MTG_parameters fill_value: -127 import_enum_information: True @@ -561,7 +561,7 @@ datasets: standard_name: quality_flag resolution: 2000 file_type: nc_fci_ctth - file_key: quality_overall_processing + nc_key: quality_overall_processing fill_value: -127 import_enum_information: True @@ -570,7 +570,7 @@ datasets: standard_name: quality_flag resolution: 2000 file_type: nc_fci_ctth - file_key: quality_overall_processing_aviation + nc_key: quality_overall_processing_aviation fill_value: -127 import_enum_information: True @@ -578,19 +578,19 @@ datasets: name: product_quality_ctth standard_name: product_quality file_type: nc_fci_ctth - file_key: product_quality + nc_key: product_quality product_completeness_ctth: name: product_completeness_ctth standard_name: product_completeness file_type: nc_fci_ctth - file_key: product_completeness + nc_key: product_completeness product_timeliness_ctth: name: product_timeliness_ctth standard_name: product_timeliness file_type: nc_fci_ctth - file_key: product_timeliness + nc_key: product_timeliness # FIR - Active Fire Monitoring @@ -599,14 +599,14 @@ datasets: standard_name: fire_probability resolution: 2000 file_type: nc_fci_fir - file_key: fire_probability + nc_key: fire_probability fire_result: name: fire_result standard_name: active_fire_classification resolution: 2000 file_type: nc_fci_fir - file_key: fire_result + nc_key: fire_result fill_value: -127 import_enum_information: True @@ -614,19 +614,19 @@ datasets: name: product_quality_fir standard_name: product_quality file_type: nc_fci_fir - file_key: product_quality + nc_key: product_quality product_completeness_fir: name: product_completeness_fir standard_name: product_completeness file_type: nc_fci_fir - file_key: product_completeness + nc_key: product_completeness product_timeliness_fir: name: product_timeliness_fir standard_name: product_timeliness file_type: nc_fci_fir - file_key: product_timeliness + nc_key: product_timeliness # GII - Global Instability Index @@ -635,7 +635,7 @@ datasets: standard_name: atmosphere_stability_k_index resolution: 6000 file_type: nc_fci_gii - file_key: k_index + nc_key: k_index coordinates: - longitude - latitude @@ -645,7 +645,7 @@ datasets: standard_name: atmosphere_stability_lifted_index resolution: 6000 file_type: nc_fci_gii - file_key: lifted_index + nc_key: lifted_index coordinates: - longitude - latitude @@ -655,7 +655,7 @@ datasets: standard_name: atmosphere_mass_content_of_water_vapor resolution: 6000 file_type: nc_fci_gii - file_key: prec_water_high + nc_key: prec_water_high coordinates: - longitude - latitude @@ -665,7 +665,7 @@ datasets: standard_name: atmosphere_mass_content_of_water_vapor resolution: 6000 file_type: nc_fci_gii - file_key: prec_water_low + nc_key: prec_water_low coordinates: - longitude - latitude @@ -675,7 +675,7 @@ datasets: standard_name: atmosphere_mass_content_of_water_vapor resolution: 6000 file_type: nc_fci_gii - file_key: prec_water_mid + nc_key: prec_water_mid coordinates: - longitude - latitude @@ -685,7 +685,7 @@ datasets: standard_name: atmosphere_mass_content_of_water_vapor resolution: 6000 file_type: nc_fci_gii - file_key: prec_water_total + nc_key: prec_water_total coordinates: - longitude - latitude @@ -696,7 +696,7 @@ datasets: standard_name: cloud_free_area_fraction resolution: 6000 file_type: nc_fci_gii - file_key: percent_cloud_free + nc_key: percent_cloud_free units: '%' coordinates: - longitude @@ -707,7 +707,7 @@ datasets: standard_name: number_of_iterations resolution: 6000 file_type: nc_fci_gii - file_key: number_of_iterations + nc_key: number_of_iterations coordinates: - longitude - latitude @@ -716,19 +716,19 @@ datasets: name: product_quality_gii standard_name: product_quality file_type: nc_fci_gii - file_key: product_quality + nc_key: product_quality product_completeness_gii: name: product_completeness_gii standard_name: product_completeness file_type: nc_fci_gii - file_key: product_completeness + nc_key: product_completeness product_timeliness_gii: name: product_timeliness_gii standard_name: product_timeliness file_type: nc_fci_gii - file_key: product_timeliness + nc_key: product_timeliness # OCA - Optimal Cloud Analysis @@ -737,7 +737,7 @@ datasets: standard_name: thermodynamic_phase_of_cloud_particles_classification resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_phase + nc_key: retrieved_cloud_phase fill_value: -127 import_enum_information: True @@ -746,7 +746,7 @@ datasets: standard_name: atmosphere_optical_thickness_due_to_cloud resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_optical_thickness + nc_key: retrieved_cloud_optical_thickness retrieved_cloud_optical_thickness_upper_layer: name: retrieved_cloud_optical_thickness_upper_layer @@ -754,7 +754,7 @@ datasets: standard_name: atmosphere_optical_thickness_due_to_cloud resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_optical_thickness + nc_key: retrieved_cloud_optical_thickness layer: 0 retrieval_error_cloud_optical_thickness_upper_layer: @@ -763,7 +763,7 @@ datasets: standard_name: atmosphere_optical_thickness_due_to_cloud standard_error resolution: 2000 file_type: nc_fci_oca - file_key: retrieval_error_cloud_optical_thickness + nc_key: retrieval_error_cloud_optical_thickness layer: 0 retrieved_cloud_optical_thickness_lower_layer: @@ -772,7 +772,7 @@ datasets: standard_name: atmosphere_optical_thickness_due_to_cloud resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_optical_thickness + nc_key: retrieved_cloud_optical_thickness layer: 1 retrieval_error_cloud_optical_thickness_lower_layer: @@ -781,7 +781,7 @@ datasets: standard_name: atmosphere_optical_thickness_due_to_cloud standard_error resolution: 2000 file_type: nc_fci_oca - file_key: retrieval_error_cloud_optical_thickness + nc_key: retrieval_error_cloud_optical_thickness layer: 1 retrieved_cloud_particle_effective_radius: @@ -789,14 +789,14 @@ datasets: standard_name: effective_radius_of_cloud_particles_at_cloud_top resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_particle_effective_radius + nc_key: retrieved_cloud_particle_effective_radius retrieval_error_cloud_particle_effective_radius: name: retrieval_error_cloud_particle_effective_radius standard_name: effective_radius_of_cloud_particles_at_cloud_top standard_error resolution: 2000 file_type: nc_fci_oca - file_key: retrieval_error_cloud_particle_effective_radius + nc_key: retrieval_error_cloud_particle_effective_radius retrieved_cloud_top_pressure_upper_layer: name: retrieved_cloud_top_pressure_upper_layer @@ -804,7 +804,7 @@ datasets: standard_name: air_pressure_at_cloud_top resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_top_pressure + nc_key: retrieved_cloud_top_pressure layer: 0 retrieval_error_cloud_top_pressure_upper_layer: @@ -813,7 +813,7 @@ datasets: standard_name: air_pressure_at_cloud_top standard_error resolution: 2000 file_type: nc_fci_oca - file_key: retrieval_error_cloud_top_pressure + nc_key: retrieval_error_cloud_top_pressure layer: 0 retrieved_cloud_top_pressure_lower_layer: @@ -822,7 +822,7 @@ datasets: standard_name: air_pressure_at_cloud_top resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_top_pressure + nc_key: retrieved_cloud_top_pressure layer: 1 retrieval_error_cloud_top_pressure_lower_layer: @@ -831,7 +831,7 @@ datasets: standard_name: air_pressure_at_cloud_top standard_error resolution: 2000 file_type: nc_fci_oca - file_key: retrieval_error_cloud_top_pressure + nc_key: retrieval_error_cloud_top_pressure layer: 1 retrieved_cloud_top_temperature: @@ -839,39 +839,39 @@ datasets: standard_name: air_temperature_at_cloud_top resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_top_temperature + nc_key: retrieved_cloud_top_temperature retrieved_cloud_top_height: name: retrieved_cloud_top_height standard_name: height_at_cloud_top resolution: 2000 file_type: nc_fci_oca - file_key: retrieved_cloud_top_height + nc_key: retrieved_cloud_top_height quality_jmeas: name: quality_jmeas standard_name: cost_function_part_due_to_measurements resolution: 2000 file_type: nc_fci_oca - file_key: quality_jmeas + nc_key: quality_jmeas product_quality_oca: name: product_quality_oca standard_name: product_quality file_type: nc_fci_oca - file_key: product_quality + nc_key: product_quality product_completeness_oca: name: product_completeness_oca standard_name: product_completeness file_type: nc_fci_oca - file_key: product_completeness + nc_key: product_completeness product_timeliness_oca: name: product_timeliness_oca standard_name: product_timeliness file_type: nc_fci_oca - file_key: product_timeliness + nc_key: product_timeliness # OLR - Outgoing Longwave Radiation @@ -880,14 +880,14 @@ datasets: standard_name: outgoing_longwave_radiation resolution: 2000 file_type: nc_fci_olr - file_key: olr_value + nc_key: olr_value cloud_type_olr: name: cloud_type_olr standard_name: cloud_type_classification resolution: 2000 file_type: nc_fci_olr - file_key: cloud_type + nc_key: cloud_type fill_value: -127 import_enum_information: True @@ -896,7 +896,7 @@ datasets: standard_name: quality_flag resolution: 2000 file_type: nc_fci_olr - file_key: quality_overall_processing + nc_key: quality_overall_processing fill_value: -127 import_enum_information: True @@ -904,19 +904,19 @@ datasets: name: product_quality_olr standard_name: product_quality file_type: nc_fci_olr - file_key: product_quality + nc_key: product_quality product_completeness_olr: name: product_completeness_olr standard_name: product_completeness file_type: nc_fci_olr - file_key: product_completeness + nc_key: product_completeness product_timeliness_olr: name: product_timeliness_olr standard_name: product_timeliness file_type: nc_fci_olr - file_key: product_timeliness + nc_key: product_timeliness # CRM - Clear-Sky Reflectance Maps @@ -926,7 +926,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 1000 file_type: nc_fci_crm - file_key: mean_clear_sky_reflectance + nc_key: mean_clear_sky_reflectance units: '%' crm_vis04: @@ -936,7 +936,7 @@ datasets: resolution: 1000 wavelength: [0.384, 0.444, 0.504] file_type: nc_fci_crm - file_key: mean_clear_sky_reflectance + nc_key: mean_clear_sky_reflectance units: '%' vis_channel_id: 0 @@ -947,7 +947,7 @@ datasets: resolution: 1000 wavelength: [0.47, 0.51, 0.55] file_type: nc_fci_crm - file_key: mean_clear_sky_reflectance + nc_key: mean_clear_sky_reflectance units: '%' vis_channel_id: 1 @@ -958,7 +958,7 @@ datasets: resolution: 1000 wavelength: [0.59, 0.64, 0.69] file_type: nc_fci_crm - file_key: mean_clear_sky_reflectance + nc_key: mean_clear_sky_reflectance units: '%' vis_channel_id: 2 @@ -969,7 +969,7 @@ datasets: resolution: 1000 wavelength: [0.815, 0.865, 0.915] file_type: nc_fci_crm - file_key: mean_clear_sky_reflectance + nc_key: mean_clear_sky_reflectance units: '%' vis_channel_id: 3 @@ -980,7 +980,7 @@ datasets: resolution: 1000 wavelength: [0.894, 0.914, 0.934] file_type: nc_fci_crm - file_key: mean_clear_sky_reflectance + nc_key: mean_clear_sky_reflectance units: '%' vis_channel_id: 4 @@ -991,7 +991,7 @@ datasets: resolution: 1000 wavelength: [1.35, 1.38, 1.41] file_type: nc_fci_crm - file_key: mean_clear_sky_reflectance + nc_key: mean_clear_sky_reflectance units: '%' vis_channel_id: 5 @@ -1002,7 +1002,7 @@ datasets: resolution: 1000 wavelength: [1.56, 1.61, 1.66] file_type: nc_fci_crm - file_key: mean_clear_sky_reflectance + nc_key: mean_clear_sky_reflectance units: '%' vis_channel_id: 6 @@ -1013,7 +1013,7 @@ datasets: resolution: 1000 wavelength: [2.2, 2.25, 2.3] file_type: nc_fci_crm - file_key: mean_clear_sky_reflectance + nc_key: mean_clear_sky_reflectance units: '%' vis_channel_id: 7 @@ -1023,7 +1023,7 @@ datasets: standard_name: solar_zenith_angle resolution: 1000 file_type: nc_fci_crm - file_key: mean_solar_zenith + nc_key: mean_solar_zenith mean_rel_azi: name: mean_rel_azi @@ -1031,47 +1031,47 @@ datasets: standard_name: relative_sun_sensor_azimuth_angle resolution: 1000 file_type: nc_fci_crm - file_key: mean_rel_solar_sat_azimuth + nc_key: mean_rel_solar_sat_azimuth n_acc: name: n_acc standard_name: number_of_accumulations resolution: 1000 file_type: nc_fci_crm - file_key: number_of_accumulations + nc_key: number_of_accumulations historical_data: name: historical_data standard_name: status_flag resolution: 1000 file_type: nc_fci_crm - file_key: historical_data + nc_key: historical_data import_enum_information: True product_quality_crm: name: product_quality_crm standard_name: product_quality file_type: nc_fci_crm - file_key: product_quality + nc_key: product_quality product_completeness_crm: name: product_completeness_crm standard_name: product_completeness file_type: nc_fci_crm - file_key: product_completeness + nc_key: product_completeness product_timeliness_crm: name: product_timeliness_crm standard_name: product_timeliness file_type: nc_fci_crm - file_key: product_timeliness + nc_key: product_timeliness # LAT/LON FOR SEGMENTED PRODUCTS latitude: name: latitude standard_name: latitude - file_key: latitude + nc_key: latitude resolution: [6000, 6000, 32000] file_type: [ nc_fci_gii, nc_fci_toz, nc_fci_asr ] units: degree_north @@ -1079,7 +1079,7 @@ datasets: longitude: name: longitude standard_name: longitude - file_key: longitude + nc_key: longitude resolution: [6000, 6000, 32000] file_type: [ nc_fci_gii, nc_fci_toz, nc_fci_asr ] units: degree_east @@ -1091,7 +1091,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 0 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1101,7 +1101,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 1 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1111,7 +1111,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 2 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1121,7 +1121,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 3 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1131,7 +1131,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 4 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1141,7 +1141,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 5 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1151,7 +1151,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 6 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1161,7 +1161,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 7 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1171,7 +1171,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 8 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1181,7 +1181,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 9 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1191,7 +1191,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 10 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1201,7 +1201,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 11 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1211,7 +1211,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 12 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1221,7 +1221,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 13 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1231,7 +1231,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 14 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1241,7 +1241,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 15 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1251,7 +1251,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 16 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1261,7 +1261,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 17 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1271,7 +1271,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 18 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1281,7 +1281,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 19 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1291,7 +1291,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 20 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1301,7 +1301,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 21 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1311,7 +1311,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 22 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1321,7 +1321,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 23 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1331,7 +1331,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_flag + nc_key: cloud_mask_test_flag extract_byte: 24 flag_values: [0,1] flag_meanings: ['Test not carried out','Test carried out'] @@ -1341,7 +1341,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 0 flag_values: [0,1] flag_meanings: ['No snow/ice detected',' Snow/ice detected'] @@ -1351,7 +1351,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 1 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1361,7 +1361,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 2 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1371,7 +1371,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 3 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1381,7 +1381,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 4 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1391,7 +1391,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 5 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1401,7 +1401,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 6 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1411,7 +1411,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 7 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1421,7 +1421,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 8 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1431,7 +1431,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 9 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1441,7 +1441,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 10 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1451,7 +1451,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 11 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1461,7 +1461,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 12 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1471,7 +1471,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 13 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1481,7 +1481,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 14 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1491,7 +1491,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 15 flag_values: [0,1] flag_meanings: ['No opaqueness detected', 'Opaqueness detected'] @@ -1501,7 +1501,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 16 flag_values: [0,1] flag_meanings: ['No cloud detected','Cloud detected'] @@ -1511,7 +1511,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 17 flag_values: [0,1] flag_meanings: ['Clear unchanged', 'Cloud detected (restored from clear sky)'] @@ -1521,7 +1521,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 18 flag_values: [0,1] flag_meanings: ['Clear unchanged', 'Cloud detected (restored from clear sky)'] @@ -1531,7 +1531,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 19 flag_values: [0,1] flag_meanings: ['Clear unchanged', 'Cloud detected (restored from clear sky)'] @@ -1541,7 +1541,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 20 flag_values: [0,1] flag_meanings: ['Clear sky restored', 'Cloud unchanged'] @@ -1551,7 +1551,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 21 flag_values: [0,1] flag_meanings: ['No dust detected','Dust detected'] @@ -1561,7 +1561,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 22 flag_values: [0,1] flag_meanings: ['No ash detected','Ash detected'] @@ -1571,7 +1571,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_test_result + nc_key: cloud_mask_test_result extract_byte: 23 flag_values: [0,1] flag_meanings: ['Dust detected','Ash detected'] @@ -1581,7 +1581,7 @@ datasets: standard_name: status_flag resolution: 2000 file_type: nc_fci_test_clm - file_key: cloud_mask_cmrt6_test_result + nc_key: cloud_mask_cmrt6_test_result fill_value: -127 import_enum_information: True @@ -1592,7 +1592,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_max + nc_key: bt_max cell_method: area:maximum coordinates: - longitude @@ -1604,7 +1604,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean cell_method: area:mean coordinates: - longitude @@ -1616,7 +1616,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_min + nc_key: bt_min cell_method: area:minimum coordinates: - longitude @@ -1628,7 +1628,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_std + nc_key: bt_std cell_method: area:standard_deviation coordinates: - longitude @@ -1640,7 +1640,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_max + nc_key: radiance_max cell_method: area:maximum coordinates: - longitude @@ -1652,7 +1652,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean cell_method: area:mean coordinates: - longitude @@ -1664,7 +1664,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_min + nc_key: radiance_min cell_method: area:minimum coordinates: - longitude @@ -1676,7 +1676,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_std + nc_key: radiance_std cell_method: area:standard_deviation coordinates: - longitude @@ -1688,7 +1688,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_max + nc_key: reflectance_max cell_method: area:maximum units: '%' coordinates: @@ -1701,7 +1701,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean cell_method: area:mean units: '%' coordinates: @@ -1714,7 +1714,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_min + nc_key: reflectance_min cell_method: area:minimum units: '%' coordinates: @@ -1727,7 +1727,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_std + nc_key: reflectance_std cell_method: area:standard_deviation units: '%' coordinates: @@ -1740,7 +1740,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt fill_value: -1 units: '%' coordinates: @@ -1753,7 +1753,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance fill_value: -1 units: '%' coordinates: @@ -1766,7 +1766,7 @@ datasets: standard_name: radiance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_radiance + nc_key: quality_radiance fill_value: -1 coordinates: - longitude @@ -1777,7 +1777,7 @@ datasets: standard_name: land_area_fraction resolution: 32000 file_type: nc_fci_asr - file_key: land_pixel_percent + nc_key: land_pixel_percent coordinates: - longitude - latitude @@ -1787,7 +1787,7 @@ datasets: standard_name: water_area_fraction resolution: 32000 file_type: nc_fci_asr - file_key: water_pixel_percent + nc_key: water_pixel_percent coordinates: - longitude - latitude @@ -1797,7 +1797,7 @@ datasets: standard_name: water_area_fraction resolution: 32000 file_type: nc_fci_asr - file_key: pixel_percentage + nc_key: pixel_percentage coordinates: - longitude - latitude @@ -1808,7 +1808,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 0 wavelength: [0.384, 0.444, 0.504] category_id: 0 @@ -1824,7 +1824,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 0 wavelength: [0.384, 0.444, 0.504] category_id: 1 @@ -1840,7 +1840,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 0 wavelength: [0.384, 0.444, 0.504] category_id: 2 @@ -1856,7 +1856,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 1 wavelength: [0.47, 0.51, 0.55] category_id: 0 @@ -1872,7 +1872,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 1 wavelength: [0.47, 0.51, 0.55] category_id: 1 @@ -1888,7 +1888,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 1 wavelength: [0.47, 0.51, 0.55] category_id: 2 @@ -1904,7 +1904,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 2 wavelength: [0.59, 0.64, 0.69] category_id: 0 @@ -1920,7 +1920,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 2 wavelength: [0.59, 0.64, 0.69] category_id: 1 @@ -1936,7 +1936,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 2 wavelength: [0.59, 0.64, 0.69] category_id: 2 @@ -1952,7 +1952,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 3 wavelength: [0.815, 0.865, 0.915] category_id: 0 @@ -1968,7 +1968,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 3 wavelength: [0.815, 0.865, 0.915] category_id: 1 @@ -1984,7 +1984,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 3 wavelength: [0.815, 0.865, 0.915] category_id: 2 @@ -2000,7 +2000,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 4 wavelength: [0.894, 0.914, 0.934] category_id: 0 @@ -2016,7 +2016,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 4 wavelength: [0.894, 0.914, 0.934] category_id: 1 @@ -2032,7 +2032,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 4 wavelength: [0.894, 0.914, 0.934] category_id: 2 @@ -2048,7 +2048,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 5 wavelength: [1.35, 1.38, 1.41] category_id: 0 @@ -2064,7 +2064,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 5 wavelength: [1.35, 1.38, 1.41] category_id: 1 @@ -2080,7 +2080,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 5 wavelength: [1.35, 1.38, 1.41] category_id: 2 @@ -2096,7 +2096,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 6 wavelength: [1.56, 1.61, 1.66] category_id: 0 @@ -2112,7 +2112,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 6 wavelength: [1.56, 1.61, 1.66] category_id: 1 @@ -2128,7 +2128,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 6 wavelength: [1.56, 1.61, 1.66] category_id: 2 @@ -2144,7 +2144,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 7 wavelength: [2.2, 2.25, 2.3] category_id: 0 @@ -2160,7 +2160,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 7 wavelength: [2.2, 2.25, 2.3] category_id: 1 @@ -2176,7 +2176,7 @@ datasets: standard_name: toa_bidirectional_reflectance resolution: 32000 file_type: nc_fci_asr - file_key: reflectance_mean + nc_key: reflectance_mean vis_channel_id: 7 wavelength: [2.2, 2.25, 2.3] category_id: 2 @@ -2192,7 +2192,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 0 wavelength: [3.4, 3.8, 4.2] category_id: 0 @@ -2207,7 +2207,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 0 wavelength: [3.4, 3.8, 4.2] category_id: 1 @@ -2222,7 +2222,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 0 wavelength: [3.4, 3.8, 4.2] category_id: 2 @@ -2237,7 +2237,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 1 wavelength: [5.3, 6.3, 7.3] category_id: 0 @@ -2252,7 +2252,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 1 wavelength: [5.3, 6.3, 7.3] category_id: 1 @@ -2267,7 +2267,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 1 wavelength: [5.3, 6.3, 7.3] category_id: 2 @@ -2282,7 +2282,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 2 wavelength: [6.85, 7.35, 7.85] category_id: 0 @@ -2297,7 +2297,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 2 wavelength: [6.85, 7.35, 7.85] category_id: 1 @@ -2312,7 +2312,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 2 wavelength: [6.85, 7.35, 7.85] category_id: 2 @@ -2327,7 +2327,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 3 wavelength: [8.3, 8.7, 9.1] category_id: 0 @@ -2342,7 +2342,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 3 wavelength: [8.3, 8.7, 9.1] category_id: 1 @@ -2357,7 +2357,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 3 wavelength: [8.3, 8.7, 9.1] category_id: 2 @@ -2372,7 +2372,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 4 wavelength: [9.36, 9.66, 9.96] category_id: 0 @@ -2387,7 +2387,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 4 wavelength: [9.36, 9.66, 9.96] category_id: 1 @@ -2402,7 +2402,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 4 wavelength: [9.36, 9.66, 9.96] category_id: 2 @@ -2417,7 +2417,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 5 wavelength: [9.8, 10.5, 11.2] category_id: 0 @@ -2432,7 +2432,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 5 wavelength: [9.8, 10.5, 11.2] category_id: 1 @@ -2447,7 +2447,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 5 wavelength: [9.8, 10.5, 11.2] category_id: 2 @@ -2462,7 +2462,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 6 wavelength: [11.8, 12.3, 12.8] category_id: 0 @@ -2477,7 +2477,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 6 wavelength: [11.8, 12.3, 12.8] category_id: 1 @@ -2492,7 +2492,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 6 wavelength: [11.8, 12.3, 12.8] category_id: 2 @@ -2507,7 +2507,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 7 wavelength: [12.7, 13.3, 13.9] category_id: 0 @@ -2522,7 +2522,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 7 wavelength: [12.7, 13.3, 13.9] category_id: 1 @@ -2537,7 +2537,7 @@ datasets: standard_name: toa_brightess_temperature resolution: 32000 file_type: nc_fci_asr - file_key: bt_mean + nc_key: bt_mean ir_channel_id: 7 wavelength: [12.7, 13.3, 13.9] category_id: 2 @@ -2552,7 +2552,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 0 wavelength: [0.384, 0.444, 0.504] category_id: 0 @@ -2567,7 +2567,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 0 wavelength: [0.384, 0.444, 0.504] category_id: 1 @@ -2582,7 +2582,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 0 wavelength: [0.384, 0.444, 0.504] category_id: 2 @@ -2597,7 +2597,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 1 wavelength: [0.47, 0.51, 0.55] category_id: 0 @@ -2612,7 +2612,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 1 wavelength: [0.47, 0.51, 0.55] category_id: 1 @@ -2627,7 +2627,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 1 wavelength: [0.47, 0.51, 0.55] category_id: 2 @@ -2642,7 +2642,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 2 wavelength: [0.59, 0.64, 0.69] category_id: 0 @@ -2657,7 +2657,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 2 wavelength: [0.59, 0.64, 0.69] category_id: 1 @@ -2672,7 +2672,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 2 wavelength: [0.59, 0.64, 0.69] category_id: 2 @@ -2687,7 +2687,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 3 wavelength: [0.815, 0.865, 0.915] category_id: 0 @@ -2702,7 +2702,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 3 wavelength: [0.815, 0.865, 0.915] category_id: 1 @@ -2717,7 +2717,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 3 wavelength: [0.815, 0.865, 0.915] category_id: 2 @@ -2732,7 +2732,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 4 wavelength: [0.894, 0.914, 0.934] category_id: 0 @@ -2747,7 +2747,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 4 wavelength: [0.894, 0.914, 0.934] category_id: 1 @@ -2762,7 +2762,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 4 wavelength: [0.894, 0.914, 0.934] category_id: 2 @@ -2777,7 +2777,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 5 wavelength: [1.35, 1.38, 1.41] category_id: 0 @@ -2792,7 +2792,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 5 wavelength: [1.35, 1.38, 1.41] category_id: 1 @@ -2807,7 +2807,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 5 wavelength: [1.35, 1.38, 1.41] category_id: 2 @@ -2822,7 +2822,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 6 wavelength: [1.56, 1.61, 1.66] category_id: 0 @@ -2837,7 +2837,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 6 wavelength: [1.56, 1.61, 1.66] category_id: 1 @@ -2852,7 +2852,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 6 wavelength: [1.56, 1.61, 1.66] category_id: 2 @@ -2867,7 +2867,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 7 wavelength: [2.2, 2.25, 2.3] category_id: 0 @@ -2882,7 +2882,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 7 wavelength: [2.2, 2.25, 2.3] category_id: 1 @@ -2897,7 +2897,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 7 wavelength: [2.2, 2.25, 2.3] category_id: 2 @@ -2912,7 +2912,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 8 wavelength: [3.4, 3.8, 4.2] category_id: 0 @@ -2927,7 +2927,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 8 wavelength: [3.4, 3.8, 4.2] category_id: 1 @@ -2942,7 +2942,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 8 wavelength: [3.4, 3.8, 4.2] category_id: 2 @@ -2957,7 +2957,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 9 wavelength: [5.3, 6.3, 7.3] category_id: 0 @@ -2972,7 +2972,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 9 wavelength: [5.3, 6.3, 7.3] category_id: 1 @@ -2987,7 +2987,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 9 wavelength: [5.3, 6.3, 7.3] category_id: 2 @@ -3002,7 +3002,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 10 wavelength: [6.85, 7.35, 7.85] category_id: 0 @@ -3017,7 +3017,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 10 wavelength: [6.85, 7.35, 7.85] category_id: 1 @@ -3032,7 +3032,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 10 wavelength: [6.85, 7.35, 7.85] category_id: 2 @@ -3047,7 +3047,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 11 wavelength: [8.3, 8.7, 9.1] category_id: 0 @@ -3062,7 +3062,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 11 wavelength: [8.3, 8.7, 9.1] category_id: 1 @@ -3077,7 +3077,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 11 wavelength: [8.3, 8.7, 9.1] category_id: 2 @@ -3092,7 +3092,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 12 wavelength: [9.36, 9.66, 9.96] category_id: 0 @@ -3107,7 +3107,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 12 wavelength: [9.36, 9.66, 9.96] category_id: 1 @@ -3122,7 +3122,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 12 wavelength: [9.36, 9.66, 9.96] category_id: 2 @@ -3137,7 +3137,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 13 wavelength: [9.8, 10.5, 11.2] category_id: 0 @@ -3152,7 +3152,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 13 wavelength: [9.8, 10.5, 11.2] category_id: 1 @@ -3167,7 +3167,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 13 wavelength: [9.8, 10.5, 11.2] category_id: 2 @@ -3182,7 +3182,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 14 wavelength: [11.8, 12.3, 12.8] category_id: 0 @@ -3197,7 +3197,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 14 wavelength: [11.8, 12.3, 12.8] category_id: 1 @@ -3212,7 +3212,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 14 wavelength: [11.8, 12.3, 12.8] category_id: 2 @@ -3227,7 +3227,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 15 wavelength: [12.7, 13.3, 13.9] category_id: 0 @@ -3242,7 +3242,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 15 wavelength: [12.7, 13.3, 13.9] category_id: 1 @@ -3257,7 +3257,7 @@ datasets: standard_name: toa_outgoing_radiance resolution: 32000 file_type: nc_fci_asr - file_key: radiance_mean + nc_key: radiance_mean channel_id: 15 wavelength: [12.7, 13.3, 13.9] category_id: 2 @@ -3272,7 +3272,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 0 wavelength: [0.384, 0.444, 0.504] category_id: 0 @@ -3288,7 +3288,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 0 wavelength: [0.384, 0.444, 0.504] category_id: 1 @@ -3304,7 +3304,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 0 wavelength: [0.384, 0.444, 0.504] category_id: 2 @@ -3320,7 +3320,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 1 wavelength: [0.47, 0.51, 0.55] category_id: 0 @@ -3336,7 +3336,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 1 wavelength: [0.47, 0.51, 0.55] category_id: 1 @@ -3352,7 +3352,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 1 wavelength: [0.47, 0.51, 0.55] category_id: 2 @@ -3368,7 +3368,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 2 wavelength: [0.59, 0.64, 0.69] category_id: 0 @@ -3384,7 +3384,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 2 wavelength: [0.59, 0.64, 0.69] category_id: 1 @@ -3400,7 +3400,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 2 wavelength: [0.59, 0.64, 0.69] category_id: 2 @@ -3416,7 +3416,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 3 wavelength: [0.815, 0.865, 0.915] category_id: 0 @@ -3432,7 +3432,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 3 wavelength: [0.815, 0.865, 0.915] category_id: 1 @@ -3448,7 +3448,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 3 wavelength: [0.815, 0.865, 0.915] category_id: 2 @@ -3464,7 +3464,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 4 wavelength: [0.894, 0.914, 0.934] category_id: 0 @@ -3480,7 +3480,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 4 wavelength: [0.894, 0.914, 0.934] category_id: 1 @@ -3496,7 +3496,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 4 wavelength: [0.894, 0.914, 0.934] category_id: 2 @@ -3512,7 +3512,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 5 wavelength: [1.35, 1.38, 1.41] category_id: 0 @@ -3528,7 +3528,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 5 wavelength: [1.35, 1.38, 1.41] category_id: 1 @@ -3544,7 +3544,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 5 wavelength: [1.35, 1.38, 1.41] category_id: 2 @@ -3560,7 +3560,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 6 wavelength: [1.56, 1.61, 1.66] category_id: 0 @@ -3576,7 +3576,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 6 wavelength: [1.56, 1.61, 1.66] category_id: 1 @@ -3592,7 +3592,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 6 wavelength: [1.56, 1.61, 1.66] category_id: 2 @@ -3608,7 +3608,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 7 wavelength: [2.2, 2.25, 2.3] category_id: 0 @@ -3624,7 +3624,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 7 wavelength: [2.2, 2.25, 2.3] category_id: 1 @@ -3640,7 +3640,7 @@ datasets: standard_name: reflectance_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_reflectance + nc_key: quality_reflectance vis_channel_id: 7 wavelength: [2.2, 2.25, 2.3] category_id: 2 @@ -3656,7 +3656,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 0 wavelength: [3.4, 3.8, 4.2] category_id: 0 @@ -3672,7 +3672,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 0 wavelength: [3.4, 3.8, 4.2] category_id: 1 @@ -3688,7 +3688,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 0 wavelength: [3.4, 3.8, 4.2] category_id: 2 @@ -3704,7 +3704,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 1 wavelength: [5.3, 6.3, 7.3] category_id: 0 @@ -3720,7 +3720,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 1 wavelength: [5.3, 6.3, 7.3] category_id: 1 @@ -3736,7 +3736,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 1 wavelength: [5.3, 6.3, 7.3] category_id: 2 @@ -3752,7 +3752,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 2 wavelength: [6.85, 7.35, 7.85] category_id: 0 @@ -3768,7 +3768,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 2 wavelength: [6.85, 7.35, 7.85] category_id: 1 @@ -3784,7 +3784,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 2 wavelength: [6.85, 7.35, 7.85] category_id: 2 @@ -3800,7 +3800,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 3 wavelength: [8.3, 8.7, 9.1] category_id: 0 @@ -3816,7 +3816,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 3 wavelength: [8.3, 8.7, 9.1] category_id: 1 @@ -3832,7 +3832,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 3 wavelength: [8.3, 8.7, 9.1] category_id: 2 @@ -3848,7 +3848,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 4 wavelength: [9.36, 9.66, 9.96] category_id: 0 @@ -3864,7 +3864,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 4 wavelength: [9.36, 9.66, 9.96] category_id: 1 @@ -3880,7 +3880,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 4 wavelength: [9.36, 9.66, 9.96] category_id: 2 @@ -3896,7 +3896,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 5 wavelength: [9.8, 10.5, 11.2] category_id: 0 @@ -3912,7 +3912,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 5 wavelength: [9.8, 10.5, 11.2] category_id: 1 @@ -3928,7 +3928,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 5 wavelength: [9.8, 10.5, 11.2] category_id: 2 @@ -3944,7 +3944,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 6 wavelength: [11.8, 12.3, 12.8] category_id: 0 @@ -3960,7 +3960,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 6 wavelength: [11.8, 12.3, 12.8] category_id: 1 @@ -3976,7 +3976,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 6 wavelength: [11.8, 12.3, 12.8] category_id: 2 @@ -3992,7 +3992,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 7 wavelength: [12.7, 13.3, 13.9] category_id: 0 @@ -4008,7 +4008,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 7 wavelength: [12.7, 13.3, 13.9] category_id: 1 @@ -4024,7 +4024,7 @@ datasets: standard_name: brightness_temperature_quality resolution: 32000 file_type: nc_fci_asr - file_key: quality_bt + nc_key: quality_bt ir_channel_id: 7 wavelength: [12.7, 13.3, 13.9] category_id: 2 @@ -4040,7 +4040,7 @@ datasets: standard_name: pixels_used_fraction resolution: 32000 file_type: nc_fci_asr - file_key: pixel_percentage + nc_key: pixel_percentage category_id: 0 units: '%' coordinates: @@ -4053,7 +4053,7 @@ datasets: standard_name: pixels_used_fraction resolution: 32000 file_type: nc_fci_asr - file_key: pixel_percentage + nc_key: pixel_percentage category_id: 1 units: '%' coordinates: @@ -4066,7 +4066,7 @@ datasets: standard_name: pixels_used_fraction resolution: 32000 file_type: nc_fci_asr - file_key: pixel_percentage + nc_key: pixel_percentage category_id: 2 units: '%' coordinates: @@ -4077,16 +4077,16 @@ datasets: name: product_quality_asr standard_name: product_quality file_type: nc_fci_asr - file_key: product_quality + nc_key: product_quality product_completeness_asr: name: product_completeness_asr standard_name: product_completeness file_type: nc_fci_asr - file_key: product_completeness + nc_key: product_completeness product_timeliness_asr: name: product_timeliness_asr standard_name: product_timeliness file_type: nc_fci_asr - file_key: product_timeliness + nc_key: product_timeliness diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index 6290f8161c..e88b60a739 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -88,7 +88,7 @@ def _set_attributes(self, variable, dataset_info, segmented=False): else: xdim, ydim = "number_of_columns", "number_of_rows" - if dataset_info["file_key"] not in ["product_quality", "product_completeness", "product_timeliness"]: + if dataset_info["nc_key"] not in ["product_quality", "product_completeness", "product_timeliness"]: variable = variable.rename({ydim: "y", xdim: "x"}) variable.attrs.setdefault("units", None) @@ -104,7 +104,7 @@ def _set_attributes(self, variable, dataset_info, segmented=False): if (import_enum_information): netCDF4_dataset = netCDF4.Dataset(self.filename, "r") # This currently assumes a flat netCDF file - dataType=netCDF4_dataset.variables[dataset_info["file_key"]].datatype + dataType=netCDF4_dataset.variables[dataset_info["nc_key"]].datatype if (hasattr(dataType,"enum_dict")): enum = dataType.enum_dict flag_values = [] @@ -189,8 +189,8 @@ def get_area_def(self, key): raise NotImplementedError def get_dataset(self, dataset_id, dataset_info): - """Get dataset using the file_key in dataset_info.""" - var_key = dataset_info["file_key"] + """Get dataset using the nc_key in dataset_info.""" + var_key = dataset_info["nc_key"] par_name = dataset_info["name"] logger.debug("Reading in file to get dataset with key %s.", var_key) @@ -222,7 +222,7 @@ def get_dataset(self, dataset_id, dataset_info): @staticmethod def _decode_clm_test_data(variable, dataset_info): - if dataset_info["file_key"] != "cloud_mask_cmrt6_test_result": + if dataset_info["nc_key"] != "cloud_mask_cmrt6_test_result": variable = variable.astype("uint32") variable.values = (variable.values >> dataset_info["extract_byte"] << 31 >> 31).astype("int8") @@ -352,8 +352,8 @@ def get_area_def(self, key): raise NotImplementedError def get_dataset(self, dataset_id, dataset_info): - """Get dataset using the file_key in dataset_info.""" - var_key = dataset_info["file_key"] + """Get dataset using the nc_key in dataset_info.""" + var_key = dataset_info["nc_key"] logger.debug("Reading in file to get dataset with key %s.", var_key) try: @@ -470,8 +470,8 @@ def _get_global_attributes(self): return attributes def get_dataset(self, dataset_id, dataset_info): - """Get dataset using the file_key in dataset_info.""" - var_key = dataset_info["file_key"] + """Get dataset using the nc_key in dataset_info.""" + var_key = dataset_info["nc_key"] logger.debug("Reading in file to get dataset with key %s.", var_key) try: diff --git a/satpy/tests/reader_tests/test_fci_l2_nc.py b/satpy/tests/reader_tests/test_fci_l2_nc.py index 3e77c1d51e..830f793d00 100644 --- a/satpy/tests/reader_tests/test_fci_l2_nc.py +++ b/satpy/tests/reader_tests/test_fci_l2_nc.py @@ -165,10 +165,10 @@ def test_area_definition(self, me_, gad_): assert args[5] == 100 def test_dataset(self): - """Test the correct execution of the get_dataset function with a valid file_key.""" + """Test the correct execution of the get_dataset function with a valid nc_key.""" dataset = self.fh.get_dataset(make_dataid(name="test_one_layer", resolution=2000), {"name": "test_one_layer", - "file_key": "test_one_layer", + "nc_key": "test_one_layer", "fill_value": -999, "file_type": "test_file_type"}) @@ -177,20 +177,20 @@ def test_dataset(self): assert dataset.attrs["fill_value"] == -999 def test_dataset_with_layer(self): - """Check the correct execution of the get_dataset function with a valid file_key & layer.""" + """Check the correct execution of the get_dataset function with a valid nc_key & layer.""" dataset = self.fh.get_dataset(make_dataid(name="test_two_layers", resolution=2000), {"name": "test_two_layers", - "file_key": "test_two_layers", "layer": 1, + "nc_key": "test_two_layers", "layer": 1, "fill_value": -999, "file_type": "test_file_type"}) np.testing.assert_allclose(dataset.values, 2 * np.ones((100, 10))) assert dataset.attrs["spacecraft_name"] == "test_platform" def test_dataset_with_invalid_filekey(self): - """Test the correct execution of the get_dataset function with an invalid file_key.""" + """Test the correct execution of the get_dataset function with an invalid nc_key.""" invalid_dataset = self.fh.get_dataset(make_dataid(name="test_invalid", resolution=2000), {"name": "test_invalid", - "file_key": "test_invalid", + "nc_key": "test_invalid", "fill_value": -999, "file_type": "test_file_type"}) assert invalid_dataset is None @@ -199,7 +199,7 @@ def test_dataset_with_total_cot(self): """Test the correct execution of the get_dataset function for total COT (add contributions from two layers).""" dataset = self.fh.get_dataset(make_dataid(name="retrieved_cloud_optical_thickness", resolution=2000), {"name": "retrieved_cloud_optical_thickness", - "file_key": "test_two_layers", + "nc_key": "test_two_layers", "fill_value": -999, "file_type": "test_file_type"}) # Checks that the function returns None @@ -212,7 +212,7 @@ def test_dataset_with_scalar(self): # Checks returned scalar value dataset = self.fh.get_dataset(make_dataid(name="test_scalar"), {"name": "product_quality", - "file_key": "product_quality", + "nc_key": "product_quality", "file_type": "test_file_type"}) assert dataset.values == 99.0 @@ -224,7 +224,7 @@ def test_emumerations(self): """Test the conversion of enumerated type information into flag_values and flag_meanings.""" dataset = self.fh.get_dataset(make_dataid(name="test_enum", resolution=2000), {"name": "quality_flag", - "file_key": "quality_flag", + "nc_key": "quality_flag", "file_type": "test_file_type", "import_enum_information": True}) attributes = dataset.attrs @@ -237,7 +237,7 @@ def test_units_from_file(self): """Test units extraction from NetCDF file.""" dataset = self.fh.get_dataset(make_dataid(name="test_units_from_file", resolution=2000), {"name": "test_one_layer", - "file_key": "test_one_layer", + "nc_key": "test_one_layer", "file_type": "test_file_type"}) assert dataset.attrs["units"] == "test_units" @@ -245,7 +245,7 @@ def test_unit_from_file(self): """Test that a unit stored with attribute `unit` in the file is assigned to the `units` attribute.""" dataset = self.fh.get_dataset(make_dataid(name="test_unit_from_file", resolution=2000), {"name": "test_two_layers", - "file_key": "test_two_layers", "layer": 1, + "nc_key": "test_two_layers", "layer": 1, "file_type": "test_file_type"}) assert dataset.attrs["units"] == "test_unit" @@ -254,7 +254,7 @@ def test_units_from_yaml(self): dataset = self.fh.get_dataset(make_dataid(name="test_units_from_yaml", resolution=2000), {"name": "test_one_layer", "units": "test_unit_from_yaml", - "file_key": "test_one_layer", + "nc_key": "test_one_layer", "file_type": "test_file_type"}) assert dataset.attrs["units"] == "test_unit_from_yaml" @@ -263,7 +263,7 @@ def test_units_none_conversion(self): dataset = self.fh.get_dataset(make_dataid(name="test_units_none_conversion", resolution=2000), {"name": "test_one_layer", "units": "none", - "file_key": "test_one_layer", + "nc_key": "test_one_layer", "file_type": "test_file_type"}) assert dataset.attrs["units"] is None @@ -342,13 +342,13 @@ def test_all_basic(self): assert global_attributes == expected_global_attributes def test_dataset(self): - """Test the correct execution of the get_dataset function with valid file_key.""" + """Test the correct execution of the get_dataset function with valid nc_key.""" self.fh = FciL2NCSegmentFileHandler(filename=self.seg_test_file, filename_info={}, filetype_info={}) - # Checks the correct execution of the get_dataset function with a valid file_key + # Checks the correct execution of the get_dataset function with a valid nc_key dataset = self.fh.get_dataset(make_dataid(name="test_values", resolution=32000), {"name": "test_values", - "file_key": "test_values", + "nc_key": "test_values", "fill_value": -999, }) expected_dataset = self._get_unique_array(range(8), range(6)) np.testing.assert_allclose(dataset.values, expected_dataset) @@ -361,13 +361,13 @@ def test_dataset(self): self.fh.get_area_def(None) def test_dataset_with_invalid_filekey(self): - """Test the correct execution of the get_dataset function with an invalid file_key.""" + """Test the correct execution of the get_dataset function with an invalid nc_key.""" self.fh = FciL2NCSegmentFileHandler(filename=self.seg_test_file, filename_info={}, filetype_info={}) - # Checks the correct execution of the get_dataset function with an invalid file_key + # Checks the correct execution of the get_dataset function with an invalid nc_key invalid_dataset = self.fh.get_dataset(make_dataid(name="test_invalid", resolution=32000), {"name": "test_invalid", - "file_key": "test_invalid", + "nc_key": "test_invalid", "fill_value": -999, }) # Checks that the function returns None assert invalid_dataset is None @@ -377,10 +377,10 @@ def test_dataset_with_adef(self): self.fh = FciL2NCSegmentFileHandler(filename=self.seg_test_file, filename_info={}, filetype_info={}, with_area_definition=True) - # Checks the correct execution of the get_dataset function with a valid file_key + # Checks the correct execution of the get_dataset function with a valid nc_key dataset = self.fh.get_dataset(make_dataid(name="test_values", resolution=32000), {"name": "test_values", - "file_key": "test_values", + "nc_key": "test_values", "fill_value": -999, "coordinates": ("test_lon", "test_lat"), }) expected_dataset = self._get_unique_array(range(8), range(6)) @@ -399,7 +399,7 @@ def test_dataset_with_adef_and_wrongs_dims(self): with_area_definition=True) with pytest.raises(NotImplementedError): self.fh.get_dataset(make_dataid(name="test_wrong_dims", resolution=6000), - {"name": "test_wrong_dims", "file_key": "test_values", "fill_value": -999} + {"name": "test_wrong_dims", "nc_key": "test_values", "fill_value": -999} ) def test_dataset_with_scalar(self): @@ -408,7 +408,7 @@ def test_dataset_with_scalar(self): # Checks returned scalar value dataset = self.fh.get_dataset(make_dataid(name="test_scalar"), {"name": "product_quality", - "file_key": "product_quality", + "nc_key": "product_quality", "file_type": "test_file_type"}) assert dataset.values == 99.0 @@ -422,7 +422,7 @@ def test_dataset_slicing_catid(self): dataset = self.fh.get_dataset(make_dataid(name="test_values", resolution=32000), {"name": "test_values", - "file_key": "test_values", + "nc_key": "test_values", "fill_value": -999, "category_id": 5}) expected_dataset = self._get_unique_array(range(8), 5) @@ -434,7 +434,7 @@ def test_dataset_slicing_chid_catid(self): dataset = self.fh.get_dataset(make_dataid(name="test_values", resolution=32000), {"name": "test_values", - "file_key": "test_values", + "nc_key": "test_values", "fill_value": -999, "channel_id": 0, "category_id": 1}) expected_dataset = self._get_unique_array(0, 1) @@ -447,7 +447,7 @@ def test_dataset_slicing_visid_catid(self): self.fh.nc = self.fh.nc.rename_dims({"number_of_channels": "number_of_vis_channels"}) dataset = self.fh.get_dataset(make_dataid(name="test_values", resolution=32000), {"name": "test_values", - "file_key": "test_values", + "nc_key": "test_values", "fill_value": -999, "vis_channel_id": 3, "category_id": 3}) expected_dataset = self._get_unique_array(3, 3) @@ -460,7 +460,7 @@ def test_dataset_slicing_irid(self): self.fh.nc = self.fh.nc.rename_dims({"number_of_channels": "number_of_ir_channels"}) dataset = self.fh.get_dataset(make_dataid(name="test_values", resolution=32000), {"name": "test_values", - "file_key": "test_values", + "nc_key": "test_values", "fill_value": -999, "ir_channel_id": 4}) expected_dataset = self._get_unique_array(4, range(6)) @@ -541,7 +541,7 @@ def test_byte_extraction(self): # Value of 1 is expected to be returned for this test dataset = self.byte_reader.get_dataset(make_dataid(name="cloud_mask_test_flag", resolution=2000), {"name": "cloud_mask_test_flag", - "file_key": "cloud_mask_test_flag", + "nc_key": "cloud_mask_test_flag", "fill_value": -999, "file_type": "nc_fci_test_clm", "extract_byte": 1, @@ -552,7 +552,7 @@ def test_byte_extraction(self): # Value of 0 is expected fto be returned or this test dataset = self.byte_reader.get_dataset(make_dataid(name="cloud_mask_test_flag", resolution=2000), {"name": "cloud_mask_test_flag", - "file_key": "cloud_mask_test_flag", + "nc_key": "cloud_mask_test_flag", "fill_value": -999, "mask_value": 0., "file_type": "nc_fci_test_clm", "extract_byte": 23, @@ -627,10 +627,10 @@ def test_all_basic(self, amv_filehandler, amv_file): assert global_attributes == expected_global_attributes def test_dataset(self, amv_filehandler): - """Test the correct execution of the get_dataset function with a valid file_key.""" + """Test the correct execution of the get_dataset function with a valid nc_key.""" dataset = amv_filehandler.get_dataset(make_dataid(name="test_dataset", resolution=2000), {"name": "test_dataset", - "file_key": "test_dataset", + "nc_key": "test_dataset", "fill_value": -999, "file_type": "test_file_type"}) np.testing.assert_allclose(dataset.values, np.ones(50000)) @@ -639,10 +639,10 @@ def test_dataset(self, amv_filehandler): assert dataset.attrs["fill_value"] == -999 def test_dataset_with_invalid_filekey(self, amv_filehandler): - """Test the correct execution of the get_dataset function with an invalid file_key.""" + """Test the correct execution of the get_dataset function with an invalid nc_key.""" invalid_dataset = amv_filehandler.get_dataset(make_dataid(name="test_invalid", resolution=2000), {"name": "test_invalid", - "file_key": "test_invalid", + "nc_key": "test_invalid", "fill_value": -999, "file_type": "test_file_type"}) assert invalid_dataset is None From b3f996caf96024bc70a8268404051a0bd0aeff9b Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 15 Jan 2024 17:17:20 +0100 Subject: [PATCH 120/481] created separate method to add flag values and meanings from enumeration to a variable --- satpy/readers/fci_l2_nc.py | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index e88b60a739..91dab92c48 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -102,26 +102,33 @@ def _set_attributes(self, variable, dataset_info, segmented=False): import_enum_information = dataset_info.get("import_enum_information", False) if (import_enum_information): - netCDF4_dataset = netCDF4.Dataset(self.filename, "r") - # This currently assumes a flat netCDF file - dataType=netCDF4_dataset.variables[dataset_info["nc_key"]].datatype - if (hasattr(dataType,"enum_dict")): - enum = dataType.enum_dict - flag_values = [] - flag_meanings = [] - for item in enumerate(enum): - flag_values.append(item[0]) - flag_meanings.append(item[1]) - - variable.attrs["flag_values"] = flag_values - variable.attrs["flag_meanings"] = flag_meanings - netCDF4_dataset.close() + variable = self._add_flag_values_and_meamings(self.filename,dataset_info["nc_key"], variable) if variable.attrs["units"] == "none": variable.attrs.update({"units": None}) return variable + @staticmethod + def _add_flag_values_and_meamings(filename,key,variable): + #"""Build flag values and meaning from enum datatype """ + netCDF4_dataset = netCDF4.Dataset(filename, "r") + # This currently assumes a flat netCDF file + dataType=netCDF4_dataset.variables[key].datatype + if (hasattr(dataType,"enum_dict")): + enum = dataType.enum_dict + flag_values = [] + flag_meanings = [] + for item in enumerate(enum): + flag_values.append(item[0]) + flag_meanings.append(item[1]) + + variable.attrs["flag_values"] = flag_values + variable.attrs["flag_meanings"] = flag_meanings + netCDF4_dataset.close() + + return variable + def _slice_dataset(self, variable, dataset_info, dimensions): """Slice data if dimension layers have been provided in yaml-file.""" slice_dict = {dim: dataset_info[dim_id] for (dim, dim_id) in dimensions.items() From 832afa9e5e8901320a5308e724ecb16e3f816057 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Tue, 16 Jan 2024 11:37:32 +0100 Subject: [PATCH 121/481] Refactor sar tests --- satpy/tests/reader_tests/test_sar_c_safe.py | 352 +++++++++++--------- 1 file changed, 202 insertions(+), 150 deletions(-) diff --git a/satpy/tests/reader_tests/test_sar_c_safe.py b/satpy/tests/reader_tests/test_sar_c_safe.py index 4ac4d97cfe..a0e6fb8849 100644 --- a/satpy/tests/reader_tests/test_sar_c_safe.py +++ b/satpy/tests/reader_tests/test_sar_c_safe.py @@ -17,105 +17,185 @@ # satpy. If not, see . """Module for testing the satpy.readers.sar-c_safe module.""" -import unittest -import unittest.mock as mock +import os from enum import Enum from io import BytesIO -import dask.array as da import numpy as np -import xarray as xr +import pytest from satpy.dataset import DataQuery from satpy.readers.sar_c_safe import SAFEXMLAnnotation, SAFEXMLCalibration, SAFEXMLNoise +rasterio = pytest.importorskip("rasterio") + + +dirname_suffix = "20190201T024655_20190201T024720_025730_02DC2A_AE07" +filename_suffix = "20190201t024655-20190201t024720-025730-02dc2a" + +@pytest.fixture(scope="module") +def granule_directory(tmp_path_factory): + """Create a granule directory.""" + data_dir = tmp_path_factory.mktemp("data") + gdir = data_dir / f"S1A_IW_GRDH_1SDV_{dirname_suffix}.SAFE" + os.mkdir(gdir) + return gdir + + +@pytest.fixture(scope="module") +def annotation_file(granule_directory): + """Create an annotation file.""" + ann_dir = granule_directory / "annotation" + os.makedirs(ann_dir, exist_ok=True) + annotation_file = ann_dir / f"s1a-iw-grd-vv-{filename_suffix}-001.xml" + with open(annotation_file, "wb") as fd: + fd.write(annotation_xml) + return annotation_file + + +@pytest.fixture(scope="module") +def annotation_filehandler(annotation_file): + """Create an annotation filehandler.""" + filename_info = dict(start_time=None, end_time=None, polarization="vv") + return SAFEXMLAnnotation(annotation_file, filename_info, None) + + +@pytest.fixture(scope="module") +def calibration_file(granule_directory): + """Create a calibration file.""" + cal_dir = granule_directory / "annotation" / "calibration" + os.makedirs(cal_dir, exist_ok=True) + calibration_file = cal_dir / f"calibration-s1a-iw-grd-vv-{filename_suffix}-001.xml" + with open(calibration_file, "wb") as fd: + fd.write(calibration_xml) + return calibration_file + +@pytest.fixture(scope="module") +def calibration_filehandler(calibration_file, annotation_filehandler): + """Create a calibration filehandler.""" + filename_info = dict(start_time=None, end_time=None, polarization="vv") + return SAFEXMLCalibration(calibration_file, + filename_info, + None, + annotation_filehandler) + +@pytest.fixture(scope="module") +def noise_file(granule_directory): + """Create a noise file.""" + noise_dir = granule_directory / "annotation" / "calibration" + os.makedirs(noise_dir, exist_ok=True) + noise_file = noise_dir / f"noise-s1a-iw-grd-vv-{filename_suffix}-001.xml" + with open(noise_file, "wb") as fd: + fd.write(noise_xml) + return noise_file + + +@pytest.fixture(scope="module") +def noise_filehandler(noise_file, annotation_filehandler): + """Create a noise filehandler.""" + filename_info = dict(start_time=None, end_time=None, polarization="vv") + return SAFEXMLNoise(noise_file, filename_info, None, annotation_filehandler) + + +@pytest.fixture(scope="module") +def noise_with_holes_filehandler(annotation_filehandler): + """Create a noise filehandler from data with holes.""" + filename_info = dict(start_time=None, end_time=None, polarization="vv") + noise_filehandler = SAFEXMLNoise(BytesIO(noise_xml_with_holes), + filename_info, None, + annotation_filehandler) + return noise_filehandler + + + +@pytest.fixture(scope="module") +def measurement_file(granule_directory): + """Create a tiff measurement file.""" + GCP = rasterio.control.GroundControlPoint + + gcps = [GCP(0, 0, 0, 0, 0), + GCP(0, 3, 1, 0, 0), + GCP(3, 0, 0, 1, 0), + GCP(3, 3, 1, 1, 0), + GCP(0, 7, 2, 0, 0), + GCP(3, 7, 2, 1, 0), + GCP(7, 7, 2, 2, 0), + GCP(7, 3, 1, 2, 0), + GCP(7, 0, 0, 2, 0), + GCP(0, 15, 3, 0, 0), + GCP(3, 15, 3, 1, 0), + GCP(7, 15, 3, 2, 0), + GCP(15, 15, 3, 3, 0), + GCP(15, 7, 2, 3, 0), + GCP(15, 3, 1, 3, 0), + GCP(15, 0, 0, 3, 0), + ] + Z = np.linspace(0, 30000, 100, dtype=np.uint16).reshape((10, 10)) + m_dir = granule_directory / "measurement" + os.makedirs(m_dir, exist_ok=True) + filename = m_dir / f"s1a-iw-grd-vv-{filename_suffix}-001.tiff" + with rasterio.open( + filename, + "w", + driver="GTiff", + height=Z.shape[0], + width=Z.shape[1], + count=1, + dtype=Z.dtype, + crs="+proj=latlong", + gcps=gcps) as dst: + dst.write(Z, 1) + return filename + + +@pytest.fixture(scope="module") +def measurement_filehandler(measurement_file, annotation_filehandler, noise_filehandler, calibration_filehandler): + """Create a measurement filehandler.""" + filename_info = {"mission_id": "S1A", "dataset_name": "foo", "start_time": 0, "end_time": 0, + "polarization": "vv"} + filetype_info = None + from satpy.readers.sar_c_safe import SAFEGRD + filehandler = SAFEGRD(measurement_file, + filename_info, + filetype_info, + calibration_filehandler, + noise_filehandler, + annotation_filehandler) + return filehandler -class TestSAFEGRD(unittest.TestCase): + +class Calibration(Enum): + """Calibration levels.""" + + gamma = 1 + sigma_nought = 2 + beta_nought = 3 + dn = 4 + + +class TestSAFEGRD: """Test the SAFE GRD file handler.""" - @mock.patch("rasterio.open") - def setUp(self, mocked_rio_open): - """Set up the test case.""" - from satpy.readers.sar_c_safe import SAFEGRD - filename_info = {"mission_id": "S1A", "dataset_name": "foo", "start_time": 0, "end_time": 0, - "polarization": "vv"} - filetype_info = "bla" - self.noisefh = mock.MagicMock() - self.noisefh.get_noise_correction.return_value = xr.DataArray(np.zeros((2, 2)), dims=["y", "x"]) - self.calfh = mock.MagicMock() - self.calfh.get_calibration_constant.return_value = 1 - self.calfh.get_calibration.return_value = xr.DataArray(np.ones((2, 2)), dims=["y", "x"]) - self.annotationfh = mock.MagicMock() - - self.test_fh = SAFEGRD("S1A_IW_GRDH_1SDV_20190201T024655_20190201T024720_025730_02DC2A_AE07.SAFE/measurement/" - "s1a-iw-grd-vv-20190201t024655-20190201t024720-025730-02dc2a-001.tiff", - filename_info, filetype_info, self.calfh, self.noisefh, self.annotationfh) - self.mocked_rio_open = mocked_rio_open - - def test_instantiate(self): - """Test initialization of file handlers.""" - assert self.test_fh._polarization == "vv" - assert self.test_fh.calibration == self.calfh - assert self.test_fh.noise == self.noisefh - self.mocked_rio_open.assert_called() - - @mock.patch("xarray.open_dataset") - def test_read_calibrated_natural(self, mocked_xarray_open): - """Test the calibration routines.""" - calibration = mock.MagicMock() - calibration.name = "sigma_nought" - mocked_xarray_open.return_value.__getitem__.return_value = xr.DataArray(da.from_array(np.array([[0, 1], - [2, 3]])), - dims=["y", "x"]) - xarr = self.test_fh.get_dataset(DataQuery(name="measurement", polarization="vv", - calibration=calibration, quantity="natural"), info=dict()) - np.testing.assert_allclose(xarr, [[np.nan, 2], [5, 10]]) - - @mock.patch("xarray.open_dataset") - def test_read_calibrated_dB(self, mocked_xarray_open): + def test_read_calibrated_natural(self, measurement_filehandler): """Test the calibration routines.""" - calibration = mock.MagicMock() - calibration.name = "sigma_nought" - mocked_xarray_open.return_value.__getitem__.return_value = xr.DataArray(da.from_array(np.array([[0, 1], - [2, 3]])), - dims=["y", "x"]) - xarr = self.test_fh.get_dataset(DataQuery(name="measurement", polarization="vv", - calibration=calibration, quantity="dB"), info=dict()) - np.testing.assert_allclose(xarr, [[np.nan, 3.0103], [6.9897, 10]]) - - def test_read_lon_lats(self): - """Test reading lons and lats.""" + calibration = Calibration.sigma_nought + xarr = measurement_filehandler.get_dataset(DataQuery(name="measurement", polarization="vv", + calibration=calibration, quantity="natural"), info=dict()) + expected = np.array([[np.nan, 0.02707529], [2.55858416, 3.27611055]]) + np.testing.assert_allclose(xarr.values[:2, :2], expected, rtol=2e-7) - class FakeGCP: - - def __init__(self, *args): - self.row, self.col, self.x, self.y, self.z = args - - gcps = [FakeGCP(0, 0, 0, 0, 0), - FakeGCP(0, 3, 1, 0, 0), - FakeGCP(3, 0, 0, 1, 0), - FakeGCP(3, 3, 1, 1, 0), - FakeGCP(0, 7, 2, 0, 0), - FakeGCP(3, 7, 2, 1, 0), - FakeGCP(7, 7, 2, 2, 0), - FakeGCP(7, 3, 1, 2, 0), - FakeGCP(7, 0, 0, 2, 0), - FakeGCP(0, 15, 3, 0, 0), - FakeGCP(3, 15, 3, 1, 0), - FakeGCP(7, 15, 3, 2, 0), - FakeGCP(15, 15, 3, 3, 0), - FakeGCP(15, 7, 2, 3, 0), - FakeGCP(15, 3, 1, 3, 0), - FakeGCP(15, 0, 0, 3, 0), - ] - - crs = dict(init="epsg:4326") - - self.mocked_rio_open.return_value.gcps = [gcps, crs] - self.mocked_rio_open.return_value.shape = [16, 16] + def test_read_calibrated_dB(self, measurement_filehandler): + """Test the calibration routines.""" + calibration = Calibration.sigma_nought + xarr = measurement_filehandler.get_dataset(DataQuery(name="measurement", polarization="vv", + calibration=calibration, quantity="dB"), info=dict()) + expected = np.array([[np.nan, -15.674268], [4.079997, 5.153585]]) + np.testing.assert_allclose(xarr.values[:2, :2], expected) + def test_read_lon_lats(self, measurement_filehandler): + """Test reading lons and lats.""" query = DataQuery(name="longitude", polarization="vv") - xarr = self.test_fh.get_dataset(query, info=dict()) + xarr = measurement_filehandler.get_dataset(query, info=dict()) expected = np.array([[3.79492915e-16, 5.91666667e-01, 9.09722222e-01, 1.00000000e+00, 9.08333333e-01, 6.80555556e-01, 3.62500000e-01, 8.32667268e-17, -3.61111111e-01, @@ -212,7 +292,7 @@ def __init__(self, *args): 6.32142857e-01, 4.79166667e-01, 3.46031746e-01, 2.32142857e-01, 1.36904762e-01, 5.97222222e-02, 0.00000000e+00]]) - np.testing.assert_allclose(xarr.values, expected) + np.testing.assert_allclose(xarr.values, expected[:10, :10]) annotation_xml = b""" @@ -622,15 +702,11 @@ def __init__(self, *args): """ -class TestSAFEXMLNoise(unittest.TestCase): +class TestSAFEXMLNoise: """Test the SAFE XML Noise file handler.""" - def setUp(self): + def setup_method(self): """Set up the test case.""" - filename_info = dict(start_time=None, end_time=None, polarization="vv") - self.annotation_fh = SAFEXMLAnnotation(BytesIO(annotation_xml), filename_info, mock.MagicMock()) - self.noise_fh = SAFEXMLNoise(BytesIO(noise_xml), filename_info, mock.MagicMock(), self.annotation_fh) - self.expected_azimuth_noise = np.array([[np.nan, 1, 1, 1, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [np.nan, 1, 1, 1, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [2, 2, 3, 3, 3, 4, 4, 4, 4, np.nan], @@ -655,8 +731,6 @@ def setUp(self): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], ]) - self.noise_fh_with_holes = SAFEXMLNoise(BytesIO(noise_xml_with_holes), filename_info, mock.MagicMock(), - self.annotation_fh) self.expected_azimuth_noise_with_holes = np.array( [[np.nan, np.nan, np.nan, 1, 1, 1, np.nan, np.nan, np.nan, np.nan], [2, 2, np.nan, 1, 1, 1, np.nan, np.nan, np.nan, np.nan], @@ -670,112 +744,90 @@ def setUp(self): [10, np.nan, 11, 11, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan] ]) - def test_azimuth_noise_array(self): + def test_azimuth_noise_array(self, noise_filehandler): """Test reading the azimuth-noise array.""" - res = self.noise_fh.azimuth_noise_reader.read_azimuth_noise_array() + res = noise_filehandler.azimuth_noise_reader.read_azimuth_noise_array() np.testing.assert_array_equal(res, self.expected_azimuth_noise) - def test_azimuth_noise_array_with_holes(self): + def test_azimuth_noise_array_with_holes(self, noise_with_holes_filehandler): """Test reading the azimuth-noise array.""" - res = self.noise_fh_with_holes.azimuth_noise_reader.read_azimuth_noise_array() + res = noise_with_holes_filehandler.azimuth_noise_reader.read_azimuth_noise_array() np.testing.assert_array_equal(res, self.expected_azimuth_noise_with_holes) - def test_range_noise_array(self): + def test_range_noise_array(self, noise_filehandler): """Test reading the range-noise array.""" - res = self.noise_fh.read_range_noise_array(chunks=5) + res = noise_filehandler.read_range_noise_array(chunks=5) np.testing.assert_allclose(res, self.expected_range_noise) - def test_get_noise_dataset(self): + def test_get_noise_dataset(self, noise_filehandler): """Test using get_dataset for the noise.""" query = DataQuery(name="noise", polarization="vv") - res = self.noise_fh.get_dataset(query, {}) + res = noise_filehandler.get_dataset(query, {}) np.testing.assert_allclose(res, self.expected_azimuth_noise * self.expected_range_noise) - def test_get_noise_dataset_has_right_chunk_size(self): + def test_get_noise_dataset_has_right_chunk_size(self, noise_filehandler): """Test using get_dataset for the noise has right chunk size in result.""" query = DataQuery(name="noise", polarization="vv") - res = self.noise_fh.get_dataset(query, {}, chunks=3) + res = noise_filehandler.get_dataset(query, {}, chunks=3) assert res.data.chunksize == (3, 3) -class Calibration(Enum): - """Calibration levels.""" - - gamma = 1 - sigma_nought = 2 - beta_nought = 3 - dn = 4 - - -class TestSAFEXMLCalibration(unittest.TestCase): +class TestSAFEXMLCalibration: """Test the SAFE XML Calibration file handler.""" - def setUp(self): - """Set up the test case.""" - filename_info = dict(start_time=None, end_time=None, polarization="vv") - self.annotation_fh = SAFEXMLAnnotation(BytesIO(annotation_xml), filename_info, mock.MagicMock()) - self.calibration_fh = SAFEXMLCalibration(BytesIO(calibration_xml), - filename_info, - mock.MagicMock(), - self.annotation_fh) + def setup_method(self): + """Set up testing.""" + self.expected_gamma = np.array([[1840.695, 1779.672, 1718.649, 1452.926, 1187.203, 1186.226, + 1185.249, 1184.276, 1183.303, 1181.365]]) * np.ones((10, 1)) - self.expected_gamma = np.array([[1840.695, 1779.672, 1718.649, 1452.926, 1187.203, 1186.226, - 1185.249, 1184.276, 1183.303, 1181.365]]) * np.ones((10, 1)) - def test_dn_calibration_array(self): + def test_dn_calibration_array(self, calibration_filehandler): """Test reading the dn calibration array.""" expected_dn = np.ones((10, 10)) * 1087 - res = self.calibration_fh.get_calibration(Calibration.dn, chunks=5) + res = calibration_filehandler.get_calibration(Calibration.dn, chunks=5) np.testing.assert_allclose(res, expected_dn) - def test_beta_calibration_array(self): + def test_beta_calibration_array(self, calibration_filehandler): """Test reading the beta calibration array.""" expected_beta = np.ones((10, 10)) * 1087 - res = self.calibration_fh.get_calibration(Calibration.beta_nought, chunks=5) + res = calibration_filehandler.get_calibration(Calibration.beta_nought, chunks=5) np.testing.assert_allclose(res, expected_beta) - def test_sigma_calibration_array(self): + def test_sigma_calibration_array(self, calibration_filehandler): """Test reading the sigma calibration array.""" expected_sigma = np.array([[1894.274, 1841.4335, 1788.593, 1554.4165, 1320.24, 1299.104, 1277.968, 1277.968, 1277.968, 1277.968]]) * np.ones((10, 1)) - res = self.calibration_fh.get_calibration(Calibration.sigma_nought, chunks=5) + res = calibration_filehandler.get_calibration(Calibration.sigma_nought, chunks=5) np.testing.assert_allclose(res, expected_sigma) - def test_gamma_calibration_array(self): + + def test_gamma_calibration_array(self, calibration_filehandler): """Test reading the gamma calibration array.""" - res = self.calibration_fh.get_calibration(Calibration.gamma, chunks=5) + res = calibration_filehandler.get_calibration(Calibration.gamma, chunks=5) np.testing.assert_allclose(res, self.expected_gamma) - def test_get_calibration_dataset(self): + def test_get_calibration_dataset(self, calibration_filehandler): """Test using get_dataset for the calibration.""" query = DataQuery(name="gamma", polarization="vv") - res = self.calibration_fh.get_dataset(query, {}) + res = calibration_filehandler.get_dataset(query, {}) np.testing.assert_allclose(res, self.expected_gamma) - def test_get_calibration_dataset_has_right_chunk_size(self): + def test_get_calibration_dataset_has_right_chunk_size(self, calibration_filehandler): """Test using get_dataset for the calibration yields array with right chunksize.""" query = DataQuery(name="gamma", polarization="vv") - res = self.calibration_fh.get_dataset(query, {}, chunks=3) + res = calibration_filehandler.get_dataset(query, {}, chunks=3) assert res.data.chunksize == (3, 3) np.testing.assert_allclose(res, self.expected_gamma) - def test_get_calibration_constant(self): + def test_get_calibration_constant(self, calibration_filehandler): """Test getting the calibration constant.""" query = DataQuery(name="calibration_constant", polarization="vv") - res = self.calibration_fh.get_dataset(query, {}) + res = calibration_filehandler.get_dataset(query, {}) assert res == 1 -class TestSAFEXMLAnnotation(unittest.TestCase): - """Test the SAFE XML Annotation file handler.""" - - def setUp(self): - """Set up the test case.""" - filename_info = dict(start_time=None, end_time=None, polarization="vv") - self.annotation_fh = SAFEXMLAnnotation(BytesIO(annotation_xml), filename_info, mock.MagicMock()) - - def test_incidence_angle(self): - """Test reading the incidence angle.""" - query = DataQuery(name="incidence_angle", polarization="vv") - res = self.annotation_fh.get_dataset(query, {}) - np.testing.assert_allclose(res, 19.18318046) +def test_incidence_angle(annotation_filehandler): + """Test reading the incidence angle in an annotation file.""" + query = DataQuery(name="incidence_angle", polarization="vv") + res = annotation_filehandler.get_dataset(query, {}) + np.testing.assert_allclose(res, 19.18318046) From 2b624dcd3c430c2ff9946c23f90c125331b9f482 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Tue, 16 Jan 2024 13:39:39 +0100 Subject: [PATCH 122/481] Add a test for reading with the reader --- satpy/tests/reader_tests/test_sar_c_safe.py | 217 +++++++++++--------- 1 file changed, 121 insertions(+), 96 deletions(-) diff --git a/satpy/tests/reader_tests/test_sar_c_safe.py b/satpy/tests/reader_tests/test_sar_c_safe.py index a0e6fb8849..1f966656b7 100644 --- a/satpy/tests/reader_tests/test_sar_c_safe.py +++ b/satpy/tests/reader_tests/test_sar_c_safe.py @@ -20,10 +20,13 @@ import os from enum import Enum from io import BytesIO +from pathlib import Path import numpy as np import pytest +import yaml +from satpy._config import PACKAGE_CONFIG_PATH from satpy.dataset import DataQuery from satpy.readers.sar_c_safe import SAFEXMLAnnotation, SAFEXMLCalibration, SAFEXMLNoise @@ -164,6 +167,105 @@ def measurement_filehandler(measurement_file, annotation_filehandler, noise_file return filehandler + +expected_longitudes = np.array([[3.79492915e-16, 5.91666667e-01, 9.09722222e-01, + 1.00000000e+00, 9.08333333e-01, 6.80555556e-01, + 3.62500000e-01, 8.32667268e-17, -3.61111111e-01, + -6.75000000e-01, -8.95833333e-01, -9.77777778e-01, + -8.75000000e-01, -5.41666667e-01, 6.80555556e-02, + 1.00000000e+00], + [1.19166667e+00, 1.32437500e+00, 1.36941964e+00, + 1.34166667e+00, 1.25598214e+00, 1.12723214e+00, + 9.70282738e-01, 8.00000000e-01, 6.31250000e-01, + 4.78898810e-01, 3.57812500e-01, 2.82857143e-01, + 2.68898810e-01, 3.30803571e-01, 4.83437500e-01, + 7.41666667e-01], + [1.82638889e+00, 1.77596726e+00, 1.72667765e+00, + 1.67757937e+00, 1.62773172e+00, 1.57619402e+00, + 1.52202558e+00, 1.46428571e+00, 1.40203373e+00, + 1.33432894e+00, 1.26023065e+00, 1.17879819e+00, + 1.08909084e+00, 9.90167942e-01, 8.81088790e-01, + 7.60912698e-01], + [2.00000000e+00, 1.99166667e+00, 1.99305556e+00, + 2.00000000e+00, 2.00833333e+00, 2.01388889e+00, + 2.01250000e+00, 2.00000000e+00, 1.97222222e+00, + 1.92500000e+00, 1.85416667e+00, 1.75555556e+00, + 1.62500000e+00, 1.45833333e+00, 1.25138889e+00, + 1.00000000e+00], + [1.80833333e+00, 2.01669643e+00, 2.18011267e+00, + 2.30119048e+00, 2.38253827e+00, 2.42676446e+00, + 2.43647747e+00, 2.41428571e+00, 2.36279762e+00, + 2.28462160e+00, 2.18236607e+00, 2.05863946e+00, + 1.91605017e+00, 1.75720663e+00, 1.58471726e+00, + 1.40119048e+00], + [1.34722222e+00, 1.89627976e+00, 2.29940830e+00, + 2.57341270e+00, 2.73509779e+00, 2.80126842e+00, + 2.78872945e+00, 2.71428571e+00, 2.59474206e+00, + 2.44690334e+00, 2.28757440e+00, 2.13356009e+00, + 2.00166525e+00, 1.90869473e+00, 1.87145337e+00, + 1.90674603e+00], + [7.12500000e-01, 1.67563988e+00, 2.36250177e+00, + 2.80892857e+00, 3.05076318e+00, 3.12384850e+00, + 3.06402742e+00, 2.90714286e+00, 2.68903770e+00, + 2.44555485e+00, 2.21253720e+00, 2.02582766e+00, + 1.92126913e+00, 1.93470451e+00, 2.10197669e+00, + 2.45892857e+00], + [5.55111512e-16, 1.40000000e+00, 2.38095238e+00, + 3.00000000e+00, 3.31428571e+00, 3.38095238e+00, + 3.25714286e+00, 3.00000000e+00, 2.66666667e+00, + 2.31428571e+00, 2.00000000e+00, 1.78095238e+00, + 1.71428571e+00, 1.85714286e+00, 2.26666667e+00, + 3.00000000e+00], + [-6.94444444e-01, 1.11458333e+00, 2.36631944e+00, + 3.13888889e+00, 3.51041667e+00, 3.55902778e+00, + 3.36284722e+00, 3.00000000e+00, 2.54861111e+00, + 2.08680556e+00, 1.69270833e+00, 1.44444444e+00, + 1.42013889e+00, 1.69791667e+00, 2.35590278e+00, + 3.47222222e+00], + [-1.27500000e+00, 8.64613095e-01, 2.33016227e+00, + 3.21785714e+00, 3.62390731e+00, 3.64452239e+00, + 3.37591199e+00, 2.91428571e+00, 2.35585317e+00, + 1.79682398e+00, 1.33340774e+00, 1.06181406e+00, + 1.07825255e+00, 1.47893282e+00, 2.36006448e+00, + 3.81785714e+00], + [-1.64583333e+00, 6.95312500e-01, 2.28404018e+00, + 3.22916667e+00, 3.63950893e+00, 3.62388393e+00, + 3.29110863e+00, 2.75000000e+00, 2.10937500e+00, + 1.47805060e+00, 9.64843750e-01, 6.78571429e-01, + 7.28050595e-01, 1.22209821e+00, 2.26953125e+00, + 3.97916667e+00], + [-1.71111111e+00, 6.51904762e-01, 2.23951247e+00, + 3.16507937e+00, 3.54197279e+00, 3.48356009e+00, + 3.10320862e+00, 2.51428571e+00, 1.83015873e+00, + 1.16419501e+00, 6.29761905e-01, 3.40226757e-01, + 4.08956916e-01, 9.49319728e-01, 2.07468254e+00, + 3.89841270e+00], + [-1.37500000e+00, 7.79613095e-01, 2.20813846e+00, + 3.01785714e+00, 3.31605017e+00, 3.20999858e+00, + 2.80698342e+00, 2.21428571e+00, 1.53918651e+00, + 8.88966837e-01, 3.70907738e-01, 9.22902494e-02, + 1.60395408e-01, 6.82504252e-01, 1.76589782e+00, + 3.51785714e+00], + [-5.41666667e-01, 1.12366071e+00, 2.20147747e+00, + 2.77976190e+00, 2.94649235e+00, 2.78964711e+00, + 2.39720451e+00, 1.85714286e+00, 1.25744048e+00, + 6.86075680e-01, 2.31026786e-01, -1.97278912e-02, + 2.17899660e-02, 4.43558673e-01, 1.33355655e+00, + 2.77976190e+00], + [8.84722222e-01, 1.72927083e+00, 2.23108879e+00, + 2.44305556e+00, 2.41805060e+00, 2.20895337e+00, + 1.86864335e+00, 1.45000000e+00, 1.00590278e+00, + 5.89231151e-01, 2.52864583e-01, 4.96825397e-02, + 3.25644841e-02, 2.54389881e-01, 7.68038194e-01, + 1.62638889e+00], + [3.00000000e+00, 2.64166667e+00, 2.30853175e+00, + 2.00000000e+00, 1.71547619e+00, 1.45436508e+00, + 1.21607143e+00, 1.00000000e+00, 8.05555556e-01, + 6.32142857e-01, 4.79166667e-01, 3.46031746e-01, + 2.32142857e-01, 1.36904762e-01, 5.97222222e-02, + 0.00000000e+00]]) + + class Calibration(Enum): """Calibration levels.""" @@ -196,102 +298,7 @@ def test_read_lon_lats(self, measurement_filehandler): """Test reading lons and lats.""" query = DataQuery(name="longitude", polarization="vv") xarr = measurement_filehandler.get_dataset(query, info=dict()) - expected = np.array([[3.79492915e-16, 5.91666667e-01, 9.09722222e-01, - 1.00000000e+00, 9.08333333e-01, 6.80555556e-01, - 3.62500000e-01, 8.32667268e-17, -3.61111111e-01, - -6.75000000e-01, -8.95833333e-01, -9.77777778e-01, - -8.75000000e-01, -5.41666667e-01, 6.80555556e-02, - 1.00000000e+00], - [1.19166667e+00, 1.32437500e+00, 1.36941964e+00, - 1.34166667e+00, 1.25598214e+00, 1.12723214e+00, - 9.70282738e-01, 8.00000000e-01, 6.31250000e-01, - 4.78898810e-01, 3.57812500e-01, 2.82857143e-01, - 2.68898810e-01, 3.30803571e-01, 4.83437500e-01, - 7.41666667e-01], - [1.82638889e+00, 1.77596726e+00, 1.72667765e+00, - 1.67757937e+00, 1.62773172e+00, 1.57619402e+00, - 1.52202558e+00, 1.46428571e+00, 1.40203373e+00, - 1.33432894e+00, 1.26023065e+00, 1.17879819e+00, - 1.08909084e+00, 9.90167942e-01, 8.81088790e-01, - 7.60912698e-01], - [2.00000000e+00, 1.99166667e+00, 1.99305556e+00, - 2.00000000e+00, 2.00833333e+00, 2.01388889e+00, - 2.01250000e+00, 2.00000000e+00, 1.97222222e+00, - 1.92500000e+00, 1.85416667e+00, 1.75555556e+00, - 1.62500000e+00, 1.45833333e+00, 1.25138889e+00, - 1.00000000e+00], - [1.80833333e+00, 2.01669643e+00, 2.18011267e+00, - 2.30119048e+00, 2.38253827e+00, 2.42676446e+00, - 2.43647747e+00, 2.41428571e+00, 2.36279762e+00, - 2.28462160e+00, 2.18236607e+00, 2.05863946e+00, - 1.91605017e+00, 1.75720663e+00, 1.58471726e+00, - 1.40119048e+00], - [1.34722222e+00, 1.89627976e+00, 2.29940830e+00, - 2.57341270e+00, 2.73509779e+00, 2.80126842e+00, - 2.78872945e+00, 2.71428571e+00, 2.59474206e+00, - 2.44690334e+00, 2.28757440e+00, 2.13356009e+00, - 2.00166525e+00, 1.90869473e+00, 1.87145337e+00, - 1.90674603e+00], - [7.12500000e-01, 1.67563988e+00, 2.36250177e+00, - 2.80892857e+00, 3.05076318e+00, 3.12384850e+00, - 3.06402742e+00, 2.90714286e+00, 2.68903770e+00, - 2.44555485e+00, 2.21253720e+00, 2.02582766e+00, - 1.92126913e+00, 1.93470451e+00, 2.10197669e+00, - 2.45892857e+00], - [5.55111512e-16, 1.40000000e+00, 2.38095238e+00, - 3.00000000e+00, 3.31428571e+00, 3.38095238e+00, - 3.25714286e+00, 3.00000000e+00, 2.66666667e+00, - 2.31428571e+00, 2.00000000e+00, 1.78095238e+00, - 1.71428571e+00, 1.85714286e+00, 2.26666667e+00, - 3.00000000e+00], - [-6.94444444e-01, 1.11458333e+00, 2.36631944e+00, - 3.13888889e+00, 3.51041667e+00, 3.55902778e+00, - 3.36284722e+00, 3.00000000e+00, 2.54861111e+00, - 2.08680556e+00, 1.69270833e+00, 1.44444444e+00, - 1.42013889e+00, 1.69791667e+00, 2.35590278e+00, - 3.47222222e+00], - [-1.27500000e+00, 8.64613095e-01, 2.33016227e+00, - 3.21785714e+00, 3.62390731e+00, 3.64452239e+00, - 3.37591199e+00, 2.91428571e+00, 2.35585317e+00, - 1.79682398e+00, 1.33340774e+00, 1.06181406e+00, - 1.07825255e+00, 1.47893282e+00, 2.36006448e+00, - 3.81785714e+00], - [-1.64583333e+00, 6.95312500e-01, 2.28404018e+00, - 3.22916667e+00, 3.63950893e+00, 3.62388393e+00, - 3.29110863e+00, 2.75000000e+00, 2.10937500e+00, - 1.47805060e+00, 9.64843750e-01, 6.78571429e-01, - 7.28050595e-01, 1.22209821e+00, 2.26953125e+00, - 3.97916667e+00], - [-1.71111111e+00, 6.51904762e-01, 2.23951247e+00, - 3.16507937e+00, 3.54197279e+00, 3.48356009e+00, - 3.10320862e+00, 2.51428571e+00, 1.83015873e+00, - 1.16419501e+00, 6.29761905e-01, 3.40226757e-01, - 4.08956916e-01, 9.49319728e-01, 2.07468254e+00, - 3.89841270e+00], - [-1.37500000e+00, 7.79613095e-01, 2.20813846e+00, - 3.01785714e+00, 3.31605017e+00, 3.20999858e+00, - 2.80698342e+00, 2.21428571e+00, 1.53918651e+00, - 8.88966837e-01, 3.70907738e-01, 9.22902494e-02, - 1.60395408e-01, 6.82504252e-01, 1.76589782e+00, - 3.51785714e+00], - [-5.41666667e-01, 1.12366071e+00, 2.20147747e+00, - 2.77976190e+00, 2.94649235e+00, 2.78964711e+00, - 2.39720451e+00, 1.85714286e+00, 1.25744048e+00, - 6.86075680e-01, 2.31026786e-01, -1.97278912e-02, - 2.17899660e-02, 4.43558673e-01, 1.33355655e+00, - 2.77976190e+00], - [8.84722222e-01, 1.72927083e+00, 2.23108879e+00, - 2.44305556e+00, 2.41805060e+00, 2.20895337e+00, - 1.86864335e+00, 1.45000000e+00, 1.00590278e+00, - 5.89231151e-01, 2.52864583e-01, 4.96825397e-02, - 3.25644841e-02, 2.54389881e-01, 7.68038194e-01, - 1.62638889e+00], - [3.00000000e+00, 2.64166667e+00, 2.30853175e+00, - 2.00000000e+00, 1.71547619e+00, 1.45436508e+00, - 1.21607143e+00, 1.00000000e+00, 8.05555556e-01, - 6.32142857e-01, 4.79166667e-01, 3.46031746e-01, - 2.32142857e-01, 1.36904762e-01, 5.97222222e-02, - 0.00000000e+00]]) + expected = expected_longitudes np.testing.assert_allclose(xarr.values, expected[:10, :10]) @@ -831,3 +838,21 @@ def test_incidence_angle(annotation_filehandler): query = DataQuery(name="incidence_angle", polarization="vv") res = annotation_filehandler.get_dataset(query, {}) np.testing.assert_allclose(res, 19.18318046) + + +def test_reading_from_reader(measurement_file, calibration_file, noise_file, annotation_file): + """Test reading using the reader defined in the config.""" + with open(Path(PACKAGE_CONFIG_PATH) / "readers" / "sar-c_safe.yaml") as fd: + config = yaml.load(fd, Loader=yaml.UnsafeLoader) + reader_class = config["reader"]["reader"] + reader = reader_class(config) + + files = [measurement_file, calibration_file, noise_file, annotation_file] + reader.create_filehandlers(files) + query = DataQuery(name="measurement", polarization="vv", + calibration="sigma_nought", quantity="dB") + dataset_dict = reader.load([query]) + array = dataset_dict["measurement"] + np.testing.assert_allclose(array.attrs["area"].lons, expected_longitudes[:10, :10]) + expected_db = np.array([[np.nan, -15.674268], [4.079997, 5.153585]]) + np.testing.assert_allclose(array.values[:2, :2], expected_db) From 7c6e304cff9cd269734f3cf2f72975bd37d86f67 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Tue, 16 Jan 2024 14:48:43 +0100 Subject: [PATCH 123/481] Fix test --- satpy/tests/reader_tests/test_sar_c_safe.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/satpy/tests/reader_tests/test_sar_c_safe.py b/satpy/tests/reader_tests/test_sar_c_safe.py index 1f966656b7..f801743a08 100644 --- a/satpy/tests/reader_tests/test_sar_c_safe.py +++ b/satpy/tests/reader_tests/test_sar_c_safe.py @@ -28,6 +28,7 @@ from satpy._config import PACKAGE_CONFIG_PATH from satpy.dataset import DataQuery +from satpy.dataset.dataid import DataID from satpy.readers.sar_c_safe import SAFEXMLAnnotation, SAFEXMLCalibration, SAFEXMLNoise rasterio = pytest.importorskip("rasterio") @@ -851,6 +852,7 @@ def test_reading_from_reader(measurement_file, calibration_file, noise_file, ann reader.create_filehandlers(files) query = DataQuery(name="measurement", polarization="vv", calibration="sigma_nought", quantity="dB") + query = DataID(reader._id_keys, **query.to_dict()) dataset_dict = reader.load([query]) array = dataset_dict["measurement"] np.testing.assert_allclose(array.attrs["area"].lons, expected_longitudes[:10, :10]) From b68daa85c3c8713c7a2ebbf09dc0ab7d56fc05f8 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Wed, 17 Jan 2024 13:26:05 -0600 Subject: [PATCH 124/481] Add abi_geos to AreaDefinition so that the RGB images are named correctly. --- satpy/readers/clavrx.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index 39b3afc007..165de4e696 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -266,14 +266,24 @@ def _read_axi_fixed_grid(filename: str, sensor: str, l1b_attr) -> geometry.AreaD x, y = l1b['x'], l1b['y'] area_extent, ncols, nlines = _CLAVRxHelper._area_extent(x, y, h) - area = geometry.AreaDefinition( - 'ahi_geos', - "AHI L2 file area", - 'ahi_geos', - proj, - ncols, - nlines, - np.asarray(area_extent)) + if sensor == "abi": + area = geometry.AreaDefinition( + 'abi_geos', + "ABI L2 file area", + 'abi_geos', + proj, + ncols, + nlines, + np.asarray(area_extent)) + else: + area = geometry.AreaDefinition( + 'ahi_geos', + "AHI L2 file area", + 'ahi_geos', + proj, + ncols, + nlines, + np.asarray(area_extent)) return area From 1b2cd7ab71c88efde756199bc591a2c3be29ad64 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Thu, 18 Jan 2024 10:28:01 +0100 Subject: [PATCH 125/481] Fixing pre-commit issues --- satpy/readers/viirs_vgac_l1c_nc.py | 14 +++++----- .../reader_tests/test_viirs_vgac_l1c_nc.py | 27 +++++++++---------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index 2608d160df..1146edbf62 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -81,14 +81,14 @@ def dt64_to_datetime(self, dt64): def extract_time_data(self, data, nc): """Decode time data.""" - reference_time = np.datetime64(datetime.strptime(nc['proj_time0'].attrs["units"], - 'days since %d/%m/%YT%H:%M:%S')) - delta_part_of_day, delta_full_days = np.modf(nc['proj_time0'].values) - delta_full_days = np.timedelta64(int(delta_full_days), 'D') - delta_part_of_day = delta_part_of_day * np.timedelta64(1, 'D').astype('timedelta64[us]') - delta_hours = data.values * np.timedelta64(1, 'h').astype('timedelta64[us]') + reference_time = np.datetime64(datetime.strptime(nc["proj_time0"].attrs["units"], + "days since %d/%m/%YT%H:%M:%S")) + delta_part_of_day, delta_full_days = np.modf(nc["proj_time0"].values) + delta_full_days = np.timedelta64(int(delta_full_days), "D") + delta_part_of_day = delta_part_of_day * np.timedelta64(1, "D").astype("timedelta64[us]") + delta_hours = data.values * np.timedelta64(1, "h").astype("timedelta64[us]") time_data = xr.DataArray(reference_time + delta_full_days + delta_part_of_day + delta_hours, - coords=data.coords, attrs={'long_name': 'Scanline time'}) + coords=data.coords, attrs={"long_name": "Scanline time"}) self._start_time = self.dt64_to_datetime(time_data[0].values) self._end_time = self.dt64_to_datetime(time_data[-1].values) return time_data diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index 0120db9f66..e6f76ad641 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -40,10 +40,10 @@ def nc_filename(tmp_path): nscn = 7 npix = 800 n_lut = 12000 - nc.createDimension('npix', npix) - nc.createDimension('nscn', nscn) - nc.createDimension('n_lut', n_lut) - nc.createDimension('one', 1) + nc.createDimension("npix", npix) + nc.createDimension("nscn", nscn) + nc.createDimension("n_lut", n_lut) + nc.createDimension("one", 1) nc.StartTime = "2023-03-28T09:08:07" nc.EndTime = "2023-03-28T10:11:12" for ind in range(1, 11, 1): @@ -66,18 +66,18 @@ def nc_filename(tmp_path): reference_time = np.datetime64("2010-01-01T00:00:00") start_time = np.datetime64("2023-03-28T09:08:07") + np.timedelta64(123, "ms") delta_days = start_time - reference_time - delta_full_days = delta_days.astype('timedelta64[D]') + delta_full_days = delta_days.astype("timedelta64[D]") hidden_reference_time = reference_time + delta_full_days delta_part_of_days = start_time - hidden_reference_time - proj_time0 = nc.createVariable('proj_time0', np.float64, ("one",)) + proj_time0 = nc.createVariable("proj_time0", np.float64, ("one",)) proj_time0[:] = (delta_full_days.astype(int) + - 0.000001 * delta_part_of_days.astype('timedelta64[us]').astype(np.int64) / (60 * 60 * 24)) - proj_time0.units = 'days since 01/01/2010T00:00:00' - time_v = nc.createVariable('time', np.float64, ('nscn',)) + 0.000001 * delta_part_of_days.astype("timedelta64[us]").astype(np.int64) / (60 * 60 * 24)) + proj_time0.units = "days since 01/01/2010T00:00:00" + time_v = nc.createVariable("time", np.float64, ("nscn",)) delta_h = np.datetime64(nc.EndTime) - start_time - delta_hours = 0.000001 * delta_h.astype('timedelta64[us]').astype(int) / (60 * 60) + delta_hours = 0.000001 * delta_h.astype("timedelta64[us]").astype(int) / (60 * 60) time_v[:] = np.linspace(0, delta_hours, num=nscn) - time_v.units = 'hours since proj_time0' + time_v.units = "hours since proj_time0" return filename_str @@ -91,10 +91,9 @@ def test_read_vgac(self, nc_filename): # Read data scn_ = Scene( - reader='viirs_vgac_l1c_nc', - filenames=[_nc_filename]) + reader="viirs_vgac_l1c_nc", + filenames=[nc_filename]) scn_.load(["M05", "M15", "scanline_timestamps"]) - print(scn_["scanline_timestamps"][-1]) assert ((scn_["scanline_timestamps"][0] - np.datetime64("2023-03-28T09:08:07") - np.timedelta64(123, "ms")) < np.timedelta64(5, "us")) assert ((scn_["scanline_timestamps"][-1] - np.datetime64("2023-03-28T10:11:12")) < np.timedelta64(5, "us")) From 4fa7fbe9591772369ae61e39196f85518a13f2ab Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Thu, 18 Jan 2024 11:13:06 +0100 Subject: [PATCH 126/481] flake8 --- satpy/etc/readers/viirs_vgac_l1c_nc.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/readers/viirs_vgac_l1c_nc.yaml b/satpy/etc/readers/viirs_vgac_l1c_nc.yaml index 875cdfa2c5..33dc9571d2 100644 --- a/satpy/etc/readers/viirs_vgac_l1c_nc.yaml +++ b/satpy/etc/readers/viirs_vgac_l1c_nc.yaml @@ -256,4 +256,4 @@ datasets: proj_time0: name: proj_time0 file_type: vgac_nc - nc_key: proj_time0 \ No newline at end of file + nc_key: proj_time0 From dff503341a270b79276fc73e2678c701c517147e Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Thu, 18 Jan 2024 12:38:45 +0100 Subject: [PATCH 127/481] Added two more tests --- .../reader_tests/test_viirs_vgac_l1c_nc.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index e6f76ad641..2766ef13ec 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -25,6 +25,7 @@ import datetime import numpy as np +import xarray as xr import pytest from netCDF4 import Dataset @@ -107,3 +108,26 @@ def test_read_vgac(self, nc_filename): hour=9, minute=8, second=7) assert scn_.end_time == datetime.datetime(year=2023, month=3, day=28, hour=10, minute=11, second=12) + + def test_dt64_to_datetime(self): + from satpy.readers.viirs_vgac_l1c_nc import VGACFileHandler + fh = VGACFileHandler(filename="", + filename_info={"start_time": "2023-03-28T09:08:07"}, + filetype_info="") + in_dt = datetime.datetime(year=2023, month=3, day=28, + hour=9, minute=8, second=7) + out_dt = fh.dt64_to_datetime(in_dt) + assert out_dt == in_dt + + def test_decode_time_variable(self): + from satpy.readers.viirs_vgac_l1c_nc import VGACFileHandler + fh = VGACFileHandler(filename="", + filename_info={"start_time": "2023-03-28T09:08:07"}, + filetype_info="") + data = xr.DataArray( + [[1, 2], + [3, 4]], + dims=('y', 'x'), + attrs={"units": "something not expected"}) + with pytest.raises(AttributeError): + fh.decode_time_variable(data, "time", None) From cae8018257a54d1b353d1cc88a713e68ba9b1ea6 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Thu, 18 Jan 2024 12:42:30 +0100 Subject: [PATCH 128/481] make pre-commit happy --- satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index 2766ef13ec..883ac8c709 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -25,8 +25,8 @@ import datetime import numpy as np -import xarray as xr import pytest +import xarray as xr from netCDF4 import Dataset @@ -110,6 +110,7 @@ def test_read_vgac(self, nc_filename): hour=10, minute=11, second=12) def test_dt64_to_datetime(self): + """Test datetime conversion branch.""" from satpy.readers.viirs_vgac_l1c_nc import VGACFileHandler fh = VGACFileHandler(filename="", filename_info={"start_time": "2023-03-28T09:08:07"}, @@ -120,6 +121,7 @@ def test_dt64_to_datetime(self): assert out_dt == in_dt def test_decode_time_variable(self): + """Test decode time variable branch.""" from satpy.readers.viirs_vgac_l1c_nc import VGACFileHandler fh = VGACFileHandler(filename="", filename_info={"start_time": "2023-03-28T09:08:07"}, @@ -127,7 +129,7 @@ def test_decode_time_variable(self): data = xr.DataArray( [[1, 2], [3, 4]], - dims=('y', 'x'), + dims=("y", "x"), attrs={"units": "something not expected"}) with pytest.raises(AttributeError): fh.decode_time_variable(data, "time", None) From 81aaf034e9bf319ef1bd5eef5699494cf74e017c Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 19 Jan 2024 12:51:54 -0600 Subject: [PATCH 129/481] Fix problems with tests by splitting into separate files Check for a float32 because that is what satpy is expecting Update valid_range to list if np.ndarray to fix type error in scale_data. --- satpy/readers/clavrx.py | 3 +- .../tests/reader_tests/test_clavrx_geohdf.py | 246 ++++++++++++++++++ satpy/tests/reader_tests/test_clavrx_nc.py | 4 +- ...test_clavrx.py => test_clavrx_polarhdf.py} | 211 +-------------- 4 files changed, 251 insertions(+), 213 deletions(-) create mode 100644 satpy/tests/reader_tests/test_clavrx_geohdf.py rename satpy/tests/reader_tests/{test_clavrx.py => test_clavrx_polarhdf.py} (55%) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index 39ba70d03d..e23bde44e5 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -156,7 +156,8 @@ def _get_data(data, dataset_id: dict) -> xr.DataArray: valid_range = attrs.get("valid_range", [None]) if isinstance(valid_range, np.ndarray): - attrs["valid_range"] = valid_range.tolist() + valid_range = valid_range.tolist() + attrs["valid_range"] = valid_range flags = not data.attrs.get("SCALED", 1) and any(flag_values) if flags: diff --git a/satpy/tests/reader_tests/test_clavrx_geohdf.py b/satpy/tests/reader_tests/test_clavrx_geohdf.py new file mode 100644 index 0000000000..85a7f6faa3 --- /dev/null +++ b/satpy/tests/reader_tests/test_clavrx_geohdf.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2018 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 . +"""Module for testing the satpy.readers.clavrx module.""" + +import os +import unittest +from unittest import mock + +import numpy as np +import pytest +import xarray as xr +from pyresample.geometry import AreaDefinition + +from satpy.tests.reader_tests.test_hdf4_utils import FakeHDF4FileHandler + +DEFAULT_FILE_DTYPE = np.uint16 +DEFAULT_FILE_SHAPE = (10, 300) +DEFAULT_FILE_DATA = np.arange(DEFAULT_FILE_SHAPE[0] * DEFAULT_FILE_SHAPE[1], + dtype=DEFAULT_FILE_DTYPE).reshape(DEFAULT_FILE_SHAPE) +DEFAULT_FILE_FACTORS = np.array([2.0, 1.0], dtype=np.float32) +DEFAULT_LAT_DATA = np.linspace(45, 65, DEFAULT_FILE_SHAPE[1]).astype(DEFAULT_FILE_DTYPE) +DEFAULT_LAT_DATA = np.repeat([DEFAULT_LAT_DATA], DEFAULT_FILE_SHAPE[0], axis=0) +DEFAULT_LON_DATA = np.linspace(5, 45, DEFAULT_FILE_SHAPE[1]).astype(DEFAULT_FILE_DTYPE) +DEFAULT_LON_DATA = np.repeat([DEFAULT_LON_DATA], DEFAULT_FILE_SHAPE[0], axis=0) + +class FakeHDF4FileHandlerGeo(FakeHDF4FileHandler): + """Swap-in HDF4 File Handler.""" + + def get_test_content(self, filename, filename_info, filetype_info): + """Mimic reader input file content.""" + file_content = { + "/attr/platform": "HIM8", + "/attr/sensor": "AHI", + # this is a Level 2 file that came from a L1B file + "/attr/L1B": "clavrx_H08_20180806_1800", + } + + file_content["longitude"] = xr.DataArray( + DEFAULT_LON_DATA, + dims=("y", "x"), + attrs={ + "_FillValue": np.nan, + "scale_factor": 1., + "add_offset": 0., + "standard_name": "longitude", + }) + file_content["longitude/shape"] = DEFAULT_FILE_SHAPE + + file_content["latitude"] = xr.DataArray( + DEFAULT_LAT_DATA, + dims=("y", "x"), + attrs={ + "_FillValue": np.nan, + "scale_factor": 1., + "add_offset": 0., + "standard_name": "latitude", + }) + file_content["latitude/shape"] = DEFAULT_FILE_SHAPE + + file_content["refl_1_38um_nom"] = xr.DataArray( + DEFAULT_FILE_DATA.astype(np.float32), + dims=("y", "x"), + attrs={ + "SCALED": 1, + "add_offset": 59.0, + "scale_factor": 0.0018616290763020515, + "units": "%", + "_FillValue": -32768, + "valid_range": [-32767, 32767], + "actual_range": [-2., 120.], + "actual_missing": -999.0 + }) + file_content["refl_1_38um_nom/shape"] = DEFAULT_FILE_SHAPE + + # data with fill values + file_content["variable2"] = xr.DataArray( + DEFAULT_FILE_DATA.astype(np.float32), + dims=("y", "x"), + attrs={ + "_FillValue": -1, + "scale_factor": 1., + "add_offset": 0., + "units": "1", + }) + file_content["variable2/shape"] = DEFAULT_FILE_SHAPE + file_content["variable2"] = file_content["variable2"].where( + file_content["variable2"] % 2 != 0) + + # category + file_content["variable3"] = xr.DataArray( + DEFAULT_FILE_DATA.astype(np.byte), + dims=("y", "x"), + attrs={ + "SCALED": 0, + "_FillValue": -128, + "flag_meanings": "clear water supercooled mixed ice unknown", + "flag_values": [0, 1, 2, 3, 4, 5], + "units": "1", + }) + file_content["variable3/shape"] = DEFAULT_FILE_SHAPE + + return file_content + + +class TestCLAVRXReaderGeo(unittest.TestCase): + """Test CLAVR-X Reader with Geo files.""" + + yaml_file = "clavrx.yaml" + + def setUp(self): + """Wrap HDF4 file handler with our own fake handler.""" + from satpy._config import config_search_paths + from satpy.readers.clavrx import CLAVRXHDF4FileHandler + self.reader_configs = config_search_paths(os.path.join("readers", self.yaml_file)) + # http://stackoverflow.com/questions/12219967/how-to-mock-a-base-class-with-python-mock-library + self.p = mock.patch.object(CLAVRXHDF4FileHandler, "__bases__", (FakeHDF4FileHandlerGeo,)) + self.fake_handler = self.p.start() + self.p.is_local = True + + def tearDown(self): + """Stop wrapping the NetCDF4 file handler.""" + self.p.stop() + + def test_init(self): + """Test basic init with no extra parameters.""" + from satpy.readers import load_reader + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames([ + "clavrx_H08_20180806_1800.level2.hdf", + ]) + assert len(loadables) == 1 + r.create_filehandlers(loadables) + # make sure we have some files + assert r.file_handlers + + def test_no_nav_donor(self): + """Test exception raised when no donor file is available.""" + import xarray as xr + + from satpy.readers import load_reader + r = load_reader(self.reader_configs) + fake_fn = "clavrx_H08_20180806_1800.level2.hdf" + with mock.patch("satpy.readers.clavrx.SDS", xr.DataArray): + loadables = r.select_files_from_pathnames([fake_fn]) + r.create_filehandlers(loadables) + l1b_base = fake_fn.split(".")[0] + msg = f"Missing navigation donor {l1b_base}" + with pytest.raises(IOError, match=msg): + r.load(["refl_1_38um_nom", "variable2", "variable3"]) + + def test_load_all_old_donor(self): + """Test loading all test datasets with old donor.""" + import xarray as xr + + from satpy.readers import load_reader + r = load_reader(self.reader_configs) + with mock.patch("satpy.readers.clavrx.SDS", xr.DataArray): + loadables = r.select_files_from_pathnames([ + "clavrx_H08_20180806_1800.level2.hdf", + ]) + r.create_filehandlers(loadables) + with mock.patch("satpy.readers.clavrx.glob") as g, mock.patch("satpy.readers.clavrx.netCDF4.Dataset") as d: + g.return_value = ["fake_donor.nc"] + x = np.linspace(-0.1518, 0.1518, 300) + y = np.linspace(0.1518, -0.1518, 10) + proj = mock.Mock( + semi_major_axis=6378.137, + semi_minor_axis=6356.7523142, + perspective_point_height=35791, + longitude_of_projection_origin=140.7, + sweep_angle_axis="y", + ) + d.return_value = fake_donor = mock.MagicMock( + variables={"Projection": proj, "x": x, "y": y}, + ) + fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] + datasets = r.load(["refl_1_38um_nom", "variable2", "variable3"]) + assert len(datasets) == 3 + for v in datasets.values(): + assert "calibration" not in v.attrs + assert v.attrs["units"] in ["1", "%"] + assert isinstance(v.attrs["area"], AreaDefinition) + if v.attrs.get("flag_values"): + assert "_FillValue" in v.attrs + else: + assert "_FillValue" not in v.attrs + if v.attrs["name"] == "refl_1_38um_nom": + assert "valid_range" in v.attrs + assert isinstance(v.attrs["valid_range"], list) + else: + assert "valid_range" not in v.attrs + if "flag_values" in v.attrs: + assert np.issubdtype(v.dtype, np.integer) + assert v.attrs.get("flag_meanings") is not None + + def test_load_all_new_donor(self): + """Test loading all test datasets with new donor.""" + import xarray as xr + + from satpy.readers import load_reader + r = load_reader(self.reader_configs) + with mock.patch("satpy.readers.clavrx.SDS", xr.DataArray): + loadables = r.select_files_from_pathnames([ + "clavrx_H08_20180806_1800.level2.hdf", + ]) + r.create_filehandlers(loadables) + with mock.patch("satpy.readers.clavrx.glob") as g, mock.patch("satpy.readers.clavrx.netCDF4.Dataset") as d: + g.return_value = ["fake_donor.nc"] + x = np.linspace(-0.1518, 0.1518, 300) + y = np.linspace(0.1518, -0.1518, 10) + proj = mock.Mock( + semi_major_axis=6378137, + semi_minor_axis=6356752.3142, + perspective_point_height=35791000, + longitude_of_projection_origin=140.7, + sweep_angle_axis="y", + ) + d.return_value = fake_donor = mock.MagicMock( + variables={"goes_imager_projection": proj, "x": x, "y": y}, + ) + fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] + datasets = r.load(["refl_1_38um_nom", "variable2", "variable3"]) + assert len(datasets) == 3 + for v in datasets.values(): + assert "calibration" not in v.attrs + assert v.attrs["units"] in ["1", "%"] + assert isinstance(v.attrs["area"], AreaDefinition) + assert v.attrs["area"].is_geostationary is True + assert v.attrs["platform_name"] == "himawari8" + assert v.attrs["sensor"] == "ahi" + assert datasets["variable3"].attrs.get("flag_meanings") is not None diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index 50b07306de..5f3e82f1dc 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -210,7 +210,7 @@ def test_load_all_new_donor(self, filenames, loadable_ids): # should have file variable and one alias for reflectance assert "valid_range" not in datasets["variable1"].attrs assert "_FillValue" not in datasets["variable1"].attrs - assert np.float64 == datasets["variable1"].dtype + assert np.float32 == datasets["variable1"].dtype assert "valid_range" not in datasets["variable1"].attrs assert np.issubdtype(datasets["var_flags"].dtype, np.integer) @@ -220,7 +220,7 @@ def test_load_all_new_donor(self, filenames, loadable_ids): assert "valid_range" not in datasets["out_of_range_flags"].attrs assert isinstance(datasets["refl_0_65um_nom"].valid_range, list) - assert np.float64 == datasets["refl_0_65um_nom"].dtype + assert np.float32 == datasets["refl_0_65um_nom"].dtype assert "_FillValue" not in datasets["refl_0_65um_nom"].attrs assert "valid_range" in datasets["refl_0_65um_nom"].attrs diff --git a/satpy/tests/reader_tests/test_clavrx.py b/satpy/tests/reader_tests/test_clavrx_polarhdf.py similarity index 55% rename from satpy/tests/reader_tests/test_clavrx.py rename to satpy/tests/reader_tests/test_clavrx_polarhdf.py index a962afacd2..6b69d8a923 100644 --- a/satpy/tests/reader_tests/test_clavrx.py +++ b/satpy/tests/reader_tests/test_clavrx_polarhdf.py @@ -23,9 +23,8 @@ import dask.array as da import numpy as np -import pytest import xarray as xr -from pyresample.geometry import AreaDefinition, SwathDefinition +from pyresample.geometry import SwathDefinition from satpy.tests.reader_tests.test_hdf4_utils import FakeHDF4FileHandler @@ -258,211 +257,3 @@ def test_load_all(self): assert v.attrs["area"].lons.attrs["rows_per_scan"] == 16 assert v.attrs["area"].lats.attrs["rows_per_scan"] == 16 assert isinstance(datasets["variable3"].attrs.get("flag_meanings"), list) - - -class FakeHDF4FileHandlerGeo(FakeHDF4FileHandler): - """Swap-in HDF4 File Handler.""" - - def get_test_content(self, filename, filename_info, filetype_info): - """Mimic reader input file content.""" - file_content = { - "/attr/platform": "HIM8", - "/attr/sensor": "AHI", - # this is a Level 2 file that came from a L1B file - "/attr/L1B": "clavrx_H08_20180806_1800", - } - - file_content["longitude"] = xr.DataArray( - DEFAULT_LON_DATA, - dims=("y", "x"), - attrs={ - "_FillValue": np.nan, - "scale_factor": 1., - "add_offset": 0., - "standard_name": "longitude", - }) - file_content["longitude/shape"] = DEFAULT_FILE_SHAPE - - file_content["latitude"] = xr.DataArray( - DEFAULT_LAT_DATA, - dims=("y", "x"), - attrs={ - "_FillValue": np.nan, - "scale_factor": 1., - "add_offset": 0., - "standard_name": "latitude", - }) - file_content["latitude/shape"] = DEFAULT_FILE_SHAPE - - file_content["refl_1_38um_nom"] = xr.DataArray( - DEFAULT_FILE_DATA.astype(np.float32), - dims=("y", "x"), - attrs={ - "SCALED": 1, - "add_offset": 59.0, - "scale_factor": 0.0018616290763020515, - "units": "%", - "_FillValue": -32768, - "valid_range": [-32767, 32767], - "actual_range": [-2., 120.], - "actual_missing": -999.0 - }) - file_content["refl_1_38um_nom/shape"] = DEFAULT_FILE_SHAPE - - # data with fill values - file_content["variable2"] = xr.DataArray( - DEFAULT_FILE_DATA.astype(np.float32), - dims=("y", "x"), - attrs={ - "_FillValue": -1, - "scale_factor": 1., - "add_offset": 0., - "units": "1", - }) - file_content["variable2/shape"] = DEFAULT_FILE_SHAPE - file_content["variable2"] = file_content["variable2"].where( - file_content["variable2"] % 2 != 0) - - # category - file_content["variable3"] = xr.DataArray( - DEFAULT_FILE_DATA.astype(np.byte), - dims=("y", "x"), - attrs={ - "SCALED": 0, - "_FillValue": -128, - "flag_meanings": "clear water supercooled mixed ice unknown", - "flag_values": [0, 1, 2, 3, 4, 5], - "units": "1", - }) - file_content["variable3/shape"] = DEFAULT_FILE_SHAPE - - return file_content - - -class TestCLAVRXReaderGeo(unittest.TestCase): - """Test CLAVR-X Reader with Geo files.""" - - yaml_file = "clavrx.yaml" - - def setUp(self): - """Wrap HDF4 file handler with our own fake handler.""" - from satpy._config import config_search_paths - from satpy.readers.clavrx import CLAVRXHDF4FileHandler - self.reader_configs = config_search_paths(os.path.join("readers", self.yaml_file)) - # http://stackoverflow.com/questions/12219967/how-to-mock-a-base-class-with-python-mock-library - self.p = mock.patch.object(CLAVRXHDF4FileHandler, "__bases__", (FakeHDF4FileHandlerGeo,)) - self.fake_handler = self.p.start() - self.p.is_local = True - - def tearDown(self): - """Stop wrapping the NetCDF4 file handler.""" - self.p.stop() - - def test_init(self): - """Test basic init with no extra parameters.""" - from satpy.readers import load_reader - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames([ - "clavrx_H08_20180806_1800.level2.hdf", - ]) - assert len(loadables) == 1 - r.create_filehandlers(loadables) - # make sure we have some files - assert r.file_handlers - - def test_no_nav_donor(self): - """Test exception raised when no donor file is available.""" - import xarray as xr - - from satpy.readers import load_reader - r = load_reader(self.reader_configs) - fake_fn = "clavrx_H08_20180806_1800.level2.hdf" - with mock.patch("satpy.readers.clavrx.SDS", xr.DataArray): - loadables = r.select_files_from_pathnames([fake_fn]) - r.create_filehandlers(loadables) - l1b_base = fake_fn.split(".")[0] - msg = f"Missing navigation donor {l1b_base}" - with pytest.raises(IOError, match=msg): - r.load(["refl_1_38um_nom", "variable2", "variable3"]) - - def test_load_all_old_donor(self): - """Test loading all test datasets with old donor.""" - import xarray as xr - - from satpy.readers import load_reader - r = load_reader(self.reader_configs) - with mock.patch("satpy.readers.clavrx.SDS", xr.DataArray): - loadables = r.select_files_from_pathnames([ - "clavrx_H08_20180806_1800.level2.hdf", - ]) - r.create_filehandlers(loadables) - with mock.patch("satpy.readers.clavrx.glob") as g, mock.patch("satpy.readers.clavrx.netCDF4.Dataset") as d: - g.return_value = ["fake_donor.nc"] - x = np.linspace(-0.1518, 0.1518, 300) - y = np.linspace(0.1518, -0.1518, 10) - proj = mock.Mock( - semi_major_axis=6378.137, - semi_minor_axis=6356.7523142, - perspective_point_height=35791, - longitude_of_projection_origin=140.7, - sweep_angle_axis="y", - ) - d.return_value = fake_donor = mock.MagicMock( - variables={"Projection": proj, "x": x, "y": y}, - ) - fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] - datasets = r.load(["refl_1_38um_nom", "variable2", "variable3"]) - assert len(datasets) == 3 - for v in datasets.values(): - assert "calibration" not in v.attrs - assert v.attrs["units"] in ["1", "%"] - assert isinstance(v.attrs["area"], AreaDefinition) - if v.attrs.get("flag_values"): - assert "_FillValue" in v.attrs - else: - assert "_FillValue" not in v.attrs - if v.attrs["name"] == "refl_1_38um_nom": - assert "valid_range" in v.attrs - assert isinstance(v.attrs["valid_range"], list) - else: - assert "valid_range" not in v.attrs - if "flag_values" in v.attrs: - assert np.issubdtype(v.dtype, np.integer) - assert v.attrs.get("flag_meanings") is not None - - def test_load_all_new_donor(self): - """Test loading all test datasets with new donor.""" - import xarray as xr - - from satpy.readers import load_reader - r = load_reader(self.reader_configs) - with mock.patch("satpy.readers.clavrx.SDS", xr.DataArray): - loadables = r.select_files_from_pathnames([ - "clavrx_H08_20180806_1800.level2.hdf", - ]) - r.create_filehandlers(loadables) - with mock.patch("satpy.readers.clavrx.glob") as g, mock.patch("satpy.readers.clavrx.netCDF4.Dataset") as d: - g.return_value = ["fake_donor.nc"] - x = np.linspace(-0.1518, 0.1518, 300) - y = np.linspace(0.1518, -0.1518, 10) - proj = mock.Mock( - semi_major_axis=6378137, - semi_minor_axis=6356752.3142, - perspective_point_height=35791000, - longitude_of_projection_origin=140.7, - sweep_angle_axis="y", - ) - d.return_value = fake_donor = mock.MagicMock( - variables={"goes_imager_projection": proj, "x": x, "y": y}, - ) - fake_donor.__getitem__.side_effect = lambda key: fake_donor.variables[key] - datasets = r.load(["refl_1_38um_nom", "variable2", "variable3"]) - assert len(datasets) == 3 - for v in datasets.values(): - assert "calibration" not in v.attrs - assert v.attrs["units"] in ["1", "%"] - assert isinstance(v.attrs["area"], AreaDefinition) - assert v.attrs["area"].is_geostationary is True - assert v.attrs["platform_name"] == "himawari8" - assert v.attrs["sensor"] == "ahi" - assert datasets["variable3"].attrs.get("flag_meanings") is not None From 40e6ad5ebd860b11c38abb9acfd97640596afc12 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 22 Jan 2024 15:26:04 +0100 Subject: [PATCH 130/481] add missing units. Remove radiance_mean__ --- satpy/etc/readers/fci_l2_nc.yaml | 724 +------------------------------ 1 file changed, 4 insertions(+), 720 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index daca83ada1..e3e063f09b 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -1768,6 +1768,7 @@ datasets: file_type: nc_fci_asr nc_key: quality_radiance fill_value: -1 + units: '%' coordinates: - longitude - latitude @@ -1778,6 +1779,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr nc_key: land_pixel_percent + units: '%' coordinates: - longitude - latitude @@ -1788,6 +1790,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr nc_key: water_pixel_percent + units: '%' coordinates: - longitude - latitude @@ -1798,6 +1801,7 @@ datasets: resolution: 32000 file_type: nc_fci_asr nc_key: pixel_percentage + units: '%' coordinates: - longitude - latitude @@ -2546,726 +2550,6 @@ datasets: - longitude - latitude - radiance_mean_all_vis04: - name: radiance_mean_all_vis04 - long_name: TOA Radiance Segment mean at 0.44um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 0 - wavelength: [0.384, 0.444, 0.504] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_vis04: - name: radiance_mean_clear_vis04 - long_name: TOA Radiance Segment mean at 0.44um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 0 - wavelength: [0.384, 0.444, 0.504] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_vis04: - name: radiance_mean_cloudy_vis04 - long_name: TOA Radiance Segment mean at 0.44um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 0 - wavelength: [0.384, 0.444, 0.504] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_vis05: - name: radiance_mean_all_vis05 - long_name: TOA Radiance Segment mean at 0.51um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 1 - wavelength: [0.47, 0.51, 0.55] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_vis05: - name: radiance_mean_clear_vis05 - long_name: TOA Radiance Segment mean at 0.51um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 1 - wavelength: [0.47, 0.51, 0.55] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_vis05: - name: radiance_mean_cloudy_vis05 - long_name: TOA Radiance Segment mean at 0.51um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 1 - wavelength: [0.47, 0.51, 0.55] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_vis06: - name: radiance_mean_all_vis06 - long_name: TOA Radiance Segment mean at 0.64um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 2 - wavelength: [0.59, 0.64, 0.69] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_vis06: - name: radiance_mean_clear_vis06 - long_name: TOA Radiance Segment mean at 0.64um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 2 - wavelength: [0.59, 0.64, 0.69] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_vis06: - name: radiance_mean_cloudy_vis06 - long_name: TOA Radiance Segment mean at 0.64um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 2 - wavelength: [0.59, 0.64, 0.69] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_vis08: - name: radiance_mean_all_vis08 - long_name: TOA Radiance Segment mean at 0.86um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 3 - wavelength: [0.815, 0.865, 0.915] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_vis08: - name: radiance_mean_clear_vis08 - long_name: TOA Radiance Segment mean at 0.86um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 3 - wavelength: [0.815, 0.865, 0.915] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_vis08: - name: radiance_mean_cloudy_vis08 - long_name: TOA Radiance Segment mean at 0.86um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 3 - wavelength: [0.815, 0.865, 0.915] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_vis09: - name: radiance_mean_all_vis09 - long_name: TOA Radiance Segment mean at 0.91um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 4 - wavelength: [0.894, 0.914, 0.934] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_vis09: - name: radiance_mean_clear_vis09 - long_name: TOA Radiance Segment mean at 0.91um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 4 - wavelength: [0.894, 0.914, 0.934] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_vis09: - name: radiance_mean_cloudy_vis09 - long_name: TOA Radiance Segment mean at 0.91um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 4 - wavelength: [0.894, 0.914, 0.934] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_nir13: - name: radiance_mean_all_nir13 - long_name: TOA Radiance Segment mean at 1.38um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 5 - wavelength: [1.35, 1.38, 1.41] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_nir13: - name: radiance_mean_clear_nir13 - long_name: TOA Radiance Segment mean at 1.38um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 5 - wavelength: [1.35, 1.38, 1.41] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_nir13: - name: radiance_mean_cloudy_nir13 - long_name: TOA Radiance Segment mean at 1.38um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 5 - wavelength: [1.35, 1.38, 1.41] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_nir16: - name: radiance_mean_all_nir16 - long_name: TOA Radiance Segment mean at 1.61um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 6 - wavelength: [1.56, 1.61, 1.66] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_nir16: - name: radiance_mean_clear_nir16 - long_name: TOA Radiance Segment mean at 1.61um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 6 - wavelength: [1.56, 1.61, 1.66] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_nir16: - name: radiance_mean_cloudy_nir16 - long_name: TOA Radiance Segment mean at 1.61um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 6 - wavelength: [1.56, 1.61, 1.66] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_nir22: - name: radiance_mean_all_nir22 - long_name: TOA Radiance Segment mean at 2.25um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 7 - wavelength: [2.2, 2.25, 2.3] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_nir22: - name: radiance_mean_clear_nir22 - long_name: TOA Radiance Segment mean at 2.25um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 7 - wavelength: [2.2, 2.25, 2.3] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_nir22: - name: radiance_mean_cloudy_nir22 - long_name: TOA Radiance Segment mean at 2.25um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 7 - wavelength: [2.2, 2.25, 2.3] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_ir38: - name: radiance_mean_all_ir38 - long_name: TOA Radiance Segment mean at 3.80um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 8 - wavelength: [3.4, 3.8, 4.2] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_ir38: - name: radiance_mean_clear_ir38 - long_name: TOA Radiance Segment mean at 3.80um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 8 - wavelength: [3.4, 3.8, 4.2] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_ir38: - name: radiance_mean_cloudy_ir38 - long_name: TOA Radiance Segment mean at 3.80um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 8 - wavelength: [3.4, 3.8, 4.2] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_wv63: - name: radiance_mean_all_wv63 - long_name: TOA Radiance Segment mean at 6.30um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 9 - wavelength: [5.3, 6.3, 7.3] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_wv63: - name: radiance_mean_clear_wv63 - long_name: TOA Radiance Segment mean at 6.30um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 9 - wavelength: [5.3, 6.3, 7.3] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_wv63: - name: radiance_mean_cloudy_wv63 - long_name: TOA Radiance Segment mean at 6.30um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 9 - wavelength: [5.3, 6.3, 7.3] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_wv73: - name: radiance_mean_all_wv73 - long_name: TOA Radiance Segment mean at 7.35um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 10 - wavelength: [6.85, 7.35, 7.85] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_wv73: - name: radiance_mean_clear_wv73 - long_name: TOA Radiance Segment mean at 7.35um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 10 - wavelength: [6.85, 7.35, 7.85] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_wv73: - name: radiance_mean_cloudy_wv73 - long_name: TOA Radiance Segment mean at 7.35um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 10 - wavelength: [6.85, 7.35, 7.85] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_ir87: - name: radiance_mean_all_ir87 - long_name: TOA Radiance Segment mean at 8.70um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 11 - wavelength: [8.3, 8.7, 9.1] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_ir87: - name: radiance_mean_clear_ir87 - long_name: TOA Radiance Segment mean at 8.70um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 11 - wavelength: [8.3, 8.7, 9.1] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_ir87: - name: radiance_mean_cloudy_ir87 - long_name: TOA Radiance Segment mean at 8.70um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 11 - wavelength: [8.3, 8.7, 9.1] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_ir97: - name: radiance_mean_all_ir97 - long_name: TOA Radiance Segment mean at 9.66um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 12 - wavelength: [9.36, 9.66, 9.96] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_ir97: - name: radiance_mean_clear_ir97 - long_name: TOA Radiance Segment mean at 9.66um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 12 - wavelength: [9.36, 9.66, 9.96] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_ir97: - name: radiance_mean_cloudy_ir97 - long_name: TOA Radiance Segment mean at 9.66um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 12 - wavelength: [9.36, 9.66, 9.96] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_ir105: - name: radiance_mean_all_ir105 - long_name: TOA Radiance Segment mean at 10.50um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 13 - wavelength: [9.8, 10.5, 11.2] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_ir105: - name: radiance_mean_clear_ir105 - long_name: TOA Radiance Segment mean at 10.50um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 13 - wavelength: [9.8, 10.5, 11.2] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_ir105: - name: radiance_mean_cloudy_ir105 - long_name: TOA Radiance Segment mean at 10.50um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 13 - wavelength: [9.8, 10.5, 11.2] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_ir123: - name: radiance_mean_all_ir123 - long_name: TOA Radiance Segment mean at 12.30um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 14 - wavelength: [11.8, 12.3, 12.8] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_ir123: - name: radiance_mean_clear_ir123 - long_name: TOA Radiance Segment mean at 12.30um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 14 - wavelength: [11.8, 12.3, 12.8] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_ir123: - name: radiance_mean_cloudy_ir123 - long_name: TOA Radiance Segment mean at 12.30um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 14 - wavelength: [11.8, 12.3, 12.8] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_all_ir133: - name: radiance_mean_all_ir133 - long_name: TOA Radiance Segment mean at 13.30um (all pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 15 - wavelength: [12.7, 13.3, 13.9] - category_id: 0 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_clear_ir133: - name: radiance_mean_clear_ir133 - long_name: TOA Radiance Segment mean at 13.30um (clear pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 15 - wavelength: [12.7, 13.3, 13.9] - category_id: 1 - cell_method: area:mean - coordinates: - - longitude - - latitude - - radiance_mean_cloudy_ir133: - name: radiance_mean_cloudy_ir133 - long_name: TOA Radiance Segment mean at 13.30um (cloudy pixels) - standard_name: toa_outgoing_radiance - resolution: 32000 - file_type: nc_fci_asr - nc_key: radiance_mean - channel_id: 15 - wavelength: [12.7, 13.3, 13.9] - category_id: 2 - cell_method: area:mean - coordinates: - - longitude - - latitude - quality_reflectance_all_vis04: name: quality_reflectance_all_vis04 long_name: TOA Bidirectional Reflectance % Confidence at 0.44um (all pixels) From bf543d10f751c4d10f0377039e703cfe0a73a8aa Mon Sep 17 00:00:00 2001 From: David Hoese Date: Wed, 24 Jan 2024 10:30:20 -0600 Subject: [PATCH 131/481] Fix AGRI L1 C07 having a valid LUT value for its fill value --- satpy/readers/fy4_base.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/satpy/readers/fy4_base.py b/satpy/readers/fy4_base.py index 144e559858..4a3c0bc625 100644 --- a/satpy/readers/fy4_base.py +++ b/satpy/readers/fy4_base.py @@ -28,6 +28,7 @@ import dask.array as da import numpy as np +import numpy.typing as npt import xarray as xr from satpy._compat import cached_property @@ -86,7 +87,7 @@ def scale(dn, slope, offset): return ref - def apply_lut(self, data, lut): + def _apply_lut(self, data: xr.DataArray, lut: npt.NDArray[np.float32]) -> xr.DataArray: """Calibrate digital number (DN) by applying a LUT. Args: @@ -96,8 +97,15 @@ def apply_lut(self, data, lut): Calibrated quantity """ # append nan to the end of lut for fillvalue - lut = np.append(lut, np.nan) - data.data = da.where(data.data > lut.shape[0], lut.shape[0] - 1, data.data) + fill_value = data.attrs.get("FillValue") + if fill_value is not None: + if fill_value.item() > lut.shape[0] - 1: + lut = np.append(lut, np.nan) + data.data = da.where(data.data > lut.shape[0], lut.shape[0] - 1, data.data) + else: + # Ex. C07 has a LUT of 65536 elements, but fill value is 65535 + # This is considered a bug in the input file format + lut[fill_value] = np.nan res = data.data.map_blocks(self._getitem, lut, dtype=lut.dtype) res = xr.DataArray(res, dims=data.dims, attrs=data.attrs, coords=data.coords) @@ -182,7 +190,7 @@ def calibrate_to_bt(self, data, ds_info, ds_name): lut = self[lut_key] # the value of dn is the index of brightness_temperature - data = self.apply_lut(data, lut) + data = self._apply_lut(data, lut.compute().data) ds_info["valid_range"] = lut.attrs["valid_range"] return data From 8efe73b8280de17bd85f5a7e6823508e79df9c9d Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Wed, 24 Jan 2024 16:32:25 +0000 Subject: [PATCH 132/481] Viirs_l2 initial commit --- satpy/etc/enhancements/viirs.yaml | 87 +++++++++++ satpy/etc/readers/viirs_l2.yaml | 130 +++++++++++++++++ satpy/readers/viirs_l2.py | 168 ++++++++++++++++++++++ satpy/readers/yaml_reader.py | 8 +- satpy/tests/reader_tests/test_viirs_l2.py | 149 +++++++++++++++++++ 5 files changed, 536 insertions(+), 6 deletions(-) create mode 100644 satpy/etc/readers/viirs_l2.yaml create mode 100644 satpy/readers/viirs_l2.py create mode 100644 satpy/tests/reader_tests/test_viirs_l2.py diff --git a/satpy/etc/enhancements/viirs.yaml b/satpy/etc/enhancements/viirs.yaml index 8b3751167d..a21e47aa7f 100644 --- a/satpy/etc/enhancements/viirs.yaml +++ b/satpy/etc/enhancements/viirs.yaml @@ -79,3 +79,90 @@ enhancements: ], min_value: 0, max_value: 201} + + Cloud_Top_Height: + name: Cloud_Top_Height + operations: + - name: palettize + method: !!python/name:satpy.enhancements.palettize + kwargs: + palettes: + - {colors: [ + [255, 0, 0], + [170, 0, 0], + [110, 0, 0], + [112, 1, 2], + [124, 91, 5], + [240, 190, 64], + [255, 255, 0], + [0, 220, 0], + [0, 136, 0], + [0, 80, 0], + [0, 136, 238], + [0, 0, 255], + [0, 0, 170], + [0, 0, 100], + [183, 15, 141], + [102, 0, 119] + ], + values: [ + 0, + 800, + 1600, + 2350, + 3150, + 4000, + 4800, + 5600, + 6400, + 7200, + 8000, + 8800, + 9600, + 10400, + 11200, + 12000 + ], + min_value: 0, + max_value: 18000, + } + + Clear_Sky_Confidence: + name: Clear_Sky_Confidence + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - {colors: [[255, 247, 236], [254, 246, 233], [254, 244, 230], [254, 243, 228], [254, 242, 224], [254, 241, 222], [254, 239, 219], [254, 239, 216], [254, 237, 213], [254, 236, 210], [254, 235, 207], [254, 233, 204], [254, 232, 202], [253, 231, 198], [253, 230, 195], [253, 228, 191], [253, 226, 189], [253, 225, 185], [253, 223, 181], [253, 221, 178], [253, 220, 174], [253, 218, 172], [253, 216, 168], [253, 215, 165], [253, 213, 161], [253, 211, 157], [253, 210, 156], [253, 207, 153], [253, 206, 152], [253, 203, 149], [253, 202, 148], [253, 200, 145], [253, 198, 143], [253, 196, 141], [253, 193, 139], [253, 192, 137], [253, 189, 134], [253, 188, 133], [252, 185, 130], [252, 182, 127], [252, 177, 123], [252, 174, 120], [252, 170, 116], [252, 166, 112], [252, 163, 109], [252, 159, 105], [252, 156, 103], [252, 151, 99], [252, 148, 96], [252, 144, 92], [251, 140, 88], [250, 137, 87], [249, 134, 86], [248, 131, 85], [247, 127, 83], [246, 125, 82], [245, 121, 80], [244, 119, 79], [243, 115, 78], [242, 111, 76], [241, 109, 75], [240, 105, 73], [239, 102, 72], [237, 98, 69], [236, 94, 67], [234, 89, 63], [232, 86, 60], [230, 81, 57], [227, 76, 53], [226, 73, 50], [224, 68, 46], [222, 65, 44], [220, 60, 40], [218, 56, 37], [216, 51, 33], [214, 46, 30], [211, 43, 28], [208, 39, 25], [206, 36, 23], [202, 31, 20], [200, 28, 18], [197, 24, 15], [194, 21, 13], [191, 16, 10], [188, 12, 7], [185, 9, 5], [182, 4, 3], [180, 1, 1], [175, 0, 0], [172, 0, 0], [167, 0, 0], [164, 0, 0], [159, 0, 0], [154, 0, 0], [151, 0, 0], [146, 0, 0], [143, 0, 0], [138, 0, 0], [135, 0, 0], [130, 0, 0], [127, 0, 0]], + values: [0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1], + min_value: 0.0, + max_value: 1.0 + } + + + Aerosol_Optical_Thickness_550_Land_Ocean: + name: Aerosol_Optical_Thickness_550_Land_Ocean + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - {colors: 'ylorrd', + min_value: 0.0, + max_value: 1.0, + } + + Angstrom_Exponent_Land_Ocean: + name: Angstrom_Exponent_Land_Ocean + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - {colors: [[122, 145, 2], [123, 148, 3], [124, 150, 4], [124, 153, 5], [125, 155, 6], [126, 158, 7], [127, 160, 8], [127, 163, 9], [128, 165, 10], [129, 168, 11], [130, 170, 12], [130, 173, 13], [131, 175, 14], [132, 178, 15], [133, 181, 16], [132, 183, 18], [132, 185, 20], [132, 187, 22], [132, 189, 25], [132, 191, 27], [132, 193, 29], [132, 195, 31], [131, 197, 34], [131, 199, 36], [131, 201, 38], [131, 203, 40], [131, 205, 43], [131, 207, 45], [131, 209, 47], [131, 212, 50], [130, 213, 51], [129, 215, 53], [128, 217, 55], [128, 219, 57], [127, 221, 59], [126, 222, 61], [125, 224, 63], [125, 226, 64], [124, 228, 66], [123, 230, 68], [122, 231, 70], [122, 233, 72], [121, 235, 74], [120, 237, 76], [120, 239, 78], [119, 239, 79], [118, 240, 80], [117, 241, 82], [116, 242, 83], [116, 243, 85], [115, 244, 86], [114, 245, 87], [113, 246, 89], [112, 247, 90], [112, 248, 92], [111, 249, 93], [110, 250, 94], [109, 251, 96], [108, 252, 97], [108, 253, 99], [107, 252, 100], [106, 252, 102], [106, 252, 103], [105, 251, 105], [105, 251, 106], [104, 251, 108], [103, 251, 109], [103, 250, 111], [102, 250, 112], [102, 250, 114], [101, 250, 115], [100, 249, 117], [100, 249, 118], [99, 249, 120], [99, 249, 122], [98, 247, 123], [97, 246, 124], [96, 245, 126], [95, 244, 127], [94, 243, 128], [93, 242, 130], [92, 241, 131], [92, 239, 132], [91, 238, 134], [90, 237, 135], [89, 236, 136], [88, 235, 138], [87, 234, 139], [86, 233, 140], [86, 232, 142], [85, 230, 143], [84, 229, 144], [83, 228, 145], [82, 226, 147], [81, 225, 148], [80, 224, 149], [79, 223, 150], [78, 221, 152], [77, 220, 153], [76, 219, 154], [75, 218, 155], [74, 216, 157], [73, 215, 158], [72, 214, 159], [72, 213, 161], [71, 211, 162], [70, 209, 163], [69, 208, 164], [68, 206, 165], [67, 205, 166], [66, 203, 167], [65, 201, 168], [64, 200, 170], [63, 198, 171], [62, 197, 172], [61, 195, 173], [60, 193, 174], [59, 192, 175], [58, 190, 176], [58, 189, 178], [58, 187, 178], [58, 185, 179], [58, 184, 180], [58, 182, 181], [58, 181, 182], [58, 179, 183], [58, 178, 184], [59, 176, 184], [59, 175, 185], [59, 173, 186], [59, 172, 187], [59, 170, 188], [59, 169, 189], [59, 167, 190], [60, 166, 191], [60, 164, 191], [61, 162, 192], [61, 160, 193], [62, 158, 194], [63, 156, 195], [63, 154, 195], [64, 152, 196], [64, 150, 197], [65, 148, 198], [66, 146, 199], [66, 144, 199], [67, 142, 200], [67, 140, 201], [68, 138, 202], [69, 137, 203], [69, 135, 203], [70, 133, 204], [70, 131, 205], [71, 129, 205], [72, 128, 206], [72, 126, 207], [73, 124, 207], [73, 122, 208], [74, 120, 209], [75, 119, 209], [75, 117, 210], [76, 115, 211], [76, 113, 211], [77, 111, 212], [78, 110, 213], [78, 108, 213], [79, 106, 214], [80, 104, 214], [80, 102, 215], [81, 101, 216], [82, 99, 216], [82, 97, 217], [83, 95, 217], [84, 93, 218], [84, 92, 219], [85, 90, 219], [86, 88, 220], [86, 86, 220], [87, 84, 221], [88, 83, 222], [88, 82, 222], [89, 81, 223], [90, 80, 223], [91, 80, 224], [92, 79, 224], [93, 78, 225], [94, 77, 225], [95, 77, 226], [96, 76, 226], [97, 75, 227], [98, 74, 227], [99, 74, 228], [100, 73, 228], [101, 72, 229], [102, 72, 230], [104, 72, 230], [106, 73, 230], [108, 73, 230], [110, 74, 231], [112, 74, 231], [114, 75, 231], [116, 75, 231], [118, 76, 232], [120, 76, 232], [122, 77, 232], [124, 77, 232], [126, 78, 233], [128, 78, 233], [130, 79, 233], [133, 80, 234], [135, 80, 234], [137, 80, 234], [139, 81, 234], [141, 81, 234], [143, 81, 234], [145, 82, 234], [147, 82, 234], [149, 82, 234], [151, 83, 234], [153, 83, 234], [155, 83, 234], [157, 84, 234], [159, 84, 234], [161, 84, 234], [164, 85, 235], [165, 85, 235], [166, 85, 235], [168, 85, 235], [169, 85, 235], [171, 85, 235], [172, 85, 235], [174, 85, 235], [175, 86, 235], [177, 86, 235], [178, 86, 235], [180, 86, 235], [181, 86, 235], [183, 86, 235], [184, 86, 235], [186, 87, 235], [187, 87, 234], [188, 87, 234], [190, 87, 234], [191, 88, 234], [193, 88, 234], [194, 88, 234], [196, 88, 234], [197, 89, 234], [199, 89, 234], [200, 89, 234], [202, 89, 234]], + values: [0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39, 1.4, 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59, 1.6, 1.61, 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69, 1.7, 1.71, 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78, 1.79, 1.8, 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, 1.88, 1.89, 1.9, 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98, 1.99, 2, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4, 2.41, 2.42, 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5], + min_value: -0.5, + max_value: 2.5, + } + diff --git a/satpy/etc/readers/viirs_l2.yaml b/satpy/etc/readers/viirs_l2.yaml new file mode 100644 index 0000000000..045b69cd75 --- /dev/null +++ b/satpy/etc/readers/viirs_l2.yaml @@ -0,0 +1,130 @@ +reader: + name: viirs_l2 + short_name: VIIRS L2 + long_name: SNPP VIIRS Level 2 data in netCDF4 format + description: Generic NASA VIIRS L2 Reader + status: Alpha + supports_fsspec: false + reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader + sensors: [viirs] + default_datasets: + +file_types: + cldprop_l2_viirs: + file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler + file_patterns: + - 'CLDPROP_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + cldmsk_l2_viirs: + file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler + file_patterns: + - 'CLDMSK_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + aerdb_l2_viirs: + file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler + file_patterns: + - 'AERDB_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + aerdb_l2_viirs_nrt: + file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler + file_patterns: + - 'AERDB_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.nrt.nc' + cldir_l2_viirs: + file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler + file_patterns: + - 'CLDIR_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.hdf' + aerdt_l2_viirs: + file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler + file_patterns: + - 'AERDT_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + fsnrad_l2_viirs: + file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler + file_patterns: + - 'FSNRAD_L2_VIIRS_CRIS_SS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + +datasets: + cld_lon: + name: cld_lon + resolution: + file_type: [cldmsk_l2_viirs, cldprop_l2_viirs] + file_key: geolocation_data/longitude + units: degrees + standard_name: longitude + cld_lat: + name: cld_lat + resolution: + file_type: [cldmsk_l2_viirs, cldprop_l2_viirs] + file_key: geolocation_data/latitude + units: degrees + standard_name: latitude + aerdb_lon: + name: aerdb_lon + resolution: + file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] + file_key: Longitude + units: degrees + standard_name: Longitude + aerdb_lat: + name: aerdb_lat + resolution: + file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] + file_key: Latitude + units: degrees + standard_name: Latitude + aerdt_lon: + name: aerdt_lon + resolution: + file_type: [aerdt_l2_viirs] + file_key: longitude + units: degrees + standard_name: longitude + aerdt_lat: + name: aerdt_lat + resolution: + file_type: [aerdt_l2_viirs] + file_key: latitude + units: degrees + standard_name: latitude + +################################## +# Datasets in file cldmsk_l2_viirs +################################## + Clear_Sky_Confidence: + name: Clear_Sky_Confidence + long_name: VIIRS Clear Sky Confidence + units: None + coordinates: [cld_lon, cld_lat] + resolution: 742 + file_key: geophysical_data/Clear_Sky_Confidence + file_type: cldmsk_l2_viirs + + +################################### +# Datasets in file cldprop_l2_viirs +################################### + Cloud_Top_Height: + name: Cloud_Top_Height + long_name: Cloud Top Height from NOAA CLAVR-x AWG algorithm + units: m + coordinates: [cld_lon,cld_lat] + resolution: 742 + file_key: geophysical_data/Cloud_Top_Height + file_type: cldprop_l2_viirs + +########################################## +# Datasets in files aerdb_l2_viirs and nrt +########################################## + Angstrom_Exponent_Land_Ocean: + name: Angstrom_Exponent_Land_Ocean + long_name: Deep Blue/SOAR Angstrom exponent over land and ocean + units: None + coordinates: [aerdb_lon,aerdb_lat] + resolution: 742 + file_key: Angstrom_Exponent_Land_Ocean + file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] + + Aerosol_Optical_Thickness_550_Land_Ocean: + name: Aerosol_Optical_Thickness_550_Land_Ocean + long_name: Deep Blue/SOAR aerosol optical thickness at 550 nm over land and ocean + units: None + coordinates: [aerdb_lon,aerdb_lat] + resolution: 742 + file_key: Aerosol_Optical_Thickness_550_Land_Ocean + file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py new file mode 100644 index 0000000000..e199d75437 --- /dev/null +++ b/satpy/readers/viirs_l2.py @@ -0,0 +1,168 @@ +import logging +from datetime import datetime + +import numpy as np + +from satpy.readers.netcdf_utils import NetCDF4FileHandler +import xarray as xr +from pyresample.geometry import AreaDefinition +import numpy as np + +LOG = logging.getLogger(__name__) + + +class VIIRSL2FileHandler(NetCDF4FileHandler): + def _parse_datetime(self, datestr): + """Parse datetime.""" + return datetime.strptime(datestr, "%Y-%m-%dT%H:%M:%S.000Z") + + @property + def start_time(self): + """Get start time.""" + return self._parse_datetime(self["/attr/time_coverage_start"]) + + @property + def end_time(self): + """Get end time.""" + return self._parse_datetime(self["/attr/time_coverage_end"]) + + @property + def start_orbit_number(self): + """Get start orbit number.""" + try: + return int(self["/attr/orbit_number"]) + except KeyError: + return int(self["/attr/OrbitNumber"]) + + @property + def end_orbit_number(self): + """Get end orbit number.""" + try: + return int(self["/attr/orbit_number"]) + except KeyError: + return int(self["/attr/OrbitNumber"]) + + @property + def platform_name(self): + """Get platform name.""" + try: + res = self.get("/attr/platform", self.filename_info["platform_shortname"]) + except KeyError: + res = "Unknown" + + return { + "JPSS-1": "NOAA-20", + "NP": "Suomi-NPP", + "J1": "NOAA-20", + "J2": "NOAA-21", + "JPSS-2": "NOAA-21", + }.get(res, res) + + @property + def sensor_name(self): + """Get sensor name.""" + return self["/attr/instrument"].lower() + + def _get_dataset_file_units(self, dataset_id, ds_info, var_path): + file_units = ds_info.get("units") + if file_units is None: + file_units = self.get(var_path + "/attr/units") + if file_units == "none" or file_units == "None": + file_units = "1" + return file_units + + def _get_dataset_valid_range(self, dataset_id, ds_info, var_path): + valid_min = self.get(var_path + "/attr/valid_min") + valid_max = self.get(var_path + "/attr/valid_max") + if not valid_min and not valid_max: + valid_range = self.get(var_path + "/attr/valid_range") + if valid_range: + valid_min = valid_range[0] + valid_max = valid_range[1] + scale_factor = self.get(var_path + "/attr/scale_factor") + scale_offset = self.get(var_path + "/attr/add_offset") + return valid_min, valid_max, scale_factor, scale_offset + + def get_metadata(self, dataset_id, ds_info): + """Get metadata.""" + var_path = ds_info.get("file_key", ds_info["name"]) + file_units = self._get_dataset_file_units(dataset_id, ds_info, var_path) + + # Get extra metadata + i = getattr(self[var_path], "attrs", {}) + i.update(ds_info) + i.update(dataset_id.to_dict()) + i.update( + { + "file_units": file_units, + "platform_name": self.platform_name, + "sensor": self.sensor_name, + "start_orbit": self.start_orbit_number, + "end_orbit": self.end_orbit_number, + } + ) + i.update(dataset_id.to_dict()) + return i + + def adjust_scaling_factors(self, factors, file_units, output_units): + """Adjust scaling factors.""" + if factors is None or factors[0] is None: + factors = [1, 0] + if file_units == output_units: + LOG.debug("File units and output units are the same (%s)", file_units) + return factors + factors = np.array(factors) + + if file_units == "1" and output_units == "%": + LOG.debug( + "Adjusting scaling factors to convert '%s' to '%s'", + file_units, + output_units, + ) + factors[::2] = np.where(factors[::2] != -999, factors[::2] * 100.0, -999) + factors[1::2] = np.where(factors[1::2] != -999, factors[1::2] * 100.0, -999) + return factors + else: + return factors + + def available_datasets(self, configured_datasets=None): + """Generate dataset info and their availablity. + + See + :meth:`satpy.readers.file_handlers.BaseFileHandler.available_datasets` + for details. + + """ + for is_avail, ds_info in configured_datasets or []: + if is_avail is not None: + yield is_avail, ds_info + continue + ft_matches = self.file_type_matches(ds_info["file_type"]) + var_path = ds_info.get("file_key", ds_info["name"]) + is_in_file = var_path in self + yield ft_matches and is_in_file, ds_info + + def get_dataset(self, ds_id: int, ds_info: str) -> xr.DataArray: + var_path = ds_info.get("file_key", ds_info["name"]) + metadata = self.get_metadata(ds_id, ds_info) + ( + valid_min, + valid_max, + scale_factor, + scale_offset, + ) = self._get_dataset_valid_range(ds_id, ds_info, var_path) + data = self[var_path] + data.attrs.update(metadata) + if valid_min is not None and valid_max is not None: + data = data.where((data >= valid_min) & (data <= valid_max)) + factors = (scale_factor, scale_offset) + factors = self.adjust_scaling_factors( + factors, metadata["file_units"], ds_info.get("units") + ) + if factors[0] != 1 or factors[1] != 0: + data *= factors[0] + data += factors[1] + # rename dimensions to correspond to satpy's 'y' and 'x' standard + if "number_of_lines" in data.dims: + data = data.rename({"number_of_lines": "y", "number_of_pixels": "x"}) + return data diff --git a/satpy/readers/yaml_reader.py b/satpy/readers/yaml_reader.py index 5444d7e16f..29aaaf0955 100644 --- a/satpy/readers/yaml_reader.py +++ b/satpy/readers/yaml_reader.py @@ -261,7 +261,6 @@ def select_files_from_pathnames(self, filenames): """Select the files from *filenames* this reader can handle.""" selected_filenames = [] filenames = set(filenames) # make a copy of the inputs - for pattern in self.file_patterns: matching = _match_filenames(filenames, pattern) filenames -= matching @@ -493,7 +492,6 @@ def _new_filehandler_instances(self, filetype_info, filename_items, fh_kwargs=No """Generate new filehandler instances.""" requirements = filetype_info.get("requires") filetype_cls = filetype_info["file_reader"] - if fh_kwargs is None: fh_kwargs = {} @@ -509,7 +507,6 @@ def _new_filehandler_instances(self, filetype_info, filename_items, fh_kwargs=No except RuntimeError as err: warnings.warn(str(err) + " for {}".format(filename), stacklevel=4) continue - yield filetype_cls(filename, filename_info, filetype_info, *req_fh, **fh_kwargs) def time_matches(self, fstart, fend): @@ -786,9 +783,9 @@ def _get_lons_lats_from_coords(self, coords): """Get lons and lats from the coords list.""" lons, lats = None, None for coord in coords: - if coord.attrs.get("standard_name") == "longitude": + if coord.attrs.get("standard_name").lower() == "longitude": lons = coord - elif coord.attrs.get("standard_name") == "latitude": + elif coord.attrs.get("standard_name").lower() == "latitude": lats = coord if lons is None or lats is None: raise ValueError("Missing longitude or latitude coordinate: " + str(coords)) @@ -826,7 +823,6 @@ def _load_dataset_with_area(self, dsid, coords, **kwargs): return None coords = self._assign_coords_from_dataarray(coords, ds) - area = self._load_dataset_area(dsid, file_handlers, coords, **kwargs) if area is not None: diff --git a/satpy/tests/reader_tests/test_viirs_l2.py b/satpy/tests/reader_tests/test_viirs_l2.py new file mode 100644 index 0000000000..e514ecdc1f --- /dev/null +++ b/satpy/tests/reader_tests/test_viirs_l2.py @@ -0,0 +1,149 @@ +import os +from datetime import datetime, timedelta +from unittest import mock + +import numpy as np +import pytest + +from satpy.tests.reader_tests.test_netcdf_utils import FakeNetCDF4FileHandler +from satpy.tests.utils import convert_file_content_to_data_array +from satpy.readers import load_reader + +DEFAULT_FILE_DTYPE = np.uint16 +DEFAULT_FILE_SHAPE = (10, 300) +DEFAULT_FILE_DATA = np.arange( + DEFAULT_FILE_SHAPE[0] * DEFAULT_FILE_SHAPE[1], dtype=DEFAULT_FILE_DTYPE +).reshape(DEFAULT_FILE_SHAPE) +DEFAULT_FILE_FACTORS = np.array([2.0, 1.0], dtype=np.float32) +DEFAULT_LAT_DATA = np.linspace(45, 65, DEFAULT_FILE_SHAPE[1]).astype(DEFAULT_FILE_DTYPE) +DEFAULT_LAT_DATA = np.repeat([DEFAULT_LAT_DATA], DEFAULT_FILE_SHAPE[0], axis=0) +DEFAULT_LON_DATA = np.linspace(5, 45, DEFAULT_FILE_SHAPE[1]).astype(DEFAULT_FILE_DTYPE) +DEFAULT_LON_DATA = np.repeat([DEFAULT_LON_DATA], DEFAULT_FILE_SHAPE[0], axis=0) + + +class FakeNetCDF4FileHandlerVIIRSL2(FakeNetCDF4FileHandler): + """Swap-in NetCDF4 File Handler.""" + + def get_test_content(self, filename, filename_info, filetype_info): + """Mimic reader input file content.""" + dt = filename_info.get("start_time", datetime(2023, 12, 30, 22, 30, 0)) + file_type = filename[:6] + num_lines = DEFAULT_FILE_SHAPE[0] + num_pixels = DEFAULT_FILE_SHAPE[1] + num_scans = 5 + file_content = { + "/dimension/number_of_scans": num_scans, + "/dimension/number_of_lines": num_lines, + "/dimension/number_of_pixels": num_pixels, + "/attr/time_coverage_start": dt.strftime("%Y-%m-%dT%H:%M:%S.000Z"), + "/attr/time_coverage_end": (dt + timedelta(minutes=6)).strftime( + "%Y-%m-%dT%H:%M:%S.000Z" + ), + "/attr/orbit_number": 26384, + "/attr/instrument": "VIIRS", + "/attr/platform": "Suomi-NPP", + } + self._fill_contents_with_default_data(file_content, file_type) + convert_file_content_to_data_array(file_content) + return file_content + + def _fill_contents_with_default_data(self, file_content, file_type): + """Fill file contents with default data.""" + if file_type.startswith("CLD"): + file_content["geolocation_data/latitude"] = DEFAULT_LAT_DATA + file_content["geolocation_data/longitude"] = DEFAULT_LON_DATA + if file_type == "CLDPRO": + file_content["geophysical_data/Cloud_Top_Height"] = DEFAULT_FILE_DATA + elif file_type == "CLDMSK": + file_content[ + "geophysical_data/Clear_Sky_Confidence" + ] = DEFAULT_FILE_DATA + elif file_type == "AERDB_": + file_content["Latitude"] = DEFAULT_LAT_DATA + file_content["Longitude"] = DEFAULT_LON_DATA + file_content["Angstrom_Exponent_Land_Ocean"] = DEFAULT_FILE_DATA + file_content["Aerosol_Optical_Thickness_550_Land_Ocean"] = DEFAULT_FILE_DATA + + +class TestVIIRSL2FileHandler: + """Test VIIRS_L2 Reader""" + + yaml_file = "viirs_l2.yaml" + + def setup_method(self): + """Wrap NetCDF4 file handler with our own fake handler.""" + from satpy._config import config_search_paths + from satpy.readers.viirs_l2 import VIIRSL2FileHandler + + self.reader_configs = config_search_paths( + os.path.join("readers", self.yaml_file) + ) + self.p = mock.patch.object( + VIIRSL2FileHandler, "__bases__", (FakeNetCDF4FileHandlerVIIRSL2,) + ) + self.fake_handler = self.p.start() + self.p.is_local = True + + def teardown_method(self): + """Stop wrapping the NetCDF4 file handler.""" + self.p.stop() + + @pytest.mark.parametrize( + "filename", + [ + ("CLDPROP_L2_VIIRS_SNPP.A2023364.2230.011.2023365115856.nc"), + ("CLDMSK_L2_VIIRS_SNPP.A2023364.2230.001.2023365105952.nc"), + ("AERDB_L2_VIIRS_SNPP.A2023364.2230.011.2023365113427.nc"), + ], + ) + def test_init(self, filename): + """Test basic init with no extra parameters.""" + from satpy.readers import load_reader + + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames([filename]) + assert len(loadables) == 1 + r.create_filehandlers(loadables) + # make sure we have some files + assert r.file_handlers + + def test_load_aerdb(self): + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames( + ["AERDB_L2_VIIRS_SNPP.A2023364.2230.011.2023365113427.nc"] + ) + r.create_filehandlers(loadables) + datasets = r.load( + ["Aerosol_Optical_Thickness_550_Land_Ocean", "Angstrom_Exponent_Land_Ocean"] + ) + assert len(datasets) == 2 + for d in datasets.values(): + assert d.shape == DEFAULT_FILE_SHAPE + assert d.dims == ("y", "x") + assert d.attrs["sensor"] == "viirs" + + def test_load_cldprop(self): + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames( + ["CLDPROP_L2_VIIRS_SNPP.A2023364.2230.011.2023365115856.nc"] + ) + r.create_filehandlers(loadables) + datasets = r.load(["Cloud_Top_Height"]) + assert len(datasets) == 1 + for d in datasets.values(): + assert d.shape == DEFAULT_FILE_SHAPE + assert d.dims == ("y", "x") + assert d.attrs["sensor"] == "viirs" + + def test_load_cldmsk(self): + r = load_reader(self.reader_configs) + loadables = r.select_files_from_pathnames( + ["CLDMSK_L2_VIIRS_SNPP.A2023364.2230.001.2023365105952.nc"] + ) + r.create_filehandlers(loadables) + datasets = r.load(["Clear_Sky_Confidence"]) + assert len(datasets) == 1 + for d in datasets.values(): + assert d.shape == DEFAULT_FILE_SHAPE + assert d.dims == ("y", "x") + assert d.attrs["sensor"] == "viirs" From b11de89d995eab2e6fb730ca588199488da81c23 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Wed, 24 Jan 2024 16:53:53 +0000 Subject: [PATCH 133/481] Changed aerdb range finding --- satpy/readers/viirs_l2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index e199d75437..671ad98c7a 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -76,7 +76,7 @@ def _get_dataset_valid_range(self, dataset_id, ds_info, var_path): valid_max = self.get(var_path + "/attr/valid_max") if not valid_min and not valid_max: valid_range = self.get(var_path + "/attr/valid_range") - if valid_range: + if valid_range is not None: valid_min = valid_range[0] valid_max = valid_range[1] scale_factor = self.get(var_path + "/attr/scale_factor") From cbf70821780e7c671d8f99065fb1c10196908828 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Wed, 24 Jan 2024 11:47:38 -0600 Subject: [PATCH 134/481] Add AGRI test for C07 file bug and lots of test cleanup --- satpy/readers/fy4_base.py | 21 ++-- satpy/tests/reader_tests/test_agri_l1.py | 120 ++++++++++------------- 2 files changed, 63 insertions(+), 78 deletions(-) diff --git a/satpy/readers/fy4_base.py b/satpy/readers/fy4_base.py index 4a3c0bc625..b0452a5735 100644 --- a/satpy/readers/fy4_base.py +++ b/satpy/readers/fy4_base.py @@ -98,14 +98,15 @@ def _apply_lut(self, data: xr.DataArray, lut: npt.NDArray[np.float32]) -> xr.Dat """ # append nan to the end of lut for fillvalue fill_value = data.attrs.get("FillValue") - if fill_value is not None: - if fill_value.item() > lut.shape[0] - 1: - lut = np.append(lut, np.nan) - data.data = da.where(data.data > lut.shape[0], lut.shape[0] - 1, data.data) - else: - # Ex. C07 has a LUT of 65536 elements, but fill value is 65535 - # This is considered a bug in the input file format - lut[fill_value] = np.nan + if fill_value is not None and fill_value.item() <= lut.shape[0] - 1: + # If LUT includes the fill_value, remove that entry and everything + # after it. + # Ex. C07 has a LUT of 65536 elements, but fill value is 65535 + # This is considered a bug in the input file format + lut = lut[:fill_value.item()] + + lut = np.append(lut, np.nan) + data.data = da.where(data.data >= lut.shape[0], lut.shape[0] - 1, data.data) res = data.data.map_blocks(self._getitem, lut, dtype=lut.dtype) res = xr.DataArray(res, dims=data.dims, attrs=data.attrs, coords=data.coords) @@ -146,8 +147,8 @@ def calibrate(self, data, ds_info, ds_name, file_key): raise NotImplementedError("Calibration to radiance is not supported.") # Apply range limits, but not for counts or we convert to float! if calibration != "counts": - data = data.where((data >= min(data.attrs["valid_range"])) & - (data <= max(data.attrs["valid_range"]))) + data = data.where((data >= min(ds_info["valid_range"])) & + (data <= max(ds_info["valid_range"]))) else: data.attrs["_FillValue"] = data.attrs["FillValue"].item() return data diff --git a/satpy/tests/reader_tests/test_agri_l1.py b/satpy/tests/reader_tests/test_agri_l1.py index 66395a8cee..9e31c0f972 100644 --- a/satpy/tests/reader_tests/test_agri_l1.py +++ b/satpy/tests/reader_tests/test_agri_l1.py @@ -56,7 +56,7 @@ class FakeHDF5FileHandler2(FakeHDF5FileHandler): """Swap-in HDF5 File Handler.""" - def make_test_data(self, cwl, ch, prefix, dims, file_type): + def _make_test_data(self, cwl, ch, prefix, dims): """Make test data.""" if prefix == "CAL": data = xr.DataArray( @@ -74,18 +74,25 @@ def make_test_data(self, cwl, ch, prefix, dims, file_type): dims="_const") elif prefix == "NOM": + # Add +1 to check that values beyond the LUT are clipped + data_np = np.arange(10, dtype=np.uint16).reshape((2, 5)) + 1 + fill_value = 65535 + valid_max = 4095 + if ch == 7: + # mimic C07 bug where the fill value is in the LUT + fill_value = 9 # at index [1, 3] (second to last element) + valid_max = 8 data = xr.DataArray( - da.from_array(np.arange(10, dtype=np.uint16).reshape((2, 5)) + 1, - [dim for dim in dims]), + da.from_array(data_np, chunks=[dim for dim in dims]), attrs={ "Slope": np.array(1.), "Intercept": np.array(0.), - "FillValue": np.array(65535), + "FillValue": np.array(fill_value), "units": "DN", "center_wavelength": "{}um".format(cwl).encode("utf-8"), "band_names": "band{}(band number is range from 1 to 14)" .format(ch).encode("utf-8"), "long_name": "Calibration table of {}um Channel".format(cwl).encode("utf-8"), - "valid_range": np.array([0, 4095]), + "valid_range": np.array([0, valid_max]), }, dims=("_RegLength", "_RegWidth")) @@ -101,26 +108,15 @@ def make_test_data(self, cwl, ch, prefix, dims, file_type): "valid_range": np.array([0., 360.]), }, dims=("_RegLength", "_RegWidth")) - - elif prefix == "COEF": - if file_type == "500": - data = self._create_coeff_array(1) - - elif file_type == "1000": - data = self._create_coeff_array(3) - - elif file_type == "2000": - data = self._create_coeff_array(7) - - elif file_type == "4000": - data = self._create_coeff_array(14) - return data - def _create_coeff_array(self, nb_channels): + def _create_coeffs_array(self, channel_numbers: list[int]) -> xr.DataArray: + # make coefficients consistent between file types + all_possible_coeffs = (np.arange(14 * 2).reshape((14, 2)) + 1.0) / np.array([1E4, 1E2]) + # get the coefficients for the specific channels this resolution has + these_coeffs = all_possible_coeffs[[chan_num - 1 for chan_num in channel_numbers]] data = xr.DataArray( - da.from_array((np.arange(nb_channels * 2).reshape((nb_channels, 2)) + 1.) / - np.array([1E4, 1E2]), [nb_channels, 2]), + da.from_array(these_coeffs, chunks=[len(channel_numbers), 2]), attrs={ "Slope": 1., "Intercept": 0., "FillValue": 0, @@ -132,60 +128,46 @@ def _create_coeff_array(self, nb_channels): dims=("_num_channel", "_coefs")) return data - def _create_channel_data(self, chs, cwls, file_type): + def _create_channel_data(self, chs, cwls): dim_0 = 2 dim_1 = 5 data = {} - for index, _cwl in enumerate(cwls): - data["CALChannel" + "%02d" % chs[index]] = self.make_test_data(cwls[index], chs[index], "CAL", - [dim_0, dim_1], file_type) - data["Calibration/CALChannel" + "%02d" % chs[index]] = self.make_test_data(cwls[index], chs[index], "CAL", - [dim_0, dim_1], file_type) - data["NOMChannel" + "%02d" % chs[index]] = self.make_test_data(cwls[index], chs[index], "NOM", - [dim_0, dim_1], file_type) - data["Data/NOMChannel" + "%02d" % chs[index]] = self.make_test_data(cwls[index], chs[index], "NOM", - [dim_0, dim_1], file_type) - data["CALIBRATION_COEF(SCALE+OFFSET)"] = self.make_test_data(cwls[index], chs[index], "COEF", - [dim_0, dim_1], file_type) - data["Calibration/CALIBRATION_COEF(SCALE+OFFSET)"] = self.make_test_data(cwls[index], chs[index], "COEF", - [dim_0, dim_1], file_type) + for chan_num, chan_wl in zip(chs, cwls): + cal_data = self._make_test_data(chan_wl, chan_num, "CAL", [dim_0, dim_1]) + data[f"CALChannel{chan_num:02d}"] = cal_data + data[f"Calibration/CALChannel{chan_num:02d}"] = cal_data + nom_data = self._make_test_data(chan_wl, chan_num, "NOM", [dim_0, dim_1]) + data[f"NOMChannel{chan_num:02d}"] = nom_data + data[f"Data/NOMChannel{chan_num:02d}"] = nom_data + data["CALIBRATION_COEF(SCALE+OFFSET)"] = self._create_coeffs_array(chs) + data["Calibration/CALIBRATION_COEF(SCALE+OFFSET)"] = self._create_coeffs_array(chs) return data - def _get_500m_data(self, file_type): + def _get_500m_data(self): chs = [2] cwls = [0.65] - data = self._create_channel_data(chs, cwls, file_type) - - return data + return self._create_channel_data(chs, cwls) - def _get_1km_data(self, file_type): - chs = np.linspace(1, 3, 3) + def _get_1km_data(self): + chs = [1, 2, 3] cwls = [0.47, 0.65, 0.83] - data = self._create_channel_data(chs, cwls, file_type) + return self._create_channel_data(chs, cwls) - return data - - def _get_2km_data(self, file_type): - chs = np.linspace(1, 7, 7) + def _get_2km_data(self): + chs = [1, 2, 3, 4, 5, 6, 7] cwls = [0.47, 0.65, 0.83, 1.37, 1.61, 2.22, 3.72] - data = self._create_channel_data(chs, cwls, file_type) - - return data + return self._create_channel_data(chs, cwls) - def _get_4km_data(self, file_type): - chs = np.linspace(1, 14, 14) + def _get_4km_data(self): + chs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] cwls = [0.47, 0.65, 0.83, 1.37, 1.61, 2.22, 3.72, 3.72, 6.25, 7.10, 8.50, 10.8, 12, 13.5] - data = self._create_channel_data(chs, cwls, file_type) + return self._create_channel_data(chs, cwls) - return data - - def _get_geo_data(self, file_type): + def _get_geo_data(self): dim_0 = 2 dim_1 = 5 - data = {"NOMSunAzimuth": self.make_test_data("NUL", "NUL", "GEO", - [dim_0, dim_1], file_type), - "Navigation/NOMSunAzimuth": self.make_test_data("NUL", "NUL", "GEO", - [dim_0, dim_1], file_type)} + data = {"NOMSunAzimuth": self._make_test_data("NUL", "NUL", "GEO", [dim_0, dim_1]), + "Navigation/NOMSunAzimuth": self._make_test_data("NUL", "NUL", "GEO", [dim_0, dim_1])} return data def get_test_content(self, filename, filename_info, filetype_info): @@ -210,17 +192,17 @@ def get_test_content(self, filename, filename_info, filetype_info): data = {} if self.filetype_info["file_type"] == "agri_l1_0500m": - data = self._get_500m_data("500") + data = self._get_500m_data() elif self.filetype_info["file_type"] == "agri_l1_1000m": - data = self._get_1km_data("1000") + data = self._get_1km_data() elif self.filetype_info["file_type"] == "agri_l1_2000m": - data = self._get_2km_data("2000") + data = self._get_2km_data() global_attrs["/attr/Observing Beginning Time"] = "00:30:01" global_attrs["/attr/Observing Ending Time"] = "00:34:07" elif self.filetype_info["file_type"] == "agri_l1_4000m": - data = self._get_4km_data("4000") + data = self._get_4km_data() elif self.filetype_info["file_type"] == "agri_l1_4000m_geo": - data = self._get_geo_data("4000") + data = self._get_geo_data() test_content = {} test_content.update(global_attrs) @@ -263,7 +245,7 @@ def setup_method(self): 4: np.array([[8.07, 8.14, 8.21, 8.28, 8.35], [8.42, 8.49, 8.56, 8.63, 8.7]]), 5: np.array([[10.09, 10.18, 10.27, 10.36, 10.45], [10.54, 10.63, 10.72, 10.81, 10.9]]), 6: np.array([[12.11, 12.22, 12.33, 12.44, 12.55], [12.66, 12.77, 12.88, 12.99, 13.1]]), - 7: np.array([[0.2, 0.3, 0.4, 0.5, 0.6], [0.7, 0.8, 0.9, 1., np.nan]]), + 7: np.array([[0.2, 0.3, 0.4, 0.5, 0.6], [0.7, 0.8, 0.9, np.nan, np.nan]]), 8: np.array([[0.2, 0.3, 0.4, 0.5, 0.6], [0.7, 0.8, 0.9, 1., np.nan]]), 9: np.array([[0.2, 0.3, 0.4, 0.5, 0.6], [0.7, 0.8, 0.9, 1., np.nan]]), 10: np.array([[0.2, 0.3, 0.4, 0.5, 0.6], [0.7, 0.8, 0.9, 1., np.nan]]), @@ -390,6 +372,7 @@ def test_agri_for_one_resolution(self, resolution_to_test, satname): available_datasets = reader.available_dataset_ids band_names = CHANNELS_BY_RESOLUTION[resolution_to_test] self._assert_which_channels_are_loaded(available_datasets, band_names, resolution_to_test) + # band_names = ["C07"] res = reader.load(band_names) assert len(res) == len(band_names) self._check_calibration_and_units(band_names, res) @@ -398,10 +381,11 @@ def test_agri_for_one_resolution(self, resolution_to_test, satname): AREA_EXTENTS_BY_RESOLUTION[satname][resolution_to_test]) def _check_calibration_and_units(self, band_names, result): - for index, band_name in enumerate(band_names): + for band_name in band_names: + band_number = int(band_name[-2:]) assert result[band_name].attrs["sensor"].islower() assert result[band_name].shape == (2, 5) - np.testing.assert_allclose(result[band_name].values, self.expected[index + 1], equal_nan=True) + np.testing.assert_allclose(result[band_name].values, self.expected[band_number], equal_nan=True) self._check_units(band_name, result) @staticmethod From 03eb8533d486c96b5bfea3cf81761b2bb883d350 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Wed, 24 Jan 2024 11:50:31 -0600 Subject: [PATCH 135/481] More test cleanup --- satpy/tests/reader_tests/test_agri_l1.py | 110 +++++++++++------------ 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/satpy/tests/reader_tests/test_agri_l1.py b/satpy/tests/reader_tests/test_agri_l1.py index 9e31c0f972..82ac7252b8 100644 --- a/satpy/tests/reader_tests/test_agri_l1.py +++ b/satpy/tests/reader_tests/test_agri_l1.py @@ -56,59 +56,57 @@ class FakeHDF5FileHandler2(FakeHDF5FileHandler): """Swap-in HDF5 File Handler.""" - def _make_test_data(self, cwl, ch, prefix, dims): + def _make_cal_data(self, cwl, ch, dims): """Make test data.""" - if prefix == "CAL": - data = xr.DataArray( - da.from_array((np.arange(10.) + 1.) / 10., [dims[0] * dims[1]]), - attrs={ - "Slope": np.array(1.), "Intercept": np.array(0.), - "FillValue": np.array(-65535.0), - "units": "NUL", - "center_wavelength": "{}um".format(cwl).encode("utf-8"), - "band_names": "band{}(band number is range from 1 to 14)" - .format(ch).encode("utf-8"), - "long_name": "Calibration table of {}um Channel".format(cwl).encode("utf-8"), - "valid_range": np.array([0, 1.5]), - }, - dims="_const") - - elif prefix == "NOM": - # Add +1 to check that values beyond the LUT are clipped - data_np = np.arange(10, dtype=np.uint16).reshape((2, 5)) + 1 - fill_value = 65535 - valid_max = 4095 - if ch == 7: - # mimic C07 bug where the fill value is in the LUT - fill_value = 9 # at index [1, 3] (second to last element) - valid_max = 8 - data = xr.DataArray( - da.from_array(data_np, chunks=[dim for dim in dims]), - attrs={ - "Slope": np.array(1.), "Intercept": np.array(0.), - "FillValue": np.array(fill_value), - "units": "DN", - "center_wavelength": "{}um".format(cwl).encode("utf-8"), - "band_names": "band{}(band number is range from 1 to 14)" - .format(ch).encode("utf-8"), - "long_name": "Calibration table of {}um Channel".format(cwl).encode("utf-8"), - "valid_range": np.array([0, valid_max]), - }, - dims=("_RegLength", "_RegWidth")) - - elif prefix == "GEO": - data = xr.DataArray( - da.from_array(np.arange(0., 360., 36., dtype=np.float32).reshape((2, 5)), - [dim for dim in dims]), - attrs={ - "Slope": np.array(1.), "Intercept": np.array(0.), - "FillValue": np.array(65535.), - "units": "NUL", - "band_names": "NUL", - "valid_range": np.array([0., 360.]), - }, - dims=("_RegLength", "_RegWidth")) - return data + return xr.DataArray( + da.from_array((np.arange(10.) + 1.) / 10., [dims[0] * dims[1]]), + attrs={ + "Slope": np.array(1.), "Intercept": np.array(0.), + "FillValue": np.array(-65535.0), + "units": "NUL", + "center_wavelength": "{}um".format(cwl).encode("utf-8"), + "band_names": "band{}(band number is range from 1 to 14)" + .format(ch).encode("utf-8"), + "long_name": "Calibration table of {}um Channel".format(cwl).encode("utf-8"), + "valid_range": np.array([0, 1.5]), + }, + dims="_const") + + def _make_nom_data(self, cwl, ch, dims): + # Add +1 to check that values beyond the LUT are clipped + data_np = np.arange(10, dtype=np.uint16).reshape((2, 5)) + 1 + fill_value = 65535 + valid_max = 4095 + if ch == 7: + # mimic C07 bug where the fill value is in the LUT + fill_value = 9 # at index [1, 3] (second to last element) + valid_max = 8 + return xr.DataArray( + da.from_array(data_np, chunks=[dim for dim in dims]), + attrs={ + "Slope": np.array(1.), "Intercept": np.array(0.), + "FillValue": np.array(fill_value), + "units": "DN", + "center_wavelength": "{}um".format(cwl).encode("utf-8"), + "band_names": "band{}(band number is range from 1 to 14)" + .format(ch).encode("utf-8"), + "long_name": "Calibration table of {}um Channel".format(cwl).encode("utf-8"), + "valid_range": np.array([0, valid_max]), + }, + dims=("_RegLength", "_RegWidth")) + + def _make_geo_data(self, dims): + return xr.DataArray( + da.from_array(np.arange(0., 360., 36., dtype=np.float32).reshape((2, 5)), + [dim for dim in dims]), + attrs={ + "Slope": np.array(1.), "Intercept": np.array(0.), + "FillValue": np.array(65535.), + "units": "NUL", + "band_names": "NUL", + "valid_range": np.array([0., 360.]), + }, + dims=("_RegLength", "_RegWidth")) def _create_coeffs_array(self, channel_numbers: list[int]) -> xr.DataArray: # make coefficients consistent between file types @@ -133,10 +131,10 @@ def _create_channel_data(self, chs, cwls): dim_1 = 5 data = {} for chan_num, chan_wl in zip(chs, cwls): - cal_data = self._make_test_data(chan_wl, chan_num, "CAL", [dim_0, dim_1]) + cal_data = self._make_cal_data(chan_wl, chan_num, [dim_0, dim_1]) data[f"CALChannel{chan_num:02d}"] = cal_data data[f"Calibration/CALChannel{chan_num:02d}"] = cal_data - nom_data = self._make_test_data(chan_wl, chan_num, "NOM", [dim_0, dim_1]) + nom_data = self._make_nom_data(chan_wl, chan_num, [dim_0, dim_1]) data[f"NOMChannel{chan_num:02d}"] = nom_data data[f"Data/NOMChannel{chan_num:02d}"] = nom_data data["CALIBRATION_COEF(SCALE+OFFSET)"] = self._create_coeffs_array(chs) @@ -166,8 +164,8 @@ def _get_4km_data(self): def _get_geo_data(self): dim_0 = 2 dim_1 = 5 - data = {"NOMSunAzimuth": self._make_test_data("NUL", "NUL", "GEO", [dim_0, dim_1]), - "Navigation/NOMSunAzimuth": self._make_test_data("NUL", "NUL", "GEO", [dim_0, dim_1])} + data = {"NOMSunAzimuth": self._make_geo_data([dim_0, dim_1]), + "Navigation/NOMSunAzimuth": self._make_geo_data([dim_0, dim_1])} return data def get_test_content(self, filename, filename_info, filetype_info): From 20cb176e926749f248f2c8de67b6dfe8c0361c8f Mon Sep 17 00:00:00 2001 From: David Hoese Date: Thu, 25 Jan 2024 10:24:48 -0600 Subject: [PATCH 136/481] Remove left over test comment --- satpy/tests/reader_tests/test_agri_l1.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_agri_l1.py b/satpy/tests/reader_tests/test_agri_l1.py index 82ac7252b8..3de679796c 100644 --- a/satpy/tests/reader_tests/test_agri_l1.py +++ b/satpy/tests/reader_tests/test_agri_l1.py @@ -370,7 +370,6 @@ def test_agri_for_one_resolution(self, resolution_to_test, satname): available_datasets = reader.available_dataset_ids band_names = CHANNELS_BY_RESOLUTION[resolution_to_test] self._assert_which_channels_are_loaded(available_datasets, band_names, resolution_to_test) - # band_names = ["C07"] res = reader.load(band_names) assert len(res) == len(band_names) self._check_calibration_and_units(band_names, res) From 7c8e5753625493bb7997ef8f5cf75c98708898da Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Fri, 26 Jan 2024 16:23:16 +0100 Subject: [PATCH 137/481] Add GenericYAMLReader --- satpy/etc/readers/sar-c_safe.yaml | 6 +- satpy/readers/__init__.py | 5 +- satpy/readers/sar_c_safe.py | 162 ++++++++++--- satpy/readers/yaml_reader.py | 239 +++++++++++--------- satpy/tests/reader_tests/test_sar_c_safe.py | 70 ++++-- 5 files changed, 316 insertions(+), 166 deletions(-) diff --git a/satpy/etc/readers/sar-c_safe.yaml b/satpy/etc/readers/sar-c_safe.yaml index 4e45ca8584..a14a401af9 100644 --- a/satpy/etc/readers/sar-c_safe.yaml +++ b/satpy/etc/readers/sar-c_safe.yaml @@ -7,7 +7,7 @@ reader: supports_fsspec: false sensors: [sar-c] default_channels: [] - reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader + reader: !!python/name:satpy.readers.sar_c_safe.SAFESARReader data_identification_keys: name: required: true @@ -40,19 +40,15 @@ reader: file_types: safe_measurement: - file_reader: !!python/name:satpy.readers.sar_c_safe.SAFEGRD file_patterns: ['{fmission_id:3s}_{fsar_mode:2s}_{fproduct_type:3s}{fresolution:1s}_{fprocessing_level:1s}{fproduct_class:1s}{fpolarization:2s}_{fstart_time:%Y%m%dT%H%M%S}_{fend_time:%Y%m%dT%H%M%S}_{forbit_number:6d}_{fmission_data_take_id:6s}_{fproduct_unique_id:4s}.SAFE/measurement/{mission_id:3s}-{swath_id:2s}-{product_type:3s}-{polarization:2s}-{start_time:%Y%m%dt%H%M%S}-{end_time:%Y%m%dt%H%M%S}-{orbit_number:6d}-{mission_data_take_id:6s}-{image_number:3s}.tiff'] requires: [safe_calibration, safe_noise, safe_annotation] safe_calibration: - file_reader: !!python/name:satpy.readers.sar_c_safe.SAFEXMLCalibration file_patterns: ['{fmission_id:3s}_{fsar_mode:2s}_{fproduct_type:3s}{fresolution:1s}_{fprocessing_level:1s}{fproduct_class:1s}{fpolarization:2s}_{fstart_time:%Y%m%dT%H%M%S}_{fend_time:%Y%m%dT%H%M%S}_{forbit_number:6d}_{fmission_data_take_id:6s}_{fproduct_unique_id:4s}.SAFE/annotation/calibration/calibration-{mission_id:3s}-{swath_id:2s}-{product_type:3s}-{polarization:2s}-{start_time:%Y%m%dt%H%M%S}-{end_time:%Y%m%dt%H%M%S}-{orbit_number:6d}-{mission_data_take_id:6s}-{image_number:3s}.xml'] requires: [safe_annotation] safe_noise: - file_reader: !!python/name:satpy.readers.sar_c_safe.SAFEXMLNoise file_patterns: ['{fmission_id:3s}_{fsar_mode:2s}_{fproduct_type:3s}{fresolution:1s}_{fprocessing_level:1s}{fproduct_class:1s}{fpolarization:2s}_{fstart_time:%Y%m%dT%H%M%S}_{fend_time:%Y%m%dT%H%M%S}_{forbit_number:6d}_{fmission_data_take_id:6s}_{fproduct_unique_id:4s}.SAFE/annotation/calibration/noise-{mission_id:3s}-{swath_id:2s}-{product_type:3s}-{polarization:2s}-{start_time:%Y%m%dt%H%M%S}-{end_time:%Y%m%dt%H%M%S}-{orbit_number:6d}-{mission_data_take_id:6s}-{image_number:3s}.xml'] requires: [safe_annotation] safe_annotation: - file_reader: !!python/name:satpy.readers.sar_c_safe.SAFEXMLAnnotation file_patterns: ['{fmission_id:3s}_{fsar_mode:2s}_{fproduct_type:3s}{fresolution:1s}_{fprocessing_level:1s}{fproduct_class:1s}{fpolarization:2s}_{fstart_time:%Y%m%dT%H%M%S}_{fend_time:%Y%m%dT%H%M%S}_{forbit_number:6d}_{fmission_data_take_id:6s}_{fproduct_unique_id:4s}.SAFE/annotation/{mission_id:3s}-{swath_id:2s}-{product_type:3s}-{polarization:2s}-{start_time:%Y%m%dt%H%M%S}-{end_time:%Y%m%dt%H%M%S}-{orbit_number:6d}-{mission_data_take_id:6s}-{image_number:3s}.xml'] diff --git a/satpy/readers/__init__.py b/satpy/readers/__init__.py index c8fc0a8b69..43632af9c6 100644 --- a/satpy/readers/__init__.py +++ b/satpy/readers/__init__.py @@ -572,7 +572,7 @@ def load_readers(filenames=None, reader=None, reader_kwargs=None): continue loadables = reader_instance.select_files_from_pathnames(readers_files) if loadables: - reader_instance.create_filehandlers( + reader_instance.create_storage_items( loadables, fh_kwargs=reader_kwargs_without_filter[None if reader is None else reader[idx]]) reader_instances[reader_instance.name] = reader_instance @@ -635,6 +635,9 @@ def _get_reader_kwargs(reader, reader_kwargs): """ reader_kwargs = reader_kwargs or {} + if isinstance(reader, str): + reader = list(reader) + # ensure one reader_kwargs per reader, None if not provided if reader is None: reader_kwargs = {None: reader_kwargs} diff --git a/satpy/readers/sar_c_safe.py b/satpy/readers/sar_c_safe.py index 19e5396b61..565d2c1167 100644 --- a/satpy/readers/sar_c_safe.py +++ b/satpy/readers/sar_c_safe.py @@ -36,6 +36,8 @@ import functools import logging +import os +from collections import defaultdict from threading import Lock import defusedxml.ElementTree as ET @@ -46,7 +48,10 @@ from dask.base import tokenize from xarray import DataArray +from satpy.dataset.data_dict import DatasetDict +from satpy.dataset.dataid import DataID from satpy.readers.file_handlers import BaseFileHandler +from satpy.readers.yaml_reader import GenericYAMLReader from satpy.utils import get_legacy_chunk_size logger = logging.getLogger(__name__) @@ -92,21 +97,15 @@ class SAFEXML(BaseFileHandler): """XML file reader for the SAFE format.""" def __init__(self, filename, filename_info, filetype_info, - header_file=None): + header_file=None, image_shape=None): """Init the xml filehandler.""" - super(SAFEXML, self).__init__(filename, filename_info, filetype_info) + super().__init__(filename, filename_info, filetype_info) self._start_time = filename_info["start_time"] self._end_time = filename_info["end_time"] self._polarization = filename_info["polarization"] self.root = ET.parse(self.filename) - self.hdr = {} - if header_file is not None: - self.hdr = header_file.get_metadata() - else: - self.hdr = self.get_metadata() - self._image_shape = (self.hdr["product"]["imageAnnotation"]["imageInformation"]["numberOfLines"], - self.hdr["product"]["imageAnnotation"]["imageInformation"]["numberOfSamples"]) + self._image_shape = image_shape def get_metadata(self): """Convert the xml metadata to dict.""" @@ -133,6 +132,14 @@ def __init__(self, filename, filename_info, filetype_info, self.get_incidence_angle = functools.lru_cache(maxsize=10)( self._get_incidence_angle_uncached ) + self.hdr = self.get_metadata() + self._image_shape = (self.hdr["product"]["imageAnnotation"]["imageInformation"]["numberOfLines"], + self.hdr["product"]["imageAnnotation"]["imageInformation"]["numberOfSamples"]) + + @property + def image_shape(self): + """Return the image shape of this dataset.""" + return self._image_shape def get_dataset(self, key, info, chunks=None): """Load a dataset.""" @@ -148,13 +155,13 @@ def _get_incidence_angle_uncached(self, chunks): return incidence_angle.expand(self._image_shape, chunks=chunks) -class SAFEXMLCalibration(SAFEXML): +class Calibrator(SAFEXML): """XML file reader for the SAFE format, Calibration file.""" def __init__(self, filename, filename_info, filetype_info, - header_file=None): + header_file=None, image_shape=None): """Init the XML calibration reader.""" - super().__init__(filename, filename_info, filetype_info, header_file) + super().__init__(filename, filename_info, filetype_info, header_file, image_shape) self.get_calibration = functools.lru_cache(maxsize=10)( self._get_calibration_uncached ) @@ -182,14 +189,22 @@ def _get_calibration_vector(self, calibration_name, chunks): calibration_vector = XMLArray(self.root, ".//calibrationVector", calibration_name) return calibration_vector.expand(self._image_shape, chunks=chunks) + def __call__(self, dn, calibration_type, chunks=None): + """Calibrate the data.""" + logger.debug("Reading calibration data.") + cal = self.get_calibration(calibration_type, chunks=chunks) + cal_constant = self.get_calibration_constant() + logger.debug("Calibrating.") + data = ((dn + cal_constant) / (cal ** 2)).clip(min=0) + return data -class SAFEXMLNoise(SAFEXML): +class Denoiser(SAFEXML): """XML file reader for the SAFE format, Noise file.""" def __init__(self, filename, filename_info, filetype_info, - header_file=None): + header_file=None, image_shape=None): """Init the xml filehandler.""" - super().__init__(filename, filename_info, filetype_info, header_file) + super().__init__(filename, filename_info, filetype_info, header_file, image_shape) self.azimuth_noise_reader = AzimuthNoiseReader(self.root, self._image_shape) self.get_noise_correction = functools.lru_cache(maxsize=10)( @@ -223,6 +238,14 @@ def read_range_noise_array(self, chunks): range_noise = XMLArray(self.root, ".//noiseRangeVector", "noiseRangeLut") return range_noise.expand(self._image_shape, chunks) + def __call__(self, dn, chunks): + """Denoise the data.""" + logger.debug("Reading noise data.") + noise = self.get_noise_correction(chunks=chunks).fillna(0) + dn = dn - noise + return dn + + class AzimuthNoiseReader: """Class to parse and read azimuth-noise data. @@ -547,10 +570,9 @@ class SAFEGRD(BaseFileHandler): block size. """ - def __init__(self, filename, filename_info, filetype_info, calfh, noisefh, annotationfh): + def __init__(self, filename, filename_info, filetype_info, calibrator, denoiser): """Init the grd filehandler.""" - super(SAFEGRD, self).__init__(filename, filename_info, - filetype_info) + super().__init__(filename, filename_info, filetype_info) self._start_time = filename_info["start_time"] self._end_time = filename_info["end_time"] @@ -559,9 +581,8 @@ def __init__(self, filename, filename_info, filetype_info, calfh, noisefh, annot self._mission_id = filename_info["mission_id"] - self.calibration = calfh - self.noise = noisefh - self.annotation = annotationfh + self.calibrator = calibrator + self.denoiser = denoiser self.read_lock = Lock() self.filehandle = rasterio.open(self.filename, "r", sharing=False) @@ -585,8 +606,8 @@ def get_dataset(self, key, info): data.attrs.update(info) else: - data = xr.open_dataset(self.filename, engine="rasterio", - chunks={"band": 1, "y": CHUNK_SIZE, "x": CHUNK_SIZE})["band_data"].squeeze() + data = xr.open_dataarray(self.filename, engine="rasterio", + chunks={"band": 1, "y": CHUNK_SIZE, "x": CHUNK_SIZE}).squeeze() data = data.assign_coords(x=np.arange(len(data.coords["x"])), y=np.arange(len(data.coords["y"]))) data = self._calibrate_and_denoise(data, key) @@ -613,8 +634,8 @@ def _calibrate_and_denoise(self, data, key): chunks = CHUNK_SIZE dn = self._get_digital_number(data) - dn = self._denoise(dn, chunks) - data = self._calibrate(dn, chunks, key) + dn = self.denoiser(dn, chunks) + data = self.calibrator(dn, key["calibration"], chunks) return data @@ -632,15 +653,6 @@ def _denoise(self, dn, chunks): dn = dn - noise return dn - def _calibrate(self, dn, chunks, key): - """Calibrate the data.""" - logger.debug("Reading calibration data.") - cal = self.calibration.get_calibration(key["calibration"], chunks=chunks) - cal_constant = self.calibration.get_calibration_constant() - logger.debug("Calibrating.") - data = ((dn + cal_constant) / (cal ** 2)).clip(min=0) - return data - def _get_lonlatalts_uncached(self): """Obtain GCPs and construct latitude and longitude arrays. @@ -704,3 +716,85 @@ def start_time(self): def end_time(self): """Get the end time.""" return self._end_time + + +class SAFESARReader(GenericYAMLReader): + """A reader for SAFE SAR-C data for Sentinel 1 satellites.""" + + def __init__(self, config, filter_parameters=None): + """Set up the SAR reader.""" + super().__init__(config) + self.filter_parameters = filter_parameters + self.files_by_type = defaultdict(list) + self.storage_items = [] + + @property + def start_time(self): + """Get the start time.""" + return self.storage_items.values()[0].filename_info["start_time"] + + @property + def end_time(self): + """Get the end time.""" + return self.storage_items.values()[0].filename_info["end_time"] + + def load(self, dataset_keys, **kwargs): + """Load some data.""" + if kwargs: + raise NotImplementedError(f"Don't know how to handle kwargs {kwargs}") + datasets = DatasetDict() + for key in dataset_keys: + for handler in self.storage_items.values(): + val = handler.get_dataset(key, info=dict()) + if val is not None: + val.attrs["start_time"] = handler.start_time + # val.attrs["footprint"] = self.footprint + if key["name"] not in ["longitude", "latitude"]: + lonlats = self.load([DataID(self._id_keys, name="longitude", polarization=key["polarization"]), + DataID(self._id_keys, name="latitude", polarization=key["polarization"])]) + from pyresample.future.geometry import SwathDefinition + val.attrs["area"] = SwathDefinition(lonlats["longitude"], lonlats["latitude"], + attrs=dict(gcps=None)) + datasets[key] = val + continue + return datasets + + def create_storage_items(self, files, **kwargs): + """Create the storage items.""" + filenames = [os.fspath(filename) for filename in files] + files_by_type = defaultdict(list) + for file_type, type_info in self.config["file_types"].items(): + files_by_type[file_type].extend(self.filename_items_for_filetype(filenames, type_info)) + + image_shapes = dict() + for annotation_file, annotation_info in files_by_type["safe_annotation"]: + annotation_fh = SAFEXMLAnnotation(annotation_file, + filename_info=annotation_info, + filetype_info=None) + image_shapes[annotation_info["polarization"]] = annotation_fh.image_shape + + calibration_handlers = dict() + for calibration_file, calibration_info in files_by_type["safe_calibration"]: + polarization = calibration_info["polarization"] + calibration_handlers[polarization] = Calibrator(calibration_file, + filename_info=calibration_info, + filetype_info=None, + image_shape=image_shapes[polarization]) + + noise_handlers = dict() + for noise_file, noise_info in files_by_type["safe_noise"]: + polarization = noise_info["polarization"] + noise_handlers[polarization] = Denoiser(noise_file, + filename_info=noise_info, + filetype_info=None, + image_shape=image_shapes[polarization]) + + measurement_handlers = dict() + for measurement_file, measurement_info in files_by_type["safe_measurement"]: + polarization = measurement_info["polarization"] + measurement_handlers[polarization] = SAFEGRD(measurement_file, + filename_info=measurement_info, + calibrator=calibration_handlers[polarization], + denoiser=noise_handlers[polarization], + filetype_info=None) + self.storage_items = measurement_handlers diff --git a/satpy/readers/yaml_reader.py b/satpy/readers/yaml_reader.py index 5444d7e16f..84c4fcd068 100644 --- a/satpy/readers/yaml_reader.py +++ b/satpy/readers/yaml_reader.py @@ -337,7 +337,127 @@ def _build_id_permutations(self, dataset, id_keys): return id_kwargs -class FileYAMLReader(AbstractYAMLReader, DataDownloadMixin): +class GenericYAMLReader(AbstractYAMLReader): + """A Generic YAML-based reader.""" + + def __init__(self, config_dict, filter_parameters=None, filter_filenames=True): + """Set up the yaml reader.""" + super().__init__(config_dict) + self.filter_parameters = filter_parameters or {} + self.filter_filenames = self.info.get("filter_filenames", filter_filenames) + + + + def filter_selected_filenames(self, filenames): + """Filter provided files based on metadata in the filename.""" + if not isinstance(filenames, set): + # we perform set operations later on to improve performance + filenames = set(filenames) + for _, filetype_info in self.sorted_filetype_items(): + filename_iter = self.filename_items_for_filetype(filenames, + filetype_info) + if self.filter_filenames: + filename_iter = self.filter_filenames_by_info(filename_iter) + + for fn, _ in filename_iter: + yield fn + + def sorted_filetype_items(self): + """Sort the instance's filetypes in using order.""" + processed_types = [] + file_type_items = deque(self.config["file_types"].items()) + while len(file_type_items): + filetype, filetype_info = file_type_items.popleft() + + requirements = filetype_info.get("requires") + if requirements is not None: + # requirements have not been processed yet -> wait + missing = [req for req in requirements + if req not in processed_types] + if missing: + file_type_items.append((filetype, filetype_info)) + continue + + processed_types.append(filetype) + yield filetype, filetype_info + + @staticmethod + def filename_items_for_filetype(filenames, filetype_info): + """Iterate over the filenames matching *filetype_info*.""" + if not isinstance(filenames, set): + # we perform set operations later on to improve performance + filenames = set(filenames) + for pattern in filetype_info["file_patterns"]: + matched_files = set() + matches = _match_filenames(filenames, pattern) + for filename in matches: + try: + filename_info = parse( + pattern, _get_filebase(filename, pattern)) + except ValueError: + logger.debug("Can't parse %s with %s.", filename, pattern) + continue + matched_files.add(filename) + yield filename, filename_info + filenames -= matched_files + + def filter_filenames_by_info(self, filename_items): + """Filter out file using metadata from the filenames. + + Currently only uses start and end time. If only start time is available + from the filename, keep all the filename that have a start time before + the requested end time. + """ + for filename, filename_info in filename_items: + fend = filename_info.get("end_time") + fstart = filename_info.setdefault("start_time", fend) + if fend and fend < fstart: + # correct for filenames with 1 date and 2 times + fend = fend.replace(year=fstart.year, + month=fstart.month, + day=fstart.day) + filename_info["end_time"] = fend + if self.metadata_matches(filename_info): + yield filename, filename_info + + def metadata_matches(self, sample_dict, file_handler=None): + """Check that file metadata matches filter_parameters of this reader.""" + # special handling of start/end times + if not self.time_matches( + sample_dict.get("start_time"), sample_dict.get("end_time")): + return False + for key, val in self.filter_parameters.items(): + if key != "area" and key not in sample_dict: + continue + + if key in ["start_time", "end_time"]: + continue + elif key == "area" and file_handler: + if not self.check_file_covers_area(file_handler, val): + logger.info("Filtering out %s based on area", + file_handler.filename) + break + elif key in sample_dict and val != sample_dict[key]: + # don't use this file + break + else: + # all the metadata keys are equal + return True + return False + + def time_matches(self, fstart, fend): + """Check that a file's start and end time mtach filter_parameters of this reader.""" + start_time = self.filter_parameters.get("start_time") + end_time = self.filter_parameters.get("end_time") + fend = fend or fstart + if start_time and fend and fend < start_time: + return False + if end_time and fstart and fstart > end_time: + return False + return True + + +class FileYAMLReader(GenericYAMLReader, DataDownloadMixin): """Primary reader base class that is configured by a YAML file. This class uses the idea of per-file "file handler" objects to read file @@ -359,12 +479,10 @@ def __init__(self, filter_filenames=True, **kwargs): """Set up initial internal storage for loading file data.""" - super(FileYAMLReader, self).__init__(config_dict) + super().__init__(config_dict, filter_parameters, filter_filenames) self.file_handlers = {} self.available_ids = {} - self.filter_filenames = self.info.get("filter_filenames", filter_filenames) - self.filter_parameters = filter_parameters or {} self.register_data_files() @property @@ -450,45 +568,6 @@ def find_required_filehandlers(self, requirements, filename_info): # filetype! return req_fh - def sorted_filetype_items(self): - """Sort the instance's filetypes in using order.""" - processed_types = [] - file_type_items = deque(self.config["file_types"].items()) - while len(file_type_items): - filetype, filetype_info = file_type_items.popleft() - - requirements = filetype_info.get("requires") - if requirements is not None: - # requirements have not been processed yet -> wait - missing = [req for req in requirements - if req not in processed_types] - if missing: - file_type_items.append((filetype, filetype_info)) - continue - - processed_types.append(filetype) - yield filetype, filetype_info - - @staticmethod - def filename_items_for_filetype(filenames, filetype_info): - """Iterate over the filenames matching *filetype_info*.""" - if not isinstance(filenames, set): - # we perform set operations later on to improve performance - filenames = set(filenames) - for pattern in filetype_info["file_patterns"]: - matched_files = set() - matches = _match_filenames(filenames, pattern) - for filename in matches: - try: - filename_info = parse( - pattern, _get_filebase(filename, pattern)) - except ValueError: - logger.debug("Can't parse %s with %s.", filename, pattern) - continue - matched_files.add(filename) - yield filename, filename_info - filenames -= matched_files - def _new_filehandler_instances(self, filetype_info, filename_items, fh_kwargs=None): """Generate new filehandler instances.""" requirements = filetype_info.get("requires") @@ -512,61 +591,6 @@ def _new_filehandler_instances(self, filetype_info, filename_items, fh_kwargs=No yield filetype_cls(filename, filename_info, filetype_info, *req_fh, **fh_kwargs) - def time_matches(self, fstart, fend): - """Check that a file's start and end time mtach filter_parameters of this reader.""" - start_time = self.filter_parameters.get("start_time") - end_time = self.filter_parameters.get("end_time") - fend = fend or fstart - if start_time and fend and fend < start_time: - return False - if end_time and fstart and fstart > end_time: - return False - return True - - def metadata_matches(self, sample_dict, file_handler=None): - """Check that file metadata matches filter_parameters of this reader.""" - # special handling of start/end times - if not self.time_matches( - sample_dict.get("start_time"), sample_dict.get("end_time")): - return False - for key, val in self.filter_parameters.items(): - if key != "area" and key not in sample_dict: - continue - - if key in ["start_time", "end_time"]: - continue - elif key == "area" and file_handler: - if not self.check_file_covers_area(file_handler, val): - logger.info("Filtering out %s based on area", - file_handler.filename) - break - elif key in sample_dict and val != sample_dict[key]: - # don't use this file - break - else: - # all the metadata keys are equal - return True - return False - - def filter_filenames_by_info(self, filename_items): - """Filter out file using metadata from the filenames. - - Currently only uses start and end time. If only start time is available - from the filename, keep all the filename that have a start time before - the requested end time. - """ - for filename, filename_info in filename_items: - fend = filename_info.get("end_time") - fstart = filename_info.setdefault("start_time", fend) - if fend and fend < fstart: - # correct for filenames with 1 date and 2 times - fend = fend.replace(year=fstart.year, - month=fstart.month, - day=fstart.day) - filename_info["end_time"] = fend - if self.metadata_matches(filename_info): - yield filename, filename_info - def filter_fh_by_metadata(self, filehandlers): """Filter out filehandlers using provide filter parameters.""" for filehandler in filehandlers: @@ -575,20 +599,6 @@ def filter_fh_by_metadata(self, filehandlers): if self.metadata_matches(filehandler.metadata, filehandler): yield filehandler - def filter_selected_filenames(self, filenames): - """Filter provided files based on metadata in the filename.""" - if not isinstance(filenames, set): - # we perform set operations later on to improve performance - filenames = set(filenames) - for _, filetype_info in self.sorted_filetype_items(): - filename_iter = self.filename_items_for_filetype(filenames, - filetype_info) - if self.filter_filenames: - filename_iter = self.filter_filenames_by_info(filename_iter) - - for fn, _ in filename_iter: - yield fn - def _new_filehandlers_for_filetype(self, filetype_info, filenames, fh_kwargs=None): """Create filehandlers for a given filetype.""" filename_iter = self.filename_items_for_filetype(filenames, @@ -603,6 +613,11 @@ def _new_filehandlers_for_filetype(self, filetype_info, filenames, fh_kwargs=Non filtered_iter = self.filter_fh_by_metadata(filehandler_iter) return list(filtered_iter) + + def create_storage_items(self, files, **kwargs): + """Create the storage items.""" + return self.create_filehandlers(files, **kwargs) + def create_filehandlers(self, filenames, fh_kwargs=None): """Organize the filenames into file types and create file handlers.""" filenames = list(OrderedDict.fromkeys(filenames)) diff --git a/satpy/tests/reader_tests/test_sar_c_safe.py b/satpy/tests/reader_tests/test_sar_c_safe.py index f801743a08..d6d178044e 100644 --- a/satpy/tests/reader_tests/test_sar_c_safe.py +++ b/satpy/tests/reader_tests/test_sar_c_safe.py @@ -18,6 +18,7 @@ """Module for testing the satpy.readers.sar-c_safe module.""" import os +from datetime import datetime from enum import Enum from io import BytesIO from pathlib import Path @@ -29,7 +30,7 @@ from satpy._config import PACKAGE_CONFIG_PATH from satpy.dataset import DataQuery from satpy.dataset.dataid import DataID -from satpy.readers.sar_c_safe import SAFEXMLAnnotation, SAFEXMLCalibration, SAFEXMLNoise +from satpy.readers.sar_c_safe import Calibrator, Denoiser, SAFEXMLAnnotation rasterio = pytest.importorskip("rasterio") @@ -37,6 +38,7 @@ dirname_suffix = "20190201T024655_20190201T024720_025730_02DC2A_AE07" filename_suffix = "20190201t024655-20190201t024720-025730-02dc2a" + @pytest.fixture(scope="module") def granule_directory(tmp_path_factory): """Create a granule directory.""" @@ -78,10 +80,10 @@ def calibration_file(granule_directory): def calibration_filehandler(calibration_file, annotation_filehandler): """Create a calibration filehandler.""" filename_info = dict(start_time=None, end_time=None, polarization="vv") - return SAFEXMLCalibration(calibration_file, + return Calibrator(calibration_file, filename_info, None, - annotation_filehandler) + image_shape=annotation_filehandler.image_shape) @pytest.fixture(scope="module") def noise_file(granule_directory): @@ -98,16 +100,16 @@ def noise_file(granule_directory): def noise_filehandler(noise_file, annotation_filehandler): """Create a noise filehandler.""" filename_info = dict(start_time=None, end_time=None, polarization="vv") - return SAFEXMLNoise(noise_file, filename_info, None, annotation_filehandler) + return Denoiser(noise_file, filename_info, None, image_shape=annotation_filehandler.image_shape) @pytest.fixture(scope="module") def noise_with_holes_filehandler(annotation_filehandler): """Create a noise filehandler from data with holes.""" filename_info = dict(start_time=None, end_time=None, polarization="vv") - noise_filehandler = SAFEXMLNoise(BytesIO(noise_xml_with_holes), + noise_filehandler = Denoiser(BytesIO(noise_xml_with_holes), filename_info, None, - annotation_filehandler) + image_shape=annotation_filehandler.image_shape) return noise_filehandler @@ -153,7 +155,7 @@ def measurement_file(granule_directory): @pytest.fixture(scope="module") -def measurement_filehandler(measurement_file, annotation_filehandler, noise_filehandler, calibration_filehandler): +def measurement_filehandler(measurement_file, noise_filehandler, calibration_filehandler): """Create a measurement filehandler.""" filename_info = {"mission_id": "S1A", "dataset_name": "foo", "start_time": 0, "end_time": 0, "polarization": "vv"} @@ -163,8 +165,7 @@ def measurement_filehandler(measurement_file, annotation_filehandler, noise_file filename_info, filetype_info, calibration_filehandler, - noise_filehandler, - annotation_filehandler) + noise_filehandler) return filehandler @@ -835,10 +836,10 @@ def test_get_calibration_constant(self, calibration_filehandler): def test_incidence_angle(annotation_filehandler): - """Test reading the incidence angle in an annotation file.""" - query = DataQuery(name="incidence_angle", polarization="vv") - res = annotation_filehandler.get_dataset(query, {}) - np.testing.assert_allclose(res, 19.18318046) + """Test reading the incidence angle in an annotation file.""" + query = DataQuery(name="incidence_angle", polarization="vv") + res = annotation_filehandler.get_dataset(query, {}) + np.testing.assert_allclose(res, 19.18318046) def test_reading_from_reader(measurement_file, calibration_file, noise_file, annotation_file): @@ -849,7 +850,7 @@ def test_reading_from_reader(measurement_file, calibration_file, noise_file, ann reader = reader_class(config) files = [measurement_file, calibration_file, noise_file, annotation_file] - reader.create_filehandlers(files) + reader.create_storage_items(files) query = DataQuery(name="measurement", polarization="vv", calibration="sigma_nought", quantity="dB") query = DataID(reader._id_keys, **query.to_dict()) @@ -858,3 +859,44 @@ def test_reading_from_reader(measurement_file, calibration_file, noise_file, ann np.testing.assert_allclose(array.attrs["area"].lons, expected_longitudes[:10, :10]) expected_db = np.array([[np.nan, -15.674268], [4.079997, 5.153585]]) np.testing.assert_allclose(array.values[:2, :2], expected_db) + + +def test_filename_filtering_from_reader(measurement_file, calibration_file, noise_file, annotation_file, tmp_path): + """Test that filenames get filtered before filehandlers are created.""" + with open(Path(PACKAGE_CONFIG_PATH) / "readers" / "sar-c_safe.yaml") as fd: + config = yaml.load(fd, Loader=yaml.UnsafeLoader) + reader_class = config["reader"]["reader"] + filter_parameters = {"start_time": datetime(2019, 2, 1, 0, 0, 0), + "end_time": datetime(2019, 2, 1, 12, 0, 0)} + reader = reader_class(config, filter_parameters) + + spurious_file = (tmp_path / "S1A_IW_GRDH_1SDV_20190202T024655_20190202T024720_025730_02DC2A_AE07.SAFE" / + "measurement" / + "s1a-iw-grd-vv-20190202t024655-20190202t024720-025730-02dc2a-001.tiff") + + + files = [spurious_file, measurement_file, calibration_file, noise_file, annotation_file] + + files = reader.filter_selected_filenames(files) + assert spurious_file not in files + try: + reader.create_storage_items(files) + except rasterio.RasterioIOError as err: + pytest.fail(str(err)) + + +def test_swath_def_contains_gcps(measurement_file, calibration_file, noise_file, annotation_file): + """Test reading using the reader defined in the config.""" + with open(Path(PACKAGE_CONFIG_PATH) / "readers" / "sar-c_safe.yaml") as fd: + config = yaml.load(fd, Loader=yaml.UnsafeLoader) + reader_class = config["reader"]["reader"] + reader = reader_class(config) + + files = [measurement_file, calibration_file, noise_file, annotation_file] + reader.create_storage_items(files) + query = DataQuery(name="measurement", polarization="vv", + calibration="sigma_nought", quantity="dB") + query = DataID(reader._id_keys, **query.to_dict()) + dataset_dict = reader.load([query]) + array = dataset_dict["measurement"] + assert array.attrs["area"].attrs["gcps"] is not None From 1e7b3591ee6e9280668efa11abf791b5ad2e41d7 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Fri, 26 Jan 2024 18:42:04 +0000 Subject: [PATCH 138/481] Enhanced viirs_l2 with geo and diff enhancements --- satpy/etc/enhancements/viirs.yaml | 50 +++++-------------------------- satpy/etc/readers/viirs_l2.yaml | 2 +- satpy/readers/viirs_l2.py | 31 +++++++++++++++++++ satpy/readers/yaml_reader.py | 17 ++++++----- 4 files changed, 49 insertions(+), 51 deletions(-) diff --git a/satpy/etc/enhancements/viirs.yaml b/satpy/etc/enhancements/viirs.yaml index a21e47aa7f..aad8407d92 100644 --- a/satpy/etc/enhancements/viirs.yaml +++ b/satpy/etc/enhancements/viirs.yaml @@ -87,42 +87,8 @@ enhancements: method: !!python/name:satpy.enhancements.palettize kwargs: palettes: - - {colors: [ - [255, 0, 0], - [170, 0, 0], - [110, 0, 0], - [112, 1, 2], - [124, 91, 5], - [240, 190, 64], - [255, 255, 0], - [0, 220, 0], - [0, 136, 0], - [0, 80, 0], - [0, 136, 238], - [0, 0, 255], - [0, 0, 170], - [0, 0, 100], - [183, 15, 141], - [102, 0, 119] - ], - values: [ - 0, - 800, - 1600, - 2350, - 3150, - 4000, - 4800, - 5600, - 6400, - 7200, - 8000, - 8800, - 9600, - 10400, - 11200, - 12000 - ], + - { + filename: cth.txt, min_value: 0, max_value: 18000, } @@ -134,8 +100,8 @@ enhancements: method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - {colors: [[255, 247, 236], [254, 246, 233], [254, 244, 230], [254, 243, 228], [254, 242, 224], [254, 241, 222], [254, 239, 219], [254, 239, 216], [254, 237, 213], [254, 236, 210], [254, 235, 207], [254, 233, 204], [254, 232, 202], [253, 231, 198], [253, 230, 195], [253, 228, 191], [253, 226, 189], [253, 225, 185], [253, 223, 181], [253, 221, 178], [253, 220, 174], [253, 218, 172], [253, 216, 168], [253, 215, 165], [253, 213, 161], [253, 211, 157], [253, 210, 156], [253, 207, 153], [253, 206, 152], [253, 203, 149], [253, 202, 148], [253, 200, 145], [253, 198, 143], [253, 196, 141], [253, 193, 139], [253, 192, 137], [253, 189, 134], [253, 188, 133], [252, 185, 130], [252, 182, 127], [252, 177, 123], [252, 174, 120], [252, 170, 116], [252, 166, 112], [252, 163, 109], [252, 159, 105], [252, 156, 103], [252, 151, 99], [252, 148, 96], [252, 144, 92], [251, 140, 88], [250, 137, 87], [249, 134, 86], [248, 131, 85], [247, 127, 83], [246, 125, 82], [245, 121, 80], [244, 119, 79], [243, 115, 78], [242, 111, 76], [241, 109, 75], [240, 105, 73], [239, 102, 72], [237, 98, 69], [236, 94, 67], [234, 89, 63], [232, 86, 60], [230, 81, 57], [227, 76, 53], [226, 73, 50], [224, 68, 46], [222, 65, 44], [220, 60, 40], [218, 56, 37], [216, 51, 33], [214, 46, 30], [211, 43, 28], [208, 39, 25], [206, 36, 23], [202, 31, 20], [200, 28, 18], [197, 24, 15], [194, 21, 13], [191, 16, 10], [188, 12, 7], [185, 9, 5], [182, 4, 3], [180, 1, 1], [175, 0, 0], [172, 0, 0], [167, 0, 0], [164, 0, 0], [159, 0, 0], [154, 0, 0], [151, 0, 0], [146, 0, 0], [143, 0, 0], [138, 0, 0], [135, 0, 0], [130, 0, 0], [127, 0, 0]], - values: [0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1], + - { + filename: csc.txt, min_value: 0.0, max_value: 1.0 } @@ -148,9 +114,9 @@ enhancements: method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - {colors: 'ylorrd', + - {filename: aod.txt, min_value: 0.0, - max_value: 1.0, + max_value: 5.0, } Angstrom_Exponent_Land_Ocean: @@ -160,8 +126,8 @@ enhancements: method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - {colors: [[122, 145, 2], [123, 148, 3], [124, 150, 4], [124, 153, 5], [125, 155, 6], [126, 158, 7], [127, 160, 8], [127, 163, 9], [128, 165, 10], [129, 168, 11], [130, 170, 12], [130, 173, 13], [131, 175, 14], [132, 178, 15], [133, 181, 16], [132, 183, 18], [132, 185, 20], [132, 187, 22], [132, 189, 25], [132, 191, 27], [132, 193, 29], [132, 195, 31], [131, 197, 34], [131, 199, 36], [131, 201, 38], [131, 203, 40], [131, 205, 43], [131, 207, 45], [131, 209, 47], [131, 212, 50], [130, 213, 51], [129, 215, 53], [128, 217, 55], [128, 219, 57], [127, 221, 59], [126, 222, 61], [125, 224, 63], [125, 226, 64], [124, 228, 66], [123, 230, 68], [122, 231, 70], [122, 233, 72], [121, 235, 74], [120, 237, 76], [120, 239, 78], [119, 239, 79], [118, 240, 80], [117, 241, 82], [116, 242, 83], [116, 243, 85], [115, 244, 86], [114, 245, 87], [113, 246, 89], [112, 247, 90], [112, 248, 92], [111, 249, 93], [110, 250, 94], [109, 251, 96], [108, 252, 97], [108, 253, 99], [107, 252, 100], [106, 252, 102], [106, 252, 103], [105, 251, 105], [105, 251, 106], [104, 251, 108], [103, 251, 109], [103, 250, 111], [102, 250, 112], [102, 250, 114], [101, 250, 115], [100, 249, 117], [100, 249, 118], [99, 249, 120], [99, 249, 122], [98, 247, 123], [97, 246, 124], [96, 245, 126], [95, 244, 127], [94, 243, 128], [93, 242, 130], [92, 241, 131], [92, 239, 132], [91, 238, 134], [90, 237, 135], [89, 236, 136], [88, 235, 138], [87, 234, 139], [86, 233, 140], [86, 232, 142], [85, 230, 143], [84, 229, 144], [83, 228, 145], [82, 226, 147], [81, 225, 148], [80, 224, 149], [79, 223, 150], [78, 221, 152], [77, 220, 153], [76, 219, 154], [75, 218, 155], [74, 216, 157], [73, 215, 158], [72, 214, 159], [72, 213, 161], [71, 211, 162], [70, 209, 163], [69, 208, 164], [68, 206, 165], [67, 205, 166], [66, 203, 167], [65, 201, 168], [64, 200, 170], [63, 198, 171], [62, 197, 172], [61, 195, 173], [60, 193, 174], [59, 192, 175], [58, 190, 176], [58, 189, 178], [58, 187, 178], [58, 185, 179], [58, 184, 180], [58, 182, 181], [58, 181, 182], [58, 179, 183], [58, 178, 184], [59, 176, 184], [59, 175, 185], [59, 173, 186], [59, 172, 187], [59, 170, 188], [59, 169, 189], [59, 167, 190], [60, 166, 191], [60, 164, 191], [61, 162, 192], [61, 160, 193], [62, 158, 194], [63, 156, 195], [63, 154, 195], [64, 152, 196], [64, 150, 197], [65, 148, 198], [66, 146, 199], [66, 144, 199], [67, 142, 200], [67, 140, 201], [68, 138, 202], [69, 137, 203], [69, 135, 203], [70, 133, 204], [70, 131, 205], [71, 129, 205], [72, 128, 206], [72, 126, 207], [73, 124, 207], [73, 122, 208], [74, 120, 209], [75, 119, 209], [75, 117, 210], [76, 115, 211], [76, 113, 211], [77, 111, 212], [78, 110, 213], [78, 108, 213], [79, 106, 214], [80, 104, 214], [80, 102, 215], [81, 101, 216], [82, 99, 216], [82, 97, 217], [83, 95, 217], [84, 93, 218], [84, 92, 219], [85, 90, 219], [86, 88, 220], [86, 86, 220], [87, 84, 221], [88, 83, 222], [88, 82, 222], [89, 81, 223], [90, 80, 223], [91, 80, 224], [92, 79, 224], [93, 78, 225], [94, 77, 225], [95, 77, 226], [96, 76, 226], [97, 75, 227], [98, 74, 227], [99, 74, 228], [100, 73, 228], [101, 72, 229], [102, 72, 230], [104, 72, 230], [106, 73, 230], [108, 73, 230], [110, 74, 231], [112, 74, 231], [114, 75, 231], [116, 75, 231], [118, 76, 232], [120, 76, 232], [122, 77, 232], [124, 77, 232], [126, 78, 233], [128, 78, 233], [130, 79, 233], [133, 80, 234], [135, 80, 234], [137, 80, 234], [139, 81, 234], [141, 81, 234], [143, 81, 234], [145, 82, 234], [147, 82, 234], [149, 82, 234], [151, 83, 234], [153, 83, 234], [155, 83, 234], [157, 84, 234], [159, 84, 234], [161, 84, 234], [164, 85, 235], [165, 85, 235], [166, 85, 235], [168, 85, 235], [169, 85, 235], [171, 85, 235], [172, 85, 235], [174, 85, 235], [175, 86, 235], [177, 86, 235], [178, 86, 235], [180, 86, 235], [181, 86, 235], [183, 86, 235], [184, 86, 235], [186, 87, 235], [187, 87, 234], [188, 87, 234], [190, 87, 234], [191, 88, 234], [193, 88, 234], [194, 88, 234], [196, 88, 234], [197, 89, 234], [199, 89, 234], [200, 89, 234], [202, 89, 234]], - values: [0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39, 1.4, 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59, 1.6, 1.61, 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69, 1.7, 1.71, 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78, 1.79, 1.8, 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, 1.88, 1.89, 1.9, 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98, 1.99, 2, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4, 2.41, 2.42, 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5], + - { + filename: aelo.txt, min_value: -0.5, max_value: 2.5, } diff --git a/satpy/etc/readers/viirs_l2.yaml b/satpy/etc/readers/viirs_l2.yaml index 045b69cd75..b8f403917f 100644 --- a/satpy/etc/readers/viirs_l2.yaml +++ b/satpy/etc/readers/viirs_l2.yaml @@ -5,7 +5,7 @@ reader: description: Generic NASA VIIRS L2 Reader status: Alpha supports_fsspec: false - reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader + reader: !!python/name:satpy.readers.yaml_reader.GEOFlippableFileYAMLReader sensors: [viirs] default_datasets: diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index 671ad98c7a..37247d7933 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -166,3 +166,34 @@ def get_dataset(self, ds_id: int, ds_info: str) -> xr.DataArray: if "number_of_lines" in data.dims: data = data.rename({"number_of_lines": "y", "number_of_pixels": "x"}) return data + + def get_area_def(self, ds_id): + """Get area definition.""" + proj_dict = { + "proj": "latlong", + "datum": "WGS84", + "ellps": "WGS84", + "no_defs": True + } + + area_extent = [self["/attr/geospatial_lon_min"], self["/attr/geospatial_lat_min"], + self["/attr/geospatial_lon_max"], self["/attr/geospatial_lat_max"]] + + if '/dimension/number_of_pixels' in self: + width = int(self['/dimension/number_of_pixels']) + height = int(self['/dimension/number_of_lines']) + else: + width = int(self['/dimension/Idx_Xtrack']) # ncols + height = int(self['/dimension/Idx_Atrack']) + + area = AreaDefinition( + "viirs_l2_area", + "name_of_proj", + "id_of_proj", + proj_dict, + width, + height, + np.asarray(area_extent) + ) + + return area diff --git a/satpy/readers/yaml_reader.py b/satpy/readers/yaml_reader.py index 29aaaf0955..809744251e 100644 --- a/satpy/readers/yaml_reader.py +++ b/satpy/readers/yaml_reader.py @@ -1010,14 +1010,15 @@ def _set_orientation(dataset, upper_right_corner): logger.info("Dataset {} is in a SwathDefinition " "and will not be flipped.".format(dataset.attrs.get("name", "unknown_name"))) return dataset - - projection_type = _get_projection_type(dataset.attrs["area"]) - accepted_geos_proj_types = ["Geostationary Satellite (Sweep Y)", "Geostationary Satellite (Sweep X)"] - if projection_type not in accepted_geos_proj_types: - logger.info("Dataset {} is not in one of the known geostationary projections {} " - "and cannot be flipped.".format(dataset.attrs.get("name", "unknown_name"), - accepted_geos_proj_types)) - return dataset + + if dataset.attrs['area'].area_id != 'viirs_l2_area': + projection_type = _get_projection_type(dataset.attrs["area"]) + accepted_geos_proj_types = ["Geostationary Satellite (Sweep Y)", "Geostationary Satellite (Sweep X)"] + if projection_type not in accepted_geos_proj_types: + logger.info("Dataset {} is not in one of the known geostationary projections {} " + "and cannot be flipped.".format(dataset.attrs.get("name", "unknown_name"), + accepted_geos_proj_types)) + return dataset target_eastright, target_northup = _get_target_scene_orientation(upper_right_corner) From c8901a1a6b865ee327bf56dc67be708b3ad050d3 Mon Sep 17 00:00:00 2001 From: Olivier Samain Date: Mon, 29 Jan 2024 11:26:44 +0100 Subject: [PATCH 139/481] made common parameters generic --- satpy/etc/readers/fci_l2_nc.yaml | 343 +++++-------------------------- 1 file changed, 55 insertions(+), 288 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index e3e063f09b..6c87d10c53 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -77,6 +77,61 @@ file_types: datasets: +# COMMON + product_quality: + name: product_quality + standard_name: product_quality + file_type: [nc_fci_amv, nc_fci_clm, nc_fci_ct, nc_fci_ctth, nc_fci_fir, nc_fci_gii, nc_fci_oca, nc_fci_olr, nc_fci_crm, nc_fci_asr] + nc_key: product_quality + + product_completeness: + name: product_completeness + standard_name: product_completeness + file_type: [nc_fci_amv, nc_fci_clm, nc_fci_ct, nc_fci_ctth, nc_fci_fir, nc_fci_gii, nc_fci_oca, nc_fci_olr, nc_fci_crm, nc_fci_asr] + nc_key: product_completeness + + product_timeliness: + name: product_timeliness + standard_name: product_timeliness + file_type: [nc_fci_amv, nc_fci_clm, nc_fci_ct, nc_fci_ctth, nc_fci_fir, nc_fci_gii, nc_fci_oca, nc_fci_olr, nc_fci_crm, nc_fci_asr] + nc_key: product_timeliness + + quality_illumination: + name: quality_illumination + standard_name: status_flag + resolution: 2000 + file_type: [nc_fci_clm, nc_fci_ct] + nc_key: quality_illumination + fill_value: -127 + import_enum_information: True + + quality_nwp_parameters: + name: quality_nwp_parameters + standard_name: status_flag + resolution: 2000 + file_type: [nc_fci_clm, nc_fci_ct, nc_fci_ctth] + nc_key: quality_nwp_parameters + fill_value: -127 + import_enum_information: True + + quality_MTG_parameters: + name: quality_MTG_parameters + standard_name: status_flag + resolution: 2000 + file_type: [nc_fci_clm, nc_fci_ct, nc_fci_ctth] + nc_key: quality_MTG_parameters + fill_value: -127 + import_enum_information: True + + quality_overall_processing: + name: quality_overall_processing + standard_name: quality_flag + resolution: 2000 + file_type: [nc_fci_clm, nc_fci_ct, nc_fci_ctth, nc_fci_olr] + nc_key: quality_overall_processing + fill_value: -127 + import_enum_information: True + # AMV Intermediate - Atmospheric Motion Vectors Intermediate intm_latitude: name: intm_latitude @@ -317,24 +372,6 @@ datasets: - longitude - latitude - product_quality: - name: product_quality - standard_name: product_quality - file_type: nc_fci_amv - nc_key: product_quality - - product_completeness: - name: product_completeness - standard_name: product_completeness - file_type: nc_fci_amv - nc_key: product_completeness - - product_timeliness: - name: product_timeliness - standard_name: product_timeliness - file_type: nc_fci_amv - nc_key: product_timeliness - # CLM - Cloud Mask cloud_state: @@ -346,60 +383,6 @@ datasets: fill_value: -127 import_enum_information: True - quality_illumination_clm: - name: quality_illumination_clm - standard_name: status_flag - resolution: 2000 - file_type: nc_fci_clm - nc_key: quality_illumination - fill_value: -127 - import_enum_information: True - - quality_nwp_parameters_clm: - name: quality_nwp_parameters_clm - standard_name: status_flag - resolution: 2000 - file_type: nc_fci_clm - nc_key: quality_nwp_parameters - fill_value: -127 - import_enum_information: True - - quality_MTG_parameters_clm: - name: quality_MTG_parameters_clm - standard_name: status_flag - resolution: 2000 - file_type: nc_fci_clm - nc_key: quality_MTG_parameters - fill_value: -127 - import_enum_information: True - - quality_overall_processing_clm: - name: quality_overall_processing_clm - standard_name: quality_flag - resolution: 2000 - file_type: nc_fci_clm - nc_key: quality_overall_processing - fill_value: -127 - import_enum_information: True - - product_quality_clm: - name: product_quality_clm - standard_name: product_quality - file_type: nc_fci_clm - nc_key: product_quality - - product_completeness_clm: - name: product_completeness_clm - standard_name: product_completeness - file_type: nc_fci_clm - nc_key: product_completeness - - product_timeliness_clm: - name: product_timeliness_clm - standard_name: product_timeliness - file_type: nc_fci_clm - nc_key: product_timeliness - # CT - Cloud Type cloud_phase: @@ -420,60 +403,6 @@ datasets: fill_value: -127 import_enum_information: True - quality_illumination_ct: - name: quality_illumination_ct - standard_name: status_flag - resolution: 2000 - file_type: nc_fci_ct - nc_key: quality_illumination - fill_value: -127 - import_enum_information: True - - quality_nwp_parameters_ct: - name: quality_nwp_parameters_ct - standard_name: status_flag - resolution: 2000 - file_type: nc_fci_ct - nc_key: quality_nwp_parameters - fill_value: -127 - import_enum_information: True - - quality_MTG_parameters_ct: - name: quality_MTG_parameters_ct - standard_name: status_flag - resolution: 2000 - file_type: nc_fci_ct - nc_key: quality_MTG_parameters - fill_value: -127 - import_enum_information: True - - quality_overall_processing_ct: - name: quality_overall_processing_ct - standard_name: quality_flag - resolution: 2000 - file_type: nc_fci_ct - nc_key: quality_overall_processing - fill_value: -127 - import_enum_information: True - - product_quality_ct: - name: product_quality_ct - standard_name: product_quality - file_type: nc_fci_ct - nc_key: product_quality - - product_completeness_ct: - name: product_completeness_ct - standard_name: product_completeness - file_type: nc_fci_ct - nc_key: product_completeness - - product_timeliness_ct: - name: product_timeliness_ct - standard_name: product_timeliness - file_type: nc_fci_ct - nc_key: product_timeliness - # CTTH - Cloud Top Temperature and Height cloud_top_aviation_height: @@ -538,33 +467,6 @@ datasets: fill_value: -127 import_enum_information: True - quality_nwp_parameters_ctth: - name: quality_nwp_parameters_ctth - standard_name: status_flag - resolution: 2000 - file_type: nc_fci_ctth - nc_key: quality_nwp_parameters - fill_value: -127 - import_enum_information: True - - quality_MTG_parameters_ctth: - name: quality_MTG_parameters_ctth - standard_name: status_flag - resolution: 2000 - file_type: nc_fci_ctth - nc_key: quality_MTG_parameters - fill_value: -127 - import_enum_information: True - - quality_overall_processing_ctth: - name: quality_overall_processing_ctth - standard_name: quality_flag - resolution: 2000 - file_type: nc_fci_ctth - nc_key: quality_overall_processing - fill_value: -127 - import_enum_information: True - quality_overall_processing_aviation_ctth: name: quality_overall_processing_aviation_ctth standard_name: quality_flag @@ -574,24 +476,6 @@ datasets: fill_value: -127 import_enum_information: True - product_quality_ctth: - name: product_quality_ctth - standard_name: product_quality - file_type: nc_fci_ctth - nc_key: product_quality - - product_completeness_ctth: - name: product_completeness_ctth - standard_name: product_completeness - file_type: nc_fci_ctth - nc_key: product_completeness - - product_timeliness_ctth: - name: product_timeliness_ctth - standard_name: product_timeliness - file_type: nc_fci_ctth - nc_key: product_timeliness - # FIR - Active Fire Monitoring fire_probability: @@ -610,24 +494,6 @@ datasets: fill_value: -127 import_enum_information: True - product_quality_fir: - name: product_quality_fir - standard_name: product_quality - file_type: nc_fci_fir - nc_key: product_quality - - product_completeness_fir: - name: product_completeness_fir - standard_name: product_completeness - file_type: nc_fci_fir - nc_key: product_completeness - - product_timeliness_fir: - name: product_timeliness_fir - standard_name: product_timeliness - file_type: nc_fci_fir - nc_key: product_timeliness - # GII - Global Instability Index k_index: @@ -712,24 +578,6 @@ datasets: - longitude - latitude - product_quality_gii: - name: product_quality_gii - standard_name: product_quality - file_type: nc_fci_gii - nc_key: product_quality - - product_completeness_gii: - name: product_completeness_gii - standard_name: product_completeness - file_type: nc_fci_gii - nc_key: product_completeness - - product_timeliness_gii: - name: product_timeliness_gii - standard_name: product_timeliness - file_type: nc_fci_gii - nc_key: product_timeliness - # OCA - Optimal Cloud Analysis retrieved_cloud_phase: @@ -855,24 +703,6 @@ datasets: file_type: nc_fci_oca nc_key: quality_jmeas - product_quality_oca: - name: product_quality_oca - standard_name: product_quality - file_type: nc_fci_oca - nc_key: product_quality - - product_completeness_oca: - name: product_completeness_oca - standard_name: product_completeness - file_type: nc_fci_oca - nc_key: product_completeness - - product_timeliness_oca: - name: product_timeliness_oca - standard_name: product_timeliness - file_type: nc_fci_oca - nc_key: product_timeliness - # OLR - Outgoing Longwave Radiation olr: @@ -891,33 +721,6 @@ datasets: fill_value: -127 import_enum_information: True - quality_overall_processing_olr: - name: quality_overall_processing_olr - standard_name: quality_flag - resolution: 2000 - file_type: nc_fci_olr - nc_key: quality_overall_processing - fill_value: -127 - import_enum_information: True - - product_quality_olr: - name: product_quality_olr - standard_name: product_quality - file_type: nc_fci_olr - nc_key: product_quality - - product_completeness_olr: - name: product_completeness_olr - standard_name: product_completeness - file_type: nc_fci_olr - nc_key: product_completeness - - product_timeliness_olr: - name: product_timeliness_olr - standard_name: product_timeliness - file_type: nc_fci_olr - nc_key: product_timeliness - # CRM - Clear-Sky Reflectance Maps crm: @@ -1048,24 +851,6 @@ datasets: nc_key: historical_data import_enum_information: True - product_quality_crm: - name: product_quality_crm - standard_name: product_quality - file_type: nc_fci_crm - nc_key: product_quality - - product_completeness_crm: - name: product_completeness_crm - standard_name: product_completeness - file_type: nc_fci_crm - nc_key: product_completeness - - product_timeliness_crm: - name: product_timeliness_crm - standard_name: product_timeliness - file_type: nc_fci_crm - nc_key: product_timeliness - # LAT/LON FOR SEGMENTED PRODUCTS latitude: @@ -3356,21 +3141,3 @@ datasets: coordinates: - longitude - latitude - - product_quality_asr: - name: product_quality_asr - standard_name: product_quality - file_type: nc_fci_asr - nc_key: product_quality - - product_completeness_asr: - name: product_completeness_asr - standard_name: product_completeness - file_type: nc_fci_asr - nc_key: product_completeness - - product_timeliness_asr: - name: product_timeliness_asr - standard_name: product_timeliness - file_type: nc_fci_asr - nc_key: product_timeliness From c394307e9210a38e89c5a312c93c6a83ea58247b Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Mon, 29 Jan 2024 12:09:14 +0100 Subject: [PATCH 140/481] make all dataset names lower-case and remove _ from dataset names. --- satpy/etc/readers/fci_l2_nc.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 6c87d10c53..80229b4b81 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -114,7 +114,7 @@ datasets: fill_value: -127 import_enum_information: True - quality_MTG_parameters: + quality_mtg_parameters: name: quality_MTG_parameters standard_name: status_flag resolution: 2000 @@ -440,8 +440,8 @@ datasets: file_type: nc_fci_ctth nc_key: effective_cloudiness - quality_status_ctth: - name: quality_status_ctth + quality_status: + name: quality_status standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth From 48b4dca28209d41d9328055466dd4eb87721ffbf Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 29 Jan 2024 14:04:49 +0100 Subject: [PATCH 141/481] Update asv dependencies --- asv.conf.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/asv.conf.json b/asv.conf.json index dbecadf79a..998dc77bd3 100644 --- a/asv.conf.json +++ b/asv.conf.json @@ -58,7 +58,7 @@ // The Pythons you'd like to test against. If not provided, defaults // to the current version of Python used to run `asv`. // "pythons": ["2.7", "3.6"], - "pythons": ["3.9", "3.10"], + "pythons": ["3.11", "3.12"], // The list of conda channel names to be searched for benchmark // dependency packages in the specified order @@ -80,14 +80,14 @@ // "pip+emcee": [""], // emcee is only available for install with pip. // }, "matrix": { - "pyresample": ["1.22.3"], - "trollimage": ["1.17.0"], - "pyorbital": ["1.7.1"], - "pyspectral": ["0.10.6"], - "rasterio": ["1.2.10"], - "dask": ["2021.12.0"], - "xarray": ["0.20.2"], - "numpy": ["1.22.0"], + "pyresample": ["1.27.1"], + "trollimage": ["1.22.2"], + "pyorbital": ["1.8.1"], + "pyspectral": ["0.13.0"], + "rasterio": ["1.3.9"], + "dask": ["2024.1.1"], + "xarray": ["2024.1.1"], + "numpy": ["1.26.0"], "s3fs": [], "h5py": [], "netCDF4": [], From 65cb1ad57da65d2dce9e3752a71549ffe13dd033 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 29 Jan 2024 14:13:52 +0100 Subject: [PATCH 142/481] Use mamba as environment type --- asv.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asv.conf.json b/asv.conf.json index 998dc77bd3..0b53ffd65c 100644 --- a/asv.conf.json +++ b/asv.conf.json @@ -46,7 +46,7 @@ // determined by looking for tools on the PATH environment // variable. //"environment_type": "virtualenv", - "environment_type": "conda", + "environment_type": "mamba", // timeout in seconds for installing any dependencies in environment // defaults to 10 min From 0c10810d2e27dfad7d69652ae7a639cd5337b82a Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 29 Jan 2024 15:20:05 +0100 Subject: [PATCH 143/481] Pin pytest --- continuous_integration/environment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/continuous_integration/environment.yaml b/continuous_integration/environment.yaml index ecc0084ea7..215d215eac 100644 --- a/continuous_integration/environment.yaml +++ b/continuous_integration/environment.yaml @@ -43,7 +43,7 @@ dependencies: - python-eccodes # 2.19.1 seems to cause library linking issues - eccodes>=2.20 - - pytest + - pytest<8.0.0 - pytest-cov - pytest-lazy-fixture - fsspec From 2afb5ed79784fe8a77f5e4a3bdc89859a1434eb8 Mon Sep 17 00:00:00 2001 From: Johan Strandgren <42137969+strandgren@users.noreply.github.com> Date: Mon, 29 Jan 2024 15:41:54 +0100 Subject: [PATCH 144/481] Harmonize dataset names. --- satpy/etc/readers/fci_l2_nc.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index 80229b4b81..b6056b2a65 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -449,8 +449,8 @@ datasets: fill_value: -127 import_enum_information: True - quality_rtm_ctth: - name: quality_rtm_ctth + quality_rtm: + name: quality_rtm standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth @@ -458,8 +458,8 @@ datasets: fill_value: -127 import_enum_information: True - quality_method_ctth: - name: quality_method_ctth + quality_method: + name: quality_method standard_name: status_flag resolution: 2000 file_type: nc_fci_ctth @@ -467,8 +467,8 @@ datasets: fill_value: -127 import_enum_information: True - quality_overall_processing_aviation_ctth: - name: quality_overall_processing_aviation_ctth + quality_overall_processing_aviation: + name: quality_overall_processing_aviation standard_name: quality_flag resolution: 2000 file_type: nc_fci_ctth @@ -556,8 +556,8 @@ datasets: - longitude - latitude - percent_cloud_free_gii: - name: percent_cloud_free_gii + percent_cloud_free: + name: percent_cloud_free long_name: Percentage of Cloud Free Pixels Processed in FoR standard_name: cloud_free_area_fraction resolution: 6000 @@ -568,8 +568,8 @@ datasets: - longitude - latitude - number_of_iterations_gii: - name: number_of_iterations_gii + number_of_iterations: + name: number_of_iterations standard_name: number_of_iterations resolution: 6000 file_type: nc_fci_gii @@ -712,8 +712,8 @@ datasets: file_type: nc_fci_olr nc_key: olr_value - cloud_type_olr: - name: cloud_type_olr + olr_cloud_type: + name: olr_cloud_type standard_name: cloud_type_classification resolution: 2000 file_type: nc_fci_olr From f5f62f4c65ea2f0428999eba97577abaedf2b843 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Mon, 29 Jan 2024 14:48:32 +0000 Subject: [PATCH 145/481] flake8 linting --- satpy/readers/viirs_l2.py | 3 +-- satpy/readers/yaml_reader.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index 37247d7933..0aa2cb4add 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -6,7 +6,6 @@ from satpy.readers.netcdf_utils import NetCDF4FileHandler import xarray as xr from pyresample.geometry import AreaDefinition -import numpy as np LOG = logging.getLogger(__name__) @@ -183,7 +182,7 @@ def get_area_def(self, ds_id): width = int(self['/dimension/number_of_pixels']) height = int(self['/dimension/number_of_lines']) else: - width = int(self['/dimension/Idx_Xtrack']) # ncols + width = int(self['/dimension/Idx_Xtrack']) height = int(self['/dimension/Idx_Atrack']) area = AreaDefinition( diff --git a/satpy/readers/yaml_reader.py b/satpy/readers/yaml_reader.py index 809744251e..ee6d82a961 100644 --- a/satpy/readers/yaml_reader.py +++ b/satpy/readers/yaml_reader.py @@ -1010,7 +1010,7 @@ def _set_orientation(dataset, upper_right_corner): logger.info("Dataset {} is in a SwathDefinition " "and will not be flipped.".format(dataset.attrs.get("name", "unknown_name"))) return dataset - + if dataset.attrs['area'].area_id != 'viirs_l2_area': projection_type = _get_projection_type(dataset.attrs["area"]) accepted_geos_proj_types = ["Geostationary Satellite (Sweep Y)", "Geostationary Satellite (Sweep X)"] From 867a0aa043ff39a06d1f335a4d5eec0e896b12ec Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Mon, 29 Jan 2024 14:49:24 +0000 Subject: [PATCH 146/481] Moved viirs_l2 enhancements for viirs to generic --- satpy/etc/enhancements/generic.yaml | 52 +++++++++++++++++++++++++++++ satpy/etc/enhancements/viirs.yaml | 50 --------------------------- 2 files changed, 52 insertions(+), 50 deletions(-) diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index 25680d6db9..6ad3801a4b 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1230,3 +1230,55 @@ enhancements: stretch: crude min_stretch: [0,0,0] max_stretch: [1,1,1] + + Cloud_Top_Height: + name: Cloud_Top_Height + operations: + - name: palettize + method: !!python/name:satpy.enhancements.palettize + kwargs: + palettes: + - { + filename: cth.txt, + min_value: 0, + max_value: 18000, + } + + Clear_Sky_Confidence: + name: Clear_Sky_Confidence + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - { + filename: csc.txt, + min_value: 0.0, + max_value: 1.0 + } + + + Aerosol_Optical_Thickness_550_Land_Ocean: + name: Aerosol_Optical_Thickness_550_Land_Ocean + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - {filename: aod.txt, + min_value: 0.0, + max_value: 5.0, + } + + Angstrom_Exponent_Land_Ocean: + name: Angstrom_Exponent_Land_Ocean + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - { + filename: aelo.txt, + min_value: -0.5, + max_value: 2.5, + } diff --git a/satpy/etc/enhancements/viirs.yaml b/satpy/etc/enhancements/viirs.yaml index aad8407d92..62198c4de3 100644 --- a/satpy/etc/enhancements/viirs.yaml +++ b/satpy/etc/enhancements/viirs.yaml @@ -80,55 +80,5 @@ enhancements: min_value: 0, max_value: 201} - Cloud_Top_Height: - name: Cloud_Top_Height - operations: - - name: palettize - method: !!python/name:satpy.enhancements.palettize - kwargs: - palettes: - - { - filename: cth.txt, - min_value: 0, - max_value: 18000, - } - - Clear_Sky_Confidence: - name: Clear_Sky_Confidence - operations: - - name: colorize - method: !!python/name:satpy.enhancements.colorize - kwargs: - palettes: - - { - filename: csc.txt, - min_value: 0.0, - max_value: 1.0 - } - Aerosol_Optical_Thickness_550_Land_Ocean: - name: Aerosol_Optical_Thickness_550_Land_Ocean - operations: - - name: colorize - method: !!python/name:satpy.enhancements.colorize - kwargs: - palettes: - - {filename: aod.txt, - min_value: 0.0, - max_value: 5.0, - } - - Angstrom_Exponent_Land_Ocean: - name: Angstrom_Exponent_Land_Ocean - operations: - - name: colorize - method: !!python/name:satpy.enhancements.colorize - kwargs: - palettes: - - { - filename: aelo.txt, - min_value: -0.5, - max_value: 2.5, - } - From 80f0b2dbb77434d6bb6e276bc1d6b9a3be93513d Mon Sep 17 00:00:00 2001 From: Johan Strandgren Date: Mon, 29 Jan 2024 15:06:42 +0000 Subject: [PATCH 147/481] Use flag_values from enum dict. --- satpy/readers/fci_l2_nc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index 91dab92c48..3f4209ec55 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -119,9 +119,9 @@ def _add_flag_values_and_meamings(filename,key,variable): enum = dataType.enum_dict flag_values = [] flag_meanings = [] - for item in enumerate(enum): - flag_values.append(item[0]) - flag_meanings.append(item[1]) + for meaning, value in enum.items(): + flag_values.append(value) + flag_meanings.append(meaning) variable.attrs["flag_values"] = flag_values variable.attrs["flag_meanings"] = flag_meanings From 6d888bea044fa063e00b90bc80c4aab8e29f7004 Mon Sep 17 00:00:00 2001 From: Johan Strandgren Date: Mon, 29 Jan 2024 15:09:48 +0000 Subject: [PATCH 148/481] Fix code style. --- satpy/readers/fci_l2_nc.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index 3f4209ec55..899581b19a 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -101,8 +101,8 @@ def _set_attributes(self, variable, dataset_info, segmented=False): variable.attrs.update(self._get_global_attributes()) import_enum_information = dataset_info.get("import_enum_information", False) - if (import_enum_information): - variable = self._add_flag_values_and_meamings(self.filename,dataset_info["nc_key"], variable) + if import_enum_information: + variable = self._add_flag_values_and_meamings(self.filename, dataset_info["nc_key"], variable) if variable.attrs["units"] == "none": variable.attrs.update({"units": None}) @@ -110,13 +110,13 @@ def _set_attributes(self, variable, dataset_info, segmented=False): return variable @staticmethod - def _add_flag_values_and_meamings(filename,key,variable): - #"""Build flag values and meaning from enum datatype """ - netCDF4_dataset = netCDF4.Dataset(filename, "r") + def _add_flag_values_and_meamings(filename, key, variable): + """Build flag values and meaning from enum datatype.""" + nc_dataset = netCDF4.Dataset(filename, "r") # This currently assumes a flat netCDF file - dataType=netCDF4_dataset.variables[key].datatype - if (hasattr(dataType,"enum_dict")): - enum = dataType.enum_dict + data_type = nc_dataset.variables[key].datatype + if hasattr(data_type, "enum_dict"): + enum = data_type.enum_dict flag_values = [] flag_meanings = [] for meaning, value in enum.items(): @@ -125,7 +125,7 @@ def _add_flag_values_and_meamings(filename,key,variable): variable.attrs["flag_values"] = flag_values variable.attrs["flag_meanings"] = flag_meanings - netCDF4_dataset.close() + nc_dataset.close() return variable @@ -187,7 +187,6 @@ def __init__(self, filename, filename_info, filetype_info, with_area_definition= self._projection = self.nc["mtg_geos_projection"] self.multi_dims = {"maximum_number_of_layers": "layer", "number_of_vis_channels": "vis_channel_id"} - def get_area_def(self, key): """Return the area definition.""" try: @@ -270,9 +269,9 @@ def _get_area_extent(self): area_extent_pixel_center = make_ext(ll_x, ur_x, ll_y, ur_y, h) # Shift area extent by half a pixel to get the area extent w.r.t. the dataset/pixel corners - scale_factor = (x[1:]-x[0:-1]).values.mean() + scale_factor = (x[1:] - x[0:-1]).values.mean() res = abs(scale_factor) * h - area_extent = tuple(i + res/2 if i > 0 else i - res/2 for i in area_extent_pixel_center) + area_extent = tuple(i + res / 2 if i > 0 else i - res / 2 for i in area_extent_pixel_center) return area_extent @@ -437,8 +436,10 @@ def _modify_area_extent(stand_area_extent): return area_extent + class FciL2NCAMVFileHandler(FciL2CommonFunctions, BaseFileHandler): """Reader class for FCI L2 AMV products in NetCDF4 format.""" + def __init__(self, filename, filename_info, filetype_info): """Open the NetCDF file with xarray and prepare for dataset reading.""" super().__init__(filename, filename_info, filetype_info) @@ -472,7 +473,7 @@ def _get_global_attributes(self): "spacecraft_name": self.spacecraft_name, "sensor": self.sensor_name, "platform_name": self.spacecraft_name, - "channel":self.filename_info["channel"] + "channel": self.filename_info["channel"] } return attributes From 82750f1a857cbd6ce763691c94cebd92660fddfe Mon Sep 17 00:00:00 2001 From: Johan Strandgren Date: Mon, 29 Jan 2024 15:10:41 +0000 Subject: [PATCH 149/481] Use swap_dims instead of rename to rename dimensions. --- satpy/readers/fci_l2_nc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index 899581b19a..4187d133c5 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -89,7 +89,7 @@ def _set_attributes(self, variable, dataset_info, segmented=False): xdim, ydim = "number_of_columns", "number_of_rows" if dataset_info["nc_key"] not in ["product_quality", "product_completeness", "product_timeliness"]: - variable = variable.rename({ydim: "y", xdim: "x"}) + variable = variable.swap_dims({ydim: "y", xdim: "x"}) variable.attrs.setdefault("units", None) if "unit" in variable.attrs: From 07d258d68c7c5740450506b01272a0f71efe1be8 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Mon, 29 Jan 2024 14:25:58 -0600 Subject: [PATCH 150/481] Remove slstr_l2 reader in favor of ghrsst_l2 --- satpy/etc/readers/slstr_l2.yaml | 63 --------------------------------- satpy/readers/__init__.py | 4 ++- 2 files changed, 3 insertions(+), 64 deletions(-) delete mode 100644 satpy/etc/readers/slstr_l2.yaml diff --git a/satpy/etc/readers/slstr_l2.yaml b/satpy/etc/readers/slstr_l2.yaml deleted file mode 100644 index 7924cb198a..0000000000 --- a/satpy/etc/readers/slstr_l2.yaml +++ /dev/null @@ -1,63 +0,0 @@ -reader: - name: slstr_l2 - short_name: SLSTR l2 - long_name: Sentinel-3 SLSTR Level 2 data in netCDF format - description: NC Reader for Sentinel-3 SLSTR Level 2 data - status: defunct - supports_fsspec: false - sensors: [slstr_l2] - default_channels: [] - reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader - -file_types: - SLSTRB: - file_reader: !!python/name:satpy.readers.slstr_l2.SLSTRL2FileHandler - file_patterns: ['{start_time:%Y%m%d%H%M%S}-{generating_centre:3s}-{type_id:3s}_GHRSST-SSTskin-SLSTR{something:1s}-{end_time:%Y%m%d%H%M%S}-{version}.nc', - '{mission_id:3s}_SL_{processing_level:1s}_WST____{start_time:%Y%m%dT%H%M%S}_{end_time:%Y%m%dT%H%M%S}_{creation_time:%Y%m%dT%H%M%S}_{duration:4d}_{cycle:3d}_{relative_orbit:3d}_{frame:4s}_{centre:3s}_{mode:1s}_{timeliness:2s}_{collection:3s}.SEN3.tar'] - -datasets: - longitude: - name: longitude - resolution: 1000 - view: nadir - file_type: SLSTRB - standard_name: lon - units: degree - - latitude: - name: latitude - resolution: 1000 - view: nadir - file_type: SLSTRB - standard_name: lat - units: degree - - sea_surface_temperature: - name: sea_surface_temperature - sensor: slstr_l2 - coordinates: [longitude, latitude] - file_type: SLSTRB - resolution: 1000 - view: nadir - units: kelvin - standard_name: sea_surface_temperature - - sea_ice_fraction: - name: sea_ice_fraction - sensor: slstr_l2 - coordinates: [longitude, latitude] - file_type: SLSTRB - resolution: 1000 - view: nadir - units: "%" - standard_name: sea_ice_fraction - - # Quality estimation 0-5: no data, cloud, worst, low, acceptable, best - quality_level: - name: quality_level - sensor: slstr_l2 - coordinates: [longitude, latitude] - file_type: SLSTRB - resolution: 1000 - view: nadir - standard_name: quality_level diff --git a/satpy/readers/__init__.py b/satpy/readers/__init__.py index 21554ba465..ca131b101f 100644 --- a/satpy/readers/__init__.py +++ b/satpy/readers/__init__.py @@ -39,7 +39,9 @@ # Old Name -> New Name PENDING_OLD_READER_NAMES = {"fci_l1c_fdhsi": "fci_l1c_nc", "viirs_l2_cloud_mask_nc": "viirs_edr"} -OLD_READER_NAMES: dict[str, str] = {} +OLD_READER_NAMES: dict[str, str] = { + "slstr_l2": "ghrsst_l2", +} def group_files(files_to_sort, reader=None, time_threshold=10, From 9cf9397a118a1efecc16b9b16ba7f2a6e29ae7db Mon Sep 17 00:00:00 2001 From: Sauli Joro Date: Tue, 30 Jan 2024 07:58:34 +0100 Subject: [PATCH 151/481] Fix typo. --- satpy/readers/fci_l2_nc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/readers/fci_l2_nc.py b/satpy/readers/fci_l2_nc.py index 4187d133c5..8971eb4996 100644 --- a/satpy/readers/fci_l2_nc.py +++ b/satpy/readers/fci_l2_nc.py @@ -102,7 +102,7 @@ def _set_attributes(self, variable, dataset_info, segmented=False): import_enum_information = dataset_info.get("import_enum_information", False) if import_enum_information: - variable = self._add_flag_values_and_meamings(self.filename, dataset_info["nc_key"], variable) + variable = self._add_flag_values_and_meanings(self.filename, dataset_info["nc_key"], variable) if variable.attrs["units"] == "none": variable.attrs.update({"units": None}) @@ -110,7 +110,7 @@ def _set_attributes(self, variable, dataset_info, segmented=False): return variable @staticmethod - def _add_flag_values_and_meamings(filename, key, variable): + def _add_flag_values_and_meanings(filename, key, variable): """Build flag values and meaning from enum datatype.""" nc_dataset = netCDF4.Dataset(filename, "r") # This currently assumes a flat netCDF file From e2cf6eb931bf7ffdf8f0230971bb2a73580de286 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Wed, 31 Jan 2024 11:34:13 -0600 Subject: [PATCH 152/481] removing extra lines in creating test content --- satpy/tests/reader_tests/test_clavrx_nc.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx_nc.py index 5f3e82f1dc..3cb188d76c 100644 --- a/satpy/tests/reader_tests/test_clavrx_nc.py +++ b/satpy/tests/reader_tests/test_clavrx_nc.py @@ -98,7 +98,6 @@ def fake_test_content(filename, **kwargs): "L1B": "clavrx_H08_20210603_1500_B01_FLDK_R", } ) - variable2 = variable2.where(variable2 % 2 != 0, FILL_VALUE) # category @@ -126,7 +125,6 @@ def fake_test_content(filename, **kwargs): "var_flags": var_flags, "out_of_range_flags": out_of_range_flags, } - ds = xr.Dataset(ds_vars, attrs=attrs) ds = ds.assign_coords({"latitude": latitude, "longitude": longitude}) From e583b9ede2866e8147ac5a52c834466f3834237d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Feb 2024 10:10:48 +0000 Subject: [PATCH 153/481] Bump codecov/codecov-action from 3 to 4 Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3 to 4. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3...v4) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8742864c59..587342912f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -110,7 +110,7 @@ jobs: pytest --cov=satpy satpy/tests --cov-report=xml --cov-report= - name: Upload unittest coverage to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: flags: unittests file: ./coverage.xml @@ -131,7 +131,7 @@ jobs: coverage xml - name: Upload behaviour test coverage to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: flags: behaviourtests file: ./coverage.xml From 14fef9c89ca993a4b3c619cc80e1f0d07d36c271 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Feb 2024 10:10:51 +0000 Subject: [PATCH 154/481] Bump actions/cache from 3 to 4 Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8742864c59..429af3b0d9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -51,7 +51,7 @@ jobs: CONDA_PREFIX=$(python -c "import sys; print(sys.prefix)") echo "CONDA_PREFIX=$CONDA_PREFIX" >> $GITHUB_ENV - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ env.CONDA_PREFIX }} key: ${{ matrix.os }}-${{matrix.python-version}}-conda-${{ hashFiles('continuous_integration/environment.yaml') }}-${{ env.DATE }}-${{matrix.experimental}}-${{ env.CACHE_NUMBER }} From 8319b4f44206b1ec7a4f650e1b6cbfcaebeb5199 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 1 Feb 2024 14:48:09 +0200 Subject: [PATCH 155/481] Change time attribute averaging to min/max for start/end times --- satpy/composites/__init__.py | 10 ++++----- satpy/dataset/metadata.py | 18 ++++++++++----- satpy/tests/test_composites.py | 8 +++---- satpy/tests/test_dataset.py | 40 +++++++++++++++++++++++++--------- 4 files changed, 51 insertions(+), 25 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index a70bbea86f..a7411222aa 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1666,12 +1666,10 @@ def __call__(self, *args, **kwargs): img.attrs.pop("modifiers", None) img.attrs.pop("calibration", None) # Add start time if not present in the filename - if "start_time" not in img.attrs or not img.attrs["start_time"]: - import datetime as dt - img.attrs["start_time"] = dt.datetime.utcnow() - if "end_time" not in img.attrs or not img.attrs["end_time"]: - import datetime as dt - img.attrs["end_time"] = dt.datetime.utcnow() + if "start_time" not in img.attrs: + img.attrs["start_time"] = None + if "end_time" not in img.attrs: + img.attrs["end_time"] = None return img diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 46f6f622b8..6da6f90bbb 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -27,7 +27,7 @@ from satpy.writers.utils import flatten_dict -def combine_metadata(*metadata_objects, average_times=True): +def combine_metadata(*metadata_objects): """Combine the metadata of two or more Datasets. If the values corresponding to any keys are not equal or do not @@ -53,7 +53,7 @@ def combine_metadata(*metadata_objects, average_times=True): shared_keys = _shared_keys(info_dicts) - return _combine_shared_info(shared_keys, info_dicts, average_times) + return _combine_shared_info(shared_keys, info_dicts) def _get_valid_dicts(metadata_objects): @@ -75,17 +75,25 @@ def _shared_keys(info_dicts): return reduce(set.intersection, key_sets) -def _combine_shared_info(shared_keys, info_dicts, average_times): +def _combine_shared_info(shared_keys, info_dicts): shared_info = {} for key in shared_keys: values = [info[key] for info in info_dicts] - if "time" in key and isinstance(values[0], datetime) and average_times: - shared_info[key] = average_datetimes(values) + if "time" in key and isinstance(values[0], datetime): + shared_info[key] = _combine_times(key, values) elif _are_values_combinable(values): shared_info[key] = values[0] return shared_info +def _combine_times(key, values): + if key == "end_time": + return max(values) + elif key == "start_time": + return min(values) + return average_datetimes(values) + + def average_datetimes(datetime_list): """Average a series of datetime objects. diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index b5d5a54b96..420f60efa2 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1420,8 +1420,8 @@ def load(self, arg): filenames=["/foo.tif"]) register.assert_not_called() retrieve.assert_not_called() - assert "start_time" in res.attrs - assert "end_time" in res.attrs + assert res.attrs["start_time"] is None + assert res.attrs["end_time"] is None assert res.attrs["sensor"] is None assert "modifiers" not in res.attrs assert "calibration" not in res.attrs @@ -1434,8 +1434,8 @@ def load(self, arg): res = comp() Scene.assert_called_once_with(reader="generic_image", filenames=["data_dir/foo.tif"]) - assert "start_time" in res.attrs - assert "end_time" in res.attrs + assert res.attrs["start_time"] is None + assert res.attrs["end_time"] is None assert res.attrs["sensor"] is None assert "modifiers" not in res.attrs assert "calibration" not in res.attrs diff --git a/satpy/tests/test_dataset.py b/satpy/tests/test_dataset.py index 1b827b8dcf..1cf8f673ec 100644 --- a/satpy/tests/test_dataset.py +++ b/satpy/tests/test_dataset.py @@ -101,13 +101,28 @@ class TestCombineMetadata(unittest.TestCase): def setUp(self): """Set up the test case.""" - self.datetime_dts = ( + # The times need to be in ascending order (oldest first) + self.start_time_dts = ( {"start_time": datetime(2018, 2, 1, 11, 58, 0)}, {"start_time": datetime(2018, 2, 1, 11, 59, 0)}, {"start_time": datetime(2018, 2, 1, 12, 0, 0)}, {"start_time": datetime(2018, 2, 1, 12, 1, 0)}, {"start_time": datetime(2018, 2, 1, 12, 2, 0)}, ) + self.end_time_dts = ( + {"end_time": datetime(2018, 2, 1, 11, 58, 0)}, + {"end_time": datetime(2018, 2, 1, 11, 59, 0)}, + {"end_time": datetime(2018, 2, 1, 12, 0, 0)}, + {"end_time": datetime(2018, 2, 1, 12, 1, 0)}, + {"end_time": datetime(2018, 2, 1, 12, 2, 0)}, + ) + self.other_time_dts = ( + {"other_time": datetime(2018, 2, 1, 11, 58, 0)}, + {"other_time": datetime(2018, 2, 1, 11, 59, 0)}, + {"other_time": datetime(2018, 2, 1, 12, 0, 0)}, + {"other_time": datetime(2018, 2, 1, 12, 1, 0)}, + {"other_time": datetime(2018, 2, 1, 12, 2, 0)}, + ) def test_average_datetimes(self): """Test the average_datetimes helper function.""" @@ -122,18 +137,23 @@ def test_average_datetimes(self): ret = average_datetimes(dts) assert dts[2] == ret - def test_combine_times_with_averaging(self): - """Test the combine_metadata with times with averaging.""" + def test_combine_start_times(self): + """Test the combine_metadata with start times.""" + from satpy.dataset.metadata import combine_metadata + ret = combine_metadata(*self.start_time_dts) + assert ret["start_time"] == self.start_time_dts[0]["start_time"] + + def test_combine_end_times(self): + """Test the combine_metadata with end times.""" from satpy.dataset.metadata import combine_metadata - ret = combine_metadata(*self.datetime_dts) - assert self.datetime_dts[2]["start_time"] == ret["start_time"] + ret = combine_metadata(*self.end_time_dts) + assert ret["end_time"] == self.end_time_dts[-1]["end_time"] - def test_combine_times_without_averaging(self): - """Test the combine_metadata with times without averaging.""" + def test_combine_other_times(self): + """Test the combine_metadata with other time values than start or end times.""" from satpy.dataset.metadata import combine_metadata - ret = combine_metadata(*self.datetime_dts, average_times=False) - # times are not equal so don't include it in the final result - assert "start_time" not in ret + ret = combine_metadata(*self.other_time_dts) + assert ret["other_time"] == self.other_time_dts[2]["other_time"] def test_combine_arrays(self): """Test the combine_metadata with arrays.""" From 782ac687680696d648d84755a757e755fe6714e6 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 1 Feb 2024 14:53:33 +0200 Subject: [PATCH 156/481] Change time attribute averaging to min/max for start/end times --- satpy/composites/__init__.py | 10 ++++++---- satpy/tests/test_composites.py | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index a7411222aa..a70bbea86f 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1666,10 +1666,12 @@ def __call__(self, *args, **kwargs): img.attrs.pop("modifiers", None) img.attrs.pop("calibration", None) # Add start time if not present in the filename - if "start_time" not in img.attrs: - img.attrs["start_time"] = None - if "end_time" not in img.attrs: - img.attrs["end_time"] = None + if "start_time" not in img.attrs or not img.attrs["start_time"]: + import datetime as dt + img.attrs["start_time"] = dt.datetime.utcnow() + if "end_time" not in img.attrs or not img.attrs["end_time"]: + import datetime as dt + img.attrs["end_time"] = dt.datetime.utcnow() return img diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 420f60efa2..b5d5a54b96 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1420,8 +1420,8 @@ def load(self, arg): filenames=["/foo.tif"]) register.assert_not_called() retrieve.assert_not_called() - assert res.attrs["start_time"] is None - assert res.attrs["end_time"] is None + assert "start_time" in res.attrs + assert "end_time" in res.attrs assert res.attrs["sensor"] is None assert "modifiers" not in res.attrs assert "calibration" not in res.attrs @@ -1434,8 +1434,8 @@ def load(self, arg): res = comp() Scene.assert_called_once_with(reader="generic_image", filenames=["data_dir/foo.tif"]) - assert res.attrs["start_time"] is None - assert res.attrs["end_time"] is None + assert "start_time" in res.attrs + assert "end_time" in res.attrs assert res.attrs["sensor"] is None assert "modifiers" not in res.attrs assert "calibration" not in res.attrs From cf98aa21f326bedbc0278ce20b4b267bc928f9ee Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 1 Feb 2024 15:11:15 +0200 Subject: [PATCH 157/481] Allow None as time value --- satpy/composites/__init__.py | 10 ++++------ satpy/dataset/metadata.py | 16 ++++++++++++---- satpy/tests/test_composites.py | 8 ++++---- satpy/tests/test_dataset.py | 26 ++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index a70bbea86f..a7411222aa 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1666,12 +1666,10 @@ def __call__(self, *args, **kwargs): img.attrs.pop("modifiers", None) img.attrs.pop("calibration", None) # Add start time if not present in the filename - if "start_time" not in img.attrs or not img.attrs["start_time"]: - import datetime as dt - img.attrs["start_time"] = dt.datetime.utcnow() - if "end_time" not in img.attrs or not img.attrs["end_time"]: - import datetime as dt - img.attrs["end_time"] = dt.datetime.utcnow() + if "start_time" not in img.attrs: + img.attrs["start_time"] = None + if "end_time" not in img.attrs: + img.attrs["end_time"] = None return img diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 6da6f90bbb..6e95908f68 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -79,7 +79,7 @@ def _combine_shared_info(shared_keys, info_dicts): shared_info = {} for key in shared_keys: values = [info[key] for info in info_dicts] - if "time" in key and isinstance(values[0], datetime): + if "time" in key: shared_info[key] = _combine_times(key, values) elif _are_values_combinable(values): shared_info[key] = values[0] @@ -87,11 +87,19 @@ def _combine_shared_info(shared_keys, info_dicts): def _combine_times(key, values): + filtered_values = _filter_time_values(values) + if not filtered_values: + return values if key == "end_time": - return max(values) + return max(filtered_values) elif key == "start_time": - return min(values) - return average_datetimes(values) + return min(filtered_values) + return average_datetimes(filtered_values) + + +def _filter_time_values(values): + """Remove values that are not datetime objects.""" + return [v for v in values if isinstance(v, datetime)] def average_datetimes(datetime_list): diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index b5d5a54b96..420f60efa2 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1420,8 +1420,8 @@ def load(self, arg): filenames=["/foo.tif"]) register.assert_not_called() retrieve.assert_not_called() - assert "start_time" in res.attrs - assert "end_time" in res.attrs + assert res.attrs["start_time"] is None + assert res.attrs["end_time"] is None assert res.attrs["sensor"] is None assert "modifiers" not in res.attrs assert "calibration" not in res.attrs @@ -1434,8 +1434,8 @@ def load(self, arg): res = comp() Scene.assert_called_once_with(reader="generic_image", filenames=["data_dir/foo.tif"]) - assert "start_time" in res.attrs - assert "end_time" in res.attrs + assert res.attrs["start_time"] is None + assert res.attrs["end_time"] is None assert res.attrs["sensor"] is None assert "modifiers" not in res.attrs assert "calibration" not in res.attrs diff --git a/satpy/tests/test_dataset.py b/satpy/tests/test_dataset.py index 1cf8f673ec..82b3a6c1cd 100644 --- a/satpy/tests/test_dataset.py +++ b/satpy/tests/test_dataset.py @@ -123,6 +123,20 @@ def setUp(self): {"other_time": datetime(2018, 2, 1, 12, 1, 0)}, {"other_time": datetime(2018, 2, 1, 12, 2, 0)}, ) + self.start_time_dts_with_none = ( + {"start_time": None}, + {"start_time": datetime(2018, 2, 1, 11, 59, 0)}, + {"start_time": datetime(2018, 2, 1, 12, 0, 0)}, + {"start_time": datetime(2018, 2, 1, 12, 1, 0)}, + {"start_time": datetime(2018, 2, 1, 12, 2, 0)}, + ) + self.end_time_dts_with_none = ( + {"end_time": datetime(2018, 2, 1, 11, 58, 0)}, + {"end_time": datetime(2018, 2, 1, 11, 59, 0)}, + {"end_time": datetime(2018, 2, 1, 12, 0, 0)}, + {"end_time": datetime(2018, 2, 1, 12, 1, 0)}, + {"end_time": None}, + ) def test_average_datetimes(self): """Test the average_datetimes helper function.""" @@ -149,6 +163,18 @@ def test_combine_end_times(self): ret = combine_metadata(*self.end_time_dts) assert ret["end_time"] == self.end_time_dts[-1]["end_time"] + def test_combine_start_times_with_none(self): + """Test the combine_metadata with start times when there's a None included.""" + from satpy.dataset.metadata import combine_metadata + ret = combine_metadata(*self.start_time_dts_with_none) + assert ret["start_time"] == self.start_time_dts_with_none[1]["start_time"] + + def test_combine_end_times_with_none(self): + """Test the combine_metadata with end times when there's a None included.""" + from satpy.dataset.metadata import combine_metadata + ret = combine_metadata(*self.end_time_dts_with_none) + assert ret["end_time"] == self.end_time_dts_with_none[-2]["end_time"] + def test_combine_other_times(self): """Test the combine_metadata with other time values than start or end times.""" from satpy.dataset.metadata import combine_metadata From ab904284a8dee3f667d3379bad77340c2ae791dd Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 1 Feb 2024 15:21:56 +0200 Subject: [PATCH 158/481] Update combine_metadata docstring --- satpy/dataset/metadata.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 6e95908f68..cf33dce222 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -32,15 +32,14 @@ def combine_metadata(*metadata_objects): If the values corresponding to any keys are not equal or do not exist in all provided dictionaries then they are not included in - the returned dictionary. By default any keys with the word 'time' - in them and consisting of datetime objects will be averaged. This - is to handle cases where data were observed at almost the same time - but not exactly. In the interest of time, lazy arrays are compared by - object identity rather than by their contents. + the returned dictionary. The 'start_time' values will be set to the + earliest value and 'end_time' to latest time. All other keys containing + the word 'time' are averaged. Before these adjustments, non-datetime + objects are filtered out. In the interest of time, lazy arrays are compared + by object identity rather than by their contents. Args: *metadata_objects: MetadataObject or dict objects to combine - average_times (bool): Average any keys with 'time' in the name Returns: dict: the combined metadata From 942be9c65755757a7940bfae815ccade898fba6e Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 1 Feb 2024 16:26:05 +0200 Subject: [PATCH 159/481] Do not include top-level non-time objects in shared_info as times --- satpy/dataset/metadata.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index cf33dce222..1a52b6825f 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -79,7 +79,10 @@ def _combine_shared_info(shared_keys, info_dicts): for key in shared_keys: values = [info[key] for info in info_dicts] if "time" in key: - shared_info[key] = _combine_times(key, values) + times = _combine_times(key, values) + if times is None: + continue + shared_info[key] = times elif _are_values_combinable(values): shared_info[key] = values[0] return shared_info @@ -88,7 +91,7 @@ def _combine_shared_info(shared_keys, info_dicts): def _combine_times(key, values): filtered_values = _filter_time_values(values) if not filtered_values: - return values + return None if key == "end_time": return max(filtered_values) elif key == "start_time": From db2bf3182fa0769787529917e65739e88be9e591 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 1 Feb 2024 16:47:22 +0200 Subject: [PATCH 160/481] Remove combine_times kwarg from multiscene.stack and default to its default behaviour --- satpy/multiscene/_blend_funcs.py | 28 +++++++--------------- satpy/tests/multiscene_tests/test_blend.py | 15 ++++-------- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/satpy/multiscene/_blend_funcs.py b/satpy/multiscene/_blend_funcs.py index 49869a0418..53b30e79d7 100644 --- a/satpy/multiscene/_blend_funcs.py +++ b/satpy/multiscene/_blend_funcs.py @@ -13,7 +13,6 @@ def stack( data_arrays: Sequence[xr.DataArray], weights: Optional[Sequence[xr.DataArray]] = None, - combine_times: bool = True, blend_type: str = "select_with_weights" ) -> xr.DataArray: """Combine a series of datasets in different ways. @@ -39,19 +38,18 @@ def stack( """ if weights: - return _stack_with_weights(data_arrays, weights, combine_times, blend_type) - return _stack_no_weights(data_arrays, combine_times) + return _stack_with_weights(data_arrays, weights, blend_type) + return _stack_no_weights(data_arrays) def _stack_with_weights( datasets: Sequence[xr.DataArray], weights: Sequence[xr.DataArray], - combine_times: bool, blend_type: str ) -> xr.DataArray: blend_func = _get_weighted_blending_func(blend_type) filled_weights = list(_fill_weights_for_invalid_dataset_pixels(datasets, weights)) - return blend_func(datasets, filled_weights, combine_times) + return blend_func(datasets, filled_weights) def _get_weighted_blending_func(blend_type: str) -> Callable: @@ -84,10 +82,9 @@ def _fill_weights_for_invalid_dataset_pixels( def _stack_blend_by_weights( datasets: Sequence[xr.DataArray], weights: Sequence[xr.DataArray], - combine_times: bool ) -> xr.DataArray: """Stack datasets blending overlap using weights.""" - attrs = _combine_stacked_attrs([data_arr.attrs for data_arr in datasets], combine_times) + attrs = _combine_stacked_attrs([data_arr.attrs for data_arr in datasets]) overlays = [] for weight, overlay in zip(weights, datasets): @@ -109,14 +106,13 @@ def _stack_blend_by_weights( def _stack_select_by_weights( datasets: Sequence[xr.DataArray], weights: Sequence[xr.DataArray], - combine_times: bool ) -> xr.DataArray: """Stack datasets selecting pixels using weights.""" indices = da.argmax(da.dstack(weights), axis=-1) if "bands" in datasets[0].dims: indices = [indices] * datasets[0].sizes["bands"] - attrs = _combine_stacked_attrs([data_arr.attrs for data_arr in datasets], combine_times) + attrs = _combine_stacked_attrs([data_arr.attrs for data_arr in datasets]) dims = datasets[0].dims coords = datasets[0].coords selected_array = xr.DataArray(da.choose(indices, datasets), dims=dims, coords=coords, attrs=attrs) @@ -125,7 +121,6 @@ def _stack_select_by_weights( def _stack_no_weights( datasets: Sequence[xr.DataArray], - combine_times: bool ) -> xr.DataArray: base = datasets[0].copy() collected_attrs = [base.attrs] @@ -136,20 +131,13 @@ def _stack_no_weights( except KeyError: base = base.where(data_arr.isnull(), data_arr) - attrs = _combine_stacked_attrs(collected_attrs, combine_times) + attrs = _combine_stacked_attrs(collected_attrs) base.attrs = attrs return base -def _combine_stacked_attrs(collected_attrs: Sequence[Mapping], combine_times: bool) -> dict: - attrs = combine_metadata(*collected_attrs) - if combine_times and ("start_time" in attrs or "end_time" in attrs): - new_start, new_end = _get_combined_start_end_times(collected_attrs) - if new_start: - attrs["start_time"] = new_start - if new_end: - attrs["end_time"] = new_end - return attrs +def _combine_stacked_attrs(collected_attrs: Sequence[Mapping]) -> dict: + return combine_metadata(*collected_attrs) def _get_combined_start_end_times(metadata_objects: Iterable[Mapping]) -> tuple[datetime | None, datetime | None]: diff --git a/satpy/tests/multiscene_tests/test_blend.py b/satpy/tests/multiscene_tests/test_blend.py index f9d7e35462..c964501225 100644 --- a/satpy/tests/multiscene_tests/test_blend.py +++ b/satpy/tests/multiscene_tests/test_blend.py @@ -245,10 +245,9 @@ def test_blend_two_scenes_bad_blend_type(self, multi_scene_and_weights, groups): ("select_with_weights", _get_expected_stack_select), ("blend_with_weights", _get_expected_stack_blend), ]) - @pytest.mark.parametrize("combine_times", [False, True]) def test_blend_two_scenes_using_stack_weighted(self, multi_scene_and_weights, groups, scene1_with_weights, scene2_with_weights, - combine_times, blend_func, exp_result_func): + blend_func, exp_result_func): """Test stacking two scenes using weights. Here we test that the start and end times can be combined so that they @@ -266,7 +265,7 @@ def test_blend_two_scenes_using_stack_weighted(self, multi_scene_and_weights, gr multi_scene.group(simple_groups) weights = [weights[0][0], weights[1][0]] - stack_func = partial(stack, weights=weights, blend_type=blend_func, combine_times=combine_times) + stack_func = partial(stack, weights=weights, blend_type=blend_func) weighted_blend = multi_scene.blend(blend_function=stack_func) expected = exp_result_func(scene1, scene2) @@ -275,12 +274,8 @@ def test_blend_two_scenes_using_stack_weighted(self, multi_scene_and_weights, gr np.testing.assert_allclose(result.data, expected.data) _check_stacked_metadata(result, "CloudType") - if combine_times: - assert result.attrs["start_time"] == datetime(2023, 1, 16, 11, 9, 17) - assert result.attrs["end_time"] == datetime(2023, 1, 16, 11, 28, 1, 900000) - else: - assert result.attrs["start_time"] == datetime(2023, 1, 16, 11, 11, 7, 250000) - assert result.attrs["end_time"] == datetime(2023, 1, 16, 11, 20, 11, 950000) + assert result.attrs["start_time"] == datetime(2023, 1, 16, 11, 9, 17) + assert result.attrs["end_time"] == datetime(2023, 1, 16, 11, 28, 1, 900000) @pytest.fixture() def datasets_and_weights(self): @@ -329,7 +324,7 @@ def test_blend_function_stack_weighted(self, datasets_and_weights, line, column) input_data["weights"][1][line, :] = 2 input_data["weights"][2][:, column] = 2 - stack_with_weights = partial(stack, weights=input_data["weights"], combine_times=False) + stack_with_weights = partial(stack, weights=input_data["weights"]) blend_result = stack_with_weights(input_data["datasets"][0:3]) ds1 = input_data["datasets"][0] From e0fe8450c2209c7de489e075299d057605a8898f Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Fri, 2 Feb 2024 08:58:51 +0200 Subject: [PATCH 161/481] Remove obsolete private function --- satpy/multiscene/_blend_funcs.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/satpy/multiscene/_blend_funcs.py b/satpy/multiscene/_blend_funcs.py index 53b30e79d7..7478648140 100644 --- a/satpy/multiscene/_blend_funcs.py +++ b/satpy/multiscene/_blend_funcs.py @@ -1,6 +1,5 @@ from __future__ import annotations -from datetime import datetime from typing import Callable, Iterable, Mapping, Optional, Sequence import pandas as pd @@ -140,18 +139,6 @@ def _combine_stacked_attrs(collected_attrs: Sequence[Mapping]) -> dict: return combine_metadata(*collected_attrs) -def _get_combined_start_end_times(metadata_objects: Iterable[Mapping]) -> tuple[datetime | None, datetime | None]: - """Get the start and end times attributes valid for the entire dataset series.""" - start_time = None - end_time = None - for md_obj in metadata_objects: - if "start_time" in md_obj and (start_time is None or md_obj["start_time"] < start_time): - start_time = md_obj["start_time"] - if "end_time" in md_obj and (end_time is None or md_obj["end_time"] > end_time): - end_time = md_obj["end_time"] - return start_time, end_time - - def timeseries(datasets): """Expand dataset with and concatenate by time dimension.""" expanded_ds = [] From f1170f66c702f7169e2f290d8c5ce8c70cdf8d5d Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 2 Feb 2024 10:37:12 -0600 Subject: [PATCH 162/481] Remove extra spaces --- satpy/etc/enhancements/generic.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index 16daa2ff27..63778bd030 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -285,10 +285,10 @@ enhancements: 2, # Probably Cloudy 3, # Cloudy ], - 'colors': [[ 0, 0, 0], # black,-127 = Fill Value - [ 94, 79, 162], # blue, 0 = Clear - [ 73, 228, 242], # cyan, 1 = Probably Clear - [158, 1, 66], # red, 2 = Probably Cloudy + 'colors': [[0, 0, 0], # black,-127 = Fill Value + [94, 79, 162], # blue, 0 = Clear + [73, 228, 242], # cyan, 1 = Probably Clear + [158, 1, 66], # red, 2 = Probably Cloudy [255, 255, 255], # white, 3 = Cloudy ], 'color_scale': 255, From 48770828066f96ef201713a6d4da24e9a2aa393c Mon Sep 17 00:00:00 2001 From: David Hoese Date: Tue, 10 Oct 2023 13:13:26 -0500 Subject: [PATCH 163/481] Update CI to test Python 3.12 --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 52952a6330..2716e7f792 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,10 +18,10 @@ jobs: fail-fast: true matrix: os: ["windows-latest", "ubuntu-latest", "macos-latest"] - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.9", "3.11", "3.12"] experimental: [false] include: - - python-version: "3.11" + - python-version: "3.12" os: "ubuntu-latest" experimental: true From 6e1342fffc6dd4e8e2c0478e486a3349221ff5ce Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 5 Feb 2024 11:21:09 +0200 Subject: [PATCH 164/481] Remove unnecessary setting of start/end time attributes --- satpy/composites/__init__.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index a7411222aa..7fc8bec92d 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1665,11 +1665,6 @@ def __call__(self, *args, **kwargs): img.attrs["mode"] = "".join(img.bands.data) img.attrs.pop("modifiers", None) img.attrs.pop("calibration", None) - # Add start time if not present in the filename - if "start_time" not in img.attrs: - img.attrs["start_time"] = None - if "end_time" not in img.attrs: - img.attrs["end_time"] = None return img From 0df041347b82e3a00c59947f8a2deb3b908829e6 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Mon, 5 Feb 2024 16:05:32 +0000 Subject: [PATCH 165/481] Removed area_def and added colormaps in yaml --- satpy/etc/composites/viirs.yaml | 20 ++ satpy/etc/enhancements/generic.yaml | 252 +++++++++++++++++++--- satpy/etc/readers/viirs_l2.yaml | 14 +- satpy/readers/viirs_l2.py | 32 --- satpy/readers/yaml_reader.py | 15 +- satpy/tests/reader_tests/test_viirs_l2.py | 6 +- 6 files changed, 261 insertions(+), 78 deletions(-) diff --git a/satpy/etc/composites/viirs.yaml b/satpy/etc/composites/viirs.yaml index bebf6c5833..0c82948ee8 100644 --- a/satpy/etc/composites/viirs.yaml +++ b/satpy/etc/composites/viirs.yaml @@ -685,3 +685,23 @@ composites: - name: I01 - name: I03 standard_name: cimss_cloud_type + + cth: + description: > + VIIRS Cloud Top Height with colormap applied + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - Cloud_Top_Height + standard_name: cth + + viirs_cloud_top_height: + description: > + Cloud Top Height composite from NOAA/SNPP + compositor: !!python/name:satpy.composites.MaskingCompositor + prerequisites: + - Cloud_Top_Height + - cth + conditions: + - method: isnan + transparency: 100 + standard_name: viirs_cloud_top_height diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index 6ad3801a4b..f2c9dbd9c2 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1231,18 +1231,80 @@ enhancements: min_stretch: [0,0,0] max_stretch: [1,1,1] - Cloud_Top_Height: - name: Cloud_Top_Height + viirs_cloud_top_height: + name: viirs_cloud_top_height operations: - name: palettize method: !!python/name:satpy.enhancements.palettize kwargs: palettes: - - { - filename: cth.txt, - min_value: 0, - max_value: 18000, - } + - { + colors: [ + [255, 0, 0], [255, 0, 1], [255, 1, 0], [255, 1, 1], [254, 0, 0], [254, 0, 1], + [254, 1, 0], [254, 1, 1], [254, 2, 1], [254, 2, 0], [254, 2, 2], [253, 0, 0], + [253, 0, 1], [253, 1, 0], [253, 1, 1], [253, 1, 2], [170, 0, 0], [170, 0, 1], + [170, 1, 0], [170, 1, 1], [171, 0, 0], [171, 0, 1], [171, 1, 0], [171, 1, 1], + [171, 2, 1], [171, 2, 0], [171, 2, 2], [172, 0, 0], [172, 0, 1], [172, 1, 0], + [172, 1, 1], [172, 1, 2], [110, 0, 0], [110, 0, 1], [110, 1, 0], [110, 1, 1], + [111, 0, 0], [111, 0, 1], [111, 1, 0], [111, 1, 1], [111, 2, 1], [111, 2, 0], + [111, 2, 2], [112, 0, 0], [112, 0, 1], [112, 1, 0], [112, 1, 1], [112, 1, 2], + [122, 90, 3], [122, 90, 4], [122, 91, 3], [122, 91, 4], [123, 90, 3], [123, 90, 4], + [123, 91, 3], [123, 91, 4], [123, 92, 4], [123, 92, 3], [123, 92, 5], [124, 90, 3], + [124, 90, 4], [124, 91, 3], [124, 91, 4], [124, 91, 5], [187, 136, 0], [187, 136, 1], + [187, 137, 0], [187, 137, 1], [188, 136, 0], [188, 136, 1], [188, 137, 0], + [188, 137, 1], [188, 138, 1], [188, 138, 0], [188, 138, 2], [189, 136, 0], + [189, 136, 1], [189, 137, 0], [189, 137, 1], [189, 137, 2], [240, 190, 64], + [240, 190, 65], [240, 191, 64], [240, 191, 65], [241, 190, 64], [241, 190, 65], + [241, 191, 64], [241, 191, 65], [241, 192, 65], [241, 192, 64], [241, 192, 66], + [242, 190, 64], [242, 190, 65], [242, 191, 64], [242, 191, 65], [242, 191, 66], + [255, 255, 0], [255, 255, 1], [255, 254, 0], [255, 254, 1], [254, 255, 0], + [254, 255, 1], [254, 254, 0], [254, 254, 1], [254, 253, 1], [254, 253, 0], + [254, 253, 2], [253, 255, 0], [253, 255, 1], [253, 254, 0], [253, 254, 1], + [253, 254, 2], [0, 220, 0], [0, 220, 1], [0, 221, 0], [0, 221, 1], [1, 220, 0], + [1, 220, 1], [1, 221, 0], [1, 221, 1], [1, 222, 1], [1, 222, 0], [1, 222, 2], + [2, 220, 0], [2, 220, 1], [2, 221, 0], [2, 221, 1], [2, 221, 2], [0, 136, 0], + [0, 136, 1], [0, 137, 0], [0, 137, 1], [1, 136, 0], [1, 136, 1], [1, 137, 0], + [1, 137, 1], [1, 138, 1], [1, 138, 0], [1, 138, 2], [2, 136, 0], [2, 136, 1], + [2, 137, 0], [2, 137, 1], [2, 137, 2], [0, 80, 0], [0, 80, 1], [0, 81, 0], + [0, 81, 1], [1, 80, 0], [1, 80, 1], [1, 81, 0], [1, 81, 1], [1, 82, 1], [1, 82, 0], + [1, 82, 2], [2, 80, 0], [2, 80, 1], [2, 81, 0], [2, 81, 1], [2, 81, 2], [0, 136, 238], + [0, 136, 239], [0, 137, 238], [0, 137, 239], [1, 136, 238], [1, 136, 239], + [1, 137, 238], [1, 137, 239], [1, 138, 239], [1, 138, 238], [1, 138, 240], + [2, 136, 238], [2, 136, 239], [2, 137, 238], [2, 137, 239], [2, 137, 240], + [0, 0, 255], [0, 0, 254], [0, 1, 255], [0, 1, 254], [1, 0, 255], [1, 0, 254], + [1, 1, 255], [1, 1, 254], [1, 2, 254], [1, 2, 255], [1, 2, 253], [2, 0, 253], + [2, 0, 254], [2, 1, 253], [2, 1, 254], [2, 1, 255], [0, 0, 170], [0, 0, 171], + [0, 1, 170], [0, 1, 171], [1, 0, 170], [1, 0, 171], [1, 1, 170], [1, 1, 171], + [1, 2, 171], [1, 2, 170], [1, 2, 172], [2, 0, 170], [2, 0, 171], [2, 1, 170], + [2, 1, 171], [2, 1, 172], [0, 0, 100], [0, 0, 101], [0, 1, 100], [0, 1, 101], + [1, 0, 100], [1, 0, 101], [1, 1, 100], [1, 1, 101], [1, 2, 101], [1, 2, 100], + [1, 2, 102], [2, 0, 100], [2, 0, 101], [2, 1, 100], [2, 1, 101], [2, 1, 102], + [183, 15, 141], [183, 15, 142], [183, 16, 141], [183, 16, 142], [184, 15, 141], + [184, 15, 142], [184, 16, 141], [184, 16, 142], [184, 17, 142], [184, 17, 141], + [184, 17, 143], [185, 15, 141], [185, 15, 142], [185, 16, 141], [185, 16, 142], + [185, 16, 143], [102, 0, 119] + ], + values: [ + 0, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, + 850, 900, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500, + 1550, 1600, 1650, 1700, 1750, 1800, 1850, 1900, 1950, 2000, 2050, 2100, 2150, 2200, + 2250, 2300, 2350, 2400, 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, 2900, + 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, 3400, 3450, 3500, 3550, 3600, + 3650, 3700, 3750, 3800, 3850, 3900, 3950, 4000, 4050, 4100, 4150, 4200, 4250, 4300, + 4350, 4400, 4450, 4500, 4550, 4600, 4650, 4700, 4750, 4800, 4850, 4900, 4950, 5000, + 5050, 5100, 5150, 5200, 5250, 5300, 5350, 5400, 5450, 5500, 5550, 5600, 5650, 5700, + 5750, 5800, 5850, 5900, 5950, 6000, 6050, 6100, 6150, 6200, 6250, 6300, 6350, 6400, + 6450, 6500, 6550, 6600, 6650, 6700, 6750, 6800, 6850, 6900, 6950, 7000, 7050, 7100, + 7150, 7200, 7250, 7300, 7350, 7400, 7450, 7500, 7550, 7600, 7650, 7700, 7750, 7800, + 7850, 7900, 7950, 8000, 8050, 8100, 8150, 8200, 8250, 8300, 8350, 8400, 8450, 8500, + 8550, 8600, 8650, 8700, 8750, 8800, 8850, 8900, 8950, 9000, 9050, 9100, 9150, 9200, + 9250, 9300, 9350, 9400, 9450, 9500, 9550, 9600, 9650, 9700, 9750, 9800, 9850, 9900, + 9950, 10000, 10050, 10100, 10150, 10200, 10250, 10300, 10350, 10400, 10450, 10500, + 10550, 10600, 10650, 10700, 10750, 10800, 10850, 10900, 10950, 11000, 11050, 11100, + 11150, 11200, 11250, 11300, 11350, 11400, 11450, 11500, 11550, 11600, 11650, 11700, + 11750, 11800, 11850, 11900, 11950, 12000 + ], + } Clear_Sky_Confidence: name: Clear_Sky_Confidence @@ -1252,33 +1314,171 @@ enhancements: kwargs: palettes: - { - filename: csc.txt, - min_value: 0.0, - max_value: 1.0 - } - - - Aerosol_Optical_Thickness_550_Land_Ocean: - name: Aerosol_Optical_Thickness_550_Land_Ocean + colors: [ + [255, 247, 236], [254, 246, 233], [254, 244, 230], [254, 243, 228], [254, 242, 224], + [254, 241, 222], [254, 239, 219], [254, 239, 216], [254, 237, 213], [254, 236, 210], + [254, 235, 207], [254, 233, 204], [254, 232, 202], [253, 231, 198], [253, 230, 195], + [253, 228, 191], [253, 226, 189], [253, 225, 185], [253, 223, 181], [253, 221, 178], + [253, 220, 174], [253, 218, 172], [253, 216, 168], [253, 215, 165], [253, 213, 161], + [253, 211, 157], [253, 210, 156], [253, 207, 153], [253, 206, 152], [253, 203, 149], + [253, 202, 148], [253, 200, 145], [253, 198, 143], [253, 196, 141], [253, 193, 139], + [253, 192, 137], [253, 189, 134], [253, 188, 133], [252, 185, 130], [252, 182, 127], + [252, 177, 123], [252, 174, 120], [252, 170, 116], [252, 166, 112], [252, 163, 109], + [252, 159, 105], [252, 156, 103], [252, 151, 99], [252, 148, 96], [252, 144, 92], + [251, 140, 88], [250, 137, 87], [249, 134, 86], [248, 131, 85], [247, 127, 83], + [246, 125, 82], [245, 121, 80], [244, 119, 79], [243, 115, 78], [242, 111, 76], + [241, 109, 75], [240, 105, 73], [239, 102, 72], [237, 98, 69], [236, 94, 67], + [234, 89, 63], [232, 86, 60], [230, 81, 57], [227, 76, 53], [226, 73, 50], [224, 68, 46], + [222, 65, 44], [220, 60, 40], [218, 56, 37], [216, 51, 33], [214, 46, 30], [211, 43, 28], + [208, 39, 25], [206, 36, 23], [202, 31, 20], [200, 28, 18], [197, 24, 15], [194, 21, 13], + [191, 16, 10], [188, 12, 7], [185, 9, 5], [182, 4, 3], [180, 1, 1], [175, 0, 0], + [172, 0, 0], [167, 0, 0], [164, 0, 0], [159, 0, 0], [154, 0, 0], [151, 0, 0], + [146, 0, 0], [143, 0, 0], [138, 0, 0], [135, 0, 0], [130, 0, 0], [127, 0, 0] + ], + values: [ + 0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, + 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, + 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41, 0.42, + 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, + 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, + 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, + 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1 + ] + } + + Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate: + name: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate operations: - name: colorize method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - {filename: aod.txt, - min_value: 0.0, - max_value: 5.0, - } + - { + colors: [ + [255, 252, 199], [255, 251, 193], [255, 250, 188], [255, 249, 183], [255, 248, 178], + [255, 247, 173], [255, 246, 167], [255, 245, 162], [255, 244, 157], [255, 243, 152], + [255, 242, 147], [255, 240, 144], [255, 239, 141], [255, 238, 138], [255, 236, 135], + [255, 235, 132], [255, 234, 129], [255, 232, 126], [255, 231, 123], [255, 230, 120], + [255, 229, 118], [255, 227, 115], [255, 226, 113], [255, 225, 110], [255, 223, 108], + [255, 222, 106], [255, 221, 103], [255, 219, 101], [255, 218, 98], [255, 217, 96], + [255, 216, 94], [255, 214, 91], [255, 212, 89], [255, 210, 87], [255, 208, 85], + [255, 207, 83], [255, 205, 80], [255, 203, 78], [255, 201, 76], [255, 199, 74], + [255, 198, 72], [255, 195, 70], [255, 193, 68], [255, 190, 66], [255, 188, 64], + [255, 185, 62], [255, 183, 60], [255, 180, 58], [255, 178, 56], [255, 175, 54], + [255, 173, 53], [255, 170, 51], [255, 168, 50], [255, 165, 49], [255, 163, 47], + [255, 161, 46], [255, 158, 45], [255, 156, 43], [255, 153, 42], [255, 151, 41], + [255, 149, 40], [255, 146, 39], [255, 144, 38], [255, 142, 37], [255, 140, 37], + [255, 138, 36], [255, 135, 35], [255, 133, 35], [255, 131, 34], [255, 129, 33], + [255, 127, 33], [255, 124, 32], [255, 121, 31], [255, 118, 31], [255, 115, 30], + [255, 112, 30], [255, 109, 29], [255, 106, 28], [255, 103, 28], [255, 100, 27], + [255, 98, 27], [255, 94, 26], [255, 91, 25], [255, 88, 24], [255, 85, 24], [255, 82, 23], + [255, 78, 22], [255, 75, 22], [255, 72, 21], [255, 69, 20], [255, 66, 20], [254, 63, 19], + [253, 60, 19], [252, 58, 18], [251, 55, 18], [250, 53, 18], [249, 50, 17], [248, 47, 17], + [247, 45, 16], [246, 42, 16], [245, 40, 16], [243, 38, 15], [242, 36, 15], [240, 34, 14], + [239, 32, 14], [238, 30, 13], [236, 28, 13], [235, 26, 12], [233, 24, 12], [232, 22, 11], + [231, 20, 11], [229, 18, 11], [227, 17, 11], [225, 16, 11], [223, 14, 11], [221, 13, 11], + [219, 12, 11], [217, 10, 11], [215, 9, 11], [213, 8, 11], [211, 7, 12], [208, 6, 12], + [206, 5, 12], [204, 4, 12], [201, 4, 12], [199, 3, 13], [197, 2, 13], [194, 2, 13], + [192, 1, 13], [190, 0, 13], [188, 0, 14], [184, 0, 14], [181, 0, 14], [178, 0, 14], + [174, 0, 14], [171, 0, 14], [168, 0, 14], [164, 0, 14], [161, 0, 14], [158, 0, 14], + [155, 0, 14], [152, 0, 14], [149, 0, 14], [146, 0, 14], [143, 0, 14], [140, 0, 14], + [137, 0, 14], [134, 0, 14], [131, 0, 14], [128, 0, 14], [125, 0, 14] + ], + values: [ + 0, 0.005, 0.01, 0.015, 0.02, 0.025, 0.03, 0.035, 0.04, 0.045, 0.05, 0.055, 0.06, + 0.065, 0.07, 0.075, 0.08, 0.085, 0.09, 0.095, 0.1, 0.105, 0.11, 0.115, 0.12, 0.125, + 0.13, 0.135, 0.14, 0.145, 0.15, 0.155, 0.16, 0.165, 0.17, 0.175, 0.18, 0.185, 0.19, + 0.195, 0.2, 0.205, 0.21, 0.215, 0.22, 0.225, 0.23, 0.235, 0.24, 0.245, 0.25, 0.255, + 0.26, 0.265, 0.27, 0.275, 0.28, 0.285, 0.29, 0.295, 0.3, 0.305, 0.31, 0.315, 0.32, + 0.325, 0.33, 0.335, 0.34, 0.345, 0.35, 0.355, 0.36, 0.365, 0.37, 0.375, 0.38, 0.385, + 0.39, 0.395, 0.4, 0.405, 0.41, 0.415, 0.42, 0.425, 0.43, 0.435, 0.44, 0.445, 0.45, + 0.455, 0.46, 0.465, 0.47, 0.475, 0.48, 0.485, 0.49, 0.495, 0.5, 0.505, 0.51, 0.515, + 0.52, 0.525, 0.53, 0.535, 0.54, 0.545, 0.55, 0.555, 0.56, 0.565, 0.57, 0.575, 0.58, + 0.585, 0.59, 0.595, 0.6, 0.605, 0.61, 0.615, 0.62, 0.625, 0.63, 0.635, 0.64, 0.645, + 0.65, 0.655, 0.66, 0.665, 0.67, 0.675, 0.68, 0.685, 0.69, 0.695, 0.7, 1.13, 1.56, + 1.99, 2.42, 2.85, 3.28, 3.71, 4.14, 4.57, 5 + ], + } - Angstrom_Exponent_Land_Ocean: - name: Angstrom_Exponent_Land_Ocean + Angstrom_Exponent_Land_Ocean_Best_Estimate: + name: Angstrom_Exponent_Land_Ocean_Best_Estimate operations: - name: colorize method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - { - filename: aelo.txt, - min_value: -0.5, - max_value: 2.5, - } + - { + colors: [ + [122, 145, 2], [123, 148, 3], [124, 150, 4], [124, 153, 5], [125, 155, 6], + [126, 158, 7], [127, 160, 8], [127, 163, 9], [128, 165, 10], [129, 168, 11], + [130, 170, 12], [130, 173, 13], [131, 175, 14], [132, 178, 15], [133, 181, 16], + [132, 183, 18], [132, 185, 20], [132, 187, 22], [132, 189, 25], [132, 191, 27], + [132, 193, 29], [132, 195, 31], [131, 197, 34], [131, 199, 36], [131, 201, 38], + [131, 203, 40], [131, 205, 43], [131, 207, 45], [131, 209, 47], [131, 212, 50], + [130, 213, 51], [129, 215, 53], [128, 217, 55], [128, 219, 57], [127, 221, 59], + [126, 222, 61], [125, 224, 63], [125, 226, 64], [124, 228, 66], [123, 230, 68], + [122, 231, 70], [122, 233, 72], [121, 235, 74], [120, 237, 76], [120, 239, 78], + [119, 239, 79], [118, 240, 80], [117, 241, 82], [116, 242, 83], [116, 243, 85], + [115, 244, 86], [114, 245, 87], [113, 246, 89], [112, 247, 90], [112, 248, 92], + [111, 249, 93], [110, 250, 94], [109, 251, 96], [108, 252, 97], [108, 253, 99], + [107, 252, 100], [106, 252, 102], [106, 252, 103], [105, 251, 105], [105, 251, 106], + [104, 251, 108], [103, 251, 109], [103, 250, 111], [102, 250, 112], [102, 250, 114], + [101, 250, 115], [100, 249, 117], [100, 249, 118], [99, 249, 120], [99, 249, 122], + [98, 247, 123], [97, 246, 124], [96, 245, 126], [95, 244, 127], [94, 243, 128], + [93, 242, 130], [92, 241, 131], [92, 239, 132], [91, 238, 134], [90, 237, 135], + [89, 236, 136], [88, 235, 138], [87, 234, 139], [86, 233, 140], [86, 232, 142], + [85, 230, 143], [84, 229, 144], [83, 228, 145], [82, 226, 147], [81, 225, 148], + [80, 224, 149], [79, 223, 150], [78, 221, 152], [77, 220, 153], [76, 219, 154], + [75, 218, 155], [74, 216, 157], [73, 215, 158], [72, 214, 159], [72, 213, 161], + [71, 211, 162], [70, 209, 163], [69, 208, 164], [68, 206, 165], [67, 205, 166], + [66, 203, 167], [65, 201, 168], [64, 200, 170], [63, 198, 171], [62, 197, 172], + [61, 195, 173], [60, 193, 174], [59, 192, 175], [58, 190, 176], [58, 189, 178], + [58, 187, 178], [58, 185, 179], [58, 184, 180], [58, 182, 181], [58, 181, 182], + [58, 179, 183], [58, 178, 184], [59, 176, 184], [59, 175, 185], [59, 173, 186], + [59, 172, 187], [59, 170, 188], [59, 169, 189], [59, 167, 190], [60, 166, 191], + [60, 164, 191], [61, 162, 192], [61, 160, 193], [62, 158, 194], [63, 156, 195], + [63, 154, 195], [64, 152, 196], [64, 150, 197], [65, 148, 198], [66, 146, 199], + [66, 144, 199], [67, 142, 200], [67, 140, 201], [68, 138, 202], [69, 137, 203], + [69, 135, 203], [70, 133, 204], [70, 131, 205], [71, 129, 205], [72, 128, 206], + [72, 126, 207], [73, 124, 207], [73, 122, 208], [74, 120, 209], [75, 119, 209], + [75, 117, 210], [76, 115, 211], [76, 113, 211], [77, 111, 212], [78, 110, 213], + [78, 108, 213], [79, 106, 214], [80, 104, 214], [80, 102, 215], [81, 101, 216], + [82, 99, 216], [82, 97, 217], [83, 95, 217], [84, 93, 218], [84, 92, 219], + [85, 90, 219], [86, 88, 220], [86, 86, 220], [87, 84, 221], [88, 83, 222], + [88, 82, 222], [89, 81, 223], [90, 80, 223], [91, 80, 224], [92, 79, 224], + [93, 78, 225], [94, 77, 225], [95, 77, 226], [96, 76, 226], [97, 75, 227], + [98, 74, 227], [99, 74, 228], [100, 73, 228], [101, 72, 229], [102, 72, 230], + [104, 72, 230], [106, 73, 230], [108, 73, 230], [110, 74, 231], [112, 74, 231], + [114, 75, 231], [116, 75, 231], [118, 76, 232], [120, 76, 232], [122, 77, 232], + [124, 77, 232], [126, 78, 233], [128, 78, 233], [130, 79, 233], [133, 80, 234], + [135, 80, 234], [137, 80, 234], [139, 81, 234], [141, 81, 234], [143, 81, 234], + [145, 82, 234], [147, 82, 234], [149, 82, 234], [151, 83, 234], [153, 83, 234], + [155, 83, 234], [157, 84, 234], [159, 84, 234], [161, 84, 234], [164, 85, 235], + [165, 85, 235], [166, 85, 235], [168, 85, 235], [169, 85, 235], [171, 85, 235], + [172, 85, 235], [174, 85, 235], [175, 86, 235], [177, 86, 235], [178, 86, 235], + [180, 86, 235], [181, 86, 235], [183, 86, 235], [184, 86, 235], [186, 87, 235], + [187, 87, 234], [188, 87, 234], [190, 87, 234], [191, 88, 234], [193, 88, 234], + [194, 88, 234], [196, 88, 234], [197, 89, 234], [199, 89, 234], [200, 89, 234], [202, 89, 234] + ], + values: [ + 0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, + 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, + 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, + 0.38, 0.39, 0.4, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, + 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, + 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, + 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, + 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1, 1.01, 1.02, 1.03, + 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, + 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, + 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39, 1.4, 1.41, 1.42, 1.43, 1.44, 1.45, + 1.46, 1.47, 1.48, 1.49, 1.5, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59, + 1.6, 1.61, 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69, 1.7, 1.71, 1.72, 1.73, + 1.74, 1.75, 1.76, 1.77, 1.78, 1.79, 1.8, 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, + 1.88, 1.89, 1.9, 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98, 1.99, 2, 2.01, + 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 2.13, 2.14, 2.15, + 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, + 2.3, 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4, 2.41, 2.42, 2.43, + 2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5 + ], + } diff --git a/satpy/etc/readers/viirs_l2.yaml b/satpy/etc/readers/viirs_l2.yaml index b8f403917f..d0fd419fb1 100644 --- a/satpy/etc/readers/viirs_l2.yaml +++ b/satpy/etc/readers/viirs_l2.yaml @@ -91,7 +91,6 @@ datasets: long_name: VIIRS Clear Sky Confidence units: None coordinates: [cld_lon, cld_lat] - resolution: 742 file_key: geophysical_data/Clear_Sky_Confidence file_type: cldmsk_l2_viirs @@ -104,27 +103,24 @@ datasets: long_name: Cloud Top Height from NOAA CLAVR-x AWG algorithm units: m coordinates: [cld_lon,cld_lat] - resolution: 742 file_key: geophysical_data/Cloud_Top_Height file_type: cldprop_l2_viirs ########################################## # Datasets in files aerdb_l2_viirs and nrt ########################################## - Angstrom_Exponent_Land_Ocean: - name: Angstrom_Exponent_Land_Ocean + Angstrom_Exponent_Land_Ocean_Best_Estimate: + name: Angstrom_Exponent_Land_Ocean_Best_Estimate long_name: Deep Blue/SOAR Angstrom exponent over land and ocean units: None coordinates: [aerdb_lon,aerdb_lat] - resolution: 742 - file_key: Angstrom_Exponent_Land_Ocean + file_key: Angstrom_Exponent_Land_Ocean_Best_Estimate file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] Aerosol_Optical_Thickness_550_Land_Ocean: - name: Aerosol_Optical_Thickness_550_Land_Ocean + name: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate long_name: Deep Blue/SOAR aerosol optical thickness at 550 nm over land and ocean units: None coordinates: [aerdb_lon,aerdb_lat] - resolution: 742 - file_key: Aerosol_Optical_Thickness_550_Land_Ocean + file_key: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index 0aa2cb4add..72c75a962b 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -5,7 +5,6 @@ from satpy.readers.netcdf_utils import NetCDF4FileHandler import xarray as xr -from pyresample.geometry import AreaDefinition LOG = logging.getLogger(__name__) @@ -165,34 +164,3 @@ def get_dataset(self, ds_id: int, ds_info: str) -> xr.DataArray: if "number_of_lines" in data.dims: data = data.rename({"number_of_lines": "y", "number_of_pixels": "x"}) return data - - def get_area_def(self, ds_id): - """Get area definition.""" - proj_dict = { - "proj": "latlong", - "datum": "WGS84", - "ellps": "WGS84", - "no_defs": True - } - - area_extent = [self["/attr/geospatial_lon_min"], self["/attr/geospatial_lat_min"], - self["/attr/geospatial_lon_max"], self["/attr/geospatial_lat_max"]] - - if '/dimension/number_of_pixels' in self: - width = int(self['/dimension/number_of_pixels']) - height = int(self['/dimension/number_of_lines']) - else: - width = int(self['/dimension/Idx_Xtrack']) - height = int(self['/dimension/Idx_Atrack']) - - area = AreaDefinition( - "viirs_l2_area", - "name_of_proj", - "id_of_proj", - proj_dict, - width, - height, - np.asarray(area_extent) - ) - - return area diff --git a/satpy/readers/yaml_reader.py b/satpy/readers/yaml_reader.py index ee6d82a961..29aaaf0955 100644 --- a/satpy/readers/yaml_reader.py +++ b/satpy/readers/yaml_reader.py @@ -1011,14 +1011,13 @@ def _set_orientation(dataset, upper_right_corner): "and will not be flipped.".format(dataset.attrs.get("name", "unknown_name"))) return dataset - if dataset.attrs['area'].area_id != 'viirs_l2_area': - projection_type = _get_projection_type(dataset.attrs["area"]) - accepted_geos_proj_types = ["Geostationary Satellite (Sweep Y)", "Geostationary Satellite (Sweep X)"] - if projection_type not in accepted_geos_proj_types: - logger.info("Dataset {} is not in one of the known geostationary projections {} " - "and cannot be flipped.".format(dataset.attrs.get("name", "unknown_name"), - accepted_geos_proj_types)) - return dataset + projection_type = _get_projection_type(dataset.attrs["area"]) + accepted_geos_proj_types = ["Geostationary Satellite (Sweep Y)", "Geostationary Satellite (Sweep X)"] + if projection_type not in accepted_geos_proj_types: + logger.info("Dataset {} is not in one of the known geostationary projections {} " + "and cannot be flipped.".format(dataset.attrs.get("name", "unknown_name"), + accepted_geos_proj_types)) + return dataset target_eastright, target_northup = _get_target_scene_orientation(upper_right_corner) diff --git a/satpy/tests/reader_tests/test_viirs_l2.py b/satpy/tests/reader_tests/test_viirs_l2.py index e514ecdc1f..90590a39b2 100644 --- a/satpy/tests/reader_tests/test_viirs_l2.py +++ b/satpy/tests/reader_tests/test_viirs_l2.py @@ -61,8 +61,8 @@ def _fill_contents_with_default_data(self, file_content, file_type): elif file_type == "AERDB_": file_content["Latitude"] = DEFAULT_LAT_DATA file_content["Longitude"] = DEFAULT_LON_DATA - file_content["Angstrom_Exponent_Land_Ocean"] = DEFAULT_FILE_DATA - file_content["Aerosol_Optical_Thickness_550_Land_Ocean"] = DEFAULT_FILE_DATA + file_content["Angstrom_Exponent_Land_Ocean_Best_Estimate"] = DEFAULT_FILE_DATA + file_content["Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate"] = DEFAULT_FILE_DATA class TestVIIRSL2FileHandler: @@ -114,7 +114,7 @@ def test_load_aerdb(self): ) r.create_filehandlers(loadables) datasets = r.load( - ["Aerosol_Optical_Thickness_550_Land_Ocean", "Angstrom_Exponent_Land_Ocean"] + ["Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate", "Angstrom_Exponent_Land_Ocean_Best_Estimate"] ) assert len(datasets) == 2 for d in datasets.values(): From 99b707a48d5ce3488fe591469ec3db97e1b87f8f Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Mon, 5 Feb 2024 16:32:27 +0000 Subject: [PATCH 166/481] Added my name to authors list --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 796ee9743b..d976cf318f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -88,3 +88,4 @@ The following people have made contributions to this project: - [Xin Zhang (zxdawn)](https://github.com/zxdawn) - [Yufei Zhu (yufeizhu600)](https://github.com/yufeizhu600) - [Youva Aoun (YouvaEUMex)](https://github.com/YouvaEUMex) +- [Will Sharpe (wjsharpe)](https://github.com/wjsharpe) From df86728c3754f523a15a12a1e7a2221b1477d459 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Mon, 5 Feb 2024 16:39:28 +0000 Subject: [PATCH 167/481] Removed whitespace from viirs enhancements --- satpy/etc/enhancements/viirs.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/satpy/etc/enhancements/viirs.yaml b/satpy/etc/enhancements/viirs.yaml index 62198c4de3..8b3751167d 100644 --- a/satpy/etc/enhancements/viirs.yaml +++ b/satpy/etc/enhancements/viirs.yaml @@ -79,6 +79,3 @@ enhancements: ], min_value: 0, max_value: 201} - - - From ed65d84ae804dcdb281348fec3a354a0bb318213 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 20:02:28 +0000 Subject: [PATCH 168/481] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.1.9 → v0.2.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.9...v0.2.0) - [github.com/PyCQA/bandit: 1.7.6 → 1.7.7](https://github.com/PyCQA/bandit/compare/1.7.6...1.7.7) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 37c458982a..4a90da5ce9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ fail_fast: false repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: 'v0.1.9' + rev: 'v0.2.0' hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks @@ -14,7 +14,7 @@ repos: - id: check-yaml args: [--unsafe] - repo: https://github.com/PyCQA/bandit - rev: '1.7.6' # Update me! + rev: '1.7.7' # Update me! hooks: - id: bandit args: [--ini, .bandit] From 13168cfcce132c3fd5fdaecfd1d29eafef32ec32 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 5 Feb 2024 22:16:53 +0200 Subject: [PATCH 169/481] Remove assertions that don't hold when not loading an actual image --- satpy/tests/test_composites.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 420f60efa2..c913d49045 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1420,8 +1420,6 @@ def load(self, arg): filenames=["/foo.tif"]) register.assert_not_called() retrieve.assert_not_called() - assert res.attrs["start_time"] is None - assert res.attrs["end_time"] is None assert res.attrs["sensor"] is None assert "modifiers" not in res.attrs assert "calibration" not in res.attrs @@ -1434,8 +1432,6 @@ def load(self, arg): res = comp() Scene.assert_called_once_with(reader="generic_image", filenames=["data_dir/foo.tif"]) - assert res.attrs["start_time"] is None - assert res.attrs["end_time"] is None assert res.attrs["sensor"] is None assert "modifiers" not in res.attrs assert "calibration" not in res.attrs From 1a8a7edfb41385ab284a636782e02f602849e02c Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Mon, 5 Feb 2024 20:20:01 +0000 Subject: [PATCH 170/481] restored yaml_reader and added coordinate check to viirs_l2 --- satpy/etc/readers/viirs_l2.yaml | 16 ++++++++-------- satpy/readers/viirs_l2.py | 8 ++++++++ satpy/readers/yaml_reader.py | 8 ++++++-- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/satpy/etc/readers/viirs_l2.yaml b/satpy/etc/readers/viirs_l2.yaml index d0fd419fb1..9ba23a17ee 100644 --- a/satpy/etc/readers/viirs_l2.yaml +++ b/satpy/etc/readers/viirs_l2.yaml @@ -42,42 +42,42 @@ file_types: datasets: cld_lon: name: cld_lon - resolution: + resolution: 1000 file_type: [cldmsk_l2_viirs, cldprop_l2_viirs] file_key: geolocation_data/longitude units: degrees standard_name: longitude cld_lat: name: cld_lat - resolution: + resolution: 1000 file_type: [cldmsk_l2_viirs, cldprop_l2_viirs] file_key: geolocation_data/latitude units: degrees standard_name: latitude aerdb_lon: name: aerdb_lon - resolution: + resolution: 1000 file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] file_key: Longitude units: degrees - standard_name: Longitude + standard_name: longitude aerdb_lat: name: aerdb_lat - resolution: + resolution: 1000 file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] file_key: Latitude units: degrees - standard_name: Latitude + standard_name: latitude aerdt_lon: name: aerdt_lon - resolution: + resolution: 1000 file_type: [aerdt_l2_viirs] file_key: longitude units: degrees standard_name: longitude aerdt_lat: name: aerdt_lat - resolution: + resolution: 1000 file_type: [aerdt_l2_viirs] file_key: latitude units: degrees diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index 72c75a962b..ce242bedbc 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -150,6 +150,14 @@ def get_dataset(self, ds_id: int, ds_info: str) -> xr.DataArray: scale_offset, ) = self._get_dataset_valid_range(ds_id, ds_info, var_path) data = self[var_path] + + # For aerdb Longitude and Latitude datasets have coordinates + # This check is needed to work with yaml_reader + if 'long_name' in metadata and metadata['long_name'] == 'Longitude': + data.coords['Latitude'].attrs['standard_name'] = 'latitude' + elif 'long_name' in metadata and metadata['long_name'] == 'Latitude': + data.coords['Longitude'].attrs['standard_name'] = 'longitude' + data.attrs.update(metadata) if valid_min is not None and valid_max is not None: data = data.where((data >= valid_min) & (data <= valid_max)) diff --git a/satpy/readers/yaml_reader.py b/satpy/readers/yaml_reader.py index 29aaaf0955..5444d7e16f 100644 --- a/satpy/readers/yaml_reader.py +++ b/satpy/readers/yaml_reader.py @@ -261,6 +261,7 @@ def select_files_from_pathnames(self, filenames): """Select the files from *filenames* this reader can handle.""" selected_filenames = [] filenames = set(filenames) # make a copy of the inputs + for pattern in self.file_patterns: matching = _match_filenames(filenames, pattern) filenames -= matching @@ -492,6 +493,7 @@ def _new_filehandler_instances(self, filetype_info, filename_items, fh_kwargs=No """Generate new filehandler instances.""" requirements = filetype_info.get("requires") filetype_cls = filetype_info["file_reader"] + if fh_kwargs is None: fh_kwargs = {} @@ -507,6 +509,7 @@ def _new_filehandler_instances(self, filetype_info, filename_items, fh_kwargs=No except RuntimeError as err: warnings.warn(str(err) + " for {}".format(filename), stacklevel=4) continue + yield filetype_cls(filename, filename_info, filetype_info, *req_fh, **fh_kwargs) def time_matches(self, fstart, fend): @@ -783,9 +786,9 @@ def _get_lons_lats_from_coords(self, coords): """Get lons and lats from the coords list.""" lons, lats = None, None for coord in coords: - if coord.attrs.get("standard_name").lower() == "longitude": + if coord.attrs.get("standard_name") == "longitude": lons = coord - elif coord.attrs.get("standard_name").lower() == "latitude": + elif coord.attrs.get("standard_name") == "latitude": lats = coord if lons is None or lats is None: raise ValueError("Missing longitude or latitude coordinate: " + str(coords)) @@ -823,6 +826,7 @@ def _load_dataset_with_area(self, dsid, coords, **kwargs): return None coords = self._assign_coords_from_dataarray(coords, ds) + area = self._load_dataset_area(dsid, file_handlers, coords, **kwargs) if area is not None: From f7e75708c9e024d0be56ecf5f6a13cc1ee72f174 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 5 Feb 2024 22:58:54 +0200 Subject: [PATCH 171/481] Combine also values of 'time_parameters' dictionary items --- satpy/dataset/metadata.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 1a52b6825f..3b6e835b0d 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -89,16 +89,28 @@ def _combine_shared_info(shared_keys, info_dicts): def _combine_times(key, values): + if key == "time_parameters": + return _combine_time_parameters(values) filtered_values = _filter_time_values(values) if not filtered_values: return None - if key == "end_time": + if "end_time" in key: return max(filtered_values) - elif key == "start_time": + elif "start_time" in key: return min(filtered_values) return average_datetimes(filtered_values) +def _combine_time_parameters(values): + # Assume the first item has all the keys + keys = values[0].keys() + res = {} + for key in keys: + sub_values = [itm[key] for itm in values] + res[key] = _combine_times(key, sub_values) + return res + + def _filter_time_values(values): """Remove values that are not datetime objects.""" return [v for v in values if isinstance(v, datetime)] From 4d3d62b052b87f71653300956657ab213a6ed7ea Mon Sep 17 00:00:00 2001 From: David Hoese Date: Mon, 5 Feb 2024 15:08:24 -0600 Subject: [PATCH 172/481] Fix ruff configuration deprecations --- pyproject.toml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4de1e302f4..537f70cabb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,19 +14,21 @@ known_first_party = "satpy" line_length = 120 [tool.ruff] +line-length = 120 + +[tool.ruff.lint] # See https://docs.astral.sh/ruff/rules/ # In the future, add "B", "S", "N" select = ["A", "D", "E", "W", "F", "I", "PT", "TID", "C90", "Q", "T10", "T20"] -line-length = 120 -[tool.ruff.per-file-ignores] +[tool.ruff.lint.per-file-ignores] "satpy/tests/*" = ["S101"] # assert allowed in tests "utils/coord2area_def.py" = ["T201"] # allow print "fetch_avhrr_calcoeffs.py" = ["T201"] # allow print -[tool.ruff.pydocstyle] +[tool.ruff.lint.pydocstyle] convention = "google" -[tool.ruff.mccabe] +[tool.ruff.lint.mccabe] # Unlike Flake8, default to a complexity level of 10. max-complexity = 10 From 55d7ed20202e84a8e84d5103a26c50ec9e19d299 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Mon, 5 Feb 2024 15:09:37 -0600 Subject: [PATCH 173/481] Remove unnecessarily escaped quote characters --- satpy/tests/reader_tests/test_hy2_scat_l2b_h5.py | 2 +- satpy/writers/awips_tiled.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/tests/reader_tests/test_hy2_scat_l2b_h5.py b/satpy/tests/reader_tests/test_hy2_scat_l2b_h5.py index 9bf5f5f093..f90da00613 100644 --- a/satpy/tests/reader_tests/test_hy2_scat_l2b_h5.py +++ b/satpy/tests/reader_tests/test_hy2_scat_l2b_h5.py @@ -330,7 +330,7 @@ def _get_global_attrs(self, num_rows, num_cols): "/attr/Platform_LongName": "Haiyang 2B Ocean Observing Satellite", "/attr/Platform_ShortName": "HY-2B", "/attr/Platform_Type": "spacecraft", - "/attr/Producer_Agency": "Ministry of Natural Resources of the People\'s Republic of China", + "/attr/Producer_Agency": "Ministry of Natural Resources of the People's Republic of China", "/attr/Producer_Institution": "NSOAS", "/attr/Production_Date_Time": "20200326T06:23:10", "/attr/Range_Beginning_Time": "20200326T01:11:07", diff --git a/satpy/writers/awips_tiled.py b/satpy/writers/awips_tiled.py index 03ce3e9d68..8fe9a8d2cc 100644 --- a/satpy/writers/awips_tiled.py +++ b/satpy/writers/awips_tiled.py @@ -1824,7 +1824,7 @@ def main(): group_2.add_argument("--letters", dest="lettered_grid", action="store_true", help="Create tiles from a static letter-based grid based on the product projection") group_2.add_argument("--letter-subtiles", nargs=2, type=int, default=(2, 2), - help="Specify number of subtiles in each lettered tile: \'row col\'") + help="Specify number of subtiles in each lettered tile: 'row col'") group_2.add_argument("--output-pattern", default=DEFAULT_OUTPUT_PATTERN, help="output filenaming pattern") group_2.add_argument("--source-name", default="SSEC", From 4e85a8f611c208a8d4911a7021ec7f343784c40c Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Tue, 6 Feb 2024 11:47:01 +0200 Subject: [PATCH 174/481] Separate value combination to a new function --- satpy/dataset/metadata.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 3b6e835b0d..561580e2d9 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -78,16 +78,20 @@ def _combine_shared_info(shared_keys, info_dicts): shared_info = {} for key in shared_keys: values = [info[key] for info in info_dicts] - if "time" in key: - times = _combine_times(key, values) - if times is None: - continue - shared_info[key] = times - elif _are_values_combinable(values): - shared_info[key] = values[0] + _combine_values(key, values, shared_info) return shared_info +def _combine_values(key, values, shared_info): + if "time" in key: + times = _combine_times(key, values) + if times is None: + return + shared_info[key] = times + elif _are_values_combinable(values): + shared_info[key] = values[0] + + def _combine_times(key, values): if key == "time_parameters": return _combine_time_parameters(values) From cb13af7326617e4565038c32b98be77d2f9f3cad Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Tue, 6 Feb 2024 14:36:59 +0000 Subject: [PATCH 175/481] Updated reader and tests based on ruff linting --- satpy/readers/viirs_l2.py | 23 ++++++++++++++++++----- satpy/tests/reader_tests/test_viirs_l2.py | 9 ++++++--- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index ce242bedbc..59d3c8ea1f 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -1,15 +1,27 @@ +"""Interface to VIIRS L2 format. + +This reader implements the support of L2 files generated using the VIIRS instrument on SNPP and NOAA satellite files. +The intent of this reader is to be able to reproduce images from L2 layers in NASA worldview with identical colormaps. + +Currently a subset of four of these layers are supported +1. Deep Blue Aerosol Angstrom Exponent (Land and Ocean) +2. Clear Sky Confidence +3. Cloud Top Height +4. Deep Blue Aerosol Optical Thickness (Land and Ocean) +""" import logging from datetime import datetime import numpy as np +import xarray as xr from satpy.readers.netcdf_utils import NetCDF4FileHandler -import xarray as xr LOG = logging.getLogger(__name__) class VIIRSL2FileHandler(NetCDF4FileHandler): + """NetCDF File Handler for VIIRS L2 Products.""" def _parse_datetime(self, datestr): """Parse datetime.""" return datetime.strptime(datestr, "%Y-%m-%dT%H:%M:%S.000Z") @@ -141,6 +153,7 @@ def available_datasets(self, configured_datasets=None): yield ft_matches and is_in_file, ds_info def get_dataset(self, ds_id: int, ds_info: str) -> xr.DataArray: + """Get DataArray for specified dataset.""" var_path = ds_info.get("file_key", ds_info["name"]) metadata = self.get_metadata(ds_id, ds_info) ( @@ -153,10 +166,10 @@ def get_dataset(self, ds_id: int, ds_info: str) -> xr.DataArray: # For aerdb Longitude and Latitude datasets have coordinates # This check is needed to work with yaml_reader - if 'long_name' in metadata and metadata['long_name'] == 'Longitude': - data.coords['Latitude'].attrs['standard_name'] = 'latitude' - elif 'long_name' in metadata and metadata['long_name'] == 'Latitude': - data.coords['Longitude'].attrs['standard_name'] = 'longitude' + if "long_name" in metadata and metadata["long_name"] == "Longitude": + data.coords["Latitude"].attrs["standard_name"] = "latitude" + elif "long_name" in metadata and metadata["long_name"] == "Latitude": + data.coords["Longitude"].attrs["standard_name"] = "longitude" data.attrs.update(metadata) if valid_min is not None and valid_max is not None: diff --git a/satpy/tests/reader_tests/test_viirs_l2.py b/satpy/tests/reader_tests/test_viirs_l2.py index 90590a39b2..dbef1d55ee 100644 --- a/satpy/tests/reader_tests/test_viirs_l2.py +++ b/satpy/tests/reader_tests/test_viirs_l2.py @@ -1,3 +1,4 @@ +"""Module for testing the satpy.readers.viirs_l2 module.""" import os from datetime import datetime, timedelta from unittest import mock @@ -5,9 +6,9 @@ import numpy as np import pytest +from satpy.readers import load_reader from satpy.tests.reader_tests.test_netcdf_utils import FakeNetCDF4FileHandler from satpy.tests.utils import convert_file_content_to_data_array -from satpy.readers import load_reader DEFAULT_FILE_DTYPE = np.uint16 DEFAULT_FILE_SHAPE = (10, 300) @@ -66,8 +67,7 @@ def _fill_contents_with_default_data(self, file_content, file_type): class TestVIIRSL2FileHandler: - """Test VIIRS_L2 Reader""" - + """Test VIIRS_L2 Reader.""" yaml_file = "viirs_l2.yaml" def setup_method(self): @@ -108,6 +108,7 @@ def test_init(self, filename): assert r.file_handlers def test_load_aerdb(self): + """Test Aerdb File Loading.""" r = load_reader(self.reader_configs) loadables = r.select_files_from_pathnames( ["AERDB_L2_VIIRS_SNPP.A2023364.2230.011.2023365113427.nc"] @@ -123,6 +124,7 @@ def test_load_aerdb(self): assert d.attrs["sensor"] == "viirs" def test_load_cldprop(self): + """Test CLDPROP File Loading.""" r = load_reader(self.reader_configs) loadables = r.select_files_from_pathnames( ["CLDPROP_L2_VIIRS_SNPP.A2023364.2230.011.2023365115856.nc"] @@ -136,6 +138,7 @@ def test_load_cldprop(self): assert d.attrs["sensor"] == "viirs" def test_load_cldmsk(self): + """Test CLDMSK File Loading.""" r = load_reader(self.reader_configs) loadables = r.select_files_from_pathnames( ["CLDMSK_L2_VIIRS_SNPP.A2023364.2230.001.2023365105952.nc"] From ecab531eff04ecf63e0d5fe068203475c79ecd54 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Tue, 6 Feb 2024 14:59:51 +0000 Subject: [PATCH 176/481] Cleaned up method inputs and imports based on mypy --- satpy/readers/viirs_l2.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index 59d3c8ea1f..7aa816709d 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -13,7 +13,6 @@ from datetime import datetime import numpy as np -import xarray as xr from satpy.readers.netcdf_utils import NetCDF4FileHandler @@ -73,7 +72,7 @@ def sensor_name(self): """Get sensor name.""" return self["/attr/instrument"].lower() - def _get_dataset_file_units(self, dataset_id, ds_info, var_path): + def _get_dataset_file_units(self, ds_info, var_path): file_units = ds_info.get("units") if file_units is None: file_units = self.get(var_path + "/attr/units") @@ -81,7 +80,7 @@ def _get_dataset_file_units(self, dataset_id, ds_info, var_path): file_units = "1" return file_units - def _get_dataset_valid_range(self, dataset_id, ds_info, var_path): + def _get_dataset_valid_range(self, ds_info, var_path): valid_min = self.get(var_path + "/attr/valid_min") valid_max = self.get(var_path + "/attr/valid_max") if not valid_min and not valid_max: @@ -152,7 +151,7 @@ def available_datasets(self, configured_datasets=None): is_in_file = var_path in self yield ft_matches and is_in_file, ds_info - def get_dataset(self, ds_id: int, ds_info: str) -> xr.DataArray: + def get_dataset(self, ds_id, ds_info): """Get DataArray for specified dataset.""" var_path = ds_info.get("file_key", ds_info["name"]) metadata = self.get_metadata(ds_id, ds_info) From 6c6ded64949f4a7cf97e5154b708e4ba110b5963 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Tue, 6 Feb 2024 15:13:14 +0000 Subject: [PATCH 177/481] Removed yaml trailing whitespace --- satpy/etc/composites/viirs.yaml | 4 ++-- satpy/etc/enhancements/generic.yaml | 2 +- satpy/etc/readers/viirs_l2.yaml | 32 ++++++++++++++--------------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/satpy/etc/composites/viirs.yaml b/satpy/etc/composites/viirs.yaml index 0c82948ee8..09fc358a6b 100644 --- a/satpy/etc/composites/viirs.yaml +++ b/satpy/etc/composites/viirs.yaml @@ -685,7 +685,7 @@ composites: - name: I01 - name: I03 standard_name: cimss_cloud_type - + cth: description: > VIIRS Cloud Top Height with colormap applied @@ -702,6 +702,6 @@ composites: - Cloud_Top_Height - cth conditions: - - method: isnan + - method: isnan transparency: 100 standard_name: viirs_cloud_top_height diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index f2c9dbd9c2..e37c0d69ce 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1399,7 +1399,7 @@ enhancements: 1.99, 2.42, 2.85, 3.28, 3.71, 4.14, 4.57, 5 ], } - + Angstrom_Exponent_Land_Ocean_Best_Estimate: name: Angstrom_Exponent_Land_Ocean_Best_Estimate operations: diff --git a/satpy/etc/readers/viirs_l2.yaml b/satpy/etc/readers/viirs_l2.yaml index 9ba23a17ee..26ac735726 100644 --- a/satpy/etc/readers/viirs_l2.yaml +++ b/satpy/etc/readers/viirs_l2.yaml @@ -3,7 +3,7 @@ reader: short_name: VIIRS L2 long_name: SNPP VIIRS Level 2 data in netCDF4 format description: Generic NASA VIIRS L2 Reader - status: Alpha + status: Alpha supports_fsspec: false reader: !!python/name:satpy.readers.yaml_reader.GEOFlippableFileYAMLReader sensors: [viirs] @@ -12,32 +12,32 @@ reader: file_types: cldprop_l2_viirs: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler - file_patterns: - - 'CLDPROP_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + file_patterns: + - 'CLDPROP_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' cldmsk_l2_viirs: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler - file_patterns: - - 'CLDMSK_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + file_patterns: + - 'CLDMSK_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' aerdb_l2_viirs: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler - file_patterns: - - 'AERDB_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + file_patterns: + - 'AERDB_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' aerdb_l2_viirs_nrt: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler - file_patterns: - - 'AERDB_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.nrt.nc' + file_patterns: + - 'AERDB_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.nrt.nc' cldir_l2_viirs: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler - file_patterns: - - 'CLDIR_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.hdf' + file_patterns: + - 'CLDIR_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.hdf' aerdt_l2_viirs: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler - file_patterns: - - 'AERDT_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + file_patterns: + - 'AERDT_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' fsnrad_l2_viirs: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler - file_patterns: - - 'FSNRAD_L2_VIIRS_CRIS_SS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' + file_patterns: + - 'FSNRAD_L2_VIIRS_CRIS_SS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' datasets: cld_lon: @@ -82,7 +82,7 @@ datasets: file_key: latitude units: degrees standard_name: latitude - + ################################## # Datasets in file cldmsk_l2_viirs ################################## From a3fb5950f2eece44099b82f070684746ce66f601 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Tue, 6 Feb 2024 17:58:13 +0000 Subject: [PATCH 178/481] Updated units, param tests, fixed reader inputs --- satpy/etc/readers/viirs_l2.yaml | 6 +-- satpy/readers/viirs_l2.py | 5 +- satpy/tests/reader_tests/test_viirs_l2.py | 59 ++++++++--------------- 3 files changed, 25 insertions(+), 45 deletions(-) diff --git a/satpy/etc/readers/viirs_l2.yaml b/satpy/etc/readers/viirs_l2.yaml index 26ac735726..b86a856e82 100644 --- a/satpy/etc/readers/viirs_l2.yaml +++ b/satpy/etc/readers/viirs_l2.yaml @@ -89,7 +89,7 @@ datasets: Clear_Sky_Confidence: name: Clear_Sky_Confidence long_name: VIIRS Clear Sky Confidence - units: None + units: "1" coordinates: [cld_lon, cld_lat] file_key: geophysical_data/Clear_Sky_Confidence file_type: cldmsk_l2_viirs @@ -112,7 +112,7 @@ datasets: Angstrom_Exponent_Land_Ocean_Best_Estimate: name: Angstrom_Exponent_Land_Ocean_Best_Estimate long_name: Deep Blue/SOAR Angstrom exponent over land and ocean - units: None + units: "1" coordinates: [aerdb_lon,aerdb_lat] file_key: Angstrom_Exponent_Land_Ocean_Best_Estimate file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] @@ -120,7 +120,7 @@ datasets: Aerosol_Optical_Thickness_550_Land_Ocean: name: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate long_name: Deep Blue/SOAR aerosol optical thickness at 550 nm over land and ocean - units: None + units: "1" coordinates: [aerdb_lon,aerdb_lat] file_key: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index 7aa816709d..77a8a4e697 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -95,7 +95,7 @@ def _get_dataset_valid_range(self, ds_info, var_path): def get_metadata(self, dataset_id, ds_info): """Get metadata.""" var_path = ds_info.get("file_key", ds_info["name"]) - file_units = self._get_dataset_file_units(dataset_id, ds_info, var_path) + file_units = self._get_dataset_file_units(ds_info, var_path) # Get extra metadata i = getattr(self[var_path], "attrs", {}) @@ -160,9 +160,8 @@ def get_dataset(self, ds_id, ds_info): valid_max, scale_factor, scale_offset, - ) = self._get_dataset_valid_range(ds_id, ds_info, var_path) + ) = self._get_dataset_valid_range(ds_info, var_path) data = self[var_path] - # For aerdb Longitude and Latitude datasets have coordinates # This check is needed to work with yaml_reader if "long_name" in metadata and metadata["long_name"] == "Longitude": diff --git a/satpy/tests/reader_tests/test_viirs_l2.py b/satpy/tests/reader_tests/test_viirs_l2.py index dbef1d55ee..cf57e54a70 100644 --- a/satpy/tests/reader_tests/test_viirs_l2.py +++ b/satpy/tests/reader_tests/test_viirs_l2.py @@ -10,7 +10,7 @@ from satpy.tests.reader_tests.test_netcdf_utils import FakeNetCDF4FileHandler from satpy.tests.utils import convert_file_content_to_data_array -DEFAULT_FILE_DTYPE = np.uint16 +DEFAULT_FILE_DTYPE = np.float32 DEFAULT_FILE_SHAPE = (10, 300) DEFAULT_FILE_DATA = np.arange( DEFAULT_FILE_SHAPE[0] * DEFAULT_FILE_SHAPE[1], dtype=DEFAULT_FILE_DTYPE @@ -107,46 +107,27 @@ def test_init(self, filename): # make sure we have some files assert r.file_handlers - def test_load_aerdb(self): - """Test Aerdb File Loading.""" - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames( - ["AERDB_L2_VIIRS_SNPP.A2023364.2230.011.2023365113427.nc"] - ) - r.create_filehandlers(loadables) - datasets = r.load( - ["Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate", "Angstrom_Exponent_Land_Ocean_Best_Estimate"] - ) - assert len(datasets) == 2 - for d in datasets.values(): - assert d.shape == DEFAULT_FILE_SHAPE - assert d.dims == ("y", "x") - assert d.attrs["sensor"] == "viirs" - - def test_load_cldprop(self): - """Test CLDPROP File Loading.""" - r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames( - ["CLDPROP_L2_VIIRS_SNPP.A2023364.2230.011.2023365115856.nc"] - ) - r.create_filehandlers(loadables) - datasets = r.load(["Cloud_Top_Height"]) - assert len(datasets) == 1 - for d in datasets.values(): - assert d.shape == DEFAULT_FILE_SHAPE - assert d.dims == ("y", "x") - assert d.attrs["sensor"] == "viirs" - - def test_load_cldmsk(self): - """Test CLDMSK File Loading.""" + @pytest.mark.parametrize( + ("filename", "datasets"), + [ + pytest.param("CLDPROP_L2_VIIRS_SNPP.A2023364.2230.011.2023365115856.nc",["Cloud_Top_Height"],id="CLDPROP"), + pytest.param("CLDMSK_L2_VIIRS_SNPP.A2023364.2230.001.2023365105952.nc",["Clear_Sky_Confidence"],id="CLDMSK"), + pytest.param("AERDB_L2_VIIRS_SNPP.A2023364.2230.011.2023365113427.nc", + ["Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate", + "Angstrom_Exponent_Land_Ocean_Best_Estimate"],id="AERDB"), + ], + ) + def test_load_l2_files(self,filename,datasets): + """Test L2 File Loading.""" r = load_reader(self.reader_configs) - loadables = r.select_files_from_pathnames( - ["CLDMSK_L2_VIIRS_SNPP.A2023364.2230.001.2023365105952.nc"] - ) + loadables = r.select_files_from_pathnames([filename]) r.create_filehandlers(loadables) - datasets = r.load(["Clear_Sky_Confidence"]) - assert len(datasets) == 1 - for d in datasets.values(): + loaded_datasets = r.load(datasets) + assert len(loaded_datasets) == len(datasets) + for d in loaded_datasets.values(): assert d.shape == DEFAULT_FILE_SHAPE assert d.dims == ("y", "x") assert d.attrs["sensor"] == "viirs" + d_np = d.compute() + assert d.dtype == d_np.dtype + assert d.dtype == np.float32 From c21d75c8cba59a1b911cf24ba24349a47752fd10 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Tue, 6 Feb 2024 18:43:23 +0000 Subject: [PATCH 179/481] added ft_matches check --- satpy/readers/viirs_l2.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index 77a8a4e697..4dc5c8beee 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -147,8 +147,11 @@ def available_datasets(self, configured_datasets=None): yield is_avail, ds_info continue ft_matches = self.file_type_matches(ds_info["file_type"]) - var_path = ds_info.get("file_key", ds_info["name"]) - is_in_file = var_path in self + if not ft_matches: + is_in_file = None + else: + var_path = ds_info.get("file_key", ds_info["name"]) + is_in_file = var_path in self yield ft_matches and is_in_file, ds_info def get_dataset(self, ds_id, ds_info): From 5faf2e389d56b2d477f3429cbc2bfee0308af5fe Mon Sep 17 00:00:00 2001 From: Johan Strandgren Date: Wed, 7 Feb 2024 11:52:17 +0000 Subject: [PATCH 180/481] Make dataset name lower-case. --- satpy/etc/readers/fci_l2_nc.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/readers/fci_l2_nc.yaml b/satpy/etc/readers/fci_l2_nc.yaml index b6056b2a65..ab91e592b5 100644 --- a/satpy/etc/readers/fci_l2_nc.yaml +++ b/satpy/etc/readers/fci_l2_nc.yaml @@ -115,7 +115,7 @@ datasets: import_enum_information: True quality_mtg_parameters: - name: quality_MTG_parameters + name: quality_mtg_parameters standard_name: status_flag resolution: 2000 file_type: [nc_fci_clm, nc_fci_ct, nc_fci_ctth] From 91dbc8e336af1c1830b6502f7accf488f1c90fd8 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 8 Feb 2024 13:19:10 +0200 Subject: [PATCH 181/481] Reword docstring of combine_metadata() to include time_parameters dict --- satpy/dataset/metadata.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 561580e2d9..3f1de02ed5 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -32,11 +32,15 @@ def combine_metadata(*metadata_objects): If the values corresponding to any keys are not equal or do not exist in all provided dictionaries then they are not included in - the returned dictionary. The 'start_time' values will be set to the - earliest value and 'end_time' to latest time. All other keys containing - the word 'time' are averaged. Before these adjustments, non-datetime - objects are filtered out. In the interest of time, lazy arrays are compared - by object identity rather than by their contents. + the returned dictionary. All values of the keys containing the substring + 'start_time' will be set to the earliest value and similarly for 'end_time' + to latest time. All other keys containing the word 'time' are averaged. + Before these adjustments, non-datetime objects are filtered out. + + The same rules are applied to 'time_parameters' dictionary. + + In the interest of processing time, lazy arrays are compared by object + identity rather than by their contents. Args: *metadata_objects: MetadataObject or dict objects to combine From c127ab7bf9f101dfb1336f3efc14bcf8fba090c1 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Thu, 8 Feb 2024 21:18:37 +0000 Subject: [PATCH 182/481] moved colormap to file, removed composites, minor edits --- satpy/etc/colormaps/aerosol_thickness.txt | 151 +++++++++++ satpy/etc/colormaps/angstrom_exponent.txt | 251 +++++++++++++++++++ satpy/etc/colormaps/clear_sky_confidence.txt | 101 ++++++++ satpy/etc/composites/viirs.yaml | 20 -- satpy/etc/enhancements/generic.yaml | 247 ++---------------- satpy/etc/readers/viirs_l2.yaml | 19 +- satpy/readers/viirs_l2.py | 24 +- satpy/tests/reader_tests/test_viirs_l2.py | 10 +- 8 files changed, 550 insertions(+), 273 deletions(-) create mode 100644 satpy/etc/colormaps/aerosol_thickness.txt create mode 100644 satpy/etc/colormaps/angstrom_exponent.txt create mode 100644 satpy/etc/colormaps/clear_sky_confidence.txt diff --git a/satpy/etc/colormaps/aerosol_thickness.txt b/satpy/etc/colormaps/aerosol_thickness.txt new file mode 100644 index 0000000000..e1e6a02f45 --- /dev/null +++ b/satpy/etc/colormaps/aerosol_thickness.txt @@ -0,0 +1,151 @@ +0, 255, 252, 199 +0.005, 255, 251, 193 +0.01, 255, 250, 188 +0.015, 255, 249, 183 +0.02, 255, 248, 178 +0.025, 255, 247, 173 +0.03, 255, 246, 167 +0.035, 255, 245, 162 +0.04, 255, 244, 157 +0.045, 255, 243, 152 +0.05, 255, 242, 147 +0.055, 255, 240, 144 +0.06, 255, 239, 141 +0.065, 255, 238, 138 +0.07, 255, 236, 135 +0.075, 255, 235, 132 +0.08, 255, 234, 129 +0.085, 255, 232, 126 +0.09, 255, 231, 123 +0.095, 255, 230, 120 +0.1, 255, 229, 118 +0.105, 255, 227, 115 +0.11, 255, 226, 113 +0.115, 255, 225, 110 +0.12, 255, 223, 108 +0.125, 255, 222, 106 +0.13, 255, 221, 103 +0.135, 255, 219, 101 +0.14, 255, 218, 98 +0.145, 255, 217, 96 +0.15, 255, 216, 94 +0.155, 255, 214, 91 +0.16, 255, 212, 89 +0.165, 255, 210, 87 +0.17, 255, 208, 85 +0.175, 255, 207, 83 +0.18, 255, 205, 80 +0.185, 255, 203, 78 +0.19, 255, 201, 76 +0.195, 255, 199, 74 +0.2, 255, 198, 72 +0.205, 255, 195, 70 +0.21, 255, 193, 68 +0.215, 255, 190, 66 +0.22, 255, 188, 64 +0.225, 255, 185, 62 +0.23, 255, 183, 60 +0.235, 255, 180, 58 +0.24, 255, 178, 56 +0.245, 255, 175, 54 +0.25, 255, 173, 53 +0.255, 255, 170, 51 +0.26, 255, 168, 50 +0.265, 255, 165, 49 +0.27, 255, 163, 47 +0.275, 255, 161, 46 +0.28, 255, 158, 45 +0.285, 255, 156, 43 +0.29, 255, 153, 42 +0.295, 255, 151, 41 +0.3, 255, 149, 40 +0.305, 255, 146, 39 +0.31, 255, 144, 38 +0.315, 255, 142, 37 +0.32, 255, 140, 37 +0.325, 255, 138, 36 +0.33, 255, 135, 35 +0.335, 255, 133, 35 +0.34, 255, 131, 34 +0.345, 255, 129, 33 +0.35, 255, 127, 33 +0.355, 255, 124, 32 +0.36, 255, 121, 31 +0.365, 255, 118, 31 +0.37, 255, 115, 30 +0.375, 255, 112, 30 +0.38, 255, 109, 29 +0.385, 255, 106, 28 +0.39, 255, 103, 28 +0.395, 255, 100, 27 +0.4, 255, 98, 27 +0.405, 255, 94, 26 +0.41, 255, 91, 25 +0.415, 255, 88, 24 +0.42, 255, 85, 24 +0.425, 255, 82, 23 +0.43, 255, 78, 22 +0.435, 255, 75, 22 +0.44, 255, 72, 21 +0.445, 255, 69, 20 +0.45, 255, 66, 20 +0.455, 254, 63, 19 +0.46, 253, 60, 19 +0.465, 252, 58, 18 +0.47, 251, 55, 18 +0.475, 250, 53, 18 +0.48, 249, 50, 17 +0.485, 248, 47, 17 +0.49, 247, 45, 16 +0.495, 246, 42, 16 +0.5, 245, 40, 16 +0.505, 243, 38, 15 +0.51, 242, 36, 15 +0.515, 240, 34, 14 +0.52, 239, 32, 14 +0.525, 238, 30, 13 +0.53, 236, 28, 13 +0.535, 235, 26, 12 +0.54, 233, 24, 12 +0.545, 232, 22, 11 +0.55, 231, 20, 11 +0.555, 229, 18, 11 +0.56, 227, 17, 11 +0.565, 225, 16, 11 +0.57, 223, 14, 11 +0.575, 221, 13, 11 +0.58, 219, 12, 11 +0.585, 217, 10, 11 +0.59, 215, 9, 11 +0.595, 213, 8, 11 +0.6, 211, 7, 12 +0.605, 208, 6, 12 +0.61, 206, 5, 12 +0.615, 204, 4, 12 +0.62, 201, 4, 12 +0.625, 199, 3, 13 +0.63, 197, 2, 13 +0.635, 194, 2, 13 +0.64, 192, 1, 13 +0.645, 190, 0, 13 +0.65, 188, 0, 14 +0.655, 184, 0, 14 +0.66, 181, 0, 14 +0.665, 178, 0, 14 +0.67, 174, 0, 14 +0.675, 171, 0, 14 +0.68, 168, 0, 14 +0.685, 164, 0, 14 +0.69, 161, 0, 14 +0.695, 158, 0, 14 +0.7, 155, 0, 14 +1.13, 152, 0, 14 +1.56, 149, 0, 14 +1.99, 146, 0, 14 +2.42, 143, 0, 14 +2.85, 140, 0, 14 +3.28, 137, 0, 14 +3.71, 134, 0, 14 +4.14, 131, 0, 14 +4.57, 128, 0, 14 +5, 125, 0, 14 diff --git a/satpy/etc/colormaps/angstrom_exponent.txt b/satpy/etc/colormaps/angstrom_exponent.txt new file mode 100644 index 0000000000..4e56fccd68 --- /dev/null +++ b/satpy/etc/colormaps/angstrom_exponent.txt @@ -0,0 +1,251 @@ +0, 122, 145, 2 +0.01, 123, 148, 3 +0.02, 124, 150, 4 +0.03, 124, 153, 5 +0.04, 125, 155, 6 +0.05, 126, 158, 7 +0.06, 127, 160, 8 +0.07, 127, 163, 9 +0.08, 128, 165, 10 +0.09, 129, 168, 11 +0.1, 130, 170, 12 +0.11, 130, 173, 13 +0.12, 131, 175, 14 +0.13, 132, 178, 15 +0.14, 133, 181, 16 +0.15, 132, 183, 18 +0.16, 132, 185, 20 +0.17, 132, 187, 22 +0.18, 132, 189, 25 +0.19, 132, 191, 27 +0.2, 132, 193, 29 +0.21, 132, 195, 31 +0.22, 131, 197, 34 +0.23, 131, 199, 36 +0.24, 131, 201, 38 +0.25, 131, 203, 40 +0.26, 131, 205, 43 +0.27, 131, 207, 45 +0.28, 131, 209, 47 +0.29, 131, 212, 50 +0.3, 130, 213, 51 +0.31, 129, 215, 53 +0.32, 128, 217, 55 +0.33, 128, 219, 57 +0.34, 127, 221, 59 +0.35, 126, 222, 61 +0.36, 125, 224, 63 +0.37, 125, 226, 64 +0.38, 124, 228, 66 +0.39, 123, 230, 68 +0.4, 122, 231, 70 +0.41, 122, 233, 72 +0.42, 121, 235, 74 +0.43, 120, 237, 76 +0.44, 120, 239, 78 +0.45, 119, 239, 79 +0.46, 118, 240, 80 +0.47, 117, 241, 82 +0.48, 116, 242, 83 +0.49, 116, 243, 85 +0.5, 115, 244, 86 +0.51, 114, 245, 87 +0.52, 113, 246, 89 +0.53, 112, 247, 90 +0.54, 112, 248, 92 +0.55, 111, 249, 93 +0.56, 110, 250, 94 +0.57, 109, 251, 96 +0.58, 108, 252, 97 +0.59, 108, 253, 99 +0.6, 107, 252, 100 +0.61, 106, 252, 102 +0.62, 106, 252, 103 +0.63, 105, 251, 105 +0.64, 105, 251, 106 +0.65, 104, 251, 108 +0.66, 103, 251, 109 +0.67, 103, 250, 111 +0.68, 102, 250, 112 +0.69, 102, 250, 114 +0.7, 101, 250, 115 +0.71, 100, 249, 117 +0.72, 100, 249, 118 +0.73, 99, 249, 120 +0.74, 99, 249, 122 +0.75, 98, 247, 123 +0.76, 97, 246, 124 +0.77, 96, 245, 126 +0.78, 95, 244, 127 +0.79, 94, 243, 128 +0.8, 93, 242, 130 +0.81, 92, 241, 131 +0.82, 92, 239, 132 +0.83, 91, 238, 134 +0.84, 90, 237, 135 +0.85, 89, 236, 136 +0.86, 88, 235, 138 +0.87, 87, 234, 139 +0.88, 86, 233, 140 +0.89, 86, 232, 142 +0.9, 85, 230, 143 +0.91, 84, 229, 144 +0.92, 83, 228, 145 +0.93, 82, 226, 147 +0.94, 81, 225, 148 +0.95, 80, 224, 149 +0.96, 79, 223, 150 +0.97, 78, 221, 152 +0.98, 77, 220, 153 +0.99, 76, 219, 154 +1, 75, 218, 155 +1.01, 74, 216, 157 +1.02, 73, 215, 158 +1.03, 72, 214, 159 +1.04, 72, 213, 161 +1.05, 71, 211, 162 +1.06, 70, 209, 163 +1.07, 69, 208, 164 +1.08, 68, 206, 165 +1.09, 67, 205, 166 +1.1, 66, 203, 167 +1.11, 65, 201, 168 +1.12, 64, 200, 170 +1.13, 63, 198, 171 +1.14, 62, 197, 172 +1.15, 61, 195, 173 +1.16, 60, 193, 174 +1.17, 59, 192, 175 +1.18, 58, 190, 176 +1.19, 58, 189, 178 +1.2, 58, 187, 178 +1.21, 58, 185, 179 +1.22, 58, 184, 180 +1.23, 58, 182, 181 +1.24, 58, 181, 182 +1.25, 58, 179, 183 +1.26, 58, 178, 184 +1.27, 59, 176, 184 +1.28, 59, 175, 185 +1.29, 59, 173, 186 +1.3, 59, 172, 187 +1.31, 59, 170, 188 +1.32, 59, 169, 189 +1.33, 59, 167, 190 +1.34, 60, 166, 191 +1.35, 60, 164, 191 +1.36, 61, 162, 192 +1.37, 61, 160, 193 +1.38, 62, 158, 194 +1.39, 63, 156, 195 +1.4, 63, 154, 195 +1.41, 64, 152, 196 +1.42, 64, 150, 197 +1.43, 65, 148, 198 +1.44, 66, 146, 199 +1.45, 66, 144, 199 +1.46, 67, 142, 200 +1.47, 67, 140, 201 +1.48, 68, 138, 202 +1.49, 69, 137, 203 +1.5, 69, 135, 203 +1.51, 70, 133, 204 +1.52, 70, 131, 205 +1.53, 71, 129, 205 +1.54, 72, 128, 206 +1.55, 72, 126, 207 +1.56, 73, 124, 207 +1.57, 73, 122, 208 +1.58, 74, 120, 209 +1.59, 75, 119, 209 +1.6, 75, 117, 210 +1.61, 76, 115, 211 +1.62, 76, 113, 211 +1.63, 77, 111, 212 +1.64, 78, 110, 213 +1.65, 78, 108, 213 +1.66, 79, 106, 214 +1.67, 80, 104, 214 +1.68, 80, 102, 215 +1.69, 81, 101, 216 +1.7, 82, 99, 216 +1.71, 82, 97, 217 +1.72, 83, 95, 217 +1.73, 84, 93, 218 +1.74, 84, 92, 219 +1.75, 85, 90, 219 +1.76, 86, 88, 220 +1.77, 86, 86, 220 +1.78, 87, 84, 221 +1.79, 88, 83, 222 +1.8, 88, 82, 222 +1.81, 89, 81, 223 +1.82, 90, 80, 223 +1.83, 91, 80, 224 +1.84, 92, 79, 224 +1.85, 93, 78, 225 +1.86, 94, 77, 225 +1.87, 95, 77, 226 +1.88, 96, 76, 226 +1.89, 97, 75, 227 +1.9, 98, 74, 227 +1.91, 99, 74, 228 +1.92, 100, 73, 228 +1.93, 101, 72, 229 +1.94, 102, 72, 230 +1.95, 104, 72, 230 +1.96, 106, 73, 230 +1.97, 108, 73, 230 +1.98, 110, 74, 231 +1.99, 112, 74, 231 +2, 114, 75, 231 +2.01, 116, 75, 231 +2.02, 118, 76, 232 +2.03, 120, 76, 232 +2.04, 122, 77, 232 +2.05, 124, 77, 232 +2.06, 126, 78, 233 +2.07, 128, 78, 233 +2.08, 130, 79, 233 +2.09, 133, 80, 234 +2.1, 135, 80, 234 +2.11, 137, 80, 234 +2.12, 139, 81, 234 +2.13, 141, 81, 234 +2.14, 143, 81, 234 +2.15, 145, 82, 234 +2.16, 147, 82, 234 +2.17, 149, 82, 234 +2.18, 151, 83, 234 +2.19, 153, 83, 234 +2.2, 155, 83, 234 +2.21, 157, 84, 234 +2.22, 159, 84, 234 +2.23, 161, 84, 234 +2.24, 164, 85, 235 +2.25, 165, 85, 235 +2.26, 166, 85, 235 +2.27, 168, 85, 235 +2.28, 169, 85, 235 +2.29, 171, 85, 235 +2.3, 172, 85, 235 +2.31, 174, 85, 235 +2.32, 175, 86, 235 +2.33, 177, 86, 235 +2.34, 178, 86, 235 +2.35, 180, 86, 235 +2.36, 181, 86, 235 +2.37, 183, 86, 235 +2.38, 184, 86, 235 +2.39, 186, 87, 235 +2.4, 187, 87, 234 +2.41, 188, 87, 234 +2.42, 190, 87, 234 +2.43, 191, 88, 234 +2.44, 193, 88, 234 +2.45, 194, 88, 234 +2.46, 196, 88, 234 +2.47, 197, 89, 234 +2.48, 199, 89, 234 +2.49, 200, 89, 234 +2.5, 202, 89, 234 diff --git a/satpy/etc/colormaps/clear_sky_confidence.txt b/satpy/etc/colormaps/clear_sky_confidence.txt new file mode 100644 index 0000000000..58393dbbcd --- /dev/null +++ b/satpy/etc/colormaps/clear_sky_confidence.txt @@ -0,0 +1,101 @@ +0, 255, 247, 236 +0.01, 254, 246, 233 +0.02, 254, 244, 230 +0.03, 254, 243, 228 +0.04, 254, 242, 224 +0.05, 254, 241, 222 +0.06, 254, 239, 219 +0.07, 254, 239, 216 +0.08, 254, 237, 213 +0.09, 254, 236, 210 +0.1, 254, 235, 207 +0.11, 254, 233, 204 +0.12, 254, 232, 202 +0.13, 253, 231, 198 +0.14, 253, 230, 195 +0.15, 253, 228, 191 +0.16, 253, 226, 189 +0.17, 253, 225, 185 +0.18, 253, 223, 181 +0.19, 253, 221, 178 +0.2, 253, 220, 174 +0.21, 253, 218, 172 +0.22, 253, 216, 168 +0.23, 253, 215, 165 +0.24, 253, 213, 161 +0.25, 253, 211, 157 +0.26, 253, 210, 156 +0.27, 253, 207, 153 +0.28, 253, 206, 152 +0.29, 253, 203, 149 +0.3, 253, 202, 148 +0.31, 253, 200, 145 +0.32, 253, 198, 143 +0.33, 253, 196, 141 +0.34, 253, 193, 139 +0.35, 253, 192, 137 +0.36, 253, 189, 134 +0.37, 253, 188, 133 +0.38, 252, 185, 130 +0.39, 252, 182, 127 +0.4, 252, 177, 123 +0.41, 252, 174, 120 +0.42, 252, 170, 116 +0.43, 252, 166, 112 +0.44, 252, 163, 109 +0.45, 252, 159, 105 +0.46, 252, 156, 103 +0.47, 252, 151, 99 +0.48, 252, 148, 96 +0.49, 252, 144, 92 +0.5, 251, 140, 88 +0.51, 250, 137, 87 +0.52, 249, 134, 86 +0.53, 248, 131, 85 +0.54, 247, 127, 83 +0.55, 246, 125, 82 +0.56, 245, 121, 80 +0.57, 244, 119, 79 +0.58, 243, 115, 78 +0.59, 242, 111, 76 +0.6, 241, 109, 75 +0.61, 240, 105, 73 +0.62, 239, 102, 72 +0.63, 237, 98, 69 +0.64, 236, 94, 67 +0.65, 234, 89, 63 +0.66, 232, 86, 60 +0.67, 230, 81, 57 +0.68, 227, 76, 53 +0.69, 226, 73, 50 +0.7, 224, 68, 46 +0.71, 222, 65, 44 +0.72, 220, 60, 40 +0.73, 218, 56, 37 +0.74, 216, 51, 33 +0.75, 214, 46, 30 +0.76, 211, 43, 28 +0.77, 208, 39, 25 +0.78, 206, 36, 23 +0.79, 202, 31, 20 +0.8, 200, 28, 188 +0.81, 197, 24, 15 +0.82, 194, 21, 13 +0.83, 191, 16, 10 +0.84, 188, 12, 7 +0.85, 185, 9, 5 +0.86, 182, 4, 3 +0.87, 180, 1, 1 +0.88, 175, 0, 0 +0.89, 172, 0, 0 +0.9, 167, 0, 0 +0.91, 164, 0, 0 +0.92, 159, 0, 0 +0.93, 154, 0, 0 +0.94, 151, 0, 0 +0.95, 146, 0, 0 +0.96, 143, 0, 0 +0.97, 138, 0, 0 +0.98, 135, 0, 0 +0.99, 130, 0, 0 +1, 127, 0, 0 diff --git a/satpy/etc/composites/viirs.yaml b/satpy/etc/composites/viirs.yaml index 09fc358a6b..bebf6c5833 100644 --- a/satpy/etc/composites/viirs.yaml +++ b/satpy/etc/composites/viirs.yaml @@ -685,23 +685,3 @@ composites: - name: I01 - name: I03 standard_name: cimss_cloud_type - - cth: - description: > - VIIRS Cloud Top Height with colormap applied - compositor: !!python/name:satpy.composites.SingleBandCompositor - prerequisites: - - Cloud_Top_Height - standard_name: cth - - viirs_cloud_top_height: - description: > - Cloud Top Height composite from NOAA/SNPP - compositor: !!python/name:satpy.composites.MaskingCompositor - prerequisites: - - Cloud_Top_Height - - cth - conditions: - - method: isnan - transparency: 100 - standard_name: viirs_cloud_top_height diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index e37c0d69ce..78b59a69c7 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1231,254 +1231,59 @@ enhancements: min_stretch: [0,0,0] max_stretch: [1,1,1] - viirs_cloud_top_height: - name: viirs_cloud_top_height + Cloud_Top_Height: + standard_name: cldprop_cloud_top_height operations: - - name: palettize - method: !!python/name:satpy.enhancements.palettize + - name: colorize + method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - { - colors: [ - [255, 0, 0], [255, 0, 1], [255, 1, 0], [255, 1, 1], [254, 0, 0], [254, 0, 1], - [254, 1, 0], [254, 1, 1], [254, 2, 1], [254, 2, 0], [254, 2, 2], [253, 0, 0], - [253, 0, 1], [253, 1, 0], [253, 1, 1], [253, 1, 2], [170, 0, 0], [170, 0, 1], - [170, 1, 0], [170, 1, 1], [171, 0, 0], [171, 0, 1], [171, 1, 0], [171, 1, 1], - [171, 2, 1], [171, 2, 0], [171, 2, 2], [172, 0, 0], [172, 0, 1], [172, 1, 0], - [172, 1, 1], [172, 1, 2], [110, 0, 0], [110, 0, 1], [110, 1, 0], [110, 1, 1], - [111, 0, 0], [111, 0, 1], [111, 1, 0], [111, 1, 1], [111, 2, 1], [111, 2, 0], - [111, 2, 2], [112, 0, 0], [112, 0, 1], [112, 1, 0], [112, 1, 1], [112, 1, 2], - [122, 90, 3], [122, 90, 4], [122, 91, 3], [122, 91, 4], [123, 90, 3], [123, 90, 4], - [123, 91, 3], [123, 91, 4], [123, 92, 4], [123, 92, 3], [123, 92, 5], [124, 90, 3], - [124, 90, 4], [124, 91, 3], [124, 91, 4], [124, 91, 5], [187, 136, 0], [187, 136, 1], - [187, 137, 0], [187, 137, 1], [188, 136, 0], [188, 136, 1], [188, 137, 0], - [188, 137, 1], [188, 138, 1], [188, 138, 0], [188, 138, 2], [189, 136, 0], - [189, 136, 1], [189, 137, 0], [189, 137, 1], [189, 137, 2], [240, 190, 64], - [240, 190, 65], [240, 191, 64], [240, 191, 65], [241, 190, 64], [241, 190, 65], - [241, 191, 64], [241, 191, 65], [241, 192, 65], [241, 192, 64], [241, 192, 66], - [242, 190, 64], [242, 190, 65], [242, 191, 64], [242, 191, 65], [242, 191, 66], - [255, 255, 0], [255, 255, 1], [255, 254, 0], [255, 254, 1], [254, 255, 0], - [254, 255, 1], [254, 254, 0], [254, 254, 1], [254, 253, 1], [254, 253, 0], - [254, 253, 2], [253, 255, 0], [253, 255, 1], [253, 254, 0], [253, 254, 1], - [253, 254, 2], [0, 220, 0], [0, 220, 1], [0, 221, 0], [0, 221, 1], [1, 220, 0], - [1, 220, 1], [1, 221, 0], [1, 221, 1], [1, 222, 1], [1, 222, 0], [1, 222, 2], - [2, 220, 0], [2, 220, 1], [2, 221, 0], [2, 221, 1], [2, 221, 2], [0, 136, 0], - [0, 136, 1], [0, 137, 0], [0, 137, 1], [1, 136, 0], [1, 136, 1], [1, 137, 0], - [1, 137, 1], [1, 138, 1], [1, 138, 0], [1, 138, 2], [2, 136, 0], [2, 136, 1], - [2, 137, 0], [2, 137, 1], [2, 137, 2], [0, 80, 0], [0, 80, 1], [0, 81, 0], - [0, 81, 1], [1, 80, 0], [1, 80, 1], [1, 81, 0], [1, 81, 1], [1, 82, 1], [1, 82, 0], - [1, 82, 2], [2, 80, 0], [2, 80, 1], [2, 81, 0], [2, 81, 1], [2, 81, 2], [0, 136, 238], - [0, 136, 239], [0, 137, 238], [0, 137, 239], [1, 136, 238], [1, 136, 239], - [1, 137, 238], [1, 137, 239], [1, 138, 239], [1, 138, 238], [1, 138, 240], - [2, 136, 238], [2, 136, 239], [2, 137, 238], [2, 137, 239], [2, 137, 240], - [0, 0, 255], [0, 0, 254], [0, 1, 255], [0, 1, 254], [1, 0, 255], [1, 0, 254], - [1, 1, 255], [1, 1, 254], [1, 2, 254], [1, 2, 255], [1, 2, 253], [2, 0, 253], - [2, 0, 254], [2, 1, 253], [2, 1, 254], [2, 1, 255], [0, 0, 170], [0, 0, 171], - [0, 1, 170], [0, 1, 171], [1, 0, 170], [1, 0, 171], [1, 1, 170], [1, 1, 171], - [1, 2, 171], [1, 2, 170], [1, 2, 172], [2, 0, 170], [2, 0, 171], [2, 1, 170], - [2, 1, 171], [2, 1, 172], [0, 0, 100], [0, 0, 101], [0, 1, 100], [0, 1, 101], - [1, 0, 100], [1, 0, 101], [1, 1, 100], [1, 1, 101], [1, 2, 101], [1, 2, 100], - [1, 2, 102], [2, 0, 100], [2, 0, 101], [2, 1, 100], [2, 1, 101], [2, 1, 102], - [183, 15, 141], [183, 15, 142], [183, 16, 141], [183, 16, 142], [184, 15, 141], - [184, 15, 142], [184, 16, 141], [184, 16, 142], [184, 17, 142], [184, 17, 141], - [184, 17, 143], [185, 15, 141], [185, 15, 142], [185, 16, 141], [185, 16, 142], - [185, 16, 143], [102, 0, 119] - ], - values: [ - 0, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, - 850, 900, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500, - 1550, 1600, 1650, 1700, 1750, 1800, 1850, 1900, 1950, 2000, 2050, 2100, 2150, 2200, - 2250, 2300, 2350, 2400, 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, 2900, - 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, 3400, 3450, 3500, 3550, 3600, - 3650, 3700, 3750, 3800, 3850, 3900, 3950, 4000, 4050, 4100, 4150, 4200, 4250, 4300, - 4350, 4400, 4450, 4500, 4550, 4600, 4650, 4700, 4750, 4800, 4850, 4900, 4950, 5000, - 5050, 5100, 5150, 5200, 5250, 5300, 5350, 5400, 5450, 5500, 5550, 5600, 5650, 5700, - 5750, 5800, 5850, 5900, 5950, 6000, 6050, 6100, 6150, 6200, 6250, 6300, 6350, 6400, - 6450, 6500, 6550, 6600, 6650, 6700, 6750, 6800, 6850, 6900, 6950, 7000, 7050, 7100, - 7150, 7200, 7250, 7300, 7350, 7400, 7450, 7500, 7550, 7600, 7650, 7700, 7750, 7800, - 7850, 7900, 7950, 8000, 8050, 8100, 8150, 8200, 8250, 8300, 8350, 8400, 8450, 8500, - 8550, 8600, 8650, 8700, 8750, 8800, 8850, 8900, 8950, 9000, 9050, 9100, 9150, 9200, - 9250, 9300, 9350, 9400, 9450, 9500, 9550, 9600, 9650, 9700, 9750, 9800, 9850, 9900, - 9950, 10000, 10050, 10100, 10150, 10200, 10250, 10300, 10350, 10400, 10450, 10500, - 10550, 10600, 10650, 10700, 10750, 10800, 10850, 10900, 10950, 11000, 11050, 11100, - 11150, 11200, 11250, 11300, 11350, 11400, 11450, 11500, 11550, 11600, 11650, 11700, - 11750, 11800, 11850, 11900, 11950, 12000 - ], - } + - {colors: [[255, 0, 0], [255, 0, 0]], min_value: 0, max_value: 800} + - {colors: [[170, 0, 0], [170, 0, 0]], min_value: 800.0001, max_value: 1600} + - {colors: [[110, 0, 0], [110, 0, 0]], min_value: 1600.0001, max_value: 2350} + - {colors: [[112, 1, 2], [112, 1, 2]], min_value: 2350.0001, max_value: 3150} + - {colors: [[124, 91, 5], [124, 91, 5]], min_value: 3150.0001, max_value: 4000} + - {colors: [[240, 190, 64], [240, 190, 64]], min_value: 4000.0001, max_value: 4800} + - {colors: [[255, 255, 0], [255, 255, 0]], min_value: 4800.0001, max_value: 5600} + - {colors: [[0, 220, 0], [0, 220, 0]], min_value: 5600.0001, max_value: 6400} + - {colors: [[0, 136, 0], [0, 136, 0]], min_value: 6400.0001, max_value: 7200} + - {colors: [[0, 80, 0], [0, 80, 0]], min_value: 7200.0001, max_value: 8000} + - {colors: [[0, 136, 238], [0, 136, 238]], min_value: 8000.0001, max_value: 8800} + - {colors: [[0, 0, 255], [0, 0, 255]], min_value: 8800.0001, max_value: 9600} + - {colors: [[0, 0, 170], [0, 0, 170]], min_value: 9600.0001, max_value: 10400} + - {colors: [[0, 0, 100], [0, 0, 100]], min_value: 10400.0001, max_value: 11200} + - {colors: [[183,15,141], [183, 15, 141]], min_value: 11200.0001, max_value: 12000} + - {colors: [[102, 0, 119], [102, 0, 119]], min_value: 12000.0001, max_value: 18000} Clear_Sky_Confidence: - name: Clear_Sky_Confidence + standard_name: cldmsk_clear_sky_confidence operations: - name: colorize method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - { - colors: [ - [255, 247, 236], [254, 246, 233], [254, 244, 230], [254, 243, 228], [254, 242, 224], - [254, 241, 222], [254, 239, 219], [254, 239, 216], [254, 237, 213], [254, 236, 210], - [254, 235, 207], [254, 233, 204], [254, 232, 202], [253, 231, 198], [253, 230, 195], - [253, 228, 191], [253, 226, 189], [253, 225, 185], [253, 223, 181], [253, 221, 178], - [253, 220, 174], [253, 218, 172], [253, 216, 168], [253, 215, 165], [253, 213, 161], - [253, 211, 157], [253, 210, 156], [253, 207, 153], [253, 206, 152], [253, 203, 149], - [253, 202, 148], [253, 200, 145], [253, 198, 143], [253, 196, 141], [253, 193, 139], - [253, 192, 137], [253, 189, 134], [253, 188, 133], [252, 185, 130], [252, 182, 127], - [252, 177, 123], [252, 174, 120], [252, 170, 116], [252, 166, 112], [252, 163, 109], - [252, 159, 105], [252, 156, 103], [252, 151, 99], [252, 148, 96], [252, 144, 92], - [251, 140, 88], [250, 137, 87], [249, 134, 86], [248, 131, 85], [247, 127, 83], - [246, 125, 82], [245, 121, 80], [244, 119, 79], [243, 115, 78], [242, 111, 76], - [241, 109, 75], [240, 105, 73], [239, 102, 72], [237, 98, 69], [236, 94, 67], - [234, 89, 63], [232, 86, 60], [230, 81, 57], [227, 76, 53], [226, 73, 50], [224, 68, 46], - [222, 65, 44], [220, 60, 40], [218, 56, 37], [216, 51, 33], [214, 46, 30], [211, 43, 28], - [208, 39, 25], [206, 36, 23], [202, 31, 20], [200, 28, 18], [197, 24, 15], [194, 21, 13], - [191, 16, 10], [188, 12, 7], [185, 9, 5], [182, 4, 3], [180, 1, 1], [175, 0, 0], - [172, 0, 0], [167, 0, 0], [164, 0, 0], [159, 0, 0], [154, 0, 0], [151, 0, 0], - [146, 0, 0], [143, 0, 0], [138, 0, 0], [135, 0, 0], [130, 0, 0], [127, 0, 0] - ], - values: [ - 0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, - 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, - 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41, 0.42, - 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, - 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, - 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, - 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1 - ] + filename: clear_sky_confidence.txt } Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate: - name: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate + standard_name: aerdb_aerosol_optical_thickness_500_land_ocean operations: - name: colorize method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - { - colors: [ - [255, 252, 199], [255, 251, 193], [255, 250, 188], [255, 249, 183], [255, 248, 178], - [255, 247, 173], [255, 246, 167], [255, 245, 162], [255, 244, 157], [255, 243, 152], - [255, 242, 147], [255, 240, 144], [255, 239, 141], [255, 238, 138], [255, 236, 135], - [255, 235, 132], [255, 234, 129], [255, 232, 126], [255, 231, 123], [255, 230, 120], - [255, 229, 118], [255, 227, 115], [255, 226, 113], [255, 225, 110], [255, 223, 108], - [255, 222, 106], [255, 221, 103], [255, 219, 101], [255, 218, 98], [255, 217, 96], - [255, 216, 94], [255, 214, 91], [255, 212, 89], [255, 210, 87], [255, 208, 85], - [255, 207, 83], [255, 205, 80], [255, 203, 78], [255, 201, 76], [255, 199, 74], - [255, 198, 72], [255, 195, 70], [255, 193, 68], [255, 190, 66], [255, 188, 64], - [255, 185, 62], [255, 183, 60], [255, 180, 58], [255, 178, 56], [255, 175, 54], - [255, 173, 53], [255, 170, 51], [255, 168, 50], [255, 165, 49], [255, 163, 47], - [255, 161, 46], [255, 158, 45], [255, 156, 43], [255, 153, 42], [255, 151, 41], - [255, 149, 40], [255, 146, 39], [255, 144, 38], [255, 142, 37], [255, 140, 37], - [255, 138, 36], [255, 135, 35], [255, 133, 35], [255, 131, 34], [255, 129, 33], - [255, 127, 33], [255, 124, 32], [255, 121, 31], [255, 118, 31], [255, 115, 30], - [255, 112, 30], [255, 109, 29], [255, 106, 28], [255, 103, 28], [255, 100, 27], - [255, 98, 27], [255, 94, 26], [255, 91, 25], [255, 88, 24], [255, 85, 24], [255, 82, 23], - [255, 78, 22], [255, 75, 22], [255, 72, 21], [255, 69, 20], [255, 66, 20], [254, 63, 19], - [253, 60, 19], [252, 58, 18], [251, 55, 18], [250, 53, 18], [249, 50, 17], [248, 47, 17], - [247, 45, 16], [246, 42, 16], [245, 40, 16], [243, 38, 15], [242, 36, 15], [240, 34, 14], - [239, 32, 14], [238, 30, 13], [236, 28, 13], [235, 26, 12], [233, 24, 12], [232, 22, 11], - [231, 20, 11], [229, 18, 11], [227, 17, 11], [225, 16, 11], [223, 14, 11], [221, 13, 11], - [219, 12, 11], [217, 10, 11], [215, 9, 11], [213, 8, 11], [211, 7, 12], [208, 6, 12], - [206, 5, 12], [204, 4, 12], [201, 4, 12], [199, 3, 13], [197, 2, 13], [194, 2, 13], - [192, 1, 13], [190, 0, 13], [188, 0, 14], [184, 0, 14], [181, 0, 14], [178, 0, 14], - [174, 0, 14], [171, 0, 14], [168, 0, 14], [164, 0, 14], [161, 0, 14], [158, 0, 14], - [155, 0, 14], [152, 0, 14], [149, 0, 14], [146, 0, 14], [143, 0, 14], [140, 0, 14], - [137, 0, 14], [134, 0, 14], [131, 0, 14], [128, 0, 14], [125, 0, 14] - ], - values: [ - 0, 0.005, 0.01, 0.015, 0.02, 0.025, 0.03, 0.035, 0.04, 0.045, 0.05, 0.055, 0.06, - 0.065, 0.07, 0.075, 0.08, 0.085, 0.09, 0.095, 0.1, 0.105, 0.11, 0.115, 0.12, 0.125, - 0.13, 0.135, 0.14, 0.145, 0.15, 0.155, 0.16, 0.165, 0.17, 0.175, 0.18, 0.185, 0.19, - 0.195, 0.2, 0.205, 0.21, 0.215, 0.22, 0.225, 0.23, 0.235, 0.24, 0.245, 0.25, 0.255, - 0.26, 0.265, 0.27, 0.275, 0.28, 0.285, 0.29, 0.295, 0.3, 0.305, 0.31, 0.315, 0.32, - 0.325, 0.33, 0.335, 0.34, 0.345, 0.35, 0.355, 0.36, 0.365, 0.37, 0.375, 0.38, 0.385, - 0.39, 0.395, 0.4, 0.405, 0.41, 0.415, 0.42, 0.425, 0.43, 0.435, 0.44, 0.445, 0.45, - 0.455, 0.46, 0.465, 0.47, 0.475, 0.48, 0.485, 0.49, 0.495, 0.5, 0.505, 0.51, 0.515, - 0.52, 0.525, 0.53, 0.535, 0.54, 0.545, 0.55, 0.555, 0.56, 0.565, 0.57, 0.575, 0.58, - 0.585, 0.59, 0.595, 0.6, 0.605, 0.61, 0.615, 0.62, 0.625, 0.63, 0.635, 0.64, 0.645, - 0.65, 0.655, 0.66, 0.665, 0.67, 0.675, 0.68, 0.685, 0.69, 0.695, 0.7, 1.13, 1.56, - 1.99, 2.42, 2.85, 3.28, 3.71, 4.14, 4.57, 5 - ], + filename: aerosol_thickness.txt } Angstrom_Exponent_Land_Ocean_Best_Estimate: - name: Angstrom_Exponent_Land_Ocean_Best_Estimate + standard_name: aerdb_angstrom_exponent_land_ocean_best_estimate operations: - name: colorize method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - { - colors: [ - [122, 145, 2], [123, 148, 3], [124, 150, 4], [124, 153, 5], [125, 155, 6], - [126, 158, 7], [127, 160, 8], [127, 163, 9], [128, 165, 10], [129, 168, 11], - [130, 170, 12], [130, 173, 13], [131, 175, 14], [132, 178, 15], [133, 181, 16], - [132, 183, 18], [132, 185, 20], [132, 187, 22], [132, 189, 25], [132, 191, 27], - [132, 193, 29], [132, 195, 31], [131, 197, 34], [131, 199, 36], [131, 201, 38], - [131, 203, 40], [131, 205, 43], [131, 207, 45], [131, 209, 47], [131, 212, 50], - [130, 213, 51], [129, 215, 53], [128, 217, 55], [128, 219, 57], [127, 221, 59], - [126, 222, 61], [125, 224, 63], [125, 226, 64], [124, 228, 66], [123, 230, 68], - [122, 231, 70], [122, 233, 72], [121, 235, 74], [120, 237, 76], [120, 239, 78], - [119, 239, 79], [118, 240, 80], [117, 241, 82], [116, 242, 83], [116, 243, 85], - [115, 244, 86], [114, 245, 87], [113, 246, 89], [112, 247, 90], [112, 248, 92], - [111, 249, 93], [110, 250, 94], [109, 251, 96], [108, 252, 97], [108, 253, 99], - [107, 252, 100], [106, 252, 102], [106, 252, 103], [105, 251, 105], [105, 251, 106], - [104, 251, 108], [103, 251, 109], [103, 250, 111], [102, 250, 112], [102, 250, 114], - [101, 250, 115], [100, 249, 117], [100, 249, 118], [99, 249, 120], [99, 249, 122], - [98, 247, 123], [97, 246, 124], [96, 245, 126], [95, 244, 127], [94, 243, 128], - [93, 242, 130], [92, 241, 131], [92, 239, 132], [91, 238, 134], [90, 237, 135], - [89, 236, 136], [88, 235, 138], [87, 234, 139], [86, 233, 140], [86, 232, 142], - [85, 230, 143], [84, 229, 144], [83, 228, 145], [82, 226, 147], [81, 225, 148], - [80, 224, 149], [79, 223, 150], [78, 221, 152], [77, 220, 153], [76, 219, 154], - [75, 218, 155], [74, 216, 157], [73, 215, 158], [72, 214, 159], [72, 213, 161], - [71, 211, 162], [70, 209, 163], [69, 208, 164], [68, 206, 165], [67, 205, 166], - [66, 203, 167], [65, 201, 168], [64, 200, 170], [63, 198, 171], [62, 197, 172], - [61, 195, 173], [60, 193, 174], [59, 192, 175], [58, 190, 176], [58, 189, 178], - [58, 187, 178], [58, 185, 179], [58, 184, 180], [58, 182, 181], [58, 181, 182], - [58, 179, 183], [58, 178, 184], [59, 176, 184], [59, 175, 185], [59, 173, 186], - [59, 172, 187], [59, 170, 188], [59, 169, 189], [59, 167, 190], [60, 166, 191], - [60, 164, 191], [61, 162, 192], [61, 160, 193], [62, 158, 194], [63, 156, 195], - [63, 154, 195], [64, 152, 196], [64, 150, 197], [65, 148, 198], [66, 146, 199], - [66, 144, 199], [67, 142, 200], [67, 140, 201], [68, 138, 202], [69, 137, 203], - [69, 135, 203], [70, 133, 204], [70, 131, 205], [71, 129, 205], [72, 128, 206], - [72, 126, 207], [73, 124, 207], [73, 122, 208], [74, 120, 209], [75, 119, 209], - [75, 117, 210], [76, 115, 211], [76, 113, 211], [77, 111, 212], [78, 110, 213], - [78, 108, 213], [79, 106, 214], [80, 104, 214], [80, 102, 215], [81, 101, 216], - [82, 99, 216], [82, 97, 217], [83, 95, 217], [84, 93, 218], [84, 92, 219], - [85, 90, 219], [86, 88, 220], [86, 86, 220], [87, 84, 221], [88, 83, 222], - [88, 82, 222], [89, 81, 223], [90, 80, 223], [91, 80, 224], [92, 79, 224], - [93, 78, 225], [94, 77, 225], [95, 77, 226], [96, 76, 226], [97, 75, 227], - [98, 74, 227], [99, 74, 228], [100, 73, 228], [101, 72, 229], [102, 72, 230], - [104, 72, 230], [106, 73, 230], [108, 73, 230], [110, 74, 231], [112, 74, 231], - [114, 75, 231], [116, 75, 231], [118, 76, 232], [120, 76, 232], [122, 77, 232], - [124, 77, 232], [126, 78, 233], [128, 78, 233], [130, 79, 233], [133, 80, 234], - [135, 80, 234], [137, 80, 234], [139, 81, 234], [141, 81, 234], [143, 81, 234], - [145, 82, 234], [147, 82, 234], [149, 82, 234], [151, 83, 234], [153, 83, 234], - [155, 83, 234], [157, 84, 234], [159, 84, 234], [161, 84, 234], [164, 85, 235], - [165, 85, 235], [166, 85, 235], [168, 85, 235], [169, 85, 235], [171, 85, 235], - [172, 85, 235], [174, 85, 235], [175, 86, 235], [177, 86, 235], [178, 86, 235], - [180, 86, 235], [181, 86, 235], [183, 86, 235], [184, 86, 235], [186, 87, 235], - [187, 87, 234], [188, 87, 234], [190, 87, 234], [191, 88, 234], [193, 88, 234], - [194, 88, 234], [196, 88, 234], [197, 89, 234], [199, 89, 234], [200, 89, 234], [202, 89, 234] - ], - values: [ - 0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, - 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, - 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, - 0.38, 0.39, 0.4, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, - 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, - 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, - 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, - 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1, 1.01, 1.02, 1.03, - 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, - 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, - 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39, 1.4, 1.41, 1.42, 1.43, 1.44, 1.45, - 1.46, 1.47, 1.48, 1.49, 1.5, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59, - 1.6, 1.61, 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69, 1.7, 1.71, 1.72, 1.73, - 1.74, 1.75, 1.76, 1.77, 1.78, 1.79, 1.8, 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, - 1.88, 1.89, 1.9, 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98, 1.99, 2, 2.01, - 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 2.13, 2.14, 2.15, - 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, - 2.3, 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4, 2.41, 2.42, 2.43, - 2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5 - ], + filename: angstrom_exponent.txt } diff --git a/satpy/etc/readers/viirs_l2.yaml b/satpy/etc/readers/viirs_l2.yaml index b86a856e82..9df5df3597 100644 --- a/satpy/etc/readers/viirs_l2.yaml +++ b/satpy/etc/readers/viirs_l2.yaml @@ -7,7 +7,6 @@ reader: supports_fsspec: false reader: !!python/name:satpy.readers.yaml_reader.GEOFlippableFileYAMLReader sensors: [viirs] - default_datasets: file_types: cldprop_l2_viirs: @@ -22,9 +21,6 @@ file_types: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler file_patterns: - 'AERDB_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' - aerdb_l2_viirs_nrt: - file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler - file_patterns: - 'AERDB_L2_VIIRS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.nrt.nc' cldir_l2_viirs: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler @@ -57,14 +53,14 @@ datasets: aerdb_lon: name: aerdb_lon resolution: 1000 - file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] + file_type: [aerdb_l2_viirs] file_key: Longitude units: degrees standard_name: longitude aerdb_lat: name: aerdb_lat resolution: 1000 - file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] + file_type: [aerdb_l2_viirs] file_key: Latitude units: degrees standard_name: latitude @@ -93,7 +89,7 @@ datasets: coordinates: [cld_lon, cld_lat] file_key: geophysical_data/Clear_Sky_Confidence file_type: cldmsk_l2_viirs - + standard_name: cldmsk_clear_sky_confidence ################################### # Datasets in file cldprop_l2_viirs @@ -105,9 +101,10 @@ datasets: coordinates: [cld_lon,cld_lat] file_key: geophysical_data/Cloud_Top_Height file_type: cldprop_l2_viirs + standard_name: cldprop_cloud_top_height ########################################## -# Datasets in files aerdb_l2_viirs and nrt +# Datasets in files aerdb_l2_viirs ########################################## Angstrom_Exponent_Land_Ocean_Best_Estimate: name: Angstrom_Exponent_Land_Ocean_Best_Estimate @@ -115,7 +112,8 @@ datasets: units: "1" coordinates: [aerdb_lon,aerdb_lat] file_key: Angstrom_Exponent_Land_Ocean_Best_Estimate - file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] + file_type: [aerdb_l2_viirs] + standard_name: aerdb_angstrom_exponent_land_ocean_best_estimate Aerosol_Optical_Thickness_550_Land_Ocean: name: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate @@ -123,4 +121,5 @@ datasets: units: "1" coordinates: [aerdb_lon,aerdb_lat] file_key: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate - file_type: [aerdb_l2_viirs, aerdb_l2_viirs_nrt] + file_type: [aerdb_l2_viirs] + standard_name: aerdb_aerosol_optical_thickness_500_land_ocean diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index 4dc5c8beee..9277620320 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -121,18 +121,7 @@ def adjust_scaling_factors(self, factors, file_units, output_units): LOG.debug("File units and output units are the same (%s)", file_units) return factors factors = np.array(factors) - - if file_units == "1" and output_units == "%": - LOG.debug( - "Adjusting scaling factors to convert '%s' to '%s'", - file_units, - output_units, - ) - factors[::2] = np.where(factors[::2] != -999, factors[::2] * 100.0, -999) - factors[1::2] = np.where(factors[1::2] != -999, factors[1::2] * 100.0, -999) - return factors - else: - return factors + return factors def available_datasets(self, configured_datasets=None): """Generate dataset info and their availablity. @@ -147,12 +136,11 @@ def available_datasets(self, configured_datasets=None): yield is_avail, ds_info continue ft_matches = self.file_type_matches(ds_info["file_type"]) - if not ft_matches: - is_in_file = None - else: - var_path = ds_info.get("file_key", ds_info["name"]) - is_in_file = var_path in self - yield ft_matches and is_in_file, ds_info + if ft_matches is None: + yield None, ds_info + continue + var_path = ds_info.get("file_key", ds_info["name"]) + yield var_path in self, ds_info def get_dataset(self, ds_id, ds_info): """Get DataArray for specified dataset.""" diff --git a/satpy/tests/reader_tests/test_viirs_l2.py b/satpy/tests/reader_tests/test_viirs_l2.py index cf57e54a70..79884f3d4f 100644 --- a/satpy/tests/reader_tests/test_viirs_l2.py +++ b/satpy/tests/reader_tests/test_viirs_l2.py @@ -110,14 +110,16 @@ def test_init(self, filename): @pytest.mark.parametrize( ("filename", "datasets"), [ - pytest.param("CLDPROP_L2_VIIRS_SNPP.A2023364.2230.011.2023365115856.nc",["Cloud_Top_Height"],id="CLDPROP"), - pytest.param("CLDMSK_L2_VIIRS_SNPP.A2023364.2230.001.2023365105952.nc",["Clear_Sky_Confidence"],id="CLDMSK"), + pytest.param("CLDPROP_L2_VIIRS_SNPP.A2023364.2230.011.2023365115856.nc", + ["Cloud_Top_Height"], id="CLDPROP"), + pytest.param("CLDMSK_L2_VIIRS_SNPP.A2023364.2230.001.2023365105952.nc", + ["Clear_Sky_Confidence"], id="CLDMSK"), pytest.param("AERDB_L2_VIIRS_SNPP.A2023364.2230.011.2023365113427.nc", ["Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate", - "Angstrom_Exponent_Land_Ocean_Best_Estimate"],id="AERDB"), + "Angstrom_Exponent_Land_Ocean_Best_Estimate"], id="AERDB"), ], ) - def test_load_l2_files(self,filename,datasets): + def test_load_l2_files(self, filename, datasets): """Test L2 File Loading.""" r = load_reader(self.reader_configs) loadables = r.select_files_from_pathnames([filename]) From 9d5665c00f5cea2eb0d0d9c4acb72bf1dda3e640 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Fri, 9 Feb 2024 12:35:45 +0200 Subject: [PATCH 183/481] Clarify combine_metadata() docstring --- satpy/dataset/metadata.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 3f1de02ed5..087e86f6c9 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -32,12 +32,14 @@ def combine_metadata(*metadata_objects): If the values corresponding to any keys are not equal or do not exist in all provided dictionaries then they are not included in - the returned dictionary. All values of the keys containing the substring - 'start_time' will be set to the earliest value and similarly for 'end_time' - to latest time. All other keys containing the word 'time' are averaged. - Before these adjustments, non-datetime objects are filtered out. - - The same rules are applied to 'time_parameters' dictionary. + the returned dictionary. + + All values of the keys containing the substring 'start_time' will be set + to the earliest value and similarly for 'end_time' to latest time. All + other keys containing the word 'time' are averaged. Before these adjustments, + `None` values resulting from data that don't have times associated to them + are removed. These rules are applied also to values in 'time_parameters' + dictionary. In the interest of processing time, lazy arrays are compared by object identity rather than by their contents. From 83f6bc8f9ee544876c24783ef59034aaaef2c17c Mon Sep 17 00:00:00 2001 From: David Hoese Date: Fri, 9 Feb 2024 12:44:46 -0600 Subject: [PATCH 184/481] Update satpy/dataset/metadata.py --- satpy/dataset/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 087e86f6c9..bc99d3cb21 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -38,7 +38,7 @@ def combine_metadata(*metadata_objects): to the earliest value and similarly for 'end_time' to latest time. All other keys containing the word 'time' are averaged. Before these adjustments, `None` values resulting from data that don't have times associated to them - are removed. These rules are applied also to values in 'time_parameters' + are removed. These rules are applied also to values in the 'time_parameters' dictionary. In the interest of processing time, lazy arrays are compared by object From 12b8725930170e7984b21d56486ad18e42cb315f Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Fri, 9 Feb 2024 19:40:27 +0000 Subject: [PATCH 185/481] reverted cth colormap, changed from txt to csv --- ...ol_thickness.txt => aerosol_thickness.csv} | 302 +++++------ ...rom_exponent.txt => angstrom_exponent.csv} | 502 +++++++++--------- ...onfidence.txt => clear_sky_confidence.csv} | 202 +++---- satpy/etc/enhancements/generic.yaml | 28 +- 4 files changed, 512 insertions(+), 522 deletions(-) rename satpy/etc/colormaps/{aerosol_thickness.txt => aerosol_thickness.csv} (94%) rename satpy/etc/colormaps/{angstrom_exponent.txt => angstrom_exponent.csv} (94%) rename satpy/etc/colormaps/{clear_sky_confidence.txt => clear_sky_confidence.csv} (94%) diff --git a/satpy/etc/colormaps/aerosol_thickness.txt b/satpy/etc/colormaps/aerosol_thickness.csv similarity index 94% rename from satpy/etc/colormaps/aerosol_thickness.txt rename to satpy/etc/colormaps/aerosol_thickness.csv index e1e6a02f45..39d8527f6c 100644 --- a/satpy/etc/colormaps/aerosol_thickness.txt +++ b/satpy/etc/colormaps/aerosol_thickness.csv @@ -1,151 +1,151 @@ -0, 255, 252, 199 -0.005, 255, 251, 193 -0.01, 255, 250, 188 -0.015, 255, 249, 183 -0.02, 255, 248, 178 -0.025, 255, 247, 173 -0.03, 255, 246, 167 -0.035, 255, 245, 162 -0.04, 255, 244, 157 -0.045, 255, 243, 152 -0.05, 255, 242, 147 -0.055, 255, 240, 144 -0.06, 255, 239, 141 -0.065, 255, 238, 138 -0.07, 255, 236, 135 -0.075, 255, 235, 132 -0.08, 255, 234, 129 -0.085, 255, 232, 126 -0.09, 255, 231, 123 -0.095, 255, 230, 120 -0.1, 255, 229, 118 -0.105, 255, 227, 115 -0.11, 255, 226, 113 -0.115, 255, 225, 110 -0.12, 255, 223, 108 -0.125, 255, 222, 106 -0.13, 255, 221, 103 -0.135, 255, 219, 101 -0.14, 255, 218, 98 -0.145, 255, 217, 96 -0.15, 255, 216, 94 -0.155, 255, 214, 91 -0.16, 255, 212, 89 -0.165, 255, 210, 87 -0.17, 255, 208, 85 -0.175, 255, 207, 83 -0.18, 255, 205, 80 -0.185, 255, 203, 78 -0.19, 255, 201, 76 -0.195, 255, 199, 74 -0.2, 255, 198, 72 -0.205, 255, 195, 70 -0.21, 255, 193, 68 -0.215, 255, 190, 66 -0.22, 255, 188, 64 -0.225, 255, 185, 62 -0.23, 255, 183, 60 -0.235, 255, 180, 58 -0.24, 255, 178, 56 -0.245, 255, 175, 54 -0.25, 255, 173, 53 -0.255, 255, 170, 51 -0.26, 255, 168, 50 -0.265, 255, 165, 49 -0.27, 255, 163, 47 -0.275, 255, 161, 46 -0.28, 255, 158, 45 -0.285, 255, 156, 43 -0.29, 255, 153, 42 -0.295, 255, 151, 41 -0.3, 255, 149, 40 -0.305, 255, 146, 39 -0.31, 255, 144, 38 -0.315, 255, 142, 37 -0.32, 255, 140, 37 -0.325, 255, 138, 36 -0.33, 255, 135, 35 -0.335, 255, 133, 35 -0.34, 255, 131, 34 -0.345, 255, 129, 33 -0.35, 255, 127, 33 -0.355, 255, 124, 32 -0.36, 255, 121, 31 -0.365, 255, 118, 31 -0.37, 255, 115, 30 -0.375, 255, 112, 30 -0.38, 255, 109, 29 -0.385, 255, 106, 28 -0.39, 255, 103, 28 -0.395, 255, 100, 27 -0.4, 255, 98, 27 -0.405, 255, 94, 26 -0.41, 255, 91, 25 -0.415, 255, 88, 24 -0.42, 255, 85, 24 -0.425, 255, 82, 23 -0.43, 255, 78, 22 -0.435, 255, 75, 22 -0.44, 255, 72, 21 -0.445, 255, 69, 20 -0.45, 255, 66, 20 -0.455, 254, 63, 19 -0.46, 253, 60, 19 -0.465, 252, 58, 18 -0.47, 251, 55, 18 -0.475, 250, 53, 18 -0.48, 249, 50, 17 -0.485, 248, 47, 17 -0.49, 247, 45, 16 -0.495, 246, 42, 16 -0.5, 245, 40, 16 -0.505, 243, 38, 15 -0.51, 242, 36, 15 -0.515, 240, 34, 14 -0.52, 239, 32, 14 -0.525, 238, 30, 13 -0.53, 236, 28, 13 -0.535, 235, 26, 12 -0.54, 233, 24, 12 -0.545, 232, 22, 11 -0.55, 231, 20, 11 -0.555, 229, 18, 11 -0.56, 227, 17, 11 -0.565, 225, 16, 11 -0.57, 223, 14, 11 -0.575, 221, 13, 11 -0.58, 219, 12, 11 -0.585, 217, 10, 11 -0.59, 215, 9, 11 -0.595, 213, 8, 11 -0.6, 211, 7, 12 -0.605, 208, 6, 12 -0.61, 206, 5, 12 -0.615, 204, 4, 12 -0.62, 201, 4, 12 -0.625, 199, 3, 13 -0.63, 197, 2, 13 -0.635, 194, 2, 13 -0.64, 192, 1, 13 -0.645, 190, 0, 13 -0.65, 188, 0, 14 -0.655, 184, 0, 14 -0.66, 181, 0, 14 -0.665, 178, 0, 14 -0.67, 174, 0, 14 -0.675, 171, 0, 14 -0.68, 168, 0, 14 -0.685, 164, 0, 14 -0.69, 161, 0, 14 -0.695, 158, 0, 14 -0.7, 155, 0, 14 -1.13, 152, 0, 14 -1.56, 149, 0, 14 -1.99, 146, 0, 14 -2.42, 143, 0, 14 -2.85, 140, 0, 14 -3.28, 137, 0, 14 -3.71, 134, 0, 14 -4.14, 131, 0, 14 -4.57, 128, 0, 14 -5, 125, 0, 14 +0, 255, 252, 199 +0.005, 255, 251, 193 +0.01, 255, 250, 188 +0.015, 255, 249, 183 +0.02, 255, 248, 178 +0.025, 255, 247, 173 +0.03, 255, 246, 167 +0.035, 255, 245, 162 +0.04, 255, 244, 157 +0.045, 255, 243, 152 +0.05, 255, 242, 147 +0.055, 255, 240, 144 +0.06, 255, 239, 141 +0.065, 255, 238, 138 +0.07, 255, 236, 135 +0.075, 255, 235, 132 +0.08, 255, 234, 129 +0.085, 255, 232, 126 +0.09, 255, 231, 123 +0.095, 255, 230, 120 +0.1, 255, 229, 118 +0.105, 255, 227, 115 +0.11, 255, 226, 113 +0.115, 255, 225, 110 +0.12, 255, 223, 108 +0.125, 255, 222, 106 +0.13, 255, 221, 103 +0.135, 255, 219, 101 +0.14, 255, 218, 98 +0.145, 255, 217, 96 +0.15, 255, 216, 94 +0.155, 255, 214, 91 +0.16, 255, 212, 89 +0.165, 255, 210, 87 +0.17, 255, 208, 85 +0.175, 255, 207, 83 +0.18, 255, 205, 80 +0.185, 255, 203, 78 +0.19, 255, 201, 76 +0.195, 255, 199, 74 +0.2, 255, 198, 72 +0.205, 255, 195, 70 +0.21, 255, 193, 68 +0.215, 255, 190, 66 +0.22, 255, 188, 64 +0.225, 255, 185, 62 +0.23, 255, 183, 60 +0.235, 255, 180, 58 +0.24, 255, 178, 56 +0.245, 255, 175, 54 +0.25, 255, 173, 53 +0.255, 255, 170, 51 +0.26, 255, 168, 50 +0.265, 255, 165, 49 +0.27, 255, 163, 47 +0.275, 255, 161, 46 +0.28, 255, 158, 45 +0.285, 255, 156, 43 +0.29, 255, 153, 42 +0.295, 255, 151, 41 +0.3, 255, 149, 40 +0.305, 255, 146, 39 +0.31, 255, 144, 38 +0.315, 255, 142, 37 +0.32, 255, 140, 37 +0.325, 255, 138, 36 +0.33, 255, 135, 35 +0.335, 255, 133, 35 +0.34, 255, 131, 34 +0.345, 255, 129, 33 +0.35, 255, 127, 33 +0.355, 255, 124, 32 +0.36, 255, 121, 31 +0.365, 255, 118, 31 +0.37, 255, 115, 30 +0.375, 255, 112, 30 +0.38, 255, 109, 29 +0.385, 255, 106, 28 +0.39, 255, 103, 28 +0.395, 255, 100, 27 +0.4, 255, 98, 27 +0.405, 255, 94, 26 +0.41, 255, 91, 25 +0.415, 255, 88, 24 +0.42, 255, 85, 24 +0.425, 255, 82, 23 +0.43, 255, 78, 22 +0.435, 255, 75, 22 +0.44, 255, 72, 21 +0.445, 255, 69, 20 +0.45, 255, 66, 20 +0.455, 254, 63, 19 +0.46, 253, 60, 19 +0.465, 252, 58, 18 +0.47, 251, 55, 18 +0.475, 250, 53, 18 +0.48, 249, 50, 17 +0.485, 248, 47, 17 +0.49, 247, 45, 16 +0.495, 246, 42, 16 +0.5, 245, 40, 16 +0.505, 243, 38, 15 +0.51, 242, 36, 15 +0.515, 240, 34, 14 +0.52, 239, 32, 14 +0.525, 238, 30, 13 +0.53, 236, 28, 13 +0.535, 235, 26, 12 +0.54, 233, 24, 12 +0.545, 232, 22, 11 +0.55, 231, 20, 11 +0.555, 229, 18, 11 +0.56, 227, 17, 11 +0.565, 225, 16, 11 +0.57, 223, 14, 11 +0.575, 221, 13, 11 +0.58, 219, 12, 11 +0.585, 217, 10, 11 +0.59, 215, 9, 11 +0.595, 213, 8, 11 +0.6, 211, 7, 12 +0.605, 208, 6, 12 +0.61, 206, 5, 12 +0.615, 204, 4, 12 +0.62, 201, 4, 12 +0.625, 199, 3, 13 +0.63, 197, 2, 13 +0.635, 194, 2, 13 +0.64, 192, 1, 13 +0.645, 190, 0, 13 +0.65, 188, 0, 14 +0.655, 184, 0, 14 +0.66, 181, 0, 14 +0.665, 178, 0, 14 +0.67, 174, 0, 14 +0.675, 171, 0, 14 +0.68, 168, 0, 14 +0.685, 164, 0, 14 +0.69, 161, 0, 14 +0.695, 158, 0, 14 +0.7, 155, 0, 14 +1.13, 152, 0, 14 +1.56, 149, 0, 14 +1.99, 146, 0, 14 +2.42, 143, 0, 14 +2.85, 140, 0, 14 +3.28, 137, 0, 14 +3.71, 134, 0, 14 +4.14, 131, 0, 14 +4.57, 128, 0, 14 +5, 125, 0, 14 diff --git a/satpy/etc/colormaps/angstrom_exponent.txt b/satpy/etc/colormaps/angstrom_exponent.csv similarity index 94% rename from satpy/etc/colormaps/angstrom_exponent.txt rename to satpy/etc/colormaps/angstrom_exponent.csv index 4e56fccd68..a14ecd17d4 100644 --- a/satpy/etc/colormaps/angstrom_exponent.txt +++ b/satpy/etc/colormaps/angstrom_exponent.csv @@ -1,251 +1,251 @@ -0, 122, 145, 2 -0.01, 123, 148, 3 -0.02, 124, 150, 4 -0.03, 124, 153, 5 -0.04, 125, 155, 6 -0.05, 126, 158, 7 -0.06, 127, 160, 8 -0.07, 127, 163, 9 -0.08, 128, 165, 10 -0.09, 129, 168, 11 -0.1, 130, 170, 12 -0.11, 130, 173, 13 -0.12, 131, 175, 14 -0.13, 132, 178, 15 -0.14, 133, 181, 16 -0.15, 132, 183, 18 -0.16, 132, 185, 20 -0.17, 132, 187, 22 -0.18, 132, 189, 25 -0.19, 132, 191, 27 -0.2, 132, 193, 29 -0.21, 132, 195, 31 -0.22, 131, 197, 34 -0.23, 131, 199, 36 -0.24, 131, 201, 38 -0.25, 131, 203, 40 -0.26, 131, 205, 43 -0.27, 131, 207, 45 -0.28, 131, 209, 47 -0.29, 131, 212, 50 -0.3, 130, 213, 51 -0.31, 129, 215, 53 -0.32, 128, 217, 55 -0.33, 128, 219, 57 -0.34, 127, 221, 59 -0.35, 126, 222, 61 -0.36, 125, 224, 63 -0.37, 125, 226, 64 -0.38, 124, 228, 66 -0.39, 123, 230, 68 -0.4, 122, 231, 70 -0.41, 122, 233, 72 -0.42, 121, 235, 74 -0.43, 120, 237, 76 -0.44, 120, 239, 78 -0.45, 119, 239, 79 -0.46, 118, 240, 80 -0.47, 117, 241, 82 -0.48, 116, 242, 83 -0.49, 116, 243, 85 -0.5, 115, 244, 86 -0.51, 114, 245, 87 -0.52, 113, 246, 89 -0.53, 112, 247, 90 -0.54, 112, 248, 92 -0.55, 111, 249, 93 -0.56, 110, 250, 94 -0.57, 109, 251, 96 -0.58, 108, 252, 97 -0.59, 108, 253, 99 -0.6, 107, 252, 100 -0.61, 106, 252, 102 -0.62, 106, 252, 103 -0.63, 105, 251, 105 -0.64, 105, 251, 106 -0.65, 104, 251, 108 -0.66, 103, 251, 109 -0.67, 103, 250, 111 -0.68, 102, 250, 112 -0.69, 102, 250, 114 -0.7, 101, 250, 115 -0.71, 100, 249, 117 -0.72, 100, 249, 118 -0.73, 99, 249, 120 -0.74, 99, 249, 122 -0.75, 98, 247, 123 -0.76, 97, 246, 124 -0.77, 96, 245, 126 -0.78, 95, 244, 127 -0.79, 94, 243, 128 -0.8, 93, 242, 130 -0.81, 92, 241, 131 -0.82, 92, 239, 132 -0.83, 91, 238, 134 -0.84, 90, 237, 135 -0.85, 89, 236, 136 -0.86, 88, 235, 138 -0.87, 87, 234, 139 -0.88, 86, 233, 140 -0.89, 86, 232, 142 -0.9, 85, 230, 143 -0.91, 84, 229, 144 -0.92, 83, 228, 145 -0.93, 82, 226, 147 -0.94, 81, 225, 148 -0.95, 80, 224, 149 -0.96, 79, 223, 150 -0.97, 78, 221, 152 -0.98, 77, 220, 153 -0.99, 76, 219, 154 -1, 75, 218, 155 -1.01, 74, 216, 157 -1.02, 73, 215, 158 -1.03, 72, 214, 159 -1.04, 72, 213, 161 -1.05, 71, 211, 162 -1.06, 70, 209, 163 -1.07, 69, 208, 164 -1.08, 68, 206, 165 -1.09, 67, 205, 166 -1.1, 66, 203, 167 -1.11, 65, 201, 168 -1.12, 64, 200, 170 -1.13, 63, 198, 171 -1.14, 62, 197, 172 -1.15, 61, 195, 173 -1.16, 60, 193, 174 -1.17, 59, 192, 175 -1.18, 58, 190, 176 -1.19, 58, 189, 178 -1.2, 58, 187, 178 -1.21, 58, 185, 179 -1.22, 58, 184, 180 -1.23, 58, 182, 181 -1.24, 58, 181, 182 -1.25, 58, 179, 183 -1.26, 58, 178, 184 -1.27, 59, 176, 184 -1.28, 59, 175, 185 -1.29, 59, 173, 186 -1.3, 59, 172, 187 -1.31, 59, 170, 188 -1.32, 59, 169, 189 -1.33, 59, 167, 190 -1.34, 60, 166, 191 -1.35, 60, 164, 191 -1.36, 61, 162, 192 -1.37, 61, 160, 193 -1.38, 62, 158, 194 -1.39, 63, 156, 195 -1.4, 63, 154, 195 -1.41, 64, 152, 196 -1.42, 64, 150, 197 -1.43, 65, 148, 198 -1.44, 66, 146, 199 -1.45, 66, 144, 199 -1.46, 67, 142, 200 -1.47, 67, 140, 201 -1.48, 68, 138, 202 -1.49, 69, 137, 203 -1.5, 69, 135, 203 -1.51, 70, 133, 204 -1.52, 70, 131, 205 -1.53, 71, 129, 205 -1.54, 72, 128, 206 -1.55, 72, 126, 207 -1.56, 73, 124, 207 -1.57, 73, 122, 208 -1.58, 74, 120, 209 -1.59, 75, 119, 209 -1.6, 75, 117, 210 -1.61, 76, 115, 211 -1.62, 76, 113, 211 -1.63, 77, 111, 212 -1.64, 78, 110, 213 -1.65, 78, 108, 213 -1.66, 79, 106, 214 -1.67, 80, 104, 214 -1.68, 80, 102, 215 -1.69, 81, 101, 216 -1.7, 82, 99, 216 -1.71, 82, 97, 217 -1.72, 83, 95, 217 -1.73, 84, 93, 218 -1.74, 84, 92, 219 -1.75, 85, 90, 219 -1.76, 86, 88, 220 -1.77, 86, 86, 220 -1.78, 87, 84, 221 -1.79, 88, 83, 222 -1.8, 88, 82, 222 -1.81, 89, 81, 223 -1.82, 90, 80, 223 -1.83, 91, 80, 224 -1.84, 92, 79, 224 -1.85, 93, 78, 225 -1.86, 94, 77, 225 -1.87, 95, 77, 226 -1.88, 96, 76, 226 -1.89, 97, 75, 227 -1.9, 98, 74, 227 -1.91, 99, 74, 228 -1.92, 100, 73, 228 -1.93, 101, 72, 229 -1.94, 102, 72, 230 -1.95, 104, 72, 230 -1.96, 106, 73, 230 -1.97, 108, 73, 230 -1.98, 110, 74, 231 -1.99, 112, 74, 231 -2, 114, 75, 231 -2.01, 116, 75, 231 -2.02, 118, 76, 232 -2.03, 120, 76, 232 -2.04, 122, 77, 232 -2.05, 124, 77, 232 -2.06, 126, 78, 233 -2.07, 128, 78, 233 -2.08, 130, 79, 233 -2.09, 133, 80, 234 -2.1, 135, 80, 234 -2.11, 137, 80, 234 -2.12, 139, 81, 234 -2.13, 141, 81, 234 -2.14, 143, 81, 234 -2.15, 145, 82, 234 -2.16, 147, 82, 234 -2.17, 149, 82, 234 -2.18, 151, 83, 234 -2.19, 153, 83, 234 -2.2, 155, 83, 234 -2.21, 157, 84, 234 -2.22, 159, 84, 234 -2.23, 161, 84, 234 -2.24, 164, 85, 235 -2.25, 165, 85, 235 -2.26, 166, 85, 235 -2.27, 168, 85, 235 -2.28, 169, 85, 235 -2.29, 171, 85, 235 -2.3, 172, 85, 235 -2.31, 174, 85, 235 -2.32, 175, 86, 235 -2.33, 177, 86, 235 -2.34, 178, 86, 235 -2.35, 180, 86, 235 -2.36, 181, 86, 235 -2.37, 183, 86, 235 -2.38, 184, 86, 235 -2.39, 186, 87, 235 -2.4, 187, 87, 234 -2.41, 188, 87, 234 -2.42, 190, 87, 234 -2.43, 191, 88, 234 -2.44, 193, 88, 234 -2.45, 194, 88, 234 -2.46, 196, 88, 234 -2.47, 197, 89, 234 -2.48, 199, 89, 234 -2.49, 200, 89, 234 -2.5, 202, 89, 234 +0, 122, 145, 2 +0.01, 123, 148, 3 +0.02, 124, 150, 4 +0.03, 124, 153, 5 +0.04, 125, 155, 6 +0.05, 126, 158, 7 +0.06, 127, 160, 8 +0.07, 127, 163, 9 +0.08, 128, 165, 10 +0.09, 129, 168, 11 +0.1, 130, 170, 12 +0.11, 130, 173, 13 +0.12, 131, 175, 14 +0.13, 132, 178, 15 +0.14, 133, 181, 16 +0.15, 132, 183, 18 +0.16, 132, 185, 20 +0.17, 132, 187, 22 +0.18, 132, 189, 25 +0.19, 132, 191, 27 +0.2, 132, 193, 29 +0.21, 132, 195, 31 +0.22, 131, 197, 34 +0.23, 131, 199, 36 +0.24, 131, 201, 38 +0.25, 131, 203, 40 +0.26, 131, 205, 43 +0.27, 131, 207, 45 +0.28, 131, 209, 47 +0.29, 131, 212, 50 +0.3, 130, 213, 51 +0.31, 129, 215, 53 +0.32, 128, 217, 55 +0.33, 128, 219, 57 +0.34, 127, 221, 59 +0.35, 126, 222, 61 +0.36, 125, 224, 63 +0.37, 125, 226, 64 +0.38, 124, 228, 66 +0.39, 123, 230, 68 +0.4, 122, 231, 70 +0.41, 122, 233, 72 +0.42, 121, 235, 74 +0.43, 120, 237, 76 +0.44, 120, 239, 78 +0.45, 119, 239, 79 +0.46, 118, 240, 80 +0.47, 117, 241, 82 +0.48, 116, 242, 83 +0.49, 116, 243, 85 +0.5, 115, 244, 86 +0.51, 114, 245, 87 +0.52, 113, 246, 89 +0.53, 112, 247, 90 +0.54, 112, 248, 92 +0.55, 111, 249, 93 +0.56, 110, 250, 94 +0.57, 109, 251, 96 +0.58, 108, 252, 97 +0.59, 108, 253, 99 +0.6, 107, 252, 100 +0.61, 106, 252, 102 +0.62, 106, 252, 103 +0.63, 105, 251, 105 +0.64, 105, 251, 106 +0.65, 104, 251, 108 +0.66, 103, 251, 109 +0.67, 103, 250, 111 +0.68, 102, 250, 112 +0.69, 102, 250, 114 +0.7, 101, 250, 115 +0.71, 100, 249, 117 +0.72, 100, 249, 118 +0.73, 99, 249, 120 +0.74, 99, 249, 122 +0.75, 98, 247, 123 +0.76, 97, 246, 124 +0.77, 96, 245, 126 +0.78, 95, 244, 127 +0.79, 94, 243, 128 +0.8, 93, 242, 130 +0.81, 92, 241, 131 +0.82, 92, 239, 132 +0.83, 91, 238, 134 +0.84, 90, 237, 135 +0.85, 89, 236, 136 +0.86, 88, 235, 138 +0.87, 87, 234, 139 +0.88, 86, 233, 140 +0.89, 86, 232, 142 +0.9, 85, 230, 143 +0.91, 84, 229, 144 +0.92, 83, 228, 145 +0.93, 82, 226, 147 +0.94, 81, 225, 148 +0.95, 80, 224, 149 +0.96, 79, 223, 150 +0.97, 78, 221, 152 +0.98, 77, 220, 153 +0.99, 76, 219, 154 +1, 75, 218, 155 +1.01, 74, 216, 157 +1.02, 73, 215, 158 +1.03, 72, 214, 159 +1.04, 72, 213, 161 +1.05, 71, 211, 162 +1.06, 70, 209, 163 +1.07, 69, 208, 164 +1.08, 68, 206, 165 +1.09, 67, 205, 166 +1.1, 66, 203, 167 +1.11, 65, 201, 168 +1.12, 64, 200, 170 +1.13, 63, 198, 171 +1.14, 62, 197, 172 +1.15, 61, 195, 173 +1.16, 60, 193, 174 +1.17, 59, 192, 175 +1.18, 58, 190, 176 +1.19, 58, 189, 178 +1.2, 58, 187, 178 +1.21, 58, 185, 179 +1.22, 58, 184, 180 +1.23, 58, 182, 181 +1.24, 58, 181, 182 +1.25, 58, 179, 183 +1.26, 58, 178, 184 +1.27, 59, 176, 184 +1.28, 59, 175, 185 +1.29, 59, 173, 186 +1.3, 59, 172, 187 +1.31, 59, 170, 188 +1.32, 59, 169, 189 +1.33, 59, 167, 190 +1.34, 60, 166, 191 +1.35, 60, 164, 191 +1.36, 61, 162, 192 +1.37, 61, 160, 193 +1.38, 62, 158, 194 +1.39, 63, 156, 195 +1.4, 63, 154, 195 +1.41, 64, 152, 196 +1.42, 64, 150, 197 +1.43, 65, 148, 198 +1.44, 66, 146, 199 +1.45, 66, 144, 199 +1.46, 67, 142, 200 +1.47, 67, 140, 201 +1.48, 68, 138, 202 +1.49, 69, 137, 203 +1.5, 69, 135, 203 +1.51, 70, 133, 204 +1.52, 70, 131, 205 +1.53, 71, 129, 205 +1.54, 72, 128, 206 +1.55, 72, 126, 207 +1.56, 73, 124, 207 +1.57, 73, 122, 208 +1.58, 74, 120, 209 +1.59, 75, 119, 209 +1.6, 75, 117, 210 +1.61, 76, 115, 211 +1.62, 76, 113, 211 +1.63, 77, 111, 212 +1.64, 78, 110, 213 +1.65, 78, 108, 213 +1.66, 79, 106, 214 +1.67, 80, 104, 214 +1.68, 80, 102, 215 +1.69, 81, 101, 216 +1.7, 82, 99, 216 +1.71, 82, 97, 217 +1.72, 83, 95, 217 +1.73, 84, 93, 218 +1.74, 84, 92, 219 +1.75, 85, 90, 219 +1.76, 86, 88, 220 +1.77, 86, 86, 220 +1.78, 87, 84, 221 +1.79, 88, 83, 222 +1.8, 88, 82, 222 +1.81, 89, 81, 223 +1.82, 90, 80, 223 +1.83, 91, 80, 224 +1.84, 92, 79, 224 +1.85, 93, 78, 225 +1.86, 94, 77, 225 +1.87, 95, 77, 226 +1.88, 96, 76, 226 +1.89, 97, 75, 227 +1.9, 98, 74, 227 +1.91, 99, 74, 228 +1.92, 100, 73, 228 +1.93, 101, 72, 229 +1.94, 102, 72, 230 +1.95, 104, 72, 230 +1.96, 106, 73, 230 +1.97, 108, 73, 230 +1.98, 110, 74, 231 +1.99, 112, 74, 231 +2, 114, 75, 231 +2.01, 116, 75, 231 +2.02, 118, 76, 232 +2.03, 120, 76, 232 +2.04, 122, 77, 232 +2.05, 124, 77, 232 +2.06, 126, 78, 233 +2.07, 128, 78, 233 +2.08, 130, 79, 233 +2.09, 133, 80, 234 +2.1, 135, 80, 234 +2.11, 137, 80, 234 +2.12, 139, 81, 234 +2.13, 141, 81, 234 +2.14, 143, 81, 234 +2.15, 145, 82, 234 +2.16, 147, 82, 234 +2.17, 149, 82, 234 +2.18, 151, 83, 234 +2.19, 153, 83, 234 +2.2, 155, 83, 234 +2.21, 157, 84, 234 +2.22, 159, 84, 234 +2.23, 161, 84, 234 +2.24, 164, 85, 235 +2.25, 165, 85, 235 +2.26, 166, 85, 235 +2.27, 168, 85, 235 +2.28, 169, 85, 235 +2.29, 171, 85, 235 +2.3, 172, 85, 235 +2.31, 174, 85, 235 +2.32, 175, 86, 235 +2.33, 177, 86, 235 +2.34, 178, 86, 235 +2.35, 180, 86, 235 +2.36, 181, 86, 235 +2.37, 183, 86, 235 +2.38, 184, 86, 235 +2.39, 186, 87, 235 +2.4, 187, 87, 234 +2.41, 188, 87, 234 +2.42, 190, 87, 234 +2.43, 191, 88, 234 +2.44, 193, 88, 234 +2.45, 194, 88, 234 +2.46, 196, 88, 234 +2.47, 197, 89, 234 +2.48, 199, 89, 234 +2.49, 200, 89, 234 +2.5, 202, 89, 234 diff --git a/satpy/etc/colormaps/clear_sky_confidence.txt b/satpy/etc/colormaps/clear_sky_confidence.csv similarity index 94% rename from satpy/etc/colormaps/clear_sky_confidence.txt rename to satpy/etc/colormaps/clear_sky_confidence.csv index 58393dbbcd..c4743b694b 100644 --- a/satpy/etc/colormaps/clear_sky_confidence.txt +++ b/satpy/etc/colormaps/clear_sky_confidence.csv @@ -1,101 +1,101 @@ -0, 255, 247, 236 -0.01, 254, 246, 233 -0.02, 254, 244, 230 -0.03, 254, 243, 228 -0.04, 254, 242, 224 -0.05, 254, 241, 222 -0.06, 254, 239, 219 -0.07, 254, 239, 216 -0.08, 254, 237, 213 -0.09, 254, 236, 210 -0.1, 254, 235, 207 -0.11, 254, 233, 204 -0.12, 254, 232, 202 -0.13, 253, 231, 198 -0.14, 253, 230, 195 -0.15, 253, 228, 191 -0.16, 253, 226, 189 -0.17, 253, 225, 185 -0.18, 253, 223, 181 -0.19, 253, 221, 178 -0.2, 253, 220, 174 -0.21, 253, 218, 172 -0.22, 253, 216, 168 -0.23, 253, 215, 165 -0.24, 253, 213, 161 -0.25, 253, 211, 157 -0.26, 253, 210, 156 -0.27, 253, 207, 153 -0.28, 253, 206, 152 -0.29, 253, 203, 149 -0.3, 253, 202, 148 -0.31, 253, 200, 145 -0.32, 253, 198, 143 -0.33, 253, 196, 141 -0.34, 253, 193, 139 -0.35, 253, 192, 137 -0.36, 253, 189, 134 -0.37, 253, 188, 133 -0.38, 252, 185, 130 -0.39, 252, 182, 127 -0.4, 252, 177, 123 -0.41, 252, 174, 120 -0.42, 252, 170, 116 -0.43, 252, 166, 112 -0.44, 252, 163, 109 -0.45, 252, 159, 105 -0.46, 252, 156, 103 -0.47, 252, 151, 99 -0.48, 252, 148, 96 -0.49, 252, 144, 92 -0.5, 251, 140, 88 -0.51, 250, 137, 87 -0.52, 249, 134, 86 -0.53, 248, 131, 85 -0.54, 247, 127, 83 -0.55, 246, 125, 82 -0.56, 245, 121, 80 -0.57, 244, 119, 79 -0.58, 243, 115, 78 -0.59, 242, 111, 76 -0.6, 241, 109, 75 -0.61, 240, 105, 73 -0.62, 239, 102, 72 -0.63, 237, 98, 69 -0.64, 236, 94, 67 -0.65, 234, 89, 63 -0.66, 232, 86, 60 -0.67, 230, 81, 57 -0.68, 227, 76, 53 -0.69, 226, 73, 50 -0.7, 224, 68, 46 -0.71, 222, 65, 44 -0.72, 220, 60, 40 -0.73, 218, 56, 37 -0.74, 216, 51, 33 -0.75, 214, 46, 30 -0.76, 211, 43, 28 -0.77, 208, 39, 25 -0.78, 206, 36, 23 -0.79, 202, 31, 20 -0.8, 200, 28, 188 -0.81, 197, 24, 15 -0.82, 194, 21, 13 -0.83, 191, 16, 10 -0.84, 188, 12, 7 -0.85, 185, 9, 5 -0.86, 182, 4, 3 -0.87, 180, 1, 1 -0.88, 175, 0, 0 -0.89, 172, 0, 0 -0.9, 167, 0, 0 -0.91, 164, 0, 0 -0.92, 159, 0, 0 -0.93, 154, 0, 0 -0.94, 151, 0, 0 -0.95, 146, 0, 0 -0.96, 143, 0, 0 -0.97, 138, 0, 0 -0.98, 135, 0, 0 -0.99, 130, 0, 0 -1, 127, 0, 0 +0, 255, 247, 236 +0.01, 254, 246, 233 +0.02, 254, 244, 230 +0.03, 254, 243, 228 +0.04, 254, 242, 224 +0.05, 254, 241, 222 +0.06, 254, 239, 219 +0.07, 254, 239, 216 +0.08, 254, 237, 213 +0.09, 254, 236, 210 +0.1, 254, 235, 207 +0.11, 254, 233, 204 +0.12, 254, 232, 202 +0.13, 253, 231, 198 +0.14, 253, 230, 195 +0.15, 253, 228, 191 +0.16, 253, 226, 189 +0.17, 253, 225, 185 +0.18, 253, 223, 181 +0.19, 253, 221, 178 +0.2, 253, 220, 174 +0.21, 253, 218, 172 +0.22, 253, 216, 168 +0.23, 253, 215, 165 +0.24, 253, 213, 161 +0.25, 253, 211, 157 +0.26, 253, 210, 156 +0.27, 253, 207, 153 +0.28, 253, 206, 152 +0.29, 253, 203, 149 +0.3, 253, 202, 148 +0.31, 253, 200, 145 +0.32, 253, 198, 143 +0.33, 253, 196, 141 +0.34, 253, 193, 139 +0.35, 253, 192, 137 +0.36, 253, 189, 134 +0.37, 253, 188, 133 +0.38, 252, 185, 130 +0.39, 252, 182, 127 +0.4, 252, 177, 123 +0.41, 252, 174, 120 +0.42, 252, 170, 116 +0.43, 252, 166, 112 +0.44, 252, 163, 109 +0.45, 252, 159, 105 +0.46, 252, 156, 103 +0.47, 252, 151, 99 +0.48, 252, 148, 96 +0.49, 252, 144, 92 +0.5, 251, 140, 88 +0.51, 250, 137, 87 +0.52, 249, 134, 86 +0.53, 248, 131, 85 +0.54, 247, 127, 83 +0.55, 246, 125, 82 +0.56, 245, 121, 80 +0.57, 244, 119, 79 +0.58, 243, 115, 78 +0.59, 242, 111, 76 +0.6, 241, 109, 75 +0.61, 240, 105, 73 +0.62, 239, 102, 72 +0.63, 237, 98, 69 +0.64, 236, 94, 67 +0.65, 234, 89, 63 +0.66, 232, 86, 60 +0.67, 230, 81, 57 +0.68, 227, 76, 53 +0.69, 226, 73, 50 +0.7, 224, 68, 46 +0.71, 222, 65, 44 +0.72, 220, 60, 40 +0.73, 218, 56, 37 +0.74, 216, 51, 33 +0.75, 214, 46, 30 +0.76, 211, 43, 28 +0.77, 208, 39, 25 +0.78, 206, 36, 23 +0.79, 202, 31, 20 +0.8, 200, 28, 188 +0.81, 197, 24, 15 +0.82, 194, 21, 13 +0.83, 191, 16, 10 +0.84, 188, 12, 7 +0.85, 185, 9, 5 +0.86, 182, 4, 3 +0.87, 180, 1, 1 +0.88, 175, 0, 0 +0.89, 172, 0, 0 +0.9, 167, 0, 0 +0.91, 164, 0, 0 +0.92, 159, 0, 0 +0.93, 154, 0, 0 +0.94, 151, 0, 0 +0.95, 146, 0, 0 +0.96, 143, 0, 0 +0.97, 138, 0, 0 +0.98, 135, 0, 0 +0.99, 130, 0, 0 +1, 127, 0, 0 diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index 78b59a69c7..5f63b2ad65 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1238,22 +1238,12 @@ enhancements: method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - {colors: [[255, 0, 0], [255, 0, 0]], min_value: 0, max_value: 800} - - {colors: [[170, 0, 0], [170, 0, 0]], min_value: 800.0001, max_value: 1600} - - {colors: [[110, 0, 0], [110, 0, 0]], min_value: 1600.0001, max_value: 2350} - - {colors: [[112, 1, 2], [112, 1, 2]], min_value: 2350.0001, max_value: 3150} - - {colors: [[124, 91, 5], [124, 91, 5]], min_value: 3150.0001, max_value: 4000} - - {colors: [[240, 190, 64], [240, 190, 64]], min_value: 4000.0001, max_value: 4800} - - {colors: [[255, 255, 0], [255, 255, 0]], min_value: 4800.0001, max_value: 5600} - - {colors: [[0, 220, 0], [0, 220, 0]], min_value: 5600.0001, max_value: 6400} - - {colors: [[0, 136, 0], [0, 136, 0]], min_value: 6400.0001, max_value: 7200} - - {colors: [[0, 80, 0], [0, 80, 0]], min_value: 7200.0001, max_value: 8000} - - {colors: [[0, 136, 238], [0, 136, 238]], min_value: 8000.0001, max_value: 8800} - - {colors: [[0, 0, 255], [0, 0, 255]], min_value: 8800.0001, max_value: 9600} - - {colors: [[0, 0, 170], [0, 0, 170]], min_value: 9600.0001, max_value: 10400} - - {colors: [[0, 0, 100], [0, 0, 100]], min_value: 10400.0001, max_value: 11200} - - {colors: [[183,15,141], [183, 15, 141]], min_value: 11200.0001, max_value: 12000} - - {colors: [[102, 0, 119], [102, 0, 119]], min_value: 12000.0001, max_value: 18000} + - { + colors: [[255, 0, 0], [170, 0, 0], [110, 0, 0], [112, 1, 2], [124, 91, 5], [240, 190, 64], [255, 255, 0], + [0, 220, 0], [0, 136, 0], [0, 80, 0], [0, 136, 238], [0, 0, 255], [0, 0, 170], [0, 0, 100], [183, 15, 141], + [102, 0, 119]], + values: [0, 800, 1600, 2350, 3150, 4000, 4800, 5600, 6400, 7200, 8000, 8800, 9600, 10400, 11200, 12000], + } Clear_Sky_Confidence: standard_name: cldmsk_clear_sky_confidence @@ -1263,7 +1253,7 @@ enhancements: kwargs: palettes: - { - filename: clear_sky_confidence.txt + filename: clear_sky_confidence.csv } Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate: @@ -1274,7 +1264,7 @@ enhancements: kwargs: palettes: - { - filename: aerosol_thickness.txt + filename: aerosol_thickness.csv } Angstrom_Exponent_Land_Ocean_Best_Estimate: @@ -1285,5 +1275,5 @@ enhancements: kwargs: palettes: - { - filename: angstrom_exponent.txt + filename: angstrom_exponent.csv } From e6afe2e59aab795d506bf8465eaa3326be846e33 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Fri, 9 Feb 2024 20:35:37 +0000 Subject: [PATCH 186/481] finalized cloud_top_height colormap --- satpy/etc/colormaps/cloud_top_height.csv | 32 ++++++++++++++++++++++++ satpy/etc/enhancements/generic.yaml | 5 +--- 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 satpy/etc/colormaps/cloud_top_height.csv diff --git a/satpy/etc/colormaps/cloud_top_height.csv b/satpy/etc/colormaps/cloud_top_height.csv new file mode 100644 index 0000000000..d1fa053029 --- /dev/null +++ b/satpy/etc/colormaps/cloud_top_height.csv @@ -0,0 +1,32 @@ +0 , 255 , 0 , 0 +800 , 255 , 0 , 0 +800.0001 , 170 , 0 , 0 +1600 , 170 , 0 , 0 +1600.0001 , 110 , 0 , 0 +2350 , 110 , 0 , 0 +2350.0001 , 112 , 1 , 2 +3150 , 112 , 1 , 2 +3150.0001 , 124 , 91 , 5 +4000 , 124 , 91 , 5 +4000.0001 , 240 , 190 , 64 +4800 , 240 , 190 , 64 +4800.0001 , 255 , 255 , 0 +5600 , 255 , 255 , 0 +5600.0001 , 0 , 220 , 0 +6400 , 0 , 220 , 0 +6400.0001 , 0 , 136 , 0 +7200 , 0 , 136 , 0 +7200.0001 , 0 , 80 , 0 +8000 , 0 , 80 , 0 +8000.0001 , 0 , 136 , 238 +8800 , 0 , 136 , 238 +8800.0001 , 0 , 0 , 255 +9600 , 0 , 0 , 255 +9600.0001 , 0 , 0 , 170 +10400 , 0 , 0 , 170 +10400.0001 , 0 , 0 , 100 +11200 , 0 , 0 , 100 +11200.0001 , 183 , 15 , 141 +12000 , 183 , 15 , 141 +12000.0001 , 102 , 0 , 119 +18000 , 102 , 0 , 119 diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index 5f63b2ad65..7dcb730528 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1239,10 +1239,7 @@ enhancements: kwargs: palettes: - { - colors: [[255, 0, 0], [170, 0, 0], [110, 0, 0], [112, 1, 2], [124, 91, 5], [240, 190, 64], [255, 255, 0], - [0, 220, 0], [0, 136, 0], [0, 80, 0], [0, 136, 238], [0, 0, 255], [0, 0, 170], [0, 0, 100], [183, 15, 141], - [102, 0, 119]], - values: [0, 800, 1600, 2350, 3150, 4000, 4800, 5600, 6400, 7200, 8000, 8800, 9600, 10400, 11200, 12000], + filename: cloud_top_height.csv } Clear_Sky_Confidence: From a2d839609b9eb1e149391679a81add405be5b246 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 12 Feb 2024 09:22:54 +0000 Subject: [PATCH 187/481] Make fake observation a bit longer --- satpy/tests/reader_tests/test_ahi_hsd.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/tests/reader_tests/test_ahi_hsd.py b/satpy/tests/reader_tests/test_ahi_hsd.py index 7c88c9e5ac..b52be71426 100644 --- a/satpy/tests/reader_tests/test_ahi_hsd.py +++ b/satpy/tests/reader_tests/test_ahi_hsd.py @@ -40,7 +40,7 @@ "satellite": "Himawari-8", "observation_area": "FLDK", "observation_start_time": 58413.12523839, - "observation_end_time": 58413.12562439, + "observation_end_time": 58413.132182834444, "observation_timeline": "0300", } FAKE_DATA_INFO: InfoDict = { @@ -343,7 +343,7 @@ def test_read_band(self, calibrate, *mocks): "nominal_start_time": datetime(2018, 10, 22, 3, 0, 0, 0), "nominal_end_time": datetime(2018, 10, 22, 3, 0, 0, 0), "observation_start_time": datetime(2018, 10, 22, 3, 0, 20, 596896), - "observation_end_time": datetime(2018, 10, 22, 3, 0, 53, 947296), + "observation_end_time": datetime(2018, 10, 22, 3, 10, 20, 596896), } actual_time_params = im.attrs["time_parameters"] for key, value in time_params_exp.items(): @@ -419,7 +419,7 @@ def test_time_properties(self): assert fh.start_time == datetime(2018, 10, 22, 3, 0) assert fh.end_time == datetime(2018, 10, 22, 3, 0) assert fh.observation_start_time == datetime(2018, 10, 22, 3, 0, 20, 596896) - assert fh.observation_end_time == datetime(2018, 10, 22, 3, 0, 53, 947296) + assert fh.observation_end_time == datetime(2018, 10, 22, 3, 10, 20, 596896) assert fh.nominal_start_time == datetime(2018, 10, 22, 3, 0, 0, 0) assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 0, 0, 0) From b68920fbe66bf45d604e4ad51e0e8e4f2df8b61d Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 12 Feb 2024 11:11:14 +0200 Subject: [PATCH 188/481] Remove douple handling of start/end times and time parameters --- satpy/readers/file_handlers.py | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/satpy/readers/file_handlers.py b/satpy/readers/file_handlers.py index 66a028eb4c..b844732a2e 100644 --- a/satpy/readers/file_handlers.py +++ b/satpy/readers/file_handlers.py @@ -112,10 +112,9 @@ def combine_info(self, all_infos): """ combined_info = combine_metadata(*all_infos) - new_dict = self._combine(all_infos, min, "start_time", "start_orbit") - new_dict.update(self._combine(all_infos, max, "end_time", "end_orbit")) + new_dict = self._combine(all_infos, min, "start_orbit") + new_dict.update(self._combine(all_infos, max, "end_orbit")) new_dict.update(self._combine_orbital_parameters(all_infos)) - new_dict.update(self._combine_time_parameters(all_infos)) try: area = SwathDefinition(lons=np.ma.vstack([info["area"].lons for info in all_infos]), @@ -145,27 +144,6 @@ def _combine_orbital_parameters(self, all_infos): orb_params_comb.update(self._combine(orb_params, np.mean, *keys)) return {"orbital_parameters": orb_params_comb} - def _combine_time_parameters(self, all_infos): - time_params = [info.get("time_parameters", {}) for info in all_infos] - if not all(time_params): - return {} - # Collect all available keys - time_params_comb = {} - for d in time_params: - time_params_comb.update(d) - - start_keys = ( - "nominal_start_time", - "observation_start_time", - ) - end_keys = ( - "nominal_end_time", - "observation_end_time", - ) - time_params_comb.update(self._combine(time_params, min, *start_keys)) - time_params_comb.update(self._combine(time_params, max, *end_keys)) - return {"time_parameters": time_params_comb} - @property def start_time(self): """Get start time.""" From d1c33a1bb9f48b082eedca42a74ddae8af0c828e Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 12 Feb 2024 11:21:40 +0200 Subject: [PATCH 189/481] Use datetimes when testing times --- satpy/tests/test_file_handlers.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/satpy/tests/test_file_handlers.py b/satpy/tests/test_file_handlers.py index 403e686204..925da3e561 100644 --- a/satpy/tests/test_file_handlers.py +++ b/satpy/tests/test_file_handlers.py @@ -49,25 +49,27 @@ def setUp(self): """Set up the test.""" self.fh = BaseFileHandler( "filename", {"filename_info": "bla"}, "filetype_info") + self.early_time = datetime(2024, 2, 12, 11, 00) + self.late_time = datetime(2024, 2, 12, 12, 00) def test_combine_times(self): """Combine times.""" - info1 = {"start_time": 1} - info2 = {"start_time": 2} + info1 = {"start_time": self.early_time} + info2 = {"start_time": self.late_time} res = self.fh.combine_info([info1, info2]) - exp = {"start_time": 1} + exp = {"start_time": self.early_time} assert res == exp res = self.fh.combine_info([info2, info1]) - exp = {"start_time": 1} + exp = {"start_time": self.early_time} assert res == exp - info1 = {"end_time": 1} - info2 = {"end_time": 2} + info1 = {"end_time": self.early_time} + info2 = {"end_time": self.late_time} res = self.fh.combine_info([info1, info2]) - exp = {"end_time": 2} + exp = {"end_time": self.late_time} assert res == exp res = self.fh.combine_info([info2, info1]) - exp = {"end_time": 2} + exp = {"end_time": self.late_time} assert res == exp def test_combine_orbits(self): From 3e050b0940fac573316f67a327010a97cba007da Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 12 Feb 2024 11:22:06 +0200 Subject: [PATCH 190/481] Refactor to remove unnecessary return --- satpy/dataset/metadata.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index bc99d3cb21..405885ad14 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -52,7 +52,6 @@ def combine_metadata(*metadata_objects): """ info_dicts = _get_valid_dicts(metadata_objects) - if len(info_dicts) == 1: return info_dicts[0].copy() @@ -91,9 +90,8 @@ def _combine_shared_info(shared_keys, info_dicts): def _combine_values(key, values, shared_info): if "time" in key: times = _combine_times(key, values) - if times is None: - return - shared_info[key] = times + if times is not None: + shared_info[key] = times elif _are_values_combinable(values): shared_info[key] = values[0] From c9fd59617b5e0ab1f75b62abbc6c8efb0b741ae8 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 12 Feb 2024 10:00:45 +0000 Subject: [PATCH 191/481] Take duration into account for nominal end time --- satpy/readers/ahi_hsd.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index 313e5ccab5..3c9e5fb3b7 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -443,7 +443,7 @@ def _is_valid_timeline(timeline): return False return True - def _modify_observation_time_for_nominal(self, observation_time): + def _modify_observation_time_for_nominal(self, observation_time, start_or_end_time="start"): """Round observation time to a nominal time based on known observation frequency. AHI observations are split into different sectors including Full Disk @@ -464,11 +464,18 @@ def _modify_observation_time_for_nominal(self, observation_time): ) return observation_time + observation_frequencies = {"FLDK": 600, "JP": 150, "R3": 150, "R4": 30, "R5": 30} if self.observation_area == "FLDK": - dt = 0 + dt_start = 0 + dt_end = observation_frequencies["FLDK"] else: - observation_frequency_seconds = {"JP": 150, "R3": 150, "R4": 30, "R5": 30}[self.observation_area[:2]] - dt = observation_frequency_seconds * (int(self.observation_area[2:]) - 1) + observation_frequency_seconds = observation_frequencies[self.observation_area[:2]] + dt_start = observation_frequency_seconds * (int(self.observation_area[2:]) - 1) + dt_end = observation_frequencies[self.observation_area[:2]] + + dt = dt_start + if start_or_end_time == "end": + dt += dt_end return observation_time.replace( hour=int(timeline[:2]), minute=int(timeline[2:4]) + dt//60, From 319d8b55c9b5d56b1cbf6e09ab46720826d0d5c6 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 12 Feb 2024 10:28:25 +0000 Subject: [PATCH 192/481] Update scanning frequencies test --- satpy/readers/ahi_hsd.py | 8 +-- satpy/tests/reader_tests/test_ahi_hsd.py | 71 +++++++++++++++++------- 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index 3c9e5fb3b7..3acd3bebdc 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -414,7 +414,7 @@ def start_time(self): @property def end_time(self): """Get the nominal end time.""" - return self.nominal_start_time + return self.nominal_end_time @property def observation_start_time(self): @@ -429,12 +429,12 @@ def observation_end_time(self): @property def nominal_start_time(self): """Time this band was nominally to be recorded.""" - return self._modify_observation_time_for_nominal(self.observation_start_time) + return self._modify_observation_time_for_nominal(self.observation_start_time, "start") @property def nominal_end_time(self): """Get the nominal end time.""" - return self._modify_observation_time_for_nominal(self.observation_end_time) + return self._modify_observation_time_for_nominal(self.observation_end_time, "end") @staticmethod def _is_valid_timeline(timeline): @@ -471,7 +471,7 @@ def _modify_observation_time_for_nominal(self, observation_time, start_or_end_ti else: observation_frequency_seconds = observation_frequencies[self.observation_area[:2]] dt_start = observation_frequency_seconds * (int(self.observation_area[2:]) - 1) - dt_end = observation_frequencies[self.observation_area[:2]] + dt_end = observation_frequency_seconds dt = dt_start if start_or_end_time == "end": diff --git a/satpy/tests/reader_tests/test_ahi_hsd.py b/satpy/tests/reader_tests/test_ahi_hsd.py index b52be71426..29e4cfcb9b 100644 --- a/satpy/tests/reader_tests/test_ahi_hsd.py +++ b/satpy/tests/reader_tests/test_ahi_hsd.py @@ -341,7 +341,7 @@ def test_read_band(self, calibrate, *mocks): time_params_exp = { "nominal_start_time": datetime(2018, 10, 22, 3, 0, 0, 0), - "nominal_end_time": datetime(2018, 10, 22, 3, 0, 0, 0), + "nominal_end_time": datetime(2018, 10, 22, 3, 10, 0, 0), "observation_start_time": datetime(2018, 10, 22, 3, 0, 20, 596896), "observation_end_time": datetime(2018, 10, 22, 3, 10, 20, 596896), } @@ -417,30 +417,63 @@ def test_time_properties(self): """Test start/end/scheduled time properties.""" with _fake_hsd_handler() as fh: assert fh.start_time == datetime(2018, 10, 22, 3, 0) - assert fh.end_time == datetime(2018, 10, 22, 3, 0) + assert fh.end_time == datetime(2018, 10, 22, 3, 10) assert fh.observation_start_time == datetime(2018, 10, 22, 3, 0, 20, 596896) assert fh.observation_end_time == datetime(2018, 10, 22, 3, 10, 20, 596896) assert fh.nominal_start_time == datetime(2018, 10, 22, 3, 0, 0, 0) - assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 0, 0, 0) + assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 10, 0, 0) - def test_scanning_frequencies(self): + @pytest.mark.parametrize( + ("observation_area", "start_time", "end_time"), + [ + ( + "JP01", + datetime(2018, 10, 22, 3, 0, 0), + datetime(2018, 10, 22, 3, 2, 30) + ), + ( + "JP04", + datetime(2018, 10, 22, 3, 7, 30, 0), + datetime(2018, 10, 22, 3, 10, 0, 0) + ), + ( + "R301", + datetime(2018, 10, 22, 3, 0, 0), + datetime(2018, 10, 22, 3, 2, 30) + ), + ( + "R304", + datetime(2018, 10, 22, 3, 7, 30, 0), + datetime(2018, 10, 22, 3, 10, 0, 0) + ), + ( + "R401", + datetime(2018, 10, 22, 3, 0, 0), + datetime(2018, 10, 22, 3, 0, 30) + ), + ( + "R420", + datetime(2018, 10, 22, 3, 9, 30, 0), + datetime(2018, 10, 22, 3, 10, 0, 0) + ), + ( + "R501", + datetime(2018, 10, 22, 3, 0, 0), + datetime(2018, 10, 22, 3, 0, 30) + ), + ( + "R520", + datetime(2018, 10, 22, 3, 9, 30, 0), + datetime(2018, 10, 22, 3, 10, 0, 0) + ), + ] + ) + def test_scanning_frequencies(self, observation_area, start_time, end_time): """Test scanning frequencies.""" with _fake_hsd_handler() as fh: - fh.observation_area = "JP04" - assert fh.nominal_start_time == datetime(2018, 10, 22, 3, 7, 30, 0) - assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 7, 30, 0) - fh.observation_area = "R304" - assert fh.nominal_start_time == datetime(2018, 10, 22, 3, 7, 30, 0) - assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 7, 30, 0) - fh.observation_area = "R420" - assert fh.nominal_start_time == datetime(2018, 10, 22, 3, 9, 30, 0) - assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 9, 30, 0) - fh.observation_area = "R520" - assert fh.nominal_start_time == datetime(2018, 10, 22, 3, 9, 30, 0) - assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 9, 30, 0) - fh.observation_area = "FLDK" - assert fh.nominal_start_time == datetime(2018, 10, 22, 3, 0, 0, 0) - assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 0, 0, 0) + fh.observation_area = observation_area + assert fh.nominal_start_time == start_time + assert fh.nominal_end_time == end_time def test_blocklen_error(self, *mocks): """Test erraneous blocklength.""" From e3fb4ec1e4485501f607ee918b9181879a5c0f37 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 12 Feb 2024 10:54:45 +0000 Subject: [PATCH 193/481] Refactor nominal time computation --- satpy/readers/ahi_hsd.py | 38 +++++++++++++++++--------------- satpy/readers/seviri_l1b_hrit.py | 4 ++-- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index 3acd3bebdc..1e1f630843 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -429,12 +429,13 @@ def observation_end_time(self): @property def nominal_start_time(self): """Time this band was nominally to be recorded.""" - return self._modify_observation_time_for_nominal(self.observation_start_time, "start") + return self._modify_observation_time_for_nominal(self.observation_start_time) @property def nominal_end_time(self): """Get the nominal end time.""" - return self._modify_observation_time_for_nominal(self.observation_end_time, "end") + freq = self._observation_frequency + return self.nominal_start_time + timedelta(minutes=freq // 60, seconds=freq % 60) @staticmethod def _is_valid_timeline(timeline): @@ -443,7 +444,16 @@ def _is_valid_timeline(timeline): return False return True - def _modify_observation_time_for_nominal(self, observation_time, start_or_end_time="start"): + @property + def _observation_frequency(self): + frequencies = {"FLDK": 600, "JP": 150, "R3": 150, "R4": 30, "R5": 30} + area = self.observation_area + if area != "FLDK": + # e.g. JP01, JP02 etc + area = area[:2] + return frequencies[area] + + def _modify_observation_time_for_nominal(self, observation_time): """Round observation time to a nominal time based on known observation frequency. AHI observations are split into different sectors including Full Disk @@ -454,7 +464,6 @@ def _modify_observation_time_for_nominal(self, observation_time, start_or_end_ti sector. So if the observation time is 13:32:48 for the "JP02" sector which is the second Japan observation where every Japan observation is 2.5 minutes apart, then the result should be 13:32:30. - """ timeline = "{:04d}".format(self.basic_info["observation_timeline"][0]) if not self._is_valid_timeline(timeline): @@ -463,24 +472,17 @@ def _modify_observation_time_for_nominal(self, observation_time, start_or_end_ti stacklevel=3 ) return observation_time - - observation_frequencies = {"FLDK": 600, "JP": 150, "R3": 150, "R4": 30, "R5": 30} - if self.observation_area == "FLDK": - dt_start = 0 - dt_end = observation_frequencies["FLDK"] - else: - observation_frequency_seconds = observation_frequencies[self.observation_area[:2]] - dt_start = observation_frequency_seconds * (int(self.observation_area[2:]) - 1) - dt_end = observation_frequency_seconds - - dt = dt_start - if start_or_end_time == "end": - dt += dt_end - + dt = self._get_offset_relative_to_timeline() return observation_time.replace( hour=int(timeline[:2]), minute=int(timeline[2:4]) + dt//60, second=dt % 60, microsecond=0) + def _get_offset_relative_to_timeline(self): + if self.observation_area == "FLDK": + return 0 + sector_repeat = int(self.observation_area[2:]) - 1 + return self._observation_frequency * sector_repeat + def get_dataset(self, key, info): """Get the dataset.""" return self.read_band(key, info) diff --git a/satpy/readers/seviri_l1b_hrit.py b/satpy/readers/seviri_l1b_hrit.py index 3b3aa82277..804198da0f 100644 --- a/satpy/readers/seviri_l1b_hrit.py +++ b/satpy/readers/seviri_l1b_hrit.py @@ -765,8 +765,8 @@ def _update_attrs(self, res, info): res.attrs["standard_name"] = info["standard_name"] res.attrs["platform_name"] = self.platform_name res.attrs["sensor"] = "seviri" - res.attrs["nominal_start_time"] = self.nominal_start_time, - res.attrs["nominal_end_time"] = self.nominal_end_time, + res.attrs["nominal_start_time"] = self.nominal_start_time + res.attrs["nominal_end_time"] = self.nominal_end_time res.attrs["time_parameters"] = { "nominal_start_time": self.nominal_start_time, "nominal_end_time": self.nominal_end_time, From d0821bf91459fcbc95d21c6d61d534fd37d9a32b Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Mon, 12 Feb 2024 10:56:38 +0000 Subject: [PATCH 194/481] Reset accidental SEVIRI changes --- satpy/readers/seviri_l1b_hrit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/readers/seviri_l1b_hrit.py b/satpy/readers/seviri_l1b_hrit.py index 804198da0f..3b3aa82277 100644 --- a/satpy/readers/seviri_l1b_hrit.py +++ b/satpy/readers/seviri_l1b_hrit.py @@ -765,8 +765,8 @@ def _update_attrs(self, res, info): res.attrs["standard_name"] = info["standard_name"] res.attrs["platform_name"] = self.platform_name res.attrs["sensor"] = "seviri" - res.attrs["nominal_start_time"] = self.nominal_start_time - res.attrs["nominal_end_time"] = self.nominal_end_time + res.attrs["nominal_start_time"] = self.nominal_start_time, + res.attrs["nominal_end_time"] = self.nominal_end_time, res.attrs["time_parameters"] = { "nominal_start_time": self.nominal_start_time, "nominal_end_time": self.nominal_end_time, From beaaf3db73b069813f54e8972b1f3ca58a8bc925 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Mon, 12 Feb 2024 18:29:19 +0000 Subject: [PATCH 195/481] changed colormap paths --- satpy/etc/enhancements/generic.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index 7dcb730528..e79ec953fb 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1239,7 +1239,7 @@ enhancements: kwargs: palettes: - { - filename: cloud_top_height.csv + filename: colormaps/cloud_top_height.csv } Clear_Sky_Confidence: @@ -1250,7 +1250,7 @@ enhancements: kwargs: palettes: - { - filename: clear_sky_confidence.csv + filename: colormaps/clear_sky_confidence.csv } Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate: @@ -1261,7 +1261,7 @@ enhancements: kwargs: palettes: - { - filename: aerosol_thickness.csv + filename: colormaps/aerosol_thickness.csv } Angstrom_Exponent_Land_Ocean_Best_Estimate: @@ -1272,5 +1272,5 @@ enhancements: kwargs: palettes: - { - filename: angstrom_exponent.csv + filename: colormaps/angstrom_exponent.csv } From 143973e7239350bc6eb11d01160eb8add895d634 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Mon, 12 Feb 2024 14:08:04 -0600 Subject: [PATCH 196/481] Change area definition and add check for resolution --- satpy/readers/clavrx.py | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index e23bde44e5..39fda49d3d 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -268,24 +268,14 @@ def _read_axi_fixed_grid(filename: str, sensor: str, l1b_attr) -> geometry.AreaD x, y = l1b["x"], l1b["y"] area_extent, ncols, nlines = _CLAVRxHelper._area_extent(x, y, h) - if sensor == "abi": - area = geometry.AreaDefinition( - "abi_geos", - "ABI L2 file area", - "abi_geos", - proj, - ncols, - nlines, - np.asarray(area_extent)) - else: - area = geometry.AreaDefinition( - "ahi_geos", - "AHI L2 file area", - "ahi_geos", - proj, - ncols, - nlines, - np.asarray(area_extent)) + area = geometry.AreaDefinition( + f"{sensor}_geos", + f"{sensor.upper()} L2 file area", + f"{sensor}_geos", + proj, + ncols, + nlines, + area_extent) return area @@ -515,7 +505,8 @@ def available_datasets(self, configured_datasets=None): # reader knows something about this dataset (file type matches) # add any information that this reader can add. new_info = ds_info.copy() - new_info["resolution"] = self.resolution + if self.resolution is not None: + new_info["resolution"] = self.resolution handled_vars.add(ds_info["name"]) yield True, new_info yield from self._available_file_datasets(handled_vars) From 678deaaa3a42f5f8993faba36cac3bb702caeeb1 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Tue, 13 Feb 2024 12:30:57 +0000 Subject: [PATCH 197/481] Refactor nominal timestamp computation --- satpy/readers/ahi_hsd.py | 124 ++++++++++++++--------- satpy/tests/reader_tests/test_ahi_hsd.py | 22 ++-- 2 files changed, 87 insertions(+), 59 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index 1e1f630843..3520c0f953 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -429,59 +429,18 @@ def observation_end_time(self): @property def nominal_start_time(self): """Time this band was nominally to be recorded.""" - return self._modify_observation_time_for_nominal(self.observation_start_time) + timeline = "{:04d}".format(self.basic_info["observation_timeline"][0]) + calc = NominalTimeCalculator(timeline, + self.observation_area) + return calc.get_nominal_start_time(self.observation_start_time) @property def nominal_end_time(self): """Get the nominal end time.""" - freq = self._observation_frequency - return self.nominal_start_time + timedelta(minutes=freq // 60, seconds=freq % 60) - - @staticmethod - def _is_valid_timeline(timeline): - """Check that the `observation_timeline` value is not a fill value.""" - if int(timeline[:2]) > 23: - return False - return True - - @property - def _observation_frequency(self): - frequencies = {"FLDK": 600, "JP": 150, "R3": 150, "R4": 30, "R5": 30} - area = self.observation_area - if area != "FLDK": - # e.g. JP01, JP02 etc - area = area[:2] - return frequencies[area] - - def _modify_observation_time_for_nominal(self, observation_time): - """Round observation time to a nominal time based on known observation frequency. - - AHI observations are split into different sectors including Full Disk - (FLDK), Japan (JP) sectors, and smaller regional (R) sectors. Each - sector is observed at different frequencies (ex. every 10 minutes, - every 2.5 minutes, and every 30 seconds). This method will take the - actual observation time and round it to the nearest interval for this - sector. So if the observation time is 13:32:48 for the "JP02" sector - which is the second Japan observation where every Japan observation is - 2.5 minutes apart, then the result should be 13:32:30. - """ timeline = "{:04d}".format(self.basic_info["observation_timeline"][0]) - if not self._is_valid_timeline(timeline): - warnings.warn( - "Observation timeline is fill value, not rounding observation time.", - stacklevel=3 - ) - return observation_time - dt = self._get_offset_relative_to_timeline() - return observation_time.replace( - hour=int(timeline[:2]), minute=int(timeline[2:4]) + dt//60, - second=dt % 60, microsecond=0) - - def _get_offset_relative_to_timeline(self): - if self.observation_area == "FLDK": - return 0 - sector_repeat = int(self.observation_area[2:]) - 1 - return self._observation_frequency * sector_repeat + calc = NominalTimeCalculator(timeline, + self.observation_area) + return calc.get_nominal_end_time(self.nominal_start_time) def get_dataset(self, key, info): """Get the dataset.""" @@ -784,3 +743,72 @@ def _ir_calibrate(self, data): c2_ = self._header["calibration"]["c2_rad2tb_conversion"][0] return (c0_ + c1_ * Te_ + c2_ * Te_ ** 2).clip(0) + + +class NominalTimeCalculator: + """Get time when a scan was nominally to be recorded.""" + + def __init__(self, timeline, area): + """Initialize the nominal timestamp calculator. + + Args: + timeline (str): Observation timeline (four characters HHMM) + area (str): Observation area (four characters, e.g. FLDK) + """ + self.timeline = timeline + self.area = area + + def get_nominal_start_time(self, observation_time): + """Get nominal start time of the scan.""" + return self._modify_observation_time_for_nominal(observation_time) + + def get_nominal_end_time(self, nominal_start_time): + """Get nominal end time of the scan.""" + freq = self._observation_frequency + return nominal_start_time + timedelta(minutes=freq // 60, + seconds=freq % 60) + + def _modify_observation_time_for_nominal(self, observation_time): + """Round observation time to a nominal time based on known observation frequency. + + AHI observations are split into different sectors including Full Disk + (FLDK), Japan (JP) sectors, and smaller regional (R) sectors. Each + sector is observed at different frequencies (ex. every 10 minutes, + every 2.5 minutes, and every 30 seconds). This method will take the + actual observation time and round it to the nearest interval for this + sector. So if the observation time is 13:32:48 for the "JP02" sector + which is the second Japan observation where every Japan observation is + 2.5 minutes apart, then the result should be 13:32:30. + """ + if not self._is_valid_timeline(self.timeline): + warnings.warn( + "Observation timeline is fill value, not rounding observation time.", + stacklevel=3 + ) + return observation_time + dt = self._get_offset_relative_to_timeline() + return observation_time.replace( + hour=int(self.timeline[:2]), minute=int(self.timeline[2:4]) + dt//60, + second=dt % 60, microsecond=0) + + @staticmethod + def _is_valid_timeline(timeline): + """Check that the `observation_timeline` value is not a fill value.""" + if int(timeline[:2]) > 23: + return False + return True + + def _get_offset_relative_to_timeline(self): + if self.area == "FLDK": + return 0 + sector_repeat = int(self.area[2:]) - 1 + return self._observation_frequency * sector_repeat + + @property + def _observation_frequency(self): + frequencies = {"FLDK": 600, "JP": 150, "R3": 150, "R4": 30, "R5": 30} + area = self.area + if area != "FLDK": + # e.g. JP01, JP02 etc + area = area[:2] + return frequencies[area] diff --git a/satpy/tests/reader_tests/test_ahi_hsd.py b/satpy/tests/reader_tests/test_ahi_hsd.py index 29e4cfcb9b..e73efdfec2 100644 --- a/satpy/tests/reader_tests/test_ahi_hsd.py +++ b/satpy/tests/reader_tests/test_ahi_hsd.py @@ -29,7 +29,7 @@ import numpy as np import pytest -from satpy.readers.ahi_hsd import AHIHSDFileHandler +from satpy.readers.ahi_hsd import AHIHSDFileHandler, NominalTimeCalculator from satpy.readers.utils import get_geostationary_mask from satpy.tests.utils import make_dataid @@ -495,22 +495,22 @@ def test_blocklen_error(self, *mocks): def test_is_valid_time(self): """Test that valid times are correctly identified.""" - assert AHIHSDFileHandler._is_valid_timeline(FAKE_BASIC_INFO["observation_timeline"]) - assert not AHIHSDFileHandler._is_valid_timeline("65526") + assert NominalTimeCalculator._is_valid_timeline(FAKE_BASIC_INFO["observation_timeline"]) + assert not NominalTimeCalculator._is_valid_timeline("65526") def test_time_rounding(self): """Test rounding of the nominal time.""" mocker = mock.MagicMock() in_date = datetime(2020, 1, 1, 12, 0, 0) - with mock.patch("satpy.readers.ahi_hsd.AHIHSDFileHandler._is_valid_timeline", mocker): - with _fake_hsd_handler() as fh: - mocker.return_value = True - assert fh._modify_observation_time_for_nominal(in_date) == datetime(2020, 1, 1, 3, 0, 0) - mocker.return_value = False - with pytest.warns(UserWarning, - match=r"Observation timeline is fill value, not rounding observation time"): - assert fh._modify_observation_time_for_nominal(in_date) == datetime(2020, 1, 1, 12, 0, 0) + with mock.patch("satpy.readers.ahi_hsd.NominalTimeCalculator._is_valid_timeline", mocker): + calc = NominalTimeCalculator("0300", "FLDK") + mocker.return_value = True + assert calc._modify_observation_time_for_nominal(in_date) == datetime(2020, 1, 1, 3, 0, 0) + mocker.return_value = False + with pytest.warns(UserWarning, + match=r"Observation timeline is fill value, not rounding observation time"): + assert calc._modify_observation_time_for_nominal(in_date) == datetime(2020, 1, 1, 12, 0, 0) class TestAHICalibration(unittest.TestCase): From 3fa2698b475351f9be245e41ff16b4992b0208ca Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Tue, 13 Feb 2024 12:33:38 +0000 Subject: [PATCH 198/481] Refactor corresponding tests --- satpy/readers/ahi_hsd.py | 4 +- satpy/tests/reader_tests/test_ahi_hsd.py | 142 +++++++++++------------ 2 files changed, 73 insertions(+), 73 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index 3520c0f953..e721d29b2d 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -758,9 +758,9 @@ def __init__(self, timeline, area): self.timeline = timeline self.area = area - def get_nominal_start_time(self, observation_time): + def get_nominal_start_time(self, observation_start_time): """Get nominal start time of the scan.""" - return self._modify_observation_time_for_nominal(observation_time) + return self._modify_observation_time_for_nominal(observation_start_time) def get_nominal_end_time(self, nominal_start_time): """Get nominal end time of the scan.""" diff --git a/satpy/tests/reader_tests/test_ahi_hsd.py b/satpy/tests/reader_tests/test_ahi_hsd.py index e73efdfec2..c201c2b7b7 100644 --- a/satpy/tests/reader_tests/test_ahi_hsd.py +++ b/satpy/tests/reader_tests/test_ahi_hsd.py @@ -423,58 +423,6 @@ def test_time_properties(self): assert fh.nominal_start_time == datetime(2018, 10, 22, 3, 0, 0, 0) assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 10, 0, 0) - @pytest.mark.parametrize( - ("observation_area", "start_time", "end_time"), - [ - ( - "JP01", - datetime(2018, 10, 22, 3, 0, 0), - datetime(2018, 10, 22, 3, 2, 30) - ), - ( - "JP04", - datetime(2018, 10, 22, 3, 7, 30, 0), - datetime(2018, 10, 22, 3, 10, 0, 0) - ), - ( - "R301", - datetime(2018, 10, 22, 3, 0, 0), - datetime(2018, 10, 22, 3, 2, 30) - ), - ( - "R304", - datetime(2018, 10, 22, 3, 7, 30, 0), - datetime(2018, 10, 22, 3, 10, 0, 0) - ), - ( - "R401", - datetime(2018, 10, 22, 3, 0, 0), - datetime(2018, 10, 22, 3, 0, 30) - ), - ( - "R420", - datetime(2018, 10, 22, 3, 9, 30, 0), - datetime(2018, 10, 22, 3, 10, 0, 0) - ), - ( - "R501", - datetime(2018, 10, 22, 3, 0, 0), - datetime(2018, 10, 22, 3, 0, 30) - ), - ( - "R520", - datetime(2018, 10, 22, 3, 9, 30, 0), - datetime(2018, 10, 22, 3, 10, 0, 0) - ), - ] - ) - def test_scanning_frequencies(self, observation_area, start_time, end_time): - """Test scanning frequencies.""" - with _fake_hsd_handler() as fh: - fh.observation_area = observation_area - assert fh.nominal_start_time == start_time - assert fh.nominal_end_time == end_time - def test_blocklen_error(self, *mocks): """Test erraneous blocklength.""" open_name = "%s.open" % __name__ @@ -493,25 +441,6 @@ def test_blocklen_error(self, *mocks): with pytest.warns(UserWarning, match=r"Actual .* header size does not match expected"): fh._check_fpos(fp_, fpos, 0, "header 1") - def test_is_valid_time(self): - """Test that valid times are correctly identified.""" - assert NominalTimeCalculator._is_valid_timeline(FAKE_BASIC_INFO["observation_timeline"]) - assert not NominalTimeCalculator._is_valid_timeline("65526") - - def test_time_rounding(self): - """Test rounding of the nominal time.""" - mocker = mock.MagicMock() - in_date = datetime(2020, 1, 1, 12, 0, 0) - - with mock.patch("satpy.readers.ahi_hsd.NominalTimeCalculator._is_valid_timeline", mocker): - calc = NominalTimeCalculator("0300", "FLDK") - mocker.return_value = True - assert calc._modify_observation_time_for_nominal(in_date) == datetime(2020, 1, 1, 3, 0, 0) - mocker.return_value = False - with pytest.warns(UserWarning, - match=r"Observation timeline is fill value, not rounding observation time"): - assert calc._modify_observation_time_for_nominal(in_date) == datetime(2020, 1, 1, 12, 0, 0) - class TestAHICalibration(unittest.TestCase): """Test case for various AHI calibration types.""" @@ -702,3 +631,74 @@ def _create_fake_file_handler(in_fname, filename_info=None, filetype_info=None, assert in_fname != fh.filename assert str(filename_info["segment"]).zfill(2) == fh.filename[0:2] return fh + + +class TestNominalTimeCalculator: + """Test case for nominal timestamp computation.""" + + @pytest.mark.parametrize( + ("timeline", "expected"), + [ + ("0300", datetime(2020, 1, 1, 3, 0, 0)), + ("65526", datetime(2020, 1, 1, 12, 0, 0)) + ] + ) + def test_invalid_timeline(self, timeline, expected): + """Test handling of invalid timeline.""" + calc = NominalTimeCalculator(timeline, "FLDK") + res = calc.get_nominal_start_time(datetime(2020, 1, 1, 12, 0, 0)) + assert res == expected + + @pytest.mark.parametrize( + ("area", "expected"), + [ + ( + "JP01", + {"tstart": datetime(2018, 10, 22, 3, 0, 0), + "tend": datetime(2018, 10, 22, 3, 2, 30)} + ), + ( + "JP04", + {"tstart": datetime(2018, 10, 22, 3, 7, 30, 0), + "tend": datetime(2018, 10, 22, 3, 10, 0, 0)} + ), + ( + "R301", + {"tstart": datetime(2018, 10, 22, 3, 0, 0), + "tend": datetime(2018, 10, 22, 3, 2, 30)} + ), + ( + "R304", + {"tstart": datetime(2018, 10, 22, 3, 7, 30, 0), + "tend": datetime(2018, 10, 22, 3, 10, 0, 0)} + ), + ( + "R401", + {"tstart": datetime(2018, 10, 22, 3, 0, 0), + "tend": datetime(2018, 10, 22, 3, 0, 30)} + ), + ( + "R420", + {"tstart": datetime(2018, 10, 22, 3, 9, 30, 0), + "tend": datetime(2018, 10, 22, 3, 10, 0, 0)} + ), + ( + "R501", + {"tstart": datetime(2018, 10, 22, 3, 0, 0), + "tend": datetime(2018, 10, 22, 3, 0, 30)} + ), + ( + "R520", + {"tstart": datetime(2018, 10, 22, 3, 9, 30, 0), + "tend": datetime(2018, 10, 22, 3, 10, 0, 0)} + ), + ] + ) + def test_areas(self, area, expected): + """Test nominal timestamps for multiple areas.""" + obs_start_time = datetime(2018, 10, 22, 3, 0, 20, 596896) + calc = NominalTimeCalculator("0300", area) + nom_start_time = calc.get_nominal_start_time(obs_start_time) + nom_end_time = calc.get_nominal_end_time(nom_start_time) + assert nom_start_time == expected["tstart"] + assert nom_end_time == expected["tend"] From 5c3475315a9176bafa92874ac502820dcca76b11 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Tue, 13 Feb 2024 13:00:15 +0000 Subject: [PATCH 199/481] Add test case for multiple timelines --- satpy/tests/reader_tests/test_ahi_hsd.py | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/satpy/tests/reader_tests/test_ahi_hsd.py b/satpy/tests/reader_tests/test_ahi_hsd.py index c201c2b7b7..93089084c6 100644 --- a/satpy/tests/reader_tests/test_ahi_hsd.py +++ b/satpy/tests/reader_tests/test_ahi_hsd.py @@ -702,3 +702,40 @@ def test_areas(self, area, expected): nom_end_time = calc.get_nominal_end_time(nom_start_time) assert nom_start_time == expected["tstart"] assert nom_end_time == expected["tend"] + + @pytest.mark.parametrize( + ("timeline", "obs_start_time", "expected"), + [ + ( + "1200", + datetime(2023, 1, 1, 12, 0, 1), + {"tstart": datetime(2023, 1, 1, 12, 0, 0), + "tend": datetime(2023, 1, 1, 12, 10, 0)} + ), + ( + "1200", + datetime(2023, 1, 1, 11, 59, 59), + {"tstart": datetime(2023, 1, 1, 12, 0, 0), + "tend": datetime(2023, 1, 1, 12, 10, 0)} + ), + ( + "0000", + datetime(2023, 1, 1, 0, 0, 1), + {"tstart": datetime(2023, 1, 1, 0, 0, 0), + "tend": datetime(2023, 1, 1, 0, 10, 0)} + ), + ( + "0000", + datetime(2022, 12, 31, 23, 59, 59), + {"tstart": datetime(2023, 1, 1, 0, 0, 0), + "tend": datetime(2023, 1, 1, 0, 10, 0)} + ), + ] + ) + def test_timelines(self, timeline, obs_start_time, expected): + """Test nominal timestamps for multiple timelines.""" + calc = NominalTimeCalculator(timeline, "FLDK") + nom_start_time = calc.get_nominal_start_time(obs_start_time) + nom_end_time = calc.get_nominal_end_time(nom_start_time) + assert nom_start_time == expected["tstart"] + assert nom_end_time == expected["tend"] From 67dd4a8f5cad945acc7236f6fa4f51e5235228f5 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Tue, 13 Feb 2024 13:09:16 +0000 Subject: [PATCH 200/481] Convert timeline to time object --- satpy/readers/ahi_hsd.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index e721d29b2d..30e0f5e868 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -755,9 +755,15 @@ def __init__(self, timeline, area): timeline (str): Observation timeline (four characters HHMM) area (str): Observation area (four characters, e.g. FLDK) """ - self.timeline = timeline + self.timeline = self._parse_timeline(timeline) self.area = area + def _parse_timeline(self, timeline): + try: + return datetime.strptime(timeline, "%H%M").time() + except ValueError: + return None + def get_nominal_start_time(self, observation_start_time): """Get nominal start time of the scan.""" return self._modify_observation_time_for_nominal(observation_start_time) @@ -780,7 +786,7 @@ def _modify_observation_time_for_nominal(self, observation_time): which is the second Japan observation where every Japan observation is 2.5 minutes apart, then the result should be 13:32:30. """ - if not self._is_valid_timeline(self.timeline): + if not self.timeline: warnings.warn( "Observation timeline is fill value, not rounding observation time.", stacklevel=3 @@ -788,16 +794,9 @@ def _modify_observation_time_for_nominal(self, observation_time): return observation_time dt = self._get_offset_relative_to_timeline() return observation_time.replace( - hour=int(self.timeline[:2]), minute=int(self.timeline[2:4]) + dt//60, + hour=self.timeline.hour, minute=self.timeline.minute + dt//60, second=dt % 60, microsecond=0) - @staticmethod - def _is_valid_timeline(timeline): - """Check that the `observation_timeline` value is not a fill value.""" - if int(timeline[:2]) > 23: - return False - return True - def _get_offset_relative_to_timeline(self): if self.area == "FLDK": return 0 From 911bc4d87f27472d272bc62011e83986f2576ffe Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Tue, 13 Feb 2024 13:26:52 +0000 Subject: [PATCH 201/481] Handle scans starting earlier than planned --- satpy/readers/ahi_hsd.py | 31 +++++++++++++++++++++--- satpy/tests/reader_tests/test_ahi_hsd.py | 16 ++++++------ 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index 30e0f5e868..6b503148b2 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -792,10 +792,35 @@ def _modify_observation_time_for_nominal(self, observation_time): stacklevel=3 ) return observation_time + timeline = self._get_closest_timeline(observation_time) dt = self._get_offset_relative_to_timeline() - return observation_time.replace( - hour=self.timeline.hour, minute=self.timeline.minute + dt//60, - second=dt % 60, microsecond=0) + return timeline + timedelta(minutes=dt//60, seconds=dt % 60) + + def _get_closest_timeline(self, observation_time): + """Find the closest timeline for the given observation time. + + Needs to check surrounding days because the observation might start + a little bit before the planned time. + + Observation start time: 2022-12-31 23:59 + Timeline: 0000 + => Nominal start time: 2023-01-01 00:00 + """ + delta_days = [-1, 0, 1] + surrounding_dates = [ + (observation_time + timedelta(days=delta)).date() + for delta in delta_days + ] + timelines = [ + datetime.combine(date, self.timeline) + for date in surrounding_dates + ] + diffs = [ + abs((timeline - observation_time)) + for timeline in timelines + ] + argmin = np.argmin(diffs) + return timelines[argmin] def _get_offset_relative_to_timeline(self): if self.area == "FLDK": diff --git a/satpy/tests/reader_tests/test_ahi_hsd.py b/satpy/tests/reader_tests/test_ahi_hsd.py index 93089084c6..3b73521ee8 100644 --- a/satpy/tests/reader_tests/test_ahi_hsd.py +++ b/satpy/tests/reader_tests/test_ahi_hsd.py @@ -707,16 +707,16 @@ def test_areas(self, area, expected): ("timeline", "obs_start_time", "expected"), [ ( - "1200", - datetime(2023, 1, 1, 12, 0, 1), - {"tstart": datetime(2023, 1, 1, 12, 0, 0), - "tend": datetime(2023, 1, 1, 12, 10, 0)} + "2350", + datetime(2022, 12, 31, 23, 50, 1), + {"tstart": datetime(2022, 12, 31, 23, 50, 0), + "tend": datetime(2023, 1, 1, 0, 0, 0)} ), ( - "1200", - datetime(2023, 1, 1, 11, 59, 59), - {"tstart": datetime(2023, 1, 1, 12, 0, 0), - "tend": datetime(2023, 1, 1, 12, 10, 0)} + "2350", + datetime(2022, 12, 31, 23, 49, 59), + {"tstart": datetime(2022, 12, 31, 23, 50, 0), + "tend": datetime(2023, 1, 1, 0, 0, 0)} ), ( "0000", From 024a63f957e944828fe7cf558072332a57159398 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Tue, 13 Feb 2024 10:41:15 -0600 Subject: [PATCH 202/481] Address: scale_factor/add_offset dtype, area_extent type. Updates logic for the resolution value from the file. --- satpy/readers/clavrx.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/satpy/readers/clavrx.py b/satpy/readers/clavrx.py index 39fda49d3d..c355a1f0ba 100644 --- a/satpy/readers/clavrx.py +++ b/satpy/readers/clavrx.py @@ -17,10 +17,12 @@ # satpy. If not, see . """Interface to CLAVR-X HDF4 products.""" +from __future__ import annotations + import logging import os from glob import glob -from typing import Optional, Union +from typing import Optional import netCDF4 import numpy as np @@ -108,11 +110,11 @@ def _get_rows_per_scan(sensor: str) -> Optional[int]: return None -def _scale_data(data_arr: Union[xr.DataArray, int], scale_factor: float, add_offset: float) -> xr.DataArray: +def _scale_data(data_arr: xr.DataArray | int, scale_factor: float, add_offset: float) -> xr.DataArray: """Scale data, if needed.""" scaling_needed = not (scale_factor == 1.0 and add_offset == 0.0) if scaling_needed: - data_arr = data_arr * scale_factor + add_offset + data_arr = data_arr * np.float32(scale_factor) + np.float32(add_offset) return data_arr @@ -120,16 +122,17 @@ class _CLAVRxHelper: """A base class for the CLAVRx File Handlers.""" @staticmethod - def _get_nadir_resolution(sensor, resolution_from_filename_info): + def _get_nadir_resolution(sensor, filename_info_resolution): """Get nadir resolution.""" for k, v in NADIR_RESOLUTION.items(): if sensor.startswith(k): return v - res = resolution_from_filename_info - if res.endswith("m"): - return int(res[:-1]) - elif res is not None: - return int(res) + if filename_info_resolution is None: + return None + if isinstance(filename_info_resolution, str) and filename_info_resolution.startswith("m"): + return int(filename_info_resolution[:-1]) + else: + return int(filename_info_resolution) @staticmethod def _remove_attributes(attrs: dict) -> dict: From cef6e5a88b67822796952015e49b24bdbd857269 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Tue, 13 Feb 2024 11:53:56 -0600 Subject: [PATCH 203/481] Move clavrx tests --- satpy/tests/reader_tests/{ => test_clavrx}/test_clavrx_geohdf.py | 0 satpy/tests/reader_tests/{ => test_clavrx}/test_clavrx_nc.py | 0 .../tests/reader_tests/{ => test_clavrx}/test_clavrx_polarhdf.py | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename satpy/tests/reader_tests/{ => test_clavrx}/test_clavrx_geohdf.py (100%) rename satpy/tests/reader_tests/{ => test_clavrx}/test_clavrx_nc.py (100%) rename satpy/tests/reader_tests/{ => test_clavrx}/test_clavrx_polarhdf.py (100%) diff --git a/satpy/tests/reader_tests/test_clavrx_geohdf.py b/satpy/tests/reader_tests/test_clavrx/test_clavrx_geohdf.py similarity index 100% rename from satpy/tests/reader_tests/test_clavrx_geohdf.py rename to satpy/tests/reader_tests/test_clavrx/test_clavrx_geohdf.py diff --git a/satpy/tests/reader_tests/test_clavrx_nc.py b/satpy/tests/reader_tests/test_clavrx/test_clavrx_nc.py similarity index 100% rename from satpy/tests/reader_tests/test_clavrx_nc.py rename to satpy/tests/reader_tests/test_clavrx/test_clavrx_nc.py diff --git a/satpy/tests/reader_tests/test_clavrx_polarhdf.py b/satpy/tests/reader_tests/test_clavrx/test_clavrx_polarhdf.py similarity index 100% rename from satpy/tests/reader_tests/test_clavrx_polarhdf.py rename to satpy/tests/reader_tests/test_clavrx/test_clavrx_polarhdf.py From aee140a1327041a8c218bde0580bc94e2f1942ad Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Tue, 13 Feb 2024 20:29:54 +0200 Subject: [PATCH 204/481] Update satpy/dataset/metadata.py Co-authored-by: Gerrit Holl --- satpy/dataset/metadata.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 405885ad14..577c83eb7b 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -40,7 +40,8 @@ def combine_metadata(*metadata_objects): `None` values resulting from data that don't have times associated to them are removed. These rules are applied also to values in the 'time_parameters' dictionary. - +.. versionchanged:: 0.47 + Before Satpy 0.47, all times, including `start_time` and `end_time`, were averaged. In the interest of processing time, lazy arrays are compared by object identity rather than by their contents. From 52b2d41621f7d87bc49762afd7c1bcbdadf071b3 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Tue, 13 Feb 2024 20:40:21 +0200 Subject: [PATCH 205/481] Update satpy/dataset/metadata.py Co-authored-by: David Hoese --- satpy/dataset/metadata.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index 577c83eb7b..b08f8207a5 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -40,8 +40,11 @@ def combine_metadata(*metadata_objects): `None` values resulting from data that don't have times associated to them are removed. These rules are applied also to values in the 'time_parameters' dictionary. -.. versionchanged:: 0.47 - Before Satpy 0.47, all times, including `start_time` and `end_time`, were averaged. + + .. versionchanged:: 0.47 + + Before Satpy 0.47, all times, including `start_time` and `end_time`, were averaged. + In the interest of processing time, lazy arrays are compared by object identity rather than by their contents. From 835c551eea22c8ca7117dbc888b65e1d8bb40fd0 Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Tue, 13 Feb 2024 19:53:04 +0000 Subject: [PATCH 206/481] Refactor duplicate code --- satpy/readers/ahi_hsd.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index 6b503148b2..cf257cf579 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -426,20 +426,20 @@ def observation_end_time(self): """Get the observation end time.""" return datetime(1858, 11, 17) + timedelta(days=float(self.basic_info["observation_end_time"].item())) + @property + def _timeline(self): + return "{:04d}".format(self.basic_info["observation_timeline"][0]) + @property def nominal_start_time(self): """Time this band was nominally to be recorded.""" - timeline = "{:04d}".format(self.basic_info["observation_timeline"][0]) - calc = NominalTimeCalculator(timeline, - self.observation_area) + calc = NominalTimeCalculator(self._timeline, self.observation_area) return calc.get_nominal_start_time(self.observation_start_time) @property def nominal_end_time(self): """Get the nominal end time.""" - timeline = "{:04d}".format(self.basic_info["observation_timeline"][0]) - calc = NominalTimeCalculator(timeline, - self.observation_area) + calc = NominalTimeCalculator(self._timeline, self.observation_area) return calc.get_nominal_end_time(self.nominal_start_time) def get_dataset(self, key, info): From b8a47a9c9d042097e2fe2467cfb7bef72329f521 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Wed, 14 Feb 2024 08:53:38 +0200 Subject: [PATCH 207/481] Add a warning when trying to use removed 'average_times' kwarg --- satpy/dataset/metadata.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index b08f8207a5..a328402e0a 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -17,6 +17,7 @@ # satpy. If not, see . """Utilities for merging metadata from various sources.""" +import warnings from collections.abc import Collection from datetime import datetime from functools import partial, reduce @@ -27,7 +28,7 @@ from satpy.writers.utils import flatten_dict -def combine_metadata(*metadata_objects): +def combine_metadata(*metadata_objects, average_times=None): """Combine the metadata of two or more Datasets. If the values corresponding to any keys are not equal or do not @@ -40,7 +41,7 @@ def combine_metadata(*metadata_objects): `None` values resulting from data that don't have times associated to them are removed. These rules are applied also to values in the 'time_parameters' dictionary. - + .. versionchanged:: 0.47 Before Satpy 0.47, all times, including `start_time` and `end_time`, were averaged. @@ -51,10 +52,19 @@ def combine_metadata(*metadata_objects): Args: *metadata_objects: MetadataObject or dict objects to combine + Kwargs: + average_times (bool): Removed option to average all time attributes. + Returns: dict: the combined metadata """ + if average_times is not None: + warnings.warn( + "'average_time' option has been removed and start/end times are handled with min/max instead.", + UserWarning + ) + info_dicts = _get_valid_dicts(metadata_objects) if len(info_dicts) == 1: return info_dicts[0].copy() From f8937d41257dcf5286d19e966173cbdb5588f27b Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Wed, 14 Feb 2024 13:00:49 +0000 Subject: [PATCH 208/481] Fix nominal time attributes in SEVIRI HRIT --- satpy/readers/seviri_l1b_hrit.py | 4 ++-- satpy/tests/reader_tests/test_seviri_l1b_hrit_setup.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/satpy/readers/seviri_l1b_hrit.py b/satpy/readers/seviri_l1b_hrit.py index 3b3aa82277..804198da0f 100644 --- a/satpy/readers/seviri_l1b_hrit.py +++ b/satpy/readers/seviri_l1b_hrit.py @@ -765,8 +765,8 @@ def _update_attrs(self, res, info): res.attrs["standard_name"] = info["standard_name"] res.attrs["platform_name"] = self.platform_name res.attrs["sensor"] = "seviri" - res.attrs["nominal_start_time"] = self.nominal_start_time, - res.attrs["nominal_end_time"] = self.nominal_end_time, + res.attrs["nominal_start_time"] = self.nominal_start_time + res.attrs["nominal_end_time"] = self.nominal_end_time res.attrs["time_parameters"] = { "nominal_start_time": self.nominal_start_time, "nominal_end_time": self.nominal_end_time, diff --git a/satpy/tests/reader_tests/test_seviri_l1b_hrit_setup.py b/satpy/tests/reader_tests/test_seviri_l1b_hrit_setup.py index a885a5becc..d668fe5240 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_hrit_setup.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_hrit_setup.py @@ -238,8 +238,8 @@ def get_attrs_exp(projection_longitude=0.0): "satellite_actual_latitude": -0.5711243456528018, "satellite_actual_altitude": 35783296.150123544}, "georef_offset_corrected": True, - "nominal_start_time": (datetime(2006, 1, 1, 12, 15),), - "nominal_end_time": (datetime(2006, 1, 1, 12, 30),), + "nominal_start_time": datetime(2006, 1, 1, 12, 15), + "nominal_end_time": datetime(2006, 1, 1, 12, 30), "time_parameters": { "nominal_start_time": datetime(2006, 1, 1, 12, 15), "nominal_end_time": datetime(2006, 1, 1, 12, 30), From 205d5e80c998c0e202783981bb142b6729d8e091 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Thu, 15 Feb 2024 13:07:06 +0100 Subject: [PATCH 209/481] Fix cutoffs for night_ir_alpha and bump up trollimage version --- continuous_integration/environment.yaml | 2 +- satpy/etc/composites/seviri.yaml | 1 + satpy/etc/enhancements/generic.yaml | 2 +- setup.py | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/continuous_integration/environment.yaml b/continuous_integration/environment.yaml index 215d215eac..f1a89319a8 100644 --- a/continuous_integration/environment.yaml +++ b/continuous_integration/environment.yaml @@ -59,6 +59,6 @@ dependencies: - bokeh - pip: - trollsift - - trollimage>=1.20 + - trollimage>=1.23 - pyspectral - pyorbital diff --git a/satpy/etc/composites/seviri.yaml b/satpy/etc/composites/seviri.yaml index f30330bb18..e53609d8e0 100644 --- a/satpy/etc/composites/seviri.yaml +++ b/satpy/etc/composites/seviri.yaml @@ -421,6 +421,7 @@ composites: - name: HRV modifiers: [sunz_corrected] - IR_108 + hrv_fog: compositor: !!python/name:satpy.composites.GenericCompositor standard_name: hrv_fog diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index 25680d6db9..52cad8a5ce 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1104,7 +1104,7 @@ enhancements: operations: - name: stretch method: !!python/name:satpy.enhancements.stretch - kwargs: {stretch: linear, cutoffs: [0.02, 0.02]} + kwargs: {stretch: linear, cutoffs: [[0.02, 0.02], [0.02, 0.02], [0.02, 0.02], [0.02, 0.02]]} - name: inverse method: !!python/name:satpy.enhancements.invert args: diff --git a/setup.py b/setup.py index 3439e8fa89..16c2b95512 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ from setuptools import find_packages, setup requires = ["numpy >=1.21", "pillow", "pyresample >=1.24.0", "trollsift", - "trollimage >=1.20", "pykdtree", "pyyaml >=5.1", "xarray >=0.14.1", + "trollimage >=1.23", "pykdtree", "pyyaml >=5.1", "xarray >=0.14.1", "dask[array] >=0.17.1", "pyproj>=2.2", "zarr", "donfig", "appdirs", "packaging", "pooch", "pyorbital"] From c819c975172393c9a60660dc23ba55d25ad0ae44 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Fri, 16 Feb 2024 09:44:49 +0100 Subject: [PATCH 210/481] fix table order and update to datatables v2. --- doc/source/_static/main.js | 7 ++++++- doc/source/conf.py | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/source/_static/main.js b/doc/source/_static/main.js index 188a335e71..b153beb2f3 100644 --- a/doc/source/_static/main.js +++ b/doc/source/_static/main.js @@ -1,6 +1,11 @@ $(document).ready( function () { $('table.datatable').DataTable( { "paging": false, - "dom": 'lfitp' + "layout": { + 'topStart': 'info', + 'topEnd': 'search', + 'bottomStart': null + }, + "order": [[0, 'asc']] } ); } ); diff --git a/doc/source/conf.py b/doc/source/conf.py index 49e47b2cc2..020544ee4a 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -194,11 +194,11 @@ def __getattr__(cls, name): html_css_files = [ "theme_overrides.css", # override wide tables in RTD theme - "https://cdn.datatables.net/1.10.23/css/jquery.dataTables.min.css", + "https://cdn.datatables.net/v/dt/dt-2.0.0/datatables.min.css", ] html_js_files = [ - "https://cdn.datatables.net/1.10.23/js/jquery.dataTables.min.js", + "https://cdn.datatables.net/v/dt/dt-2.0.0/datatables.min.js", "main.js", ] From 46556d31d70095695a045473c9e662e2da01cfe1 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Fri, 16 Feb 2024 09:47:00 +0100 Subject: [PATCH 211/481] Add status description again and insert link to it in dev guide. --- doc/source/dev_guide/custom_reader.rst | 3 ++- doc/source/index.rst | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/doc/source/dev_guide/custom_reader.rst b/doc/source/dev_guide/custom_reader.rst index a77988760e..a5656795ca 100644 --- a/doc/source/dev_guide/custom_reader.rst +++ b/doc/source/dev_guide/custom_reader.rst @@ -117,7 +117,8 @@ The parameters to provide in this section are: file format. This can be multiline if formatted properly in YAML (see example below). status - The status of the reader (one of: Nominal, Beta, Alpha) + The status of the reader (one of: Nominal, Beta, Alpha, Defunct; see :ref:`Status Description ` + for more details). supports_fsspec If the reader supports reading data via fsspec (either true or false). sensors diff --git a/doc/source/index.rst b/doc/source/index.rst index 052a7e2d03..b229c904ee 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -84,6 +84,30 @@ Documentation .. include:: reader_table.rst +.. _Status Description: +.. note:: + + Status description: + + Defunct + Most likely the reader is not functional. If it is there is a good chance of + bugs and/or performance problems (e.g. not ported to dask/xarray yet). Future + development is unclear. Users are encouraged to contribute (see section + :doc:`dev_guide/CONTRIBUTING` and/or get help on Slack or by opening a Github issue). + + Alpha + This denotes early development status. Reader is functional and implements some + or all of the nominal features. There might be bugs. Exactness of results is + not be guaranteed. Use at your own risk. + + Beta + This denotes final developement status. Reader is functional and implements all + nominal features. Results should be dependable but there might be bugs. Users + are actively encouraged to test and report bugs. + + Nominal + This denotes a finished status. Reader is functional and most likely no new + features will be introduced. It has been tested and there are no known bugs. Indices and tables ================== From b280236ba1fd70c8f9763e3d33e23d51f298b2c2 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Fri, 16 Feb 2024 09:47:44 +0100 Subject: [PATCH 212/481] fix missing info in multiple readers. --- satpy/etc/readers/agri_fy4a_l1.yaml | 2 +- satpy/etc/readers/agri_fy4b_l1.yaml | 4 ++++ satpy/etc/readers/ghi_l1.yaml | 4 ++++ satpy/etc/readers/meris_nc_sen3.yaml | 6 +++++- satpy/etc/readers/mersi_ll_l1b.yaml | 6 +++++- satpy/etc/readers/sgli_l1b.yaml | 6 +++++- satpy/etc/readers/viirs_edr.yaml | 6 +++++- 7 files changed, 29 insertions(+), 5 deletions(-) diff --git a/satpy/etc/readers/agri_fy4a_l1.yaml b/satpy/etc/readers/agri_fy4a_l1.yaml index 5e3dfead35..cd7c7a8fe0 100644 --- a/satpy/etc/readers/agri_fy4a_l1.yaml +++ b/satpy/etc/readers/agri_fy4a_l1.yaml @@ -5,7 +5,7 @@ reader: name: agri_fy4a_l1 short_name: AGRI FY4A L1 - long_name: FY-4A AGRI L1 data in HDF5 format + long_name: FY-4A AGRI Level 1 HDF5 format description: FY-4A AGRI instrument HDF5 reader status: Beta supports_fsspec: false diff --git a/satpy/etc/readers/agri_fy4b_l1.yaml b/satpy/etc/readers/agri_fy4b_l1.yaml index b1ff44189d..2b47e51cdb 100644 --- a/satpy/etc/readers/agri_fy4b_l1.yaml +++ b/satpy/etc/readers/agri_fy4b_l1.yaml @@ -4,7 +4,11 @@ reader: name: agri_fy4b_l1 + short_name: AGRI FY4B L1 + long_name: FY-4B AGRI Level 1 data HDF5 format description: FY-4B AGRI instrument HDF5 reader + status: Beta + supports_fsspec: false sensors: [agri] default_channels: reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader diff --git a/satpy/etc/readers/ghi_l1.yaml b/satpy/etc/readers/ghi_l1.yaml index 59c8f35f70..0c2e595253 100644 --- a/satpy/etc/readers/ghi_l1.yaml +++ b/satpy/etc/readers/ghi_l1.yaml @@ -4,7 +4,11 @@ reader: name: ghi_l1 + short_name: GHI FY4A L1 + long_name: FY-4A GHI Level 1 HDF5 format description: FY-4A GHI instrument HDF5 reader + status: Beta + supports_fsspec: false sensors: [ghi] default_channels: reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader diff --git a/satpy/etc/readers/meris_nc_sen3.yaml b/satpy/etc/readers/meris_nc_sen3.yaml index ba3d02969a..28d5597665 100644 --- a/satpy/etc/readers/meris_nc_sen3.yaml +++ b/satpy/etc/readers/meris_nc_sen3.yaml @@ -1,6 +1,10 @@ reader: - description: NC Reader for MERIS data (Sentinel 3 like format) name: meris_nc_sen3 + short_name: MERIS Sentinel 3 + long_name: Sentinel 3 MERIS NetCDF format + description: NC Reader for MERIS data (Sentinel 3 like format) + status: Beta + supports_fsspec: false sensors: [meris] default_channels: [] reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader diff --git a/satpy/etc/readers/mersi_ll_l1b.yaml b/satpy/etc/readers/mersi_ll_l1b.yaml index 7c572885c7..6ea44dcb99 100644 --- a/satpy/etc/readers/mersi_ll_l1b.yaml +++ b/satpy/etc/readers/mersi_ll_l1b.yaml @@ -1,6 +1,10 @@ reader: - description: FY-3E Medium Resolution Spectral Imager - Low Light (MERSI-LL) L1B Reader name: mersi_ll_l1b + short_name: MERSI Low Light FY3E L1B + long_name: FY-3E MERSI Low Light Level 1B + description: FY-3E Medium Resolution Spectral Imager - Low Light (MERSI-LL) L1B Reader + status: Beta + supports_fsspec: false sensors: [mersi-ll] reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader diff --git a/satpy/etc/readers/sgli_l1b.yaml b/satpy/etc/readers/sgli_l1b.yaml index 9f8108510f..4cb86890c4 100644 --- a/satpy/etc/readers/sgli_l1b.yaml +++ b/satpy/etc/readers/sgli_l1b.yaml @@ -1,7 +1,11 @@ reader: + name: sgli_l1b + short_name: SGLI GCOM-C L1B + long_name: GCOM-C SGLI Level 1B HDF5 format description: Reader for SGLI data + status: Beta + supports_fsspec: false reference: https://gportal.jaxa.jp/gpr/assets/mng_upload/GCOM-C/SGLI_Level1_Product_Format_Description_en.pdf - name: sgli_l1b sensors: [sgli] default_channels: [] reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader diff --git a/satpy/etc/readers/viirs_edr.yaml b/satpy/etc/readers/viirs_edr.yaml index 37f36934b8..2228b25916 100644 --- a/satpy/etc/readers/viirs_edr.yaml +++ b/satpy/etc/readers/viirs_edr.yaml @@ -1,6 +1,10 @@ reader: - description: VIIRS NOAA Enterprise EDR product reader name: viirs_edr + short_name: VIIRS JPSS EDR nc + long_name: JPSS VIIRS EDR NetCDF format + description: VIIRS NOAA Enterprise EDR product reader + status: Beta + supports_fsspec: false reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader sensors: [viirs] group_keys: ['platform_shortname'] From 1eadfb573b066e99aaa4f074c7d862e2476c7d9f Mon Sep 17 00:00:00 2001 From: Stephan Finkensieper Date: Fri, 16 Feb 2024 09:19:56 +0000 Subject: [PATCH 213/481] Make nominal time calculator private --- satpy/readers/ahi_hsd.py | 6 +++--- satpy/tests/reader_tests/test_ahi_hsd.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index cf257cf579..bf2ab09e79 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -433,13 +433,13 @@ def _timeline(self): @property def nominal_start_time(self): """Time this band was nominally to be recorded.""" - calc = NominalTimeCalculator(self._timeline, self.observation_area) + calc = _NominalTimeCalculator(self._timeline, self.observation_area) return calc.get_nominal_start_time(self.observation_start_time) @property def nominal_end_time(self): """Get the nominal end time.""" - calc = NominalTimeCalculator(self._timeline, self.observation_area) + calc = _NominalTimeCalculator(self._timeline, self.observation_area) return calc.get_nominal_end_time(self.nominal_start_time) def get_dataset(self, key, info): @@ -745,7 +745,7 @@ def _ir_calibrate(self, data): return (c0_ + c1_ * Te_ + c2_ * Te_ ** 2).clip(0) -class NominalTimeCalculator: +class _NominalTimeCalculator: """Get time when a scan was nominally to be recorded.""" def __init__(self, timeline, area): diff --git a/satpy/tests/reader_tests/test_ahi_hsd.py b/satpy/tests/reader_tests/test_ahi_hsd.py index 3b73521ee8..393afca1c8 100644 --- a/satpy/tests/reader_tests/test_ahi_hsd.py +++ b/satpy/tests/reader_tests/test_ahi_hsd.py @@ -29,7 +29,7 @@ import numpy as np import pytest -from satpy.readers.ahi_hsd import AHIHSDFileHandler, NominalTimeCalculator +from satpy.readers.ahi_hsd import AHIHSDFileHandler, _NominalTimeCalculator from satpy.readers.utils import get_geostationary_mask from satpy.tests.utils import make_dataid @@ -645,7 +645,7 @@ class TestNominalTimeCalculator: ) def test_invalid_timeline(self, timeline, expected): """Test handling of invalid timeline.""" - calc = NominalTimeCalculator(timeline, "FLDK") + calc = _NominalTimeCalculator(timeline, "FLDK") res = calc.get_nominal_start_time(datetime(2020, 1, 1, 12, 0, 0)) assert res == expected @@ -697,7 +697,7 @@ def test_invalid_timeline(self, timeline, expected): def test_areas(self, area, expected): """Test nominal timestamps for multiple areas.""" obs_start_time = datetime(2018, 10, 22, 3, 0, 20, 596896) - calc = NominalTimeCalculator("0300", area) + calc = _NominalTimeCalculator("0300", area) nom_start_time = calc.get_nominal_start_time(obs_start_time) nom_end_time = calc.get_nominal_end_time(nom_start_time) assert nom_start_time == expected["tstart"] @@ -734,7 +734,7 @@ def test_areas(self, area, expected): ) def test_timelines(self, timeline, obs_start_time, expected): """Test nominal timestamps for multiple timelines.""" - calc = NominalTimeCalculator(timeline, "FLDK") + calc = _NominalTimeCalculator(timeline, "FLDK") nom_start_time = calc.get_nominal_start_time(obs_start_time) nom_end_time = calc.get_nominal_end_time(nom_start_time) assert nom_start_time == expected["tstart"] From a08797142e4d9b1ef45e6db8dae8b9486ed7194b Mon Sep 17 00:00:00 2001 From: BENR0 Date: Fri, 16 Feb 2024 10:24:26 +0100 Subject: [PATCH 214/481] refactor viirs platform name. --- satpy/etc/readers/viirs_compact.yaml | 2 +- satpy/etc/readers/viirs_l1b.yaml | 2 +- satpy/etc/readers/viirs_sdr.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/etc/readers/viirs_compact.yaml b/satpy/etc/readers/viirs_compact.yaml index 31f4201930..5dca3abbaa 100644 --- a/satpy/etc/readers/viirs_compact.yaml +++ b/satpy/etc/readers/viirs_compact.yaml @@ -1,7 +1,7 @@ reader: name: viirs_compact short_name: VIIRS Compact - long_name: SNPP VIIRS SDR data in HDF5 Compact format + long_name: JPSS VIIRS SDR data in HDF5 Compact format description: Generic Eumetsat Compact VIIRS Reader status: Nominal supports_fsspec: false diff --git a/satpy/etc/readers/viirs_l1b.yaml b/satpy/etc/readers/viirs_l1b.yaml index f078c4247d..4622f7e415 100644 --- a/satpy/etc/readers/viirs_l1b.yaml +++ b/satpy/etc/readers/viirs_l1b.yaml @@ -1,7 +1,7 @@ reader: name: viirs_l1b short_name: VIIRS l1b - long_name: SNPP VIIRS Level 1b data in netCDF4 format + long_name: JPSS VIIRS Level 1b data in netCDF4 format description: Generic NASA VIIRS L1B Reader status: Nominal supports_fsspec: false diff --git a/satpy/etc/readers/viirs_sdr.yaml b/satpy/etc/readers/viirs_sdr.yaml index e85c7f4f70..70f2c5f34a 100644 --- a/satpy/etc/readers/viirs_sdr.yaml +++ b/satpy/etc/readers/viirs_sdr.yaml @@ -1,7 +1,7 @@ reader: name: viirs_sdr short_name: VIIRS SDR - long_name: SNPP VIIRS data in HDF5 SDR format + long_name: JPSS VIIRS data in HDF5 SDR format description: VIIRS SDR Reader status: Nominal supports_fsspec: false From 8d45299e7df011afa1b19f0683cc3fa813337648 Mon Sep 17 00:00:00 2001 From: Joleen Feltz Date: Fri, 16 Feb 2024 09:41:05 -0600 Subject: [PATCH 215/481] Add init to clavrx tests directory --- .../tests/reader_tests/test_clavrx/__init__.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 satpy/tests/reader_tests/test_clavrx/__init__.py diff --git a/satpy/tests/reader_tests/test_clavrx/__init__.py b/satpy/tests/reader_tests/test_clavrx/__init__.py new file mode 100644 index 0000000000..6f62e3a26b --- /dev/null +++ b/satpy/tests/reader_tests/test_clavrx/__init__.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2017-2018 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 . +"""The clavrx reader tests package.""" From f6d1f1ff2c61e47b78e5b47613ef6e874909008f Mon Sep 17 00:00:00 2001 From: David Hoese Date: Fri, 16 Feb 2024 09:57:31 -0600 Subject: [PATCH 216/481] Fix apostrophes being replaced with double quotes --- .../tests/reader_tests/test_clavrx/test_clavrx_polarhdf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/tests/reader_tests/test_clavrx/test_clavrx_polarhdf.py b/satpy/tests/reader_tests/test_clavrx/test_clavrx_polarhdf.py index 6b69d8a923..f8ae93c38b 100644 --- a/satpy/tests/reader_tests/test_clavrx/test_clavrx_polarhdf.py +++ b/satpy/tests/reader_tests/test_clavrx/test_clavrx_polarhdf.py @@ -186,7 +186,7 @@ def test_available_datasets(self): assert new_ds_infos[1][0] assert new_ds_infos[1][1]["resolution"] == 742 - # we have this, but don"t want to change the resolution + # we have this, but don't want to change the resolution # because a previous handler said it has it assert new_ds_infos[2][0] assert new_ds_infos[2][1]["resolution"] == 1 @@ -201,11 +201,11 @@ def test_available_datasets(self): assert new_ds_infos[4][0] assert new_ds_infos[4][1]["resolution"] == 742 - # we don"t have this variable, don"t change it + # we don"t have this variable, don't change it assert not new_ds_infos[5][0] assert new_ds_infos[5][1].get("resolution") is None - # we have this, but it isn"t supposed to come from our file type + # we have this, but it isn't supposed to come from our file type assert new_ds_infos[6][0] is None assert new_ds_infos[6][1].get("resolution") is None From 40633bd3ed906b3b669f7c0ab8a621458477125a Mon Sep 17 00:00:00 2001 From: David Hoese Date: Fri, 16 Feb 2024 10:09:40 -0600 Subject: [PATCH 217/481] Update short_name in satpy/etc/readers/viirs_edr.yaml --- satpy/etc/readers/viirs_edr.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/readers/viirs_edr.yaml b/satpy/etc/readers/viirs_edr.yaml index 2228b25916..4c4c91a91f 100644 --- a/satpy/etc/readers/viirs_edr.yaml +++ b/satpy/etc/readers/viirs_edr.yaml @@ -1,6 +1,6 @@ reader: name: viirs_edr - short_name: VIIRS JPSS EDR nc + short_name: VIIRS EDR long_name: JPSS VIIRS EDR NetCDF format description: VIIRS NOAA Enterprise EDR product reader status: Beta From f16e85a846db61bd309c7797332483e3a1130efc Mon Sep 17 00:00:00 2001 From: BENR0 Date: Mon, 19 Feb 2024 09:51:41 +0100 Subject: [PATCH 218/481] refactor: set simonpr84's readers to nominal status. --- satpy/etc/readers/agri_fy4b_l1.yaml | 2 +- satpy/etc/readers/ghi_l1.yaml | 2 +- satpy/etc/readers/mersi_ll_l1b.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/etc/readers/agri_fy4b_l1.yaml b/satpy/etc/readers/agri_fy4b_l1.yaml index 2b47e51cdb..4917d08145 100644 --- a/satpy/etc/readers/agri_fy4b_l1.yaml +++ b/satpy/etc/readers/agri_fy4b_l1.yaml @@ -7,7 +7,7 @@ reader: short_name: AGRI FY4B L1 long_name: FY-4B AGRI Level 1 data HDF5 format description: FY-4B AGRI instrument HDF5 reader - status: Beta + status: Nominal supports_fsspec: false sensors: [agri] default_channels: diff --git a/satpy/etc/readers/ghi_l1.yaml b/satpy/etc/readers/ghi_l1.yaml index 0c2e595253..08c438127b 100644 --- a/satpy/etc/readers/ghi_l1.yaml +++ b/satpy/etc/readers/ghi_l1.yaml @@ -7,7 +7,7 @@ reader: short_name: GHI FY4A L1 long_name: FY-4A GHI Level 1 HDF5 format description: FY-4A GHI instrument HDF5 reader - status: Beta + status: Nominal supports_fsspec: false sensors: [ghi] default_channels: diff --git a/satpy/etc/readers/mersi_ll_l1b.yaml b/satpy/etc/readers/mersi_ll_l1b.yaml index 6ea44dcb99..6e729f07d1 100644 --- a/satpy/etc/readers/mersi_ll_l1b.yaml +++ b/satpy/etc/readers/mersi_ll_l1b.yaml @@ -3,7 +3,7 @@ reader: short_name: MERSI Low Light FY3E L1B long_name: FY-3E MERSI Low Light Level 1B description: FY-3E Medium Resolution Spectral Imager - Low Light (MERSI-LL) L1B Reader - status: Beta + status: Nominal supports_fsspec: false sensors: [mersi-ll] reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader From 8101eac924cf72506d012129958c2e877e2e26a4 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Mon, 19 Feb 2024 09:56:09 +0100 Subject: [PATCH 219/481] refactor: change fsspec status for readers using hdf5_utils. --- satpy/etc/readers/agri_fy4b_l1.yaml | 2 +- satpy/etc/readers/mersi_ll_l1b.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/etc/readers/agri_fy4b_l1.yaml b/satpy/etc/readers/agri_fy4b_l1.yaml index 4917d08145..77c616b2e4 100644 --- a/satpy/etc/readers/agri_fy4b_l1.yaml +++ b/satpy/etc/readers/agri_fy4b_l1.yaml @@ -8,7 +8,7 @@ reader: long_name: FY-4B AGRI Level 1 data HDF5 format description: FY-4B AGRI instrument HDF5 reader status: Nominal - supports_fsspec: false + supports_fsspec: true sensors: [agri] default_channels: reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader diff --git a/satpy/etc/readers/mersi_ll_l1b.yaml b/satpy/etc/readers/mersi_ll_l1b.yaml index 6e729f07d1..652708d733 100644 --- a/satpy/etc/readers/mersi_ll_l1b.yaml +++ b/satpy/etc/readers/mersi_ll_l1b.yaml @@ -4,7 +4,7 @@ reader: long_name: FY-3E MERSI Low Light Level 1B description: FY-3E Medium Resolution Spectral Imager - Low Light (MERSI-LL) L1B Reader status: Nominal - supports_fsspec: false + supports_fsspec: true sensors: [mersi-ll] reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader From 14e11fcdd5b3cbf423e2667afbd673029c955a88 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Tue, 20 Feb 2024 14:23:00 +0000 Subject: [PATCH 220/481] Removed colormaps and changed standard_names --- satpy/etc/colormaps/aerosol_thickness.csv | 151 ----------- satpy/etc/colormaps/angstrom_exponent.csv | 251 ------------------- satpy/etc/colormaps/clear_sky_confidence.csv | 101 -------- satpy/etc/colormaps/cloud_top_height.csv | 32 --- satpy/etc/enhancements/generic.yaml | 20 +- satpy/etc/readers/viirs_l2.yaml | 8 +- 6 files changed, 16 insertions(+), 547 deletions(-) delete mode 100644 satpy/etc/colormaps/aerosol_thickness.csv delete mode 100644 satpy/etc/colormaps/angstrom_exponent.csv delete mode 100644 satpy/etc/colormaps/clear_sky_confidence.csv delete mode 100644 satpy/etc/colormaps/cloud_top_height.csv diff --git a/satpy/etc/colormaps/aerosol_thickness.csv b/satpy/etc/colormaps/aerosol_thickness.csv deleted file mode 100644 index 39d8527f6c..0000000000 --- a/satpy/etc/colormaps/aerosol_thickness.csv +++ /dev/null @@ -1,151 +0,0 @@ -0, 255, 252, 199 -0.005, 255, 251, 193 -0.01, 255, 250, 188 -0.015, 255, 249, 183 -0.02, 255, 248, 178 -0.025, 255, 247, 173 -0.03, 255, 246, 167 -0.035, 255, 245, 162 -0.04, 255, 244, 157 -0.045, 255, 243, 152 -0.05, 255, 242, 147 -0.055, 255, 240, 144 -0.06, 255, 239, 141 -0.065, 255, 238, 138 -0.07, 255, 236, 135 -0.075, 255, 235, 132 -0.08, 255, 234, 129 -0.085, 255, 232, 126 -0.09, 255, 231, 123 -0.095, 255, 230, 120 -0.1, 255, 229, 118 -0.105, 255, 227, 115 -0.11, 255, 226, 113 -0.115, 255, 225, 110 -0.12, 255, 223, 108 -0.125, 255, 222, 106 -0.13, 255, 221, 103 -0.135, 255, 219, 101 -0.14, 255, 218, 98 -0.145, 255, 217, 96 -0.15, 255, 216, 94 -0.155, 255, 214, 91 -0.16, 255, 212, 89 -0.165, 255, 210, 87 -0.17, 255, 208, 85 -0.175, 255, 207, 83 -0.18, 255, 205, 80 -0.185, 255, 203, 78 -0.19, 255, 201, 76 -0.195, 255, 199, 74 -0.2, 255, 198, 72 -0.205, 255, 195, 70 -0.21, 255, 193, 68 -0.215, 255, 190, 66 -0.22, 255, 188, 64 -0.225, 255, 185, 62 -0.23, 255, 183, 60 -0.235, 255, 180, 58 -0.24, 255, 178, 56 -0.245, 255, 175, 54 -0.25, 255, 173, 53 -0.255, 255, 170, 51 -0.26, 255, 168, 50 -0.265, 255, 165, 49 -0.27, 255, 163, 47 -0.275, 255, 161, 46 -0.28, 255, 158, 45 -0.285, 255, 156, 43 -0.29, 255, 153, 42 -0.295, 255, 151, 41 -0.3, 255, 149, 40 -0.305, 255, 146, 39 -0.31, 255, 144, 38 -0.315, 255, 142, 37 -0.32, 255, 140, 37 -0.325, 255, 138, 36 -0.33, 255, 135, 35 -0.335, 255, 133, 35 -0.34, 255, 131, 34 -0.345, 255, 129, 33 -0.35, 255, 127, 33 -0.355, 255, 124, 32 -0.36, 255, 121, 31 -0.365, 255, 118, 31 -0.37, 255, 115, 30 -0.375, 255, 112, 30 -0.38, 255, 109, 29 -0.385, 255, 106, 28 -0.39, 255, 103, 28 -0.395, 255, 100, 27 -0.4, 255, 98, 27 -0.405, 255, 94, 26 -0.41, 255, 91, 25 -0.415, 255, 88, 24 -0.42, 255, 85, 24 -0.425, 255, 82, 23 -0.43, 255, 78, 22 -0.435, 255, 75, 22 -0.44, 255, 72, 21 -0.445, 255, 69, 20 -0.45, 255, 66, 20 -0.455, 254, 63, 19 -0.46, 253, 60, 19 -0.465, 252, 58, 18 -0.47, 251, 55, 18 -0.475, 250, 53, 18 -0.48, 249, 50, 17 -0.485, 248, 47, 17 -0.49, 247, 45, 16 -0.495, 246, 42, 16 -0.5, 245, 40, 16 -0.505, 243, 38, 15 -0.51, 242, 36, 15 -0.515, 240, 34, 14 -0.52, 239, 32, 14 -0.525, 238, 30, 13 -0.53, 236, 28, 13 -0.535, 235, 26, 12 -0.54, 233, 24, 12 -0.545, 232, 22, 11 -0.55, 231, 20, 11 -0.555, 229, 18, 11 -0.56, 227, 17, 11 -0.565, 225, 16, 11 -0.57, 223, 14, 11 -0.575, 221, 13, 11 -0.58, 219, 12, 11 -0.585, 217, 10, 11 -0.59, 215, 9, 11 -0.595, 213, 8, 11 -0.6, 211, 7, 12 -0.605, 208, 6, 12 -0.61, 206, 5, 12 -0.615, 204, 4, 12 -0.62, 201, 4, 12 -0.625, 199, 3, 13 -0.63, 197, 2, 13 -0.635, 194, 2, 13 -0.64, 192, 1, 13 -0.645, 190, 0, 13 -0.65, 188, 0, 14 -0.655, 184, 0, 14 -0.66, 181, 0, 14 -0.665, 178, 0, 14 -0.67, 174, 0, 14 -0.675, 171, 0, 14 -0.68, 168, 0, 14 -0.685, 164, 0, 14 -0.69, 161, 0, 14 -0.695, 158, 0, 14 -0.7, 155, 0, 14 -1.13, 152, 0, 14 -1.56, 149, 0, 14 -1.99, 146, 0, 14 -2.42, 143, 0, 14 -2.85, 140, 0, 14 -3.28, 137, 0, 14 -3.71, 134, 0, 14 -4.14, 131, 0, 14 -4.57, 128, 0, 14 -5, 125, 0, 14 diff --git a/satpy/etc/colormaps/angstrom_exponent.csv b/satpy/etc/colormaps/angstrom_exponent.csv deleted file mode 100644 index a14ecd17d4..0000000000 --- a/satpy/etc/colormaps/angstrom_exponent.csv +++ /dev/null @@ -1,251 +0,0 @@ -0, 122, 145, 2 -0.01, 123, 148, 3 -0.02, 124, 150, 4 -0.03, 124, 153, 5 -0.04, 125, 155, 6 -0.05, 126, 158, 7 -0.06, 127, 160, 8 -0.07, 127, 163, 9 -0.08, 128, 165, 10 -0.09, 129, 168, 11 -0.1, 130, 170, 12 -0.11, 130, 173, 13 -0.12, 131, 175, 14 -0.13, 132, 178, 15 -0.14, 133, 181, 16 -0.15, 132, 183, 18 -0.16, 132, 185, 20 -0.17, 132, 187, 22 -0.18, 132, 189, 25 -0.19, 132, 191, 27 -0.2, 132, 193, 29 -0.21, 132, 195, 31 -0.22, 131, 197, 34 -0.23, 131, 199, 36 -0.24, 131, 201, 38 -0.25, 131, 203, 40 -0.26, 131, 205, 43 -0.27, 131, 207, 45 -0.28, 131, 209, 47 -0.29, 131, 212, 50 -0.3, 130, 213, 51 -0.31, 129, 215, 53 -0.32, 128, 217, 55 -0.33, 128, 219, 57 -0.34, 127, 221, 59 -0.35, 126, 222, 61 -0.36, 125, 224, 63 -0.37, 125, 226, 64 -0.38, 124, 228, 66 -0.39, 123, 230, 68 -0.4, 122, 231, 70 -0.41, 122, 233, 72 -0.42, 121, 235, 74 -0.43, 120, 237, 76 -0.44, 120, 239, 78 -0.45, 119, 239, 79 -0.46, 118, 240, 80 -0.47, 117, 241, 82 -0.48, 116, 242, 83 -0.49, 116, 243, 85 -0.5, 115, 244, 86 -0.51, 114, 245, 87 -0.52, 113, 246, 89 -0.53, 112, 247, 90 -0.54, 112, 248, 92 -0.55, 111, 249, 93 -0.56, 110, 250, 94 -0.57, 109, 251, 96 -0.58, 108, 252, 97 -0.59, 108, 253, 99 -0.6, 107, 252, 100 -0.61, 106, 252, 102 -0.62, 106, 252, 103 -0.63, 105, 251, 105 -0.64, 105, 251, 106 -0.65, 104, 251, 108 -0.66, 103, 251, 109 -0.67, 103, 250, 111 -0.68, 102, 250, 112 -0.69, 102, 250, 114 -0.7, 101, 250, 115 -0.71, 100, 249, 117 -0.72, 100, 249, 118 -0.73, 99, 249, 120 -0.74, 99, 249, 122 -0.75, 98, 247, 123 -0.76, 97, 246, 124 -0.77, 96, 245, 126 -0.78, 95, 244, 127 -0.79, 94, 243, 128 -0.8, 93, 242, 130 -0.81, 92, 241, 131 -0.82, 92, 239, 132 -0.83, 91, 238, 134 -0.84, 90, 237, 135 -0.85, 89, 236, 136 -0.86, 88, 235, 138 -0.87, 87, 234, 139 -0.88, 86, 233, 140 -0.89, 86, 232, 142 -0.9, 85, 230, 143 -0.91, 84, 229, 144 -0.92, 83, 228, 145 -0.93, 82, 226, 147 -0.94, 81, 225, 148 -0.95, 80, 224, 149 -0.96, 79, 223, 150 -0.97, 78, 221, 152 -0.98, 77, 220, 153 -0.99, 76, 219, 154 -1, 75, 218, 155 -1.01, 74, 216, 157 -1.02, 73, 215, 158 -1.03, 72, 214, 159 -1.04, 72, 213, 161 -1.05, 71, 211, 162 -1.06, 70, 209, 163 -1.07, 69, 208, 164 -1.08, 68, 206, 165 -1.09, 67, 205, 166 -1.1, 66, 203, 167 -1.11, 65, 201, 168 -1.12, 64, 200, 170 -1.13, 63, 198, 171 -1.14, 62, 197, 172 -1.15, 61, 195, 173 -1.16, 60, 193, 174 -1.17, 59, 192, 175 -1.18, 58, 190, 176 -1.19, 58, 189, 178 -1.2, 58, 187, 178 -1.21, 58, 185, 179 -1.22, 58, 184, 180 -1.23, 58, 182, 181 -1.24, 58, 181, 182 -1.25, 58, 179, 183 -1.26, 58, 178, 184 -1.27, 59, 176, 184 -1.28, 59, 175, 185 -1.29, 59, 173, 186 -1.3, 59, 172, 187 -1.31, 59, 170, 188 -1.32, 59, 169, 189 -1.33, 59, 167, 190 -1.34, 60, 166, 191 -1.35, 60, 164, 191 -1.36, 61, 162, 192 -1.37, 61, 160, 193 -1.38, 62, 158, 194 -1.39, 63, 156, 195 -1.4, 63, 154, 195 -1.41, 64, 152, 196 -1.42, 64, 150, 197 -1.43, 65, 148, 198 -1.44, 66, 146, 199 -1.45, 66, 144, 199 -1.46, 67, 142, 200 -1.47, 67, 140, 201 -1.48, 68, 138, 202 -1.49, 69, 137, 203 -1.5, 69, 135, 203 -1.51, 70, 133, 204 -1.52, 70, 131, 205 -1.53, 71, 129, 205 -1.54, 72, 128, 206 -1.55, 72, 126, 207 -1.56, 73, 124, 207 -1.57, 73, 122, 208 -1.58, 74, 120, 209 -1.59, 75, 119, 209 -1.6, 75, 117, 210 -1.61, 76, 115, 211 -1.62, 76, 113, 211 -1.63, 77, 111, 212 -1.64, 78, 110, 213 -1.65, 78, 108, 213 -1.66, 79, 106, 214 -1.67, 80, 104, 214 -1.68, 80, 102, 215 -1.69, 81, 101, 216 -1.7, 82, 99, 216 -1.71, 82, 97, 217 -1.72, 83, 95, 217 -1.73, 84, 93, 218 -1.74, 84, 92, 219 -1.75, 85, 90, 219 -1.76, 86, 88, 220 -1.77, 86, 86, 220 -1.78, 87, 84, 221 -1.79, 88, 83, 222 -1.8, 88, 82, 222 -1.81, 89, 81, 223 -1.82, 90, 80, 223 -1.83, 91, 80, 224 -1.84, 92, 79, 224 -1.85, 93, 78, 225 -1.86, 94, 77, 225 -1.87, 95, 77, 226 -1.88, 96, 76, 226 -1.89, 97, 75, 227 -1.9, 98, 74, 227 -1.91, 99, 74, 228 -1.92, 100, 73, 228 -1.93, 101, 72, 229 -1.94, 102, 72, 230 -1.95, 104, 72, 230 -1.96, 106, 73, 230 -1.97, 108, 73, 230 -1.98, 110, 74, 231 -1.99, 112, 74, 231 -2, 114, 75, 231 -2.01, 116, 75, 231 -2.02, 118, 76, 232 -2.03, 120, 76, 232 -2.04, 122, 77, 232 -2.05, 124, 77, 232 -2.06, 126, 78, 233 -2.07, 128, 78, 233 -2.08, 130, 79, 233 -2.09, 133, 80, 234 -2.1, 135, 80, 234 -2.11, 137, 80, 234 -2.12, 139, 81, 234 -2.13, 141, 81, 234 -2.14, 143, 81, 234 -2.15, 145, 82, 234 -2.16, 147, 82, 234 -2.17, 149, 82, 234 -2.18, 151, 83, 234 -2.19, 153, 83, 234 -2.2, 155, 83, 234 -2.21, 157, 84, 234 -2.22, 159, 84, 234 -2.23, 161, 84, 234 -2.24, 164, 85, 235 -2.25, 165, 85, 235 -2.26, 166, 85, 235 -2.27, 168, 85, 235 -2.28, 169, 85, 235 -2.29, 171, 85, 235 -2.3, 172, 85, 235 -2.31, 174, 85, 235 -2.32, 175, 86, 235 -2.33, 177, 86, 235 -2.34, 178, 86, 235 -2.35, 180, 86, 235 -2.36, 181, 86, 235 -2.37, 183, 86, 235 -2.38, 184, 86, 235 -2.39, 186, 87, 235 -2.4, 187, 87, 234 -2.41, 188, 87, 234 -2.42, 190, 87, 234 -2.43, 191, 88, 234 -2.44, 193, 88, 234 -2.45, 194, 88, 234 -2.46, 196, 88, 234 -2.47, 197, 89, 234 -2.48, 199, 89, 234 -2.49, 200, 89, 234 -2.5, 202, 89, 234 diff --git a/satpy/etc/colormaps/clear_sky_confidence.csv b/satpy/etc/colormaps/clear_sky_confidence.csv deleted file mode 100644 index c4743b694b..0000000000 --- a/satpy/etc/colormaps/clear_sky_confidence.csv +++ /dev/null @@ -1,101 +0,0 @@ -0, 255, 247, 236 -0.01, 254, 246, 233 -0.02, 254, 244, 230 -0.03, 254, 243, 228 -0.04, 254, 242, 224 -0.05, 254, 241, 222 -0.06, 254, 239, 219 -0.07, 254, 239, 216 -0.08, 254, 237, 213 -0.09, 254, 236, 210 -0.1, 254, 235, 207 -0.11, 254, 233, 204 -0.12, 254, 232, 202 -0.13, 253, 231, 198 -0.14, 253, 230, 195 -0.15, 253, 228, 191 -0.16, 253, 226, 189 -0.17, 253, 225, 185 -0.18, 253, 223, 181 -0.19, 253, 221, 178 -0.2, 253, 220, 174 -0.21, 253, 218, 172 -0.22, 253, 216, 168 -0.23, 253, 215, 165 -0.24, 253, 213, 161 -0.25, 253, 211, 157 -0.26, 253, 210, 156 -0.27, 253, 207, 153 -0.28, 253, 206, 152 -0.29, 253, 203, 149 -0.3, 253, 202, 148 -0.31, 253, 200, 145 -0.32, 253, 198, 143 -0.33, 253, 196, 141 -0.34, 253, 193, 139 -0.35, 253, 192, 137 -0.36, 253, 189, 134 -0.37, 253, 188, 133 -0.38, 252, 185, 130 -0.39, 252, 182, 127 -0.4, 252, 177, 123 -0.41, 252, 174, 120 -0.42, 252, 170, 116 -0.43, 252, 166, 112 -0.44, 252, 163, 109 -0.45, 252, 159, 105 -0.46, 252, 156, 103 -0.47, 252, 151, 99 -0.48, 252, 148, 96 -0.49, 252, 144, 92 -0.5, 251, 140, 88 -0.51, 250, 137, 87 -0.52, 249, 134, 86 -0.53, 248, 131, 85 -0.54, 247, 127, 83 -0.55, 246, 125, 82 -0.56, 245, 121, 80 -0.57, 244, 119, 79 -0.58, 243, 115, 78 -0.59, 242, 111, 76 -0.6, 241, 109, 75 -0.61, 240, 105, 73 -0.62, 239, 102, 72 -0.63, 237, 98, 69 -0.64, 236, 94, 67 -0.65, 234, 89, 63 -0.66, 232, 86, 60 -0.67, 230, 81, 57 -0.68, 227, 76, 53 -0.69, 226, 73, 50 -0.7, 224, 68, 46 -0.71, 222, 65, 44 -0.72, 220, 60, 40 -0.73, 218, 56, 37 -0.74, 216, 51, 33 -0.75, 214, 46, 30 -0.76, 211, 43, 28 -0.77, 208, 39, 25 -0.78, 206, 36, 23 -0.79, 202, 31, 20 -0.8, 200, 28, 188 -0.81, 197, 24, 15 -0.82, 194, 21, 13 -0.83, 191, 16, 10 -0.84, 188, 12, 7 -0.85, 185, 9, 5 -0.86, 182, 4, 3 -0.87, 180, 1, 1 -0.88, 175, 0, 0 -0.89, 172, 0, 0 -0.9, 167, 0, 0 -0.91, 164, 0, 0 -0.92, 159, 0, 0 -0.93, 154, 0, 0 -0.94, 151, 0, 0 -0.95, 146, 0, 0 -0.96, 143, 0, 0 -0.97, 138, 0, 0 -0.98, 135, 0, 0 -0.99, 130, 0, 0 -1, 127, 0, 0 diff --git a/satpy/etc/colormaps/cloud_top_height.csv b/satpy/etc/colormaps/cloud_top_height.csv deleted file mode 100644 index d1fa053029..0000000000 --- a/satpy/etc/colormaps/cloud_top_height.csv +++ /dev/null @@ -1,32 +0,0 @@ -0 , 255 , 0 , 0 -800 , 255 , 0 , 0 -800.0001 , 170 , 0 , 0 -1600 , 170 , 0 , 0 -1600.0001 , 110 , 0 , 0 -2350 , 110 , 0 , 0 -2350.0001 , 112 , 1 , 2 -3150 , 112 , 1 , 2 -3150.0001 , 124 , 91 , 5 -4000 , 124 , 91 , 5 -4000.0001 , 240 , 190 , 64 -4800 , 240 , 190 , 64 -4800.0001 , 255 , 255 , 0 -5600 , 255 , 255 , 0 -5600.0001 , 0 , 220 , 0 -6400 , 0 , 220 , 0 -6400.0001 , 0 , 136 , 0 -7200 , 0 , 136 , 0 -7200.0001 , 0 , 80 , 0 -8000 , 0 , 80 , 0 -8000.0001 , 0 , 136 , 238 -8800 , 0 , 136 , 238 -8800.0001 , 0 , 0 , 255 -9600 , 0 , 0 , 255 -9600.0001 , 0 , 0 , 170 -10400 , 0 , 0 , 170 -10400.0001 , 0 , 0 , 100 -11200 , 0 , 0 , 100 -11200.0001 , 183 , 15 , 141 -12000 , 183 , 15 , 141 -12000.0001 , 102 , 0 , 119 -18000 , 102 , 0 , 119 diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index e79ec953fb..8441ac8729 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1231,8 +1231,9 @@ enhancements: min_stretch: [0,0,0] max_stretch: [1,1,1] - Cloud_Top_Height: - standard_name: cldprop_cloud_top_height + cloud_top_height: + name: Cloud_Top_Height + reader: viirs_l2 operations: - name: colorize method: !!python/name:satpy.enhancements.colorize @@ -1242,8 +1243,9 @@ enhancements: filename: colormaps/cloud_top_height.csv } - Clear_Sky_Confidence: - standard_name: cldmsk_clear_sky_confidence + clear_sky_confidence: + name: Clear_Sky_Confidence + reader: viirs_l2 operations: - name: colorize method: !!python/name:satpy.enhancements.colorize @@ -1253,8 +1255,9 @@ enhancements: filename: colormaps/clear_sky_confidence.csv } - Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate: - standard_name: aerdb_aerosol_optical_thickness_500_land_ocean + aerosol_optical_thickness_550_land_ocean_best_estimate: + name: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate + reader: viirs_l2 operations: - name: colorize method: !!python/name:satpy.enhancements.colorize @@ -1264,8 +1267,9 @@ enhancements: filename: colormaps/aerosol_thickness.csv } - Angstrom_Exponent_Land_Ocean_Best_Estimate: - standard_name: aerdb_angstrom_exponent_land_ocean_best_estimate + angstrom_exponent_land_ocean_best_estimate: + name: Angstrom_Exponent_Land_Ocean_Best_Estimate + reader: viirs_l2 operations: - name: colorize method: !!python/name:satpy.enhancements.colorize diff --git a/satpy/etc/readers/viirs_l2.yaml b/satpy/etc/readers/viirs_l2.yaml index 9df5df3597..bfeadab6b9 100644 --- a/satpy/etc/readers/viirs_l2.yaml +++ b/satpy/etc/readers/viirs_l2.yaml @@ -89,7 +89,7 @@ datasets: coordinates: [cld_lon, cld_lat] file_key: geophysical_data/Clear_Sky_Confidence file_type: cldmsk_l2_viirs - standard_name: cldmsk_clear_sky_confidence + standard_name: clear_sky_confidence ################################### # Datasets in file cldprop_l2_viirs @@ -101,7 +101,7 @@ datasets: coordinates: [cld_lon,cld_lat] file_key: geophysical_data/Cloud_Top_Height file_type: cldprop_l2_viirs - standard_name: cldprop_cloud_top_height + standard_name: cloud_top_height ########################################## # Datasets in files aerdb_l2_viirs @@ -113,7 +113,7 @@ datasets: coordinates: [aerdb_lon,aerdb_lat] file_key: Angstrom_Exponent_Land_Ocean_Best_Estimate file_type: [aerdb_l2_viirs] - standard_name: aerdb_angstrom_exponent_land_ocean_best_estimate + standard_name: angstrom_exponent_land_ocean_best_estimate Aerosol_Optical_Thickness_550_Land_Ocean: name: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate @@ -122,4 +122,4 @@ datasets: coordinates: [aerdb_lon,aerdb_lat] file_key: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate file_type: [aerdb_l2_viirs] - standard_name: aerdb_aerosol_optical_thickness_500_land_ocean + standard_name: aerosol_optical_thickness_550_land_ocean From 5320bcae8889692eff6b57436a2d66c99239d295 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Tue, 20 Feb 2024 18:24:15 +0100 Subject: [PATCH 221/481] Fix concurrency group in ci --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2716e7f792..c472709bc8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,7 +2,7 @@ name: CI # https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#concurrency # https://docs.github.com/en/developers/webhooks-and-events/events/github-event-types#pullrequestevent concurrency: - group: ${{ github.workflow }}-${{ github.event.number }}-${{ github.event.type }} + group: ${{ github.workflow }}-${{ github.event.number || github.event.ref }}-${{ github.event.type }} cancel-in-progress: true on: [push, pull_request] From fe2a54b8587c5573d1f9d77ac72178de1a9e8707 Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Tue, 20 Feb 2024 19:44:33 +0000 Subject: [PATCH 222/481] Add tests for MERSI-RM reader. --- satpy/tests/reader_tests/test_mersi_l1b.py | 134 +++++++++++++++++++-- 1 file changed, 127 insertions(+), 7 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 1df0d41f12..54bd46294b 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -27,9 +27,9 @@ from satpy.tests.reader_tests.test_hdf5_utils import FakeHDF5FileHandler -def _get_calibration(num_scans): +def _get_calibration(num_scans, ftype): calibration = { - "Calibration/VIS_Cal_Coeff": + f"Calibration/{ftype}_Cal_Coeff": xr.DataArray( da.ones((19, 3), chunks=1024), attrs={"Slope": np.array([1.] * 19), "Intercept": np.array([0.] * 19)}, @@ -87,6 +87,37 @@ def _get_250m_data(num_scans, rows_per_scan, num_cols): return data +def _get_500m_data(num_scans, rows_per_scan, num_cols): + data = { + "Data/EV_Reflectance": + xr.DataArray( + da.ones((5, num_scans * rows_per_scan, num_cols), chunks=1024, + dtype=np.uint16), + attrs={ + "Slope": np.array([1.] * 5), "Intercept": np.array([0.] * 5), + "FillValue": 65535, + "units": "NO", + "valid_range": [0, 4095], + "long_name": b"500m Earth View Science Data", + }, + dims=("_ref_bands", "_rows", "_cols")), + "Data/EV_Emissive": + xr.DataArray( + da.ones((3, num_scans * rows_per_scan, num_cols), chunks=1024, + dtype=np.uint16), + attrs={ + "Slope": np.array([1.] * 3), "Intercept": np.array([0.] * 3), + "FillValue": 65535, + "units": "mW/ (m2 cm-1 sr)", + "valid_range": [0, 25000], + "long_name": b"500m Emissive Bands Earth View " + b"Science Data", + }, + dims=("_ir_bands", "_rows", "_cols")), + } + return data + + def _get_1km_data(num_scans, rows_per_scan, num_cols): data = { "Data/EV_1KM_LL": @@ -236,24 +267,30 @@ def get_test_content(self, filename, filename_info, filetype_info): "/attr/Observing Ending Time": "18:38:36.728", } - global_attrs = self._set_sensor_attrs(global_attrs) + global_attrs, ftype = self._set_sensor_attrs(global_attrs) self._add_tbb_coefficients(global_attrs) data = self._get_data_file_content() test_content = {} test_content.update(global_attrs) test_content.update(data) - test_content.update(_get_calibration(self.num_scans)) + test_content.update(_get_calibration(self.num_scans, ftype)) return test_content def _set_sensor_attrs(self, global_attrs): if "mersi2_l1b" in self.filetype_info["file_type"]: global_attrs["/attr/Satellite Name"] = "FY-3D" global_attrs["/attr/Sensor Identification Code"] = "MERSI" + ftype = "VIS" elif "mersi_ll" in self.filetype_info["file_type"]: global_attrs["/attr/Satellite Name"] = "FY-3E" global_attrs["/attr/Sensor Identification Code"] = "MERSI LL" - return global_attrs + ftype = "VIS" + elif "mersi_rm" in self.filetype_info["file_type"]: + global_attrs["/attr/Satellite Name"] = "FY-3G" + global_attrs["/attr/Sensor Identification Code"] = "MERSI RM" + ftype = "RSB" + return global_attrs, ftype def _get_data_file_content(self): if "_geo" in self.filetype_info["file_type"]: @@ -272,8 +309,16 @@ def _add_band_data_file_content(self): num_scans = self.num_scans rows_per_scan = self._rows_per_scan is_mersi2 = self.filetype_info["file_type"].startswith("mersi2_") + is_mersill = self.filetype_info["file_type"].startswith("mersi_ll") is_1km = "_1000" in self.filetype_info["file_type"] - data_func = _get_1km_data if is_1km else (_get_250m_data if is_mersi2 else _get_250m_ll_data) + if is_1km: + data_func = _get_1km_data + elif is_mersi2: + data_func = _get_250m_data + elif is_mersill: + data_func = _get_250m_ll_data + else: + data_func = _get_500m_data return data_func(num_scans, rows_per_scan, num_cols) def _add_tbb_coefficients(self, global_attrs): @@ -293,7 +338,12 @@ def _num_cols_for_file_type(self): @property def _geo_prefix_for_file_type(self): - return "Geolocation/" if "1000" in self.filetype_info["file_type"] else "" + if "1000" in self.filetype_info["file_type"]: + return "Geolocation/" + elif "500" in self.filetype_info["file_type"]: + return "Geolocation/" + else: + return "" def _test_helper(res): @@ -745,3 +795,73 @@ def test_250_resolutions(self): assert (2 * 40, 2048 * 2) == res["7"].shape assert "brightness_temperature" == res["7"].attrs["calibration"] assert "K" == res["7"].attrs["units"] + + +class TestMERSIRML1B(MERSIL1BTester): + """Test the FY3E MERSI-RM L1B reader.""" + + yaml_file = "mersi_rm_l1b.yaml" + filenames_500m = ["FY3G_MERSI_GRAN_L1_20230410_1910_0500M_V1.HDF", + "FY3G_MERSI_GRAN_L1_20230410_1910_GEOHK_V1.HDF", + ] + + def test_500m_resolution(self): + """Test loading data when all resolutions are available.""" + from satpy.dataset.data_dict import get_key + from satpy.readers import load_reader + from satpy.utils import debug_on + debug_on() + from satpy.tests.utils import make_dataid + filenames = self.filenames_500m + print(filenames) + reader = load_reader(self.reader_configs) + files = reader.select_files_from_pathnames(filenames) + assert 2 == len(files) + reader.create_filehandlers(files) + # Make sure we have some files + assert reader.file_handlers + + res = reader.load(["1", "2", "4", "7"]) + assert len(res) == 4 + assert res["4"].shape == (2 * 10, 4096) + assert res["1"].attrs["calibration"] == "reflectance" + assert res["1"].attrs["units"] == "%" + assert res["2"].shape == (2 * 10, 4096) + assert res["2"].attrs["calibration"] == "reflectance" + assert res["2"].attrs["units"] == "%" + assert res["7"].shape == (20, 2048 * 2) + assert res["7"].attrs["calibration"] == "brightness_temperature" + assert res["7"].attrs["units"] == "K" + + def test_rad_calib(self): + """Test loading data at radiance calibration.""" + from satpy.readers import load_reader + from satpy.tests.utils import make_dataid + filenames = self.filenames_500m + reader = load_reader(self.reader_configs) + files = reader.select_files_from_pathnames(filenames) + assert 2 == len(files) + reader.create_filehandlers(files) + # Make sure we have some files + assert reader.file_handlers + + ds_ids = [] + for band_name in ["1", "3", "4", "6", "7"]: + ds_ids.append(make_dataid(name=band_name, calibration="radiance")) + res = reader.load(ds_ids) + assert len(res) == 5 + assert res["1"].shape == (20, 4096) + assert res["1"].attrs["calibration"] == "radiance" + assert res["1"].attrs["units"] == "mW/ (m2 cm-1 sr)" + assert res["3"].shape == (20, 4096) + assert res["3"].attrs["calibration"] == "radiance" + assert res["3"].attrs["units"] == "mW/ (m2 cm-1 sr)" + assert res["4"].shape == (20, 4096) + assert res["4"].attrs["calibration"] == "radiance" + assert res["4"].attrs["units"] == "mW/ (m2 cm-1 sr)" + assert res["6"].shape == (20, 4096) + assert res["6"].attrs["calibration"] == "radiance" + assert res["6"].attrs["units"] == "mW/ (m2 cm-1 sr)" + assert res["7"].shape == (20, 4096) + assert res["7"].attrs["calibration"] == "radiance" + assert res["7"].attrs["units"] == "mW/ (m2 cm-1 sr)" From 8c18deaaadf98d3bd995fdbde38ffe58698fd9eb Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Tue, 20 Feb 2024 19:46:58 +0000 Subject: [PATCH 223/481] Update tests for MERSI-RM reader. --- satpy/tests/reader_tests/test_mersi_l1b.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 54bd46294b..1b3d280566 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -807,13 +807,8 @@ class TestMERSIRML1B(MERSIL1BTester): def test_500m_resolution(self): """Test loading data when all resolutions are available.""" - from satpy.dataset.data_dict import get_key from satpy.readers import load_reader - from satpy.utils import debug_on - debug_on() - from satpy.tests.utils import make_dataid filenames = self.filenames_500m - print(filenames) reader = load_reader(self.reader_configs) files = reader.select_files_from_pathnames(filenames) assert 2 == len(files) From c986144ce37d90d3c93c7563800993b72d1d87e3 Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Wed, 21 Feb 2024 08:59:58 +0100 Subject: [PATCH 224/481] Update satpy/tests/reader_tests/test_mersi_l1b.py Co-authored-by: Martin Raspaud --- satpy/tests/reader_tests/test_mersi_l1b.py | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 1b3d280566..5ec016d456 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -840,23 +840,13 @@ def test_rad_calib(self): # Make sure we have some files assert reader.file_handlers + band_names = ["1", "3", "4", "6", "7"] ds_ids = [] - for band_name in ["1", "3", "4", "6", "7"]: + for band_name in band_names: ds_ids.append(make_dataid(name=band_name, calibration="radiance")) res = reader.load(ds_ids) assert len(res) == 5 - assert res["1"].shape == (20, 4096) - assert res["1"].attrs["calibration"] == "radiance" - assert res["1"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["3"].shape == (20, 4096) - assert res["3"].attrs["calibration"] == "radiance" - assert res["3"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["4"].shape == (20, 4096) - assert res["4"].attrs["calibration"] == "radiance" - assert res["4"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["6"].shape == (20, 4096) - assert res["6"].attrs["calibration"] == "radiance" - assert res["6"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["7"].shape == (20, 4096) - assert res["7"].attrs["calibration"] == "radiance" - assert res["7"].attrs["units"] == "mW/ (m2 cm-1 sr)" + for band name in band_names: + assert res[band_name].shape == (20, 4096) + assert res[band_name].attrs["calibration"] == "radiance" + assert res[band_name].attrs["units"] == "mW/ (m2 cm-1 sr)" From ed751f86d51c9a803f5169e23d2064948fd75b44 Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Wed, 21 Feb 2024 09:01:18 +0100 Subject: [PATCH 225/481] Fix typo in MERSI tests. --- satpy/tests/reader_tests/test_mersi_l1b.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 5ec016d456..a3145d3f76 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -846,7 +846,7 @@ def test_rad_calib(self): ds_ids.append(make_dataid(name=band_name, calibration="radiance")) res = reader.load(ds_ids) assert len(res) == 5 - for band name in band_names: + for band_name in band_names: assert res[band_name].shape == (20, 4096) assert res[band_name].attrs["calibration"] == "radiance" assert res[band_name].attrs["units"] == "mW/ (m2 cm-1 sr)" From ef357a5423c960cf02602e83ac65b8bf32c1cc39 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Wed, 21 Feb 2024 12:27:06 +0100 Subject: [PATCH 226/481] Update changelog for v0.47.0 --- CHANGELOG.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8730209f99..52d47ad47f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,79 @@ +## Version 0.47.0 (2024/02/21) + +### Issues Closed + +* [Issue 2734](https://github.com/pytroll/satpy/issues/2734) - Using a static image alters time information ([PR 2737](https://github.com/pytroll/satpy/pull/2737) by [@pnuu](https://github.com/pnuu)) +* [Issue 2723](https://github.com/pytroll/satpy/issues/2723) - MODIS Satpy scene Don't know how to open the following files: {'MOD021KM.A2017131.1325.061.2017314123114.hdf'} +* [Issue 2719](https://github.com/pytroll/satpy/issues/2719) - Add lat lon to Seviri plots +* [Issue 2718](https://github.com/pytroll/satpy/issues/2718) - Set invert as a modifier when do composite +* [Issue 2712](https://github.com/pytroll/satpy/issues/2712) - mitiff writer add config option to add or not to add the size of a pixel in the proj string ([PR 2713](https://github.com/pytroll/satpy/pull/2713) by [@TAlonglong](https://github.com/TAlonglong)) +* [Issue 2710](https://github.com/pytroll/satpy/issues/2710) - scene.save_datasets() outputs different values for AHI_HSD reader with calibration="brightness_temperature" +* [Issue 2708](https://github.com/pytroll/satpy/issues/2708) - this is regarding slstr_l1b geometry +* [Issue 2703](https://github.com/pytroll/satpy/issues/2703) - read swath in loop +* [Issue 2680](https://github.com/pytroll/satpy/issues/2680) - satpy_cf_nc reader cannot read FCI file written with cf writer +* [Issue 2672](https://github.com/pytroll/satpy/issues/2672) - Changes in NWC SAF GEO v2021 data ([PR 2673](https://github.com/pytroll/satpy/pull/2673) by [@pnuu](https://github.com/pnuu)) +* [Issue 2630](https://github.com/pytroll/satpy/issues/2630) - wrong start_time with BackgroundCompositor ([PR 2737](https://github.com/pytroll/satpy/pull/2737) by [@pnuu](https://github.com/pnuu)) +* [Issue 2447](https://github.com/pytroll/satpy/issues/2447) - add more options to time handling in combine_metadata ([PR 2737](https://github.com/pytroll/satpy/pull/2737) by [@pnuu](https://github.com/pnuu)) +* [Issue 2446](https://github.com/pytroll/satpy/issues/2446) - combine metadata in `MultiFiller` ([PR 2737](https://github.com/pytroll/satpy/pull/2737) by [@pnuu](https://github.com/pnuu)) +* [Issue 2427](https://github.com/pytroll/satpy/issues/2427) - Wrong start_time, end_time attributes after MultiScene.blend(blend_function=timeseries) ([PR 2737](https://github.com/pytroll/satpy/pull/2737) by [@pnuu](https://github.com/pnuu)) +* [Issue 2319](https://github.com/pytroll/satpy/issues/2319) - slstr_l2.yaml points to deleted slstr_l2.py ([PR 2731](https://github.com/pytroll/satpy/pull/2731) by [@djhoese](https://github.com/djhoese)) +* [Issue 1921](https://github.com/pytroll/satpy/issues/1921) - Standardize dataset information for SEVIRI and FCI L2 products +* [Issue 1174](https://github.com/pytroll/satpy/issues/1174) - combine_metadata only supports the average of time attrs ([PR 2737](https://github.com/pytroll/satpy/pull/2737) by [@pnuu](https://github.com/pnuu)) + +In this release 17 issues were closed. + +### Pull Requests Merged + +#### Bugs fixed + +* [PR 2743](https://github.com/pytroll/satpy/pull/2743) - Fix nominal time attributes in SEVIRI HRIT ([](https://github.com/`nominal_start/issues/)) +* [PR 2742](https://github.com/pytroll/satpy/pull/2742) - Fix nominal end time in AHI HSD +* [PR 2737](https://github.com/pytroll/satpy/pull/2737) - Change `start_time` and `end_time` handling in `combine_metadata` ([2734](https://github.com/pytroll/satpy/issues/2734), [2630](https://github.com/pytroll/satpy/issues/2630), [2447](https://github.com/pytroll/satpy/issues/2447), [2446](https://github.com/pytroll/satpy/issues/2446), [2427](https://github.com/pytroll/satpy/issues/2427), [1174](https://github.com/pytroll/satpy/issues/1174)) +* [PR 2731](https://github.com/pytroll/satpy/pull/2731) - Remove slstr_l2 reader in favor of ghrsst_l2 ([2319](https://github.com/pytroll/satpy/issues/2319)) +* [PR 2730](https://github.com/pytroll/satpy/pull/2730) - Pin pytest to fix CI +* [PR 2726](https://github.com/pytroll/satpy/pull/2726) - Fix AGRI L1 C07 having a valid LUT value for its fill value ([565](https://github.com/ssec/polar2grid/issues/565)) +* [PR 2713](https://github.com/pytroll/satpy/pull/2713) - Add kwargs config option to turn off mitiff corner correction ([2712](https://github.com/pytroll/satpy/issues/2712)) +* [PR 2711](https://github.com/pytroll/satpy/pull/2711) - Add support for NOAA-21 in MiRS limb correction +* [PR 2707](https://github.com/pytroll/satpy/pull/2707) - Fix 'viirs_edr' renaming two sets of dimensions to the same names +* [PR 2700](https://github.com/pytroll/satpy/pull/2700) - Fix eps_l1b reader Delayed usage causing docs failures + +#### Features added + +* [PR 2746](https://github.com/pytroll/satpy/pull/2746) - Fix concurrency group in ci +* [PR 2745](https://github.com/pytroll/satpy/pull/2745) - Sort reader table by name + diverse fixes +* [PR 2744](https://github.com/pytroll/satpy/pull/2744) - Fix cutoffs for night_ir_alpha and bump up trollimage version +* [PR 2737](https://github.com/pytroll/satpy/pull/2737) - Change `start_time` and `end_time` handling in `combine_metadata` ([2734](https://github.com/pytroll/satpy/issues/2734), [2630](https://github.com/pytroll/satpy/issues/2630), [2447](https://github.com/pytroll/satpy/issues/2447), [2446](https://github.com/pytroll/satpy/issues/2446), [2427](https://github.com/pytroll/satpy/issues/2427), [1174](https://github.com/pytroll/satpy/issues/1174)) +* [PR 2728](https://github.com/pytroll/satpy/pull/2728) - Update asv dependencies +* [PR 2720](https://github.com/pytroll/satpy/pull/2720) - Add support for the MERSI-RM instrument on FY-3G +* [PR 2714](https://github.com/pytroll/satpy/pull/2714) - Add QC-based filtering to the VIIRS EDR AOD550 product +* [PR 2675](https://github.com/pytroll/satpy/pull/2675) - Make CF encoding of dataset attributes public +* [PR 2673](https://github.com/pytroll/satpy/pull/2673) - Add NWC SAF GEO v2021 ASIIF-TF and ASII-GW dataset names ([2672](https://github.com/pytroll/satpy/issues/2672)) +* [PR 2534](https://github.com/pytroll/satpy/pull/2534) - Add fsspec functionality to `viirs_sdr` reader +* [PR 2441](https://github.com/pytroll/satpy/pull/2441) - Add channel aliases to the CLAVRx reader to facilitate composites + +#### Documentation changes + +* [PR 2700](https://github.com/pytroll/satpy/pull/2700) - Fix eps_l1b reader Delayed usage causing docs failures + +#### Backward incompatible changes + +* [PR 2731](https://github.com/pytroll/satpy/pull/2731) - Remove slstr_l2 reader in favor of ghrsst_l2 ([2319](https://github.com/pytroll/satpy/issues/2319)) + +#### Refactoring + +* [PR 2699](https://github.com/pytroll/satpy/pull/2699) - Move Scene.to_hvplot internals to _scene_converters + +#### Clean ups + +* [PR 2711](https://github.com/pytroll/satpy/pull/2711) - Add support for NOAA-21 in MiRS limb correction +* [PR 2700](https://github.com/pytroll/satpy/pull/2700) - Fix eps_l1b reader Delayed usage causing docs failures +* [PR 2689](https://github.com/pytroll/satpy/pull/2689) - Fix/supress warnings in reader tests ([](https://github.com/and/issues/)) +* [PR 2665](https://github.com/pytroll/satpy/pull/2665) - FCI L2 CF harmonization +* [PR 2597](https://github.com/pytroll/satpy/pull/2597) - Update CI to test Python 3.12 + +In this release 29 pull requests were closed. + + ## Version 0.46.0 (2023/12/18) ### Issues Closed From 34492bc71273f5e8f284dbd35eb00cc960522409 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Wed, 21 Feb 2024 13:44:17 +0000 Subject: [PATCH 227/481] removed enhancements --- satpy/etc/enhancements/generic.yaml | 48 ----------------------------- 1 file changed, 48 deletions(-) diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index 8441ac8729..25680d6db9 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -1230,51 +1230,3 @@ enhancements: stretch: crude min_stretch: [0,0,0] max_stretch: [1,1,1] - - cloud_top_height: - name: Cloud_Top_Height - reader: viirs_l2 - operations: - - name: colorize - method: !!python/name:satpy.enhancements.colorize - kwargs: - palettes: - - { - filename: colormaps/cloud_top_height.csv - } - - clear_sky_confidence: - name: Clear_Sky_Confidence - reader: viirs_l2 - operations: - - name: colorize - method: !!python/name:satpy.enhancements.colorize - kwargs: - palettes: - - { - filename: colormaps/clear_sky_confidence.csv - } - - aerosol_optical_thickness_550_land_ocean_best_estimate: - name: Aerosol_Optical_Thickness_550_Land_Ocean_Best_Estimate - reader: viirs_l2 - operations: - - name: colorize - method: !!python/name:satpy.enhancements.colorize - kwargs: - palettes: - - { - filename: colormaps/aerosol_thickness.csv - } - - angstrom_exponent_land_ocean_best_estimate: - name: Angstrom_Exponent_Land_Ocean_Best_Estimate - reader: viirs_l2 - operations: - - name: colorize - method: !!python/name:satpy.enhancements.colorize - kwargs: - palettes: - - { - filename: colormaps/angstrom_exponent.csv - } From fd5655fb2d4140e10f26dc1ad2d797d7d0bc7874 Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Wed, 21 Feb 2024 14:02:51 +0000 Subject: [PATCH 228/481] added fsnrad file pattern --- satpy/etc/readers/viirs_l2.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/satpy/etc/readers/viirs_l2.yaml b/satpy/etc/readers/viirs_l2.yaml index bfeadab6b9..d4dceccccc 100644 --- a/satpy/etc/readers/viirs_l2.yaml +++ b/satpy/etc/readers/viirs_l2.yaml @@ -33,6 +33,7 @@ file_types: fsnrad_l2_viirs: file_reader: !!python/name:satpy.readers.viirs_l2.VIIRSL2FileHandler file_patterns: + - 'FSNRAD_L2_VIIRS_CRIS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' - 'FSNRAD_L2_VIIRS_CRIS_SS_{spacecraft_name:s}.A{start_time:%Y%j.%H%M}.{collection:03d}.{production_time:%Y%j%H%M%S}.nc' datasets: From 71c1af866c53e1e4664dbd8a67583245479d32bf Mon Sep 17 00:00:00 2001 From: Longtsing Date: Wed, 28 Feb 2024 11:44:39 +0800 Subject: [PATCH 229/481] Update _geos_area.py fix the document of get_area_extent function,add the description of parameter H --- satpy/readers/_geos_area.py | 1 + 1 file changed, 1 insertion(+) diff --git a/satpy/readers/_geos_area.py b/satpy/readers/_geos_area.py index 03dabfa9a0..f9c588b085 100644 --- a/satpy/readers/_geos_area.py +++ b/satpy/readers/_geos_area.py @@ -72,6 +72,7 @@ def get_area_extent(pdict): coff: Column offset factor loff: Line offset factor scandir: 'N2S' for standard (N->S), 'S2N' for inverse (S->N) + h: Altitude of satellite (m) Returns: aex: An area extent for the scene From 9a24fb92d54d0565ede542d5e3f2fe602efd646b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Mar 2024 10:55:38 +0000 Subject: [PATCH 230/481] Bump pypa/gh-action-pypi-publish from 1.8.11 to 1.8.12 Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.11 to 1.8.12. - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.11...v1.8.12) --- updated-dependencies: - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/deploy-sdist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-sdist.yaml b/.github/workflows/deploy-sdist.yaml index 9fd1d86b5a..450e47864c 100644 --- a/.github/workflows/deploy-sdist.yaml +++ b/.github/workflows/deploy-sdist.yaml @@ -23,7 +23,7 @@ jobs: - name: Publish package to PyPI if: github.event.action == 'published' - uses: pypa/gh-action-pypi-publish@v1.8.11 + uses: pypa/gh-action-pypi-publish@v1.8.12 with: user: __token__ password: ${{ secrets.pypi_password }} From ad3d2e4d19cd13de81d152acb383578a4ac3f2c3 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Tue, 5 Mar 2024 11:40:30 +0100 Subject: [PATCH 231/481] Refactor test --- satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index 883ac8c709..793e1527d7 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -95,13 +95,11 @@ def test_read_vgac(self, nc_filename): reader="viirs_vgac_l1c_nc", filenames=[nc_filename]) scn_.load(["M05", "M15", "scanline_timestamps"]) - assert ((scn_["scanline_timestamps"][0] - - np.datetime64("2023-03-28T09:08:07") - np.timedelta64(123, "ms")) < np.timedelta64(5, "us")) - assert ((scn_["scanline_timestamps"][-1] - np.datetime64("2023-03-28T10:11:12")) < np.timedelta64(5, "us")) - assert ((np.datetime64("2023-03-28T09:08:07") + np.timedelta64(123, "ms") - - scn_["scanline_timestamps"][0]) < np.timedelta64(5, "us")) - assert ((np.datetime64("2023-03-28T10:11:12") - scn_["scanline_timestamps"][-1]) < np.timedelta64(5, "us")) - + diff_s = (scn_["scanline_timestamps"][0] - np.datetime64("2023-03-28T09:08:07") + - np.timedelta64(123, "ms")) + diff_e = np.datetime64("2023-03-28T10:11:12") - scn_["scanline_timestamps"][-1] + assert (np.abs(diff_e) < np.timedelta64(5000, "ns")) + assert (np.abs(diff_s) < np.timedelta64(5000, "ns")) assert (scn_["M05"][0, 0] == 100) assert (scn_["M15"][0, 0] == 400) assert scn_.start_time == datetime.datetime(year=2023, month=3, day=28, From c09787c8047cd52bab991b5f3a15482ab1abf99f Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Tue, 5 Mar 2024 13:20:02 +0100 Subject: [PATCH 232/481] Increase accuracy by using ns --- satpy/readers/viirs_vgac_l1c_nc.py | 4 ++-- satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index 1146edbf62..75aaa32d75 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -85,8 +85,8 @@ def extract_time_data(self, data, nc): "days since %d/%m/%YT%H:%M:%S")) delta_part_of_day, delta_full_days = np.modf(nc["proj_time0"].values) delta_full_days = np.timedelta64(int(delta_full_days), "D") - delta_part_of_day = delta_part_of_day * np.timedelta64(1, "D").astype("timedelta64[us]") - delta_hours = data.values * np.timedelta64(1, "h").astype("timedelta64[us]") + delta_part_of_day = delta_part_of_day * np.timedelta64(1, "D").astype("timedelta64[ns]") + delta_hours = data.values * np.timedelta64(1, "h").astype("timedelta64[ns]") time_data = xr.DataArray(reference_time + delta_full_days + delta_part_of_day + delta_hours, coords=data.coords, attrs={"long_name": "Scanline time"}) self._start_time = self.dt64_to_datetime(time_data[0].values) diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index 793e1527d7..78b83277dd 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -98,8 +98,10 @@ def test_read_vgac(self, nc_filename): diff_s = (scn_["scanline_timestamps"][0] - np.datetime64("2023-03-28T09:08:07") - np.timedelta64(123, "ms")) diff_e = np.datetime64("2023-03-28T10:11:12") - scn_["scanline_timestamps"][-1] - assert (np.abs(diff_e) < np.timedelta64(5000, "ns")) - assert (np.abs(diff_s) < np.timedelta64(5000, "ns")) + assert (diff_e < np.timedelta64(5000, "ns")) + assert (diff_s < np.timedelta64(5000, "ns")) + assert (diff_e > np.timedelta64(-5000, "ns")) + assert (diff_s > np.timedelta64(-5000, "ns")) assert (scn_["M05"][0, 0] == 100) assert (scn_["M15"][0, 0] == 400) assert scn_.start_time == datetime.datetime(year=2023, month=3, day=28, From 799c697d34d4db55ba3c2c0d3dbdde65e92b9981 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Wed, 6 Mar 2024 15:51:16 +0100 Subject: [PATCH 233/481] try to make windows test running The delta_full_days was before an array of size 1, now it is a scalar. --- satpy/readers/viirs_vgac_l1c_nc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index 75aaa32d75..919d9e1856 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -83,8 +83,8 @@ def extract_time_data(self, data, nc): """Decode time data.""" reference_time = np.datetime64(datetime.strptime(nc["proj_time0"].attrs["units"], "days since %d/%m/%YT%H:%M:%S")) - delta_part_of_day, delta_full_days = np.modf(nc["proj_time0"].values) - delta_full_days = np.timedelta64(int(delta_full_days), "D") + delta_part_of_day, delta_full_days = np.modf(nc["proj_time0"].values[0]) + delta_full_days = np.timedelta64(delta_full_days.astype(np.int64), "D") delta_part_of_day = delta_part_of_day * np.timedelta64(1, "D").astype("timedelta64[ns]") delta_hours = data.values * np.timedelta64(1, "h").astype("timedelta64[ns]") time_data = xr.DataArray(reference_time + delta_full_days + delta_part_of_day + delta_hours, From 8f201b69a86f29ea47e4083da566fc456ae6cce7 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Wed, 6 Mar 2024 21:04:45 +0100 Subject: [PATCH 234/481] try to fix tests on windows --- satpy/readers/viirs_vgac_l1c_nc.py | 8 ++--- .../reader_tests/test_viirs_vgac_l1c_nc.py | 33 ++++++++++--------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index 919d9e1856..47170616ed 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -84,13 +84,11 @@ def extract_time_data(self, data, nc): reference_time = np.datetime64(datetime.strptime(nc["proj_time0"].attrs["units"], "days since %d/%m/%YT%H:%M:%S")) delta_part_of_day, delta_full_days = np.modf(nc["proj_time0"].values[0]) - delta_full_days = np.timedelta64(delta_full_days.astype(np.int64), "D") - delta_part_of_day = delta_part_of_day * np.timedelta64(1, "D").astype("timedelta64[ns]") - delta_hours = data.values * np.timedelta64(1, "h").astype("timedelta64[ns]") + delta_full_days = np.timedelta64(delta_full_days.astype(np.int64), "D").astype("timedelta64[us]") + delta_part_of_day = delta_part_of_day * np.timedelta64(1, "D").astype("timedelta64[us]") + delta_hours = data.values * np.timedelta64(1, "h").astype("timedelta64[us]") time_data = xr.DataArray(reference_time + delta_full_days + delta_part_of_day + delta_hours, coords=data.coords, attrs={"long_name": "Scanline time"}) - self._start_time = self.dt64_to_datetime(time_data[0].values) - self._end_time = self.dt64_to_datetime(time_data[-1].values) return time_data def decode_time_variable(self, data, file_key, nc): diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index 78b83277dd..9c424e065e 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -22,7 +22,7 @@ """ -import datetime +from datetime import datetime import numpy as np import pytest @@ -33,7 +33,7 @@ @pytest.fixture() def nc_filename(tmp_path): """Create an nc test data file and return its filename.""" - now = datetime.datetime.utcnow() + now = datetime.utcnow() filename = f"VGAC_VJ10XMOD_A{now:%Y%j_%H%M}_n004946_K005.nc" filename_str = str(tmp_path / filename) # Create test data @@ -65,7 +65,7 @@ def nc_filename(tmp_path): tb_lut[:] = np.array(range(0, n_lut)) * 0.5 tb_lut.units = "Kelvin" reference_time = np.datetime64("2010-01-01T00:00:00") - start_time = np.datetime64("2023-03-28T09:08:07") + np.timedelta64(123, "ms") + start_time = np.datetime64("2023-03-28T09:08:07") + np.timedelta64(123000, "us") delta_days = start_time - reference_time delta_full_days = delta_days.astype("timedelta64[D]") hidden_reference_time = reference_time + delta_full_days @@ -95,19 +95,20 @@ def test_read_vgac(self, nc_filename): reader="viirs_vgac_l1c_nc", filenames=[nc_filename]) scn_.load(["M05", "M15", "scanline_timestamps"]) - diff_s = (scn_["scanline_timestamps"][0] - np.datetime64("2023-03-28T09:08:07") - - np.timedelta64(123, "ms")) - diff_e = np.datetime64("2023-03-28T10:11:12") - scn_["scanline_timestamps"][-1] - assert (diff_e < np.timedelta64(5000, "ns")) - assert (diff_s < np.timedelta64(5000, "ns")) - assert (diff_e > np.timedelta64(-5000, "ns")) - assert (diff_s > np.timedelta64(-5000, "ns")) + diff_s = (scn_["scanline_timestamps"][0].values.astype('datetime64[us]') - + np.datetime64('2023-03-28T09:08:07.123000').astype('datetime64[us]')) + diff_e = (np.datetime64("2023-03-28T10:11:12.000000").astype('datetime64[us]') - + scn_["scanline_timestamps"][-1].values.astype('datetime64[us]')) + assert (diff_s < np.timedelta64(5, "us")) + assert (diff_e < np.timedelta64(5, "us")) + assert (diff_s > np.timedelta64(-5, "us")) + assert (diff_e > np.timedelta64(-5, "us")) assert (scn_["M05"][0, 0] == 100) assert (scn_["M15"][0, 0] == 400) - assert scn_.start_time == datetime.datetime(year=2023, month=3, day=28, - hour=9, minute=8, second=7) - assert scn_.end_time == datetime.datetime(year=2023, month=3, day=28, - hour=10, minute=11, second=12) + assert scn_.start_time == datetime(year=2023, month=3, day=28, + hour=9, minute=8, second=7) + assert scn_.end_time == datetime(year=2023, month=3, day=28, + hour=10, minute=11, second=12) def test_dt64_to_datetime(self): """Test datetime conversion branch.""" @@ -115,8 +116,8 @@ def test_dt64_to_datetime(self): fh = VGACFileHandler(filename="", filename_info={"start_time": "2023-03-28T09:08:07"}, filetype_info="") - in_dt = datetime.datetime(year=2023, month=3, day=28, - hour=9, minute=8, second=7) + in_dt = datetime(year=2023, month=3, day=28, + hour=9, minute=8, second=7) out_dt = fh.dt64_to_datetime(in_dt) assert out_dt == in_dt From 7e336ee6201a23ae52e85e382121d8a6a5cbf23b Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Thu, 7 Mar 2024 09:45:00 +0100 Subject: [PATCH 235/481] use np.int64 also when creating test file --- .../reader_tests/test_viirs_vgac_l1c_nc.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index 9c424e065e..b9380fb859 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -41,12 +41,14 @@ def nc_filename(tmp_path): nscn = 7 npix = 800 n_lut = 12000 + start_time_srting = "2023-03-28T09:08:07" + end_time_string = "2023-03-28T10:11:12" nc.createDimension("npix", npix) nc.createDimension("nscn", nscn) nc.createDimension("n_lut", n_lut) nc.createDimension("one", 1) - nc.StartTime = "2023-03-28T09:08:07" - nc.EndTime = "2023-03-28T10:11:12" + nc.StartTime = start_time_srting + nc.EndTime = end_time_string for ind in range(1, 11, 1): ch_name = "M{:02d}".format(ind) r_a = nc.createVariable(ch_name, np.int16, dimensions=("nscn", "npix")) @@ -71,13 +73,13 @@ def nc_filename(tmp_path): hidden_reference_time = reference_time + delta_full_days delta_part_of_days = start_time - hidden_reference_time proj_time0 = nc.createVariable("proj_time0", np.float64, ("one",)) - proj_time0[:] = (delta_full_days.astype(int) + + proj_time0[:] = (delta_full_days.astype(np.int64) + 0.000001 * delta_part_of_days.astype("timedelta64[us]").astype(np.int64) / (60 * 60 * 24)) proj_time0.units = "days since 01/01/2010T00:00:00" time_v = nc.createVariable("time", np.float64, ("nscn",)) - delta_h = np.datetime64(nc.EndTime) - start_time - delta_hours = 0.000001 * delta_h.astype("timedelta64[us]").astype(int) / (60 * 60) - time_v[:] = np.linspace(0, delta_hours, num=nscn) + delta_h = np.datetime64(end_time_string) - start_time + delta_hours = 0.000001 * delta_h.astype("timedelta64[us]").astype(np.int64) / (60 * 60) + time_v[:] = np.linspace(0, delta_hours, num=nscn).astype(np.float64) time_v.units = "hours since proj_time0" return filename_str @@ -95,13 +97,13 @@ def test_read_vgac(self, nc_filename): reader="viirs_vgac_l1c_nc", filenames=[nc_filename]) scn_.load(["M05", "M15", "scanline_timestamps"]) - diff_s = (scn_["scanline_timestamps"][0].values.astype('datetime64[us]') - - np.datetime64('2023-03-28T09:08:07.123000').astype('datetime64[us]')) - diff_e = (np.datetime64("2023-03-28T10:11:12.000000").astype('datetime64[us]') - - scn_["scanline_timestamps"][-1].values.astype('datetime64[us]')) + diff_s = (scn_["scanline_timestamps"][0].values.astype("datetime64[us]") - + np.datetime64("2023-03-28T09:08:07.123000").astype("datetime64[us]")) + diff_e = (np.datetime64("2023-03-28T10:11:12.000000").astype("datetime64[us]") - + scn_["scanline_timestamps"][-1].values.astype("datetime64[us]")) assert (diff_s < np.timedelta64(5, "us")) - assert (diff_e < np.timedelta64(5, "us")) assert (diff_s > np.timedelta64(-5, "us")) + assert (diff_e < np.timedelta64(5, "us")) assert (diff_e > np.timedelta64(-5, "us")) assert (scn_["M05"][0, 0] == 100) assert (scn_["M15"][0, 0] == 400) From f6d87f36856fb2d7aed5000030c5995e1d864a52 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 7 Mar 2024 14:44:49 +0200 Subject: [PATCH 236/481] Add fsspec support to li_l2_nc reader --- satpy/etc/readers/generic_image.yaml | 2 +- satpy/readers/li_base_nc.py | 4 ++-- satpy/readers/netcdf_utils.py | 10 +++++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/satpy/etc/readers/generic_image.yaml b/satpy/etc/readers/generic_image.yaml index 07d1bdeb50..fb6e0aab5d 100644 --- a/satpy/etc/readers/generic_image.yaml +++ b/satpy/etc/readers/generic_image.yaml @@ -4,7 +4,7 @@ reader: long_name: Generic Images e.g. GeoTIFF description: generic image reader status: Nominal - supports_fsspec: false + supports_fsspec: true reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader sensors: [images] default_channels: [image] diff --git a/satpy/readers/li_base_nc.py b/satpy/readers/li_base_nc.py index 848306e77c..eba9548985 100644 --- a/satpy/readers/li_base_nc.py +++ b/satpy/readers/li_base_nc.py @@ -191,12 +191,12 @@ import xarray as xr from pyproj import Proj -from satpy.readers.netcdf_utils import NetCDF4FileHandler +from satpy.readers.netcdf_utils import NetCDF4FsspecFileHandler logger = logging.getLogger(__name__) -class LINCFileHandler(NetCDF4FileHandler): +class LINCFileHandler(NetCDF4FsspecFileHandler): """Base class used as parent for the concrete LI reader classes.""" def __init__(self, filename, filename_info, filetype_info, cache_handle=True): diff --git a/satpy/readers/netcdf_utils.py b/satpy/readers/netcdf_utils.py index cb5c38d1cf..560039c406 100644 --- a/satpy/readers/netcdf_utils.py +++ b/satpy/readers/netcdf_utils.py @@ -258,13 +258,17 @@ def collect_cache_vars(self, cache_var_size): cache_vars = self._collect_cache_var_names(cache_var_size) for var_name in cache_vars: v = self.file_content[var_name] + try: + attrs = v.attrs + except AttributeError: + attrs = v.__dict__ try: arr = xr.DataArray( - v[:], dims=v.dimensions, attrs=v.__dict__, name=v.name) - except ValueError: + v[:], dims=v.dimensions, attrs=attrs, name=v.name) + except (ValueError, IndexError): # Handle scalars for h5netcdf backend arr = xr.DataArray( - v.__array__(), dims=v.dimensions, attrs=v.__dict__, name=v.name) + v.__array__(), dims=v.dimensions, attrs=attrs, name=v.name) self.cached_file_content[var_name] = arr def _collect_cache_var_names(self, cache_var_size): From f1bc699f8a80bad86607901aa5954b8ebb8f969c Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 7 Mar 2024 16:44:34 +0200 Subject: [PATCH 237/481] Refactor and test getting netcdf variable to xr.DataArray --- satpy/readers/netcdf_utils.py | 29 ++++++---- satpy/tests/reader_tests/test_netcdf_utils.py | 57 +++++++++++++++++++ 2 files changed, 75 insertions(+), 11 deletions(-) diff --git a/satpy/readers/netcdf_utils.py b/satpy/readers/netcdf_utils.py index 560039c406..457c2ecaea 100644 --- a/satpy/readers/netcdf_utils.py +++ b/satpy/readers/netcdf_utils.py @@ -258,17 +258,7 @@ def collect_cache_vars(self, cache_var_size): cache_vars = self._collect_cache_var_names(cache_var_size) for var_name in cache_vars: v = self.file_content[var_name] - try: - attrs = v.attrs - except AttributeError: - attrs = v.__dict__ - try: - arr = xr.DataArray( - v[:], dims=v.dimensions, attrs=attrs, name=v.name) - except (ValueError, IndexError): - # Handle scalars for h5netcdf backend - arr = xr.DataArray( - v.__array__(), dims=v.dimensions, attrs=attrs, name=v.name) + arr = get_data_as_xarray(v) self.cached_file_content[var_name] = arr def _collect_cache_var_names(self, cache_var_size): @@ -384,6 +374,23 @@ def _compose_replacement_names(variable_name_replacements, var, variable_names): variable_names.append(var.format(**{key: val})) +def get_data_as_xarray(variable): + """Get data in variable as xr.DataArray.""" + try: + attrs = variable.attrs + except AttributeError: + attrs = variable.__dict__ + try: + arr = xr.DataArray( + variable[:], dims=variable.dimensions, attrs=attrs, name=variable.name) + except (ValueError, IndexError): + # Handle scalars for h5netcdf backend + arr = xr.DataArray( + variable.__array__(), dims=variable.dimensions, attrs=attrs, name=variable.name) + + return arr + + class NetCDF4FsspecFileHandler(NetCDF4FileHandler): """NetCDF4 file handler using fsspec to read files remotely.""" diff --git a/satpy/tests/reader_tests/test_netcdf_utils.py b/satpy/tests/reader_tests/test_netcdf_utils.py index 2d29288784..ad7b05c217 100644 --- a/satpy/tests/reader_tests/test_netcdf_utils.py +++ b/satpy/tests/reader_tests/test_netcdf_utils.py @@ -293,3 +293,60 @@ def test_use_h5netcdf_for_file_not_accessible_locally(self): fh = NetCDF4FsspecFileHandler(fname, {}, {}) h5_file.assert_called_once() assert fh._use_h5netcdf + + +NC_ATTRS = { + "standard_name": "test_data", + "scale_factor": 0.01, + "add_offset": 0} + +def test_get_data_as_xarray_netcdf4(): + """Test getting xr.DataArray from netcdf4 variable.""" + import tempfile + + import netCDF4 as nc + import numpy as np + + from satpy.readers.netcdf_utils import get_data_as_xarray + + data = np.array([1, 2, 3]) + + with tempfile.TemporaryDirectory() as tmpdir: + # Create an empty HDF5 + fname = os.path.join(tmpdir, "test.nc") + dset = nc.Dataset(fname, "w") + dset.createDimension("y", None) + var = dset.createVariable("test_data", "uint8", ("y",)) + var[:] = data + var.setncatts(NC_ATTRS) + # Turn off automatic scale factor and offset handling + dset.set_auto_maskandscale(False) + res = get_data_as_xarray(var) + np.testing.assert_equal(res.data, data) + assert res.attrs == NC_ATTRS + dset.close() + + +def test_get_data_as_xarray_h5netcdf(): + """Test getting xr.DataArray from h5netcdf variable.""" + import tempfile + + import h5netcdf + import numpy as np + + from satpy.readers.netcdf_utils import get_data_as_xarray + + data = np.array([1, 2, 3]) + + with tempfile.TemporaryDirectory() as tmpdir: + # Create an empty HDF5 + fname = os.path.join(tmpdir, "test.nc") + with h5netcdf.File(fname, "w") as fid: + fid.dimensions = {"y": data.size} + var = fid.create_variable("test_data", ("y",), "uint8") + var[:] = data + for key in NC_ATTRS: + var.attrs[key] = NC_ATTRS[key] + res = get_data_as_xarray(var) + np.testing.assert_equal(res.data, data) + assert res.attrs == NC_ATTRS From f6594cf80c929b988ca55d2f7e9965620bb7a9ce Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 7 Mar 2024 16:52:27 +0200 Subject: [PATCH 238/481] Remove unnecessary IndexError --- satpy/readers/netcdf_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/readers/netcdf_utils.py b/satpy/readers/netcdf_utils.py index 457c2ecaea..103b8d80a5 100644 --- a/satpy/readers/netcdf_utils.py +++ b/satpy/readers/netcdf_utils.py @@ -383,7 +383,7 @@ def get_data_as_xarray(variable): try: arr = xr.DataArray( variable[:], dims=variable.dimensions, attrs=attrs, name=variable.name) - except (ValueError, IndexError): + except ValueError: # Handle scalars for h5netcdf backend arr = xr.DataArray( variable.__array__(), dims=variable.dimensions, attrs=attrs, name=variable.name) From e1a6f37e17ce89706974fa2d1cc4f31a6dff36d1 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 7 Mar 2024 17:08:06 +0200 Subject: [PATCH 239/481] Use tmp_path instead of tempfile library --- satpy/tests/reader_tests/test_netcdf_utils.py | 60 ++++++++----------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/satpy/tests/reader_tests/test_netcdf_utils.py b/satpy/tests/reader_tests/test_netcdf_utils.py index ad7b05c217..42d7c5d093 100644 --- a/satpy/tests/reader_tests/test_netcdf_utils.py +++ b/satpy/tests/reader_tests/test_netcdf_utils.py @@ -300,10 +300,8 @@ def test_use_h5netcdf_for_file_not_accessible_locally(self): "scale_factor": 0.01, "add_offset": 0} -def test_get_data_as_xarray_netcdf4(): +def test_get_data_as_xarray_netcdf4(tmp_path): """Test getting xr.DataArray from netcdf4 variable.""" - import tempfile - import netCDF4 as nc import numpy as np @@ -311,26 +309,22 @@ def test_get_data_as_xarray_netcdf4(): data = np.array([1, 2, 3]) - with tempfile.TemporaryDirectory() as tmpdir: - # Create an empty HDF5 - fname = os.path.join(tmpdir, "test.nc") - dset = nc.Dataset(fname, "w") - dset.createDimension("y", None) - var = dset.createVariable("test_data", "uint8", ("y",)) - var[:] = data - var.setncatts(NC_ATTRS) - # Turn off automatic scale factor and offset handling - dset.set_auto_maskandscale(False) - res = get_data_as_xarray(var) - np.testing.assert_equal(res.data, data) - assert res.attrs == NC_ATTRS - dset.close() - - -def test_get_data_as_xarray_h5netcdf(): + fname = tmp_path / "test.nc" + dset = nc.Dataset(fname, "w") + dset.createDimension("y", None) + var = dset.createVariable("test_data", "uint8", ("y",)) + var[:] = data + var.setncatts(NC_ATTRS) + # Turn off automatic scale factor and offset handling + dset.set_auto_maskandscale(False) + res = get_data_as_xarray(var) + np.testing.assert_equal(res.data, data) + assert res.attrs == NC_ATTRS + dset.close() + + +def test_get_data_as_xarray_h5netcdf(tmp_path): """Test getting xr.DataArray from h5netcdf variable.""" - import tempfile - import h5netcdf import numpy as np @@ -338,15 +332,13 @@ def test_get_data_as_xarray_h5netcdf(): data = np.array([1, 2, 3]) - with tempfile.TemporaryDirectory() as tmpdir: - # Create an empty HDF5 - fname = os.path.join(tmpdir, "test.nc") - with h5netcdf.File(fname, "w") as fid: - fid.dimensions = {"y": data.size} - var = fid.create_variable("test_data", ("y",), "uint8") - var[:] = data - for key in NC_ATTRS: - var.attrs[key] = NC_ATTRS[key] - res = get_data_as_xarray(var) - np.testing.assert_equal(res.data, data) - assert res.attrs == NC_ATTRS + fname = tmp_path / "test.nc" + with h5netcdf.File(fname, "w") as fid: + fid.dimensions = {"y": data.size} + var = fid.create_variable("test_data", ("y",), "uint8") + var[:] = data + for key in NC_ATTRS: + var.attrs[key] = NC_ATTRS[key] + res = get_data_as_xarray(var) + np.testing.assert_equal(res.data, data) + assert res.attrs == NC_ATTRS From c6cd6474162c11fa67d8ad60d9e3a688516a12ec Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 7 Mar 2024 17:16:09 +0200 Subject: [PATCH 240/481] Split netcdf creation from the tests --- satpy/tests/reader_tests/test_netcdf_utils.py | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/satpy/tests/reader_tests/test_netcdf_utils.py b/satpy/tests/reader_tests/test_netcdf_utils.py index 42d7c5d093..c1a5e3b151 100644 --- a/satpy/tests/reader_tests/test_netcdf_utils.py +++ b/satpy/tests/reader_tests/test_netcdf_utils.py @@ -302,14 +302,22 @@ def test_use_h5netcdf_for_file_not_accessible_locally(self): def test_get_data_as_xarray_netcdf4(tmp_path): """Test getting xr.DataArray from netcdf4 variable.""" - import netCDF4 as nc import numpy as np from satpy.readers.netcdf_utils import get_data_as_xarray data = np.array([1, 2, 3]) - fname = tmp_path / "test.nc" + dset = _write_test_netcdf4(fname, data) + + res = get_data_as_xarray(dset["test_data"]) + np.testing.assert_equal(res.data, data) + assert res.attrs == NC_ATTRS + + +def _write_test_netcdf4(fname, data): + import netCDF4 as nc + dset = nc.Dataset(fname, "w") dset.createDimension("y", None) var = dset.createVariable("test_data", "uint8", ("y",)) @@ -317,28 +325,33 @@ def test_get_data_as_xarray_netcdf4(tmp_path): var.setncatts(NC_ATTRS) # Turn off automatic scale factor and offset handling dset.set_auto_maskandscale(False) - res = get_data_as_xarray(var) - np.testing.assert_equal(res.data, data) - assert res.attrs == NC_ATTRS - dset.close() + + return dset def test_get_data_as_xarray_h5netcdf(tmp_path): """Test getting xr.DataArray from h5netcdf variable.""" - import h5netcdf import numpy as np from satpy.readers.netcdf_utils import get_data_as_xarray data = np.array([1, 2, 3]) - fname = tmp_path / "test.nc" - with h5netcdf.File(fname, "w") as fid: - fid.dimensions = {"y": data.size} - var = fid.create_variable("test_data", ("y",), "uint8") - var[:] = data - for key in NC_ATTRS: - var.attrs[key] = NC_ATTRS[key] - res = get_data_as_xarray(var) - np.testing.assert_equal(res.data, data) - assert res.attrs == NC_ATTRS + fid = _write_test_h5netcdf(fname, data) + + res = get_data_as_xarray(fid["test_data"]) + np.testing.assert_equal(res.data, data) + assert res.attrs == NC_ATTRS + + +def _write_test_h5netcdf(fname, data): + import h5netcdf + + fid = h5netcdf.File(fname, "w") + fid.dimensions = {"y": data.size} + var = fid.create_variable("test_data", ("y",), "uint8") + var[:] = data + for key in NC_ATTRS: + var.attrs[key] = NC_ATTRS[key] + + return fid From eb6e25f832550343b2a3e743c478e1eb30ca565f Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Thu, 7 Mar 2024 18:10:55 +0100 Subject: [PATCH 241/481] Accept mod in open_file_or_filename --- satpy/readers/__init__.py | 4 ++-- satpy/tests/test_readers.py | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/satpy/readers/__init__.py b/satpy/readers/__init__.py index 43632af9c6..8141b95345 100644 --- a/satpy/readers/__init__.py +++ b/satpy/readers/__init__.py @@ -780,10 +780,10 @@ def _get_compression(file): return None -def open_file_or_filename(unknown_file_thing): +def open_file_or_filename(unknown_file_thing, mode="r"): """Try to open the *unknown_file_thing*, otherwise return the filename.""" try: - f_obj = unknown_file_thing.open() + f_obj = unknown_file_thing.open(mode=mode) except AttributeError: f_obj = unknown_file_thing return f_obj diff --git a/satpy/tests/test_readers.py b/satpy/tests/test_readers.py index d91e2b6fed..0e90850e82 100644 --- a/satpy/tests/test_readers.py +++ b/satpy/tests/test_readers.py @@ -29,7 +29,7 @@ from satpy.dataset.data_dict import get_key from satpy.dataset.dataid import DataID, ModifierTuple, WavelengthRange -from satpy.readers import find_files_and_readers +from satpy.readers import find_files_and_readers, open_file_or_filename # NOTE: # The following fixtures are not defined in this file, but are used and injected by Pytest: @@ -1088,3 +1088,11 @@ def test_hash(self): assert len({hash(FSFile(fn, fs)) for fn in {self.local_filename, self.local_filename2} for fs in [None, lfs, zfs, cfs]}) == 2*4 + + +def test_open_file_or_filename_uses_mode(tmp_path): + """Test that open_file_or_filename uses provided mode.""" + with open(tmp_path / "hej", mode="wb") as fd: + fd.write(b"hej") + res = open_file_or_filename(tmp_path / "hej", mode="rb").read() + assert isinstance(res, bytes) From 4ce31f782f0026dc0e0e32f3c3e73f98b512b255 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Thu, 7 Mar 2024 18:13:00 +0100 Subject: [PATCH 242/481] Use geojson gcps as lon lat source --- satpy/readers/sar_c_safe.py | 91 +++++++++++---------- satpy/tests/reader_tests/test_sar_c_safe.py | 22 ++--- 2 files changed, 62 insertions(+), 51 deletions(-) diff --git a/satpy/readers/sar_c_safe.py b/satpy/readers/sar_c_safe.py index 565d2c1167..1d3d71fb55 100644 --- a/satpy/readers/sar_c_safe.py +++ b/satpy/readers/sar_c_safe.py @@ -36,8 +36,9 @@ import functools import logging -import os from collections import defaultdict +from datetime import timezone as tz +from functools import cached_property from threading import Lock import defusedxml.ElementTree as ET @@ -50,6 +51,7 @@ from satpy.dataset.data_dict import DatasetDict from satpy.dataset.dataid import DataID +from satpy.readers import open_file_or_filename from satpy.readers.file_handlers import BaseFileHandler from satpy.readers.yaml_reader import GenericYAMLReader from satpy.utils import get_legacy_chunk_size @@ -101,10 +103,10 @@ def __init__(self, filename, filename_info, filetype_info, """Init the xml filehandler.""" super().__init__(filename, filename_info, filetype_info) - self._start_time = filename_info["start_time"] - self._end_time = filename_info["end_time"] + self._start_time = filename_info["start_time"].replace(tzinfo=tz.utc) + self._end_time = filename_info["end_time"].replace(tzinfo=tz.utc) self._polarization = filename_info["polarization"] - self.root = ET.parse(self.filename) + self.root = ET.parse(open_file_or_filename(self.filename)) self._image_shape = image_shape def get_metadata(self): @@ -507,8 +509,13 @@ def interpolate_xarray(xpoints, ypoints, values, shape, """Interpolate, generating a dask array.""" from scipy.interpolate import RectBivariateSpline - vchunks = range(0, shape[0], blocksize) - hchunks = range(0, shape[1], blocksize) + try: + blocksize_row, blocksize_col = blocksize + except ValueError: + blocksize_row = blocksize_col = blocksize + + vchunks = range(0, shape[0], blocksize_row) + hchunks = range(0, shape[1], blocksize_col) token = tokenize(blocksize, xpoints, ypoints, values, shape) name = "interpolate-" + token @@ -520,15 +527,15 @@ def interpolator(xnew, ynew): return spline(xnew, ynew).T dskx = {(name, i, j): (interpolate_slice, - slice(vcs, min(vcs + blocksize, shape[0])), - slice(hcs, min(hcs + blocksize, shape[1])), + slice(vcs, min(vcs + blocksize_row, shape[0])), + slice(hcs, min(hcs + blocksize_col, shape[1])), interpolator) for i, vcs in enumerate(vchunks) for j, hcs in enumerate(hchunks) } res = da.Array(dskx, name, shape=list(shape), - chunks=(blocksize, blocksize), + chunks=(blocksize_row, blocksize_col), dtype=values.dtype) return DataArray(res, dims=("y", "x")) @@ -573,9 +580,8 @@ class SAFEGRD(BaseFileHandler): def __init__(self, filename, filename_info, filetype_info, calibrator, denoiser): """Init the grd filehandler.""" super().__init__(filename, filename_info, filetype_info) - - self._start_time = filename_info["start_time"] - self._end_time = filename_info["end_time"] + self._start_time = filename_info["start_time"].replace(tzinfo=tz.utc) + self._end_time = filename_info["end_time"].replace(tzinfo=tz.utc) self._polarization = filename_info["polarization"] @@ -585,7 +591,6 @@ def __init__(self, filename, filename_info, filetype_info, calibrator, denoiser) self.denoiser = denoiser self.read_lock = Lock() - self.filehandle = rasterio.open(self.filename, "r", sharing=False) self.get_lonlatalts = functools.lru_cache(maxsize=2)( self._get_lonlatalts_uncached ) @@ -606,11 +611,7 @@ def get_dataset(self, key, info): data.attrs.update(info) else: - data = xr.open_dataarray(self.filename, engine="rasterio", - chunks={"band": 1, "y": CHUNK_SIZE, "x": CHUNK_SIZE}).squeeze() - data = data.assign_coords(x=np.arange(len(data.coords["x"])), - y=np.arange(len(data.coords["y"]))) - data = self._calibrate_and_denoise(data, key) + data = self._calibrate_and_denoise(self._data, key) data.attrs.update(info) data.attrs.update({"platform_name": self._mission_id}) @@ -618,6 +619,17 @@ def get_dataset(self, key, info): return data + @cached_property + def _data(self): + data = xr.open_dataarray(self.filename, engine="rasterio", + chunks="auto" + ).squeeze() + self.chunks = data.data.chunksize + data = data.assign_coords(x=np.arange(len(data.coords["x"])), + y=np.arange(len(data.coords["y"]))) + + return data + @staticmethod def _change_quantity(data, quantity): """Change quantity to dB if needed.""" @@ -631,11 +643,9 @@ def _change_quantity(data, quantity): def _calibrate_and_denoise(self, data, key): """Calibrate and denoise the data.""" - chunks = CHUNK_SIZE - dn = self._get_digital_number(data) - dn = self.denoiser(dn, chunks) - data = self.calibrator(dn, key["calibration"], chunks) + dn = self.denoiser(dn, self.chunks) + data = self.calibrator(dn, key["calibration"], self.chunks) return data @@ -646,13 +656,6 @@ def _get_digital_number(self, data): dn = data * data return dn - def _denoise(self, dn, chunks): - """Denoise the data.""" - logger.debug("Reading noise data.") - noise = self.noise.get_noise_correction(chunks=chunks).fillna(0) - dn = dn - noise - return dn - def _get_lonlatalts_uncached(self): """Obtain GCPs and construct latitude and longitude arrays. @@ -662,16 +665,16 @@ def _get_lonlatalts_uncached(self): Returns: coordinates (tuple): A tuple with longitude and latitude arrays """ - band = self.filehandle + shape = self._data.shape (xpoints, ypoints), (gcp_lons, gcp_lats, gcp_alts), (gcps, crs) = self.get_gcps() # FIXME: do interpolation on cartesian coordinates if the area is # problematic. - longitudes = interpolate_xarray(xpoints, ypoints, gcp_lons, band.shape) - latitudes = interpolate_xarray(xpoints, ypoints, gcp_lats, band.shape) - altitudes = interpolate_xarray(xpoints, ypoints, gcp_alts, band.shape) + longitudes = interpolate_xarray(xpoints, ypoints, gcp_lons, shape, self.chunks) + latitudes = interpolate_xarray(xpoints, ypoints, gcp_lats, shape, self.chunks) + altitudes = interpolate_xarray(xpoints, ypoints, gcp_alts, shape, self.chunks) longitudes.attrs["gcps"] = gcps longitudes.attrs["crs"] = crs @@ -694,9 +697,12 @@ def get_gcps(self): gcp_coords (tuple): longitude and latitude 1d arrays """ - gcps = self.filehandle.gcps + gcps = self._data.coords["spatial_ref"].attrs["gcps"] + crs = self._data.rio.crs - gcp_array = np.array([(p.row, p.col, p.x, p.y, p.z) for p in gcps[0]]) + gcp_list = [(feature["properties"]["row"], feature["properties"]["col"], *feature["geometry"]["coordinates"]) + for feature in gcps["features"]] + gcp_array = np.array(gcp_list) ypoints = np.unique(gcp_array[:, 0]) xpoints = np.unique(gcp_array[:, 1]) @@ -705,7 +711,10 @@ def get_gcps(self): gcp_lats = gcp_array[:, 3].reshape(ypoints.shape[0], xpoints.shape[0]) gcp_alts = gcp_array[:, 4].reshape(ypoints.shape[0], xpoints.shape[0]) - return (xpoints, ypoints), (gcp_lons, gcp_lats, gcp_alts), gcps + rio_gcps = [rasterio.control.GroundControlPoint(*gcp) for gcp in gcp_list] + + + return (xpoints, ypoints), (gcp_lons, gcp_lats, gcp_alts), (rio_gcps, crs) @property def start_time(self): @@ -731,12 +740,12 @@ def __init__(self, config, filter_parameters=None): @property def start_time(self): """Get the start time.""" - return self.storage_items.values()[0].filename_info["start_time"] + return self.storage_items.values()[0].filename_info["start_time"].replace(tzinfo=tz.utc) @property def end_time(self): """Get the end time.""" - return self.storage_items.values()[0].filename_info["end_time"] + return self.storage_items.values()[0].filename_info["end_time"].replace(tzinfo=tz.utc) def load(self, dataset_keys, **kwargs): """Load some data.""" @@ -752,20 +761,20 @@ def load(self, dataset_keys, **kwargs): if key["name"] not in ["longitude", "latitude"]: lonlats = self.load([DataID(self._id_keys, name="longitude", polarization=key["polarization"]), DataID(self._id_keys, name="latitude", polarization=key["polarization"])]) + gcps = val.coords["spatial_ref"].attrs["gcps"] from pyresample.future.geometry import SwathDefinition val.attrs["area"] = SwathDefinition(lonlats["longitude"], lonlats["latitude"], - attrs=dict(gcps=None)) + attrs=dict(gcps=gcps)) datasets[key] = val continue return datasets def create_storage_items(self, files, **kwargs): """Create the storage items.""" - filenames = [os.fspath(filename) for filename in files] + filenames = files files_by_type = defaultdict(list) for file_type, type_info in self.config["file_types"].items(): files_by_type[file_type].extend(self.filename_items_for_filetype(filenames, type_info)) - image_shapes = dict() for annotation_file, annotation_info in files_by_type["safe_annotation"]: annotation_fh = SAFEXMLAnnotation(annotation_file, diff --git a/satpy/tests/reader_tests/test_sar_c_safe.py b/satpy/tests/reader_tests/test_sar_c_safe.py index d6d178044e..c3a90adec1 100644 --- a/satpy/tests/reader_tests/test_sar_c_safe.py +++ b/satpy/tests/reader_tests/test_sar_c_safe.py @@ -38,6 +38,8 @@ dirname_suffix = "20190201T024655_20190201T024720_025730_02DC2A_AE07" filename_suffix = "20190201t024655-20190201t024720-025730-02dc2a" +START_TIME = datetime(2019, 2, 1, 2, 46, 55) +END_TIME = datetime(2019, 2, 1, 2, 47, 20) @pytest.fixture(scope="module") def granule_directory(tmp_path_factory): @@ -62,7 +64,7 @@ def annotation_file(granule_directory): @pytest.fixture(scope="module") def annotation_filehandler(annotation_file): """Create an annotation filehandler.""" - filename_info = dict(start_time=None, end_time=None, polarization="vv") + filename_info = dict(start_time=START_TIME, end_time=END_TIME, polarization="vv") return SAFEXMLAnnotation(annotation_file, filename_info, None) @@ -74,16 +76,16 @@ def calibration_file(granule_directory): calibration_file = cal_dir / f"calibration-s1a-iw-grd-vv-{filename_suffix}-001.xml" with open(calibration_file, "wb") as fd: fd.write(calibration_xml) - return calibration_file + return Path(calibration_file) @pytest.fixture(scope="module") def calibration_filehandler(calibration_file, annotation_filehandler): """Create a calibration filehandler.""" - filename_info = dict(start_time=None, end_time=None, polarization="vv") + filename_info = dict(start_time=START_TIME, end_time=END_TIME, polarization="vv") return Calibrator(calibration_file, - filename_info, - None, - image_shape=annotation_filehandler.image_shape) + filename_info, + None, + image_shape=annotation_filehandler.image_shape) @pytest.fixture(scope="module") def noise_file(granule_directory): @@ -99,14 +101,14 @@ def noise_file(granule_directory): @pytest.fixture(scope="module") def noise_filehandler(noise_file, annotation_filehandler): """Create a noise filehandler.""" - filename_info = dict(start_time=None, end_time=None, polarization="vv") + filename_info = dict(start_time=START_TIME, end_time=END_TIME, polarization="vv") return Denoiser(noise_file, filename_info, None, image_shape=annotation_filehandler.image_shape) @pytest.fixture(scope="module") def noise_with_holes_filehandler(annotation_filehandler): """Create a noise filehandler from data with holes.""" - filename_info = dict(start_time=None, end_time=None, polarization="vv") + filename_info = dict(start_time=START_TIME, end_time=END_TIME, polarization="vv") noise_filehandler = Denoiser(BytesIO(noise_xml_with_holes), filename_info, None, image_shape=annotation_filehandler.image_shape) @@ -151,13 +153,13 @@ def measurement_file(granule_directory): crs="+proj=latlong", gcps=gcps) as dst: dst.write(Z, 1) - return filename + return Path(filename) @pytest.fixture(scope="module") def measurement_filehandler(measurement_file, noise_filehandler, calibration_filehandler): """Create a measurement filehandler.""" - filename_info = {"mission_id": "S1A", "dataset_name": "foo", "start_time": 0, "end_time": 0, + filename_info = {"mission_id": "S1A", "dataset_name": "foo", "start_time": START_TIME, "end_time": END_TIME, "polarization": "vv"} filetype_info = None from satpy.readers.sar_c_safe import SAFEGRD From 12854de2dc6bb09cb8a90d49d5e15e1aeb92a411 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Fri, 8 Mar 2024 09:28:49 +0200 Subject: [PATCH 243/481] Refactor and test h5netcdf scalar reading --- satpy/readers/netcdf_utils.py | 11 +++-- satpy/tests/reader_tests/test_netcdf_utils.py | 47 +++++++++++++++++-- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/satpy/readers/netcdf_utils.py b/satpy/readers/netcdf_utils.py index 103b8d80a5..c8b8a3f85f 100644 --- a/satpy/readers/netcdf_utils.py +++ b/satpy/readers/netcdf_utils.py @@ -379,14 +379,15 @@ def get_data_as_xarray(variable): try: attrs = variable.attrs except AttributeError: + # netCDF4 backend requires usage of __dict__ to get the attributes attrs = variable.__dict__ try: - arr = xr.DataArray( - variable[:], dims=variable.dimensions, attrs=attrs, name=variable.name) - except ValueError: + data = variable[:] + except (ValueError, IndexError): # Handle scalars for h5netcdf backend - arr = xr.DataArray( - variable.__array__(), dims=variable.dimensions, attrs=attrs, name=variable.name) + data = variable.__array__() + + arr = xr.DataArray(data, dims=variable.dimensions, attrs=attrs, name=variable.name) return arr diff --git a/satpy/tests/reader_tests/test_netcdf_utils.py b/satpy/tests/reader_tests/test_netcdf_utils.py index c1a5e3b151..5e0bcc44a1 100644 --- a/satpy/tests/reader_tests/test_netcdf_utils.py +++ b/satpy/tests/reader_tests/test_netcdf_utils.py @@ -315,12 +315,31 @@ def test_get_data_as_xarray_netcdf4(tmp_path): assert res.attrs == NC_ATTRS +def test_get_data_as_xarray_scalar_netcdf4(tmp_path): + """Test getting scalar xr.DataArray from netcdf4 variable.""" + import numpy as np + + from satpy.readers.netcdf_utils import get_data_as_xarray + + data = 1 + fname = tmp_path / "test.nc" + dset = _write_test_netcdf4(fname, data) + + res = get_data_as_xarray(dset["test_data"]) + np.testing.assert_equal(res.data, np.array(data)) + assert res.attrs == NC_ATTRS + + def _write_test_netcdf4(fname, data): import netCDF4 as nc dset = nc.Dataset(fname, "w") - dset.createDimension("y", None) - var = dset.createVariable("test_data", "uint8", ("y",)) + try: + dset.createDimension("y", data.size) + dims = ("y",) + except AttributeError: + dims = () + var = dset.createVariable("test_data", "uint8", dims) var[:] = data var.setncatts(NC_ATTRS) # Turn off automatic scale factor and offset handling @@ -348,10 +367,28 @@ def _write_test_h5netcdf(fname, data): import h5netcdf fid = h5netcdf.File(fname, "w") - fid.dimensions = {"y": data.size} - var = fid.create_variable("test_data", ("y",), "uint8") - var[:] = data + try: + fid.dimensions = {"y": data.size} + dims = ("y",) + except AttributeError: + dims = () + var = fid.create_variable("test_data", dims, "uint8", data=data) for key in NC_ATTRS: var.attrs[key] = NC_ATTRS[key] return fid + + +def test_get_data_as_xarray_scalar_h5netcdf(tmp_path): + """Test getting xr.DataArray from h5netcdf variable.""" + import numpy as np + + from satpy.readers.netcdf_utils import get_data_as_xarray + + data = 1 + fname = tmp_path / "test.nc" + fid = _write_test_h5netcdf(fname, data) + + res = get_data_as_xarray(fid["test_data"]) + np.testing.assert_equal(res.data, np.array(data)) + assert res.attrs == NC_ATTRS From 5c4da9e39ea23acad3e83ec621073755a05a44c2 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Fri, 8 Mar 2024 10:17:01 +0100 Subject: [PATCH 244/481] Use geotiepoints for lon lat interpolation --- satpy/readers/sar_c_safe.py | 64 ++++----------------- satpy/tests/reader_tests/test_sar_c_safe.py | 4 +- 2 files changed, 14 insertions(+), 54 deletions(-) diff --git a/satpy/readers/sar_c_safe.py b/satpy/readers/sar_c_safe.py index 1d3d71fb55..dc24bd3a95 100644 --- a/satpy/readers/sar_c_safe.py +++ b/satpy/readers/sar_c_safe.py @@ -46,7 +46,8 @@ import rasterio import xarray as xr from dask import array as da -from dask.base import tokenize +from geotiepoints.geointerpolator import lonlat2xyz, xyz2lonlat +from geotiepoints.interpolator import MultipleGridInterpolator from xarray import DataArray from satpy.dataset.data_dict import DatasetDict @@ -385,13 +386,6 @@ def _fill_dask_pieces(dask_pieces, shape, chunks): dask_pieces.append(new_piece) -def interpolate_slice(slice_rows, slice_cols, interpolator): - """Interpolate the given slice of the larger array.""" - fine_rows = np.arange(slice_rows.start, slice_rows.stop, slice_rows.step) - fine_cols = np.arange(slice_cols.start, slice_cols.stop, slice_cols.step) - return interpolator(fine_cols, fine_rows) - - class _AzimuthBlock: """Implementation of an single azimuth-noise block.""" @@ -504,42 +498,6 @@ def interpolate_xml_array(self, shape, chunks): return interpolate_xarray_linear(xpoints, ypoints, self.data, shape, chunks=chunks) -def interpolate_xarray(xpoints, ypoints, values, shape, - blocksize=CHUNK_SIZE): - """Interpolate, generating a dask array.""" - from scipy.interpolate import RectBivariateSpline - - try: - blocksize_row, blocksize_col = blocksize - except ValueError: - blocksize_row = blocksize_col = blocksize - - vchunks = range(0, shape[0], blocksize_row) - hchunks = range(0, shape[1], blocksize_col) - - token = tokenize(blocksize, xpoints, ypoints, values, shape) - name = "interpolate-" + token - - spline = RectBivariateSpline(xpoints, ypoints, values.T) - - def interpolator(xnew, ynew): - """Interpolator function.""" - return spline(xnew, ynew).T - - dskx = {(name, i, j): (interpolate_slice, - slice(vcs, min(vcs + blocksize_row, shape[0])), - slice(hcs, min(hcs + blocksize_col, shape[1])), - interpolator) - for i, vcs in enumerate(vchunks) - for j, hcs in enumerate(hchunks) - } - - res = da.Array(dskx, name, shape=list(shape), - chunks=(blocksize_row, blocksize_col), - dtype=values.dtype) - return DataArray(res, dims=("y", "x")) - - def intp(grid_x, grid_y, interpolator): """Interpolate.""" return interpolator((grid_y, grid_x)) @@ -622,8 +580,8 @@ def get_dataset(self, key, info): @cached_property def _data(self): data = xr.open_dataarray(self.filename, engine="rasterio", - chunks="auto" - ).squeeze() + chunks="auto" + ).squeeze() self.chunks = data.data.chunksize data = data.assign_coords(x=np.arange(len(data.coords["x"])), y=np.arange(len(data.coords["y"]))) @@ -669,12 +627,15 @@ def _get_lonlatalts_uncached(self): (xpoints, ypoints), (gcp_lons, gcp_lats, gcp_alts), (gcps, crs) = self.get_gcps() - # FIXME: do interpolation on cartesian coordinates if the area is - # problematic. + fine_points = [np.arange(size) for size in shape] + x, y, z = lonlat2xyz(gcp_lons, gcp_lats) + interpolator = MultipleGridInterpolator((xpoints, ypoints), x, y, z, gcp_alts) + hx, hy, hz, altitudes = interpolator.interpolate(fine_points, method="cubic", chunks=self.chunks) + longitudes, latitudes = xyz2lonlat(hx, hy, hz) - longitudes = interpolate_xarray(xpoints, ypoints, gcp_lons, shape, self.chunks) - latitudes = interpolate_xarray(xpoints, ypoints, gcp_lats, shape, self.chunks) - altitudes = interpolate_xarray(xpoints, ypoints, gcp_alts, shape, self.chunks) + altitudes = xr.DataArray(altitudes, dims=["y", "x"]) + longitudes = xr.DataArray(longitudes, dims=["y", "x"]) + latitudes = xr.DataArray(latitudes, dims=["y", "x"]) longitudes.attrs["gcps"] = gcps longitudes.attrs["crs"] = crs @@ -713,7 +674,6 @@ def get_gcps(self): rio_gcps = [rasterio.control.GroundControlPoint(*gcp) for gcp in gcp_list] - return (xpoints, ypoints), (gcp_lons, gcp_lats, gcp_alts), (rio_gcps, crs) @property diff --git a/satpy/tests/reader_tests/test_sar_c_safe.py b/satpy/tests/reader_tests/test_sar_c_safe.py index c3a90adec1..be4dfb6e1a 100644 --- a/satpy/tests/reader_tests/test_sar_c_safe.py +++ b/satpy/tests/reader_tests/test_sar_c_safe.py @@ -303,7 +303,7 @@ def test_read_lon_lats(self, measurement_filehandler): query = DataQuery(name="longitude", polarization="vv") xarr = measurement_filehandler.get_dataset(query, info=dict()) expected = expected_longitudes - np.testing.assert_allclose(xarr.values, expected[:10, :10]) + np.testing.assert_allclose(xarr.values, expected[:10, :10], atol=1e-3) annotation_xml = b""" @@ -858,7 +858,7 @@ def test_reading_from_reader(measurement_file, calibration_file, noise_file, ann query = DataID(reader._id_keys, **query.to_dict()) dataset_dict = reader.load([query]) array = dataset_dict["measurement"] - np.testing.assert_allclose(array.attrs["area"].lons, expected_longitudes[:10, :10]) + np.testing.assert_allclose(array.attrs["area"].lons, expected_longitudes[:10, :10], atol=1e-3) expected_db = np.array([[np.nan, -15.674268], [4.079997, 5.153585]]) np.testing.assert_allclose(array.values[:2, :2], expected_db) From c45cbb0c5c4fc57f82a7e1583cc6aefac7cbd53d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 09:23:28 +0000 Subject: [PATCH 245/481] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- satpy/tests/test_readers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/test_readers.py b/satpy/tests/test_readers.py index d3f2c72814..2ee2c5b97b 100644 --- a/satpy/tests/test_readers.py +++ b/satpy/tests/test_readers.py @@ -1122,7 +1122,7 @@ def test_open_file_or_filename_uses_mode(tmp_path): res = open_file_or_filename(tmp_path / "hej", mode="rb").read() assert isinstance(res, bytes) - + @pytest.fixture(scope="module") def local_netcdf_filename(tmp_path_factory): """Create a simple local NetCDF file.""" From ae140b3a457dee131a4b7d6b84324c5633b734d4 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Fri, 8 Mar 2024 11:12:20 +0100 Subject: [PATCH 246/481] Make xml parsing more robust --- satpy/readers/sar_c_safe.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/satpy/readers/sar_c_safe.py b/satpy/readers/sar_c_safe.py index dc24bd3a95..4e416b8777 100644 --- a/satpy/readers/sar_c_safe.py +++ b/satpy/readers/sar_c_safe.py @@ -39,6 +39,7 @@ from collections import defaultdict from datetime import timezone as tz from functools import cached_property +from pathlib import Path from threading import Lock import defusedxml.ElementTree as ET @@ -107,7 +108,10 @@ def __init__(self, filename, filename_info, filetype_info, self._start_time = filename_info["start_time"].replace(tzinfo=tz.utc) self._end_time = filename_info["end_time"].replace(tzinfo=tz.utc) self._polarization = filename_info["polarization"] - self.root = ET.parse(open_file_or_filename(self.filename)) + if isinstance(self.filename, str): + self.filename = Path(self.filename) + with self.filename.open() as fd: + self.root = ET.parse(fd) self._image_shape = image_shape def get_metadata(self): @@ -579,7 +583,7 @@ def get_dataset(self, key, info): @cached_property def _data(self): - data = xr.open_dataarray(self.filename, engine="rasterio", + data = xr.open_dataarray(open_file_or_filename(self.filename), engine="rasterio", chunks="auto" ).squeeze() self.chunks = data.data.chunksize @@ -629,7 +633,7 @@ def _get_lonlatalts_uncached(self): fine_points = [np.arange(size) for size in shape] x, y, z = lonlat2xyz(gcp_lons, gcp_lats) - interpolator = MultipleGridInterpolator((xpoints, ypoints), x, y, z, gcp_alts) + interpolator = MultipleGridInterpolator((ypoints, xpoints), x, y, z, gcp_alts) hx, hy, hz, altitudes = interpolator.interpolate(fine_points, method="cubic", chunks=self.chunks) longitudes, latitudes = xyz2lonlat(hx, hy, hz) From 9390945acfbb78cd5b122d7ae8d726762728b852 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Fri, 8 Mar 2024 11:15:01 +0100 Subject: [PATCH 247/481] Fix no mode --- satpy/readers/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/satpy/readers/__init__.py b/satpy/readers/__init__.py index e3946f3a7c..33196b3aab 100644 --- a/satpy/readers/__init__.py +++ b/satpy/readers/__init__.py @@ -783,7 +783,7 @@ def _get_compression(file): return None -def open_file_or_filename(unknown_file_thing, mode="r"): +def open_file_or_filename(unknown_file_thing, mode=None): """Try to open the provided file "thing" if needed, otherwise return the filename or Path. This wraps the logic of getting something like an fsspec OpenFile object @@ -797,7 +797,10 @@ def open_file_or_filename(unknown_file_thing, mode="r"): f_obj = unknown_file_thing else: try: - f_obj = unknown_file_thing.open(mode=mode) + if mode is None: + f_obj = unknown_file_thing.open() + else: + f_obj = unknown_file_thing.open(mode=mode) except AttributeError: f_obj = unknown_file_thing return f_obj From f2e70a061c5d16c548c810d109e7eab44e52c668 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Fri, 8 Mar 2024 11:39:28 +0100 Subject: [PATCH 248/481] Fix modes and tests --- satpy/readers/sar_c_safe.py | 2 +- satpy/tests/reader_tests/test_sar_c_safe.py | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/satpy/readers/sar_c_safe.py b/satpy/readers/sar_c_safe.py index 4e416b8777..e11bcbded3 100644 --- a/satpy/readers/sar_c_safe.py +++ b/satpy/readers/sar_c_safe.py @@ -583,7 +583,7 @@ def get_dataset(self, key, info): @cached_property def _data(self): - data = xr.open_dataarray(open_file_or_filename(self.filename), engine="rasterio", + data = xr.open_dataarray(open_file_or_filename(self.filename, mode="rb"), engine="rasterio", chunks="auto" ).squeeze() self.chunks = data.data.chunksize diff --git a/satpy/tests/reader_tests/test_sar_c_safe.py b/satpy/tests/reader_tests/test_sar_c_safe.py index be4dfb6e1a..9e24c00c4e 100644 --- a/satpy/tests/reader_tests/test_sar_c_safe.py +++ b/satpy/tests/reader_tests/test_sar_c_safe.py @@ -20,7 +20,6 @@ import os from datetime import datetime from enum import Enum -from io import BytesIO from pathlib import Path import numpy as np @@ -106,12 +105,15 @@ def noise_filehandler(noise_file, annotation_filehandler): @pytest.fixture(scope="module") -def noise_with_holes_filehandler(annotation_filehandler): +def noise_with_holes_filehandler(annotation_filehandler, tmpdir_factory): """Create a noise filehandler from data with holes.""" filename_info = dict(start_time=START_TIME, end_time=END_TIME, polarization="vv") - noise_filehandler = Denoiser(BytesIO(noise_xml_with_holes), - filename_info, None, - image_shape=annotation_filehandler.image_shape) + noise_xml_file = tmpdir_factory.mktemp("data").join("noise_with_holes.xml") + with open(noise_xml_file, "wb") as fd: + fd.write(noise_xml_with_holes) + noise_filehandler = Denoiser(noise_xml_file, + filename_info, None, + image_shape=annotation_filehandler.image_shape) return noise_filehandler From 7bc992cedc9746b35f1cbb85d77e9bb56e2a2ecf Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Fri, 8 Mar 2024 12:24:55 +0100 Subject: [PATCH 249/481] Fix modes test --- satpy/tests/test_readers.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/satpy/tests/test_readers.py b/satpy/tests/test_readers.py index 2ee2c5b97b..4b477c6bdf 100644 --- a/satpy/tests/test_readers.py +++ b/satpy/tests/test_readers.py @@ -34,7 +34,7 @@ from satpy.dataset.data_dict import get_key from satpy.dataset.dataid import DataID, ModifierTuple, WavelengthRange -from satpy.readers import find_files_and_readers, open_file_or_filename +from satpy.readers import FSFile, find_files_and_readers, open_file_or_filename # NOTE: # The following fixtures are not defined in this file, but are used and injected by Pytest: @@ -1117,9 +1117,11 @@ def test_hash(self, local_filename, local_filename2, local_zip_file): def test_open_file_or_filename_uses_mode(tmp_path): """Test that open_file_or_filename uses provided mode.""" - with open(tmp_path / "hej", mode="wb") as fd: + filename = tmp_path / "hej" + with open(filename, mode="wb") as fd: fd.write(b"hej") - res = open_file_or_filename(tmp_path / "hej", mode="rb").read() + fileobj = FSFile(os.fspath(filename)) + res = open_file_or_filename(fileobj, mode="rb").read() assert isinstance(res, bytes) From f0c382e8822e7dcbacdd1a85cb67faceeaf7b0e4 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Fri, 8 Mar 2024 12:59:10 +0100 Subject: [PATCH 250/481] Refactor --- satpy/readers/sar_c_safe.py | 63 ++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/satpy/readers/sar_c_safe.py b/satpy/readers/sar_c_safe.py index e11bcbded3..c175b17b3c 100644 --- a/satpy/readers/sar_c_safe.py +++ b/satpy/readers/sar_c_safe.py @@ -735,39 +735,64 @@ def load(self, dataset_keys, **kwargs): def create_storage_items(self, files, **kwargs): """Create the storage items.""" - filenames = files + self.files_by_type = self._get_files_by_type(files) + image_shapes = self._get_image_shapes() + calibrators = self._create_calibrators(image_shapes) + denoisers = self._create_denoisers(image_shapes) + measurement_handlers = self._create_measurement_handlers(calibrators, denoisers) + + self.storage_items = measurement_handlers + + + def _get_files_by_type(self, files): files_by_type = defaultdict(list) for file_type, type_info in self.config["file_types"].items(): - files_by_type[file_type].extend(self.filename_items_for_filetype(filenames, type_info)) + files_by_type[file_type].extend(self.filename_items_for_filetype(files, type_info)) + return files_by_type + + + def _get_image_shapes(self): image_shapes = dict() - for annotation_file, annotation_info in files_by_type["safe_annotation"]: + for annotation_file, annotation_info in self.files_by_type["safe_annotation"]: annotation_fh = SAFEXMLAnnotation(annotation_file, filename_info=annotation_info, filetype_info=None) image_shapes[annotation_info["polarization"]] = annotation_fh.image_shape + return image_shapes + - calibration_handlers = dict() - for calibration_file, calibration_info in files_by_type["safe_calibration"]: + def _create_calibrators(self, image_shapes): + calibrators = dict() + for calibration_file, calibration_info in self.files_by_type["safe_calibration"]: polarization = calibration_info["polarization"] - calibration_handlers[polarization] = Calibrator(calibration_file, - filename_info=calibration_info, - filetype_info=None, - image_shape=image_shapes[polarization]) + calibrators[polarization] = Calibrator(calibration_file, + filename_info=calibration_info, + filetype_info=None, + image_shape=image_shapes[polarization]) - noise_handlers = dict() - for noise_file, noise_info in files_by_type["safe_noise"]: + return calibrators + + + def _create_denoisers(self, image_shapes): + denoisers = dict() + for noise_file, noise_info in self.files_by_type["safe_noise"]: polarization = noise_info["polarization"] - noise_handlers[polarization] = Denoiser(noise_file, - filename_info=noise_info, - filetype_info=None, - image_shape=image_shapes[polarization]) + denoisers[polarization] = Denoiser(noise_file, + filename_info=noise_info, + filetype_info=None, + image_shape=image_shapes[polarization]) + + return denoisers + + def _create_measurement_handlers(self, calibrators, denoisers): measurement_handlers = dict() - for measurement_file, measurement_info in files_by_type["safe_measurement"]: + for measurement_file, measurement_info in self.files_by_type["safe_measurement"]: polarization = measurement_info["polarization"] measurement_handlers[polarization] = SAFEGRD(measurement_file, filename_info=measurement_info, - calibrator=calibration_handlers[polarization], - denoiser=noise_handlers[polarization], + calibrator=calibrators[polarization], + denoiser=denoisers[polarization], filetype_info=None) - self.storage_items = measurement_handlers + + return measurement_handlers From beaf06fd3e0e01b2779d93356ab4352570b2ab41 Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Fri, 8 Mar 2024 14:14:45 +0100 Subject: [PATCH 251/481] Fix bug introduced a few commits back --- satpy/readers/viirs_vgac_l1c_nc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index 47170616ed..578e19bed3 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -83,7 +83,7 @@ def extract_time_data(self, data, nc): """Decode time data.""" reference_time = np.datetime64(datetime.strptime(nc["proj_time0"].attrs["units"], "days since %d/%m/%YT%H:%M:%S")) - delta_part_of_day, delta_full_days = np.modf(nc["proj_time0"].values[0]) + delta_part_of_day, delta_full_days = np.modf(nc["proj_time0"].values) delta_full_days = np.timedelta64(delta_full_days.astype(np.int64), "D").astype("timedelta64[us]") delta_part_of_day = delta_part_of_day * np.timedelta64(1, "D").astype("timedelta64[us]") delta_hours = data.values * np.timedelta64(1, "h").astype("timedelta64[us]") From 85d9117d25612254d37cf6ea79c9c36d6c34e9ce Mon Sep 17 00:00:00 2001 From: "Nina.Hakansson" Date: Fri, 8 Mar 2024 14:29:38 +0100 Subject: [PATCH 252/481] Fixing the bug in the unittest proj_time0 should be a scalar --- satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index b9380fb859..ba9b83d707 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -72,7 +72,7 @@ def nc_filename(tmp_path): delta_full_days = delta_days.astype("timedelta64[D]") hidden_reference_time = reference_time + delta_full_days delta_part_of_days = start_time - hidden_reference_time - proj_time0 = nc.createVariable("proj_time0", np.float64, ("one",)) + proj_time0 = nc.createVariable("proj_time0", np.float64) proj_time0[:] = (delta_full_days.astype(np.int64) + 0.000001 * delta_part_of_days.astype("timedelta64[us]").astype(np.int64) / (60 * 60 * 24)) proj_time0.units = "days since 01/01/2010T00:00:00" From eb31813965f3a655c6035eb2e258e5b66b0138a0 Mon Sep 17 00:00:00 2001 From: Florian Fichtner <12199342+fwfichtner@users.noreply.github.com> Date: Thu, 14 Mar 2024 09:26:10 +0100 Subject: [PATCH 253/481] add defusedxml to msi_safe --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 16c2b95512..5c16c2918a 100644 --- a/setup.py +++ b/setup.py @@ -47,7 +47,7 @@ "amsr2_l1b": ["h5py >= 2.7.0"], "hrpt": ["pyorbital >= 1.3.1", "pygac", "python-geotiepoints >= 1.1.7"], "hrit_msg": ["pytroll-schedule"], - "msi_safe": ["rioxarray", "bottleneck", "python-geotiepoints"], + "msi_safe": ["rioxarray", "bottleneck", "python-geotiepoints", "defusedxml"], "nc_nwcsaf_msg": ["netCDF4 >= 1.1.8"], "sar_c": ["python-geotiepoints >= 1.1.7", "rasterio", "rioxarray", "defusedxml"], "abi_l1b": ["h5netcdf"], From 25e662459a89cf135c16f85a7d021eb9ff93317f Mon Sep 17 00:00:00 2001 From: Florian Fichtner <12199342+fwfichtner@users.noreply.github.com> Date: Thu, 14 Mar 2024 09:31:06 +0100 Subject: [PATCH 254/481] add avhrr_l1b_eps extra because of missing defusedxml --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 5c16c2918a..2f467286d0 100644 --- a/setup.py +++ b/setup.py @@ -35,6 +35,7 @@ extras_require = { # Readers: + "avhrr_l1b_eps": ["defusedxml"], "avhrr_l1b_gaclac": ["pygac >= 1.3.0"], "modis_l1b": ["pyhdf", "python-geotiepoints >= 1.1.7"], "geocat": ["pyhdf"], From 45f918e1b98b8718c32467766ecfbb918d7c7b0a Mon Sep 17 00:00:00 2001 From: Florian Fichtner <12199342+fwfichtner@users.noreply.github.com> Date: Thu, 14 Mar 2024 10:51:40 +0100 Subject: [PATCH 255/481] add to authors list --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index d976cf318f..fb43d0168d 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -26,6 +26,7 @@ The following people have made contributions to this project: - [Adam Dybbroe (adybbroe)](https://github.com/adybbroe) - [Ulrik Egede (egede)](https://github.com/egede) - [Joleen Feltz (joleenf)](https://github.com/joleenf) +- [Florian Fichtner (fwfichtner)](https://github.com/fwfichtner) - [Stephan Finkensieper (sfinkens)](https://github.com/sfinkens) - Deutscher Wetterdienst - [Gionata Ghiggi (ghiggi)](https://github.com/ghiggi) - [Andrea Grillini (AppLEaDaY)](https://github.com/AppLEaDaY) From f592d9d68f9a2d5927281364b896d3b690e55e9f Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 18 Mar 2024 14:24:01 +0100 Subject: [PATCH 256/481] Add support for EO-SIP AVHRR LAC data --- satpy/etc/readers/avhrr_l1b_gaclac.yaml | 1 + satpy/readers/avhrr_l1b_gaclac.py | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/satpy/etc/readers/avhrr_l1b_gaclac.yaml b/satpy/etc/readers/avhrr_l1b_gaclac.yaml index 484bed6797..a547815072 100644 --- a/satpy/etc/readers/avhrr_l1b_gaclac.yaml +++ b/satpy/etc/readers/avhrr_l1b_gaclac.yaml @@ -185,3 +185,4 @@ file_types: file_patterns: - '{creation_site:3s}.{transfer_mode:4s}.{platform_id:2s}.D{start_time:%y%j.S%H%M}.E{end_time:%H%M}.B{orbit_number:05d}{end_orbit_last_digits:02d}.{station:2s}' - '{subscription_prefix:10d}.{creation_site:3s}.{transfer_mode:4s}.{platform_id:2s}.D{start_time:%y%j.S%H%M}.E{end_time:%H%M}.B{orbit_number:05d}{end_orbit_last_digits:02d}.{station:2s}' + - '{platform_id:3s}_RPRO_AVH_L1B_1P_{start_time:%Y%m%dT%H%M%S}_{end_time:%Y%m%dT%H%M%S}_{orbit_number:06d}/image.l1b' diff --git a/satpy/readers/avhrr_l1b_gaclac.py b/satpy/readers/avhrr_l1b_gaclac.py index cfc3e1283e..6da23e2021 100644 --- a/satpy/readers/avhrr_l1b_gaclac.py +++ b/satpy/readers/avhrr_l1b_gaclac.py @@ -98,15 +98,17 @@ def __init__(self, filename, filename_info, filetype_info, # noqa: D417 if self._end_time < self._start_time: self._end_time += timedelta(days=1) self.platform_id = filename_info["platform_id"] - if self.platform_id in ["NK", "NL", "NM", "NN", "NP", "M1", "M2", - "M3"]: + if self.platform_id in ["NK", "NL", "NM", "NN", "NP", + "M1", "M2", "M3", + "N15", "N16", "N17", "N18", "N19"]: if filename_info.get("transfer_mode") == "GHRR": self.reader_class = GACKLMReader else: self.reader_class = LACKLMReader self.chn_dict = AVHRR3_CHANNEL_NAMES self.sensor = "avhrr-3" - elif self.platform_id in ["NC", "ND", "NF", "NH", "NJ"]: + elif self.platform_id in ["NC", "NE", "NF", "NG", "NH", "ND", "NJ", + "N07", "N08", "N09", "N10", "N11", "N12", "N14"]: if filename_info.get("transfer_mode") == "GHRR": self.reader_class = GACPODReader else: From 64dd1087fe703e63f38b89c7dcd7a98c9f37fd3c Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 18 Mar 2024 15:27:17 +0100 Subject: [PATCH 257/481] Guess if the format of LAC is eosip --- satpy/readers/avhrr_l1b_gaclac.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/satpy/readers/avhrr_l1b_gaclac.py b/satpy/readers/avhrr_l1b_gaclac.py index 6da23e2021..26e41387e6 100644 --- a/satpy/readers/avhrr_l1b_gaclac.py +++ b/satpy/readers/avhrr_l1b_gaclac.py @@ -98,9 +98,14 @@ def __init__(self, filename, filename_info, filetype_info, # noqa: D417 if self._end_time < self._start_time: self._end_time += timedelta(days=1) self.platform_id = filename_info["platform_id"] + + if len(self.platform_id) == 3: + self.reader_kwargs["eosip_header"] = True + if self.platform_id in ["NK", "NL", "NM", "NN", "NP", + "N15", "N16", "N17", "N18", "N19", "M1", "M2", "M3", - "N15", "N16", "N17", "N18", "N19"]: + "MOB", "MOA", "MOC"]: if filename_info.get("transfer_mode") == "GHRR": self.reader_class = GACKLMReader else: From f0c238ca2448588e3d4dd691e57926bf04bd90ba Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 18 Mar 2024 15:47:16 +0100 Subject: [PATCH 258/481] Add a test --- .../reader_tests/test_avhrr_l1b_gaclac.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py index dfcaff4514..42298af130 100644 --- a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py +++ b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py @@ -26,6 +26,7 @@ import xarray as xr GAC_PATTERN = '{creation_site:3s}.{transfer_mode:4s}.{platform_id:2s}.D{start_time:%y%j.S%H%M}.E{end_time:%H%M}.B{orbit_number:05d}{end_orbit_last_digits:02d}.{station:2s}' # noqa +EOSIP_PATTERN = '{platform_id:3s}_RPRO_AVH_L1B_1P_{start_time:%Y%m%dT%H%M%S}_{end_time:%Y%m%dT%H%M%S}_{orbit_number:06d}/image.l1b' # noqa GAC_POD_FILENAMES = ["NSS.GHRR.NA.D79184.S1150.E1337.B0008384.WI", "NSS.GHRR.NA.D79184.S2350.E0137.B0008384.WI", @@ -68,6 +69,8 @@ "NSS.FRAC.M2.D12153.S1729.E1910.B2915354.SV", "NSS.LHRR.NP.D16306.S1803.E1814.B3985555.WI"] +LAC_EOSIP_FILENAMES = ["N06_RPRO_AVH_L1B_1P_20061206T010808_20061206T012223_007961/image.l1b"] + @mock.patch("satpy.readers.avhrr_l1b_gaclac.GACLACFile.__init__", return_value=None) def _get_fh_mocked(init_mock, **attrs): @@ -138,6 +141,12 @@ def _get_fh(self, filename="NSS.GHRR.NG.D88002.S0614.E0807.B0670506.WI", filename_info = parse(GAC_PATTERN, filename) return self.GACLACFile(filename, filename_info, {}, **kwargs) + def _get_eosip_fh(self, filename, **kwargs): + """Create a file handler.""" + from trollsift import parse + filename_info = parse(EOSIP_PATTERN, filename) + return self.GACLACFile(filename, filename_info, {}, **kwargs) + def test_init(self): """Test GACLACFile initialization.""" from pygac.gac_klm import GACKLMReader @@ -161,6 +170,28 @@ def test_init(self): assert fh.start_time < fh.end_time assert fh.reader_class is reader_cls + + def test_init_eosip(self): + """Test GACLACFile initialization.""" + from pygac.lac_pod import LACPODReader + + kwargs = {"start_line": 1, + "end_line": 2, + "strip_invalid_coords": True, + "interpolate_coords": True, + "adjust_clock_drift": True, + "tle_dir": "tle_dir", + "tle_name": "tle_name", + "tle_thresh": 123, + "calibration": "calibration"} + for filenames, reader_cls in zip([LAC_EOSIP_FILENAMES], + [LACPODReader]): + for filename in filenames: + fh = self._get_eosip_fh(filename, **kwargs) + assert fh.start_time < fh.end_time + assert fh.reader_class is reader_cls + assert fh.reader_kwargs["eosip_header"] is True + def test_read_raw_data(self): """Test raw data reading.""" fh = _get_fh_mocked(reader=None, From 0bc8a429c9f036499d172ae4085a7bf631ae004b Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 18 Mar 2024 17:47:55 +0100 Subject: [PATCH 259/481] Refactor --- satpy/readers/avhrr_l1b_gaclac.py | 20 ++++++++++++------- .../reader_tests/test_avhrr_l1b_gaclac.py | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/satpy/readers/avhrr_l1b_gaclac.py b/satpy/readers/avhrr_l1b_gaclac.py index 26e41387e6..8f31fa765a 100644 --- a/satpy/readers/avhrr_l1b_gaclac.py +++ b/satpy/readers/avhrr_l1b_gaclac.py @@ -100,20 +100,16 @@ def __init__(self, filename, filename_info, filetype_info, # noqa: D417 self.platform_id = filename_info["platform_id"] if len(self.platform_id) == 3: - self.reader_kwargs["eosip_header"] = True + self.reader_kwargs["header_datetime"] = datetime(2000, 1, 1) - if self.platform_id in ["NK", "NL", "NM", "NN", "NP", - "N15", "N16", "N17", "N18", "N19", - "M1", "M2", "M3", - "MOB", "MOA", "MOC"]: + if self._is_avhrr3(): if filename_info.get("transfer_mode") == "GHRR": self.reader_class = GACKLMReader else: self.reader_class = LACKLMReader self.chn_dict = AVHRR3_CHANNEL_NAMES self.sensor = "avhrr-3" - elif self.platform_id in ["NC", "NE", "NF", "NG", "NH", "ND", "NJ", - "N07", "N08", "N09", "N10", "N11", "N12", "N14"]: + elif self._is_avhrr2(): if filename_info.get("transfer_mode") == "GHRR": self.reader_class = GACPODReader else: @@ -129,6 +125,16 @@ def __init__(self, filename, filename_info, filetype_info, # noqa: D417 self.sensor = "avhrr" self.filename_info = filename_info + def _is_avhrr2(self): + return self.platform_id in ["NC", "NE", "NF", "NG", "NH", "ND", "NJ", + "N07", "N08", "N09", "N10", "N11", "N12", "N14"] + + def _is_avhrr3(self): + return self.platform_id in ["NK", "NL", "NM", "NN", "NP", + "N15", "N16", "N17", "N18", "N19", + "M1", "M2", "M3", + "MOB", "MOA", "MOC"] + def read_raw_data(self): """Create a pygac reader and read raw data from the file.""" if self.reader is None: diff --git a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py index 42298af130..8549cccc75 100644 --- a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py +++ b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py @@ -190,7 +190,7 @@ def test_init_eosip(self): fh = self._get_eosip_fh(filename, **kwargs) assert fh.start_time < fh.end_time assert fh.reader_class is reader_cls - assert fh.reader_kwargs["eosip_header"] is True + assert fh.reader_kwargs["header_datetime"] > datetime.date(1994, 11, 15) def test_read_raw_data(self): """Test raw data reading.""" From 0064e2197f5d4fabef5060fc48541831eb959345 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 18 Mar 2024 18:02:34 +0100 Subject: [PATCH 260/481] Replace header_datetime with header_date --- satpy/readers/avhrr_l1b_gaclac.py | 4 ++-- satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/readers/avhrr_l1b_gaclac.py b/satpy/readers/avhrr_l1b_gaclac.py index 8f31fa765a..96a13449f7 100644 --- a/satpy/readers/avhrr_l1b_gaclac.py +++ b/satpy/readers/avhrr_l1b_gaclac.py @@ -30,7 +30,7 @@ """ import logging -from datetime import datetime, timedelta +from datetime import date, datetime, timedelta import dask.array as da import numpy as np @@ -100,7 +100,7 @@ def __init__(self, filename, filename_info, filetype_info, # noqa: D417 self.platform_id = filename_info["platform_id"] if len(self.platform_id) == 3: - self.reader_kwargs["header_datetime"] = datetime(2000, 1, 1) + self.reader_kwargs["header_date"] = date(2000, 1, 1) if self._is_avhrr3(): if filename_info.get("transfer_mode") == "GHRR": diff --git a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py index 8549cccc75..e67f3cff2c 100644 --- a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py +++ b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py @@ -190,7 +190,7 @@ def test_init_eosip(self): fh = self._get_eosip_fh(filename, **kwargs) assert fh.start_time < fh.end_time assert fh.reader_class is reader_cls - assert fh.reader_kwargs["header_datetime"] > datetime.date(1994, 11, 15) + assert fh.reader_kwargs["header_date"] > datetime.date(1994, 11, 15) def test_read_raw_data(self): """Test raw data reading.""" From 276aa7dbeffcbb70085abac4418e377281b1806c Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Tue, 19 Mar 2024 07:28:35 +0100 Subject: [PATCH 261/481] Fix import --- satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py index e67f3cff2c..4f4e8e974a 100644 --- a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py +++ b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py @@ -17,7 +17,7 @@ # satpy. If not, see . """Pygac interface.""" -from datetime import datetime +from datetime import date, datetime from unittest import TestCase, mock import dask.array as da @@ -190,7 +190,7 @@ def test_init_eosip(self): fh = self._get_eosip_fh(filename, **kwargs) assert fh.start_time < fh.end_time assert fh.reader_class is reader_cls - assert fh.reader_kwargs["header_date"] > datetime.date(1994, 11, 15) + assert fh.reader_kwargs["header_date"] > date(1994, 11, 15) def test_read_raw_data(self): """Test raw data reading.""" From 5ffe15ef34327f58430c0585c5c95a0911368ef1 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Tue, 19 Mar 2024 19:28:27 +0100 Subject: [PATCH 262/481] Force newer botocore --- continuous_integration/environment.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/continuous_integration/environment.yaml b/continuous_integration/environment.yaml index f1a89319a8..4fc7a508f2 100644 --- a/continuous_integration/environment.yaml +++ b/continuous_integration/environment.yaml @@ -47,6 +47,7 @@ dependencies: - pytest-cov - pytest-lazy-fixture - fsspec + - botocore>=1.33 - s3fs - python-geotiepoints - pooch From 7126f752b1a123908b2aba837bab7f984e14ef5c Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Tue, 19 Mar 2024 23:19:04 +0100 Subject: [PATCH 263/481] Replace setup with pyproject.toml --- pyproject.toml | 121 ++++++++++++++++++++++++++++++++-- setup.cfg | 25 ------- setup.py | 172 ------------------------------------------------- 3 files changed, 117 insertions(+), 201 deletions(-) delete mode 100644 setup.cfg delete mode 100644 setup.py diff --git a/pyproject.toml b/pyproject.toml index 537f70cabb..35ba5e8dc2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,122 @@ +[project] +name = "satpy" +dynamic = ["version"] +description = "Python package for earth-observing satellite data processing" +authors = [ + { name = "The Pytroll Team", email = "pytroll@googlegroups.com" } +] +dependencies = [ + "appdirs", + "dask[array]>=0.17.1", + "donfig", + "numpy>=1.21", + "packaging", + "pillow", + "pooch", + "pykdtree", + "pyorbital", + "pyproj>=2.2", + "pyresample>=1.24.0", + "pyyaml>=5.1", + "trollimage>=1.23", + "trollsift", + "xarray>=0.14.1", + "zarr", +] +readme = "README.rst" +requires-python = ">=3.9" +license = { text = "GPLv3" } +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Topic :: Scientific/Engineering" +] + +[project.optional-dependencies] +avhrr_l1b_eps = ["defusedxml"] +avhrr_l1b_gaclac = ["pygac >= 1.3.0"] +modis_l1b = ["pyhdf", "python-geotiepoints >= 1.1.7"] +geocat = ["pyhdf"] +acspo = ["netCDF4 >= 1.1.8"] +clavrx = ["netCDF4 >= 1.1.8"] +viirs_l1b = ["netCDF4 >= 1.1.8"] +viirs_sdr = ["h5py >= 2.7.0"] +viirs_compact = ["h5py >= 2.7.0"] +omps_edr = ["h5py >= 2.7.0"] +amsr2_l1b = ["h5py >= 2.7.0"] +hrpt = ["pyorbital >= 1.3.1", "pygac", "python-geotiepoints >= 1.1.7"] +hrit_msg = ["pytroll-schedule"] +msi_safe = ["rioxarray", "bottleneck", "python-geotiepoints", "defusedxml"] +nc_nwcsaf_msg = ["netCDF4 >= 1.1.8"] +sar_c = ["python-geotiepoints >= 1.1.7", "rasterio", "rioxarray", "defusedxml"] +abi_l1b = ["h5netcdf"] +seviri_l1b_hrit = ["pyorbital >= 1.3.1"] +seviri_l1b_native = ["pyorbital >= 1.3.1"] +seviri_l1b_nc = ["pyorbital >= 1.3.1", "netCDF4 >= 1.1.8"] +seviri_l2_bufr = ["eccodes"] +seviri_l2_grib = ["eccodes"] +hsaf_grib = ["pygrib"] +remote_reading = ["fsspec"] +insat_3d = ["xarray-datatree"] +gms5-vissr_l1b = ["numba"] +# Writers: +cf = ["h5netcdf >= 0.7.3"] +awips_tiled = ["netCDF4 >= 1.1.8"] +geotiff = ["rasterio", "trollimage[geotiff]"] +ninjo = ["pyninjotiff", "pint"] +units = ["pint-xarray"] +# Composites/Modifiers: +rayleigh = ["pyspectral >= 0.10.1"] +angles = ["pyorbital >= 1.3.1"] +filters = ["dask-image"] +# MultiScene: +animations = ["imageio"] +# Documentation: +doc = ["sphinx", "sphinx_rtd_theme", "sphinxcontrib-apidoc"] +# Other +geoviews = ["geoviews"] +holoviews = ["holoviews"] +hvplot = ["hvplot", "geoviews", "cartopy", "holoviews"] +overlays = ["pycoast", "pydecorate"] +satpos_from_tle = ["skyfield", "astropy"] +tests = ["behave", "h5py", "netCDF4", "pyhdf", "imageio", + "rasterio", "geoviews", "trollimage", "fsspec", "bottleneck", + "rioxarray", "pytest", "pytest-lazy-fixture", "defusedxml", + "s3fs", "eccodes", "h5netcdf", "xarray-datatree", + "skyfield", "ephem", "pint-xarray", "astropy", "dask-image", "python-geotiepoints", "numba"] + +[project.scripts] +satpy_retrieve_all_aux_data = "satpy.aux_download:retrieve_all_cmd" + +[project.urls] +Homepage = "https://github.com/pytroll/satpy" +"Bug Tracker" = "https://github.com/pytroll/satpy/issues" +Documentation = "https://satpy.readthedocs.io/en/stable/" +"Source Code" = "https://github.com/pytroll/satpy" +Organization = "https://pytroll.github.io/" +Slack = "https://pytroll.slack.com/" +Twitter = "https://twitter.com/hashtag/satpy?src=hashtag_click" +"Release Notes" = "https://github.com/pytroll/satpy/blob/main/CHANGELOG.md" +Mastodon = "https://fosstodon.org/tags/satpy" + [build-system] -requires = ["setuptools>=60", "wheel", "setuptools_scm[toml]>=8.0"] -build-backend = "setuptools.build_meta" +requires = ["hatchling", "hatch-vcs"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["satpy"] + +[tool.hatch.version] +source = "vcs" -[tool.setuptools_scm] -write_to = "satpy/version.py" +[tool.hatch.build.hooks.vcs] +version-file = "satpy/version.py" [tool.isort] sections = ["FUTURE", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 205f924b33..0000000000 --- a/setup.cfg +++ /dev/null @@ -1,25 +0,0 @@ -[bdist_rpm] -requires=h5py pyresample python2-numexpr pyhdf xarray dask h5netcdf -release=1 -doc_files = doc/Makefile doc/source/*.rst doc/examples/*.py - -[bdist_wheel] -universal=1 - -[flake8] -max-line-length = 120 -exclude = - satpy/readers/li_l2.py - satpy/readers/scatsat1_l2b.py - satpy/version.py - satpy/tests/features -per-file-ignores = - satpy/tests/*/conftest.py:F401 - satpy/tests/*/*/conftest.py:F401 - doc/source/doi_role.py:D103 - satpy/tests/features/steps/*.py:F811 - -[coverage:run] -relative_files = True -omit = - satpy/version.py diff --git a/setup.py b/setup.py deleted file mode 100644 index 2f467286d0..0000000000 --- a/setup.py +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (c) 2009-2023 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 . -"""Setup file for satpy.""" - -import os.path -from glob import glob - -from setuptools import find_packages, setup - -requires = ["numpy >=1.21", "pillow", "pyresample >=1.24.0", "trollsift", - "trollimage >=1.23", "pykdtree", "pyyaml >=5.1", "xarray >=0.14.1", - "dask[array] >=0.17.1", "pyproj>=2.2", "zarr", "donfig", "appdirs", - "packaging", "pooch", "pyorbital"] - -test_requires = ["behave", "h5py", "netCDF4", "pyhdf", "imageio", - "rasterio", "geoviews", "trollimage", "fsspec", "bottleneck", - "rioxarray", "pytest", "pytest-lazy-fixture", "defusedxml", - "s3fs", "eccodes", "h5netcdf", "xarray-datatree", - "skyfield", "ephem", "pint-xarray", "astropy", "dask-image"] - -extras_require = { - # Readers: - "avhrr_l1b_eps": ["defusedxml"], - "avhrr_l1b_gaclac": ["pygac >= 1.3.0"], - "modis_l1b": ["pyhdf", "python-geotiepoints >= 1.1.7"], - "geocat": ["pyhdf"], - "acspo": ["netCDF4 >= 1.1.8"], - "clavrx": ["netCDF4 >= 1.1.8"], - "viirs_l1b": ["netCDF4 >= 1.1.8"], - "viirs_sdr": ["h5py >= 2.7.0"], - "viirs_compact": ["h5py >= 2.7.0"], - "omps_edr": ["h5py >= 2.7.0"], - "amsr2_l1b": ["h5py >= 2.7.0"], - "hrpt": ["pyorbital >= 1.3.1", "pygac", "python-geotiepoints >= 1.1.7"], - "hrit_msg": ["pytroll-schedule"], - "msi_safe": ["rioxarray", "bottleneck", "python-geotiepoints", "defusedxml"], - "nc_nwcsaf_msg": ["netCDF4 >= 1.1.8"], - "sar_c": ["python-geotiepoints >= 1.1.7", "rasterio", "rioxarray", "defusedxml"], - "abi_l1b": ["h5netcdf"], - "seviri_l1b_hrit": ["pyorbital >= 1.3.1"], - "seviri_l1b_native": ["pyorbital >= 1.3.1"], - "seviri_l1b_nc": ["pyorbital >= 1.3.1", "netCDF4 >= 1.1.8"], - "seviri_l2_bufr": ["eccodes"], - "seviri_l2_grib": ["eccodes"], - "hsaf_grib": ["pygrib"], - "remote_reading": ["fsspec"], - "insat_3d": ["xarray-datatree"], - "gms5-vissr_l1b": ["numba"], - # Writers: - "cf": ["h5netcdf >= 0.7.3"], - "awips_tiled": ["netCDF4 >= 1.1.8"], - "geotiff": ["rasterio", "trollimage[geotiff]"], - "ninjo": ["pyninjotiff", "pint"], - "units": ["pint-xarray"], - # Composites/Modifiers: - "rayleigh": ["pyspectral >= 0.10.1"], - "angles": ["pyorbital >= 1.3.1"], - "filters": ["dask-image"], - # MultiScene: - "animations": ["imageio"], - # Documentation: - "doc": ["sphinx", "sphinx_rtd_theme", "sphinxcontrib-apidoc"], - # Other - "geoviews": ["geoviews"], - "holoviews": ["holoviews"], - "hvplot": ["hvplot", "geoviews", "cartopy", "holoviews"], - "overlays": ["pycoast", "pydecorate"], - "satpos_from_tle": ["skyfield", "astropy"], - "tests": test_requires, -} -all_extras = [] -for extra_deps in extras_require.values(): - all_extras.extend(extra_deps) -extras_require["all"] = list(set(all_extras)) - - -def _config_data_files(base_dirs, extensions=(".cfg", )): - """Find all subdirectory configuration files. - - Searches each base directory relative to this setup.py file and finds - all files ending in the extensions provided. - - :param base_dirs: iterable of relative base directories to search - :param extensions: iterable of file extensions to include (with '.' prefix) - :returns: list of 2-element tuples compatible with `setuptools.setup` - """ - data_files = [] - pkg_root = os.path.realpath(os.path.dirname(__file__)) + "/" - for base_dir in base_dirs: - new_data_files = [] - for ext in extensions: - configs = glob(os.path.join(pkg_root, base_dir, "*" + ext)) - configs = [c.replace(pkg_root, "") for c in configs] - new_data_files.extend(configs) - data_files.append((base_dir, new_data_files)) - - return data_files - - -entry_points = { - "console_scripts": [ - "satpy_retrieve_all_aux_data=satpy.aux_download:retrieve_all_cmd", - ], -} - - -NAME = "satpy" -with open("README.rst", "r") as readme: - README = readme.read() - -setup(name=NAME, - description="Python package for earth-observing satellite data processing", - long_description=README, - author="The Pytroll Team", - author_email="pytroll@googlegroups.com", - classifiers=["Development Status :: 5 - Production/Stable", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: GNU General Public License v3 " + - "or later (GPLv3+)", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Topic :: Scientific/Engineering"], - url="https://github.com/pytroll/satpy", - download_url="https://pypi.python.org/pypi/satpy", - project_urls={ - "Bug Tracker": "https://github.com/pytroll/satpy/issues", - "Documentation": "https://satpy.readthedocs.io/en/stable/", - "Source Code": "https://github.com/pytroll/satpy", - "Organization": "https://pytroll.github.io/", - "Slack": "https://pytroll.slack.com/", - "Twitter": "https://twitter.com/hashtag/satpy?src=hashtag_click", - "Release Notes": "https://github.com/pytroll/satpy/blob/main/CHANGELOG.md", - "Mastodon": "https://fosstodon.org/tags/satpy", - }, - packages=find_packages(), - # Always use forward '/', even on Windows - # See https://setuptools.readthedocs.io/en/latest/userguide/datafiles.html#data-files-support - package_data={"satpy": ["etc/geo_image.cfg", - "etc/areas.yaml", - "etc/satpy.cfg", - "etc/himawari-8.cfg", - "etc/eps_avhrrl1b_6.5.xml", - "etc/readers/*.yaml", - "etc/writers/*.yaml", - "etc/composites/*.yaml", - "etc/enhancements/*.cfg", - "etc/enhancements/*.yaml", - "tests/etc/readers/*.yaml", - "tests/etc/composites/*.yaml", - "tests/etc/writers/*.yaml", - ]}, - zip_safe=False, - install_requires=requires, - python_requires=">=3.9", - extras_require=extras_require, - entry_points=entry_points, - ) From 8a54645041884bacf02a3209e2d07f95deaa62c9 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Wed, 20 Mar 2024 11:50:02 +0100 Subject: [PATCH 264/481] Update gitignore --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 8990fa1d46..4803714590 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,9 @@ doc/source/_build/* satpy/version.py doc/source/api/*.rst doc/source/reader_table.rst + +# lock files +*.lock + +# rye files +.python-version From 30a0e6a1159ffe684194dbcbbdd55401272104d9 Mon Sep 17 00:00:00 2001 From: Pierre de Buyl Date: Fri, 22 Mar 2024 10:15:28 +0100 Subject: [PATCH 265/481] Add Data Store to EUMETSAT part --- doc/source/data_download.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/source/data_download.rst b/doc/source/data_download.rst index b8742fac96..8cabacd58a 100644 --- a/doc/source/data_download.rst +++ b/doc/source/data_download.rst @@ -72,7 +72,8 @@ NASA VIIRS Atmosphere SIPS * `Resource Description `__ * Associated Readers: ``viirs_l1b`` -EUMETSAT Data Center --------------------- +EUMETSAT Data Store and Data Center +----------------------------------- -* `Data Ordering `__ +* EUMETSAT's primary source for data is the `Data Store `__ +* Some products remain available on the `Earth Observation Portal `__ From 23e150c4d99666993e1c3520d7005b2cc155da96 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 25 Mar 2024 19:00:08 +0100 Subject: [PATCH 266/481] Use flags from file --- satpy/readers/olci_nc.py | 32 +++++++---- satpy/tests/reader_tests/test_olci_nc.py | 67 ++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 11 deletions(-) diff --git a/satpy/readers/olci_nc.py b/satpy/readers/olci_nc.py index 84b21c3284..649984add1 100644 --- a/satpy/readers/olci_nc.py +++ b/satpy/readers/olci_nc.py @@ -70,17 +70,27 @@ class BitFlags: def __init__(self, value, flag_list=None): """Init the flags.""" self._value = value - flag_list = flag_list or ["INVALID", "WATER", "LAND", "CLOUD", "SNOW_ICE", - "INLAND_WATER", "TIDAL", "COSMETIC", "SUSPECT", - "HISOLZEN", "SATURATED", "MEGLINT", "HIGHGLINT", - "WHITECAPS", "ADJAC", "WV_FAIL", "PAR_FAIL", - "AC_FAIL", "OC4ME_FAIL", "OCNN_FAIL", - "Extra_1", - "KDM_FAIL", - "Extra_2", - "CLOUD_AMBIGUOUS", "CLOUD_MARGIN", "BPAC_ON", "WHITE_SCATT", - "LOWRW", "HIGHRW"] - self.meaning = {f: i for i, f in enumerate(flag_list)} + + if flag_list is None: + try: + meanings = value.attrs["flag_meanings"].split() + masks = value.attrs["flag_masks"] + except AttributeError: + meanings = ["INVALID", "WATER", "LAND", "CLOUD", "SNOW_ICE", + "INLAND_WATER", "TIDAL", "COSMETIC", "SUSPECT", + "HISOLZEN", "SATURATED", "MEGLINT", "HIGHGLINT", + "WHITECAPS", "ADJAC", "WV_FAIL", "PAR_FAIL", + "AC_FAIL", "OC4ME_FAIL", "OCNN_FAIL", + "Extra_1", + "KDM_FAIL", + "Extra_2", + "CLOUD_AMBIGUOUS", "CLOUD_MARGIN", "BPAC_ON", "WHITE_SCATT", + "LOWRW", "HIGHRW"] + self.meaning = {meaning: mask for mask, meaning in enumerate(meanings)} + else: + self.meaning = {meaning: int(np.log2(mask)) for meaning, mask in zip(meanings, masks)} + else: + self.meaning = {meaning: mask for mask, meaning in enumerate(flag_list)} def __getitem__(self, item): """Get the item.""" diff --git a/satpy/tests/reader_tests/test_olci_nc.py b/satpy/tests/reader_tests/test_olci_nc.py index 2f37fb2098..fe03521635 100644 --- a/satpy/tests/reader_tests/test_olci_nc.py +++ b/satpy/tests/reader_tests/test_olci_nc.py @@ -274,3 +274,70 @@ def test_bitflags(self): False, False, True, True, False, False, True, False]) assert all(mask == expected) + + def test_bitflags_with_non_linear_meanings(self): + """Test reading bitflags from DataArray attributes.""" + from functools import reduce + + import numpy as np + import xarray as xr + + from satpy.readers.olci_nc import BitFlags + + flag_masks = [1, 2, 4, 8, 4194304, 8388608, 16777216, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, + 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 33554432, 67108864, 134217728, 268435456, + 536870912, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, + 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, + 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, + 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, + 36028797018963968] + flag_meanings = ("INVALID WATER LAND CLOUD TURBID_ATM CLOUD_AMBIGUOUS CLOUD_MARGIN SNOW_ICE INLAND_WATER " + "COASTLINE TIDAL COSMETIC SUSPECT HISOLZEN SATURATED MEGLINT HIGHGLINT WHITECAPS ADJAC " + "WV_FAIL PAR_FAIL AC_FAIL OC4ME_FAIL OCNN_FAIL KDM_FAIL BPAC_ON WHITE_SCATT LOWRW HIGHRW " + "IOP_LSD_FAIL ANNOT_ANGSTROM ANNOT_AERO_B ANNOT_ABSO_D ANNOT_ACLIM ANNOT_ABSOA ANNOT_MIXR1 " + "ANNOT_DROUT ANNOT_TAU06 RWNEG_O1 RWNEG_O2 RWNEG_O3 RWNEG_O4 RWNEG_O5 RWNEG_O6 RWNEG_O7 " + "RWNEG_O8 RWNEG_O9 RWNEG_O10 RWNEG_O11 RWNEG_O12 RWNEG_O16 RWNEG_O17 RWNEG_O18 RWNEG_O21") + + bits = np.array([1 << x for x in range(int(np.log2(max(flag_masks))) + 1)]) + bits_array = xr.DataArray(bits, attrs=dict(flag_masks=flag_masks, flag_meanings=flag_meanings)) + bflags = BitFlags(bits_array) + + items = ["INVALID", "TURBID_ATM"] + mask = reduce(np.logical_or, [bflags[item] for item in items]) + + assert mask[0].item() is True + assert any(mask[1:22]) is False + assert mask[22].item() is True + assert any(mask[23:]) is False + + + def test_bitflags_with_custom_flag_list(self): + """Test the BitFlags class providing a flag list.""" + from functools import reduce + + import numpy as np + + from satpy.readers.olci_nc import BitFlags + flag_list = ["INVALID", "WATER", "LAND", "CLOUD", "SNOW_ICE", + "INLAND_WATER", "TIDAL", "COSMETIC", "SUSPECT", "HISOLZEN", + "SATURATED", "MEGLINT", "HIGHGLINT", "WHITECAPS", + "ADJAC", "WV_FAIL", "PAR_FAIL", "AC_FAIL", "OC4ME_FAIL", + "OCNN_FAIL", "Extra_1", "KDM_FAIL", "Extra_2", + "CLOUD_AMBIGUOUS", "CLOUD_MARGIN", "BPAC_ON", + "WHITE_SCATT", "LOWRW", "HIGHRW"] + + bits = np.array([1 << x for x in range(len(flag_list))]) + + bflags = BitFlags(bits, flag_list) + + items = ["INVALID", "SNOW_ICE", "INLAND_WATER", "SUSPECT", + "AC_FAIL", "CLOUD", "HISOLZEN", "OCNN_FAIL", + "CLOUD_MARGIN", "CLOUD_AMBIGUOUS", "LOWRW", "LAND"] + + mask = reduce(np.logical_or, [bflags[item] for item in items]) + expected = np.array([True, False, True, True, True, True, False, + False, True, True, False, False, False, False, + False, False, False, True, False, True, False, + False, False, True, True, False, False, True, + False]) + assert all(mask == expected) From 3aa2f7915659302d3a84872dba7227c6e704e547 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Tue, 26 Mar 2024 08:40:59 +0100 Subject: [PATCH 267/481] Fix failing case --- satpy/readers/olci_nc.py | 2 +- satpy/tests/reader_tests/test_olci_nc.py | 34 +++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/satpy/readers/olci_nc.py b/satpy/readers/olci_nc.py index 649984add1..a6637b4b8e 100644 --- a/satpy/readers/olci_nc.py +++ b/satpy/readers/olci_nc.py @@ -75,7 +75,7 @@ def __init__(self, value, flag_list=None): try: meanings = value.attrs["flag_meanings"].split() masks = value.attrs["flag_masks"] - except AttributeError: + except (AttributeError, KeyError): meanings = ["INVALID", "WATER", "LAND", "CLOUD", "SNOW_ICE", "INLAND_WATER", "TIDAL", "COSMETIC", "SUSPECT", "HISOLZEN", "SATURATED", "MEGLINT", "HIGHGLINT", diff --git a/satpy/tests/reader_tests/test_olci_nc.py b/satpy/tests/reader_tests/test_olci_nc.py index fe03521635..2834578176 100644 --- a/satpy/tests/reader_tests/test_olci_nc.py +++ b/satpy/tests/reader_tests/test_olci_nc.py @@ -275,7 +275,7 @@ def test_bitflags(self): False]) assert all(mask == expected) - def test_bitflags_with_non_linear_meanings(self): + def test_bitflags_with_flags_from_array(self): """Test reading bitflags from DataArray attributes.""" from functools import reduce @@ -310,6 +310,38 @@ def test_bitflags_with_non_linear_meanings(self): assert mask[22].item() is True assert any(mask[23:]) is False + def test_bitflags_with_dataarray_without_flags(self): + """Test the BitFlags class.""" + from functools import reduce + + import numpy as np + import xarray as xr + + from satpy.readers.olci_nc import BitFlags + flag_list = ["INVALID", "WATER", "LAND", "CLOUD", "SNOW_ICE", + "INLAND_WATER", "TIDAL", "COSMETIC", "SUSPECT", "HISOLZEN", + "SATURATED", "MEGLINT", "HIGHGLINT", "WHITECAPS", + "ADJAC", "WV_FAIL", "PAR_FAIL", "AC_FAIL", "OC4ME_FAIL", + "OCNN_FAIL", "Extra_1", "KDM_FAIL", "Extra_2", + "CLOUD_AMBIGUOUS", "CLOUD_MARGIN", "BPAC_ON", + "WHITE_SCATT", "LOWRW", "HIGHRW"] + + bits = np.array([1 << x for x in range(len(flag_list))]) + + bflags = BitFlags(xr.DataArray(bits)) + + items = ["INVALID", "SNOW_ICE", "INLAND_WATER", "SUSPECT", + "AC_FAIL", "CLOUD", "HISOLZEN", "OCNN_FAIL", + "CLOUD_MARGIN", "CLOUD_AMBIGUOUS", "LOWRW", "LAND"] + + mask = reduce(np.logical_or, [bflags[item] for item in items]) + expected = np.array([True, False, True, True, True, True, False, + False, True, True, False, False, False, False, + False, False, False, True, False, True, False, + False, False, True, True, False, False, True, + False]) + assert all(mask == expected) + def test_bitflags_with_custom_flag_list(self): """Test the BitFlags class providing a flag list.""" From 5a9e08db59a911394c84b63e5f0ffe958580ffe4 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Fri, 29 Mar 2024 13:55:58 +0800 Subject: [PATCH 268/481] add GOCI-II level2 nc support --- satpy/etc/readers/goci2_l2_nc.yaml | 319 +++++++++++++++++++++++++++++ satpy/readers/goci2_l2_nc.py | 87 ++++++++ 2 files changed, 406 insertions(+) create mode 100644 satpy/etc/readers/goci2_l2_nc.yaml create mode 100644 satpy/readers/goci2_l2_nc.py diff --git a/satpy/etc/readers/goci2_l2_nc.yaml b/satpy/etc/readers/goci2_l2_nc.yaml new file mode 100644 index 0000000000..4394ec00d6 --- /dev/null +++ b/satpy/etc/readers/goci2_l2_nc.yaml @@ -0,0 +1,319 @@ +reader: + name: goci2_l2_nc + short_name: GOCI-II L2 NetCDF4 + long_name: GK-2B GOCI-II Level 2 products in netCDF4 format from NOSC + status: Beta + supports_fsspec: true + sensors: ['goci2'] + reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader + group_keys: ['start_time', 'platform_shortname', "area"] + +file_types: + goci_l2_kd: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_Kd.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_Kd.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_Kd.nc' + + goci_l2_zsd: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_Zsd.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_Zsd.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_Zsd.nc' + + goci_l2_chl: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_Chl.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_Chl.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_Chl.nc' + + goci_l2_cdom: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_CDOM.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_CDOM.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_CDOM.nc' + + goci_l2_tss: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_TSS.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_TSS.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_TSS.nc' + + goci_l2_ac: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_AC.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_AC.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_AC.nc' + +datasets: +# --- Navigation Data --- + latitude: + name: latitude + file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac] + file_key: latitude + standard_name: latitude + units: degrees_north + + longitude: + name: longitude + file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac] + file_key: longitude + standard_name: longitude + units: degrees_east + +# --- Ocean Color Products --- + diffuse_attenuation_coefficient: + name: Kd + file_type: goci_l2_kd + file_key: Kd + coordinates: [longitude, latitude] + + Secchi_disk_depth: + name: Zsd + file_type: goci_l2_zsd + file_key: Zsd + coordinates: [longitude, latitude] + + Chlorophyll-a_concentration: + name: Chl + file_type: goci_l2_chl + file_key: Chl + coordinates: [longitude, latitude] + + Colored_Dissolved_Organic_Matter: + name: CDOM + file_type: goci_l2_cdom + file_key: CDOM + coordinates: [longitude, latitude] + + Total_Suspended_Sediments_concentration: + name: TSS + file_type: goci_l2_tss + file_key: TSS + coordinates: [longitude, latitude] + +# --- Atomspheric Correction Products --- + # --- Rayleigh-corrected reflectance --- + RhoC_380: + name: RhoC_380 + sensor: goci2 + wavelength: [0.37, 0.38, 0.39] + long_name: Rayleigh-corrected reflectance at 380 nm + file_type: goci_l2_ac + file_key: RhoC_380 + coordinates: [longitude, latitude] + + RhoC_412: + name: RhoC_412 + sensor: goci2 + wavelength: [0.402, 0.412, 0.422] + long_name: Rayleigh-corrected reflectance at 412 nm + file_type: goci_l2_ac + file_key: RhoC_412 + coordinates: [longitude, latitude] + + RhoC_443: + name: RhoC_443 + sensor: goci2 + wavelength: [0.433, 0.443, 0.453] + long_name: Rayleigh-corrected reflectance at 443 nm + file_type: goci_l2_ac + file_key: RhoC_443 + coordinates: [longitude, latitude] + + RhoC_490: + name: RhoC_490 + sensor: goci2 + wavelength: [0.48, 0.49, 0.50] + long_name: Rayleigh-corrected reflectance at 490 nm + file_type: goci_l2_ac + file_key: RhoC_490 + coordinates: [longitude, latitude] + + RhoC_510: + name: RhoC_510 + sensor: goci2 + wavelength: [0.50, 0.51, 0.52] + long_name: Rayleigh-corrected reflectance at 510 nm + file_type: goci_l2_ac + file_key: RhoC_510 + coordinates: [longitude, latitude] + + RhoC_555: + name: RhoC_555 + sensor: goci2 + wavelength: [0.545, 0.555, 0.565] + long_name: Rayleigh-corrected reflectance at 555 nm + file_type: goci_l2_ac + file_key: RhoC_555 + coordinates: [longitude, latitude] + + RhoC_620: + name: RhoC_620 + sensor: goci2 + wavelength: [0.61, 0.62, 0.63] + long_name: Rayleigh-corrected reflectance at 620 nm + file_type: goci_l2_ac + file_key: RhoC_620 + coordinates: [longitude, latitude] + + RhoC_660: + name: RhoC_660 + sensor: goci2 + wavelength: [0.65, 0.66, 0.67] + long_name: Rayleigh-corrected reflectance at 660 nm + file_type: goci_l2_ac + file_key: RhoC_660 + coordinates: [longitude, latitude] + + RhoC_680: + name: RhoC_680 + sensor: goci2 + wavelength: [0.675, 0.680, 0.685] + long_name: Rayleigh-corrected reflectance at 680 nm + file_type: goci_l2_ac + file_key: RhoC_680 + coordinates: [longitude, latitude] + + RhoC_709: + name: RhoC_709 + sensor: goci2 + wavelength: [0.704, 0.709, 0.714] + long_name: Rayleigh-corrected reflectance at 709 nm + file_type: goci_l2_ac + file_key: RhoC_709 + coordinates: [longitude, latitude] + + RhoC_745: + name: RhoC_745 + sensor: goci2 + wavelength: [0.735, 0.745, 0.755] + long_name: Rayleigh-corrected reflectance at 745 nm + file_type: goci_l2_ac + file_key: RhoC_745 + coordinates: [longitude, latitude] + + RhoC_865: + name: RhoC_865 + sensor: goci2 + wavelength: [0.845, 0.865, 0.885] + long_name: Rayleigh-corrected reflectance at 865 nm + file_type: goci_l2_ac + file_key: RhoC_865 + coordinates: [longitude, latitude] + + # --- Remote sensing reflectance --- + Rrs_380: + name: Rrs_380 + sensor: goci2 + wavelength: [0.37, 0.38, 0.39] + long_name: Remote sensing reflectance at 380 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_380 + coordinates: [longitude, latitude] + + Rrs_412: + name: Rrs_412 + sensor: goci2 + wavelength: [0.402, 0.412, 0.422] + long_name: Remote sensing reflectance at 412 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_412 + coordinates: [longitude, latitude] + + Rrs_443: + name: Rrs_443 + sensor: goci2 + wavelength: [0.433, 0.443, 0.453] + long_name: Remote sensing reflectance at 443 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_443 + coordinates: [longitude, latitude] + + Rrs_490: + name: Rrs_490 + sensor: goci2 + wavelength: [0.48, 0.49, 0.50] + long_name: Remote sensing reflectance at 490 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_490 + coordinates: [longitude, latitude] + + Rrs_510: + name: Rrs_510 + sensor: goci2 + wavelength: [0.50, 0.51, 0.52] + long_name: Remote sensing reflectance at 510 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_510 + coordinates: [longitude, latitude] + + Rrs_555: + name: Rrs_555 + sensor: goci2 + wavelength: [0.545, 0.555, 0.565] + long_name: Remote sensing reflectance at 555 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_555 + coordinates: [longitude, latitude] + + Rrs_620: + name: Rrs_620 + sensor: goci2 + wavelength: [0.61, 0.62, 0.63] + long_name: Remote sensing reflectance at 620 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_620 + coordinates: [longitude, latitude] + + Rrs_660: + name: Rrs_660 + sensor: goci2 + wavelength: [0.65, 0.66, 0.67] + long_name: Remote sensing reflectance at 660 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_660 + coordinates: [longitude, latitude] + + Rrs_680: + name: Rrs_680 + sensor: goci2 + wavelength: [0.675, 0.680, 0.685] + long_name: Remote sensing reflectance at 680 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_680 + coordinates: [longitude, latitude] + + Rrs_709: + name: Rrs_709 + sensor: goci2 + wavelength: [0.704, 0.709, 0.714] + long_name: Remote sensing reflectance at 709 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_709 + coordinates: [longitude, latitude] + + Rrs_745: + name: Rrs_745 + sensor: goci2 + wavelength: [0.735, 0.745, 0.755] + long_name: Remote sensing reflectance at 745 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_745 + coordinates: [longitude, latitude] + + Rrs_865: + name: Rrs_865 + sensor: goci2 + wavelength: [0.845, 0.865, 0.885] + long_name: Remote sensing reflectance at 865 nm, KOSC standard algorithm + file_type: goci_l2_ac + file_key: Rrs_865 + coordinates: [longitude, latitude] + diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py new file mode 100644 index 0000000000..e6fb356711 --- /dev/null +++ b/satpy/readers/goci2_l2_nc.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2023 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 . +""" +Reader for GK-2B GOCI-II L2 products from NOSC. +""" + +import logging +from datetime import datetime + +import xarray as xr + +from satpy.readers.netcdf_utils import NetCDF4FileHandler + +logger = logging.getLogger(__name__) + + +class GOCI2L2NCFileHandler(NetCDF4FileHandler): + """File handler for GOCI-II L2 official data in netCDF format.""" + + def __init__(self, filename, filename_info, filetype_info): + """Initialize the reader.""" + super().__init__(filename, filename_info, filetype_info) + self.slot = filename_info.get("slot", None) + + self.attrs = self["/attrs"] + navigation = self["navigation_data"] + if filetype_info["file_type"] == "goci_l2_ac": + Rhoc = self["geophysical_data/RhoC"] + Rrs = self["geophysical_data/Rrs"] + self.nc = xr.merge([Rhoc, Rrs, navigation]) + else: + self.nc = xr.merge(self["geophysical_data"], navigation) + + self.sensor = self.attrs["instrument"].lower() + self.nlines = self.nc.sizes["number_of_lines"] + self.ncols = self.nc.sizes["number_of_columns"] + if self.nlines != self.attrs["number_of_lines"]: + logger.warning( + "number_of_lines mismatched between metadata and data: " + f"{self.nlines} != {self.nc.sizes['number_of_lines']}" + ) + if self.ncols != self.attrs["pixels_per_line"]: + logger.warning( + "number_of_columns mismatched between metadata and data: " + f"{self.ncols} != {self.nc.sizes['pixels_per_line']}" + ) + self.platform_shortname = filename_info["platform"] + self.observation_area = filename_info["coverage"] + + @property + def start_time(self): + """Start timestamp of the dataset.""" + dt = self.attrs["observation_start_time"] + return datetime.strptime(dt, "%Y%m%d_%H%M%S") + + @property + def end_time(self): + """End timestamp of the dataset.""" + dt = self.attrs["observation_end_time"] + return datetime.strptime(dt, "%Y%m%d_%H%M%S") + + def get_dataset(self, key, info): + """Load a dataset.""" + var = info["file_key"] + logger.debug("Reading in get_dataset %s.", var) + variable = self.nc[var] + + # Data has 'Latitude' and 'Longitude' coords, these must be replaced. + variable = variable.rename({"number_of_lines": "y", "pixels_per_line": "x"}) + + variable.attrs.update(key.to_dict()) + return variable From 30fb1d503ed64a9d62791283745a9d20a3507642 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Fri, 29 Mar 2024 17:54:31 +0800 Subject: [PATCH 269/481] fix typos --- satpy/readers/goci2_l2_nc.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index e6fb356711..afe684c000 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -44,20 +44,20 @@ def __init__(self, filename, filename_info, filetype_info): Rrs = self["geophysical_data/Rrs"] self.nc = xr.merge([Rhoc, Rrs, navigation]) else: - self.nc = xr.merge(self["geophysical_data"], navigation) + self.nc = xr.merge([self["geophysical_data"], navigation]) self.sensor = self.attrs["instrument"].lower() self.nlines = self.nc.sizes["number_of_lines"] - self.ncols = self.nc.sizes["number_of_columns"] + self.ncols = self.nc.sizes["pixels_per_line"] if self.nlines != self.attrs["number_of_lines"]: logger.warning( "number_of_lines mismatched between metadata and data: " - f"{self.nlines} != {self.nc.sizes['number_of_lines']}" + f"{self.nlines} != {self.attrs['number_of_lines']}" ) - if self.ncols != self.attrs["pixels_per_line"]: + if self.ncols != self.attrs["number_of_columns"]: logger.warning( "number_of_columns mismatched between metadata and data: " - f"{self.ncols} != {self.nc.sizes['pixels_per_line']}" + f"{self.ncols} != {self.attrs['number_of_columns']}" ) self.platform_shortname = filename_info["platform"] self.observation_area = filename_info["coverage"] From 355c40d59c2843345e6f6cb32e87a094880e195b Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sat, 30 Mar 2024 01:25:16 +0800 Subject: [PATCH 270/481] fix yaml reader and units --- satpy/etc/readers/goci2_l2_nc.yaml | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/satpy/etc/readers/goci2_l2_nc.yaml b/satpy/etc/readers/goci2_l2_nc.yaml index 4394ec00d6..9dbef4fd97 100644 --- a/satpy/etc/readers/goci2_l2_nc.yaml +++ b/satpy/etc/readers/goci2_l2_nc.yaml @@ -5,8 +5,9 @@ reader: status: Beta supports_fsspec: true sensors: ['goci2'] - reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader - group_keys: ['start_time', 'platform_shortname', "area"] + reader: !!python/name:satpy.readers.yaml_reader.GEOSegmentYAMLReader + # file pattern keys to sort files by with 'satpy.utils.group_files' + group_keys: ['start_time', 'platform_shortname', "slot"] file_types: goci_l2_kd: @@ -73,30 +74,35 @@ datasets: file_type: goci_l2_kd file_key: Kd coordinates: [longitude, latitude] + units: m-1 Secchi_disk_depth: name: Zsd file_type: goci_l2_zsd file_key: Zsd coordinates: [longitude, latitude] + units: m Chlorophyll-a_concentration: name: Chl file_type: goci_l2_chl file_key: Chl coordinates: [longitude, latitude] + units: mg m-3 Colored_Dissolved_Organic_Matter: name: CDOM file_type: goci_l2_cdom file_key: CDOM coordinates: [longitude, latitude] + units: m-1 Total_Suspended_Sediments_concentration: name: TSS file_type: goci_l2_tss file_key: TSS coordinates: [longitude, latitude] + units: g m-3 # --- Atomspheric Correction Products --- # --- Rayleigh-corrected reflectance --- @@ -217,6 +223,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_380 coordinates: [longitude, latitude] + units: sr-1 Rrs_412: name: Rrs_412 @@ -226,6 +233,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_412 coordinates: [longitude, latitude] + units: sr-1 Rrs_443: name: Rrs_443 @@ -235,6 +243,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_443 coordinates: [longitude, latitude] + units: sr-1 Rrs_490: name: Rrs_490 @@ -244,6 +253,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_490 coordinates: [longitude, latitude] + units: sr-1 Rrs_510: name: Rrs_510 @@ -253,6 +263,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_510 coordinates: [longitude, latitude] + units: sr-1 Rrs_555: name: Rrs_555 @@ -262,6 +273,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_555 coordinates: [longitude, latitude] + units: sr-1 Rrs_620: name: Rrs_620 @@ -271,6 +283,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_620 coordinates: [longitude, latitude] + units: sr-1 Rrs_660: name: Rrs_660 @@ -280,6 +293,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_660 coordinates: [longitude, latitude] + units: sr-1 Rrs_680: name: Rrs_680 @@ -289,6 +303,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_680 coordinates: [longitude, latitude] + units: sr-1 Rrs_709: name: Rrs_709 @@ -298,6 +313,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_709 coordinates: [longitude, latitude] + units: sr-1 Rrs_745: name: Rrs_745 @@ -307,6 +323,7 @@ datasets: file_type: goci_l2_ac file_key: Rrs_745 coordinates: [longitude, latitude] + units: sr-1 Rrs_865: name: Rrs_865 @@ -316,4 +333,5 @@ datasets: file_type: goci_l2_ac file_key: Rrs_865 coordinates: [longitude, latitude] + units: sr-1 From 12f8dfae00587f45522b40b89cf937b4acdabdba Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sat, 30 Mar 2024 01:42:04 +0800 Subject: [PATCH 271/481] refactor navigation data gather --- satpy/readers/goci2_l2_nc.py | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index afe684c000..7172ce21cd 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -38,29 +38,24 @@ def __init__(self, filename, filename_info, filetype_info): self.slot = filename_info.get("slot", None) self.attrs = self["/attrs"] - navigation = self["navigation_data"] - if filetype_info["file_type"] == "goci_l2_ac": - Rhoc = self["geophysical_data/RhoC"] - Rrs = self["geophysical_data/Rrs"] - self.nc = xr.merge([Rhoc, Rrs, navigation]) - else: - self.nc = xr.merge([self["geophysical_data"], navigation]) + self.nc = self._merge_navigation_data(filetype_info) self.sensor = self.attrs["instrument"].lower() self.nlines = self.nc.sizes["number_of_lines"] self.ncols = self.nc.sizes["pixels_per_line"] - if self.nlines != self.attrs["number_of_lines"]: - logger.warning( - "number_of_lines mismatched between metadata and data: " - f"{self.nlines} != {self.attrs['number_of_lines']}" - ) - if self.ncols != self.attrs["number_of_columns"]: - logger.warning( - "number_of_columns mismatched between metadata and data: " - f"{self.ncols} != {self.attrs['number_of_columns']}" - ) self.platform_shortname = filename_info["platform"] - self.observation_area = filename_info["coverage"] + self.coverage = filename_info["coverage"] + + def _merge_navigation_data(self, filetype_info): + """Merge navigation data and geophysical data.""" + navigation = self["navigation_data"] + if filetype_info["file_type"] == "goci_l2_ac": + Rhoc = self["geophysical_data/RhoC"] + Rrs = self["geophysical_data/Rrs"] + data = xr.merge([Rhoc, Rrs, navigation]) + else: + data = xr.merge([self["geophysical_data"], navigation]) + return data @property def start_time(self): From 389d454c79b0325eeb3d943215d5d801c94c559b Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sat, 30 Mar 2024 01:55:17 +0800 Subject: [PATCH 272/481] fix docstring --- satpy/readers/goci2_l2_nc.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index 7172ce21cd..65a4262ff6 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -17,6 +17,8 @@ # satpy. If not, see . """ Reader for GK-2B GOCI-II L2 products from NOSC. + +For more information about the data, see: """ import logging From a93d14a20483fb0e7361949e0375591eae815541 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sat, 30 Mar 2024 01:56:35 +0800 Subject: [PATCH 273/481] fix docstring again --- satpy/readers/goci2_l2_nc.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index 65a4262ff6..7b548f179a 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -15,8 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . -""" -Reader for GK-2B GOCI-II L2 products from NOSC. +"""Reader for GK-2B GOCI-II L2 products from NOSC. For more information about the data, see: """ From 4b33c3419c3434446929fa71c1b131cc09d79841 Mon Sep 17 00:00:00 2001 From: Antonio Valentino Date: Fri, 29 Mar 2024 19:43:11 +0100 Subject: [PATCH 274/481] Replace the unmaintained dependency appdirs with platformdirs --- AUTHORS.md | 1 + continuous_integration/environment.yaml | 2 +- doc/rtd_environment.yml | 2 +- doc/source/config.rst | 6 +++--- satpy/_config.py | 4 ++-- satpy/readers/ahi_l1b_gridded_bin.py | 2 +- setup.py | 2 +- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index fb43d0168d..9c475355a2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -90,3 +90,4 @@ The following people have made contributions to this project: - [Yufei Zhu (yufeizhu600)](https://github.com/yufeizhu600) - [Youva Aoun (YouvaEUMex)](https://github.com/YouvaEUMex) - [Will Sharpe (wjsharpe)](https://github.com/wjsharpe) +- [Antonio Valentino](https://github.com/avalentino) diff --git a/continuous_integration/environment.yaml b/continuous_integration/environment.yaml index 4fc7a508f2..1dcf46c0cc 100644 --- a/continuous_integration/environment.yaml +++ b/continuous_integration/environment.yaml @@ -7,7 +7,7 @@ dependencies: - distributed - dask-image - donfig - - appdirs + - platformdirs - toolz - Cython - numba diff --git a/doc/rtd_environment.yml b/doc/rtd_environment.yml index 1e40cbb73a..f24aa09c4f 100644 --- a/doc/rtd_environment.yml +++ b/doc/rtd_environment.yml @@ -4,7 +4,7 @@ channels: dependencies: - python=3.10 - pip - - appdirs + - platformdirs - dask - dask-image - defusedxml diff --git a/doc/source/config.rst b/doc/source/config.rst index b1777c9751..2279e10fe5 100644 --- a/doc/source/config.rst +++ b/doc/source/config.rst @@ -35,7 +35,7 @@ locations: 3. ``~/.satpy/satpy.yaml`` 4. ``/satpy.yaml`` (see :ref:`config_path_setting` below) -The above ``user_config_dir`` is provided by the ``appdirs`` package and +The above ``user_config_dir`` is provided by the ``platformdirs`` package and differs by operating system. Typical user config directories are: * Mac OSX: ``~/Library/Preferences/satpy`` @@ -90,7 +90,7 @@ Directory where any files cached by Satpy will be stored. This directory is not necessarily cleared out by Satpy, but is rarely used without explicitly being enabled by the user. This defaults to a different path depending on your operating system following -the `appdirs `_ +the `platformdirs `_ "user cache dir". .. _config_cache_lonlats_setting: @@ -214,7 +214,7 @@ Data Directory Directory where any data Satpy needs to perform certain operations will be stored. This replaces the legacy ``SATPY_ANCPATH`` environment variable. This defaults to a different path depending on your operating system following the -`appdirs `_ +`platformdirs `_ "user data dir". .. _download_aux_setting: diff --git a/satpy/_config.py b/satpy/_config.py index 6a14f994a8..4bb7532581 100644 --- a/satpy/_config.py +++ b/satpy/_config.py @@ -29,7 +29,7 @@ from importlib.resources import files as impr_files from typing import Iterable -import appdirs +from platformdirs import AppDirs from donfig import Config from satpy._compat import cache @@ -40,7 +40,7 @@ # FIXME: Use package_resources? PACKAGE_CONFIG_PATH = os.path.join(BASE_PATH, "etc") -_satpy_dirs = appdirs.AppDirs(appname="satpy", appauthor="pytroll") +_satpy_dirs = AppDirs(appname="satpy", appauthor="pytroll") _CONFIG_DEFAULTS = { "tmp_dir": tempfile.gettempdir(), "cache_dir": _satpy_dirs.user_cache_dir, diff --git a/satpy/readers/ahi_l1b_gridded_bin.py b/satpy/readers/ahi_l1b_gridded_bin.py index 33289aee11..9c06e3c55b 100644 --- a/satpy/readers/ahi_l1b_gridded_bin.py +++ b/satpy/readers/ahi_l1b_gridded_bin.py @@ -37,7 +37,7 @@ import dask.array as da import numpy as np import xarray as xr -from appdirs import AppDirs +from platformdirs import AppDirs from pyresample import geometry from satpy.readers.file_handlers import BaseFileHandler diff --git a/setup.py b/setup.py index 2f467286d0..b4bc3bc841 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ requires = ["numpy >=1.21", "pillow", "pyresample >=1.24.0", "trollsift", "trollimage >=1.23", "pykdtree", "pyyaml >=5.1", "xarray >=0.14.1", - "dask[array] >=0.17.1", "pyproj>=2.2", "zarr", "donfig", "appdirs", + "dask[array] >=0.17.1", "pyproj>=2.2", "zarr", "donfig", "platformdirs", "packaging", "pooch", "pyorbital"] test_requires = ["behave", "h5py", "netCDF4", "pyhdf", "imageio", From 5a867814394059c05650f2d1a0c32346b5d54f1a Mon Sep 17 00:00:00 2001 From: Antonio Valentino Date: Sat, 30 Mar 2024 07:25:13 +0100 Subject: [PATCH 275/481] Fix imports sorting --- satpy/_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/_config.py b/satpy/_config.py index 4bb7532581..fbfcb0c0d5 100644 --- a/satpy/_config.py +++ b/satpy/_config.py @@ -29,8 +29,8 @@ from importlib.resources import files as impr_files from typing import Iterable -from platformdirs import AppDirs from donfig import Config +from platformdirs import AppDirs from satpy._compat import cache From e2b1b3bf465f6cc56b3478c926db292cda524fe8 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sat, 30 Mar 2024 16:01:33 +0800 Subject: [PATCH 276/481] support kd product --- satpy/etc/readers/goci2_l2_nc.yaml | 134 ++++++++++++++++++++++++----- 1 file changed, 112 insertions(+), 22 deletions(-) diff --git a/satpy/etc/readers/goci2_l2_nc.yaml b/satpy/etc/readers/goci2_l2_nc.yaml index 9dbef4fd97..051bc3b517 100644 --- a/satpy/etc/readers/goci2_l2_nc.yaml +++ b/satpy/etc/readers/goci2_l2_nc.yaml @@ -44,7 +44,7 @@ file_types: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_TSS.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_TSS.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_TSS.nc' - + goci_l2_ac: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: @@ -69,13 +69,104 @@ datasets: units: degrees_east # --- Ocean Color Products --- - diffuse_attenuation_coefficient: - name: Kd + # --- Diffuse attenuation coefficient --- + Kd_380: + name: Kd_380 + long_name: Diffuse attenuation coefficient at 380 nm + file_type: goci_l2_kd + file_key: Kd_380 + coordinates: [longitude, latitude] + units: m-1 + + Kd_412: + name: Kd_412 + long_name: Diffuse attenuation coefficient at 412 nm + file_type: goci_l2_kd + file_key: Kd_412 + coordinates: [longitude, latitude] + units: m-1 + + Kd_443: + name: Kd_443 + long_name: Diffuse attenuation coefficient at 443 nm + file_type: goci_l2_kd + file_key: Kd_443 + coordinates: [longitude, latitude] + units: m-1 + + Kd_490: + name: Kd_490 + long_name: Diffuse attenuation coefficient at 490 nm + file_type: goci_l2_kd + file_key: Kd_490 + coordinates: [longitude, latitude] + units: m-1 + + Kd_510: + name: Kd_510 + long_name: Diffuse attenuation coefficient at 510 nm + file_type: goci_l2_kd + file_key: Kd_510 + coordinates: [longitude, latitude] + units: m-1 + + Kd_555: + name: Kd_555 + long_name: Diffuse attenuation coefficient at 555 nm + file_type: goci_l2_kd + file_key: Kd_555 + coordinates: [longitude, latitude] + units: m-1 + + Kd_620: + name: Kd_620 + long_name: Diffuse attenuation coefficient at 620 nm + file_type: goci_l2_kd + file_key: Kd_620 + coordinates: [longitude, latitude] + units: m-1 + + Kd_660: + name: Kd_660 + long_name: Diffuse attenuation coefficient at 660 nm file_type: goci_l2_kd - file_key: Kd + file_key: Kd_660 coordinates: [longitude, latitude] units: m-1 - + + Kd_680: + name: Kd_680 + long_name: Diffuse attenuation coefficient at 680 nm + file_type: goci_l2_kd + file_key: Kd_680 + coordinates: [longitude, latitude] + units: m-1 + + Kd_709: + name: Kd_709 + long_name: Diffuse attenuation coefficient at 709 nm + file_type: goci_l2_kd + file_key: Kd_709 + coordinates: [longitude, latitude] + units: m-1 + + Kd_745: + name: Kd_745 + long_name: Diffuse attenuation coefficient at 745 nm + file_type: goci_l2_kd + file_key: Kd_745 + coordinates: [longitude, latitude] + units: m-1 + + Kd_865: + name: Kd_865 + long_name: Diffuse attenuation coefficient at 865 nm + file_type: goci_l2_kd + file_key: Kd_865 + coordinates: [longitude, latitude] + units: m-1 + + # --- Other OC products --- Secchi_disk_depth: name: Zsd file_type: goci_l2_zsd @@ -159,7 +250,7 @@ datasets: file_type: goci_l2_ac file_key: RhoC_555 coordinates: [longitude, latitude] - + RhoC_620: name: RhoC_620 sensor: goci2 @@ -168,7 +259,7 @@ datasets: file_type: goci_l2_ac file_key: RhoC_620 coordinates: [longitude, latitude] - + RhoC_660: name: RhoC_660 sensor: goci2 @@ -177,7 +268,7 @@ datasets: file_type: goci_l2_ac file_key: RhoC_660 coordinates: [longitude, latitude] - + RhoC_680: name: RhoC_680 sensor: goci2 @@ -186,7 +277,7 @@ datasets: file_type: goci_l2_ac file_key: RhoC_680 coordinates: [longitude, latitude] - + RhoC_709: name: RhoC_709 sensor: goci2 @@ -195,7 +286,7 @@ datasets: file_type: goci_l2_ac file_key: RhoC_709 coordinates: [longitude, latitude] - + RhoC_745: name: RhoC_745 sensor: goci2 @@ -213,7 +304,7 @@ datasets: file_type: goci_l2_ac file_key: RhoC_865 coordinates: [longitude, latitude] - + # --- Remote sensing reflectance --- Rrs_380: name: Rrs_380 @@ -234,7 +325,7 @@ datasets: file_key: Rrs_412 coordinates: [longitude, latitude] units: sr-1 - + Rrs_443: name: Rrs_443 sensor: goci2 @@ -244,7 +335,7 @@ datasets: file_key: Rrs_443 coordinates: [longitude, latitude] units: sr-1 - + Rrs_490: name: Rrs_490 sensor: goci2 @@ -254,7 +345,7 @@ datasets: file_key: Rrs_490 coordinates: [longitude, latitude] units: sr-1 - + Rrs_510: name: Rrs_510 sensor: goci2 @@ -264,7 +355,7 @@ datasets: file_key: Rrs_510 coordinates: [longitude, latitude] units: sr-1 - + Rrs_555: name: Rrs_555 sensor: goci2 @@ -274,7 +365,7 @@ datasets: file_key: Rrs_555 coordinates: [longitude, latitude] units: sr-1 - + Rrs_620: name: Rrs_620 sensor: goci2 @@ -284,7 +375,7 @@ datasets: file_key: Rrs_620 coordinates: [longitude, latitude] units: sr-1 - + Rrs_660: name: Rrs_660 sensor: goci2 @@ -294,7 +385,7 @@ datasets: file_key: Rrs_660 coordinates: [longitude, latitude] units: sr-1 - + Rrs_680: name: Rrs_680 sensor: goci2 @@ -304,7 +395,7 @@ datasets: file_key: Rrs_680 coordinates: [longitude, latitude] units: sr-1 - + Rrs_709: name: Rrs_709 sensor: goci2 @@ -314,7 +405,7 @@ datasets: file_key: Rrs_709 coordinates: [longitude, latitude] units: sr-1 - + Rrs_745: name: Rrs_745 sensor: goci2 @@ -324,7 +415,7 @@ datasets: file_key: Rrs_745 coordinates: [longitude, latitude] units: sr-1 - + Rrs_865: name: Rrs_865 sensor: goci2 @@ -334,4 +425,3 @@ datasets: file_key: Rrs_865 coordinates: [longitude, latitude] units: sr-1 - From cefeaa12c7650fede22f24b07f4baf73aa430b44 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sat, 30 Mar 2024 21:59:20 +0800 Subject: [PATCH 277/481] support IOP products --- satpy/etc/readers/goci2_l2_nc.yaml | 231 ++++++++++++++++++++++++++++- 1 file changed, 229 insertions(+), 2 deletions(-) diff --git a/satpy/etc/readers/goci2_l2_nc.yaml b/satpy/etc/readers/goci2_l2_nc.yaml index 051bc3b517..b963c00004 100644 --- a/satpy/etc/readers/goci2_l2_nc.yaml +++ b/satpy/etc/readers/goci2_l2_nc.yaml @@ -52,18 +52,25 @@ file_types: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_AC.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_AC.nc' + goci_l2_iop: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_IOP.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_IOP.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_IOP.nc' + datasets: # --- Navigation Data --- latitude: name: latitude - file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac] + file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac, goci_l2_iop] file_key: latitude standard_name: latitude units: degrees_north longitude: name: longitude - file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac] + file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac, goci_l2_iop] file_key: longitude standard_name: longitude units: degrees_east @@ -425,3 +432,223 @@ datasets: file_key: Rrs_865 coordinates: [longitude, latitude] units: sr-1 + +# --- Inherent Optical Properties products --- + # --- Absorption coefficient --- + a_total_380: + name: a_total_380 + long_name: Spectral absorption coefficient at 380 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_380 + coordinates: [longitude, latitude] + units: m-1 + + a_total_412: + name: a_total_412 + long_name: Spectral absorption coefficient at 412 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_412 + coordinates: [longitude, latitude] + units: m-1 + + a_total_443: + name: a_total_443 + long_name: Spectral absorption coefficient at 443 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_443 + coordinates: [longitude, latitude] + units: m-1 + + a_total_490: + name: a_total_490 + long_name: Spectral absorption coefficient at 490 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_490 + coordinates: [longitude, latitude] + units: m-1 + + a_total_510: + name: a_total_510 + long_name: Spectral absorption coefficient at 510 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_510 + coordinates: [longitude, latitude] + units: m-1 + + a_total_555: + name: a_total_555 + long_name: Spectral absorption coefficient at 555 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_555 + coordinates: [longitude, latitude] + units: m-1 + + a_total_620: + name: a_total_620 + long_name: Spectral absorption coefficient at 620 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_620 + coordinates: [longitude, latitude] + units: m-1 + + a_total_660: + name: a_total_660 + long_name: Spectral absorption coefficient at 660 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_660 + coordinates: [longitude, latitude] + units: m-1 + + a_total_680: + name: a_total_680 + long_name: Spectral absorption coefficient at 680 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_680 + coordinates: [longitude, latitude] + units: m-1 + + a_total_709: + name: a_total_709 + long_name: Spectral absorption coefficient at 709 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_709 + coordinates: [longitude, latitude] + units: m-1 + + a_total_745: + name: a_total_745 + long_name: Spectral absorption coefficient at 745 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_745 + coordinates: [longitude, latitude] + units: m-1 + + a_total_865: + name: a_total_865 + long_name: Spectral absorption coefficient at 865 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_total_865 + coordinates: [longitude, latitude] + units: m-1 + + # --- Backscattering coefficient --- + bb_total_380: + name: bb_total_380 + long_name: Spectral backscattering coefficient at 380 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_380 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_412: + name: bb_total_412 + long_name: Spectral backscattering coefficient at 412 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_412 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_443: + name: bb_total_443 + long_name: Spectral backscattering coefficient at 443 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_443 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_490: + name: bb_total_490 + long_name: Spectral backscattering coefficient at 490 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_490 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_510: + name: bb_total_510 + long_name: Spectral backscattering coefficient at 510 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_510 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_555: + name: bb_total_555 + long_name: Spectral backscattering coefficient at 555 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_555 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_620: + name: bb_total_620 + long_name: Spectral backscattering coefficient at 620 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_620 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_660: + name: bb_total_660 + long_name: Spectral backscattering coefficient at 660 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_660 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_680: + name: bb_total_680 + long_name: Spectral backscattering coefficient at 680 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_680 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_709: + name: bb_total_709 + long_name: Spectral backscattering coefficient at 709 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_709 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_745: + name: bb_total_745 + long_name: Spectral backscattering coefficient at 745 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_745 + coordinates: [longitude, latitude] + units: m-1 + + bb_total_865: + name: bb_total_865 + long_name: Spectral backscattering coefficient at 865 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_total_865 + coordinates: [longitude, latitude] + units: m-1 + + # --- Other IOP output --- + a_dg_443: + name: a_dg_443 + long_name: Spectral absorption coefficient of detritus and gelbstoff at 443 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_dg_443 + coordinates: [longitude, latitude] + units: m-1 + + a_chl_443: + name: a_chl_443 + long_name: Spectral absorption coefficient of chlorophyll-a at 443 nm, QAA version 6 + file_type: goci_l2_iop + file_key: a_chl_443 + coordinates: [longitude, latitude] + units: m-1 + + bb_p_555: + name: bb_p_555 + long_name: Spectral backscattering coefficient of particle at 555 nm, QAA version 6 + file_type: goci_l2_iop + file_key: bb_p_555 + coordinates: [longitude, latitude] + units: m-1 \ No newline at end of file From cf26b7342fb8a08d400e1358437b2508fee9bd17 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sat, 30 Mar 2024 22:00:01 +0800 Subject: [PATCH 278/481] format yaml --- satpy/etc/readers/goci2_l2_nc.yaml | 46 +++++++++++++++--------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/satpy/etc/readers/goci2_l2_nc.yaml b/satpy/etc/readers/goci2_l2_nc.yaml index b963c00004..731553b9fd 100644 --- a/satpy/etc/readers/goci2_l2_nc.yaml +++ b/satpy/etc/readers/goci2_l2_nc.yaml @@ -450,7 +450,7 @@ datasets: file_key: a_total_412 coordinates: [longitude, latitude] units: m-1 - + a_total_443: name: a_total_443 long_name: Spectral absorption coefficient at 443 nm, QAA version 6 @@ -458,7 +458,7 @@ datasets: file_key: a_total_443 coordinates: [longitude, latitude] units: m-1 - + a_total_490: name: a_total_490 long_name: Spectral absorption coefficient at 490 nm, QAA version 6 @@ -482,7 +482,7 @@ datasets: file_key: a_total_555 coordinates: [longitude, latitude] units: m-1 - + a_total_620: name: a_total_620 long_name: Spectral absorption coefficient at 620 nm, QAA version 6 @@ -490,7 +490,7 @@ datasets: file_key: a_total_620 coordinates: [longitude, latitude] units: m-1 - + a_total_660: name: a_total_660 long_name: Spectral absorption coefficient at 660 nm, QAA version 6 @@ -498,7 +498,7 @@ datasets: file_key: a_total_660 coordinates: [longitude, latitude] units: m-1 - + a_total_680: name: a_total_680 long_name: Spectral absorption coefficient at 680 nm, QAA version 6 @@ -506,7 +506,7 @@ datasets: file_key: a_total_680 coordinates: [longitude, latitude] units: m-1 - + a_total_709: name: a_total_709 long_name: Spectral absorption coefficient at 709 nm, QAA version 6 @@ -514,7 +514,7 @@ datasets: file_key: a_total_709 coordinates: [longitude, latitude] units: m-1 - + a_total_745: name: a_total_745 long_name: Spectral absorption coefficient at 745 nm, QAA version 6 @@ -522,7 +522,7 @@ datasets: file_key: a_total_745 coordinates: [longitude, latitude] units: m-1 - + a_total_865: name: a_total_865 long_name: Spectral absorption coefficient at 865 nm, QAA version 6 @@ -530,7 +530,7 @@ datasets: file_key: a_total_865 coordinates: [longitude, latitude] units: m-1 - + # --- Backscattering coefficient --- bb_total_380: name: bb_total_380 @@ -539,7 +539,7 @@ datasets: file_key: bb_total_380 coordinates: [longitude, latitude] units: m-1 - + bb_total_412: name: bb_total_412 long_name: Spectral backscattering coefficient at 412 nm, QAA version 6 @@ -547,7 +547,7 @@ datasets: file_key: bb_total_412 coordinates: [longitude, latitude] units: m-1 - + bb_total_443: name: bb_total_443 long_name: Spectral backscattering coefficient at 443 nm, QAA version 6 @@ -563,7 +563,7 @@ datasets: file_key: bb_total_490 coordinates: [longitude, latitude] units: m-1 - + bb_total_510: name: bb_total_510 long_name: Spectral backscattering coefficient at 510 nm, QAA version 6 @@ -571,7 +571,7 @@ datasets: file_key: bb_total_510 coordinates: [longitude, latitude] units: m-1 - + bb_total_555: name: bb_total_555 long_name: Spectral backscattering coefficient at 555 nm, QAA version 6 @@ -579,7 +579,7 @@ datasets: file_key: bb_total_555 coordinates: [longitude, latitude] units: m-1 - + bb_total_620: name: bb_total_620 long_name: Spectral backscattering coefficient at 620 nm, QAA version 6 @@ -587,7 +587,7 @@ datasets: file_key: bb_total_620 coordinates: [longitude, latitude] units: m-1 - + bb_total_660: name: bb_total_660 long_name: Spectral backscattering coefficient at 660 nm, QAA version 6 @@ -595,7 +595,7 @@ datasets: file_key: bb_total_660 coordinates: [longitude, latitude] units: m-1 - + bb_total_680: name: bb_total_680 long_name: Spectral backscattering coefficient at 680 nm, QAA version 6 @@ -603,7 +603,7 @@ datasets: file_key: bb_total_680 coordinates: [longitude, latitude] units: m-1 - + bb_total_709: name: bb_total_709 long_name: Spectral backscattering coefficient at 709 nm, QAA version 6 @@ -611,7 +611,7 @@ datasets: file_key: bb_total_709 coordinates: [longitude, latitude] units: m-1 - + bb_total_745: name: bb_total_745 long_name: Spectral backscattering coefficient at 745 nm, QAA version 6 @@ -619,7 +619,7 @@ datasets: file_key: bb_total_745 coordinates: [longitude, latitude] units: m-1 - + bb_total_865: name: bb_total_865 long_name: Spectral backscattering coefficient at 865 nm, QAA version 6 @@ -627,7 +627,7 @@ datasets: file_key: bb_total_865 coordinates: [longitude, latitude] units: m-1 - + # --- Other IOP output --- a_dg_443: name: a_dg_443 @@ -636,7 +636,7 @@ datasets: file_key: a_dg_443 coordinates: [longitude, latitude] units: m-1 - + a_chl_443: name: a_chl_443 long_name: Spectral absorption coefficient of chlorophyll-a at 443 nm, QAA version 6 @@ -644,11 +644,11 @@ datasets: file_key: a_chl_443 coordinates: [longitude, latitude] units: m-1 - + bb_p_555: name: bb_p_555 long_name: Spectral backscattering coefficient of particle at 555 nm, QAA version 6 file_type: goci_l2_iop file_key: bb_p_555 coordinates: [longitude, latitude] - units: m-1 \ No newline at end of file + units: m-1 From 251f92f18b0852622a8cc7a1a2b686c285c74d08 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sat, 30 Mar 2024 23:34:23 +0800 Subject: [PATCH 279/481] support aerosol products --- satpy/etc/readers/goci2_l2_nc.yaml | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/satpy/etc/readers/goci2_l2_nc.yaml b/satpy/etc/readers/goci2_l2_nc.yaml index 731553b9fd..9eace849ea 100644 --- a/satpy/etc/readers/goci2_l2_nc.yaml +++ b/satpy/etc/readers/goci2_l2_nc.yaml @@ -59,6 +59,13 @@ file_types: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_IOP.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_IOP.nc' + goci_l2_aod: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_AOD.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_AOD.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_AOD.nc' + datasets: # --- Navigation Data --- latitude: @@ -652,3 +659,39 @@ datasets: file_key: bb_p_555 coordinates: [longitude, latitude] units: m-1 + +# --- Aerosol products --- + AOD_550: + name: AOD_550 + long_name: Aerosol Optical Depth at 550 nm + file_type: goci_l2_aod + file_key: Aerosol_Optical_Depth + coordinates: [longitude, latitude] + + Aerosol_Type: + name: Aerosol_Type + long_name: Aerosol type; 1 = Dust, 2 = Non-absorbing Coarse, 3 = Mixture, 4 = High-absorbing Fine, 5 = Moderate-absorbing Fine, 6 = Non-absorbing Fine + file_type: goci_l2_aod + file_key: Aerosol_Type + coordinates: [longitude, latitude] + + Angstrom_Exponent: + name: Angstrom_Exponent + long_name: Calculated Angstrom Exponent between 440 and 870 nm + file_type: goci_l2_aod + file_key: Angstrom_Exponent + coordinates: [longitude, latitude] + + Fine_Mode_Fraction: + name: Fine_Mode_Fraction + long_name: Fine Mode Fraction at 550 nm + file_type: goci_l2_aod + file_key: Fine_Mode_Fraction + coordinates: [longitude, latitude] + + Single_Scattering_Albedo: + name: Single_Scattering_Albedo + long_name: Single Scattering Albedo at 440 nm + file_type: goci_l2_aod + file_key: Single_Scattering_Albedo + coordinates: [longitude, latitude] From cc1ad849be98cfa71dd0519aff4613e455e4f347 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sun, 31 Mar 2024 00:11:57 +0800 Subject: [PATCH 280/481] Fix IOP reader --- satpy/etc/readers/goci2_l2_nc.yaml | 4 ++-- satpy/readers/goci2_l2_nc.py | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/satpy/etc/readers/goci2_l2_nc.yaml b/satpy/etc/readers/goci2_l2_nc.yaml index 9eace849ea..997b39f5d3 100644 --- a/satpy/etc/readers/goci2_l2_nc.yaml +++ b/satpy/etc/readers/goci2_l2_nc.yaml @@ -70,14 +70,14 @@ datasets: # --- Navigation Data --- latitude: name: latitude - file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac, goci_l2_iop] + file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac, goci_l2_iop, goci_l2_aod] file_key: latitude standard_name: latitude units: degrees_north longitude: name: longitude - file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac, goci_l2_iop] + file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac, goci_l2_iop, goci_l2_aod] file_key: longitude standard_name: longitude units: degrees_east diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index 7b548f179a..574d44a829 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -54,8 +54,13 @@ def _merge_navigation_data(self, filetype_info): Rhoc = self["geophysical_data/RhoC"] Rrs = self["geophysical_data/Rrs"] data = xr.merge([Rhoc, Rrs, navigation]) + elif filetype_info["file_type"] == "goci_l2_iop": + a = self["geophysical_data/a_total"] + bb = self["geophysical_data/bb_total"] + data = xr.merge([a, bb, navigation]) else: - data = xr.merge([self["geophysical_data"], navigation]) + data = self["geophysical_data"] + data = xr.merge([data, navigation]) return data @property From b5d69982383e915f543896a96a33ba43b91493c2 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sun, 31 Mar 2024 01:45:47 +0800 Subject: [PATCH 281/481] support ocean products --- satpy/etc/readers/goci2_l2_nc.yaml | 141 +++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/satpy/etc/readers/goci2_l2_nc.yaml b/satpy/etc/readers/goci2_l2_nc.yaml index 997b39f5d3..f369eb9f92 100644 --- a/satpy/etc/readers/goci2_l2_nc.yaml +++ b/satpy/etc/readers/goci2_l2_nc.yaml @@ -66,6 +66,62 @@ file_types: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_AOD.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_AOD.nc' + goci_l2_mf: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_MF.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_MF.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_MF.nc' + + goci_l2_cf: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_CF.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_CF.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_CF.nc' + + goci_l2_fa: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_FA.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_FA.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_FA.nc' + + goci_l2_fgi: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_FGI.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_FGI.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_FGI.nc' + + goci_l2_lsss: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_LSSS.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_LSSS.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_LSSS.nc' + + goci_l2_pp: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_PP.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_PP.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_PP.nc' + + goci_l2_ri: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_RI.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_RI.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_RI.nc' + + goci_l2_ssc: + file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler + file_patterns: + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_SSC.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_SSC.nc' + - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_SSC.nc' + datasets: # --- Navigation Data --- latitude: @@ -695,3 +751,88 @@ datasets: file_type: goci_l2_aod file_key: Single_Scattering_Albedo coordinates: [longitude, latitude] + +# --- Ocean Products --- + MF: + name: MF + long_name: Marine fog existence(Yes/No/Possible), Machine learning based KOSC Algorithm + file_type: goci_l2_mf + file_key: MF + coordinates: [longitude, latitude] + + CF: + name: CF + long_name: Chlorophyll(-a) Front, CF + file_type: goci_l2_cf + file_key: CF + coordinates: [longitude, latitude] + units : mg m-3 km-1 + + FA: + name: FA + long_name: Subpixel area fraction covered by floating brown algae or green algae + file_type: goci_l2_fa + file_key: FA + coordinates: [longitude, latitude] + + FGI: + name: FGI + long_name: Fishing ground index for chub mackerel + file_type: goci_l2_fgi + file_key: FGI + coordinates: [longitude, latitude] + + SSS: + name: SSS + long_name: Sea Surface Salinity, Neural network algorithm + file_type: goci_l2_lsss + file_key: sss + coordinates: [longitude, latitude] + units: psu + + PP: + name: PP + long_name: Primary Production + file_type: goci_l2_pp + file_key: PP + coordinates: [longitude, latitude] + units: PP unit + + RI: + name: RI + long_name: Red Tide Index + file_type: goci_l2_ri + file_key: RI + coordinates: [longitude, latitude] + + SSC_direction: + name: SSC_direction + long_name: Sea Surface Current direction + file_type: goci_l2_ssc + file_key: SSC_direction + coordinates: [longitude, latitude] + units: degree + + SSC_speed: + name: SSC_speed + long_name: Sea Surface Current speed + file_type: goci_l2_ssc + file_key: SSC_speed + coordinates: [longitude, latitude] + units: m s-1 + + SSC_u: + name: SSC_u + long_name: Sea Surface Current u-component + file_type: goci_l2_ssc + file_key: SSC_u + coordinates: [longitude, latitude] + units: m s-1 + + SSC_v: + name: SSC_v + long_name: Sea Surface Current v-component + file_type: goci_l2_ssc + file_key: SSC_v + coordinates: [longitude, latitude] + units: m s-1 From 4f1d6982d088201989c1ea44c7d40df4dc1bc2e4 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sun, 31 Mar 2024 15:26:26 +0800 Subject: [PATCH 282/481] fix sensor name typo --- satpy/etc/readers/goci2_l2_nc.yaml | 202 ++++++++++++++--------------- satpy/readers/goci2_l2_nc.py | 8 +- 2 files changed, 105 insertions(+), 105 deletions(-) diff --git a/satpy/etc/readers/goci2_l2_nc.yaml b/satpy/etc/readers/goci2_l2_nc.yaml index f369eb9f92..d11db0a5d1 100644 --- a/satpy/etc/readers/goci2_l2_nc.yaml +++ b/satpy/etc/readers/goci2_l2_nc.yaml @@ -10,112 +10,112 @@ reader: group_keys: ['start_time', 'platform_shortname', "slot"] file_types: - goci_l2_kd: + goci2_l2_kd: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_Kd.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_Kd.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_Kd.nc' - goci_l2_zsd: + goci2_l2_zsd: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_Zsd.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_Zsd.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_Zsd.nc' - goci_l2_chl: + goci2_l2_chl: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_Chl.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_Chl.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_Chl.nc' - goci_l2_cdom: + goci2_l2_cdom: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_CDOM.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_CDOM.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_CDOM.nc' - goci_l2_tss: + goci2_l2_tss: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_TSS.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_TSS.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_TSS.nc' - goci_l2_ac: + goci2_l2_ac: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_AC.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_AC.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_AC.nc' - goci_l2_iop: + goci2_l2_iop: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_IOP.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_IOP.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_IOP.nc' - goci_l2_aod: + goci2_l2_aod: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_AOD.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_AOD.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_AOD.nc' - goci_l2_mf: + goci2_l2_mf: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_MF.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_MF.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_MF.nc' - goci_l2_cf: + goci2_l2_cf: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_CF.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_CF.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_CF.nc' - goci_l2_fa: + goci2_l2_fa: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_FA.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_FA.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_FA.nc' - goci_l2_fgi: + goci2_l2_fgi: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_FGI.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_FGI.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_FGI.nc' - goci_l2_lsss: + goci2_l2_lsss: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_LSSS.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_LSSS.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_LSSS.nc' - goci_l2_pp: + goci2_l2_pp: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_PP.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_PP.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_PP.nc' - goci_l2_ri: + goci2_l2_ri: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_RI.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_RI.nc' - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_RI.nc' - goci_l2_ssc: + goci2_l2_ssc: file_reader: !!python/name:satpy.readers.goci2_l2_nc.GOCI2L2NCFileHandler file_patterns: - '{platform:4s}_{sensor:5s}_{processing_level:2s}_{acquisition_date:%Y%m%d}_{acquisition_time:%H%M%S}_{coverage:2s}_S{slot:3d}_G{segment:3d}_SSC.nc' @@ -126,14 +126,14 @@ datasets: # --- Navigation Data --- latitude: name: latitude - file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac, goci_l2_iop, goci_l2_aod] + file_type: [goci2_l2_kd, goci2_l2_zsd, goci2_l2_chl, goci2_l2_cdom, goci2_l2_tss, goci2_l2_ac, goci2_l2_iop, goci2_l2_aod, goci2_l2_mf, goci2_l2_cf, goci2_l2_fa, goci2_l2_fgi, goci2_l2_lsss, goci2_l2_pp, goci2_l2_ri, goci2_l2_ssc] file_key: latitude standard_name: latitude units: degrees_north longitude: name: longitude - file_type: [goci_l2_kd, goci_l2_zsd, goci_l2_chl, goci_l2_cdom, goci_l2_tss, goci_l2_ac, goci_l2_iop, goci_l2_aod] + file_type: [goci2_l2_kd, goci2_l2_zsd, goci2_l2_chl, goci2_l2_cdom, goci2_l2_tss, goci2_l2_ac, goci2_l2_iop, goci2_l2_aod, goci2_l2_mf, goci2_l2_cf, goci2_l2_fa, goci2_l2_fgi, goci2_l2_lsss, goci2_l2_pp, goci2_l2_ri, goci2_l2_ssc] file_key: longitude standard_name: longitude units: degrees_east @@ -143,7 +143,7 @@ datasets: Kd_380: name: Kd_380 long_name: Diffuse attenuation coefficient at 380 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_380 coordinates: [longitude, latitude] units: m-1 @@ -151,7 +151,7 @@ datasets: Kd_412: name: Kd_412 long_name: Diffuse attenuation coefficient at 412 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_412 coordinates: [longitude, latitude] units: m-1 @@ -159,7 +159,7 @@ datasets: Kd_443: name: Kd_443 long_name: Diffuse attenuation coefficient at 443 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_443 coordinates: [longitude, latitude] units: m-1 @@ -167,7 +167,7 @@ datasets: Kd_490: name: Kd_490 long_name: Diffuse attenuation coefficient at 490 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_490 coordinates: [longitude, latitude] units: m-1 @@ -175,7 +175,7 @@ datasets: Kd_510: name: Kd_510 long_name: Diffuse attenuation coefficient at 510 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_510 coordinates: [longitude, latitude] units: m-1 @@ -183,7 +183,7 @@ datasets: Kd_555: name: Kd_555 long_name: Diffuse attenuation coefficient at 555 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_555 coordinates: [longitude, latitude] units: m-1 @@ -191,7 +191,7 @@ datasets: Kd_620: name: Kd_620 long_name: Diffuse attenuation coefficient at 620 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_620 coordinates: [longitude, latitude] units: m-1 @@ -199,7 +199,7 @@ datasets: Kd_660: name: Kd_660 long_name: Diffuse attenuation coefficient at 660 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_660 coordinates: [longitude, latitude] units: m-1 @@ -207,7 +207,7 @@ datasets: Kd_680: name: Kd_680 long_name: Diffuse attenuation coefficient at 680 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_680 coordinates: [longitude, latitude] units: m-1 @@ -215,7 +215,7 @@ datasets: Kd_709: name: Kd_709 long_name: Diffuse attenuation coefficient at 709 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_709 coordinates: [longitude, latitude] units: m-1 @@ -223,7 +223,7 @@ datasets: Kd_745: name: Kd_745 long_name: Diffuse attenuation coefficient at 745 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_745 coordinates: [longitude, latitude] units: m-1 @@ -231,7 +231,7 @@ datasets: Kd_865: name: Kd_865 long_name: Diffuse attenuation coefficient at 865 nm - file_type: goci_l2_kd + file_type: goci2_l2_kd file_key: Kd_865 coordinates: [longitude, latitude] units: m-1 @@ -239,28 +239,28 @@ datasets: # --- Other OC products --- Secchi_disk_depth: name: Zsd - file_type: goci_l2_zsd + file_type: goci2_l2_zsd file_key: Zsd coordinates: [longitude, latitude] units: m Chlorophyll-a_concentration: name: Chl - file_type: goci_l2_chl + file_type: goci2_l2_chl file_key: Chl coordinates: [longitude, latitude] units: mg m-3 Colored_Dissolved_Organic_Matter: name: CDOM - file_type: goci_l2_cdom + file_type: goci2_l2_cdom file_key: CDOM coordinates: [longitude, latitude] units: m-1 Total_Suspended_Sediments_concentration: name: TSS - file_type: goci_l2_tss + file_type: goci2_l2_tss file_key: TSS coordinates: [longitude, latitude] units: g m-3 @@ -272,7 +272,7 @@ datasets: sensor: goci2 wavelength: [0.37, 0.38, 0.39] long_name: Rayleigh-corrected reflectance at 380 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_380 coordinates: [longitude, latitude] @@ -281,7 +281,7 @@ datasets: sensor: goci2 wavelength: [0.402, 0.412, 0.422] long_name: Rayleigh-corrected reflectance at 412 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_412 coordinates: [longitude, latitude] @@ -290,7 +290,7 @@ datasets: sensor: goci2 wavelength: [0.433, 0.443, 0.453] long_name: Rayleigh-corrected reflectance at 443 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_443 coordinates: [longitude, latitude] @@ -299,7 +299,7 @@ datasets: sensor: goci2 wavelength: [0.48, 0.49, 0.50] long_name: Rayleigh-corrected reflectance at 490 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_490 coordinates: [longitude, latitude] @@ -308,7 +308,7 @@ datasets: sensor: goci2 wavelength: [0.50, 0.51, 0.52] long_name: Rayleigh-corrected reflectance at 510 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_510 coordinates: [longitude, latitude] @@ -317,7 +317,7 @@ datasets: sensor: goci2 wavelength: [0.545, 0.555, 0.565] long_name: Rayleigh-corrected reflectance at 555 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_555 coordinates: [longitude, latitude] @@ -326,7 +326,7 @@ datasets: sensor: goci2 wavelength: [0.61, 0.62, 0.63] long_name: Rayleigh-corrected reflectance at 620 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_620 coordinates: [longitude, latitude] @@ -335,7 +335,7 @@ datasets: sensor: goci2 wavelength: [0.65, 0.66, 0.67] long_name: Rayleigh-corrected reflectance at 660 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_660 coordinates: [longitude, latitude] @@ -344,7 +344,7 @@ datasets: sensor: goci2 wavelength: [0.675, 0.680, 0.685] long_name: Rayleigh-corrected reflectance at 680 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_680 coordinates: [longitude, latitude] @@ -353,7 +353,7 @@ datasets: sensor: goci2 wavelength: [0.704, 0.709, 0.714] long_name: Rayleigh-corrected reflectance at 709 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_709 coordinates: [longitude, latitude] @@ -362,7 +362,7 @@ datasets: sensor: goci2 wavelength: [0.735, 0.745, 0.755] long_name: Rayleigh-corrected reflectance at 745 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_745 coordinates: [longitude, latitude] @@ -371,7 +371,7 @@ datasets: sensor: goci2 wavelength: [0.845, 0.865, 0.885] long_name: Rayleigh-corrected reflectance at 865 nm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: RhoC_865 coordinates: [longitude, latitude] @@ -381,7 +381,7 @@ datasets: sensor: goci2 wavelength: [0.37, 0.38, 0.39] long_name: Remote sensing reflectance at 380 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_380 coordinates: [longitude, latitude] units: sr-1 @@ -391,7 +391,7 @@ datasets: sensor: goci2 wavelength: [0.402, 0.412, 0.422] long_name: Remote sensing reflectance at 412 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_412 coordinates: [longitude, latitude] units: sr-1 @@ -401,7 +401,7 @@ datasets: sensor: goci2 wavelength: [0.433, 0.443, 0.453] long_name: Remote sensing reflectance at 443 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_443 coordinates: [longitude, latitude] units: sr-1 @@ -411,7 +411,7 @@ datasets: sensor: goci2 wavelength: [0.48, 0.49, 0.50] long_name: Remote sensing reflectance at 490 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_490 coordinates: [longitude, latitude] units: sr-1 @@ -421,7 +421,7 @@ datasets: sensor: goci2 wavelength: [0.50, 0.51, 0.52] long_name: Remote sensing reflectance at 510 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_510 coordinates: [longitude, latitude] units: sr-1 @@ -431,7 +431,7 @@ datasets: sensor: goci2 wavelength: [0.545, 0.555, 0.565] long_name: Remote sensing reflectance at 555 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_555 coordinates: [longitude, latitude] units: sr-1 @@ -441,7 +441,7 @@ datasets: sensor: goci2 wavelength: [0.61, 0.62, 0.63] long_name: Remote sensing reflectance at 620 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_620 coordinates: [longitude, latitude] units: sr-1 @@ -451,7 +451,7 @@ datasets: sensor: goci2 wavelength: [0.65, 0.66, 0.67] long_name: Remote sensing reflectance at 660 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_660 coordinates: [longitude, latitude] units: sr-1 @@ -461,7 +461,7 @@ datasets: sensor: goci2 wavelength: [0.675, 0.680, 0.685] long_name: Remote sensing reflectance at 680 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_680 coordinates: [longitude, latitude] units: sr-1 @@ -471,7 +471,7 @@ datasets: sensor: goci2 wavelength: [0.704, 0.709, 0.714] long_name: Remote sensing reflectance at 709 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_709 coordinates: [longitude, latitude] units: sr-1 @@ -481,7 +481,7 @@ datasets: sensor: goci2 wavelength: [0.735, 0.745, 0.755] long_name: Remote sensing reflectance at 745 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_745 coordinates: [longitude, latitude] units: sr-1 @@ -491,7 +491,7 @@ datasets: sensor: goci2 wavelength: [0.845, 0.865, 0.885] long_name: Remote sensing reflectance at 865 nm, KOSC standard algorithm - file_type: goci_l2_ac + file_type: goci2_l2_ac file_key: Rrs_865 coordinates: [longitude, latitude] units: sr-1 @@ -501,7 +501,7 @@ datasets: a_total_380: name: a_total_380 long_name: Spectral absorption coefficient at 380 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_380 coordinates: [longitude, latitude] units: m-1 @@ -509,7 +509,7 @@ datasets: a_total_412: name: a_total_412 long_name: Spectral absorption coefficient at 412 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_412 coordinates: [longitude, latitude] units: m-1 @@ -517,7 +517,7 @@ datasets: a_total_443: name: a_total_443 long_name: Spectral absorption coefficient at 443 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_443 coordinates: [longitude, latitude] units: m-1 @@ -525,7 +525,7 @@ datasets: a_total_490: name: a_total_490 long_name: Spectral absorption coefficient at 490 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_490 coordinates: [longitude, latitude] units: m-1 @@ -533,7 +533,7 @@ datasets: a_total_510: name: a_total_510 long_name: Spectral absorption coefficient at 510 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_510 coordinates: [longitude, latitude] units: m-1 @@ -541,7 +541,7 @@ datasets: a_total_555: name: a_total_555 long_name: Spectral absorption coefficient at 555 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_555 coordinates: [longitude, latitude] units: m-1 @@ -549,7 +549,7 @@ datasets: a_total_620: name: a_total_620 long_name: Spectral absorption coefficient at 620 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_620 coordinates: [longitude, latitude] units: m-1 @@ -557,7 +557,7 @@ datasets: a_total_660: name: a_total_660 long_name: Spectral absorption coefficient at 660 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_660 coordinates: [longitude, latitude] units: m-1 @@ -565,7 +565,7 @@ datasets: a_total_680: name: a_total_680 long_name: Spectral absorption coefficient at 680 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_680 coordinates: [longitude, latitude] units: m-1 @@ -573,7 +573,7 @@ datasets: a_total_709: name: a_total_709 long_name: Spectral absorption coefficient at 709 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_709 coordinates: [longitude, latitude] units: m-1 @@ -581,7 +581,7 @@ datasets: a_total_745: name: a_total_745 long_name: Spectral absorption coefficient at 745 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_745 coordinates: [longitude, latitude] units: m-1 @@ -589,7 +589,7 @@ datasets: a_total_865: name: a_total_865 long_name: Spectral absorption coefficient at 865 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_total_865 coordinates: [longitude, latitude] units: m-1 @@ -598,7 +598,7 @@ datasets: bb_total_380: name: bb_total_380 long_name: Spectral backscattering coefficient at 380 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_380 coordinates: [longitude, latitude] units: m-1 @@ -606,7 +606,7 @@ datasets: bb_total_412: name: bb_total_412 long_name: Spectral backscattering coefficient at 412 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_412 coordinates: [longitude, latitude] units: m-1 @@ -614,7 +614,7 @@ datasets: bb_total_443: name: bb_total_443 long_name: Spectral backscattering coefficient at 443 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_443 coordinates: [longitude, latitude] units: m-1 @@ -622,7 +622,7 @@ datasets: bb_total_490: name: bb_total_490 long_name: Spectral backscattering coefficient at 490 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_490 coordinates: [longitude, latitude] units: m-1 @@ -630,7 +630,7 @@ datasets: bb_total_510: name: bb_total_510 long_name: Spectral backscattering coefficient at 510 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_510 coordinates: [longitude, latitude] units: m-1 @@ -638,7 +638,7 @@ datasets: bb_total_555: name: bb_total_555 long_name: Spectral backscattering coefficient at 555 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_555 coordinates: [longitude, latitude] units: m-1 @@ -646,7 +646,7 @@ datasets: bb_total_620: name: bb_total_620 long_name: Spectral backscattering coefficient at 620 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_620 coordinates: [longitude, latitude] units: m-1 @@ -654,7 +654,7 @@ datasets: bb_total_660: name: bb_total_660 long_name: Spectral backscattering coefficient at 660 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_660 coordinates: [longitude, latitude] units: m-1 @@ -662,7 +662,7 @@ datasets: bb_total_680: name: bb_total_680 long_name: Spectral backscattering coefficient at 680 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_680 coordinates: [longitude, latitude] units: m-1 @@ -670,7 +670,7 @@ datasets: bb_total_709: name: bb_total_709 long_name: Spectral backscattering coefficient at 709 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_709 coordinates: [longitude, latitude] units: m-1 @@ -678,7 +678,7 @@ datasets: bb_total_745: name: bb_total_745 long_name: Spectral backscattering coefficient at 745 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_745 coordinates: [longitude, latitude] units: m-1 @@ -686,7 +686,7 @@ datasets: bb_total_865: name: bb_total_865 long_name: Spectral backscattering coefficient at 865 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_total_865 coordinates: [longitude, latitude] units: m-1 @@ -695,7 +695,7 @@ datasets: a_dg_443: name: a_dg_443 long_name: Spectral absorption coefficient of detritus and gelbstoff at 443 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_dg_443 coordinates: [longitude, latitude] units: m-1 @@ -703,7 +703,7 @@ datasets: a_chl_443: name: a_chl_443 long_name: Spectral absorption coefficient of chlorophyll-a at 443 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: a_chl_443 coordinates: [longitude, latitude] units: m-1 @@ -711,7 +711,7 @@ datasets: bb_p_555: name: bb_p_555 long_name: Spectral backscattering coefficient of particle at 555 nm, QAA version 6 - file_type: goci_l2_iop + file_type: goci2_l2_iop file_key: bb_p_555 coordinates: [longitude, latitude] units: m-1 @@ -720,35 +720,35 @@ datasets: AOD_550: name: AOD_550 long_name: Aerosol Optical Depth at 550 nm - file_type: goci_l2_aod + file_type: goci2_l2_aod file_key: Aerosol_Optical_Depth coordinates: [longitude, latitude] Aerosol_Type: name: Aerosol_Type long_name: Aerosol type; 1 = Dust, 2 = Non-absorbing Coarse, 3 = Mixture, 4 = High-absorbing Fine, 5 = Moderate-absorbing Fine, 6 = Non-absorbing Fine - file_type: goci_l2_aod + file_type: goci2_l2_aod file_key: Aerosol_Type coordinates: [longitude, latitude] Angstrom_Exponent: name: Angstrom_Exponent long_name: Calculated Angstrom Exponent between 440 and 870 nm - file_type: goci_l2_aod + file_type: goci2_l2_aod file_key: Angstrom_Exponent coordinates: [longitude, latitude] Fine_Mode_Fraction: name: Fine_Mode_Fraction long_name: Fine Mode Fraction at 550 nm - file_type: goci_l2_aod + file_type: goci2_l2_aod file_key: Fine_Mode_Fraction coordinates: [longitude, latitude] Single_Scattering_Albedo: name: Single_Scattering_Albedo long_name: Single Scattering Albedo at 440 nm - file_type: goci_l2_aod + file_type: goci2_l2_aod file_key: Single_Scattering_Albedo coordinates: [longitude, latitude] @@ -756,14 +756,14 @@ datasets: MF: name: MF long_name: Marine fog existence(Yes/No/Possible), Machine learning based KOSC Algorithm - file_type: goci_l2_mf + file_type: goci2_l2_mf file_key: MF coordinates: [longitude, latitude] CF: name: CF long_name: Chlorophyll(-a) Front, CF - file_type: goci_l2_cf + file_type: goci2_l2_cf file_key: CF coordinates: [longitude, latitude] units : mg m-3 km-1 @@ -771,21 +771,21 @@ datasets: FA: name: FA long_name: Subpixel area fraction covered by floating brown algae or green algae - file_type: goci_l2_fa + file_type: goci2_l2_fa file_key: FA coordinates: [longitude, latitude] FGI: name: FGI long_name: Fishing ground index for chub mackerel - file_type: goci_l2_fgi + file_type: goci2_l2_fgi file_key: FGI coordinates: [longitude, latitude] SSS: name: SSS long_name: Sea Surface Salinity, Neural network algorithm - file_type: goci_l2_lsss + file_type: goci2_l2_lsss file_key: sss coordinates: [longitude, latitude] units: psu @@ -793,7 +793,7 @@ datasets: PP: name: PP long_name: Primary Production - file_type: goci_l2_pp + file_type: goci2_l2_pp file_key: PP coordinates: [longitude, latitude] units: PP unit @@ -801,14 +801,14 @@ datasets: RI: name: RI long_name: Red Tide Index - file_type: goci_l2_ri + file_type: goci2_l2_ri file_key: RI coordinates: [longitude, latitude] SSC_direction: name: SSC_direction long_name: Sea Surface Current direction - file_type: goci_l2_ssc + file_type: goci2_l2_ssc file_key: SSC_direction coordinates: [longitude, latitude] units: degree @@ -816,7 +816,7 @@ datasets: SSC_speed: name: SSC_speed long_name: Sea Surface Current speed - file_type: goci_l2_ssc + file_type: goci2_l2_ssc file_key: SSC_speed coordinates: [longitude, latitude] units: m s-1 @@ -824,7 +824,7 @@ datasets: SSC_u: name: SSC_u long_name: Sea Surface Current u-component - file_type: goci_l2_ssc + file_type: goci2_l2_ssc file_key: SSC_u coordinates: [longitude, latitude] units: m s-1 @@ -832,7 +832,7 @@ datasets: SSC_v: name: SSC_v long_name: Sea Surface Current v-component - file_type: goci_l2_ssc + file_type: goci2_l2_ssc file_key: SSC_v coordinates: [longitude, latitude] units: m s-1 diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index 574d44a829..fe00d1ef96 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -50,14 +50,15 @@ def __init__(self, filename, filename_info, filetype_info): def _merge_navigation_data(self, filetype_info): """Merge navigation data and geophysical data.""" navigation = self["navigation_data"] - if filetype_info["file_type"] == "goci_l2_ac": + if filetype_info["file_type"] == "goci2_l2_ac": Rhoc = self["geophysical_data/RhoC"] Rrs = self["geophysical_data/Rrs"] data = xr.merge([Rhoc, Rrs, navigation]) - elif filetype_info["file_type"] == "goci_l2_iop": + elif filetype_info["file_type"] == "goci2_l2_iop": a = self["geophysical_data/a_total"] bb = self["geophysical_data/bb_total"] - data = xr.merge([a, bb, navigation]) + data = self["geophysical_data"] + data = xr.merge([a, bb, data, navigation]) else: data = self["geophysical_data"] data = xr.merge([data, navigation]) @@ -81,7 +82,6 @@ def get_dataset(self, key, info): logger.debug("Reading in get_dataset %s.", var) variable = self.nc[var] - # Data has 'Latitude' and 'Longitude' coords, these must be replaced. variable = variable.rename({"number_of_lines": "y", "pixels_per_line": "x"}) variable.attrs.update(key.to_dict()) From a6b0badcc8848f8fb9b64f3d5a532f7c04085efa Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Sun, 31 Mar 2024 16:08:57 +0800 Subject: [PATCH 283/481] fix primary production reader --- satpy/readers/goci2_l2_nc.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index fe00d1ef96..208b14c13b 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -84,5 +84,9 @@ def get_dataset(self, key, info): variable = variable.rename({"number_of_lines": "y", "pixels_per_line": "x"}) + # Some products may miss lon/lat standard_name, use name as base name if it is not already present + if variable.attrs.get("standard_name", None) is None: + variable.attrs.update({"standard_name": variable.name}) + variable.attrs.update(key.to_dict()) return variable From 8ee9bb8ff8af747683604c665a0c6c746cf02299 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Mon, 1 Apr 2024 11:33:28 +0800 Subject: [PATCH 284/481] add pytest for GOCI-II --- satpy/tests/reader_tests/test_goci2_l2_nc.py | 210 +++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 satpy/tests/reader_tests/test_goci2_l2_nc.py diff --git a/satpy/tests/reader_tests/test_goci2_l2_nc.py b/satpy/tests/reader_tests/test_goci2_l2_nc.py new file mode 100644 index 0000000000..865ac3184e --- /dev/null +++ b/satpy/tests/reader_tests/test_goci2_l2_nc.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2016-2018 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 . +"""Module for testing the satpy.readers.goci2_l2_nc module.""" +from datetime import datetime + +import numpy as np +import pytest +import xarray as xr +from pytest_lazyfixture import lazy_fixture + +from satpy import Scene + +# NOTE: +# The following fixtures are not defined in this file, but are used and injected by Pytest: +# - tmp_path_factory + + +start_time = datetime(2024, 2, 14, 2, 32, 27) +end_time = datetime(2024, 2, 14, 2, 33, 31) + +global_attrs = { + "observation_start_time": start_time.strftime("%Y%m%d_%H%M%S"), + "observation_end_time": end_time.strftime("%Y%m%d_%H%M%S"), + "instrument": "GOCI-II", + "platform": "GK-2B", +} + +badarea_attrs = global_attrs.copy() +badarea_attrs["cdm_data_type"] = "bad_area" + + +def _create_lonlat(): + """Create a fake navigation dataset with lon/lat.""" + lon, lat = np.meshgrid(np.linspace(120, 130, 10), np.linspace(30, 40, 10)) + lon = xr.DataArray( + lon, + dims=("number_of_lines", "pixels_per_line"), + attrs={"standard_name": "longitude", "units": "degrees_east"}, + ) + lat = xr.DataArray( + lat, + dims=("number_of_lines", "pixels_per_line"), + attrs={"standard_name": "latitude", "units": "degrees_north"}, + ) + ds = xr.Dataset() + ds["longitude"] = lon + ds["latitude"] = lat + return ds + + +def _create_bad_lon_lat(): + """Create a fake navigation dataset with lon/lat base name missing.""" + lon, lat = np.meshgrid(np.linspace(120, 130, 10), np.linspace(30, 40, 10)) + ds = xr.Dataset( + { + "longitude": (["number_of_lines", "pixels_per_line"], lon), + "latitude": (["number_of_lines", "pixels_per_line"], lat), + } + ) + return ds + + +@pytest.fixture(scope="session") +def ac_file(tmp_path_factory): + """Create a fake atmospheric correction product.""" + data = np.random.random((10, 10)) + RhoC = xr.Dataset( + {"RhoC_555": (["number_of_lines", "pixels_per_line"], data)}, + coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, + ) + Rrs = xr.Dataset( + {"Rrs_555": (["number_of_lines", "pixels_per_line"], data)}, + coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, + ) + navigation = _create_lonlat() + ds = xr.Dataset(attrs=global_attrs) + fname = ( + f'{tmp_path_factory.mktemp("data")}/GK2B_GOCI2_L2_20240214_021530_LA_S010_AC.nc' + ) + ds.to_netcdf(fname) + navigation.to_netcdf(fname, group="navigation_data", mode="a") + RhoC.to_netcdf(fname, group="geophysical_data/RhoC", mode="a") + Rrs.to_netcdf(fname, group="geophysical_data/Rrs", mode="a") + return fname + + +@pytest.fixture(scope="module") +def iop_file(tmp_path_factory): + """Create a fake IOP product.""" + data = np.random.random((10, 10)) + a = xr.Dataset( + {"a_total_555": (["number_of_lines", "pixels_per_line"], data)}, + coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, + ) + bb = xr.Dataset( + {"bb_total_555": (["number_of_lines", "pixels_per_line"], data)}, + coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, + ) + navigation = _create_lonlat() + ds = xr.Dataset(attrs=global_attrs) + fname = f'{tmp_path_factory.mktemp("data")}/GK2B_GOCI2_L2_20240214_021530_LA_S010_IOP.nc' + ds.to_netcdf(fname) + navigation.to_netcdf(fname, group="navigation_data", mode="a") + a.to_netcdf(fname, group="geophysical_data/a_total", mode="a") + bb.to_netcdf(fname, group="geophysical_data/bb_total", mode="a") + return fname + + +@pytest.fixture(scope="module") +def generic_file(tmp_path_factory): + """Create a fake ouput product like Chl, Zsd etc.""" + data = np.random.random((10, 10)) + geophysical_data = xr.Dataset( + {"Chl": (["number_of_lines", "pixels_per_line"], data)}, + coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, + ) + navigation = _create_lonlat() + ds = xr.Dataset(attrs=global_attrs) + fname = f'{tmp_path_factory.mktemp("data")}/GK2B_GOCI2_L2_20240214_021530_LA_S010_Chl.nc' + ds.to_netcdf(fname) + navigation.to_netcdf(fname, group="navigation_data", mode="a") + geophysical_data.to_netcdf(fname, group="geophysical_data", mode="a") + return fname + + +@pytest.fixture(scope="module") +def generic_bad_file(tmp_path_factory): + """Create a PP product with lon/lat base name missing.""" + data = np.random.random((10, 10)) + geophysical_data = xr.Dataset( + {"PP": (["number_of_lines", "pixels_per_line"], data)}, + coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, + ) + navigation = _create_bad_lon_lat() + ds = xr.Dataset(attrs=global_attrs) + fname = ( + f'{tmp_path_factory.mktemp("data")}/GK2B_GOCI2_L2_20240214_021530_LA_S010_PP.nc' + ) + ds.to_netcdf(fname) + navigation.to_netcdf(fname, group="navigation_data", mode="a") + geophysical_data.to_netcdf(fname, group="geophysical_data", mode="a") + return fname + + +class TestGOCI2Reader: + """Test the GOCI-II L2 netcdf file reader.""" + + @pytest.mark.parametrize( + "test_files", + [ + lazy_fixture("ac_file"), + lazy_fixture("iop_file"), + lazy_fixture("generic_file"), + lazy_fixture("generic_bad_file"), + ], + ) + def test_scene_available_datasets(self, test_files): + """Test that datasets are available.""" + scene = Scene(filenames=[test_files], reader="goci2_l2_nc") + available_datasets = scene.all_dataset_names() + assert len(available_datasets) > 0 + assert "longitude" in available_datasets + assert "latitude" in available_datasets + + @pytest.mark.parametrize( + "test_files", + [ + lazy_fixture("ac_file"), + lazy_fixture("iop_file"), + lazy_fixture("generic_file"), + lazy_fixture("generic_bad_file"), + ], + ) + def test_start_end_time(self, test_files): + """Test dataset start_time and end_time.""" + scene = Scene(filenames=[test_files], reader="goci2_l2_nc") + assert scene.start_time == start_time + assert scene.end_time == end_time + + @pytest.mark.parametrize( + ("test_files", "datasets"), + [ + (lazy_fixture("ac_file"), ["RhoC_555", "Rrs_555"]), + (lazy_fixture("iop_file"), ["a_total_555", "bb_total_555"]), + (lazy_fixture("generic_file"), ["Chl"]), + (lazy_fixture("generic_bad_file"), ["PP"]), + ], + ) + def test_load_dataset(self, test_files, datasets): + """Test dataset loading.""" + scene = Scene(filenames=[test_files], reader="goci2_l2_nc") + scene.load(datasets) + for dataset in datasets: + data_arr = scene[dataset] + assert data_arr.dims == ("y", "x") From db109c445d4b723ee43664c4a95ff64b1522bfee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 10:58:32 +0000 Subject: [PATCH 285/481] Bump pypa/gh-action-pypi-publish from 1.8.12 to 1.8.14 Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.12 to 1.8.14. - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.12...v1.8.14) --- updated-dependencies: - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/deploy-sdist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-sdist.yaml b/.github/workflows/deploy-sdist.yaml index 450e47864c..797eab716b 100644 --- a/.github/workflows/deploy-sdist.yaml +++ b/.github/workflows/deploy-sdist.yaml @@ -23,7 +23,7 @@ jobs: - name: Publish package to PyPI if: github.event.action == 'published' - uses: pypa/gh-action-pypi-publish@v1.8.12 + uses: pypa/gh-action-pypi-publish@v1.8.14 with: user: __token__ password: ${{ secrets.pypi_password }} From 63245b26f83c6cff520cfeadb35ea4fe6ba4e742 Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Mon, 1 Apr 2024 23:46:18 +0800 Subject: [PATCH 286/481] refactor groups merge --- satpy/readers/goci2_l2_nc.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index 208b14c13b..7cef5c074b 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -29,6 +29,15 @@ logger = logging.getLogger(__name__) +GROUPS_MAP = { + "goci2_l2_ac": ["geophysical_data/RhoC", "geophysical_data/Rrs", "navigation_data"], + "goci2_l2_iop": [ + "geophysical_data/a_total", + "geophysical_data/bb_total", + "navigation_data", + ], +} + class GOCI2L2NCFileHandler(NetCDF4FileHandler): """File handler for GOCI-II L2 official data in netCDF format.""" @@ -39,7 +48,8 @@ def __init__(self, filename, filename_info, filetype_info): self.slot = filename_info.get("slot", None) self.attrs = self["/attrs"] - self.nc = self._merge_navigation_data(filetype_info) + self.filetype = filetype_info["file_type"] + self.nc = self._merge_navigation_data(self.filetype) self.sensor = self.attrs["instrument"].lower() self.nlines = self.nc.sizes["number_of_lines"] @@ -47,22 +57,13 @@ def __init__(self, filename, filename_info, filetype_info): self.platform_shortname = filename_info["platform"] self.coverage = filename_info["coverage"] - def _merge_navigation_data(self, filetype_info): + def _merge_navigation_data(self, filetype): """Merge navigation data and geophysical data.""" - navigation = self["navigation_data"] - if filetype_info["file_type"] == "goci2_l2_ac": - Rhoc = self["geophysical_data/RhoC"] - Rrs = self["geophysical_data/Rrs"] - data = xr.merge([Rhoc, Rrs, navigation]) - elif filetype_info["file_type"] == "goci2_l2_iop": - a = self["geophysical_data/a_total"] - bb = self["geophysical_data/bb_total"] - data = self["geophysical_data"] - data = xr.merge([a, bb, data, navigation]) + if filetype in GROUPS_MAP.keys(): + groups = GROUPS_MAP[filetype] else: - data = self["geophysical_data"] - data = xr.merge([data, navigation]) - return data + groups = ["geophysical_data", "navigation_data"] + return xr.merge([self[group] for group in groups]) @property def start_time(self): From 10c03778e5ce70f6adecdddaa006a1639fd9481a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 21:40:49 +0000 Subject: [PATCH 287/481] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.2.0 → v0.3.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.2.0...v0.3.5) - [github.com/PyCQA/bandit: 1.7.7 → 1.7.8](https://github.com/PyCQA/bandit/compare/1.7.7...1.7.8) - [github.com/pre-commit/mirrors-mypy: v1.8.0 → v1.9.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.8.0...v1.9.0) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4a90da5ce9..eadd0f2c55 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ fail_fast: false repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: 'v0.2.0' + rev: 'v0.3.5' hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks @@ -14,12 +14,12 @@ repos: - id: check-yaml args: [--unsafe] - repo: https://github.com/PyCQA/bandit - rev: '1.7.7' # Update me! + rev: '1.7.8' # Update me! hooks: - id: bandit args: [--ini, .bandit] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.8.0' # Use the sha / tag you want to point at + rev: 'v1.9.0' # Use the sha / tag you want to point at hooks: - id: mypy additional_dependencies: From d5c27ef0497ecb9bdeb40744a2d9f807fe08e2fd Mon Sep 17 00:00:00 2001 From: Isotr0py <2037008807@qq.com> Date: Tue, 2 Apr 2024 10:39:25 +0800 Subject: [PATCH 288/481] reduce abc for codebeat --- satpy/readers/goci2_l2_nc.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index 7cef5c074b..a79d582544 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -45,16 +45,13 @@ class GOCI2L2NCFileHandler(NetCDF4FileHandler): def __init__(self, filename, filename_info, filetype_info): """Initialize the reader.""" super().__init__(filename, filename_info, filetype_info) - self.slot = filename_info.get("slot", None) self.attrs = self["/attrs"] - self.filetype = filetype_info["file_type"] - self.nc = self._merge_navigation_data(self.filetype) + self.nc = self._merge_navigation_data(filetype_info["file_type"]) - self.sensor = self.attrs["instrument"].lower() + # Read metadata which are common to all datasets self.nlines = self.nc.sizes["number_of_lines"] self.ncols = self.nc.sizes["pixels_per_line"] - self.platform_shortname = filename_info["platform"] self.coverage = filename_info["coverage"] def _merge_navigation_data(self, filetype): From fbcf1a5b177c4d6d439477b32c85e75a678fc645 Mon Sep 17 00:00:00 2001 From: Longtsing Date: Tue, 2 Apr 2024 11:31:56 +0800 Subject: [PATCH 289/481] Update _geos_area.py --- satpy/readers/_geos_area.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/readers/_geos_area.py b/satpy/readers/_geos_area.py index f9c588b085..8a89b091c9 100644 --- a/satpy/readers/_geos_area.py +++ b/satpy/readers/_geos_area.py @@ -72,7 +72,7 @@ def get_area_extent(pdict): coff: Column offset factor loff: Line offset factor scandir: 'N2S' for standard (N->S), 'S2N' for inverse (S->N) - h: Altitude of satellite (m) + h: Altitude of satellite above the Earth's surface (m) Returns: aex: An area extent for the scene From 24109a1a418385b8c48500663c7efb8cd4d6b777 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Tue, 2 Apr 2024 16:31:22 +0200 Subject: [PATCH 290/481] Fix the viirs EDR tests for newer xarray --- satpy/tests/reader_tests/test_viirs_edr.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/satpy/tests/reader_tests/test_viirs_edr.py b/satpy/tests/reader_tests/test_viirs_edr.py index e61718e9db..d764891760 100644 --- a/satpy/tests/reader_tests/test_viirs_edr.py +++ b/satpy/tests/reader_tests/test_viirs_edr.py @@ -132,7 +132,8 @@ def _create_surf_refl_variables() -> dict[str, xr.DataArray]: "valid_min": -180.0, "valid_max": 180.0} lat_attrs = {"standard_name": "latitude", "units": "degrees_north", "_FillValue": -999.9, "valid_min": -90.0, "valid_max": 90.0} - sr_attrs = {"units": "unitless", "_FillValue": -9999, "scale_factor": 0.0001, "add_offset": 0.0} + sr_attrs = {"units": "unitless", "_FillValue": -9999, + "scale_factor": np.float32(0.0001), "add_offset": np.float32(0.0)} i_data = np.random.random_sample((I_ROWS, I_COLS)).astype(np.float32) m_data = np.random.random_sample((M_ROWS, M_COLS)).astype(np.float32) @@ -257,7 +258,8 @@ def _create_continuous_variables(var_names: Iterable[str]) -> dict[str, xr.DataA lon_attrs = {"standard_name": "longitude", "units": "degrees_east", "_FillValue": -999.9} lat_attrs = {"standard_name": "latitude", "units": "degrees_north", "_FillValue": -999.9} - cont_attrs = {"units": "Kelvin", "_FillValue": -9999, "scale_factor": 0.0001, "add_offset": 0.0} + cont_attrs = {"units": "Kelvin", "_FillValue": -9999, + "scale_factor": np.float32(0.0001), "add_offset": np.float32(0.0)} m_data = np.random.random_sample((M_ROWS, M_COLS)).astype(np.float32) data_arrs = { From 525cef947910db4c884ca66bf5ba903112aad6c0 Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Sun, 7 Apr 2024 12:48:32 +0100 Subject: [PATCH 291/481] Update MSI SAFE reader to explicitly state that only L1C files are presently supported. Also, add an option to enable the user to select the observation time based on tile metadata rather than filename, which will prevent one tile from overwriting another when saving multiple tiles individually. --- satpy/etc/readers/msi_safe.yaml | 36 ++++++++++++++++----------------- satpy/readers/msi_safe.py | 29 +++++++++++++++++++++----- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index d93d269782..aec2f4b65e 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -1,7 +1,7 @@ reader: name: msi_safe short_name: MSI SAFE - long_name: Sentinel-2 A and B MSI data in SAFE format + long_name: Sentinel-2 A and B MSI data in SAFE format, supporting L1C format only. description: SAFE Reader for MSI data (Sentinel-2) status: Nominal supports_fsspec: false @@ -10,16 +10,16 @@ reader: reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader file_types: - safe_granule: + safe_granule_l1c: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSIL1C_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] + file_patterns: ['{fmission_id:3s}_MSI{proclevel:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] requires: [safe_metadata, safe_tile_metadata] safe_tile_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML - file_patterns: ['{fmission_id:3s}_MSIL1C_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + file_patterns: ['{fmission_id:3s}_MSI{proclevel:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] safe_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML - file_patterns: ['{fmission_id:3s}_MSIL1C_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] + file_patterns: ['{fmission_id:3s}_MSI{proclevel:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] datasets: @@ -36,7 +36,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B02: name: B02 @@ -50,7 +50,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B03: name: B03 @@ -64,7 +64,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B04: name: B04 @@ -78,7 +78,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B05: name: B05 @@ -92,7 +92,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B06: name: B06 @@ -106,7 +106,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B07: name: B07 @@ -120,7 +120,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B08: name: B08 @@ -134,7 +134,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B8A: name: B8A @@ -148,7 +148,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B09: name: B09 @@ -162,7 +162,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B10: name: B10 @@ -176,7 +176,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B11: name: B11 @@ -190,7 +190,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c B12: name: B12 @@ -204,7 +204,7 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 - file_type: safe_granule + file_type: safe_granule_l1c solar_zenith_angle: diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index 1131e40a96..839539bd4f 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -27,8 +27,16 @@ reader='msi_safe', reader_kwargs={'mask_saturated': False}) scene.load(['B01']) - -L1B format description for the files read here: +MSI data typically have the same start time across multiple tiles, which can cause +problems if iterating over multiple tiles, as the saved imagery from one tile +may be overwritten by the next tile. +To overcome this, the user can specify `use_tile_time`, which will determine the start +time from the tile metadata rather than from the filename:: + scene = satpy.Scene(filenames, + reader='msi_safe', + reader_kwargs={'use_tile_time': True}) + scene.load(['B01']) +L1C format description for the files read here: https://sentinels.copernicus.eu/documents/247904/0/Sentinel-2-product-specifications-document-V14-9.pdf/ @@ -37,6 +45,7 @@ import logging import dask.array as da +from datetime import datetime import defusedxml.ElementTree as ET import numpy as np import xarray as xr @@ -58,18 +67,22 @@ class SAFEMSIL1C(BaseFileHandler): """File handler for SAFE MSI files (jp2).""" - def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_saturated=True): + def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_saturated=True, use_tile_time=False): """Initialize the reader.""" super(SAFEMSIL1C, self).__init__(filename, filename_info, filetype_info) del mask_saturated - self._start_time = filename_info["observation_time"] - self._end_time = filename_info["observation_time"] self._channel = filename_info["band_name"] self._tile_mda = tile_mda self._mda = mda self.platform_name = PLATFORMS[filename_info["fmission_id"]] + if use_tile_time: + self._start_time = self._tile_mda.start_time() + else: + self._start_time = filename_info["observation_time"] + self._end_time = filename_info["observation_time"] + def get_dataset(self, key, info): """Load a dataset.""" if self._channel != key["name"]: @@ -267,6 +280,12 @@ def _shape(self, resolution): cols = int(self.geocoding.find('Size[@resolution="' + str(resolution) + '"]/NCOLS').text) return cols, rows + def start_time(self): + """Get the observation time from the tile metadata.""" + timestr = self.root.find('.//SENSING_TIME').text + return datetime.strptime(timestr, "%Y-%m-%dT%H:%M:%S.%fZ") + + @staticmethod def _do_interp(minterp, xcoord, ycoord): interp_points2 = np.vstack((ycoord.ravel(), xcoord.ravel())) From 63567fee256574c2d85236c77910f49e357ce95c Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Sun, 7 Apr 2024 12:49:04 +0100 Subject: [PATCH 292/481] Remove extra blank line. --- satpy/readers/msi_safe.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index 839539bd4f..93e09bc8e0 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -285,7 +285,6 @@ def start_time(self): timestr = self.root.find('.//SENSING_TIME').text return datetime.strptime(timestr, "%Y-%m-%dT%H:%M:%S.%fZ") - @staticmethod def _do_interp(minterp, xcoord, ycoord): interp_points2 = np.vstack((ycoord.ravel(), xcoord.ravel())) From e722e9fb753590ae4d2f3d46d30469319ca4c51a Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Sun, 7 Apr 2024 13:39:57 +0100 Subject: [PATCH 293/481] Add tests to MSI SAFE reader to check that start_time is read as-expected. --- satpy/tests/reader_tests/test_msi_safe.py | 24 ++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index bcee32ddbb..85178f463a 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -17,6 +17,7 @@ # satpy. If not, see . """Module for testing the satpy.readers.msi_safe module.""" import unittest.mock as mock +from datetime import datetime from io import BytesIO, StringIO import numpy as np @@ -25,6 +26,10 @@ from satpy.tests.utils import make_dataid +# Datetimes used for checking start time is correctly set. +fname_dt = datetime(2020, 10, 1, 18, 35, 41) +tilemd_dt = datetime(2020, 10, 1, 16, 34, 23, 153611) + mtd_tile_xml = b""" @@ -873,6 +878,10 @@ def setup_method(self): self.old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), filename_info, mock.MagicMock()) self.xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=True) + def test_start_time(self): + """Ensure start time is read correctly from XML.""" + assert self.xml_tile_fh.start_time() == tilemd_dt + def test_satellite_zenith_array(self): """Test reading the satellite zenith array.""" info = dict(xml_tag="Viewing_Incidence_Angles_Grids", xml_item="Zenith") @@ -971,10 +980,11 @@ class TestSAFEMSIL1C: def setup_method(self): """Set up the test.""" from satpy.readers.msi_safe import SAFEMSITileMDXML - self.filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B01", dtile_number=None) + self.filename_info = dict(observation_time=fname_dt, fmission_id="S2A", band_name="B01", dtile_number=None) self.fake_data = xr.Dataset({"band_data": xr.DataArray([[[0, 1], [65534, 65535]]], dims=["band", "x", "y"])}) self.tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_tile_xml), self.filename_info, mock.MagicMock()) + self.tile_mda.start_time.return_value = tilemd_dt @pytest.mark.parametrize(("mask_saturated", "calibration", "expected"), [(True, "reflectance", [[np.nan, 0.01 - 10], [645.34, np.inf]]), @@ -991,3 +1001,15 @@ def test_calibration_and_masking(self, mask_saturated, calibration, expected): with mock.patch("xarray.open_dataset", return_value=self.fake_data): res = self.jp2_fh.get_dataset(make_dataid(name="B01", calibration=calibration), info=dict()) np.testing.assert_allclose(res, expected) + + @pytest.mark.parametrize(("use_obs_time", "expected"), + [(True, tilemd_dt), + (False, fname_dt)]) + def test_start_time(self, use_obs_time, expected): + """Test that the correct start time is returned.""" + from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML + + mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.filename_info, mock.MagicMock()) + self.jp2_fh = SAFEMSIL1C("somefile", self.filename_info, mock.MagicMock(), + mda, self.tile_mda, use_tile_time=use_obs_time) + assert expected == self.jp2_fh.start_time From 89a75cf1757d01dcb5aa4db9fd3299006a924d4d Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Sun, 7 Apr 2024 13:53:18 +0100 Subject: [PATCH 294/481] Fix optional kwarg in MSI SAFE reader. --- satpy/readers/msi_safe.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index 93e09bc8e0..bd01bbf7ea 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -43,9 +43,9 @@ """ import logging +from datetime import datetime import dask.array as da -from datetime import datetime import defusedxml.ElementTree as ET import numpy as np import xarray as xr @@ -123,7 +123,7 @@ def get_area_def(self, dsid): class SAFEMSIXMLMetadata(BaseFileHandler): """Base class for SAFE MSI XML metadata filehandlers.""" - def __init__(self, filename, filename_info, filetype_info, mask_saturated=True): + def __init__(self, filename, filename_info, filetype_info, mask_saturated=True, use_tile_time=False): """Init the reader.""" super().__init__(filename, filename_info, filetype_info) self._start_time = filename_info["observation_time"] @@ -239,7 +239,7 @@ def _fill_swath_edges(angles): class SAFEMSITileMDXML(SAFEMSIXMLMetadata): """File handle for sentinel 2 safe XML tile metadata.""" - def __init__(self, filename, filename_info, filetype_info, mask_saturated=True): + def __init__(self, filename, filename_info, filetype_info, mask_saturated=True, use_tile_time=False): """Init the reader.""" super().__init__(filename, filename_info, filetype_info, mask_saturated) self.geocoding = self.root.find(".//Tile_Geocoding") @@ -282,7 +282,7 @@ def _shape(self, resolution): def start_time(self): """Get the observation time from the tile metadata.""" - timestr = self.root.find('.//SENSING_TIME').text + timestr = self.root.find(".//SENSING_TIME").text return datetime.strptime(timestr, "%Y-%m-%dT%H:%M:%S.%fZ") @staticmethod From b83675e2ca0299497e13cbe4039ebd615954330c Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Mon, 8 Apr 2024 07:43:57 +0100 Subject: [PATCH 295/481] Fix MSI SAFE docs. --- satpy/readers/msi_safe.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index bd01bbf7ea..dc54dbe971 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -27,15 +27,18 @@ reader='msi_safe', reader_kwargs={'mask_saturated': False}) scene.load(['B01']) + MSI data typically have the same start time across multiple tiles, which can cause problems if iterating over multiple tiles, as the saved imagery from one tile may be overwritten by the next tile. To overcome this, the user can specify `use_tile_time`, which will determine the start time from the tile metadata rather than from the filename:: + scene = satpy.Scene(filenames, reader='msi_safe', reader_kwargs={'use_tile_time': True}) scene.load(['B01']) + L1C format description for the files read here: https://sentinels.copernicus.eu/documents/247904/0/Sentinel-2-product-specifications-document-V14-9.pdf/ From 0b78e313ad3d8d41f3a90ff84201e7dfb3a084df Mon Sep 17 00:00:00 2001 From: clement laplace Date: Tue, 9 Apr 2024 12:16:49 +0000 Subject: [PATCH 296/481] feat: Add the reader for the fci L1C Africa files --- satpy/etc/readers/fci_l1c_nc.yaml | 1906 ++++++++++++++----- satpy/readers/fci_l1c_nc.py | 111 +- satpy/tests/reader_tests/test_fci_l1c_nc.py | 261 ++- 3 files changed, 1738 insertions(+), 540 deletions(-) diff --git a/satpy/etc/readers/fci_l1c_nc.yaml b/satpy/etc/readers/fci_l1c_nc.yaml index d241b3fa9e..88630cd017 100644 --- a/satpy/etc/readers/fci_l1c_nc.yaml +++ b/satpy/etc/readers/fci_l1c_nc.yaml @@ -9,106 +9,737 @@ reader: status: Beta for full-disc FDHSI and HRFI, RSS not supported yet supports_fsspec: true reader: !!python/name:satpy.readers.yaml_reader.GEOVariableSegmentYAMLReader - sensors: [ fci ] + sensors: [fci] # Source: MTG FCI L1 Product User Guide [FCIL1PUG] # https://www.eumetsat.int/media/45923 file_types: fci_l1c_fdhsi: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler - file_patterns: [ '{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-FDHSI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc' ] + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-FDHSI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc", + ] expected_segments: 40 required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time variable_name_replacements: channel_name: - - vis_04 - - vis_05 - - vis_06 - - vis_08 - - vis_09 - - nir_13 - - nir_16 - - nir_22 - - ir_38 - - wv_63 - - wv_73 - - ir_87 - - ir_97 - - ir_105 - - ir_123 - - ir_133 + - vis_04 + - vis_05 + - vis_06 + - vis_08 + - vis_09 + - nir_13 + - nir_16 + - nir_22 + - ir_38 + - wv_63 + - wv_73 + - ir_87 + - ir_97 + - ir_105 + - ir_123 + - ir_133 fci_l1c_hrfi: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler - file_patterns: [ '{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-HRFI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc' ] + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-HRFI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc", + ] expected_segments: 40 required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time variable_name_replacements: channel_name: - - vis_06_hr - - nir_22_hr - - ir_38_hr - - ir_105_hr - + - vis_06_hr + - nir_22_hr + - ir_38_hr + - ir_105_hr + fci_l1c_af_vis_06: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - vis_06 + fci_l1c_af_vis_04: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - vis_04 + fci_l1c_af_vis_05: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - vis_05 + fci_l1c_af_vis_08: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - vis_08 + fci_l1c_af_vis_09: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - vis_09 + fci_l1c_af_nir_13: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - nir_13 + fci_l1c_af_nir_16: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - nir_16 + fci_l1c_af_nir_22: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - nir_22 + fci_l1c_af_ir_38: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - ir_38 + fci_l1c_af_wv_63: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - wv_63 + fci_l1c_af_wv_73: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - wv_73 + fci_l1c_af_ir_87: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - ir_87 + fci_l1c_af_ir_97: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - ir_97 + fci_l1c_af_ir_105: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - ir_105 + fci_l1c_af_ir_123: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - ir_123 + fci_l1c_af_ir_133: + file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler + file_patterns: + [ + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + ] + expected_segments: 1 + required_netcdf_variables: + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + variable_name_replacements: + channel_name: + - ir_133 datasets: vis_04: name: vis_04 sensor: fci - wavelength: [ 0.384, 0.444, 0.504 ] - resolution: 1000 + wavelength: [0.384, 0.444, 0.504] + resolution: + 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_04] } + 3000: { file_type: fci_l1c_af_vis_04 } calibration: counts: standard_name: counts @@ -119,13 +750,14 @@ datasets: reflectance: standard_name: toa_bidirectional_reflectance units: "%" - file_type: fci_l1c_fdhsi vis_05: name: vis_05 sensor: fci wavelength: [0.470, 0.510, 0.550] - resolution: 1000 + resolution: + 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_05] } + 3000: { file_type: fci_l1c_af_vis_05 } calibration: counts: standard_name: counts @@ -136,15 +768,15 @@ datasets: reflectance: standard_name: toa_bidirectional_reflectance units: "%" - file_type: fci_l1c_fdhsi vis_06: name: vis_06 sensor: fci wavelength: [0.590, 0.640, 0.690] resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_06] } + 3000: { file_type: fci_l1c_af_vis_06 } calibration: counts: standard_name: counts @@ -160,7 +792,9 @@ datasets: name: vis_08 sensor: fci wavelength: [0.815, 0.865, 0.915] - resolution: 1000 + resolution: + 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_08] } + 3000: { file_type: fci_l1c_af_vis_08 } calibration: counts: standard_name: counts @@ -171,13 +805,14 @@ datasets: reflectance: standard_name: toa_bidirectional_reflectance units: "%" - file_type: fci_l1c_fdhsi vis_09: name: vis_09 sensor: fci wavelength: [0.894, 0.914, 0.934] - resolution: 1000 + resolution: + 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_09] } + 3000: { file_type: fci_l1c_af_vis_09 } calibration: counts: standard_name: counts @@ -188,13 +823,14 @@ datasets: reflectance: standard_name: toa_bidirectional_reflectance units: "%" - file_type: fci_l1c_fdhsi nir_13: name: nir_13 sensor: fci wavelength: [1.350, 1.380, 1.410] - resolution: 1000 + resolution: + 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_nir_13] } + 3000: { file_type: fci_l1c_af_nir_13 } calibration: counts: standard_name: counts @@ -205,13 +841,14 @@ datasets: reflectance: standard_name: toa_bidirectional_reflectance units: "%" - file_type: fci_l1c_fdhsi nir_16: name: nir_16 sensor: fci wavelength: [1.560, 1.610, 1.660] - resolution: 1000 + resolution: + 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_nir_16] } + 3000: { file_type: fci_l1c_af_nir_16 } calibration: counts: standard_name: counts @@ -222,15 +859,15 @@ datasets: reflectance: standard_name: toa_bidirectional_reflectance units: "%" - file_type: fci_l1c_fdhsi nir_22: name: nir_22 sensor: fci wavelength: [2.200, 2.250, 2.300] resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_nir_22] } + 3000: { file_type: fci_l1c_af_nir_22 } calibration: counts: standard_name: counts @@ -247,8 +884,9 @@ datasets: sensor: fci wavelength: [3.400, 3.800, 4.200] resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } calibration: counts: standard_name: counts @@ -264,7 +902,10 @@ datasets: name: wv_63 sensor: fci wavelength: [5.300, 6.300, 7.300] - resolution: 2000 + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } calibration: counts: standard_name: counts @@ -275,13 +916,15 @@ datasets: brightness_temperature: standard_name: toa_brightness_temperature units: "K" - file_type: fci_l1c_fdhsi wv_73: name: wv_73 sensor: fci wavelength: [6.850, 7.350, 7.850] - resolution: 2000 + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } calibration: counts: standard_name: counts @@ -292,13 +935,15 @@ datasets: brightness_temperature: standard_name: toa_brightness_temperature units: "K" - file_type: fci_l1c_fdhsi ir_87: name: ir_87 sensor: fci wavelength: [8.300, 8.700, 9.100] - resolution: 2000 + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } calibration: counts: standard_name: counts @@ -309,13 +954,15 @@ datasets: brightness_temperature: standard_name: toa_brightness_temperature units: "K" - file_type: fci_l1c_fdhsi ir_97: name: ir_97 sensor: fci wavelength: [9.360, 9.660, 9.960] - resolution: 2000 + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } calibration: counts: standard_name: counts @@ -326,15 +973,15 @@ datasets: brightness_temperature: standard_name: toa_brightness_temperature units: "K" - file_type: fci_l1c_fdhsi ir_105: name: ir_105 sensor: fci wavelength: [9.800, 10.500, 11.200] resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } calibration: counts: standard_name: counts @@ -350,7 +997,10 @@ datasets: name: ir_123 sensor: fci wavelength: [11.800, 12.300, 12.800] - resolution: 2000 + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } calibration: counts: standard_name: counts @@ -361,13 +1011,15 @@ datasets: brightness_temperature: standard_name: toa_brightness_temperature units: "K" - file_type: fci_l1c_fdhsi ir_133: name: ir_133 sensor: fci wavelength: [12.700, 13.300, 13.900] - resolution: 2000 + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } calibration: counts: standard_name: counts @@ -378,1333 +1030,1595 @@ datasets: brightness_temperature: standard_name: toa_brightness_temperature units: "K" - file_type: fci_l1c_fdhsi vis_04_pixel_quality: name: vis_04_pixel_quality sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_pixel_quality: name: vis_05_pixel_quality sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_pixel_quality: name: vis_06_pixel_quality sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_pixel_quality: name: vis_08_pixel_quality sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_pixel_quality: name: vis_09_pixel_quality sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_pixel_quality: name: nir_13_pixel_quality sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_pixel_quality: name: nir_16_pixel_quality sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_pixel_quality: name: nir_22_pixel_quality sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_pixel_quality: name: ir_38_pixel_quality sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_pixel_quality: name: wv_63_pixel_quality sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_pixel_quality: name: wv_73_pixel_quality sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_pixel_quality: name: ir_87_pixel_quality sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_pixel_quality: name: ir_97_pixel_quality sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_pixel_quality: name: ir_105_pixel_quality sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_pixel_quality: name: ir_123_pixel_quality sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_pixel_quality: name: ir_133_pixel_quality sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_index_map: name: vis_04_index_map sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_index_map: name: vis_05_index_map sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_index_map: name: vis_06_index_map sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_index_map: name: vis_08_index_map sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_index_map: name: vis_09_index_map sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_index_map: name: nir_13_index_map sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_index_map: name: nir_16_index_map sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_index_map: name: nir_22_index_map sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_index_map: name: ir_38_index_map sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_index_map: name: wv_63_index_map sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_index_map: name: wv_73_index_map sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_index_map: name: ir_87_index_map sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_index_map: name: ir_97_index_map sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_index_map: name: ir_105_index_map sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_index_map: name: ir_123_index_map sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_index_map: name: ir_133_index_map sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_time: name: vis_04_time units: s sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_time: name: vis_05_time units: s sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_time: name: vis_06_time units: s sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_time: name: vis_08_time units: s sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_time: name: vis_09_time units: s sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_time: name: nir_13_time units: s sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_time: name: nir_16_time units: s sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_time: name: nir_22_time units: s sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_time: name: ir_38_time units: s sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_time: name: wv_63_time units: s sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_time: name: wv_73_time units: s sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_time: name: ir_87_time units: s sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_time: name: ir_97_time units: s sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_time: name: ir_105_time units: s sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_time: name: ir_123_time units: s sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_time: name: ir_133_time units: s sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_swath_direction: name: vis_04_swath_direction sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_swath_direction: name: vis_05_swath_direction sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_swath_direction: name: vis_06_swath_direction sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_swath_direction: name: vis_08_swath_direction sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_swath_direction: name: vis_09_swath_direction sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_swath_direction: name: nir_13_swath_direction sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_swath_direction: name: nir_16_swath_direction sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_swath_direction: name: nir_22_swath_direction sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_swath_direction: name: ir_38_swath_direction sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_swath_direction: name: wv_63_swath_direction sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_swath_direction: name: wv_73_swath_direction sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_swath_direction: name: ir_87_swath_direction sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_swath_direction: name: ir_97_swath_direction sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_swath_direction: name: ir_105_swath_direction sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_swath_direction: name: ir_123_swath_direction sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_swath_direction: name: ir_133_swath_direction sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_swath_number: name: vis_04_swath_number sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_swath_number: name: vis_05_swath_number sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_swath_number: name: vis_06_swath_number sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_06] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_swath_number: name: vis_08_swath_number sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_swath_number: name: vis_09_swath_number sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_swath_number: name: nir_13_swath_number sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_swath_number: name: nir_16_swath_number sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_swath_number: name: nir_22_swath_number sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_swath_number: name: ir_38_swath_number sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_swath_number: name: wv_63_swath_number sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_swath_number: name: wv_73_swath_number sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_swath_number: name: ir_87_swath_number sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_swath_number: name: ir_97_swath_number sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_swath_number: name: ir_105_swath_number sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_swath_number: name: ir_123_swath_number sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_swath_number: name: ir_133_swath_number sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_subsatellite_latitude: name: vis_04_subsatellite_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_subsatellite_latitude: name: vis_05_subsatellite_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_subsatellite_latitude: name: vis_06_subsatellite_latitude units: deg sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_subsatellite_latitude: name: vis_08_subsatellite_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_subsatellite_latitude: name: vis_09_subsatellite_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_subsatellite_latitude: name: nir_13_subsatellite_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_subsatellite_latitude: name: nir_16_subsatellite_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_subsatellite_latitude: name: nir_22_subsatellite_latitude units: deg sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_subsatellite_latitude: name: ir_38_subsatellite_latitude units: deg sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_subsatellite_latitude: name: wv_63_subsatellite_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_subsatellite_latitude: name: wv_73_subsatellite_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_subsatellite_latitude: name: ir_87_subsatellite_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_subsatellite_latitude: name: ir_97_subsatellite_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_subsatellite_latitude: name: ir_105_subsatellite_latitude units: deg sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_subsatellite_latitude: name: ir_123_subsatellite_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_subsatellite_latitude: name: ir_133_subsatellite_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_subsatellite_longitude: name: vis_04_subsatellite_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_subsatellite_longitude: name: vis_05_subsatellite_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_subsatellite_longitude: name: vis_06_subsatellite_longitude units: deg sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_subsatellite_longitude: name: vis_08_subsatellite_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_subsatellite_longitude: name: vis_09_subsatellite_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_subsatellite_longitude: name: nir_13_subsatellite_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_subsatellite_longitude: name: nir_16_subsatellite_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_subsatellite_longitude: name: nir_22_subsatellite_longitude units: deg sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_subsatellite_longitude: name: ir_38_subsatellite_longitude units: deg sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_subsatellite_longitude: name: wv_63_subsatellite_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_subsatellite_longitude: name: wv_73_subsatellite_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_subsatellite_longitude: name: ir_87_subsatellite_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_subsatellite_longitude: name: ir_97_subsatellite_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_subsatellite_longitude: name: ir_105_subsatellite_longitude units: deg sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_subsatellite_longitude: name: ir_123_subsatellite_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_subsatellite_longitude: name: ir_133_subsatellite_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_subsolar_latitude: name: vis_04_subsolar_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_subsolar_latitude: name: vis_05_subsolar_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_subsolar_latitude: name: vis_06_subsolar_latitude units: deg sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_subsolar_latitude: name: vis_08_subsolar_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_subsolar_latitude: name: vis_09_subsolar_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_subsolar_latitude: name: nir_13_subsolar_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_subsolar_latitude: name: nir_16_subsolar_latitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_subsolar_latitude: name: nir_22_subsolar_latitude units: deg sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_subsolar_latitude: name: ir_38_subsolar_latitude units: deg sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_subsolar_latitude: name: wv_63_subsolar_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_subsolar_latitude: name: wv_73_subsolar_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_subsolar_latitude: name: ir_87_subsolar_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_subsolar_latitude: name: ir_97_subsolar_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_subsolar_latitude: name: ir_105_subsolar_latitude units: deg sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_subsolar_latitude: name: ir_123_subsolar_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_subsolar_latitude: name: ir_133_subsolar_latitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_subsolar_longitude: name: vis_04_subsolar_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_subsolar_longitude: name: vis_05_subsolar_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_subsolar_longitude: name: vis_06_subsolar_longitude units: deg sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_subsolar_longitude: name: vis_08_subsolar_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_subsolar_longitude: name: vis_09_subsolar_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_subsolar_longitude: name: nir_13_subsolar_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_subsolar_longitude: name: nir_16_subsolar_longitude units: deg sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_subsolar_longitude: name: nir_22_subsolar_longitude units: deg sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_subsolar_longitude: name: ir_38_subsolar_longitude units: deg sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_subsolar_longitude: name: wv_63_subsolar_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_subsolar_longitude: name: wv_73_subsolar_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_subsolar_longitude: name: ir_87_subsolar_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_subsolar_longitude: name: ir_97_subsolar_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_subsolar_longitude: name: ir_105_subsolar_longitude units: deg sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af } ir_123_subsolar_longitude: name: ir_123_subsolar_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_subsolar_longitude: name: ir_133_subsolar_longitude units: deg sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi - + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_platform_altitude: name: vis_04_platform_altitude units: m sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_platform_altitude: name: vis_05_platform_altitude units: m sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_platform_altitude: name: vis_06_platform_altitude units: m sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_platform_altitude: name: vis_08_platform_altitude units: m sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_platform_altitude: name: vis_09_platform_altitude units: m sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_platform_altitude: name: nir_13_platform_altitude units: m sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_platform_altitude: name: nir_16_platform_altitude units: m sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_platform_altitude: name: nir_22_platform_altitude units: m sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_platform_altitude: name: ir_38_platform_altitude units: m sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_platform_altitude: name: wv_63_platform_altitude units: m sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_platform_altitude: name: wv_73_platform_altitude units: m sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_platform_altitude: name: ir_87_platform_altitude units: m sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_platform_altitude: name: ir_97_platform_altitude units: m sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_platform_altitude: name: ir_105_platform_altitude units: m sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af } ir_123_platform_altitude: name: ir_123_platform_altitude units: m sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_platform_altitude: name: ir_133_platform_altitude units: m sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_earth_sun_distance: name: vis_04_earth_sun_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_earth_sun_distance: name: vis_05_earth_sun_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_earth_sun_distance: name: vis_06_earth_sun_distance units: km sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_earth_sun_distance: name: vis_08_earth_sun_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_earth_sun_distance: name: vis_09_earth_sun_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_earth_sun_distance: name: nir_13_earth_sun_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_earth_sun_distance: name: nir_16_earth_sun_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_earth_sun_distance: name: nir_22_earth_sun_distance units: km sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_earth_sun_distance: name: ir_38_earth_sun_distance units: km sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_earth_sun_distance: name: wv_63_earth_sun_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_earth_sun_distance: name: wv_73_earth_sun_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_earth_sun_distance: name: ir_87_earth_sun_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_earth_sun_distance: name: ir_97_earth_sun_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_earth_sun_distance: name: ir_105_earth_sun_distance units: km sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_earth_sun_distance: name: ir_123_earth_sun_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_earth_sun_distance: name: ir_133_earth_sun_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } vis_04_sun_satellite_distance: name: vis_04_sun_satellite_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_04 } vis_05_sun_satellite_distance: name: vis_05_sun_satellite_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_05 } vis_06_sun_satellite_distance: name: vis_06_sun_satellite_distance units: km sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_vis_06, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_06 } vis_08_sun_satellite_distance: name: vis_08_sun_satellite_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_08 } vis_09_sun_satellite_distance: name: vis_09_sun_satellite_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_vis_09 } nir_13_sun_satellite_distance: name: nir_13_sun_satellite_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_13 } nir_16_sun_satellite_distance: name: nir_16_sun_satellite_distance units: km sensor: fci - resolution: 1000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_16 } nir_22_sun_satellite_distance: name: nir_22_sun_satellite_distance units: km sensor: fci resolution: - 500: {file_type: fci_l1c_hrfi} - 1000: {file_type: fci_l1c_fdhsi} + 500: { file_type: fci_l1c_hrfi } + 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 3000: { file_type: fci_l1c_af_nir_22 } ir_38_sun_satellite_distance: name: ir_38_sun_satellite_distance units: km sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af } wv_63_sun_satellite_distance: name: wv_63_sun_satellite_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_63 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_63 } wv_73_sun_satellite_distance: name: wv_73_sun_satellite_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_wv_73 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_wv_73 } ir_87_sun_satellite_distance: name: ir_87_sun_satellite_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_87 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_87 } ir_97_sun_satellite_distance: name: ir_97_sun_satellite_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_97 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_97 } ir_105_sun_satellite_distance: name: ir_105_sun_satellite_distance units: km sensor: fci resolution: - 1000: {file_type: fci_l1c_hrfi} - 2000: {file_type: fci_l1c_fdhsi} + 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_105 } ir_123_sun_satellite_distance: name: ir_123_sun_satellite_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_123 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_123 } ir_133_sun_satellite_distance: name: ir_133_sun_satellite_distance units: km sensor: fci - resolution: 2000 - file_type: fci_l1c_fdhsi + resolution: + 1000: { file_type: fci_l1c_af_ir_133 } + 2000: { file_type: fci_l1c_fdhsi } + 3000: { file_type: fci_l1c_af_ir_133 } diff --git a/satpy/readers/fci_l1c_nc.py b/satpy/readers/fci_l1c_nc.py index 0c7b9fb8cc..6a2d5c05a5 100644 --- a/satpy/readers/fci_l1c_nc.py +++ b/satpy/readers/fci_l1c_nc.py @@ -146,11 +146,15 @@ HIGH_RES_GRID_INFO = {"fci_l1c_hrfi": {"grid_type": "500m", "grid_width": 22272}, "fci_l1c_fdhsi": {"grid_type": "1km", + "grid_width": 11136}, + "fci_l1c_af": {"grid_type": "1km", "grid_width": 11136}} LOW_RES_GRID_INFO = {"fci_l1c_hrfi": {"grid_type": "1km", "grid_width": 11136}, "fci_l1c_fdhsi": {"grid_type": "2km", - "grid_width": 5568}} + "grid_width": 5568}, + "fci_l1c_af":{"grid_type": "3km", + "grid_width":3712}} def _get_aux_data_name_from_dsname(dsname): @@ -218,7 +222,7 @@ def rc_period_min(self): As RSS is not yet implemeted and error will be raised if RSS are to be read """ - if not self.filename_info["coverage"] == "FD": + if self.filename_info["coverage"] not in ["FD","AF"]: raise NotImplementedError(f"coverage for {self.filename_info['coverage']} not supported by this reader") return 2.5 return 10 @@ -263,39 +267,62 @@ def get_channel_measured_group_path(self, channel): return measured_group_path def get_segment_position_info(self): - """Get information about the size and the position of the segment inside the final image array. - - As the final array is composed by stacking segments vertically, the position of a segment - inside the array is defined by the numbers of the start (lowest) and end (highest) row of the segment. - The row numbering is assumed to start with 1. - This info is used in the GEOVariableSegmentYAMLReader to compute optimal segment sizes for missing segments. - - Note: in the FCI terminology, a segment is actually called "chunk". To avoid confusion with the dask concept - of chunk, and to be consistent with SEVIRI, we opt to use the word segment. - """ - vis_06_measured_path = self.get_channel_measured_group_path("vis_06") - ir_105_measured_path = self.get_channel_measured_group_path("ir_105") - - file_type = self.filetype_info["file_type"] - - segment_position_info = { - HIGH_RES_GRID_INFO[file_type]["grid_type"]: { - "start_position_row": self.get_and_cache_npxr(vis_06_measured_path + "/start_position_row").item(), - "end_position_row": self.get_and_cache_npxr(vis_06_measured_path + "/end_position_row").item(), - "segment_height": self.get_and_cache_npxr(vis_06_measured_path + "/end_position_row").item() - - self.get_and_cache_npxr(vis_06_measured_path + "/start_position_row").item() + 1, - "grid_width": HIGH_RES_GRID_INFO[file_type]["grid_width"] - }, - LOW_RES_GRID_INFO[file_type]["grid_type"]: { - "start_position_row": self.get_and_cache_npxr(ir_105_measured_path + "/start_position_row").item(), - "end_position_row": self.get_and_cache_npxr(ir_105_measured_path + "/end_position_row").item(), - "segment_height": self.get_and_cache_npxr(ir_105_measured_path + "/end_position_row").item() - - self.get_and_cache_npxr(ir_105_measured_path + "/start_position_row").item() + 1, - "grid_width": LOW_RES_GRID_INFO[file_type]["grid_width"] - } - } - - return segment_position_info + """Get information about the size and the position of the segment inside the final image array. + + As the final array is composed by stacking segments vertically, the position of a segment + inside the array is defined by the numbers of the start (lowest) and end (highest) row of the segment. + The row numbering is assumed to start with 1. + This info is used in the GEOVariableSegmentYAMLReader to compute optimal segment sizes for missing segments. + + Note: in the FCI terminology, a segment is actually called "chunk". To avoid confusion with the dask concept + of chunk, and to be consistent with SEVIRI, we opt to use the word segment. + """ + file_type = self.filetype_info["file_type"] + if self.filename_info["coverage"] == "AF": + channel_data = [key for key in self.file_content.keys() + if ((key.startswith("data/vis") or + key.startswith("data/ir") or + key.startswith("data/hrv") or + key.startswith("data/nir") or + key.startswith("data/wv")) + and key.endswith("measured"))][0] + segment_position_info = { + HIGH_RES_GRID_INFO[file_type]["grid_type"]: { + "start_position_row": self.get_and_cache_npxr(f"{channel_data}/start_position_row").item(), + "end_position_row": self.get_and_cache_npxr(f"{channel_data}/end_position_row").item(), + "segment_height": self.get_and_cache_npxr(f"{channel_data}/end_position_row").item() - + self.get_and_cache_npxr(f"{channel_data}/start_position_row").item() + 1, + "grid_width": HIGH_RES_GRID_INFO[file_type]["grid_width"] + }, + LOW_RES_GRID_INFO[file_type]["grid_type"]: { + "start_position_row": self.get_and_cache_npxr(f"{channel_data}/start_position_row").item(), + "end_position_row": self.get_and_cache_npxr(f"{channel_data}/end_position_row").item(), + "segment_height": self.get_and_cache_npxr(f"{channel_data}/end_position_row").item() - + self.get_and_cache_npxr(f"{channel_data}/start_position_row").item() + 1, + "grid_width": LOW_RES_GRID_INFO[file_type]["grid_width"] + } + } + else: + vis_06_measured_path = self.get_channel_measured_group_path("vis_06") + ir_105_measured_path = self.get_channel_measured_group_path("ir_105") + segment_position_info = { + HIGH_RES_GRID_INFO[file_type]["grid_type"]: { + "start_position_row": self.get_and_cache_npxr(vis_06_measured_path + "/start_position_row").item(), + "end_position_row": self.get_and_cache_npxr(vis_06_measured_path + "/end_position_row").item(), + "segment_height": self.get_and_cache_npxr(vis_06_measured_path + "/end_position_row").item() - + self.get_and_cache_npxr(vis_06_measured_path + "/start_position_row").item() + 1, + "grid_width": HIGH_RES_GRID_INFO[file_type]["grid_width"] + }, + LOW_RES_GRID_INFO[file_type]["grid_type"]: { + "start_position_row": self.get_and_cache_npxr(ir_105_measured_path + "/start_position_row").item(), + "end_position_row": self.get_and_cache_npxr(ir_105_measured_path + "/end_position_row").item(), + "segment_height": self.get_and_cache_npxr(ir_105_measured_path + "/end_position_row").item() - + self.get_and_cache_npxr(ir_105_measured_path + "/start_position_row").item() + 1, + "grid_width": LOW_RES_GRID_INFO[file_type]["grid_width"] + } + } + + return segment_position_info def get_dataset(self, key, info=None): """Load a dataset.""" @@ -397,9 +424,12 @@ def orbital_param(self): actual_subsat_lon = float(np.nanmean(self._get_aux_data_lut_vector("subsatellite_longitude"))) actual_subsat_lat = float(np.nanmean(self._get_aux_data_lut_vector("subsatellite_latitude"))) actual_sat_alt = float(np.nanmean(self._get_aux_data_lut_vector("platform_altitude"))) - nominal_and_proj_subsat_lon = float( - self.get_and_cache_npxr("data/mtg_geos_projection/attr/longitude_of_projection_origin")) - nominal_and_proj_subsat_lat = 0 + try : + nominal_and_proj_subsat_lon = float( + self.get_and_cache_npxr("data/mtg_geos_projection/attr/longitude_of_projection_origin")) + except ValueError: + nominal_and_proj_subsat_lon = 0.0 + nominal_and_proj_subsat_lat = 0.0 nominal_and_proj_sat_alt = float( self.get_and_cache_npxr("data/mtg_geos_projection/attr/perspective_point_height")) @@ -551,7 +581,10 @@ def get_area_def(self, key): a = float(self.get_and_cache_npxr("data/mtg_geos_projection/attr/semi_major_axis")) h = float(self.get_and_cache_npxr("data/mtg_geos_projection/attr/perspective_point_height")) rf = float(self.get_and_cache_npxr("data/mtg_geos_projection/attr/inverse_flattening")) - lon_0 = float(self.get_and_cache_npxr("data/mtg_geos_projection/attr/longitude_of_projection_origin")) + try: + lon_0 = float(self.get_and_cache_npxr("data/mtg_geos_projection/attr/longitude_of_projection_origin")) + except ValueError: + lon_0 = 0.0 sweep = str(self.get_and_cache_npxr("data/mtg_geos_projection/attr/sweep_angle_axis")) area_extent, nlines, ncols = self.calc_area_extent(key) diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index 792de90462..31ac3b927f 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -57,6 +57,12 @@ "scale_factor": 5.58871526031607e-05, "add_offset": 1.55617776423501e-01, }, + "3km": { + "nrows": 66, + "ncols": 3712, + "scale_factor": 8.38307287956433e-05, + "add_offset": 0.155631748009112, + }, } @@ -366,6 +372,10 @@ class FakeFCIFileHandlerHRFI(FakeFCIFileHandlerBase): } +class FakeFCIFileHandlerAF(FakeFCIFileHandlerBase): + """Mock AF data.""" + chan_patterns = {} + # ---------------------------------------------------- # Fixtures preparation ------------------------------- # ---------------------------------------------------- @@ -394,12 +404,16 @@ def clear_cache(reader): for fh in fhs: fh.cached_file_content = {} +list_channel_solar = ["vis_04", "vis_05", "vis_06", "vis_08", "vis_09", + "nir_13", "nir_16", "nir_22"] +list_channel_terran = ["ir_38", "wv_63", "wv_73", "ir_87", "ir_97", "ir_105", + "ir_123", "ir_133"] +list_total_channel = list_channel_solar + list_channel_terran +list_resolution = ["1km","3km"] -_chans_fdhsi = {"solar": ["vis_04", "vis_05", "vis_06", "vis_08", "vis_09", - "nir_13", "nir_16", "nir_22"], +_chans_fdhsi = {"solar": list_channel_solar, "solar_grid_type": ["1km"] * 8, - "terran": ["ir_38", "wv_63", "wv_73", "ir_87", "ir_97", "ir_105", - "ir_123", "ir_133"], + "terran": list_channel_terran, "terran_grid_type": ["2km"] * 8} _chans_hrfi = {"solar": ["vis_06", "nir_22"], @@ -407,6 +421,9 @@ def clear_cache(reader): "terran": ["ir_38", "ir_105"], "terran_grid_type": ["1km"] * 2} +_chans_af = {} + + _test_filenames = {"fdhsi": [ "W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--" "CHK-BODY--L2P-NC4E_C_EUMT_20170410114434_GTT_DEV_" @@ -419,6 +436,20 @@ def clear_cache(reader): ] } +for channel in list_total_channel: + for resol in list_resolution: + chann_upp = channel.replace("_","").upper() + _test_filenames[f"af_{channel}_{resol}"] = [f"W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD" + f"-{resol.upper()}-AF-{chann_upp}-x-x---NC4E_C_EUMT_20240125144655_DT_OPE" + f"_20240109080007_20240109080924_N_JLS_T_0049_0000.nc"] + if channel.split("_")[0] in ["vis","nir"]: + _chans_af[f"{channel}_{resol}"] = {"solar":[channel], + "solar_grid_type": [resol]} + elif channel.split("_")[0] in ["ir","wv"]: + _chans_af[f"{channel}_{resol}"] = {"terran":[channel], + "terran_grid_type": [resol]} + +#W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD-1KM-AF-VIS06-x-x---NC4E_C_EUMT_20240125144647_DT_OPE_20240109080007_20240109080924_N_JLS_T_0049_0000.nc @contextlib.contextmanager def mocked_basefilehandler(filehandler): @@ -452,6 +483,19 @@ def FakeFCIFileHandlerHRFI_fixture(): } yield param_dict +@pytest.fixture() +def FakeFCIFileHandlerAF_fixture(channel,resolution): + """Get a fixture for the fake AF filehandler, including channel and file names.""" + chan_patterns = {channel.split("_")[0]+"_{:>02d}": {"channels": [int(channel.split("_")[1])], + "grid_type": f"{resolution}"},} + FakeFCIFileHandlerAF.chan_patterns = chan_patterns + with mocked_basefilehandler(FakeFCIFileHandlerAF): + param_dict = { + "filetype": f"fci_l1c_af_{channel}", + "channels": _chans_af[f"{channel}_{resolution}"], + "filenames": _test_filenames[f"af_{channel}_{resolution}"], + } + yield param_dict # ---------------------------------------------------- # Tests ---------------------------------------------- @@ -466,7 +510,7 @@ class TestFCIL1cNCReader: "fdhsi": {"channels": _chans_fdhsi, "filenames": _test_filenames["fdhsi"]}} - @pytest.mark.parametrize("filenames", [_test_filenames["fdhsi"], _test_filenames["hrfi"]]) + @pytest.mark.parametrize("filenames", [_test_filenames[filename] for filename in _test_filenames.keys()]) def test_file_pattern(self, reader_configs, filenames): """Test file pattern matching.""" from satpy.readers import load_reader @@ -509,6 +553,34 @@ def test_load_counts(self, reader_configs, fh_param, else: numpy.testing.assert_array_equal(res[ch], 1) + @pytest.mark.parametrize("channel",list_total_channel) + @pytest.mark.parametrize("resolution",list_resolution) + def test_load_counts_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + """Test loading with counts for AF files.""" + expected_res_n = 1 + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + if channel.split("_")[0] in ["vis","nir"]: + type_ter = "solar" + elif channel.split("_")[0] in ["wv","ir"]: + type_ter = "terran" + res = reader.load([make_dataid(name=name, calibration="counts") + for name in fh_param["channels"][type_ter]], pad_data=False) + assert expected_res_n == len(res) + for ch, grid_type in zip(fh_param["channels"][type_ter], + fh_param["channels"][f"{type_ter}_grid_type"]): + assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], + GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) + assert res[ch].dtype == np.uint16 + assert res[ch].attrs["calibration"] == "counts" + assert res[ch].attrs["units"] == "count" + if ch == "ir_38": + numpy.testing.assert_array_equal(res[ch][-1], 1) + numpy.testing.assert_array_equal(res[ch][0], 5000) + else: + numpy.testing.assert_array_equal(res[ch], 1) + + @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 16), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 4)]) def test_load_radiance(self, reader_configs, fh_param, @@ -534,6 +606,35 @@ def test_load_radiance(self, reader_configs, fh_param, else: numpy.testing.assert_array_equal(res[ch], 15) + + @pytest.mark.parametrize("channel",list_total_channel) + @pytest.mark.parametrize("resolution",list_resolution) + def test_load_radiance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + """Test loading with radiance for AF files.""" + expected_res_n = 1 + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + if channel.split("_")[0] in ["vis","nir"]: + type_ter = "solar" + elif channel.split("_")[0] in ["wv","ir"]: + type_ter = "terran" + res = reader.load([make_dataid(name=name, calibration="radiance") + for name in fh_param["channels"][type_ter]], pad_data=False) + assert expected_res_n == len(res) + for ch, grid_type in zip(fh_param["channels"][type_ter], + fh_param["channels"][f"{type_ter}_grid_type"]): + assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], + GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) + assert res[ch].dtype == np.float32 + assert res[ch].attrs["calibration"] == "radiance" + assert res[ch].attrs["units"] == "mW m-2 sr-1 (cm-1)-1" + assert res[ch].attrs["radiance_unit_conversion_coefficient"].values == np.float32(1234.56) + if ch == "ir_38": + numpy.testing.assert_array_equal(res[ch][-1], 15) + numpy.testing.assert_array_equal(res[ch][0], 9700) + else: + numpy.testing.assert_array_equal(res[ch], 15) + @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 8), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 2)]) def test_load_reflectance(self, reader_configs, fh_param, @@ -552,6 +653,29 @@ def test_load_reflectance(self, reader_configs, fh_param, assert res[ch].attrs["units"] == "%" numpy.testing.assert_array_almost_equal(res[ch], 100 * 15 * 1 * np.pi / 50) + @pytest.mark.parametrize("channel",list_channel_solar) + @pytest.mark.parametrize("resolution",list_resolution) + def test_load_reflectance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + """Test loading with reflectance for AF files.""" + expected_res_n = 1 + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + if channel.split("_")[0] in ["vis","nir"]: + type_ter = "solar" + elif channel.split("_")[0] in ["wv","ir"]: + type_ter = "terran" + res = reader.load([make_dataid(name=name, calibration="reflectance") + for name in fh_param["channels"][type_ter]], pad_data=False) + assert expected_res_n == len(res) + for ch, grid_type in zip(fh_param["channels"][type_ter], + fh_param["channels"][f"{type_ter}_grid_type"]): + assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], + GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) + assert res[ch].dtype == np.float32 + assert res[ch].attrs["calibration"] == "reflectance" + assert res[ch].attrs["units"] == "%" + numpy.testing.assert_array_almost_equal(res[ch], 100 * 15 * 1 * np.pi / 50) + @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 8), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 2)]) def test_load_bt(self, reader_configs, caplog, fh_param, @@ -577,6 +701,37 @@ def test_load_bt(self, reader_configs, caplog, fh_param, else: numpy.testing.assert_array_almost_equal(res[ch], np.float32(209.68275)) + + @pytest.mark.parametrize("channel",list_channel_terran) + @pytest.mark.parametrize("resolution",list_resolution) + def test_load_bt_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution,caplog): + """Test loading with brightness_temperature for AF files.""" + expected_res_n = 1 + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + if channel.split("_")[0] in ["vis","nir"]: + type_ter = "solar" + elif channel.split("_")[0] in ["wv","ir"]: + type_ter = "terran" + with caplog.at_level(logging.WARNING): + res = reader.load([make_dataid(name=name, calibration="brightness_temperature") + for name in fh_param["channels"][type_ter]], pad_data=False) + assert caplog.text == "" + assert expected_res_n == len(res) + for ch, grid_type in zip(fh_param["channels"][type_ter], + fh_param["channels"][f"{type_ter}_grid_type"]): + assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], + GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) + assert res[ch].dtype == np.float32 + assert res[ch].attrs["calibration"] == "brightness_temperature" + assert res[ch].attrs["units"] == "K" + + if ch == "ir_38": + numpy.testing.assert_array_almost_equal(res[ch][-1], np.float32(209.68275)) + numpy.testing.assert_array_almost_equal(res[ch][0], np.float32(1888.8513)) + else: + numpy.testing.assert_array_almost_equal(res[ch], np.float32(209.68275)) + @pytest.mark.parametrize("fh_param", [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture")), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"))]) def test_orbital_parameters_attr(self, reader_configs, fh_param): @@ -599,6 +754,33 @@ def test_orbital_parameters_attr(self, reader_configs, fh_param): "projection_altitude": 35786400.0, } + @pytest.mark.parametrize("channel",list_total_channel) + @pytest.mark.parametrize("resolution",list_resolution) + def test_orbital_parameters_attr_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + """Test the orbital parametters for AF data.""" + expected_res_n = 1 + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + if channel.split("_")[0] in ["vis","nir"]: + type_ter = "solar" + elif channel.split("_")[0] in ["wv","ir"]: + type_ter = "terran" + res = reader.load([make_dataid(name=name) + for name in fh_param["channels"][type_ter]], pad_data=False) + assert expected_res_n == len(res) + for ch in fh_param["channels"][type_ter]: + assert res[ch].attrs["orbital_parameters"] == { + "satellite_actual_longitude": np.mean(np.arange(6000)), + "satellite_actual_latitude": np.mean(np.arange(6000)), + "satellite_actual_altitude": np.mean(np.arange(6000)), + "satellite_nominal_longitude": 0.0, + "satellite_nominal_latitude": 0, + "satellite_nominal_altitude": 35786400.0, + "projection_longitude": 0.0, + "projection_latitude": 0, + "projection_altitude": 35786400.0, + } + expected_pos_info_for_filetype = { "fdhsi": {"1km": {"start_position_row": 1, "end_position_row": 200, @@ -645,6 +827,26 @@ def test_load_index_map(self, reader_configs, fh_param, expected_res_n): GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) numpy.testing.assert_array_equal(res[ch + "_index_map"][1, 1], 110) + @pytest.mark.parametrize("channel",list_total_channel) + @pytest.mark.parametrize("resolution",list_resolution) + def test_load_index_map_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + """Test loading with index_map for AF files.""" + expected_res_n = 1 + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + if channel.split("_")[0] in ["vis","nir"]: + type_ter = "solar" + elif channel.split("_")[0] in ["wv","ir"]: + type_ter = "terran" + res = reader.load([f"{name}_index_map" + for name in fh_param["channels"][type_ter]], pad_data=False) + assert expected_res_n == len(res) + for ch, grid_type in zip(fh_param["channels"][type_ter], + fh_param["channels"][f"{type_ter}_grid_type"]): + assert res[f"{ch}_index_map"].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], + GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) + numpy.testing.assert_array_equal(res[f"{ch}_index_map"][1, 1], 110) + @pytest.mark.parametrize("fh_param", [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture")), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"))]) def test_load_aux_data(self, reader_configs, fh_param): @@ -679,6 +881,27 @@ def test_load_quality_only(self, reader_configs, fh_param, expected_res_n): numpy.testing.assert_array_equal(res[ch + "_pixel_quality"][1, 1], 3) assert res[ch + "_pixel_quality"].attrs["name"] == ch + "_pixel_quality" + @pytest.mark.parametrize("channel",list_total_channel) + @pytest.mark.parametrize("resolution",list_resolution) + def test_load_quality_only_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + """Test loading with quality works for AF files.""" + expected_res_n = 1 + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + if channel.split("_")[0] in ["vis","nir"]: + type_ter = "solar" + elif channel.split("_")[0] in ["wv","ir"]: + type_ter = "terran" + res = reader.load([f"{name}_pixel_quality" + for name in fh_param["channels"][type_ter]], pad_data=False) + assert expected_res_n == len(res) + for ch, grid_type in zip(fh_param["channels"][type_ter], + fh_param["channels"][f"{type_ter}_grid_type"]): + assert res[f"{ch}_pixel_quality"].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], + GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) + numpy.testing.assert_array_equal(res[f"{ch}_pixel_quality"][1, 1], 3) + assert res[f"{ch}_pixel_quality"].attrs["name"] == f"{ch}_pixel_quality" + @pytest.mark.parametrize("fh_param", [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture")), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"))]) def test_platform_name(self, reader_configs, fh_param): @@ -691,6 +914,21 @@ def test_platform_name(self, reader_configs, fh_param): res = reader.load(["vis_06"], pad_data=False) assert res["vis_06"].attrs["platform_name"] == "MTG-I1" + @pytest.mark.parametrize("channel",list_total_channel) + @pytest.mark.parametrize("resolution",list_resolution) + def test_platform_name_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + """Test that platform name is exposed for AF file.""" + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + if channel.split("_")[0] in ["vis","nir"]: + type_ter = "solar" + elif channel.split("_")[0] in ["wv","ir"]: + type_ter = "terran" + res = reader.load([f"{name}" + for name in fh_param["channels"][type_ter]], pad_data=False) + for ch in fh_param["channels"][type_ter]: + assert res[ch].attrs["platform_name"] == "MTG-I1" + @pytest.mark.parametrize(("fh_param", "expected_area"), [ (lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), ["mtg_fci_fdss_1km", "mtg_fci_fdss_2km"]), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), ["mtg_fci_fdss_500m", "mtg_fci_fdss_1km"]), @@ -732,6 +970,19 @@ def test_excs(self, reader_configs, fh_param): make_dataid(name="ir_123", calibration="unknown"), {"units": "unknown"}) + @pytest.mark.parametrize("channel",list_total_channel) + @pytest.mark.parametrize("resolution",list_resolution) + def test_excs_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + """Test exceptions for AF files.""" + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + with pytest.raises(ValueError, match="Unknown dataset key, not a channel, quality or auxiliary data: invalid"): + reader.file_handlers[fh_param["filetype"]][0].get_dataset(make_dataid(name="invalid"), {}) + with pytest.raises(ValueError, match="unknown invalid value for "): + reader.file_handlers[fh_param["filetype"]][0].get_dataset( + make_dataid(name=f"{channel}", calibration="unknown"), + {"units": "unknown"}) + def test_load_composite(self): """Test that composites are loadable.""" # when dedicated composites for FCI are implemented in satpy, From d01d4a6aba6997a143be6a530991b096a988e227 Mon Sep 17 00:00:00 2001 From: clement laplace Date: Wed, 10 Apr 2024 12:29:18 +0200 Subject: [PATCH 297/481] fix: Improve the code quality for fci_l1c_nc.py and test_fci_l1c_nc.py --- satpy/readers/fci_l1c_nc.py | 78 +++++++++++--------- satpy/tests/reader_tests/test_fci_l1c_nc.py | 79 +++++++++------------ 2 files changed, 78 insertions(+), 79 deletions(-) diff --git a/satpy/readers/fci_l1c_nc.py b/satpy/readers/fci_l1c_nc.py index 6a2d5c05a5..b377ae0177 100644 --- a/satpy/readers/fci_l1c_nc.py +++ b/satpy/readers/fci_l1c_nc.py @@ -147,7 +147,7 @@ "grid_width": 22272}, "fci_l1c_fdhsi": {"grid_type": "1km", "grid_width": 11136}, - "fci_l1c_af": {"grid_type": "1km", + "fci_l1c_af": {"grid_type": "1km", "grid_width": 11136}} LOW_RES_GRID_INFO = {"fci_l1c_hrfi": {"grid_type": "1km", "grid_width": 11136}, @@ -266,27 +266,41 @@ def get_channel_measured_group_path(self, channel): return measured_group_path - def get_segment_position_info(self): - """Get information about the size and the position of the segment inside the final image array. + def _get_segment_position_info_FD(self): + """get_position_info applied for FD.""" + file_type = self.filetype_info["file_type"] + vis_06_measured_path = self.get_channel_measured_group_path("vis_06") + ir_105_measured_path = self.get_channel_measured_group_path("ir_105") + segment_position_info = { + HIGH_RES_GRID_INFO[file_type]["grid_type"]: { + "start_position_row": self.get_and_cache_npxr(vis_06_measured_path + "/start_position_row").item(), + "end_position_row": self.get_and_cache_npxr(vis_06_measured_path + "/end_position_row").item(), + "segment_height": self.get_and_cache_npxr(vis_06_measured_path + "/end_position_row").item() - + self.get_and_cache_npxr(vis_06_measured_path + "/start_position_row").item() + 1, + "grid_width": HIGH_RES_GRID_INFO[file_type]["grid_width"] + }, + LOW_RES_GRID_INFO[file_type]["grid_type"]: { + "start_position_row": self.get_and_cache_npxr(ir_105_measured_path + "/start_position_row").item(), + "end_position_row": self.get_and_cache_npxr(ir_105_measured_path + "/end_position_row").item(), + "segment_height": self.get_and_cache_npxr(ir_105_measured_path + "/end_position_row").item() - + self.get_and_cache_npxr(ir_105_measured_path + "/start_position_row").item() + 1, + "grid_width": LOW_RES_GRID_INFO[file_type]["grid_width"] + } + } + return segment_position_info - As the final array is composed by stacking segments vertically, the position of a segment - inside the array is defined by the numbers of the start (lowest) and end (highest) row of the segment. - The row numbering is assumed to start with 1. - This info is used in the GEOVariableSegmentYAMLReader to compute optimal segment sizes for missing segments. - Note: in the FCI terminology, a segment is actually called "chunk". To avoid confusion with the dask concept - of chunk, and to be consistent with SEVIRI, we opt to use the word segment. - """ - file_type = self.filetype_info["file_type"] - if self.filename_info["coverage"] == "AF": - channel_data = [key for key in self.file_content.keys() + def _get_segment_position_info_AF(self): + """get_position_info applied for AF.""" + file_type = self.filetype_info["file_type"] + channel_data = [key for key in self.file_content.keys() if ((key.startswith("data/vis") or key.startswith("data/ir") or key.startswith("data/hrv") or key.startswith("data/nir") or key.startswith("data/wv")) and key.endswith("measured"))][0] - segment_position_info = { + segment_position_info = { HIGH_RES_GRID_INFO[file_type]["grid_type"]: { "start_position_row": self.get_and_cache_npxr(f"{channel_data}/start_position_row").item(), "end_position_row": self.get_and_cache_npxr(f"{channel_data}/end_position_row").item(), @@ -302,27 +316,23 @@ def get_segment_position_info(self): "grid_width": LOW_RES_GRID_INFO[file_type]["grid_width"] } } - else: - vis_06_measured_path = self.get_channel_measured_group_path("vis_06") - ir_105_measured_path = self.get_channel_measured_group_path("ir_105") - segment_position_info = { - HIGH_RES_GRID_INFO[file_type]["grid_type"]: { - "start_position_row": self.get_and_cache_npxr(vis_06_measured_path + "/start_position_row").item(), - "end_position_row": self.get_and_cache_npxr(vis_06_measured_path + "/end_position_row").item(), - "segment_height": self.get_and_cache_npxr(vis_06_measured_path + "/end_position_row").item() - - self.get_and_cache_npxr(vis_06_measured_path + "/start_position_row").item() + 1, - "grid_width": HIGH_RES_GRID_INFO[file_type]["grid_width"] - }, - LOW_RES_GRID_INFO[file_type]["grid_type"]: { - "start_position_row": self.get_and_cache_npxr(ir_105_measured_path + "/start_position_row").item(), - "end_position_row": self.get_and_cache_npxr(ir_105_measured_path + "/end_position_row").item(), - "segment_height": self.get_and_cache_npxr(ir_105_measured_path + "/end_position_row").item() - - self.get_and_cache_npxr(ir_105_measured_path + "/start_position_row").item() + 1, - "grid_width": LOW_RES_GRID_INFO[file_type]["grid_width"] - } - } + return segment_position_info + + def get_segment_position_info(self): + """Get information about the size and the position of the segment inside the final image array. - return segment_position_info + As the final array is composed by stacking segments vertically, the position of a segment + inside the array is defined by the numbers of the start (lowest) and end (highest) row of the segment. + The row numbering is assumed to start with 1. + This info is used in the GEOVariableSegmentYAMLReader to compute optimal segment sizes for missing segments. + + Note: in the FCI terminology, a segment is actually called "chunk". To avoid confusion with the dask concept + of chunk, and to be consistent with SEVIRI, we opt to use the word segment. + """ + if self.filename_info["coverage"] == "AF": + return self._get_segment_position_info_AF() + else : + return self._get_segment_position_info_FD() def get_dataset(self, key, info=None): """Load a dataset.""" diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index 31ac3b927f..67f2f70787 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -60,7 +60,7 @@ "3km": { "nrows": 66, "ncols": 3712, - "scale_factor": 8.38307287956433e-05, + "scale_factor": 8.38307287956433e-05, "add_offset": 0.155631748009112, }, } @@ -510,6 +510,22 @@ class TestFCIL1cNCReader: "fdhsi": {"channels": _chans_fdhsi, "filenames": _test_filenames["fdhsi"]}} + def _get_type_ter_AF(self,channel): + """Get the type_ter.""" + if channel.split("_")[0] in ["vis","nir"]: + return "solar" + elif channel.split("_")[0] in ["wv","ir"]: + return "terran" + + + def _get_res_AF(self,channel,fh_param,calibration,reader_configs): + """Load the reader for AF data.""" + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + type_ter = self._get_type_ter_AF(channel) + res = reader.load([make_dataid(name=name, calibration=calibration) + for name in fh_param["channels"][type_ter]], pad_data=False) + return res + @pytest.mark.parametrize("filenames", [_test_filenames[filename] for filename in _test_filenames.keys()]) def test_file_pattern(self, reader_configs, filenames): """Test file pattern matching.""" @@ -559,20 +575,16 @@ def test_load_counts_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel """Test loading with counts for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - if channel.split("_")[0] in ["vis","nir"]: - type_ter = "solar" - elif channel.split("_")[0] in ["wv","ir"]: - type_ter = "terran" - res = reader.load([make_dataid(name=name, calibration="counts") - for name in fh_param["channels"][type_ter]], pad_data=False) + type_ter = self._get_type_ter_AF(channel) + calibration = "counts" + res = self._get_res_AF(channel,fh_param,calibration,reader_configs) assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], fh_param["channels"][f"{type_ter}_grid_type"]): assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) assert res[ch].dtype == np.uint16 - assert res[ch].attrs["calibration"] == "counts" + assert res[ch].attrs["calibration"] == calibration assert res[ch].attrs["units"] == "count" if ch == "ir_38": numpy.testing.assert_array_equal(res[ch][-1], 1) @@ -613,20 +625,16 @@ def test_load_radiance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,chann """Test loading with radiance for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - if channel.split("_")[0] in ["vis","nir"]: - type_ter = "solar" - elif channel.split("_")[0] in ["wv","ir"]: - type_ter = "terran" - res = reader.load([make_dataid(name=name, calibration="radiance") - for name in fh_param["channels"][type_ter]], pad_data=False) + type_ter = self._get_type_ter_AF(channel) + calibration = "radiance" + res = self._get_res_AF(channel,fh_param,calibration,reader_configs) assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], fh_param["channels"][f"{type_ter}_grid_type"]): assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) assert res[ch].dtype == np.float32 - assert res[ch].attrs["calibration"] == "radiance" + assert res[ch].attrs["calibration"] == calibration assert res[ch].attrs["units"] == "mW m-2 sr-1 (cm-1)-1" assert res[ch].attrs["radiance_unit_conversion_coefficient"].values == np.float32(1234.56) if ch == "ir_38": @@ -659,20 +667,16 @@ def test_load_reflectance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,ch """Test loading with reflectance for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - if channel.split("_")[0] in ["vis","nir"]: - type_ter = "solar" - elif channel.split("_")[0] in ["wv","ir"]: - type_ter = "terran" - res = reader.load([make_dataid(name=name, calibration="reflectance") - for name in fh_param["channels"][type_ter]], pad_data=False) + type_ter = self._get_type_ter_AF(channel) + calibration = "reflectance" + res = self._get_res_AF(channel,fh_param,calibration,reader_configs) assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], fh_param["channels"][f"{type_ter}_grid_type"]): assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) assert res[ch].dtype == np.float32 - assert res[ch].attrs["calibration"] == "reflectance" + assert res[ch].attrs["calibration"] == calibration assert res[ch].attrs["units"] == "%" numpy.testing.assert_array_almost_equal(res[ch], 100 * 15 * 1 * np.pi / 50) @@ -709,10 +713,7 @@ def test_load_bt_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,res expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - if channel.split("_")[0] in ["vis","nir"]: - type_ter = "solar" - elif channel.split("_")[0] in ["wv","ir"]: - type_ter = "terran" + type_ter = self._get_type_ter_AF(channel) with caplog.at_level(logging.WARNING): res = reader.load([make_dataid(name=name, calibration="brightness_temperature") for name in fh_param["channels"][type_ter]], pad_data=False) @@ -761,10 +762,7 @@ def test_orbital_parameters_attr_af(self,FakeFCIFileHandlerAF_fixture,reader_con expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - if channel.split("_")[0] in ["vis","nir"]: - type_ter = "solar" - elif channel.split("_")[0] in ["wv","ir"]: - type_ter = "terran" + type_ter = self._get_type_ter_AF(channel) res = reader.load([make_dataid(name=name) for name in fh_param["channels"][type_ter]], pad_data=False) assert expected_res_n == len(res) @@ -834,10 +832,7 @@ def test_load_index_map_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,chan expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - if channel.split("_")[0] in ["vis","nir"]: - type_ter = "solar" - elif channel.split("_")[0] in ["wv","ir"]: - type_ter = "terran" + type_ter = self._get_type_ter_AF(channel) res = reader.load([f"{name}_index_map" for name in fh_param["channels"][type_ter]], pad_data=False) assert expected_res_n == len(res) @@ -888,10 +883,7 @@ def test_load_quality_only_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,c expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - if channel.split("_")[0] in ["vis","nir"]: - type_ter = "solar" - elif channel.split("_")[0] in ["wv","ir"]: - type_ter = "terran" + type_ter = self._get_type_ter_AF(channel) res = reader.load([f"{name}_pixel_quality" for name in fh_param["channels"][type_ter]], pad_data=False) assert expected_res_n == len(res) @@ -920,10 +912,7 @@ def test_platform_name_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,chann """Test that platform name is exposed for AF file.""" fh_param = FakeFCIFileHandlerAF_fixture reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - if channel.split("_")[0] in ["vis","nir"]: - type_ter = "solar" - elif channel.split("_")[0] in ["wv","ir"]: - type_ter = "terran" + type_ter = self._get_type_ter_AF(channel) res = reader.load([f"{name}" for name in fh_param["channels"][type_ter]], pad_data=False) for ch in fh_param["channels"][type_ter]: From f51d58e5f11d4b7fbdfa28fd85a2947e728019e4 Mon Sep 17 00:00:00 2001 From: clement laplace Date: Wed, 10 Apr 2024 14:18:55 +0200 Subject: [PATCH 298/481] fix: Erase the resolution arguments into the test_fci_l1c_nc.py files --- satpy/tests/reader_tests/test_fci_l1c_nc.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index 67f2f70787..e8ac46f5d6 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -571,7 +571,7 @@ def test_load_counts(self, reader_configs, fh_param, @pytest.mark.parametrize("channel",list_total_channel) @pytest.mark.parametrize("resolution",list_resolution) - def test_load_counts_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + def test_load_counts_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with counts for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture @@ -621,7 +621,7 @@ def test_load_radiance(self, reader_configs, fh_param, @pytest.mark.parametrize("channel",list_total_channel) @pytest.mark.parametrize("resolution",list_resolution) - def test_load_radiance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + def test_load_radiance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with radiance for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture @@ -663,7 +663,7 @@ def test_load_reflectance(self, reader_configs, fh_param, @pytest.mark.parametrize("channel",list_channel_solar) @pytest.mark.parametrize("resolution",list_resolution) - def test_load_reflectance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + def test_load_reflectance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with reflectance for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture @@ -708,15 +708,14 @@ def test_load_bt(self, reader_configs, caplog, fh_param, @pytest.mark.parametrize("channel",list_channel_terran) @pytest.mark.parametrize("resolution",list_resolution) - def test_load_bt_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution,caplog): + def test_load_bt_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,caplog): """Test loading with brightness_temperature for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) type_ter = self._get_type_ter_AF(channel) + calibration = "brightness_temperature" with caplog.at_level(logging.WARNING): - res = reader.load([make_dataid(name=name, calibration="brightness_temperature") - for name in fh_param["channels"][type_ter]], pad_data=False) + res = self._get_res_AF(channel,fh_param,calibration,reader_configs) assert caplog.text == "" assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], @@ -757,7 +756,7 @@ def test_orbital_parameters_attr(self, reader_configs, fh_param): @pytest.mark.parametrize("channel",list_total_channel) @pytest.mark.parametrize("resolution",list_resolution) - def test_orbital_parameters_attr_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + def test_orbital_parameters_attr_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test the orbital parametters for AF data.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture @@ -827,7 +826,7 @@ def test_load_index_map(self, reader_configs, fh_param, expected_res_n): @pytest.mark.parametrize("channel",list_total_channel) @pytest.mark.parametrize("resolution",list_resolution) - def test_load_index_map_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + def test_load_index_map_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with index_map for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture @@ -878,7 +877,7 @@ def test_load_quality_only(self, reader_configs, fh_param, expected_res_n): @pytest.mark.parametrize("channel",list_total_channel) @pytest.mark.parametrize("resolution",list_resolution) - def test_load_quality_only_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + def test_load_quality_only_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with quality works for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture @@ -961,7 +960,7 @@ def test_excs(self, reader_configs, fh_param): @pytest.mark.parametrize("channel",list_total_channel) @pytest.mark.parametrize("resolution",list_resolution) - def test_excs_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + def test_excs_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test exceptions for AF files.""" fh_param = FakeFCIFileHandlerAF_fixture reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) From 5c4305a0d854389c29eb26e531385a2104a8568e Mon Sep 17 00:00:00 2001 From: andream Date: Fri, 12 Apr 2024 15:54:23 +0200 Subject: [PATCH 299/481] add true color with night layer --- satpy/etc/composites/fci.yaml | 39 +++++++++++++++++++++++++-------- satpy/etc/enhancements/fci.yaml | 19 ++++++++++++++++ 2 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 satpy/etc/enhancements/fci.yaml diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index 5fa8997731..6f0fcb0c9d 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -2,6 +2,16 @@ sensor_name: visir/fci composites: + binary_cloud_mask: + # This will set all clear pixels to '0', all pixels with cloudy features (meteorological/dust/ash clouds) to '1' and + # missing/undefined pixels to 'nan'. This can be used for the official EUMETSAT cloud mask product (CLM). + compositor: !!python/name:satpy.composites.CategoricalDataCompositor + prerequisites: + - name: 'cloud_state' + lut: [ .nan, 0, 1, 1, 1, 1, 1, 1, 0, .nan ] + standard_name: binary_cloud_mask + +# Green corrections ndvi_hybrid_green: description: > The FCI green band at 0.51 µm deliberately misses the chlorophyll band, such that @@ -47,6 +57,7 @@ composites: modifiers: [ sunz_corrected ] standard_name: toa_bidirectional_reflectance +# True Color true_color: compositor: !!python/name:satpy.composites.SelfSharpenedRGB description: > @@ -85,6 +96,17 @@ composites: - name: vis_04 standard_name: true_color_raw + true_color_with_night_ir105: + description: > + True Color during daytime, and a simple IR105 layer during nighttime. + compositor: !!python/name:satpy.composites.DayNightCompositor + standard_name: fci_day_night_blend + lim_low: 73 + lim_high: 82 + prerequisites: + - true_color + - night_ir105 + true_color_reproduction: # JMA True Color Reproduction complete composite with corrected and uncorrected blend. # http://www.jma.go.jp/jma/jma-eng/satellite/introduction/TCR.html @@ -116,7 +138,14 @@ composites: - name: vis_04 standard_name: true_color_reproduction_color_stretch - # GeoColor +# Night Layers + night_ir105: + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - name: ir_105 + standard_name: night_ir105 + +# GeoColor geo_color: compositor: !!python/name:satpy.composites.DayNightCompositor description: > @@ -227,11 +256,3 @@ composites: modifiers: [sunz_corrected, rayleigh_corrected, sunz_reduced] standard_name: cloud_phase - binary_cloud_mask: - # This will set all clear pixels to '0', all pixels with cloudy features (meteorological/dust/ash clouds) to '1' and - # missing/undefined pixels to 'nan'. This can be used for the official EUMETSAT cloud mask product (CLM). - compositor: !!python/name:satpy.composites.CategoricalDataCompositor - prerequisites: - - name: 'cloud_state' - lut: [ .nan, 0, 1, 1, 1, 1, 1, 1, 0, .nan ] - standard_name: binary_cloud_mask diff --git a/satpy/etc/enhancements/fci.yaml b/satpy/etc/enhancements/fci.yaml new file mode 100644 index 0000000000..d03eb89940 --- /dev/null +++ b/satpy/etc/enhancements/fci.yaml @@ -0,0 +1,19 @@ +enhancements: + fci_day_night_blend: + standard_name: fci_day_night_blend + operations: + - name: stretch + method: !!python/name:satpy.enhancements.stretch + kwargs: + stretch: crude + min_stretch: [ 0,0,0 ] + max_stretch: [ 1,1,1 ] + + night_ir105: + standard_name: night_ir105 + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - { colors: greys, min_value: 190, max_value: 295 } \ No newline at end of file From 741ea5cb0198f9e92c2e8436ebbcdba0883555b8 Mon Sep 17 00:00:00 2001 From: andream Date: Fri, 12 Apr 2024 16:46:59 +0200 Subject: [PATCH 300/481] add night_ir --- satpy/etc/composites/fci.yaml | 58 +++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index 6f0fcb0c9d..68279a6b8c 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -2,6 +2,7 @@ sensor_name: visir/fci composites: +### L2 binary_cloud_mask: # This will set all clear pixels to '0', all pixels with cloudy features (meteorological/dust/ash clouds) to '1' and # missing/undefined pixels to 'nan'. This can be used for the official EUMETSAT cloud mask product (CLM). @@ -11,7 +12,7 @@ composites: lut: [ .nan, 0, 1, 1, 1, 1, 1, 1, 0, .nan ] standard_name: binary_cloud_mask -# Green corrections +### Green Corrections ndvi_hybrid_green: description: > The FCI green band at 0.51 µm deliberately misses the chlorophyll band, such that @@ -57,7 +58,7 @@ composites: modifiers: [ sunz_corrected ] standard_name: toa_bidirectional_reflectance -# True Color +### True Color true_color: compositor: !!python/name:satpy.composites.SelfSharpenedRGB description: > @@ -107,6 +108,28 @@ composites: - true_color - night_ir105 + true_color_with_night_ir: + description: > + True Color during daytime, and a simple IR105 layer during nighttime. + compositor: !!python/name:satpy.composites.DayNightCompositor + standard_name: fci_day_night_blend + lim_low: 73 + lim_high: 82 + prerequisites: + - true_color + - night_ir_with_background + - + true_color_with_night_ir_hires: + description: > + True Color during daytime, and a simple IR105 layer during nighttime. + compositor: !!python/name:satpy.composites.DayNightCompositor + standard_name: fci_day_night_blend + lim_low: 73 + lim_high: 82 + prerequisites: + - true_color + - night_ir_with_background + true_color_reproduction: # JMA True Color Reproduction complete composite with corrected and uncorrected blend. # http://www.jma.go.jp/jma/jma-eng/satellite/introduction/TCR.html @@ -138,14 +161,37 @@ composites: - name: vis_04 standard_name: true_color_reproduction_color_stretch -# Night Layers +### Night Layers night_ir105: compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: - name: ir_105 standard_name: night_ir105 -# GeoColor + night_ir_alpha: + compositor: !!python/name:satpy.composites.GenericCompositor + standard_name: night_ir_alpha + prerequisites: + - name: ir_38 + - name: ir_105 + - name: ir_123 + - name: ir_105 + + night_ir_with_background: + compositor: !!python/name:satpy.composites.BackgroundCompositor + standard_name: night_ir_with_background + prerequisites: + - night_ir_alpha + - _night_background + + night_ir_with_background_hires: + compositor: !!python/name:satpy.composites.BackgroundCompositor + standard_name: night_ir_with_background + prerequisites: + - night_ir_alpha + - _night_background_hires + +### GeoColor geo_color: compositor: !!python/name:satpy.composites.DayNightCompositor description: > @@ -162,7 +208,6 @@ composites: - true_color - geo_color_night - # GeoColor Night-time geo_color_high_clouds: standard_name: geo_color_high_clouds compositor: !!python/name:satpy.composites.HighCloudCompositor @@ -201,6 +246,7 @@ composites: - geo_color_high_clouds - geo_color_background_with_low_clouds +### IR-Sandwich ir_sandwich: compositor: !!python/name:satpy.composites.SandwichCompositor standard_name: ir_sandwich @@ -224,6 +270,7 @@ composites: - ir_sandwich - colorized_ir_clouds +### other RGBs cloud_type: description: > Equal to cimss_cloud_type, but with additional sunz_reducer modifier to avoid saturation at the terminator. @@ -255,4 +302,3 @@ composites: - name: vis_06 modifiers: [sunz_corrected, rayleigh_corrected, sunz_reduced] standard_name: cloud_phase - From 0efd6a42c99462832a389020df93b884a2884d4c Mon Sep 17 00:00:00 2001 From: andream Date: Fri, 12 Apr 2024 17:34:22 +0200 Subject: [PATCH 301/481] fix extra line --- satpy/etc/composites/fci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index 68279a6b8c..574af1cfaf 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -118,7 +118,7 @@ composites: prerequisites: - true_color - night_ir_with_background - - + true_color_with_night_ir_hires: description: > True Color during daytime, and a simple IR105 layer during nighttime. From a0138b1633e20bf8273812603d8d6c90ac4e8d60 Mon Sep 17 00:00:00 2001 From: andream Date: Fri, 12 Apr 2024 19:14:53 +0200 Subject: [PATCH 302/481] add fire_temperatures --- satpy/etc/composites/fci.yaml | 133 ++++++++++++++++++++++++-------- satpy/etc/enhancements/fci.yaml | 43 ++++++++++- 2 files changed, 142 insertions(+), 34 deletions(-) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index 574af1cfaf..741548ca7f 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -12,6 +12,36 @@ composites: lut: [ .nan, 0, 1, 1, 1, 1, 1, 1, 0, .nan ] standard_name: binary_cloud_mask +### Night Layers + night_ir105: + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - name: ir_105 + standard_name: night_ir105 + + night_ir_alpha: + compositor: !!python/name:satpy.composites.GenericCompositor + standard_name: night_ir_alpha + prerequisites: + - name: ir_38 + - name: ir_105 + - name: ir_123 + - name: ir_105 + + night_ir_with_background: + compositor: !!python/name:satpy.composites.BackgroundCompositor + standard_name: night_ir_with_background + prerequisites: + - night_ir_alpha + - _night_background + + night_ir_with_background_hires: + compositor: !!python/name:satpy.composites.BackgroundCompositor + standard_name: night_ir_with_background + prerequisites: + - night_ir_alpha + - _night_background_hires + ### Green Corrections ndvi_hybrid_green: description: > @@ -128,7 +158,7 @@ composites: lim_high: 82 prerequisites: - true_color - - night_ir_with_background + - night_ir_with_background_hires true_color_reproduction: # JMA True Color Reproduction complete composite with corrected and uncorrected blend. @@ -161,36 +191,6 @@ composites: - name: vis_04 standard_name: true_color_reproduction_color_stretch -### Night Layers - night_ir105: - compositor: !!python/name:satpy.composites.SingleBandCompositor - prerequisites: - - name: ir_105 - standard_name: night_ir105 - - night_ir_alpha: - compositor: !!python/name:satpy.composites.GenericCompositor - standard_name: night_ir_alpha - prerequisites: - - name: ir_38 - - name: ir_105 - - name: ir_123 - - name: ir_105 - - night_ir_with_background: - compositor: !!python/name:satpy.composites.BackgroundCompositor - standard_name: night_ir_with_background - prerequisites: - - night_ir_alpha - - _night_background - - night_ir_with_background_hires: - compositor: !!python/name:satpy.composites.BackgroundCompositor - standard_name: night_ir_with_background - prerequisites: - - night_ir_alpha - - _night_background_hires - ### GeoColor geo_color: compositor: !!python/name:satpy.composites.DayNightCompositor @@ -273,7 +273,7 @@ composites: ### other RGBs cloud_type: description: > - Equal to cimss_cloud_type, but with additional sunz_reducer modifier to avoid saturation at the terminator. + Equal to cimss_cloud_type recipe, but with additional sunz_reducer modifier to avoid saturation at the terminator. references: EUMETRAIN Quick Guide: https://resources.eumetrain.org/rgb_quick_guides/quick_guides/CloudTypeRGB.pdf Recipe: https://resources.eumetrain.org/RGBguide/recipes/RGB_recipes.pdf @@ -287,9 +287,18 @@ composites: modifiers: [ sunz_corrected, sunz_reduced ] standard_name: cimss_cloud_type + cloud_type_with_night_ir1ß5: + compositor: !!python/name:satpy.composites.DayNightCompositor + standard_name: fci_day_night_blend + lim_low: 73 + lim_high: 82 + prerequisites: + - cloud_type + - night_ir105 + cloud_phase: description: > - Equal to cloud_phase, but with additional sunz_reducer modifier to avoid saturation at the terminator. + Equal to cloud_phase recipe, but with additional sunz_reducer modifier to avoid saturation at the terminator. references: EUMETRAIN Quick Guide: https://resources.eumetrain.org/rgb_quick_guides/quick_guides/CloudPhaseRGB.pdf Recipe: https://resources.eumetrain.org/RGBguide/recipes/RGB_recipes.pdf @@ -302,3 +311,61 @@ composites: - name: vis_06 modifiers: [sunz_corrected, rayleigh_corrected, sunz_reduced] standard_name: cloud_phase + + cloud_phase_with_night_ir105: + compositor: !!python/name:satpy.composites.DayNightCompositor + standard_name: fci_day_night_blend + lim_low: 73 + lim_high: 82 + prerequisites: + - cloud_phase + - night_ir105 + + fire_temperature: + standard_name: fire_temperature_fci + compositor: !!python/name:satpy.composites.GenericCompositor + description: > + The fire temperature RGB highlights intense fires and differentiate these + from low temperature fires. Small low temperature fires will only show up at 3.9 μm and + appear red. With the increasing intensity and temperature the fires will also be detected + by the 2.2 μm and 1.6 μm bands resulting very intense fires in white. + Note: the EUM, CIRA and AWIPS recipes are identical (apart from neglectable 0.15K difference due to + unprecise C->K conversion) + references: + Recipe: https://resources.eumetrain.org/RGBguide/recipes/RGB_recipes.pdf + Cira Quick Guide: https://rammb.cira.colostate.edu/training/visit/quick_guides/Fire_Temperature_RGB.pdf + Eumetrain Quick Guide: https://resources.eumetrain.org/rgb_quick_guides/quick_guides/FireTemperatureRGB.pdf + prerequisites: + - name: ir_38 + - name: nir_22 + - name: nir_16 + + fire_temperature_38refl: + standard_name: fire_temperature_fci_38refl + compositor: !!python/name:satpy.composites.GenericCompositor + description: > + Same as fire_temperature, but uses only reflective part of 3.8 + references: + discussion: See https://github.com/pytroll/satpy/pull/728 + prerequisites: + - name: ir_38 + modifiers: [nir_reflectance] + - name: nir_22 + modifiers: [sunz_corrected] + - name: nir_16 + modifiers: [sunz_corrected] + + fire_temperature_rad: + standard_name: fire_temperature_fci_rad + compositor: !!python/name:satpy.composites.GenericCompositor + description: > + Same as fire_temperature, but uses the channels in radiance units. This is the original VIIRS recipe. + references: + discussion: See https://github.com/pytroll/satpy/pull/728 + prerequisites: + - name: ir_38 + calibration: radiance + - name: nir_22 + calibration: radiance + - name: nir_16 + calibration: radiance \ No newline at end of file diff --git a/satpy/etc/enhancements/fci.yaml b/satpy/etc/enhancements/fci.yaml index d03eb89940..e36718689a 100644 --- a/satpy/etc/enhancements/fci.yaml +++ b/satpy/etc/enhancements/fci.yaml @@ -16,4 +16,45 @@ enhancements: method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - { colors: greys, min_value: 190, max_value: 295 } \ No newline at end of file + - { colors: greys, min_value: 190, max_value: 295 } + + fire_temperature_fci: + standard_name: fire_temperature_fci + operations: + - name: stretch + method: !!python/name:satpy.enhancements.stretch + kwargs: + stretch: crude + min_stretch: [273.15, 0.0, 0.0] + max_stretch: [333.15, 100.0, 75.0] + - name: gamma + method: !!python/name:satpy.enhancements.gamma + kwargs: + gamma: [0.4, 1, 1] + + fire_temperature_fci_38refl: + standard_name: fire_temperature_fci_38refl + operations: + - name: stretch + method: !!python/name:satpy.enhancements.stretch + kwargs: + stretch: crude + min_stretch: [0, 0.0, 0.0] + max_stretch: [50, 100.0, 75.0] + - name: gamma + method: !!python/name:satpy.enhancements.gamma + kwargs: + gamma: [1, 1, 1] + + fire_temperature_fci_rad: + standard_name: fire_temperature_fci_rad + operations: + - name: stretch + method: !!python/name:satpy.enhancements.stretch + kwargs: + stretch: crude + min_stretch: [0, 0, 0] + max_stretch: [3.5, 35., 85.] + - name: gamma + method: !!python/name:satpy.enhancements.gamma + kwargs: {gamma: [1.0, 1.0, 1.0]} \ No newline at end of file From 37709bac88b4d2f8a95b231db955dd90cb1145e6 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 13 Apr 2024 22:46:41 +0800 Subject: [PATCH 303/481] Update msi_safe.yaml --- satpy/etc/readers/msi_safe.yaml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index d93d269782..670ef99dd4 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -26,7 +26,7 @@ datasets: B01: name: B01 - sensor: MSI + sensor: msi wavelength: [0.415, 0.443, 0.470] resolution: 60 calibration: @@ -40,7 +40,7 @@ datasets: B02: name: B02 - sensor: MSI + sensor: msi wavelength: [0.440, 0.490, 0.540] resolution: 10 calibration: @@ -54,7 +54,7 @@ datasets: B03: name: B03 - sensor: MSI + sensor: msi wavelength: [0.540, 0.560, 0.580] resolution: 10 calibration: @@ -68,7 +68,7 @@ datasets: B04: name: B04 - sensor: MSI + sensor: msi wavelength: [0.645, 0.665, 0.685] resolution: 10 calibration: @@ -82,7 +82,7 @@ datasets: B05: name: B05 - sensor: MSI + sensor: msi wavelength: [0.695, 0.705, 0.715] resolution: 20 calibration: @@ -96,7 +96,7 @@ datasets: B06: name: B06 - sensor: MSI + sensor: msi wavelength: [0.731, 0.740, 0.749] resolution: 20 calibration: @@ -110,7 +110,7 @@ datasets: B07: name: B07 - sensor: MSI + sensor: msi wavelength: [0.764, 0.783, 0.802] resolution: 20 calibration: @@ -124,7 +124,7 @@ datasets: B08: name: B08 - sensor: MSI + sensor: msi wavelength: [0.780, 0.842, 0.905] resolution: 10 calibration: @@ -138,7 +138,7 @@ datasets: B8A: name: B8A - sensor: MSI + sensor: msi wavelength: [0.855, 0.865, 0.875] resolution: 20 calibration: @@ -152,7 +152,7 @@ datasets: B09: name: B09 - sensor: MSI + sensor: msi wavelength: [0.935, 0.945, 0.955] resolution: 60 calibration: @@ -166,7 +166,7 @@ datasets: B10: name: B10 - sensor: MSI + sensor: msi wavelength: [1.365, 1.375, 1.385] resolution: 60 calibration: @@ -180,7 +180,7 @@ datasets: B11: name: B11 - sensor: MSI + sensor: msi wavelength: [1.565, 1.610, 1.655] resolution: 20 calibration: @@ -194,7 +194,7 @@ datasets: B12: name: B12 - sensor: MSI + sensor: msi wavelength: [2.100, 2.190, 2.280] resolution: 20 calibration: From 39f732696fc0a9bb37b6e32acbe9383101de14fd Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 15 Apr 2024 11:52:57 +0200 Subject: [PATCH 304/481] convert fire temperature stretch limits to wavelength units --- satpy/etc/enhancements/fci.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/satpy/etc/enhancements/fci.yaml b/satpy/etc/enhancements/fci.yaml index e36718689a..0775c83a76 100644 --- a/satpy/etc/enhancements/fci.yaml +++ b/satpy/etc/enhancements/fci.yaml @@ -49,12 +49,14 @@ enhancements: fire_temperature_fci_rad: standard_name: fire_temperature_fci_rad operations: + # note: the stretch parameters have been converted to wavelength units + # compared to e.g. the VIIRS recipe - name: stretch method: !!python/name:satpy.enhancements.stretch kwargs: stretch: crude min_stretch: [0, 0, 0] - max_stretch: [3.5, 35., 85.] + max_stretch: [5.1, 17.7, 22.0] - name: gamma method: !!python/name:satpy.enhancements.gamma kwargs: {gamma: [1.0, 1.0, 1.0]} \ No newline at end of file From 1342014f21890d25919f60cc40661fe9fcc1f7e3 Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 15 Apr 2024 14:42:23 +0200 Subject: [PATCH 305/481] add 24h_microphysics --- satpy/etc/composites/visir.yaml | 17 +++++++++++++++++ satpy/etc/enhancements/generic.yaml | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/satpy/etc/composites/visir.yaml b/satpy/etc/composites/visir.yaml index d9798057a2..ffe3be4183 100644 --- a/satpy/etc/composites/visir.yaml +++ b/satpy/etc/composites/visir.yaml @@ -462,6 +462,23 @@ composites: - 10.8 standard_name: night_microphysics + 24h_microphysics: + references: + EUMETRAIN Quick Guide: https://eumetrain.org/sites/default/files/2021-05/24MicroRGB.pdf + Recipe: https://resources.eumetrain.org/RGBguide/recipes/RGB_recipes.pdf + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - 12.0 + - 10.8 + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - 10.8 + - 8.7 + - 10.8 + standard_name: 24h_microphysics + ir108_3d: compositor: !!python/name:satpy.composites.GenericCompositor standard_name: ir108_3d diff --git a/satpy/etc/enhancements/generic.yaml b/satpy/etc/enhancements/generic.yaml index b3ec45501c..cea87de760 100644 --- a/satpy/etc/enhancements/generic.yaml +++ b/satpy/etc/enhancements/generic.yaml @@ -929,6 +929,7 @@ enhancements: [252, 254, 254], [253, 254, 254], [253, 254, 254], [ 253, 254, 254], [253, 254, 254], [254, 254, 254], [254, 254, 254], [254, 254, 254], [254, 254, 254], [255, 255, 255]] + night_microphysics_default: standard_name: night_microphysics operations: @@ -938,6 +939,21 @@ enhancements: stretch: crude min_stretch: [-4, 0, 243] max_stretch: [2, 10, 293] + + 24h_microphysics_default: + standard_name: 24h_microphysics + operations: + - name: stretch + method: !!python/name:satpy.enhancements.stretch + kwargs: + stretch: crude + min_stretch: [-4, 0, 248] + max_stretch: [2, 6, 303] + - name: gamma + method: !!python/name:satpy.enhancements.gamma + kwargs: + gamma: [ 1, 1.2, 1 ] + ir_overview_default: standard_name: ir_overview operations: From e716b814619cdc182265ec41b334902dbf7cca5e Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 15 Apr 2024 15:19:44 +0200 Subject: [PATCH 306/481] apply fix to L2 as well and trigger the filter only if processing_time is not None --- satpy/etc/composites/fci.yaml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index 741548ca7f..5dd440b900 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -1,6 +1,5 @@ sensor_name: visir/fci - composites: ### L2 binary_cloud_mask: @@ -329,7 +328,7 @@ composites: from low temperature fires. Small low temperature fires will only show up at 3.9 μm and appear red. With the increasing intensity and temperature the fires will also be detected by the 2.2 μm and 1.6 μm bands resulting very intense fires in white. - Note: the EUM, CIRA and AWIPS recipes are identical (apart from neglectable 0.15K difference due to + Note: the EUM, CIRA and AWIPS recipes are identical (apart from neglectable 0.15K difference due to unprecise C->K conversion) references: Recipe: https://resources.eumetrain.org/RGBguide/recipes/RGB_recipes.pdf @@ -368,4 +367,18 @@ composites: - name: nir_22 calibration: radiance - name: nir_16 - calibration: radiance \ No newline at end of file + calibration: radiance + + snow: + references: + EUMETRAIN Quick Guide: https://resources.eumetrain.org/rgb_quick_guides/quick_guides/SnowRGB.pdf + Recipe: https://resources.eumetrain.org/RGBguide/recipes/RGB_recipes.pdf + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: vis_08 + modifiers: [sunz_corrected] + - name: nir_16 + modifiers: [sunz_corrected] + - name: ir_38 + modifiers: [nir_reflectance] + standard_name: snow From c8d9c18dc7f26ee9c001f32d949ebf31c97a77ab Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 15 Apr 2024 15:52:28 +0200 Subject: [PATCH 307/481] update lim low and high for daynight blend --- satpy/etc/composites/fci.yaml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index 5dd440b900..bc46b4101c 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -131,8 +131,8 @@ composites: True Color during daytime, and a simple IR105 layer during nighttime. compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: fci_day_night_blend - lim_low: 73 - lim_high: 82 + lim_low: 78 + lim_high: 88 prerequisites: - true_color - night_ir105 @@ -142,8 +142,8 @@ composites: True Color during daytime, and a simple IR105 layer during nighttime. compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: fci_day_night_blend - lim_low: 73 - lim_high: 82 + lim_low: 78 + lim_high: 88 prerequisites: - true_color - night_ir_with_background @@ -153,8 +153,8 @@ composites: True Color during daytime, and a simple IR105 layer during nighttime. compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: fci_day_night_blend - lim_low: 73 - lim_high: 82 + lim_low: 78 + lim_high: 88 prerequisites: - true_color - night_ir_with_background_hires @@ -164,8 +164,8 @@ composites: # http://www.jma.go.jp/jma/jma-eng/satellite/introduction/TCR.html compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: true_color_reproduction - lim_low: 73. - lim_high: 85. + lim_low: 73 + lim_high: 85 prerequisites: - true_color_reproduction_corr - true_color_reproduction_uncorr @@ -263,8 +263,8 @@ composites: ir_sandwich_with_night_colorized_ir_clouds: compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: fci_day_night_blend - lim_low: 73 - lim_high: 82 + lim_low: 78 + lim_high: 88 prerequisites: - ir_sandwich - colorized_ir_clouds @@ -289,8 +289,8 @@ composites: cloud_type_with_night_ir1ß5: compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: fci_day_night_blend - lim_low: 73 - lim_high: 82 + lim_low: 78 + lim_high: 88 prerequisites: - cloud_type - night_ir105 @@ -314,8 +314,8 @@ composites: cloud_phase_with_night_ir105: compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: fci_day_night_blend - lim_low: 73 - lim_high: 82 + lim_low: 78 + lim_high: 88 prerequisites: - cloud_phase - night_ir105 From 02ccd2eeaa0ca13a59ffa726ca4c543872c97b29 Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 15 Apr 2024 15:53:00 +0200 Subject: [PATCH 308/481] add final yaml line --- satpy/etc/enhancements/fci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/enhancements/fci.yaml b/satpy/etc/enhancements/fci.yaml index 0775c83a76..05ce0f9e53 100644 --- a/satpy/etc/enhancements/fci.yaml +++ b/satpy/etc/enhancements/fci.yaml @@ -59,4 +59,4 @@ enhancements: max_stretch: [5.1, 17.7, 22.0] - name: gamma method: !!python/name:satpy.enhancements.gamma - kwargs: {gamma: [1.0, 1.0, 1.0]} \ No newline at end of file + kwargs: {gamma: [1.0, 1.0, 1.0]} From ea67c07e3b7b1586755931d7e63059821724fd29 Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 15 Apr 2024 15:57:43 +0200 Subject: [PATCH 309/481] fix typo in cloud_type_with_night_ir105 --- satpy/etc/composites/fci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index bc46b4101c..6850bb8f07 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -286,7 +286,7 @@ composites: modifiers: [ sunz_corrected, sunz_reduced ] standard_name: cimss_cloud_type - cloud_type_with_night_ir1ß5: + cloud_type_with_night_ir105: compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: fci_day_night_blend lim_low: 78 From 20fd4c134b1c137322bb9f19c841a30ed01f01da Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 15 Apr 2024 16:26:26 +0200 Subject: [PATCH 310/481] add descriptions to night cloud RGBs --- satpy/etc/composites/fci.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/satpy/etc/composites/fci.yaml b/satpy/etc/composites/fci.yaml index 6850bb8f07..963a5a198f 100644 --- a/satpy/etc/composites/fci.yaml +++ b/satpy/etc/composites/fci.yaml @@ -287,6 +287,8 @@ composites: standard_name: cimss_cloud_type cloud_type_with_night_ir105: + description: > + Combines the cloud_type during daytime with the simple 10.5µm night_ir105 layer during nighttime compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: fci_day_night_blend lim_low: 78 @@ -312,6 +314,8 @@ composites: standard_name: cloud_phase cloud_phase_with_night_ir105: + description: > + Combines the cloud_phase during daytime with the simple 10.5µm night_ir105 layer during nighttime compositor: !!python/name:satpy.composites.DayNightCompositor standard_name: fci_day_night_blend lim_low: 78 From 3ce9d03d0f2c222a1cd988de93b53605226b69d7 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 17 Apr 2024 18:24:56 +0800 Subject: [PATCH 311/481] Update msi_safe.yaml --- satpy/etc/readers/msi_safe.yaml | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index 670ef99dd4..f65ae4bb01 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -36,6 +36,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B02: @@ -50,6 +53,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B03: @@ -64,6 +70,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B04: @@ -78,6 +87,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B05: @@ -92,6 +104,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B06: @@ -106,6 +121,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B07: @@ -120,6 +138,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B08: @@ -134,6 +155,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B8A: @@ -148,6 +172,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B09: @@ -162,6 +189,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B10: @@ -176,6 +206,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B11: @@ -190,6 +223,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule B12: @@ -204,6 +240,9 @@ datasets: radiance: standard_name: toa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" file_type: safe_granule From 6c7cb5c59053e7f882a293082b6f690c6ae9f507 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 17 Apr 2024 18:35:46 +0800 Subject: [PATCH 312/481] Update msi_safe.yaml --- satpy/etc/readers/msi_safe.yaml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index f65ae4bb01..c83b560539 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -38,7 +38,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B02: @@ -55,7 +55,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B03: @@ -72,7 +72,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B04: @@ -89,7 +89,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B05: @@ -106,7 +106,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B06: @@ -123,7 +123,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B07: @@ -140,7 +140,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B08: @@ -157,7 +157,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B8A: @@ -174,7 +174,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B09: @@ -191,7 +191,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B10: @@ -208,7 +208,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B11: @@ -225,7 +225,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule B12: @@ -242,7 +242,7 @@ datasets: units: W m-2 um-1 sr-1 counts: standard_name: counts - units: "1" + units: "1" file_type: safe_granule From 611e0dfb6a850ddce17eef450941ce5b0bd7fa93 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 17 Apr 2024 19:28:38 +0800 Subject: [PATCH 313/481] Update msi_safe.py --- satpy/readers/msi_safe.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index 1131e40a96..ec17a98872 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -89,6 +89,8 @@ def _read_from_file(self, key): return self._mda.calibrate_to_reflectances(proj, self._channel) if key["calibration"] == "radiance": return self._mda.calibrate_to_radiances(proj, self._channel) + if key["calibration"] == "counts": + return self._mda._sanitize_data(proj) @property def start_time(self): From 05e420c6ebfa868af26e908b62a1ede7a3bd0ab1 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 17 Apr 2024 19:46:29 +0800 Subject: [PATCH 314/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index bcee32ddbb..0ed647d5d1 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -920,6 +920,15 @@ def test_xml_calibration(self): np.testing.assert_allclose(result, [[[np.nan, 0.01 - 10, 0.02 - 10, 0.03 - 10], [0.04 - 10, 0, 655.34 - 10, np.inf]]]) + def test_xml_calibration_to_counts(self): + """Test the calibration to counts.""" + fake_data = xr.DataArray([[[0, 1, 2, 3], + [4, 1000, 65534, 65535]]], + dims=["band", "x", "y"]) + result = self.xml_fh._sanitize_data(fake_data) + np.testing.assert_allclose(result, [[[np.nan, 1, 2, 3], + [4, 1000, 65534, np.inf]]]) + def test_xml_calibration_unmasked_saturated(self): """Test the calibration with radiometric offset but unmasked saturated pixels.""" from satpy.readers.msi_safe import SAFEMSIMDXML From c6ec6b66d1b5534d2f6c29cbe8d1a68fc1773c03 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 17 Apr 2024 20:00:41 +0800 Subject: [PATCH 315/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 0ed647d5d1..c0d6314676 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -988,7 +988,8 @@ def setup_method(self): @pytest.mark.parametrize(("mask_saturated", "calibration", "expected"), [(True, "reflectance", [[np.nan, 0.01 - 10], [645.34, np.inf]]), (False, "reflectance", [[np.nan, 0.01 - 10], [645.34, 645.35]]), - (True, "radiance", [[np.nan, -251.58426503], [16251.99095011, np.inf]])]) + (True, "radiance", [[np.nan, -251.58426503], [16251.99095011, np.inf]]), + (False, "counts", [[np.nan, 1], [65534, np.inf]])]) def test_calibration_and_masking(self, mask_saturated, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML From 4faccbb22619472f43f82baf3b54bc20c127ddd7 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 17 Apr 2024 20:13:23 +0800 Subject: [PATCH 316/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index c0d6314676..0255aac085 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -989,7 +989,7 @@ def setup_method(self): [(True, "reflectance", [[np.nan, 0.01 - 10], [645.34, np.inf]]), (False, "reflectance", [[np.nan, 0.01 - 10], [645.34, 645.35]]), (True, "radiance", [[np.nan, -251.58426503], [16251.99095011, np.inf]]), - (False, "counts", [[np.nan, 1], [65534, np.inf]])]) + (False, "counts", [[np.nan, 1], [65534, 65535]])]) def test_calibration_and_masking(self, mask_saturated, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML From 59258086db1c0f1bd2f115314820370ce3053932 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 17 Apr 2024 22:06:50 +0800 Subject: [PATCH 317/481] Update test_olci_nc.py --- satpy/tests/reader_tests/test_olci_nc.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/satpy/tests/reader_tests/test_olci_nc.py b/satpy/tests/reader_tests/test_olci_nc.py index 2834578176..0f2e7acbfe 100644 --- a/satpy/tests/reader_tests/test_olci_nc.py +++ b/satpy/tests/reader_tests/test_olci_nc.py @@ -335,10 +335,10 @@ def test_bitflags_with_dataarray_without_flags(self): "CLOUD_MARGIN", "CLOUD_AMBIGUOUS", "LOWRW", "LAND"] mask = reduce(np.logical_or, [bflags[item] for item in items]) - expected = np.array([True, False, True, True, True, True, False, - False, True, True, False, False, False, False, - False, False, False, True, False, True, False, - False, False, True, True, False, False, True, + expected = np.array([True, False, True, True, True, True, False, + False, True, True, False, False, False, False, + False, False, False, True, False, True, False, + False, False, True, True, False, False, True, False]) assert all(mask == expected) @@ -367,9 +367,9 @@ def test_bitflags_with_custom_flag_list(self): "CLOUD_MARGIN", "CLOUD_AMBIGUOUS", "LOWRW", "LAND"] mask = reduce(np.logical_or, [bflags[item] for item in items]) - expected = np.array([True, False, True, True, True, True, False, - False, True, True, False, False, False, False, - False, False, False, True, False, True, False, - False, False, True, True, False, False, True, + expected = np.array([True, False, True, True, True, True, False, + False, True, True, False, False, False, False, + False, False, False, True, False, True, False, + False, False, True, True, False, False, True, False]) assert all(mask == expected) From 71a2acad34eb462d972235e5b1d792ad2d606c5f Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 15:26:08 +0800 Subject: [PATCH 318/481] Update __init__.py --- satpy/composites/__init__.py | 80 ++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 84b588b3fc..3976b5adc5 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1670,7 +1670,28 @@ def __call__(self, *args, **kwargs): class BackgroundCompositor(GenericCompositor): - """A compositor that overlays one composite on top of another.""" + """A compositor that overlays one composite on top of another. + + The output image mode will be determined by both foreground and background. Generally, when the background has + an alpha band, the output image will also have one. + # L/L -> L + # L/LA -> LA + # L/RGB -> RGB + # L/RGBA -> RGBA + # LA/L -> L + # LA/LA -> LA + # LA/RGB -> RGB + # LA/RGBA -> RGBA + # RGB/L -> RGB + # RGB/LA -> RGBA + # RGB/RGB -> RGB + # RGB/RGBA -> RGBA + # RGBA/L -> RGB + # RGBA/LA -> RGBA + # RGBA/RGB -> RGB + # RGBA/RGBA -> RGBA + + """ def __call__(self, projectables, *args, **kwargs): """Call the compositor.""" @@ -1681,15 +1702,12 @@ def __call__(self, projectables, *args, **kwargs): background = enhance2dataset(projectables[1], convert_p=True) before_bg_mode = background.attrs["mode"] - # Adjust bands so that they match - # L/RGB -> RGB/RGB - # LA/RGB -> RGBA/RGBA - # RGB/RGBA -> RGBA/RGBA + # Adjust bands so that they have the same mode foreground = add_bands(foreground, background["bands"]) background = add_bands(background, foreground["bands"]) - # It's important to judge whether the alpha band of background is initially generated, e.g. by CloudCompositor - # The result will be used to decide the output image mode + # It's important whether the alpha band of background is initially generated, e.g. by CloudCompositor + # The result will be used to determine the output image mode initial_bg_alpha = "A" in before_bg_mode attrs = self._combine_metadata_with_mode_and_sensor(foreground, background) @@ -1723,22 +1741,7 @@ def _get_merged_image_data(foreground: xr.DataArray, background: xr.DataArray, initial_bg_alpha: bool, ) -> list[xr.DataArray]: - def _get_alpha(dataset: xr.DataArray): - # If the dataset contains an alpha channel, just use it - # If not, we still need one. So build it and fill it with 1 - if "A" in dataset.attrs["mode"]: - alpha = dataset.sel(bands="A") - else: - first_band = dataset.isel(bands=0) - alpha = xr.full_like(first_band, 1) - alpha["bands"] = "A" - - # There could be Nans in the alpha - # Replace them with 0 to prevent cases like 1 + nan = nan, so they won't affect new_alpha - alpha = xr.where(alpha.isnull(), 0, alpha) - - return alpha - + # For more info about alpha compositing please review https://en.wikipedia.org/wiki/Alpha_compositing alpha_fore = _get_alpha(foreground) alpha_back = _get_alpha(background) new_alpha = alpha_fore + alpha_back * (1 - alpha_fore) @@ -1748,23 +1751,14 @@ def _get_alpha(dataset: xr.DataArray): # Pass the image data (alpha band will be dropped temporally) to the writer output_mode = background.attrs["mode"].replace("A", "") - # For more info about alpha compositing please review https://en.wikipedia.org/wiki/Alpha_compositing - # Whether there's no initial alpha band, or it has been dropped, we're actually asking the writer for decision - # So first, we must fill the transparent areas in the image with np.nan - # The best way is through a modified version of new alpha - new_alpha_nan = xr.where(alpha_fore + alpha_back == 0, np.nan, new_alpha) if "A" not in output_mode \ - else new_alpha - for band in output_mode: fg_band = foreground.sel(bands=band) bg_band = background.sel(bands=band) - - chan = (fg_band * alpha_fore + - bg_band * alpha_back * (1 - alpha_fore)) / new_alpha_nan - + # Do the alpha compositing + chan = (fg_band * alpha_fore + bg_band * alpha_back * (1 - alpha_fore)) / new_alpha + # Fill the NaN area with background chan = xr.where(chan.isnull(), bg_band * alpha_back, chan) chan["bands"] = band - data.append(chan) # If background has an initial alpha band, it will also be passed to the writer @@ -1786,6 +1780,22 @@ def _simple_overlay(foreground: xr.DataArray, return data +def _get_alpha(dataset: xr.DataArray): + # If the dataset contains an alpha channel, just use it + if "A" in dataset.attrs["mode"]: + alpha = dataset.sel(bands="A") + # There could be NaNs in the alpha + # Replace them with 0 to prevent cases like 1 + nan = nan, so they won't affect new_alpha + alpha = xr.where(alpha.isnull(), 0, alpha) + # If not, we still need one. So build it and fill it with 1 + else: + first_band = dataset.isel(bands=0) + alpha = xr.full_like(first_band, 1) + alpha["bands"] = "A" + + return alpha + + class MaskingCompositor(GenericCompositor): """A compositor that masks e.g. IR 10.8 channel data using cloud products from NWC SAF.""" From 258e32d2fa3ed2bda3afbace8e21b46be1968988 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 15:33:34 +0800 Subject: [PATCH 319/481] Update test_composites.py --- satpy/tests/test_composites.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 49752d7ee3..60528cc048 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1507,6 +1507,11 @@ def setup_class(cls): [[1., 0.5], [0., 1.]], [[1., 0.5], [0., 1.]], [[1., 0.5], [0., 1.]]])), + ("RGB", "LA", "RGBA", np.array([ + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]], + [[1., 1.], [1., 1.]]])), ("RGB", "RGBA", "RGBA", np.array([ [[1., 0.5], [0., 1.]], [[1., 0.5], [0., 1.]], From cd6fecfe1a1e6753e28b7978889ff39c80003194 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 16:11:39 +0800 Subject: [PATCH 320/481] Update test_composites.py --- satpy/tests/test_composites.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index 60528cc048..c075755d17 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -1496,6 +1496,10 @@ def setup_class(cls): ("foreground_bands", "background_bands", "exp_bands", "exp_result"), [ ("L", "L", "L", np.array([[1., 0.5], [0., 1.]])), + ("L", "RGB", "RGB", np.array([ + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]], + [[1., 0.5], [0., 1.]]])), ("LA", "LA", "LA", np.array([ [[1., 0.75], [0.5, 1.]], [[1., 1.], [1., 1.]]])), From 92b435c89e64790524a9fdce6cd27aa7b62df417 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 16:33:25 +0800 Subject: [PATCH 321/481] Update __init__.py --- satpy/composites/__init__.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 3976b5adc5..3440c5631d 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1781,17 +1781,15 @@ def _simple_overlay(foreground: xr.DataArray, def _get_alpha(dataset: xr.DataArray): - # If the dataset contains an alpha channel, just use it - if "A" in dataset.attrs["mode"]: - alpha = dataset.sel(bands="A") - # There could be NaNs in the alpha - # Replace them with 0 to prevent cases like 1 + nan = nan, so they won't affect new_alpha - alpha = xr.where(alpha.isnull(), 0, alpha) - # If not, we still need one. So build it and fill it with 1 - else: - first_band = dataset.isel(bands=0) - alpha = xr.full_like(first_band, 1) - alpha["bands"] = "A" + # 1. This function is only used by _get_merged_image_data + # 2. Both foreground and background have been through add_bands, so they have the same mode + # 3. If none of them has alpha band, they will be passed directly to _simple_overlay not _get_merged_image_data + # So any dataset(whether foreground or background) passed to this function has an alpha band for certain + # We will use it directly + alpha = dataset.sel(bands="A") + # There could be NaNs in the alpha + # Replace them with 0 to prevent cases like 1 + nan = nan, so they won't affect new_alpha + alpha = xr.where(alpha.isnull(), 0, alpha) return alpha From 95f26b5f05dcd06fa37808202421c795481a3a3e Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 16:34:09 +0800 Subject: [PATCH 322/481] 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 3440c5631d..0b4d01c833 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1783,7 +1783,7 @@ def _simple_overlay(foreground: xr.DataArray, def _get_alpha(dataset: xr.DataArray): # 1. This function is only used by _get_merged_image_data # 2. Both foreground and background have been through add_bands, so they have the same mode - # 3. If none of them has alpha band, they will be passed directly to _simple_overlay not _get_merged_image_data + # 3. If none of them has alpha band, they will be passed to _simple_overlay not _get_merged_image_data # So any dataset(whether foreground or background) passed to this function has an alpha band for certain # We will use it directly alpha = dataset.sel(bands="A") From ef3290466e5871aad699136204bec0a319eb2151 Mon Sep 17 00:00:00 2001 From: clement laplace Date: Thu, 18 Apr 2024 10:22:41 +0000 Subject: [PATCH 323/481] fix: Correct the code according to the comment in https://github.com/pytroll/satpy/pull/2778 --- AUTHORS.md | 1 + satpy/etc/readers/fci_l1c_nc.yaml | 329 +++++++------------- satpy/readers/fci_l1c_nc.py | 67 ++-- satpy/tests/reader_tests/test_fci_l1c_nc.py | 315 +++++++++---------- 4 files changed, 284 insertions(+), 428 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index 796ee9743b..7dcfd7d31d 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -88,3 +88,4 @@ The following people have made contributions to this project: - [Xin Zhang (zxdawn)](https://github.com/zxdawn) - [Yufei Zhu (yufeizhu600)](https://github.com/yufeizhu600) - [Youva Aoun (YouvaEUMex)](https://github.com/YouvaEUMex) +- [Clement Laplace (ClementLaplace)](https://github.com/ClementLaplace) diff --git a/satpy/etc/readers/fci_l1c_nc.yaml b/satpy/etc/readers/fci_l1c_nc.yaml index 88630cd017..5f86ad2326 100644 --- a/satpy/etc/readers/fci_l1c_nc.yaml +++ b/satpy/etc/readers/fci_l1c_nc.yaml @@ -6,7 +6,7 @@ reader: Reader for FCI L1c data in NetCDF4 format. Used to read Meteosat Third Generation (MTG) Flexible Combined Imager (FCI) L1c data. - status: Beta for full-disc FDHSI and HRFI, RSS not supported yet + status: Beta for full-disc FDHSI, HRFI, and African dissemination format. RSS not supported yet supports_fsspec: true reader: !!python/name:satpy.readers.yaml_reader.GEOVariableSegmentYAMLReader sensors: [fci] @@ -152,7 +152,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -191,7 +190,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -230,7 +228,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -269,7 +266,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -308,7 +304,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -347,7 +342,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -386,7 +380,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -425,7 +418,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -464,7 +456,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -503,7 +494,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -542,7 +532,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -581,7 +570,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -620,7 +608,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -659,7 +646,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -698,7 +684,6 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: @@ -738,7 +723,7 @@ datasets: sensor: fci wavelength: [0.384, 0.444, 0.504] resolution: - 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_04] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } calibration: counts: @@ -756,7 +741,7 @@ datasets: sensor: fci wavelength: [0.470, 0.510, 0.550] resolution: - 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_05] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } calibration: counts: @@ -793,7 +778,7 @@ datasets: sensor: fci wavelength: [0.815, 0.865, 0.915] resolution: - 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_08] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } calibration: counts: @@ -811,7 +796,7 @@ datasets: sensor: fci wavelength: [0.894, 0.914, 0.934] resolution: - 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_vis_09] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } calibration: counts: @@ -829,7 +814,7 @@ datasets: sensor: fci wavelength: [1.350, 1.380, 1.410] resolution: - 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_nir_13] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } calibration: counts: @@ -847,7 +832,7 @@ datasets: sensor: fci wavelength: [1.560, 1.610, 1.660] resolution: - 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_nir_16] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } calibration: counts: @@ -866,7 +851,7 @@ datasets: wavelength: [2.200, 2.250, 2.300] resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_fdhsi, fci_l1c_af_nir_22] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } calibration: counts: @@ -884,7 +869,7 @@ datasets: sensor: fci wavelength: [3.400, 3.800, 4.200] resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } calibration: @@ -903,7 +888,6 @@ datasets: sensor: fci wavelength: [5.300, 6.300, 7.300] resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } calibration: @@ -922,7 +906,6 @@ datasets: sensor: fci wavelength: [6.850, 7.350, 7.850] resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } calibration: @@ -941,7 +924,6 @@ datasets: sensor: fci wavelength: [8.300, 8.700, 9.100] resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } calibration: @@ -960,7 +942,6 @@ datasets: sensor: fci wavelength: [9.360, 9.660, 9.960] resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } calibration: @@ -979,7 +960,7 @@ datasets: sensor: fci wavelength: [9.800, 10.500, 11.200] resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } calibration: @@ -998,7 +979,6 @@ datasets: sensor: fci wavelength: [11.800, 12.300, 12.800] resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } calibration: @@ -1017,7 +997,6 @@ datasets: sensor: fci wavelength: [12.700, 13.300, 13.900] resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } calibration: @@ -1035,14 +1014,14 @@ datasets: name: vis_04_pixel_quality sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_pixel_quality: name: vis_05_pixel_quality sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_pixel_quality: @@ -1057,28 +1036,28 @@ datasets: name: vis_08_pixel_quality sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_pixel_quality: name: vis_09_pixel_quality sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_pixel_quality: name: nir_13_pixel_quality sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_pixel_quality: name: nir_16_pixel_quality sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_pixel_quality: @@ -1086,14 +1065,14 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_pixel_quality: name: ir_38_pixel_quality sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -1101,7 +1080,6 @@ datasets: name: wv_63_pixel_quality sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -1109,7 +1087,6 @@ datasets: name: wv_73_pixel_quality sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -1117,7 +1094,6 @@ datasets: name: ir_87_pixel_quality sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -1125,7 +1101,6 @@ datasets: name: ir_97_pixel_quality sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -1133,7 +1108,7 @@ datasets: name: ir_105_pixel_quality sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -1141,7 +1116,6 @@ datasets: name: ir_123_pixel_quality sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -1149,7 +1123,6 @@ datasets: name: ir_133_pixel_quality sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -1157,14 +1130,14 @@ datasets: name: vis_04_index_map sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_index_map: name: vis_05_index_map sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_index_map: @@ -1179,28 +1152,28 @@ datasets: name: vis_08_index_map sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_index_map: name: vis_09_index_map sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_index_map: name: nir_13_index_map sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_index_map: name: nir_16_index_map sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_index_map: @@ -1208,14 +1181,14 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_index_map: name: ir_38_index_map sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -1223,7 +1196,6 @@ datasets: name: wv_63_index_map sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -1231,7 +1203,6 @@ datasets: name: wv_73_index_map sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -1239,7 +1210,6 @@ datasets: name: ir_87_index_map sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -1247,7 +1217,6 @@ datasets: name: ir_97_index_map sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -1255,7 +1224,7 @@ datasets: name: ir_105_index_map sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -1263,7 +1232,6 @@ datasets: name: ir_123_index_map sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -1271,7 +1239,6 @@ datasets: name: ir_133_index_map sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -1280,7 +1247,7 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_time: @@ -1288,7 +1255,7 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_time: @@ -1305,7 +1272,7 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_time: @@ -1313,7 +1280,7 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_time: @@ -1321,7 +1288,7 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_time: @@ -1329,7 +1296,7 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_time: @@ -1338,7 +1305,7 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_time: @@ -1346,7 +1313,7 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -1355,7 +1322,6 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -1364,7 +1330,6 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -1373,7 +1338,6 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -1382,7 +1346,6 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -1391,7 +1354,7 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -1400,7 +1363,6 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -1409,7 +1371,6 @@ datasets: units: s sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -1417,14 +1378,14 @@ datasets: name: vis_04_swath_direction sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_swath_direction: name: vis_05_swath_direction sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_swath_direction: @@ -1439,28 +1400,28 @@ datasets: name: vis_08_swath_direction sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_swath_direction: name: vis_09_swath_direction sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_swath_direction: name: nir_13_swath_direction sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_swath_direction: name: nir_16_swath_direction sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_swath_direction: @@ -1468,14 +1429,14 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_swath_direction: name: ir_38_swath_direction sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -1483,7 +1444,6 @@ datasets: name: wv_63_swath_direction sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -1491,7 +1451,6 @@ datasets: name: wv_73_swath_direction sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -1499,7 +1458,6 @@ datasets: name: ir_87_swath_direction sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -1507,7 +1465,6 @@ datasets: name: ir_97_swath_direction sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -1515,7 +1472,7 @@ datasets: name: ir_105_swath_direction sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -1523,7 +1480,6 @@ datasets: name: ir_123_swath_direction sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -1531,7 +1487,6 @@ datasets: name: ir_133_swath_direction sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -1539,14 +1494,14 @@ datasets: name: vis_04_swath_number sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_swath_number: name: vis_05_swath_number sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_swath_number: @@ -1561,28 +1516,28 @@ datasets: name: vis_08_swath_number sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_swath_number: name: vis_09_swath_number sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_swath_number: name: nir_13_swath_number sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_swath_number: name: nir_16_swath_number sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_swath_number: @@ -1590,14 +1545,14 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_swath_number: name: ir_38_swath_number sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -1605,7 +1560,6 @@ datasets: name: wv_63_swath_number sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -1613,7 +1567,6 @@ datasets: name: wv_73_swath_number sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -1621,7 +1574,6 @@ datasets: name: ir_87_swath_number sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -1629,7 +1581,6 @@ datasets: name: ir_97_swath_number sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -1637,7 +1588,7 @@ datasets: name: ir_105_swath_number sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -1645,7 +1596,6 @@ datasets: name: ir_123_swath_number sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -1653,7 +1603,6 @@ datasets: name: ir_133_swath_number sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -1662,7 +1611,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_subsatellite_latitude: @@ -1670,7 +1619,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_subsatellite_latitude: @@ -1687,7 +1636,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_subsatellite_latitude: @@ -1695,7 +1644,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_subsatellite_latitude: @@ -1703,7 +1652,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_subsatellite_latitude: @@ -1711,7 +1660,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_subsatellite_latitude: @@ -1720,7 +1669,7 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_subsatellite_latitude: @@ -1728,7 +1677,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -1737,7 +1686,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -1746,7 +1694,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -1755,7 +1702,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -1764,7 +1710,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -1773,7 +1718,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -1782,7 +1727,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -1791,7 +1735,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -1800,7 +1743,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_subsatellite_longitude: @@ -1808,7 +1751,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_subsatellite_longitude: @@ -1825,7 +1768,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_subsatellite_longitude: @@ -1833,7 +1776,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_subsatellite_longitude: @@ -1841,7 +1784,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_subsatellite_longitude: @@ -1849,7 +1792,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_subsatellite_longitude: @@ -1858,7 +1801,7 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_subsatellite_longitude: @@ -1866,7 +1809,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -1875,7 +1818,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -1884,7 +1826,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -1893,7 +1834,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -1902,7 +1842,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -1911,7 +1850,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -1920,7 +1859,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -1929,7 +1867,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -1938,7 +1875,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_subsolar_latitude: @@ -1946,7 +1883,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_subsolar_latitude: @@ -1963,7 +1900,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_subsolar_latitude: @@ -1971,7 +1908,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_subsolar_latitude: @@ -1979,7 +1916,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_subsolar_latitude: @@ -1987,7 +1924,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_subsolar_latitude: @@ -1996,7 +1933,7 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_subsolar_latitude: @@ -2004,7 +1941,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -2013,7 +1950,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -2022,7 +1958,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -2031,7 +1966,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -2040,7 +1974,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -2049,7 +1982,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -2058,7 +1991,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -2067,7 +1999,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -2076,7 +2007,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_subsolar_longitude: @@ -2084,7 +2015,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_subsolar_longitude: @@ -2101,7 +2032,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_subsolar_longitude: @@ -2109,7 +2040,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_subsolar_longitude: @@ -2117,7 +2048,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_subsolar_longitude: @@ -2125,7 +2056,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_subsolar_longitude: @@ -2134,7 +2065,7 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_subsolar_longitude: @@ -2142,7 +2073,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -2151,7 +2082,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -2160,7 +2090,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -2169,7 +2098,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -2178,7 +2106,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -2187,7 +2114,7 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af } @@ -2196,7 +2123,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -2205,7 +2131,6 @@ datasets: units: deg sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -2214,7 +2139,7 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_platform_altitude: @@ -2222,7 +2147,7 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_platform_altitude: @@ -2239,7 +2164,7 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_platform_altitude: @@ -2247,7 +2172,7 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_platform_altitude: @@ -2255,7 +2180,7 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_platform_altitude: @@ -2263,7 +2188,7 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_platform_altitude: @@ -2272,7 +2197,7 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_platform_altitude: @@ -2280,7 +2205,7 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -2289,7 +2214,6 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -2298,7 +2222,6 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -2307,7 +2230,6 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -2316,7 +2238,6 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -2325,7 +2246,7 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af } @@ -2334,7 +2255,6 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -2343,7 +2263,6 @@ datasets: units: m sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -2360,7 +2279,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_earth_sun_distance: @@ -2377,7 +2296,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_earth_sun_distance: @@ -2385,7 +2304,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_earth_sun_distance: @@ -2393,7 +2312,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_earth_sun_distance: @@ -2401,7 +2320,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_earth_sun_distance: @@ -2410,7 +2329,7 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_earth_sun_distance: @@ -2418,7 +2337,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_38] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_38 } @@ -2427,7 +2346,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -2436,7 +2354,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -2445,7 +2362,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -2454,7 +2370,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -2463,7 +2378,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -2472,7 +2387,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -2481,7 +2395,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } @@ -2490,7 +2403,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_04, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_04 } vis_05_sun_satellite_distance: @@ -2498,7 +2411,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_05, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_05 } vis_06_sun_satellite_distance: @@ -2515,7 +2428,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_08, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_08 } vis_09_sun_satellite_distance: @@ -2523,7 +2436,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_vis_09, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_vis_09 } nir_13_sun_satellite_distance: @@ -2531,7 +2444,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_13, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_13 } nir_16_sun_satellite_distance: @@ -2539,7 +2452,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_af_nir_16, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_16 } nir_22_sun_satellite_distance: @@ -2548,7 +2461,7 @@ datasets: sensor: fci resolution: 500: { file_type: fci_l1c_hrfi } - 1000: { file_type: [fci_l1c_af_nir_22, fci_l1c_fdhsi] } + 1000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_nir_22 } ir_38_sun_satellite_distance: @@ -2556,16 +2469,15 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } - 3000: { file_type: fci_l1c_af } + 3000: { file_type: fci_l1c_af_ir_38 } wv_63_sun_satellite_distance: name: wv_63_sun_satellite_distance units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_63 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_63 } @@ -2574,7 +2486,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_wv_73 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_wv_73 } @@ -2583,7 +2494,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_87 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_87 } @@ -2592,7 +2502,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_97 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_97 } @@ -2601,7 +2510,7 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: [fci_l1c_hrfi, fci_l1c_af_ir_105] } + 1000: { file_type: fci_l1c_hrfi } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_105 } @@ -2610,7 +2519,6 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_123 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_123 } @@ -2619,6 +2527,5 @@ datasets: units: km sensor: fci resolution: - 1000: { file_type: fci_l1c_af_ir_133 } 2000: { file_type: fci_l1c_fdhsi } 3000: { file_type: fci_l1c_af_ir_133 } diff --git a/satpy/readers/fci_l1c_nc.py b/satpy/readers/fci_l1c_nc.py index b377ae0177..5b7c669d21 100644 --- a/satpy/readers/fci_l1c_nc.py +++ b/satpy/readers/fci_l1c_nc.py @@ -29,7 +29,8 @@ .. note:: This reader currently supports Full Disk High Spectral Resolution Imagery - (FDHSI) and High Spatial Resolution Fast Imagery (HRFI) data in full-disc ("FD") scanning mode. + (FDHSI) ,High Spatial Resolution Fast Imagery (HRFI) data in full-disc ("FD") scanning mode. + The african case ("AF") scanning mode has been added. If the user provides a list of both FDHSI and HRFI files from the same repeat cycle to the Satpy ``Scene``, Satpy will automatically read the channels from the source with the finest resolution, i.e. from the HRFI files for the vis_06, nir_22, ir_38, and ir_105 channels. @@ -154,7 +155,7 @@ "fci_l1c_fdhsi": {"grid_type": "2km", "grid_width": 5568}, "fci_l1c_af":{"grid_type": "3km", - "grid_width":3712}} + "grid_width": 3712}} def _get_aux_data_name_from_dsname(dsname): @@ -266,8 +267,19 @@ def get_channel_measured_group_path(self, channel): return measured_group_path - def _get_segment_position_info_FD(self): - """get_position_info applied for FD.""" + def get_segment_position_info(self): + """Get information about the size and the position of the segment inside the final image array. + + As the final array is composed by stacking segments vertically, the position of a segment + inside the array is defined by the numbers of the start (lowest) and end (highest) row of the segment. + The row numbering is assumed to start with 1. + This info is used in the GEOVariableSegmentYAMLReader to compute optimal segment sizes for missing segments. + + Note: in the FCI terminology, a segment is actually called "chunk". To avoid confusion with the dask concept + of chunk, and to be consistent with SEVIRI, we opt to use the word segment. + + Note: This function is not used for the African data as it contains only one segment. + """ file_type = self.filetype_info["file_type"] vis_06_measured_path = self.get_channel_measured_group_path("vis_06") ir_105_measured_path = self.get_channel_measured_group_path("ir_105") @@ -289,51 +301,6 @@ def _get_segment_position_info_FD(self): } return segment_position_info - - def _get_segment_position_info_AF(self): - """get_position_info applied for AF.""" - file_type = self.filetype_info["file_type"] - channel_data = [key for key in self.file_content.keys() - if ((key.startswith("data/vis") or - key.startswith("data/ir") or - key.startswith("data/hrv") or - key.startswith("data/nir") or - key.startswith("data/wv")) - and key.endswith("measured"))][0] - segment_position_info = { - HIGH_RES_GRID_INFO[file_type]["grid_type"]: { - "start_position_row": self.get_and_cache_npxr(f"{channel_data}/start_position_row").item(), - "end_position_row": self.get_and_cache_npxr(f"{channel_data}/end_position_row").item(), - "segment_height": self.get_and_cache_npxr(f"{channel_data}/end_position_row").item() - - self.get_and_cache_npxr(f"{channel_data}/start_position_row").item() + 1, - "grid_width": HIGH_RES_GRID_INFO[file_type]["grid_width"] - }, - LOW_RES_GRID_INFO[file_type]["grid_type"]: { - "start_position_row": self.get_and_cache_npxr(f"{channel_data}/start_position_row").item(), - "end_position_row": self.get_and_cache_npxr(f"{channel_data}/end_position_row").item(), - "segment_height": self.get_and_cache_npxr(f"{channel_data}/end_position_row").item() - - self.get_and_cache_npxr(f"{channel_data}/start_position_row").item() + 1, - "grid_width": LOW_RES_GRID_INFO[file_type]["grid_width"] - } - } - return segment_position_info - - def get_segment_position_info(self): - """Get information about the size and the position of the segment inside the final image array. - - As the final array is composed by stacking segments vertically, the position of a segment - inside the array is defined by the numbers of the start (lowest) and end (highest) row of the segment. - The row numbering is assumed to start with 1. - This info is used in the GEOVariableSegmentYAMLReader to compute optimal segment sizes for missing segments. - - Note: in the FCI terminology, a segment is actually called "chunk". To avoid confusion with the dask concept - of chunk, and to be consistent with SEVIRI, we opt to use the word segment. - """ - if self.filename_info["coverage"] == "AF": - return self._get_segment_position_info_AF() - else : - return self._get_segment_position_info_FD() - def get_dataset(self, key, info=None): """Load a dataset.""" logger.debug("Reading {} from {}".format(key["name"], self.filename)) @@ -434,6 +401,7 @@ def orbital_param(self): actual_subsat_lon = float(np.nanmean(self._get_aux_data_lut_vector("subsatellite_longitude"))) actual_subsat_lat = float(np.nanmean(self._get_aux_data_lut_vector("subsatellite_latitude"))) actual_sat_alt = float(np.nanmean(self._get_aux_data_lut_vector("platform_altitude"))) + # The "try" is a temporary part of the code as long as the AF data are not modified try : nominal_and_proj_subsat_lon = float( self.get_and_cache_npxr("data/mtg_geos_projection/attr/longitude_of_projection_origin")) @@ -591,6 +559,7 @@ def get_area_def(self, key): a = float(self.get_and_cache_npxr("data/mtg_geos_projection/attr/semi_major_axis")) h = float(self.get_and_cache_npxr("data/mtg_geos_projection/attr/perspective_point_height")) rf = float(self.get_and_cache_npxr("data/mtg_geos_projection/attr/inverse_flattening")) + # The "try" is a temporary part of the code as long as the AF data are not modified try: lon_0 = float(self.get_and_cache_npxr("data/mtg_geos_projection/attr/longitude_of_projection_origin")) except ValueError: diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index e8ac46f5d6..af4d487eb1 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -58,7 +58,7 @@ "add_offset": 1.55617776423501e-01, }, "3km": { - "nrows": 66, + "nrows": 67, "ncols": 3712, "scale_factor": 8.38307287956433e-05, "add_offset": 0.155631748009112, @@ -396,7 +396,6 @@ def _get_reader_with_filehandlers(filenames, reader_configs): clear_cache(reader) return reader - def clear_cache(reader): """Clear the cache for file handlres in reader.""" for key in reader.file_handlers: @@ -409,7 +408,66 @@ def clear_cache(reader): list_channel_terran = ["ir_38", "wv_63", "wv_73", "ir_87", "ir_97", "ir_105", "ir_123", "ir_133"] list_total_channel = list_channel_solar + list_channel_terran -list_resolution = ["1km","3km"] +list_resolution_v06 = ["1km","3km"] +list_resolution = ["3km"] +expected_pos_info_for_filetype = { + "fdhsi": {"1km": {"start_position_row": 1, + "end_position_row": 200, + "segment_height": 200, + "grid_width": 11136}, + "2km": {"start_position_row": 1, + "end_position_row": 100, + "segment_height": 100, + "grid_width": 5568}}, + "hrfi": {"500m": {"start_position_row": 1, + "end_position_row": 400, + "segment_height": 400, + "grid_width": 22272}, + "1km": {"start_position_row": 1, + "end_position_row": 200, + "grid_width": 11136, + "segment_height": 200}}, + "fci_af" : {"3km": {"start_position_row": 1, + "end_position_row": 67, + "segment_height": 67, + "grid_width": 3712 + }, + }, + "fci_af_vis_06" : {"3km": {"start_position_row": 1, + "end_position_row": 67, + "segment_height": 67, + "grid_width": 3712 + }, + "1km": {"start_position_row": 1, + "end_position_row": 200, + "grid_width": 11136, + "segment_height": 200} + } + } + + +def resolutions(channel): + """Get the resolutions.""" + if channel == "vis_06": + return list_resolution_v06 + else: + return list_resolution + +def generate_parameters_segment(list_channel): + """Generate dinamicaly the parameters.""" + for channel in list_channel: + if channel == "vis_06": + expected_pos_info = expected_pos_info_for_filetype["fci_af_vis_06"] + else : + expected_pos_info = expected_pos_info_for_filetype["fci_af"] + for resolution in resolutions(channel): + yield (channel, resolution, expected_pos_info) + +def generate_parameters(list_channel): + """Generate dinamicaly the parameters.""" + for channel in list_channel: + for resolution in resolutions(channel): + yield (channel, resolution) _chans_fdhsi = {"solar": list_channel_solar, "solar_grid_type": ["1km"] * 8, @@ -421,8 +479,30 @@ def clear_cache(reader): "terran": ["ir_38", "ir_105"], "terran_grid_type": ["1km"] * 2} -_chans_af = {} - +_dict_arg_radiance = {"dtype": np.float32, + "value_1": 15, + "value_0":9700, + "attrs_dict":{"calibration":"radiance", + "units":"mW m-2 sr-1 (cm-1)-1", + "radiance_unit_conversion_coefficient": np.float32(1234.56) + } + } + +_dict_arg_counts = {"dtype": np.uint16, + "value_1": 1, + "value_0": 5000, + "attrs_dict":{"calibration":"counts", + "units":"count", + } + } + +_dict_arg_bt = {"dtype": np.float32, + "value_1": np.float32(209.68275), + "value_0": np.float32(1888.8513), + "attrs_dict":{"calibration":"brightness_temperature", + "units":"K", + } + } _test_filenames = {"fdhsi": [ "W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--" @@ -436,20 +516,28 @@ def clear_cache(reader): ] } -for channel in list_total_channel: - for resol in list_resolution: - chann_upp = channel.replace("_","").upper() - _test_filenames[f"af_{channel}_{resol}"] = [f"W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD" - f"-{resol.upper()}-AF-{chann_upp}-x-x---NC4E_C_EUMT_20240125144655_DT_OPE" - f"_20240109080007_20240109080924_N_JLS_T_0049_0000.nc"] - if channel.split("_")[0] in ["vis","nir"]: - _chans_af[f"{channel}_{resol}"] = {"solar":[channel], - "solar_grid_type": [resol]} - elif channel.split("_")[0] in ["ir","wv"]: - _chans_af[f"{channel}_{resol}"] = {"terran":[channel], - "terran_grid_type": [resol]} - -#W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD-1KM-AF-VIS06-x-x---NC4E_C_EUMT_20240125144647_DT_OPE_20240109080007_20240109080924_N_JLS_T_0049_0000.nc +def fill_chans_af(): + """Fill the dict _chans_af with the right channel and resolution.""" + _chans_af = {} + for channel in list_total_channel: + if channel == "vis_06": + list_resol = list_resolution_v06 + else : + list_resol = list_resolution + for resol in list_resol: + chann_upp = channel.replace("_","").upper() + _test_filenames[f"af_{channel}_{resol}"] = [f"W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD" + f"-{resol.upper()}-AF-{chann_upp}-x-x---NC4E_C_EUMT_20240125144655_DT_OPE" + f"_20240109080007_20240109080924_N_JLS_T_0049_0000.nc"] + if channel.split("_")[0] in ["vis","nir"]: + _chans_af[f"{channel}_{resol}"] = {"solar":[channel], + "solar_grid_type": [resol]} + elif channel.split("_")[0] in ["ir","wv"]: + _chans_af[f"{channel}_{resol}"] = {"terran":[channel], + "terran_grid_type": [resol]} + return _chans_af + +_chans_af = fill_chans_af() @contextlib.contextmanager def mocked_basefilehandler(filehandler): @@ -485,13 +573,13 @@ def FakeFCIFileHandlerHRFI_fixture(): @pytest.fixture() def FakeFCIFileHandlerAF_fixture(channel,resolution): - """Get a fixture for the fake AF filehandler, including channel and file names.""" + """Get a fixture for the fake AF filehandler, it contains only one channel and one resolution.""" chan_patterns = {channel.split("_")[0]+"_{:>02d}": {"channels": [int(channel.split("_")[1])], "grid_type": f"{resolution}"},} FakeFCIFileHandlerAF.chan_patterns = chan_patterns with mocked_basefilehandler(FakeFCIFileHandlerAF): param_dict = { - "filetype": f"fci_l1c_af_{channel}", + "filetype": "fci_l1c_af", "channels": _chans_af[f"{channel}_{resolution}"], "filenames": _test_filenames[f"af_{channel}_{resolution}"], } @@ -517,6 +605,22 @@ def _get_type_ter_AF(self,channel): elif channel.split("_")[0] in ["wv","ir"]: return "terran" + def _get_assert_attrs(self,res,ch,attrs_dict): + """Test the differents attributes values.""" + for key,item in attrs_dict.items(): + assert res[ch].attrs[key] == item + + def _get_assert_load(self,res,ch,grid_type,dict_arg): + """Test the value for differents channels.""" + assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], + GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) + assert res[ch].dtype == dict_arg["dtype"] + self._get_assert_attrs(res,ch,dict_arg["attrs_dict"]) + if ch == "ir_38": + numpy.testing.assert_array_equal(res[ch][-1], dict_arg["value_1"]) + numpy.testing.assert_array_equal(res[ch][0], dict_arg["value_0"]) + else: + numpy.testing.assert_array_equal(res[ch], dict_arg["value_1"]) def _get_res_AF(self,channel,fh_param,calibration,reader_configs): """Load the reader for AF data.""" @@ -558,19 +662,9 @@ def test_load_counts(self, reader_configs, fh_param, for ch, grid_type in zip(fh_param["channels"]["solar"] + fh_param["channels"]["terran"], fh_param["channels"]["solar_grid_type"] + fh_param["channels"]["terran_grid_type"]): - assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - assert res[ch].dtype == np.uint16 - assert res[ch].attrs["calibration"] == "counts" - assert res[ch].attrs["units"] == "count" - if ch == "ir_38": - numpy.testing.assert_array_equal(res[ch][-1], 1) - numpy.testing.assert_array_equal(res[ch][0], 5000) - else: - numpy.testing.assert_array_equal(res[ch], 1) + self._get_assert_load(res,ch,grid_type,_dict_arg_counts) - @pytest.mark.parametrize("channel",list_total_channel) - @pytest.mark.parametrize("resolution",list_resolution) + @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) def test_load_counts_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with counts for AF files.""" expected_res_n = 1 @@ -581,17 +675,7 @@ def test_load_counts_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], fh_param["channels"][f"{type_ter}_grid_type"]): - assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - assert res[ch].dtype == np.uint16 - assert res[ch].attrs["calibration"] == calibration - assert res[ch].attrs["units"] == "count" - if ch == "ir_38": - numpy.testing.assert_array_equal(res[ch][-1], 1) - numpy.testing.assert_array_equal(res[ch][0], 5000) - else: - numpy.testing.assert_array_equal(res[ch], 1) - + self._get_assert_load(res,ch,grid_type,_dict_arg_counts) @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 16), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 4)]) @@ -606,21 +690,9 @@ def test_load_radiance(self, reader_configs, fh_param, for ch, grid_type in zip(fh_param["channels"]["solar"] + fh_param["channels"]["terran"], fh_param["channels"]["solar_grid_type"] + fh_param["channels"]["terran_grid_type"]): - assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - assert res[ch].dtype == np.float32 - assert res[ch].attrs["calibration"] == "radiance" - assert res[ch].attrs["units"] == "mW m-2 sr-1 (cm-1)-1" - assert res[ch].attrs["radiance_unit_conversion_coefficient"].values == np.float32(1234.56) - if ch == "ir_38": - numpy.testing.assert_array_equal(res[ch][-1], 15) - numpy.testing.assert_array_equal(res[ch][0], 9700) - else: - numpy.testing.assert_array_equal(res[ch], 15) - + self._get_assert_load(res,ch,grid_type,_dict_arg_radiance) - @pytest.mark.parametrize("channel",list_total_channel) - @pytest.mark.parametrize("resolution",list_resolution) + @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) def test_load_radiance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with radiance for AF files.""" expected_res_n = 1 @@ -631,17 +703,7 @@ def test_load_radiance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,chann assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], fh_param["channels"][f"{type_ter}_grid_type"]): - assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - assert res[ch].dtype == np.float32 - assert res[ch].attrs["calibration"] == calibration - assert res[ch].attrs["units"] == "mW m-2 sr-1 (cm-1)-1" - assert res[ch].attrs["radiance_unit_conversion_coefficient"].values == np.float32(1234.56) - if ch == "ir_38": - numpy.testing.assert_array_equal(res[ch][-1], 15) - numpy.testing.assert_array_equal(res[ch][0], 9700) - else: - numpy.testing.assert_array_equal(res[ch], 15) + self._get_assert_load(res,ch,grid_type,_dict_arg_radiance) @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 8), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 2)]) @@ -661,8 +723,7 @@ def test_load_reflectance(self, reader_configs, fh_param, assert res[ch].attrs["units"] == "%" numpy.testing.assert_array_almost_equal(res[ch], 100 * 15 * 1 * np.pi / 50) - @pytest.mark.parametrize("channel",list_channel_solar) - @pytest.mark.parametrize("resolution",list_resolution) + @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_channel_solar)) def test_load_reflectance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with reflectance for AF files.""" expected_res_n = 1 @@ -693,21 +754,9 @@ def test_load_bt(self, reader_configs, caplog, fh_param, assert caplog.text == "" assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"]["terran"], fh_param["channels"]["terran_grid_type"]): - assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - assert res[ch].dtype == np.float32 - assert res[ch].attrs["calibration"] == "brightness_temperature" - assert res[ch].attrs["units"] == "K" - - if ch == "ir_38": - numpy.testing.assert_array_almost_equal(res[ch][-1], np.float32(209.68275)) - numpy.testing.assert_array_almost_equal(res[ch][0], np.float32(1888.8513)) - else: - numpy.testing.assert_array_almost_equal(res[ch], np.float32(209.68275)) + self._get_assert_load(res,ch,grid_type,_dict_arg_bt) - - @pytest.mark.parametrize("channel",list_channel_terran) - @pytest.mark.parametrize("resolution",list_resolution) + @pytest.mark.parametrize(("channel","resolution"), generate_parameters(list_channel_terran)) def test_load_bt_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,caplog): """Test loading with brightness_temperature for AF files.""" expected_res_n = 1 @@ -720,17 +769,7 @@ def test_load_bt_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,cap assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], fh_param["channels"][f"{type_ter}_grid_type"]): - assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - assert res[ch].dtype == np.float32 - assert res[ch].attrs["calibration"] == "brightness_temperature" - assert res[ch].attrs["units"] == "K" - - if ch == "ir_38": - numpy.testing.assert_array_almost_equal(res[ch][-1], np.float32(209.68275)) - numpy.testing.assert_array_almost_equal(res[ch][0], np.float32(1888.8513)) - else: - numpy.testing.assert_array_almost_equal(res[ch], np.float32(209.68275)) + self._get_assert_load(res,ch,grid_type,_dict_arg_bt) @pytest.mark.parametrize("fh_param", [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture")), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"))]) @@ -754,49 +793,6 @@ def test_orbital_parameters_attr(self, reader_configs, fh_param): "projection_altitude": 35786400.0, } - @pytest.mark.parametrize("channel",list_total_channel) - @pytest.mark.parametrize("resolution",list_resolution) - def test_orbital_parameters_attr_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): - """Test the orbital parametters for AF data.""" - expected_res_n = 1 - fh_param = FakeFCIFileHandlerAF_fixture - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - type_ter = self._get_type_ter_AF(channel) - res = reader.load([make_dataid(name=name) - for name in fh_param["channels"][type_ter]], pad_data=False) - assert expected_res_n == len(res) - for ch in fh_param["channels"][type_ter]: - assert res[ch].attrs["orbital_parameters"] == { - "satellite_actual_longitude": np.mean(np.arange(6000)), - "satellite_actual_latitude": np.mean(np.arange(6000)), - "satellite_actual_altitude": np.mean(np.arange(6000)), - "satellite_nominal_longitude": 0.0, - "satellite_nominal_latitude": 0, - "satellite_nominal_altitude": 35786400.0, - "projection_longitude": 0.0, - "projection_latitude": 0, - "projection_altitude": 35786400.0, - } - - expected_pos_info_for_filetype = { - "fdhsi": {"1km": {"start_position_row": 1, - "end_position_row": 200, - "segment_height": 200, - "grid_width": 11136}, - "2km": {"start_position_row": 1, - "end_position_row": 100, - "segment_height": 100, - "grid_width": 5568}}, - "hrfi": {"500m": {"start_position_row": 1, - "end_position_row": 400, - "segment_height": 400, - "grid_width": 22272}, - "1km": {"start_position_row": 1, - "end_position_row": 200, - "grid_width": 11136, - "segment_height": 200}} - } - @pytest.mark.parametrize(("fh_param", "expected_pos_info"), [ (lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), expected_pos_info_for_filetype["fdhsi"]), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), expected_pos_info_for_filetype["hrfi"]) @@ -808,6 +804,16 @@ def test_get_segment_position_info(self, reader_configs, fh_param, expected_pos_ segpos_info = filetype_handler.get_segment_position_info() assert segpos_info == expected_pos_info + @mock.patch("satpy.readers.yaml_reader.GEOVariableSegmentYAMLReader") + @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) + def test_not_get_segment_info_called_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): + """Test that checks that the get_segment_position_info has not be called for AF data.""" + with mock.patch("satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler.get_segment_position_info") as gspi: + fh_param = FakeFCIFileHandlerAF_fixture + reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) + reader.load([channel]) + gspi.assert_not_called() + @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 16), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 4)]) def test_load_index_map(self, reader_configs, fh_param, expected_res_n): @@ -824,8 +830,7 @@ def test_load_index_map(self, reader_configs, fh_param, expected_res_n): GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) numpy.testing.assert_array_equal(res[ch + "_index_map"][1, 1], 110) - @pytest.mark.parametrize("channel",list_total_channel) - @pytest.mark.parametrize("resolution",list_resolution) + @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) def test_load_index_map_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with index_map for AF files.""" expected_res_n = 1 @@ -875,8 +880,7 @@ def test_load_quality_only(self, reader_configs, fh_param, expected_res_n): numpy.testing.assert_array_equal(res[ch + "_pixel_quality"][1, 1], 3) assert res[ch + "_pixel_quality"].attrs["name"] == ch + "_pixel_quality" - @pytest.mark.parametrize("channel",list_total_channel) - @pytest.mark.parametrize("resolution",list_resolution) + @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) def test_load_quality_only_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): """Test loading with quality works for AF files.""" expected_res_n = 1 @@ -905,18 +909,6 @@ def test_platform_name(self, reader_configs, fh_param): res = reader.load(["vis_06"], pad_data=False) assert res["vis_06"].attrs["platform_name"] == "MTG-I1" - @pytest.mark.parametrize("channel",list_total_channel) - @pytest.mark.parametrize("resolution",list_resolution) - def test_platform_name_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): - """Test that platform name is exposed for AF file.""" - fh_param = FakeFCIFileHandlerAF_fixture - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - type_ter = self._get_type_ter_AF(channel) - res = reader.load([f"{name}" - for name in fh_param["channels"][type_ter]], pad_data=False) - for ch in fh_param["channels"][type_ter]: - assert res[ch].attrs["platform_name"] == "MTG-I1" - @pytest.mark.parametrize(("fh_param", "expected_area"), [ (lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), ["mtg_fci_fdss_1km", "mtg_fci_fdss_2km"]), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), ["mtg_fci_fdss_500m", "mtg_fci_fdss_1km"]), @@ -958,19 +950,6 @@ def test_excs(self, reader_configs, fh_param): make_dataid(name="ir_123", calibration="unknown"), {"units": "unknown"}) - @pytest.mark.parametrize("channel",list_total_channel) - @pytest.mark.parametrize("resolution",list_resolution) - def test_excs_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): - """Test exceptions for AF files.""" - fh_param = FakeFCIFileHandlerAF_fixture - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - with pytest.raises(ValueError, match="Unknown dataset key, not a channel, quality or auxiliary data: invalid"): - reader.file_handlers[fh_param["filetype"]][0].get_dataset(make_dataid(name="invalid"), {}) - with pytest.raises(ValueError, match="unknown invalid value for "): - reader.file_handlers[fh_param["filetype"]][0].get_dataset( - make_dataid(name=f"{channel}", calibration="unknown"), - {"units": "unknown"}) - def test_load_composite(self): """Test that composites are loadable.""" # when dedicated composites for FCI are implemented in satpy, From 086f45fb0a5662dfd0f361c1a5b8f95463b08bb1 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 18:33:27 +0800 Subject: [PATCH 324/481] initial --- satpy/etc/readers/msi_safe.yaml | 267 +++++++++++++++++++++++++++++--- satpy/readers/msi_safe.py | 7 +- 2 files changed, 247 insertions(+), 27 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index c83b560539..e1ac444f2e 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -10,20 +10,38 @@ reader: reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader file_types: - safe_granule: + l1c_safe_granule: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C file_patterns: ['{fmission_id:3s}_MSIL1C_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] - requires: [safe_metadata, safe_tile_metadata] - safe_tile_metadata: + requires: [l1c_safe_metadata, l1c_safe_tile_metadata] + l1c_safe_tile_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML file_patterns: ['{fmission_id:3s}_MSIL1C_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] - safe_metadata: + l1c_safe_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML file_patterns: ['{fmission_id:3s}_MSIL1C_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] + l2a_safe_granule_10m: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C + file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R10m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_10m.jp2'] + requires: [l2a_safe_metadata, l2a_safe_tile_metadata] + l2a_safe_granule_20m: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C + file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R20m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_20m.jp2'] + requires: [l2a_safe_metadata, l2a_safe_tile_metadata] + l2a_safe_granule_60m: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C + file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R60m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_60m.jp2'] + requires: [l2a_safe_metadata, l2a_safe_tile_metadata] + l2a_safe_tile_metadata: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML + file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + l2a_safe_metadata: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML + file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL2A.xml'] -datasets: +datasets: B01: name: B01 sensor: msi @@ -39,7 +57,25 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B01_L2A: + name: B01_L2A + sensor: msi + wavelength: [0.415, 0.443, 0.470] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B02: name: B02 @@ -56,7 +92,26 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B02_L2A: + name: B02_L2A + sensor: msi + wavelength: [0.440, 0.490, 0.540] + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B03: name: B03 @@ -73,7 +128,26 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B03_L2A: + name: B03_L2A + sensor: msi + wavelength: [0.540, 0.560, 0.580] + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B04: name: B04 @@ -90,7 +164,26 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B04_L2A: + name: B04_L2A + sensor: msi + wavelength: [0.645, 0.665, 0.685] + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B05: name: B05 @@ -107,7 +200,25 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B05_L2A: + name: B05_L2A + sensor: msi + wavelength: [0.695, 0.705, 0.715] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B06: name: B06 @@ -124,7 +235,25 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B06_L2A: + name: B06_L2A + sensor: msi + wavelength: [0.731, 0.740, 0.749] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B07: name: B07 @@ -141,7 +270,25 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B07_L2A: + name: B07_L2A + sensor: msi + wavelength: [0.764, 0.783, 0.802] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B08: name: B08 @@ -158,7 +305,24 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B08_L2A: + name: B08_L2A + sensor: msi + wavelength: [0.780, 0.842, 0.905] + resolution: + 10: {file_type: l2a_safe_granule_10m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B8A: name: B8A @@ -175,7 +339,25 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B8A_L2A: + name: B8A + sensor: msi + wavelength: [0.855, 0.865, 0.875] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B09: name: B09 @@ -192,7 +374,24 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + + B09_L2A: + name: B09_L2A + sensor: msi + wavelength: [0.935, 0.945, 0.955] + resolution: + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" B10: name: B10 @@ -209,13 +408,15 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule - B11: - name: B11 + B11_L2A: + name: B11_L2A sensor: msi wavelength: [1.565, 1.610, 1.655] - resolution: 20 + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: standard_name: toa_bidirectional_reflectance @@ -226,7 +427,6 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule B12: name: B12 @@ -243,31 +443,48 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule + file_type: l1c_safe_granule + B12_L2A: + name: B12_L2A + sensor: msi + wavelength: [2.100, 2.190, 2.280] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" solar_zenith_angle: name: solar_zenith_angle resolution: [10, 20, 60] - file_type: safe_tile_metadata + file_type: l1c_safe_tile_metadata xml_tag: Sun_Angles_Grid/Zenith solar_azimuth_angle: name: solar_azimuth_angle resolution: [10, 20, 60] - file_type: safe_tile_metadata + file_type: l1c_safe_tile_metadata xml_tag: Sun_Angles_Grid/Azimuth satellite_azimuth_angle: name: satellite_azimuth_angle resolution: [10, 20, 60] - file_type: safe_tile_metadata + file_type: l1c_safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids xml_item: Azimuth satellite_zenith_angle: name: satellite_zenith_angle resolution: [10, 20, 60] - file_type: safe_tile_metadata + file_type: l1c_safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids xml_item: Zenith diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index ec17a98872..55f761b7c6 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -121,6 +121,7 @@ def __init__(self, filename, filename_info, filetype_info, mask_saturated=True): self.tile = filename_info["dtile_number"] self.platform_name = PLATFORMS[filename_info["fmission_id"]] self.mask_saturated = mask_saturated + self.process_level = "L2A" if "MSIL2A" in filename else "L1C" import bottleneck # noqa import geotiepoints # noqa @@ -140,7 +141,8 @@ class SAFEMSIMDXML(SAFEMSIXMLMetadata): def calibrate_to_reflectances(self, data, band_name): """Calibrate *data* using the radiometric information for the metadata.""" - quantification = int(self.root.find(".//QUANTIFICATION_VALUE").text) + quantification = int(self.root.find(".//QUANTIFICATION_VALUE").text) if self.process_level == "L1C" else \ + int(self.root.find(".//BOA_QUANTIFICATION_VALUE").text) data = self._sanitize_data(data) return (data + self.band_offset(band_name)) / quantification * 100 @@ -172,7 +174,8 @@ def band_indices(self): @cached_property def band_offsets(self): """Get the band offsets from the metadata.""" - offsets = self.root.find(".//Radiometric_Offset_List") + offsets = self.root.find(".//Radiometric_Offset_List") if self.process_level == "L1C" else \ + self.root.find(".//BOA_ADD_OFFSET_VALUES_LIST") if offsets is not None: band_offsets = {int(off.attrib["band_id"]): float(off.text) for off in offsets} else: From 79106e81f9e2f5ad42ab6036ae5153eb97adbdc6 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 18:38:50 +0800 Subject: [PATCH 325/481] Update msi_safe.yaml --- satpy/etc/readers/msi_safe.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index e1ac444f2e..82f0822f0c 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -40,7 +40,6 @@ file_types: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL2A.xml'] - datasets: B01: name: B01 From 9cdb03ede36e52e70f9a15d011b3f07f933b288d Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 23:03:30 +0800 Subject: [PATCH 326/481] job part1 -- readers --- satpy/dataset/dataid.py | 4 +- satpy/etc/readers/msi_safe.yaml | 96 ++++++++++++++++++++++++++++++--- satpy/readers/msi_safe.py | 44 ++++++++++++--- 3 files changed, 129 insertions(+), 15 deletions(-) diff --git a/satpy/dataset/dataid.py b/satpy/dataset/dataid.py index d8301bc453..7bca3d0147 100644 --- a/satpy/dataset/dataid.py +++ b/satpy/dataset/dataid.py @@ -254,7 +254,9 @@ def __hash__(self): "brightness_temperature", "radiance", "radiance_wavenumber", - "counts" + "counts", + "aerosol_thickness", + "water_vapor" ], "transitive": True, }, diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index 82f0822f0c..8ac40f2725 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -310,7 +310,7 @@ datasets: name: B08_L2A sensor: msi wavelength: [0.780, 0.842, 0.905] - resolution: + resolution: 10: {file_type: l2a_safe_granule_10m} calibration: reflectance: @@ -341,10 +341,10 @@ datasets: file_type: l1c_safe_granule B8A_L2A: - name: B8A + name: B8A_L2A sensor: msi wavelength: [0.855, 0.865, 0.875] - resolution: + resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} calibration: @@ -379,7 +379,7 @@ datasets: name: B09_L2A sensor: msi wavelength: [0.935, 0.945, 0.955] - resolution: + resolution: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: @@ -409,11 +409,28 @@ datasets: units: "1" file_type: l1c_safe_granule + B11: + name: B11 + sensor: msi + wavelength: [1.565, 1.610, 1.655] + resolution: 20 + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + file_type: l1c_safe_granule + B11_L2A: name: B11_L2A sensor: msi wavelength: [1.565, 1.610, 1.655] - resolution: + resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} calibration: @@ -448,7 +465,7 @@ datasets: name: B12_L2A sensor: msi wavelength: [2.100, 2.190, 2.280] - resolution: + resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} calibration: @@ -462,6 +479,47 @@ datasets: standard_name: counts units: "1" + AOT_L2A: + name: AOT_L2A + sensor: msi + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + aerosol_thickness: + standard_name: aerosol_optical_thickness + units: "1" + counts: + standard_name: counts + units: "1" + + WVP_L2A: + name: WVP_L2A + sensor: msi + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + water_vapor: + standard_name: water_vapor + units: cm + counts: + standard_name: counts + units: "1" + + SCL_L2A: + name: SCL_L2A + sensor: msi + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + counts: + standard_name: counts + units: "1" + solar_zenith_angle: name: solar_zenith_angle resolution: [10, 20, 60] @@ -487,3 +545,29 @@ datasets: file_type: l1c_safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids xml_item: Zenith + + solar_zenith_angle_l2a: + name: solar_zenith_angle_l2a + resolution: [10, 20, 60] + file_type: l2a_safe_tile_metadata + xml_tag: Sun_Angles_Grid/Zenith + + solar_azimuth_angle_l2a: + name: solar_azimuth_angle_l2a + resolution: [10, 20, 60] + file_type: l2a_safe_tile_metadata + xml_tag: Sun_Angles_Grid/Azimuth + + satellite_azimuth_angle_l2a: + name: satellite_azimuth_angle_l2a + resolution: [10, 20, 60] + file_type: l2a_safe_tile_metadata + xml_tag: Viewing_Incidence_Angles_Grids + xml_item: Azimuth + + satellite_zenith_angle_l2a: + name: satellite_zenith_angle_l2a + resolution: [10, 20, 60] + file_type: l2a_safe_tile_metadata + xml_tag: Viewing_Incidence_Angles_Grids + xml_item: Zenith diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index 55f761b7c6..eaf98d6a38 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -28,9 +28,12 @@ reader_kwargs={'mask_saturated': False}) scene.load(['B01']) -L1B format description for the files read here: +L1C/L2A format description for the files read here: - https://sentinels.copernicus.eu/documents/247904/0/Sentinel-2-product-specifications-document-V14-9.pdf/ + https://sentinels.copernicus.eu/documents/247904/685211/S2-PDGS-TAS-DI-PSD-V14.9.pdf/3d3b6c9c-4334-dcc4-3aa7-f7c0deffbaf7?t=1643013091529 + +Please note: for L2A datasets, the band name has been fixed with a "_L2A" suffix. Do not change it in the YAML file or +the reader can't recogonize it and nothing will be loaded. """ @@ -69,13 +72,19 @@ def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_s self._tile_mda = tile_mda self._mda = mda self.platform_name = PLATFORMS[filename_info["fmission_id"]] + self.process_level = "L2A" if "MSIL2A" in filename else "L1C" def get_dataset(self, key, info): """Load a dataset.""" - if self._channel != key["name"]: - return + if self.process_level == "L1C": + if self._channel != key["name"]: + return + else: + if self._channel + "_L2A" != key["name"]: + return logger.debug("Reading %s.", key["name"]) + proj = self._read_from_file(key) proj.attrs = info.copy() proj.attrs["units"] = "%" @@ -91,6 +100,8 @@ def _read_from_file(self, key): return self._mda.calibrate_to_radiances(proj, self._channel) if key["calibration"] == "counts": return self._mda._sanitize_data(proj) + if key["calibration"] in ["aerosol_thickness", "water_vapor"]: + return self._mda.calibrate_to_atmospheric(proj, self._channel) @property def start_time(self): @@ -104,8 +115,13 @@ def end_time(self): def get_area_def(self, dsid): """Get the area def.""" - if self._channel != dsid["name"]: - return + if self.process_level == "L1C": + if self._channel != dsid["name"]: + return + else: + if self._channel + "_L2A" != dsid["name"]: + return + return self._tile_mda.get_area_def(dsid) @@ -146,6 +162,16 @@ def calibrate_to_reflectances(self, data, band_name): data = self._sanitize_data(data) return (data + self.band_offset(band_name)) / quantification * 100 + def calibrate_to_atmospheric(self, data, band_name): + """Calibrate L2A AOT/WVP product.""" + atmospheric_products = ["AOT", "WVP"] + if self.process_level == "L1C" or (self.process_level == "L2A" and band_name not in atmospheric_products): + return + + quantification = float(self.root.find(f".//{band_name}_QUANTIFICATION_VALUE").text) + data = self._sanitize_data(data) + return data / quantification + def _sanitize_data(self, data): data = data.where(data != self.no_data) if self.mask_saturated: @@ -298,9 +324,11 @@ def interpolate_angles(self, angles, resolution): def _get_coarse_dataset(self, key, info): """Get the coarse dataset refered to by `key` from the XML data.""" angles = self.root.find(".//Tile_Angles") - if key["name"] in ["solar_zenith_angle", "solar_azimuth_angle"]: + if key["name"] in ["solar_zenith_angle", "solar_azimuth_angle", + "solar_zenith_angle_l2a", "solar_azimuth_angle_l2a"]: angles = self._get_solar_angles(angles, info) - elif key["name"] in ["satellite_zenith_angle", "satellite_azimuth_angle"]: + elif key["name"] in ["satellite_zenith_angle", "satellite_azimuth_angle", + "satellite_zenith_angle_l2a", "satellite_azimuth_angle_l2a"]: angles = self._get_satellite_angles(angles, info) else: angles = None From 7a26f155050b3e6f3b1f5435854c1b6b1ab6cea6 Mon Sep 17 00:00:00 2001 From: clement laplace Date: Thu, 18 Apr 2024 15:49:19 +0000 Subject: [PATCH 327/481] fix: Refactore the test_fci_l1c file to reduce function repetition --- satpy/tests/reader_tests/test_fci_l1c_nc.py | 285 +++++++------------- 1 file changed, 100 insertions(+), 185 deletions(-) diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index af4d487eb1..c87db9c6c2 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -453,19 +453,18 @@ def resolutions(channel): else: return list_resolution -def generate_parameters_segment(list_channel): - """Generate dinamicaly the parameters.""" - for channel in list_channel: - if channel == "vis_06": - expected_pos_info = expected_pos_info_for_filetype["fci_af_vis_06"] - else : - expected_pos_info = expected_pos_info_for_filetype["fci_af"] - for resolution in resolutions(channel): - yield (channel, resolution, expected_pos_info) +def get_list_channel_calibration(calibration): + """Get the channel's list according the calibration.""" + if calibration == "reflectance": + return list_channel_solar + elif calibration == "brightness_temperature": + return list_channel_terran + else: + return list_total_channel -def generate_parameters(list_channel): +def generate_parameters(calibration): """Generate dinamicaly the parameters.""" - for channel in list_channel: + for channel in get_list_channel_calibration(calibration): for resolution in resolutions(channel): yield (channel, resolution) @@ -479,31 +478,37 @@ def generate_parameters(list_channel): "terran": ["ir_38", "ir_105"], "terran_grid_type": ["1km"] * 2} -_dict_arg_radiance = {"dtype": np.float32, +dict_calibration = { "radiance" : {"dtype": np.float32, "value_1": 15, "value_0":9700, "attrs_dict":{"calibration":"radiance", "units":"mW m-2 sr-1 (cm-1)-1", "radiance_unit_conversion_coefficient": np.float32(1234.56) - } - } + }, + }, -_dict_arg_counts = {"dtype": np.uint16, + "reflectance" : {"dtype": np.float32, + "attrs_dict":{"calibration":"reflectance", + "units":"%" + }, + }, + + "counts" : {"dtype": np.uint16, "value_1": 1, "value_0": 5000, "attrs_dict":{"calibration":"counts", "units":"count", - } - } + }, + }, -_dict_arg_bt = {"dtype": np.float32, + "brightness_temperature" : {"dtype": np.float32, "value_1": np.float32(209.68275), "value_0": np.float32(1888.8513), "attrs_dict":{"calibration":"brightness_temperature", "units":"K", - } - } - + }, + }, +} _test_filenames = {"fdhsi": [ "W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--" "CHK-BODY--L2P-NC4E_C_EUMT_20170410114434_GTT_DEV_" @@ -520,10 +525,7 @@ def fill_chans_af(): """Fill the dict _chans_af with the right channel and resolution.""" _chans_af = {} for channel in list_total_channel: - if channel == "vis_06": - list_resol = list_resolution_v06 - else : - list_resol = list_resolution + list_resol = resolutions(channel) for resol in list_resol: chann_upp = channel.replace("_","").upper() _test_filenames[f"af_{channel}_{resol}"] = [f"W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD" @@ -616,11 +618,14 @@ def _get_assert_load(self,res,ch,grid_type,dict_arg): GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) assert res[ch].dtype == dict_arg["dtype"] self._get_assert_attrs(res,ch,dict_arg["attrs_dict"]) - if ch == "ir_38": - numpy.testing.assert_array_equal(res[ch][-1], dict_arg["value_1"]) - numpy.testing.assert_array_equal(res[ch][0], dict_arg["value_0"]) - else: - numpy.testing.assert_array_equal(res[ch], dict_arg["value_1"]) + if dict_arg["attrs_dict"]["calibration"] == "reflectance": + numpy.testing.assert_array_almost_equal(res[ch], 100 * 15 * 1 * np.pi / 50) + else : + if ch == "ir_38": + numpy.testing.assert_array_equal(res[ch][-1], dict_arg["value_1"]) + numpy.testing.assert_array_equal(res[ch][0], dict_arg["value_0"]) + else: + numpy.testing.assert_array_equal(res[ch], dict_arg["value_1"]) def _get_res_AF(self,channel,fh_param,calibration,reader_configs): """Load the reader for AF data.""" @@ -649,127 +654,57 @@ def test_file_pattern_for_TRAIL_file(self, reader_configs, filenames): files = reader.select_files_from_pathnames(filenames) assert len(files) == 0 - @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 16), - (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 4)]) - def test_load_counts(self, reader_configs, fh_param, - expected_res_n): - """Test loading with counts.""" - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - res = reader.load( - [make_dataid(name=name, calibration="counts") for name in - fh_param["channels"]["solar"] + fh_param["channels"]["terran"]], pad_data=False) - assert expected_res_n == len(res) - for ch, grid_type in zip(fh_param["channels"]["solar"] + fh_param["channels"]["terran"], - fh_param["channels"]["solar_grid_type"] + - fh_param["channels"]["terran_grid_type"]): - self._get_assert_load(res,ch,grid_type,_dict_arg_counts) - - @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) - def test_load_counts_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): - """Test loading with counts for AF files.""" - expected_res_n = 1 - fh_param = FakeFCIFileHandlerAF_fixture - type_ter = self._get_type_ter_AF(channel) - calibration = "counts" - res = self._get_res_AF(channel,fh_param,calibration,reader_configs) - assert expected_res_n == len(res) - for ch, grid_type in zip(fh_param["channels"][type_ter], - fh_param["channels"][f"{type_ter}_grid_type"]): - self._get_assert_load(res,ch,grid_type,_dict_arg_counts) - - @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 16), - (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 4)]) - def test_load_radiance(self, reader_configs, fh_param, - expected_res_n): - """Test loading with radiance.""" - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - res = reader.load( - [make_dataid(name=name, calibration="radiance") for name in - fh_param["channels"]["solar"] + fh_param["channels"]["terran"]], pad_data=False) - assert expected_res_n == len(res) - for ch, grid_type in zip(fh_param["channels"]["solar"] + fh_param["channels"]["terran"], - fh_param["channels"]["solar_grid_type"] + - fh_param["channels"]["terran_grid_type"]): - self._get_assert_load(res,ch,grid_type,_dict_arg_radiance) - - @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) - def test_load_radiance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): - """Test loading with radiance for AF files.""" - expected_res_n = 1 - fh_param = FakeFCIFileHandlerAF_fixture - type_ter = self._get_type_ter_AF(channel) - calibration = "radiance" - res = self._get_res_AF(channel,fh_param,calibration,reader_configs) - assert expected_res_n == len(res) - for ch, grid_type in zip(fh_param["channels"][type_ter], - fh_param["channels"][f"{type_ter}_grid_type"]): - self._get_assert_load(res,ch,grid_type,_dict_arg_radiance) - - @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 8), - (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 2)]) - def test_load_reflectance(self, reader_configs, fh_param, - expected_res_n): - """Test loading with reflectance.""" - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - res = reader.load( - [make_dataid(name=name, calibration="reflectance") for name in - fh_param["channels"]["solar"]], pad_data=False) - assert expected_res_n == len(res) - for ch, grid_type in zip(fh_param["channels"]["solar"], fh_param["channels"]["solar_grid_type"]): - assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - assert res[ch].dtype == np.float32 - assert res[ch].attrs["calibration"] == "reflectance" - assert res[ch].attrs["units"] == "%" - numpy.testing.assert_array_almost_equal(res[ch], 100 * 15 * 1 * np.pi / 50) - - @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_channel_solar)) - def test_load_reflectance_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): - """Test loading with reflectance for AF files.""" - expected_res_n = 1 - fh_param = FakeFCIFileHandlerAF_fixture - type_ter = self._get_type_ter_AF(channel) - calibration = "reflectance" - res = self._get_res_AF(channel,fh_param,calibration,reader_configs) - assert expected_res_n == len(res) - for ch, grid_type in zip(fh_param["channels"][type_ter], - fh_param["channels"][f"{type_ter}_grid_type"]): - assert res[ch].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - assert res[ch].dtype == np.float32 - assert res[ch].attrs["calibration"] == calibration - assert res[ch].attrs["units"] == "%" - numpy.testing.assert_array_almost_equal(res[ch], 100 * 15 * 1 * np.pi / 50) - - @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 8), - (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 2)]) - def test_load_bt(self, reader_configs, caplog, fh_param, - expected_res_n): - """Test loading with bt.""" + @pytest.mark.parametrize("calibration", ["counts","radiance","brightness_temperature","reflectance"]) + @pytest.mark.parametrize(("fh_param","res_type"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"),"hdfi"), + (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"),"hrfi")]) + def test_load_calibration(self, reader_configs, fh_param, + caplog,calibration,res_type): + """Test loading with counts,radiance,reflectance and bt.""" + expected_res_n = {} + if calibration == "reflectance": + list_chan = fh_param["channels"]["solar"] + list_grid = fh_param["channels"]["solar_grid_type"] + expected_res_n["hdfi"] = 8 + expected_res_n["hrfi"] = 2 + elif calibration == "brightness_temperature": + list_chan = fh_param["channels"]["terran"] + list_grid = fh_param["channels"]["terran_grid_type"] + expected_res_n["hdfi"] = 8 + expected_res_n["hrfi"] = 2 + else: + list_chan = fh_param["channels"]["solar"] + fh_param["channels"]["terran"] + list_grid = fh_param["channels"]["solar_grid_type"] + fh_param["channels"]["terran_grid_type"] + expected_res_n["hdfi"] = 16 + expected_res_n["hrfi"] = 4 reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) with caplog.at_level(logging.WARNING): res = reader.load( - [make_dataid(name=name, calibration="brightness_temperature") for - name in fh_param["channels"]["terran"]], pad_data=False) + [make_dataid(name=name, calibration=calibration) for name in + list_chan], pad_data=False) assert caplog.text == "" - assert expected_res_n == len(res) - for ch, grid_type in zip(fh_param["channels"]["terran"], fh_param["channels"]["terran_grid_type"]): - self._get_assert_load(res,ch,grid_type,_dict_arg_bt) - - @pytest.mark.parametrize(("channel","resolution"), generate_parameters(list_channel_terran)) - def test_load_bt_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,caplog): - """Test loading with brightness_temperature for AF files.""" + assert expected_res_n[res_type] == len(res) + for ch, grid_type in zip(list_chan, + list_grid): + self._get_assert_load(res,ch,grid_type,dict_calibration[calibration]) + + @pytest.mark.parametrize(("calibration", "channel", "resolution"), [ + (calibration, channel, resolution) + for calibration in ["counts", "radiance", "brightness_temperature", "reflectance"] + for channel, resolution in generate_parameters(calibration) + ]) + def test_load_calibration_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,calibration,caplog): + """Test loading with counts,radiance,reflectance and bt for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture type_ter = self._get_type_ter_AF(channel) - calibration = "brightness_temperature" with caplog.at_level(logging.WARNING): res = self._get_res_AF(channel,fh_param,calibration,reader_configs) assert caplog.text == "" assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], fh_param["channels"][f"{type_ter}_grid_type"]): - self._get_assert_load(res,ch,grid_type,_dict_arg_bt) + self._get_assert_load(res,ch,grid_type,dict_calibration[calibration]) + @pytest.mark.parametrize("fh_param", [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture")), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"))]) @@ -805,7 +740,7 @@ def test_get_segment_position_info(self, reader_configs, fh_param, expected_pos_ assert segpos_info == expected_pos_info @mock.patch("satpy.readers.yaml_reader.GEOVariableSegmentYAMLReader") - @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) + @pytest.mark.parametrize(("channel", "resolution"), generate_parameters("radiance")) def test_not_get_segment_info_called_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): """Test that checks that the get_segment_position_info has not be called for AF data.""" with mock.patch("satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler.get_segment_position_info") as gspi: @@ -814,37 +749,51 @@ def test_not_get_segment_info_called_af(self,FakeFCIFileHandlerAF_fixture,reader reader.load([channel]) gspi.assert_not_called() + @pytest.mark.parametrize("calibration", ["index_map","pixel_quality"]) @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 16), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 4)]) - def test_load_index_map(self, reader_configs, fh_param, expected_res_n): - """Test loading of index_map.""" + def test_load_map_and_pixel(self, reader_configs, fh_param, expected_res_n,calibration): + """Test loading of index_map and pixel_quality.""" reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) res = reader.load( - [name + "_index_map" for name in + [f"{name}_{calibration}" for name in fh_param["channels"]["solar"] + fh_param["channels"]["terran"]], pad_data=False) assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"]["solar"] + fh_param["channels"]["terran"], fh_param["channels"]["solar_grid_type"] + fh_param["channels"]["terran_grid_type"]): - assert res[ch + "_index_map"].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], + assert res[f"{ch}_{calibration}"].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - numpy.testing.assert_array_equal(res[ch + "_index_map"][1, 1], 110) - - @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) - def test_load_index_map_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): - """Test loading with index_map for AF files.""" + if calibration == "index_map": + numpy.testing.assert_array_equal(res[f"{ch}_{calibration}"][1, 1], 110) + elif calibration == "pixel_quality": + numpy.testing.assert_array_equal(res[f"{ch}_{calibration}"][1, 1], 3) + assert res[f"{ch}_{calibration}"].attrs["name"] == ch + "_pixel_quality" + + @pytest.mark.parametrize(("calibration", "channel", "resolution"), [ + (calibration, channel, resolution) + for calibration in ["index_map","pixel_quality"] + for channel, resolution in generate_parameters(calibration) + ]) + def test_load_map_and_pixel_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,calibration): + """Test loading with of index_map and pixel_quality for AF files.""" expected_res_n = 1 fh_param = FakeFCIFileHandlerAF_fixture reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) type_ter = self._get_type_ter_AF(channel) - res = reader.load([f"{name}_index_map" + res = reader.load([f"{name}_{calibration}" for name in fh_param["channels"][type_ter]], pad_data=False) assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], fh_param["channels"][f"{type_ter}_grid_type"]): - assert res[f"{ch}_index_map"].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], + assert res[f"{ch}_{calibration}"].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - numpy.testing.assert_array_equal(res[f"{ch}_index_map"][1, 1], 110) + if calibration == "index_map": + numpy.testing.assert_array_equal(res[f"{ch}_{calibration}"][1, 1], 110) + elif calibration == "pixel_quality": + numpy.testing.assert_array_equal(res[f"{ch}_{calibration}"][1, 1], 3) + assert res[f"{ch}_{calibration}"].attrs["name"] == ch + "_pixel_quality" + @pytest.mark.parametrize("fh_param", [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture")), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"))]) @@ -863,40 +812,6 @@ def test_load_aux_data(self, reader_configs, fh_param): else: numpy.testing.assert_array_equal(res[aux][1, 1], 10) - @pytest.mark.parametrize(("fh_param", "expected_res_n"), [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), 16), - (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), 4)]) - def test_load_quality_only(self, reader_configs, fh_param, expected_res_n): - """Test that loading quality only works.""" - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - res = reader.load( - [name + "_pixel_quality" for name in - fh_param["channels"]["solar"] + fh_param["channels"]["terran"]], pad_data=False) - assert expected_res_n == len(res) - for ch, grid_type in zip(fh_param["channels"]["solar"] + fh_param["channels"]["terran"], - fh_param["channels"]["solar_grid_type"] + - fh_param["channels"]["terran_grid_type"]): - assert res[ch + "_pixel_quality"].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - numpy.testing.assert_array_equal(res[ch + "_pixel_quality"][1, 1], 3) - assert res[ch + "_pixel_quality"].attrs["name"] == ch + "_pixel_quality" - - @pytest.mark.parametrize(("channel", "resolution"), generate_parameters(list_total_channel)) - def test_load_quality_only_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel): - """Test loading with quality works for AF files.""" - expected_res_n = 1 - fh_param = FakeFCIFileHandlerAF_fixture - reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) - type_ter = self._get_type_ter_AF(channel) - res = reader.load([f"{name}_pixel_quality" - for name in fh_param["channels"][type_ter]], pad_data=False) - assert expected_res_n == len(res) - for ch, grid_type in zip(fh_param["channels"][type_ter], - fh_param["channels"][f"{type_ter}_grid_type"]): - assert res[f"{ch}_pixel_quality"].shape == (GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["nrows"], - GRID_TYPE_INFO_FOR_TEST_CONTENT[grid_type]["ncols"]) - numpy.testing.assert_array_equal(res[f"{ch}_pixel_quality"][1, 1], 3) - assert res[f"{ch}_pixel_quality"].attrs["name"] == f"{ch}_pixel_quality" - @pytest.mark.parametrize("fh_param", [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture")), (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"))]) def test_platform_name(self, reader_configs, fh_param): From 6f15335964b4e0963c7dfebd720f6e54abdeae3f Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 23:56:51 +0800 Subject: [PATCH 328/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 4970 ++++++++++++++++++++- 1 file changed, 4954 insertions(+), 16 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 0255aac085..8cd5852ee9 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -25,7 +25,7 @@ from satpy.tests.utils import make_dataid -mtd_tile_xml = b""" +mtd_l1c_tile_xml = b""" @@ -575,6 +575,4918 @@ """ # noqa +mtd_l2a_tile_xml = b""" + + + S2A_OPER_MSI_L1C_TL_2APS_20240411T054822_A045975_T50TMK_N05.10 + S2A_OPER_MSI_L2A_TL_2APS_20240411T080950_A045975_T50TMK_N05.10 + S2A_OPER_MSI_L2A_DS_2APS_20240411T080950_S20240411T030632_N05.10 + NOMINAL + 2024-04-11T03:16:45.260288Z + + 2APS + 2024-04-11T08:49:40.661681Z + + + + + WGS84 / UTM zone 50N + EPSG:32650 + + 10980 + 10980 + + + 5490 + 5490 + + + 1830 + 1830 + + + 399960 + 4500000 + 10 + -10 + + + 399960 + 4500000 + 20 + -20 + + + 399960 + 4500000 + 60 + -60 + + + + + + 5000 + 5000 + + 34.9209 34.9012 34.8817 34.8621 34.8426 34.8232 34.8037 34.7844 34.765 34.7457 34.7264 34.7072 34.688 34.6689 34.6498 34.6307 34.6117 34.5927 34.5737 34.5548 34.536 34.5171 34.4983 + 34.8794 34.8598 34.8402 34.8206 34.8011 34.7816 34.7622 34.7428 34.7234 34.7041 34.6848 34.6656 34.6464 34.6272 34.6081 34.589 34.57 34.551 34.532 34.5131 34.4942 34.4754 34.4566 + 34.838 34.8184 34.7987 34.7792 34.7596 34.7401 34.7207 34.7013 34.6819 34.6626 34.6433 34.624 34.6048 34.5856 34.5665 34.5474 34.5283 34.5093 34.4903 34.4714 34.4525 34.4336 34.4148 + 34.7966 34.7769 34.7573 34.7377 34.7182 34.6986 34.6792 34.6597 34.6404 34.621 34.6017 34.5824 34.5632 34.544 34.5248 34.5057 34.4866 34.4676 34.4486 34.4296 34.4107 34.3918 34.373 + 34.7552 34.7355 34.7159 34.6963 34.6767 34.6572 34.6377 34.6182 34.5988 34.5794 34.5601 34.5408 34.5216 34.5023 34.4832 34.464 34.445 34.4259 34.4069 34.3879 34.369 34.3501 34.3312 + 34.7138 34.6941 34.6744 34.6548 34.6352 34.6157 34.5962 34.5767 34.5573 34.5379 34.5185 34.4992 34.48 34.4607 34.4415 34.4224 34.4033 34.3842 34.3652 34.3462 34.3273 34.3083 34.2895 + 34.6724 34.6527 34.633 34.6134 34.5938 34.5742 34.5547 34.5352 34.5157 34.4963 34.477 34.4577 34.4384 34.4191 34.3999 34.3808 34.3616 34.3425 34.3235 34.3045 34.2855 34.2666 34.2477 + 34.631 34.6113 34.5916 34.5719 34.5523 34.5327 34.5132 34.4937 34.4742 34.4548 34.4354 34.4161 34.3968 34.3775 34.3583 34.3391 34.32 34.3009 34.2818 34.2628 34.2438 34.2249 34.206 + 34.5896 34.5699 34.5502 34.5305 34.5109 34.4913 34.4717 34.4522 34.4327 34.4133 34.3939 34.3745 34.3552 34.3359 34.3167 34.2975 34.2783 34.2592 34.2401 34.2211 34.2021 34.1831 34.1642 + 34.5483 34.5285 34.5088 34.4891 34.4694 34.4498 34.4302 34.4107 34.3912 34.3717 34.3523 34.333 34.3136 34.2943 34.2751 34.2559 34.2367 34.2176 34.1985 34.1794 34.1604 34.1414 34.1225 + 34.5069 34.4871 34.4674 34.4477 34.428 34.4084 34.3888 34.3692 34.3497 34.3302 34.3108 34.2914 34.2721 34.2527 34.2335 34.2142 34.1951 34.1759 34.1568 34.1377 34.1187 34.0997 34.0808 + 34.4655 34.4457 34.426 34.4062 34.3866 34.3669 34.3473 34.3277 34.3082 34.2887 34.2693 34.2499 34.2305 34.2112 34.1919 34.1726 34.1534 34.1343 34.1151 34.096 34.077 34.058 34.039 + 34.4242 34.4044 34.3846 34.3648 34.3451 34.3255 34.3059 34.2863 34.2667 34.2472 34.2278 34.2083 34.1889 34.1696 34.1503 34.131 34.1118 34.0926 34.0735 34.0544 34.0353 34.0163 33.9973 + 34.3828 34.363 34.3432 34.3234 34.3037 34.284 34.2644 34.2448 34.2252 34.2057 34.1862 34.1668 34.1474 34.128 34.1087 34.0894 34.0702 34.051 34.0318 34.0127 33.9936 33.9746 33.9556 + 34.3415 34.3216 34.3018 34.2821 34.2623 34.2426 34.223 34.2033 34.1838 34.1642 34.1447 34.1253 34.1059 34.0865 34.0671 34.0478 34.0286 34.0094 33.9902 33.9711 33.952 33.9329 33.9139 + 34.3002 34.2803 34.2605 34.2407 34.2209 34.2012 34.1815 34.1619 34.1423 34.1227 34.1032 34.0838 34.0643 34.0449 34.0256 34.0063 33.987 33.9677 33.9486 33.9294 33.9103 33.8912 33.8722 + 34.2589 34.239 34.2191 34.1993 34.1795 34.1598 34.1401 34.1205 34.1008 34.0813 34.0617 34.0422 34.0228 34.0034 33.984 33.9647 33.9454 33.9261 33.9069 33.8878 33.8686 33.8495 33.8305 + 34.2175 34.1976 34.1778 34.1579 34.1381 34.1184 34.0987 34.079 34.0594 34.0398 34.0202 34.0007 33.9813 33.9618 33.9425 33.9231 33.9038 33.8845 33.8653 33.8461 33.827 33.8079 33.7888 + 34.1762 34.1563 34.1364 34.1166 34.0968 34.077 34.0573 34.0376 34.0179 33.9983 33.9788 33.9592 33.9398 33.9203 33.9009 33.8815 33.8622 33.8429 33.8237 33.8045 33.7853 33.7662 33.7471 + 34.1349 34.115 34.0951 34.0752 34.0554 34.0356 34.0159 33.9962 33.9765 33.9569 33.9373 33.9177 33.8982 33.8788 33.8594 33.84 33.8206 33.8013 33.7821 33.7629 33.7437 33.7245 33.7054 + 34.0936 34.0737 34.0537 34.0339 34.014 33.9942 33.9745 33.9547 33.9351 33.9154 33.8958 33.8763 33.8567 33.8373 33.8178 33.7984 33.7791 33.7597 33.7405 33.7212 33.702 33.6829 33.6638 + 34.0523 34.0324 34.0124 33.9925 33.9727 33.9529 33.9331 33.9133 33.8936 33.874 33.8544 33.8348 33.8152 33.7957 33.7763 33.7569 33.7375 33.7182 33.6989 33.6796 33.6604 33.6412 33.6221 + 34.0111 33.9911 33.9711 33.9512 33.9313 33.9115 33.8917 33.8719 33.8522 33.8325 33.8129 33.7933 33.7738 33.7542 33.7348 33.7153 33.6959 33.6766 33.6573 33.638 33.6188 33.5996 33.5805 + + + + 5000 + 5000 + + 152.939 153.035 153.13 153.225 153.32 153.416 153.511 153.606 153.702 153.798 153.893 153.989 154.085 154.181 154.277 154.373 154.469 154.565 154.662 154.758 154.854 154.951 155.047 + 152.916 153.011 153.107 153.202 153.297 153.392 153.488 153.583 153.679 153.775 153.87 153.966 154.062 154.158 154.254 154.35 154.446 154.542 154.639 154.735 154.831 154.928 155.025 + 152.893 152.988 153.083 153.179 153.274 153.369 153.465 153.56 153.656 153.752 153.847 153.943 154.039 154.135 154.231 154.327 154.423 154.519 154.616 154.712 154.809 154.905 155.002 + 152.87 152.965 153.06 153.155 153.251 153.346 153.442 153.537 153.633 153.728 153.824 153.92 154.016 154.112 154.208 154.304 154.4 154.496 154.593 154.689 154.786 154.882 154.979 + 152.846 152.941 153.037 153.132 153.227 153.323 153.418 153.514 153.609 153.705 153.801 153.897 153.993 154.089 154.185 154.281 154.377 154.473 154.57 154.666 154.763 154.859 154.956 + 152.823 152.918 153.013 153.109 153.204 153.299 153.395 153.49 153.586 153.682 153.778 153.873 153.969 154.065 154.161 154.258 154.354 154.45 154.547 154.643 154.739 154.836 154.933 + 152.799 152.895 152.99 153.085 153.18 153.276 153.371 153.467 153.563 153.658 153.754 153.85 153.946 154.042 154.138 154.234 154.331 154.427 154.523 154.62 154.716 154.813 154.91 + 152.776 152.871 152.966 153.062 153.157 153.252 153.348 153.444 153.539 153.635 153.731 153.827 153.923 154.019 154.115 154.211 154.307 154.404 154.5 154.597 154.693 154.79 154.886 + 152.752 152.847 152.943 153.038 153.133 153.229 153.324 153.42 153.516 153.611 153.707 153.803 153.899 153.995 154.091 154.188 154.284 154.38 154.477 154.573 154.67 154.766 154.863 + 152.728 152.824 152.919 153.014 153.11 153.205 153.301 153.396 153.492 153.588 153.684 153.78 153.876 153.972 154.068 154.164 154.26 154.357 154.453 154.55 154.646 154.743 154.84 + 152.705 152.8 152.895 152.991 153.086 153.181 153.277 153.373 153.468 153.564 153.66 153.756 153.852 153.948 154.044 154.141 154.237 154.333 154.43 154.526 154.623 154.72 154.816 + 152.681 152.776 152.871 152.967 153.062 153.158 153.253 153.349 153.445 153.541 153.636 153.732 153.829 153.925 154.021 154.117 154.213 154.31 154.406 154.503 154.599 154.696 154.793 + 152.657 152.752 152.847 152.943 153.038 153.134 153.229 153.325 153.421 153.517 153.613 153.709 153.805 153.901 153.997 154.093 154.19 154.286 154.383 154.479 154.576 154.673 154.769 + 152.633 152.728 152.823 152.919 153.014 153.11 153.206 153.301 153.397 153.493 153.589 153.685 153.781 153.877 153.973 154.07 154.166 154.263 154.359 154.456 154.552 154.649 154.746 + 152.609 152.704 152.799 152.895 152.99 153.086 153.182 153.277 153.373 153.469 153.565 153.661 153.757 153.853 153.95 154.046 154.142 154.239 154.335 154.432 154.529 154.625 154.722 + 152.585 152.68 152.775 152.871 152.966 153.062 153.158 153.253 153.349 153.445 153.541 153.637 153.733 153.829 153.926 154.022 154.118 154.215 154.311 154.408 154.505 154.602 154.698 + 152.56 152.656 152.751 152.847 152.942 153.038 153.133 153.229 153.325 153.421 153.517 153.613 153.709 153.805 153.902 153.998 154.095 154.191 154.288 154.384 154.481 154.578 154.675 + 152.536 152.631 152.727 152.822 152.918 153.014 153.109 153.205 153.301 153.397 153.493 153.589 153.685 153.781 153.878 153.974 154.071 154.167 154.264 154.36 154.457 154.554 154.651 + 152.512 152.607 152.703 152.798 152.894 152.989 153.085 153.181 153.277 153.373 153.469 153.565 153.661 153.757 153.854 153.95 154.047 154.143 154.24 154.336 154.433 154.53 154.627 + 152.487 152.583 152.678 152.774 152.869 152.965 153.061 153.157 153.252 153.348 153.445 153.541 153.637 153.733 153.829 153.926 154.022 154.119 154.216 154.312 154.409 154.506 154.603 + 152.463 152.558 152.654 152.749 152.845 152.941 153.036 153.132 153.228 153.324 153.42 153.516 153.613 153.709 153.805 153.902 153.998 154.095 154.191 154.288 154.385 154.482 154.579 + 152.438 152.534 152.629 152.725 152.82 152.916 153.012 153.108 153.204 153.3 153.396 153.492 153.588 153.685 153.781 153.877 153.974 154.071 154.167 154.264 154.361 154.458 154.555 + 152.414 152.509 152.605 152.7 152.796 152.892 152.987 153.083 153.179 153.275 153.371 153.468 153.564 153.66 153.757 153.853 153.95 154.046 154.143 154.24 154.337 154.434 154.531 + + + + + 34.2508883033046 + 153.732570441329 + + + + 5000 + 5000 + + 1.97703 2.1053 2.29413 2.5298 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.00462 2.15075 2.35339 2.59967 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.03731 2.19992 2.41573 2.67162 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.07478 2.25294 2.48052 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.1168 2.30961 2.54835 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.16312 2.36962 2.61877 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.21367 2.43296 2.6915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.26781 2.49894 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.32569 2.56807 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.38701 2.63968 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.45114 2.71276 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.51821 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.58721 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.659 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 208.344 218.797 227.795 235.278 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 211.295 221.381 229.961 237.056 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 214.157 223.829 232.007 238.731 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 216.884 226.167 233.932 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 219.525 228.405 235.779 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 222.07 230.538 237.528 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 224.503 232.56 239.186 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 226.83 234.485 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 229.047 236.314 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 231.162 238.059 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 233.155 239.675 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 235.048 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 236.822 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 238.514 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.64951 2.96573 3.29685 3.64043 3.99275 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.73274 3.05304 3.38864 3.73509 4.09035 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.51047 2.81637 3.14143 3.48007 3.82888 4.18472 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.59005 2.9021 3.2313 3.57285 3.92399 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.67197 2.98919 3.3223 3.66692 4.02043 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.75571 3.07766 3.41441 3.7612 4.11517 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.53269 2.84107 3.16751 3.50699 3.85521 4.21181 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.61388 2.92772 3.25821 3.60085 3.9508 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.69706 3.01473 3.34862 3.69441 4.04598 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.78078 3.10372 3.44082 3.78694 4.14155 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.55734 2.86715 3.19341 3.53275 3.88181 4.23811 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.63887 2.95325 3.28382 3.62646 3.97758 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.72227 3.04131 3.376 3.72263 4.07367 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.5008 2.80632 3.13157 3.46978 3.81877 4.17029 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.58119 2.89312 3.22131 3.56146 3.9119 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.66461 2.98122 3.3122 3.65548 4.00738 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.74814 3.06947 3.40515 3.75127 4.10378 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.83388 3.15864 3.49697 3.84607 4.20128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.91919 3.24865 3.59019 3.94101 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.00713 3.3404 3.68514 4.03645 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.09748 3.434 3.779 4.13296 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.18661 3.52592 3.87415 4.22993 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.27687 3.61929 3.96988 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 323.875 319.18 315.438 312.386 309.87 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 322.492 318.084 314.534 311.639 309.24 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 326.407 321.206 317.049 313.693 310.947 308.671 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 324.885 319.984 316.066 312.89 310.281 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 323.443 318.832 315.135 312.126 309.642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 322.088 317.748 314.25 311.402 309.049 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 325.936 320.806 316.721 313.42 310.725 308.479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 324.426 319.608 315.755 312.629 310.069 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 323.001 318.49 314.851 311.885 309.456 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 321.68 317.425 313.991 311.194 308.87 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 325.455 320.424 316.426 313.184 310.521 308.308 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 323.982 319.264 315.484 312.41 309.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 322.592 318.16 314.585 311.66 309.272 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 326.571 321.309 317.107 313.727 310.953 308.691 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 325.034 320.076 316.13 312.942 310.312 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 323.556 318.911 315.207 312.182 309.687 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 322.207 317.835 314.316 311.447 309.085 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 320.921 316.814 313.495 310.768 308.511 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 319.743 315.863 312.712 310.121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 318.607 314.942 311.957 309.506 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 317.521 314.064 311.256 308.915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 316.524 313.255 310.578 308.35 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 315.579 312.48 309.936 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.42528 4.77697 5.13643 5.4944 5.86044 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.51892 4.87221 5.23118 5.59655 5.95918 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.26204 4.61261 4.96819 5.32906 5.69405 6.0593 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.35606 4.70847 5.06509 5.42879 5.79188 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.45033 4.80301 5.16215 5.52309 5.8888 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.54321 4.89826 5.25789 5.61913 5.98529 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.28804 4.63877 4.99321 5.35406 5.71819 6.08372 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.38065 4.73327 5.09101 5.452 5.81556 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.47413 4.82945 5.18704 5.55048 5.91388 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.21956 4.56894 4.9238 5.28338 5.64677 6.01255 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.31264 4.66366 5.02006 5.38068 5.74465 6.11133 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.40658 4.75909 5.11671 5.47833 5.84319 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.50092 4.85501 5.21389 5.57648 5.94203 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.24618 4.59591 4.9514 5.31133 5.67477 6.04096 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.34035 4.69341 5.04906 5.40905 5.77338 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.43457 4.78889 5.14515 5.5071 5.87217 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.52892 4.88338 5.24251 5.6054 5.97116 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.27496 4.62443 4.97992 5.34015 5.70385 6.07032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.36804 4.71979 5.07693 5.4381 5.80258 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.46235 4.8158 5.17407 5.53632 5.90155 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.55735 4.91218 5.27167 5.63483 6.00077 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.30198 4.65281 5.00903 5.36959 5.73355 6.10016 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.39631 4.74868 5.10619 5.4677 5.83246 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 259.438 261.542 263.374 264.943 266.343 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 260.028 262.049 263.804 265.347 266.684 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 258.321 260.591 262.539 264.235 265.721 267.02 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 258.966 261.146 263.017 264.658 266.079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 259.585 261.668 263.474 265.04 266.424 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 260.165 262.172 263.91 265.418 266.755 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 258.496 260.737 262.655 264.331 265.796 267.083 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 259.126 261.279 263.132 264.741 266.152 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 259.73 261.803 263.582 265.143 266.501 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 258.01 260.32 262.3 264.016 265.516 266.837 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 258.669 260.88 262.782 264.436 265.886 267.166 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 259.298 261.42 263.252 264.847 266.245 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 259.904 261.939 263.701 265.239 266.592 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 258.204 260.481 262.438 264.135 265.62 266.928 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 258.857 261.05 262.924 264.553 265.986 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 259.478 261.581 263.379 264.956 266.341 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 260.071 262.082 263.824 265.345 266.683 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 258.402 260.643 262.574 264.252 265.72 267.014 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 259.034 261.188 263.046 264.663 266.081 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 259.641 261.711 263.5 265.06 266.431 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 260.226 262.214 263.937 265.441 266.766 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 258.567 260.786 262.697 264.356 265.809 267.092 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 259.193 261.324 263.162 264.762 266.166 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.20011 6.57702 6.95471 7.33472 7.71001 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.30177 6.68303 7.05691 7.43541 7.81114 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02935 6.40541 6.78524 7.15835 7.53305 7.9119 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13173 6.50461 6.88625 7.26132 7.63551 8.01305 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22913 6.60581 6.98443 7.3594 7.73613 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.32911 6.70656 7.0822 7.45966 7.83787 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05415 6.43153 6.80634 7.1834 7.56141 7.93969 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15469 6.53072 6.90756 7.28517 7.6632 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25604 6.63233 7.00929 7.38695 7.76506 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.35731 6.73386 7.11106 7.48887 7.86707 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08281 6.45877 6.8356 7.21309 7.59085 7.96898 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18422 6.56037 6.93737 7.31487 7.69287 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.28565 6.66203 7.03927 7.41702 7.79501 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01162 6.3873 6.76382 7.14125 7.51902 7.89706 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11316 6.48908 6.86586 7.24325 7.62108 7.99928 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21474 6.59085 6.96778 7.34537 7.7233 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.31639 6.6928 7.06991 7.44757 7.82553 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04248 6.41816 6.79477 7.17202 7.54977 7.92782 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.144 6.51989 6.89676 7.27422 7.65206 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.2457 6.62195 6.99889 7.37639 7.75429 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.34747 6.72384 7.10097 7.47868 7.85668 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.07357 6.4493 6.82596 7.20329 7.58102 7.95903 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.17526 6.55128 6.92808 7.30551 7.68339 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.294 300.476 299.753 299.105 298.535 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.048 300.249 299.559 298.935 298.379 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.672 300.809 300.038 299.371 298.772 298.227 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.412 300.586 299.837 299.188 298.608 298.08 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.177 300.37 299.651 299.019 298.45 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.944 300.161 299.471 298.852 298.298 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.573 300.712 299.961 299.29 298.688 298.148 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.324 300.497 299.764 299.113 298.529 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.084 300.285 299.574 298.94 298.374 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.852 300.077 299.389 298.775 298.225 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.476 300.628 299.878 299.211 298.614 298.078 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.232 300.412 299.684 299.036 298.457 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.995 300.201 299.497 298.869 298.307 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.637 300.767 299.999 299.316 298.706 298.158 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.387 300.546 299.802 299.139 298.548 298.016 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.147 300.332 299.612 298.969 298.394 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.914 300.126 299.428 298.805 298.245 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.552 300.69 299.927 299.249 298.643 298.1 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.304 300.47 299.732 299.076 298.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.067 300.261 299.546 298.907 298.335 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.837 300.056 299.362 298.743 298.189 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 301.468 300.614 299.859 299.188 298.586 298.045 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 301.226 300.399 299.666 299.014 298.43 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08452 8.45638 8.82965 9.20261 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.18443 8.55562 8.92971 9.30313 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90931 8.28187 8.65554 9.02927 9.4038 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00912 8.38232 8.75586 9.13013 9.50517 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10985 8.48282 8.85656 9.23808 9.61045 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.21032 8.58314 8.95763 9.33519 9.71055 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93698 8.31003 8.68369 9.05876 9.43294 9.80827 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03731 8.41139 8.78632 9.16185 9.53447 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13893 8.5125 8.88626 9.26212 9.6352 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.23827 8.61366 8.98688 9.35967 9.73641 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96562 8.33878 8.71237 9.08655 9.4605 9.83435 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06609 8.43947 8.81313 9.18696 9.56102 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.1667 8.54013 8.91385 9.28778 9.66183 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89431 8.26729 8.64086 9.01471 9.38872 9.76283 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9949 8.368 8.74168 9.11551 9.48953 9.86363 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09547 8.46873 8.84248 9.21641 9.5905 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.19618 8.56956 8.94338 9.31735 9.6914 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92397 8.29696 8.67041 9.04428 9.41832 9.79243 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02464 8.39778 8.77138 9.14528 9.51928 9.89342 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12538 8.49866 8.87236 9.24634 9.62039 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.22624 8.59962 8.97339 9.34737 9.7215 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9541 8.32712 8.70065 9.0745 9.44852 9.82258 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05496 8.42812 8.80175 9.17562 9.54964 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.205 272.908 273.556 274.152 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.393 273.079 273.714 274.297 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.839 272.573 273.245 273.865 274.44 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.034 272.751 273.411 274.019 274.582 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.229 272.93 273.573 274.179 274.725 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.419 273.101 273.732 274.319 274.86 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.873 272.602 273.271 273.889 274.458 274.987 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.071 272.785 273.44 274.045 274.6 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.269 272.963 273.601 274.194 274.738 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.454 273.137 273.761 274.336 274.875 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.916 272.64 273.304 273.914 274.479 275.003 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.114 272.82 273.467 274.066 274.62 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.307 272.997 273.631 274.216 274.757 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.763 272.497 273.17 273.789 274.361 274.893 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.963 272.68 273.339 273.946 274.507 275.026 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.16 272.861 273.504 274.096 274.646 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.351 273.035 273.664 274.245 274.784 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.809 272.538 273.206 273.822 274.39 274.917 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.008 272.72 273.373 273.975 274.532 275.049 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.202 272.897 273.536 274.125 274.671 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.391 273.07 273.695 274.272 274.807 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.851 272.575 273.239 273.85 274.415 274.939 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.047 272.753 273.402 274.001 274.555 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93809 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0418 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1429 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.8632 10.2422 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.96528 10.3439 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0675 10.4458 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1696 10.5499 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89328 10.2719 10.6503 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99559 10.374 10.7519 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0979 10.4762 10.854 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2002 10.5784 10.9559 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.924 10.3025 10.6805 11.0579 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0264 10.4048 10.7827 11.16 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1289 10.5071 10.8847 11.2619 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2313 10.6093 10.9869 11.3639 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95517 10.3337 10.7116 11.089 11.4658 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.143 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.06 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.983 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.173 295.907 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.093 295.833 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.014 295.759 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.936 295.687 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.126 295.862 295.618 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.046 295.787 295.55 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.968 295.716 295.484 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.893 295.646 295.418 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.084 295.819 295.577 295.355 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.005 295.747 295.511 295.294 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.929 295.678 295.445 295.232 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.854 295.607 295.382 295.173 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.043 295.782 295.541 295.319 295.114 + + + + + + 5000 + 5000 + + 1.43228 1.60524 1.8464 2.13265 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.47061 1.66474 1.91995 2.21533 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.51524 1.72801 1.99607 2.29961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.56542 1.79529 2.07417 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.62096 1.86621 2.15515 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.68128 1.94029 2.23816 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.74598 2.0173 2.32311 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.81462 2.09678 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.88669 2.17894 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.96221 2.26337 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.03976 2.34819 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.12021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.20185 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.28602 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 213.859 227.218 237.55 245.315 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 217.766 230.299 239.872 247.059 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 221.46 233.135 242.008 248.666 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 224.881 235.765 243.971 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 228.1 238.213 245.81 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 231.113 240.484 247.517 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 233.911 242.584 249.101 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 236.505 244.533 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 238.913 246.344 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 241.144 248.031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 243.203 249.572 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 245.104 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 246.851 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 248.48 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.33111 2.68405 3.04481 3.41291 3.78575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.42496 2.77992 3.14389 3.51368 3.88862 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.17275 2.51866 2.87653 3.2421 3.6131 3.9876 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.26386 2.61399 2.97422 3.34134 3.71369 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.3569 2.7102 3.07271 3.44153 3.8153 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.45113 2.80718 3.17193 3.54178 3.91494 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.19851 2.54651 2.90522 3.27117 3.64121 4.01608 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.29124 2.64257 3.00361 3.37133 3.74218 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.3854 2.73829 3.10125 3.47095 3.84227 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.47946 2.83579 3.20029 3.56905 3.94262 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.22682 2.57555 2.93336 3.29873 3.6694 4.0438 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.31963 2.67074 3.03128 3.39867 3.77031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.41379 2.76748 3.13068 3.50088 3.8714 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.16175 2.50772 2.86606 3.23129 3.60278 3.97273 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.25366 2.60403 2.96347 3.3292 3.70104 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.34847 2.7014 3.06171 3.4293 3.80152 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.44244 2.79805 3.16179 3.53108 3.90281 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.5381 2.89538 3.26026 3.63137 4.00498 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.63262 2.99271 3.35959 3.73144 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.72941 3.0918 3.46054 3.83192 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.82825 3.19241 3.56005 3.93314 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.92527 3.29075 3.66069 4.03471 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.02299 3.39032 3.76158 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 313.045 309.176 306.236 303.925 302.074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 311.876 308.298 305.543 303.369 301.616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 315.228 310.813 307.48 304.903 302.857 301.201 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 313.903 309.815 306.714 304.297 302.368 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 312.674 308.891 305.998 303.724 301.9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 311.54 308.027 305.322 303.188 301.471 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 314.815 310.485 307.223 304.694 302.69 301.057 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 313.513 309.512 306.472 304.098 302.208 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 312.305 308.617 305.779 303.546 301.764 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 311.207 307.777 305.125 303.034 301.338 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 314.405 310.178 306.996 304.516 302.54 300.935 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 313.143 309.241 306.268 303.938 302.073 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 311.973 308.363 305.581 303.382 301.631 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 315.391 310.91 307.534 304.929 302.86 301.212 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 314.05 309.901 306.771 304.339 302.39 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 312.792 308.968 306.062 303.772 301.933 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 311.661 308.111 305.38 303.227 301.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 310.601 307.312 304.762 302.729 301.085 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 309.643 306.57 304.17 302.254 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 308.729 305.862 303.609 301.807 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 307.87 305.192 303.087 301.376 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 307.087 304.58 302.589 300.969 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 306.353 303.999 302.117 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.21509 4.58387 4.95832 5.32901 5.70652 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.31351 4.68322 5.05653 5.43457 5.80807 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.04285 4.41182 4.78335 5.158 5.5352 5.91099 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.14218 4.51234 4.88419 5.26127 5.63591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.2416 4.61122 4.98503 5.35879 5.7358 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.3392 4.71067 5.08447 5.45792 5.83499 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.07051 4.43949 4.80959 5.18413 5.56025 5.93616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.16835 4.53848 4.91133 5.28536 5.66053 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.26676 4.63904 5.01107 5.38737 5.76178 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 3.99836 4.36651 4.73747 5.11105 5.48658 5.86321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.09685 4.46578 4.83769 5.21182 5.58767 5.96477 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.19595 4.56574 4.9383 5.31293 5.68918 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.29527 4.66587 5.0391 5.41429 5.79092 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.02672 4.39496 4.7664 5.14018 5.51578 5.89263 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.12626 4.49709 4.86816 5.24133 5.61738 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.22557 4.59699 4.96792 5.34277 5.71915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.32477 4.69561 5.06896 5.44426 5.82096 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.05728 4.42498 4.79621 5.17014 5.54584 5.92289 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.15556 4.52477 4.89707 5.27147 5.64756 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.25473 4.62508 4.99796 5.37299 5.74941 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.35451 4.72557 5.09913 5.47458 5.8514 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.08573 4.45457 4.8264 5.20051 5.57638 5.95346 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.18513 4.55488 4.92742 5.30202 5.67823 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 266.45 268.096 269.511 270.713 271.778 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 266.913 268.489 269.841 271.018 272.032 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 265.564 267.352 268.864 270.167 271.3 272.284 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 266.073 267.783 269.232 270.49 271.571 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 266.561 268.187 269.582 270.779 271.829 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 267.014 268.576 269.914 271.066 272.079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 265.698 267.461 268.948 270.235 271.351 272.325 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 266.197 267.882 269.316 270.548 271.62 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 266.674 268.29 269.66 270.853 271.884 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 265.312 267.133 268.673 269.994 271.138 272.137 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 265.836 267.572 269.046 270.313 271.416 272.384 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 266.332 267.99 269.405 270.626 271.689 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 266.809 268.397 269.753 270.925 271.949 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 265.471 267.262 268.78 270.084 271.214 272.205 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 265.987 267.706 269.157 270.405 271.493 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 266.478 268.119 269.506 270.71 271.76 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 266.943 268.507 269.846 271.006 272.019 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 265.629 267.39 268.887 270.173 271.29 272.268 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 266.129 267.815 269.251 270.487 271.564 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 266.608 268.221 269.599 270.789 271.828 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 267.066 268.61 269.934 271.08 272.081 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 265.76 267.503 268.981 270.252 271.358 272.327 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 266.254 267.919 269.337 270.56 271.626 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.06427 6.44803 6.83196 7.2174 7.59778 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.16793 6.55589 6.93589 7.31949 7.70015 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.89029 6.27351 6.66009 7.0387 7.4186 7.80228 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99495 6.37463 6.7627 7.14316 7.52246 7.90458 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.09422 6.47774 6.86233 7.24287 7.62442 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19606 6.5801 6.96173 7.34443 7.72743 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.91577 6.30049 6.6816 7.0644 7.44757 7.83053 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01841 6.40138 6.78447 7.16764 7.55068 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12175 6.50475 6.88773 7.27086 7.65387 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22489 6.60801 6.99109 7.37418 7.75714 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.94515 6.32823 6.71141 7.09457 7.47746 7.86027 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04854 6.43161 6.81476 7.19783 7.58084 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15194 6.53503 6.91825 7.30135 7.6842 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87249 6.25545 6.63846 7.02172 7.40473 7.78753 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97609 6.35907 6.74215 7.12521 7.50814 7.89093 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07961 6.4626 6.84564 7.22873 7.61163 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18318 6.56624 6.94927 7.33228 7.71508 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.90386 6.28674 6.6698 7.05284 7.43582 7.81861 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00738 6.39032 6.77345 7.15648 7.53939 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11108 6.4941 6.87708 7.26005 7.6429 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21465 6.59766 6.98072 7.36374 7.74652 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.93541 6.31833 6.70138 7.08441 7.46732 7.85004 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.03904 6.42203 6.80506 7.18807 7.57099 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.13 295.598 295.129 294.715 294.353 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.966 295.448 295.001 294.601 294.248 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.372 295.806 295.307 294.876 294.494 294.149 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.199 295.66 295.176 294.758 294.386 294.052 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.043 295.516 295.052 294.647 294.284 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.888 295.379 294.933 294.538 294.184 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.298 295.734 295.247 294.814 294.43 294.088 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.133 295.593 295.119 294.7 294.326 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.975 295.453 294.993 294.587 294.226 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.82 295.316 294.874 294.48 294.13 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.228 295.674 295.187 294.757 294.374 294.034 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.067 295.531 295.06 294.643 294.274 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.911 295.394 294.939 294.535 294.176 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.332 295.762 295.262 294.821 294.429 294.081 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.168 295.618 295.134 294.706 294.327 293.989 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.009 295.477 295.01 294.597 294.229 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.856 295.343 294.891 294.489 294.132 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.275 295.708 295.211 294.773 294.386 294.04 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.11 295.565 295.086 294.663 294.286 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.957 295.429 294.964 294.552 294.187 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.803 295.294 294.846 294.449 294.094 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 296.217 295.658 295.166 294.731 294.345 294 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 296.056 295.515 295.039 294.619 294.245 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9782 8.35573 8.73425 9.11201 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07985 8.45653 8.83562 9.21379 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80029 8.17871 8.55779 8.93653 9.31567 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90165 8.28066 8.65954 9.03872 9.41814 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00399 8.38269 8.76158 9.14809 9.52479 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10613 8.48444 8.86397 9.24621 9.62624 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82843 8.20739 8.58644 8.96639 9.34511 9.72472 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93046 8.31034 8.69055 9.07079 9.44796 9.82594 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03387 8.41296 8.79174 9.17247 9.54999 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13464 8.5156 8.89375 9.27117 9.65231 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8577 8.23673 8.61567 8.99473 9.37326 9.75124 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95982 8.33887 8.71778 9.09642 9.47493 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06206 8.4411 8.8199 9.19851 9.57685 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.78537 8.16428 8.54324 8.92207 9.30068 9.67905 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88759 8.26651 8.64553 9.02423 9.40274 9.78095 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.98983 8.36878 8.74768 9.12635 9.50484 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09211 8.47103 8.84992 9.22856 9.60693 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.81558 8.19448 8.57331 8.95214 9.33072 9.70904 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91791 8.2968 8.67568 9.05441 9.43289 9.81115 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02028 8.39918 8.77802 9.15675 9.53515 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.1227 8.50157 8.88039 9.259 9.63741 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84622 8.22512 8.60402 8.98277 9.36132 9.73957 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94869 8.32757 8.70646 9.08514 9.46361 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.209 276.743 277.235 277.688 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.349 276.869 277.352 277.796 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.925 276.484 276.995 277.465 277.901 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.073 276.617 277.117 277.579 278.007 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.218 276.75 277.24 277.699 278.113 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.361 276.879 277.357 277.803 278.214 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.944 276.497 277.006 277.475 277.907 278.309 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.093 276.635 277.133 277.591 278.012 278.405 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.241 276.769 277.253 277.703 278.116 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.381 276.899 277.373 277.809 278.218 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.972 276.521 277.025 277.489 277.917 278.314 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.122 276.658 277.149 277.602 278.022 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.266 276.79 277.271 277.715 278.126 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.852 276.41 276.921 277.39 277.824 278.227 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.005 276.548 277.047 277.507 277.933 278.328 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.153 276.685 277.173 277.623 278.038 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.299 276.816 277.293 277.733 278.142 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.886 276.438 276.945 277.413 277.844 278.243 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.036 276.576 277.071 277.527 277.949 278.341 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.183 276.71 277.194 277.64 278.054 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.326 276.84 277.314 277.751 278.156 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.916 276.464 276.968 277.431 277.859 278.255 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.064 276.6 277.091 277.544 277.963 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84649 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95109 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0528 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.77119 10.1526 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87397 10.2549 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97676 10.3574 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0796 10.4622 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80149 10.1824 10.5631 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90448 10.2852 10.6654 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0074 10.388 10.768 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1104 10.4908 10.8705 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.83236 10.2132 10.5935 10.973 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93543 10.3162 10.6962 11.0755 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0385 10.419 10.7988 11.178 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.76048 10.1415 10.5219 10.9015 11.2805 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.8637 10.2446 10.6247 11.0041 11.3829 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.871 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.821 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.775 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.879 292.731 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.832 292.687 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.784 292.643 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.739 292.601 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.843 292.695 292.56 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.796 292.652 292.521 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.751 292.61 292.482 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.707 292.57 292.444 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.812 292.664 292.53 292.408 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.766 292.623 292.492 292.373 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.722 292.581 292.453 292.337 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.829 292.677 292.541 292.417 292.304 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.784 292.638 292.503 292.38 292.269 + + + + + + 5000 + 5000 + + 1.56418 1.7238 1.95023 2.22302 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.59921 1.77927 2.02001 2.30248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.64036 1.83858 2.09237 2.38358 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.68673 1.90188 2.16697 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.73826 1.96893 2.24457 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.79465 2.03922 2.3243 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.85529 2.11248 2.40619 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.92006 2.18857 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.98817 2.26722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.05985 2.34849 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.13391 2.43022 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.21081 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.28925 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.37021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 212.152 224.705 234.751 242.531 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 215.781 227.666 237.053 244.303 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 219.241 230.416 239.192 245.95 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 222.477 232.991 241.168 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 225.551 235.405 243.032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 228.451 237.664 244.772 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 231.172 239.77 246.395 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 233.714 241.732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 236.098 243.575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 238.324 245.295 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 240.386 246.879 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 242.311 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 244.085 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 245.753 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.40295 2.74686 3.10058 3.46299 3.8311 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.49413 2.8407 3.19795 3.5624 3.93286 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.24935 2.58532 2.93538 3.2946 3.66048 4.03079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.3376 2.67833 3.03122 3.39239 3.75982 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.42791 2.7724 3.12787 3.49114 3.86028 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.51944 2.86736 3.22549 3.59004 3.95886 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.27427 2.61247 2.96345 3.3232 3.68815 4.05891 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.36407 2.70622 3.05997 3.42187 3.78801 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.45548 2.79987 3.156 3.52014 3.88692 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.54709 2.89533 3.25339 3.61692 3.9862 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.30163 2.64076 2.99104 3.35034 3.71608 4.08635 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.39159 2.73378 3.08723 3.44885 3.81579 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.48317 2.82848 3.18494 3.54964 3.91573 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.23876 2.57467 2.92501 3.28395 3.65027 4.01604 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.32768 2.66866 3.02071 3.38043 3.74737 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.41976 2.76383 3.11715 3.47907 3.84666 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.51108 2.85842 3.2156 3.57957 3.9469 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.60439 2.95394 3.31255 3.67852 4.04795 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.69663 3.04943 3.41044 3.77747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.79135 3.14687 3.51004 3.8768 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.88814 3.24581 3.60819 3.97695 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.9833 3.34266 3.70763 4.0775 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.07929 3.4408 3.80732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 316.046 311.889 308.695 306.162 304.117 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 314.798 310.942 307.938 305.553 303.614 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 318.359 313.655 310.056 307.238 304.986 303.155 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 316.958 312.582 309.221 306.575 304.446 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 315.652 311.585 308.436 305.945 303.93 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 314.435 310.651 307.699 305.354 303.456 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 317.925 313.306 309.776 307.011 304.802 302.996 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 316.542 312.256 308.956 306.356 304.274 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 315.254 311.289 308.201 305.749 303.779 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 314.08 310.376 307.483 305.183 303.308 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 317.487 312.972 309.527 306.815 304.64 302.861 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 316.144 311.962 308.734 306.179 304.122 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 314.897 311.012 307.982 305.566 303.632 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 318.526 313.757 310.109 307.267 304.991 303.168 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 317.105 312.672 309.283 306.62 304.473 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 315.77 311.664 308.504 305.993 303.965 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 314.558 310.734 307.76 305.397 303.487 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 313.423 309.87 307.082 304.843 303.024 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 312.389 309.057 306.433 304.321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 311.404 308.288 305.816 303.825 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 310.471 307.553 305.239 303.349 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 309.621 306.882 304.691 302.898 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 308.822 306.244 304.17 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.2605 4.62548 4.99656 5.36443 5.73941 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.35787 4.72387 5.09397 5.46918 5.84033 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.09031 4.4551 4.82306 5.19466 5.5692 5.94262 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.18842 4.55462 4.92307 5.29713 5.66919 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.28671 4.6525 5.02302 5.39393 5.76847 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.38322 4.75102 5.12167 5.4924 5.86705 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.11755 4.48245 4.84906 5.22055 5.59402 5.96761 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.21425 4.58044 4.9499 5.32099 5.69363 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.31151 4.67997 5.04882 5.42229 5.79427 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.04625 4.41021 4.77757 5.148 5.52081 5.89503 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.14357 4.50842 4.87683 5.24795 5.6212 5.99605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.24142 4.60735 4.97661 5.34838 5.72207 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.33968 4.70657 5.07655 5.44893 5.82314 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.07421 4.43823 4.80613 5.17686 5.54977 5.92428 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.17254 4.53936 4.90704 5.27724 5.65066 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.27072 4.63826 5.00592 5.37791 5.75181 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.3688 4.73597 5.10615 5.47871 5.85299 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.10435 4.46796 4.83567 5.20655 5.5796 5.95431 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.20149 4.56675 4.93565 5.30711 5.68064 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.2995 4.66607 5.03572 5.40791 5.78187 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.39825 4.76568 5.1361 5.5088 5.88321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.13251 4.49729 4.86558 5.23668 5.60994 5.98472 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.23072 4.59658 4.96576 5.33747 5.71115 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 264.671 266.44 267.968 269.267 270.42 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 265.167 266.865 268.325 269.601 270.697 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 263.721 265.642 267.273 268.678 269.904 270.971 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 264.267 266.105 267.668 269.028 270.199 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 264.79 266.542 268.048 269.343 270.479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 265.279 266.963 268.407 269.652 270.751 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 263.867 265.76 267.363 268.754 269.962 271.018 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 264.401 266.214 267.762 269.094 270.254 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 264.914 266.656 268.133 269.423 270.54 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 263.453 265.407 267.066 268.493 269.732 270.817 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 264.012 265.88 267.471 268.841 270.034 271.082 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 264.548 266.332 267.857 269.177 270.329 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 265.058 266.768 268.234 269.504 270.613 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 263.622 265.548 267.184 268.591 269.815 270.888 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 264.175 266.023 267.588 268.938 270.118 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 264.702 266.469 267.967 269.27 270.407 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 265.202 266.888 268.334 269.589 270.688 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 263.791 265.684 267.298 268.689 269.897 270.959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 264.327 266.141 267.691 269.029 270.195 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 264.842 266.58 268.067 269.355 270.48 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 265.333 266.998 268.429 269.67 270.757 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 263.93 265.804 267.4 268.775 269.971 271.021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 264.462 266.254 267.785 269.108 270.262 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.09385 6.47612 6.85877 7.24302 7.62227 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1971 6.58356 6.9623 7.34475 7.72437 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92056 6.30221 6.68737 7.06479 7.4436 7.82623 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02475 6.40297 6.78964 7.16889 7.54713 7.92825 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1236 6.50566 6.88894 7.2683 7.64883 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22504 6.60762 6.98803 7.36957 7.75153 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.94585 6.32906 6.70878 7.09036 7.47243 7.85436 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04809 6.42958 6.81131 7.19324 7.57524 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.151 6.53251 6.91423 7.29619 7.67815 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25374 6.63546 7.01726 7.39922 7.78111 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97515 6.35668 6.73846 7.12039 7.50219 7.88404 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07808 6.45964 6.84149 7.22339 7.60531 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18107 6.56273 6.94463 7.32658 7.70837 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.90281 6.28418 6.66578 7.04778 7.42968 7.81147 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00595 6.38738 6.76911 7.15098 7.53281 7.9146 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10906 6.49057 6.87229 7.25419 7.63601 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21222 6.59384 6.97556 7.35743 7.7392 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93404 6.31535 6.69703 7.07886 7.46071 7.84248 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03716 6.4186 6.80035 7.18216 7.56396 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14042 6.52194 6.90363 7.28544 7.66726 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.2436 6.62519 7.007 7.38885 7.77056 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.96555 6.3469 6.72853 7.11033 7.49215 7.87387 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.06872 6.45019 6.8319 7.21373 7.59557 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.453 296.846 296.312 295.838 295.419 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.269 296.675 296.164 295.706 295.301 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.731 297.087 296.515 296.025 295.587 295.189 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.535 296.922 296.367 295.888 295.463 295.078 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.358 296.758 296.227 295.762 295.347 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.184 296.602 296.093 295.638 295.232 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.65 297.009 296.452 295.957 295.517 295.122 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.464 296.849 296.307 295.825 295.398 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.284 296.688 296.164 295.698 295.284 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.109 296.535 296.027 295.576 295.172 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.575 296.943 296.386 295.893 295.455 295.065 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.391 296.779 296.242 295.766 295.341 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.214 296.624 296.103 295.641 295.228 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.693 297.044 296.473 295.968 295.52 295.121 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.507 296.879 296.327 295.838 295.404 295.015 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.326 296.72 296.187 295.713 295.291 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.152 296.567 296.049 295.59 295.181 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.627 296.983 296.417 295.917 295.473 295.075 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.443 296.822 296.274 295.789 295.356 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.266 296.664 296.133 295.664 295.246 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.093 296.513 296.001 295.545 295.137 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 297.566 296.928 296.365 295.868 295.426 295.032 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 297.381 296.764 296.222 295.741 295.313 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00067 8.37694 8.75434 9.13104 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10198 8.47744 8.85542 9.23257 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82339 8.20052 8.57839 8.95602 9.33418 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92436 8.3021 8.67984 9.05795 9.4364 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02637 8.40384 8.78158 9.16701 9.54274 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12815 8.50523 8.88365 9.26488 9.64399 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8514 8.22905 8.60695 8.98582 9.36353 9.7422 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95307 8.33169 8.71073 9.08991 9.4661 9.8432 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05611 8.43396 8.81162 9.19132 9.5679 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15651 8.53629 8.91335 9.28976 9.66995 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88054 8.25829 8.63606 9.01403 9.39156 9.76864 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9823 8.36008 8.73783 9.11545 9.49299 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08415 8.46199 8.8397 9.21727 9.59466 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80846 8.18606 8.56381 8.94154 9.31913 9.6966 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91026 8.2879 8.66577 9.04343 9.42098 9.79826 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01217 8.38988 8.76765 9.14525 9.52277 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11409 8.49177 8.86956 9.24721 9.62464 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8385 8.21611 8.59377 8.97153 9.3491 9.72648 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94048 8.3181 8.69582 9.0735 9.45099 9.82837 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04249 8.42015 8.79787 9.17557 9.55302 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.14455 8.52223 8.89995 9.27755 9.65502 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86904 8.24665 8.62437 9.00204 9.3796 9.75693 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97115 8.34876 8.72649 9.10415 9.48164 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.217 275.794 276.324 276.814 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.368 275.931 276.451 276.931 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.911 275.514 276.067 276.576 277.045 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.072 275.661 276.2 276.698 277.16 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.229 275.803 276.332 276.829 277.277 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.384 275.944 276.461 276.941 277.384 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.935 275.533 276.081 276.587 277.055 277.489 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.096 275.681 276.219 276.715 277.169 277.592 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.257 275.826 276.35 276.835 277.281 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.409 275.968 276.479 276.95 277.392 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.966 275.559 276.103 276.605 277.068 277.496 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.128 275.708 276.239 276.728 277.181 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.286 275.85 276.37 276.85 277.294 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.836 275.44 275.992 276.5 276.969 277.403 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.004 275.591 276.13 276.625 277.085 277.512 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.163 275.737 276.265 276.751 277.201 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.321 275.881 276.396 276.871 277.312 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.875 275.472 276.019 276.524 276.99 277.422 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.038 275.621 276.156 276.649 277.105 277.528 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.197 275.766 276.289 276.771 277.218 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.351 275.907 276.418 276.891 277.329 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.908 275.501 276.045 276.545 277.008 277.437 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.068 275.648 276.179 276.668 277.121 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.86676 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97122 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0728 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.79155 10.1725 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89419 10.2746 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99681 10.377 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0996 10.4816 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.82179 10.2022 10.5825 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.92464 10.3049 10.6846 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0274 10.4076 10.7871 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1303 10.5102 10.8894 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.85262 10.233 10.6128 10.9919 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.9556 10.3358 10.7154 11.0943 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0585 10.4385 10.8179 11.1967 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.78087 10.1614 10.5413 10.9205 11.299 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88398 10.2643 10.644 11.023 11.4013 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.708 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.65 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.595 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.722 293.543 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.666 293.491 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.61 293.44 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.557 293.39 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.683 293.504 293.341 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.627 293.454 293.295 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.574 293.404 293.249 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.522 293.356 293.205 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.648 293.471 293.309 293.162 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.595 293.422 293.263 293.118 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.542 293.372 293.218 293.078 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.671 293.491 293.326 293.175 293.036 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.619 293.441 293.279 293.131 292.997 + + + + + + 5000 + 5000 + + 1.55006 1.71098 1.93889 2.21306 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.58541 1.76686 2.00906 2.29285 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.6269 1.82656 2.08179 2.37429 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.67364 1.89026 2.15677 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.72557 1.95771 2.23471 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.78236 2.02838 2.31479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.84339 2.10203 2.39699 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.90856 2.17846 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.97707 2.25748 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.04914 2.33909 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.12356 2.42112 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.20083 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.27961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.3609 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.4441 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 212.32 224.957 235.037 242.819 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 215.978 227.931 237.342 244.59 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 219.461 230.691 239.482 246.233 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 222.717 233.273 241.458 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 225.807 235.692 243.32 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 228.719 237.953 245.058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 231.45 240.06 246.678 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 233.998 242.022 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 236.386 243.862 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 238.613 245.58 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 240.677 247.16 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 242.6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 244.373 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 246.037 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 247.589 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.38844 2.73414 3.08925 3.45281 3.82187 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.48013 2.82839 3.18696 3.55249 3.92386 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.23391 2.57182 2.92345 3.28394 3.65084 4.02201 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.32272 2.6653 3.01965 3.38202 3.75044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.41356 2.75981 3.11667 3.48105 3.85113 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.5056 2.85516 3.21462 3.58022 3.94993 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.25897 2.59913 2.95163 3.31264 3.6786 4.05019 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.34937 2.69333 3.04854 3.41159 3.77869 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.44131 2.78739 3.14488 3.51014 3.87783 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.53342 2.88326 3.24261 3.60719 3.97732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.28654 2.62757 2.97934 3.33985 3.70658 4.07769 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.37706 2.72101 3.07587 3.43865 3.80653 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.46914 2.81612 3.17393 3.53973 3.9067 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.56113 2.91305 3.27325 3.64061 4.00722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.31274 2.65556 3.0091 3.37003 3.73795 4.10851 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.40536 2.75119 3.1059 3.46895 3.83748 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.49719 2.84619 3.20466 3.56971 3.93793 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.59097 2.94207 3.30194 3.66893 4.0392 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.68367 3.03791 3.40011 3.76811 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.7788 3.13568 3.49998 3.86767 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.876 3.23497 3.5984 3.96803 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.97153 3.33211 3.69808 4.06879 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.06786 3.43054 3.79802 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 315.475 311.37 308.222 305.731 303.722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 314.241 310.436 307.477 305.132 303.228 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 317.766 313.112 309.562 306.789 304.574 302.777 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 316.378 312.053 308.739 306.137 304.044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 315.085 311.07 307.967 305.517 303.538 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 313.882 310.148 307.241 304.936 303.073 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 317.335 312.767 309.286 306.565 304.394 302.621 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 315.966 311.731 308.479 305.92 303.875 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 314.692 310.777 307.736 305.324 303.39 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 313.532 309.878 307.029 304.768 302.927 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 316.902 312.438 309.041 306.372 304.234 302.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 315.573 311.441 308.26 305.747 303.726 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 314.34 310.504 307.52 305.145 303.244 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 313.214 309.615 306.817 304.58 302.789 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 316.525 312.142 308.801 306.181 304.071 302.354 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 315.204 311.148 308.035 305.565 303.572 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 314.005 310.231 307.302 304.978 303.103 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 312.884 309.379 306.636 304.435 302.649 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 311.863 308.579 305.997 303.922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 310.892 307.821 305.391 303.435 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 309.972 307.098 304.824 302.967 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 309.134 306.439 304.285 302.525 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 308.348 305.811 303.773 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.25613 4.62146 4.99286 5.361 5.73621 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.35358 4.71994 5.09033 5.46581 5.83719 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.08573 4.45092 4.81922 5.19111 5.5659 5.93954 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.18397 4.55054 4.9193 5.29365 5.66595 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.28236 4.64851 5.01934 5.39052 5.7653 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.37897 4.74712 5.11807 5.48905 5.86392 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.11301 4.47831 4.84524 5.21701 5.59074 5.96454 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.20982 4.57639 4.94616 5.31753 5.69041 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.30719 4.67602 5.04516 5.4189 5.79111 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.40599 4.77369 5.14441 5.51748 5.89193 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.13907 4.5043 4.87303 5.24445 5.61795 5.99301 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.23704 4.60333 4.9729 5.34493 5.71887 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.3354 4.70263 5.07291 5.44556 5.82 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.06963 4.43405 4.80229 5.1733 5.54647 5.9212 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.16808 4.53528 4.90327 5.27375 5.64742 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.26636 4.63427 5.00224 5.3745 5.74863 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.36454 4.73206 5.10255 5.47537 5.84987 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.09982 4.46381 4.83185 5.20301 5.57631 5.95124 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.19706 4.5627 4.93192 5.30365 5.67743 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.29518 4.66211 5.03206 5.40452 5.77871 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.39403 4.7618 5.13251 5.50547 5.88011 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.12801 4.49316 4.86178 5.23317 5.60668 5.98168 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.22632 4.59255 4.96205 5.33403 5.70795 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 264.834 266.593 268.111 269.401 270.546 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 265.328 267.014 268.465 269.732 270.821 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 263.89 265.799 267.419 268.816 270.033 271.093 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 264.433 266.259 267.812 269.164 270.326 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 264.953 266.694 268.189 269.475 270.604 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 265.438 267.111 268.546 269.783 270.874 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 264.035 265.916 267.509 268.891 270.091 271.14 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 264.565 266.367 267.905 269.229 270.381 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 265.076 266.806 268.274 269.555 270.664 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 265.565 267.214 268.632 269.862 270.939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 264.179 266.036 267.616 268.977 270.162 271.202 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 264.712 266.485 268 269.311 270.455 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 265.219 266.918 268.374 269.635 270.737 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 263.791 265.705 267.331 268.729 269.945 271.01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 264.341 266.178 267.732 269.073 270.245 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 264.865 266.621 268.109 269.403 270.532 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 265.362 267.037 268.474 269.72 270.812 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 263.96 265.841 267.444 268.826 270.026 271.08 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 264.493 266.295 267.835 269.164 270.321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 265.005 266.731 268.208 269.488 270.605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 265.492 267.147 268.568 269.8 270.88 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 264.098 265.96 267.546 268.911 270.099 271.143 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 264.626 266.407 267.928 269.242 270.388 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08785 6.4704 6.8533 7.23779 7.61725 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19118 6.57793 6.95691 7.33958 7.7194 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.91441 6.29638 6.68181 7.05946 7.43848 7.82132 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0187 6.3972 6.78415 7.16362 7.54208 7.92338 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11764 6.49997 6.88351 7.2631 7.64382 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21916 6.60202 6.98266 7.36443 7.74658 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93975 6.32325 6.70324 7.08505 7.46734 7.84947 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04207 6.42384 6.80584 7.18801 7.5702 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14507 6.52685 6.90882 7.29101 7.67317 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.24787 6.62987 7.01191 7.3941 7.7762 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96907 6.3509 6.73295 7.11511 7.49712 7.87916 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07209 6.45394 6.83604 7.21816 7.6003 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17515 6.55709 6.93925 7.32142 7.70341 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.89666 6.27834 6.66022 7.04246 7.42457 7.80656 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9999 6.38162 6.76361 7.14571 7.52775 7.90974 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10308 6.48487 6.86686 7.24898 7.63101 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.20632 6.58822 6.97019 7.35228 7.73425 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92793 6.30953 6.69148 7.07355 7.45562 7.83758 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03111 6.41285 6.79487 7.17692 7.55892 7.94081 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13446 6.51628 6.89821 7.28025 7.66227 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.23772 6.61958 7.00163 7.38371 7.76563 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.95943 6.34109 6.723 7.10503 7.48706 7.86898 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.0627 6.44446 6.82643 7.20848 7.59054 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.197 296.603 296.081 295.618 295.21 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.017 296.437 295.937 295.49 295.094 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.468 296.839 296.28 295.8 295.373 294.985 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.276 296.677 296.136 295.667 295.252 294.876 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.103 296.516 295.998 295.544 295.138 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.933 296.364 295.866 295.423 295.026 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.388 296.762 296.217 295.734 295.304 294.919 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.206 296.605 296.076 295.605 295.187 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.031 296.448 295.935 295.481 295.076 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.859 296.298 295.802 295.362 294.967 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.315 296.697 296.152 295.671 295.243 294.863 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.135 296.537 296.011 295.546 295.132 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.961 296.385 295.876 295.424 295.022 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.43 296.795 296.237 295.744 295.306 294.916 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.248 296.634 296.094 295.617 295.193 294.813 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.07 296.478 295.957 295.495 295.083 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.901 296.329 295.823 295.375 294.975 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.366 296.735 296.182 295.694 295.26 294.872 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.185 296.578 296.043 295.569 295.146 294.769 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.013 296.424 295.905 295.446 295.038 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.843 296.276 295.776 295.331 294.932 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 297.305 296.681 296.132 295.646 295.214 294.829 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 297.125 296.522 295.991 295.522 295.104 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9983 8.3747 8.75221 9.12901 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09965 8.47523 8.85332 9.23057 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82096 8.19822 8.5762 8.95395 9.33221 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92197 8.29983 8.6777 9.05591 9.43445 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02402 8.4016 8.77946 9.165 9.54082 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12582 8.50304 8.88156 9.2629 9.64209 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84898 8.22677 8.60478 8.98375 9.36157 9.74033 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95069 8.32943 8.70859 9.08787 9.46417 9.84136 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05377 8.43174 8.80951 9.18931 9.56599 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15421 8.5341 8.91127 9.28778 9.66807 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87814 8.25601 8.6339 9.01198 9.38961 9.76678 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97993 8.35784 8.7357 9.11343 9.49107 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08182 8.45979 8.8376 9.21527 9.59276 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80603 8.18376 8.56164 8.93947 9.31717 9.69473 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90787 8.28564 8.66362 9.04139 9.41903 9.79641 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00982 8.38765 8.76553 9.14324 9.52086 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11177 8.48958 8.86748 9.24522 9.62275 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83609 8.21382 8.59161 8.96947 9.34714 9.72461 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9381 8.31586 8.69368 9.07147 9.44906 9.82652 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04015 8.41793 8.79576 9.17357 9.55111 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.14225 8.52004 8.89787 9.27557 9.65314 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86664 8.24437 8.62222 8.99999 9.37765 9.75508 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96878 8.34652 8.72437 9.10212 9.47972 9.85709 NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.316 275.889 276.416 276.902 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.467 276.025 276.542 277.018 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.013 275.611 276.161 276.666 277.132 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.173 275.757 276.292 276.787 277.245 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.328 275.899 276.424 276.917 277.362 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.482 276.038 276.551 277.028 277.469 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.036 275.629 276.174 276.677 277.141 277.572 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.196 275.777 276.312 276.803 277.255 277.675 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.355 275.921 276.441 276.923 277.366 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.507 276.062 276.569 277.037 277.476 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.067 275.656 276.196 276.694 277.154 277.579 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.228 275.803 276.331 276.816 277.266 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.384 275.945 276.461 276.937 277.379 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.938 275.537 276.086 276.59 277.056 277.487 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.104 275.687 276.222 276.714 277.171 277.595 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.262 275.832 276.356 276.84 277.286 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.419 275.976 276.486 276.958 277.396 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.976 275.569 276.113 276.614 277.077 277.506 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.138 275.717 276.249 276.738 277.191 277.611 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.296 275.861 276.38 276.859 277.303 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.449 276.001 276.509 276.978 277.413 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.009 275.598 276.138 276.635 277.094 277.52 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.168 275.743 276.271 276.757 277.207 277.624 NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.86249 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.96698 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0685 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1683 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88992 10.2705 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99258 10.3729 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0954 10.4775 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81751 10.1981 10.5784 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.92039 10.3008 10.6805 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0232 10.4035 10.783 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1261 10.5061 10.8854 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84835 10.2288 10.6087 10.9879 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95135 10.3317 10.7113 11.0903 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0543 10.4344 10.8139 11.1927 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1572 10.5372 10.9165 11.2951 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87971 10.2601 10.6399 11.019 11.3974 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.539 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.482 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.429 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.379 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.497 293.328 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.442 293.278 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.392 293.23 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.513 293.34 293.183 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.459 293.291 293.138 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.407 293.243 293.094 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.357 293.196 293.05 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.479 293.307 293.151 293.009 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.427 293.26 293.107 292.967 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.376 293.212 293.063 292.927 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.326 293.167 293.021 292.887 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.45 293.278 293.121 292.978 292.849 + + + + + + 5000 + 5000 + + 0.823021 1.09759 1.42808 1.78343 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 0.888617 1.18332 1.52228 1.88183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 0.96129 1.27114 1.61752 1.98058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.03882 1.36153 1.71324 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.12115 1.45411 1.81074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.20727 1.54851 1.90917 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.29632 1.64431 2.00837 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.38777 1.74128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.48123 1.83971 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.57669 1.93935 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.67273 2.03806 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.7702 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.8675 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.9663 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 229.927 246.892 256.583 262.547 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 235.513 250.034 258.465 263.767 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 240.301 252.73 260.117 264.858 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 244.336 255.069 261.572 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 247.82 257.131 262.893 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 250.834 258.945 264.076 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 253.444 260.552 265.148 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 255.718 261.987 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 257.716 263.276 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 259.472 264.438 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 261.029 265.472 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 262.413 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 263.646 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 264.758 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.09176 2.47755 2.86322 3.25088 3.63943 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.19555 2.58086 2.96816 3.35636 3.74618 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 1.9148 2.29829 2.68439 3.07176 3.46011 3.84868 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.0172 2.40205 2.78857 3.17612 3.56482 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.12068 2.50607 2.89307 3.28114 3.67038 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.22449 2.61035 2.99798 3.3859 3.77363 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 1.94398 2.3288 2.71514 3.10249 3.48949 3.87824 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.04776 2.43307 2.81985 3.20766 3.59453 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.15217 2.53634 2.92331 3.3119 3.69832 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.2555 2.64088 3.02782 3.41429 3.80226 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 1.97559 2.36027 2.74503 3.13137 3.51878 3.9068 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.07908 2.46333 2.84903 3.23614 3.62359 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.18311 2.56744 2.95418 3.34299 3.72837 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.90187 2.28599 2.67295 3.06023 3.44926 3.83319 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.00515 2.3908 2.77676 3.16306 3.55144 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.1106 2.49603 2.88093 3.26791 3.65574 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.21408 2.59983 2.98672 3.37426 3.76062 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.31864 2.70384 3.0903 3.47866 3.86625 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.42119 2.80736 3.19459 3.58269 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.52569 2.91236 3.3002 3.68688 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.63172 3.0186 3.40406 3.79169 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.7353 3.12202 3.50885 3.89664 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.83915 3.22644 3.61367 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 296.341 294.627 293.39 292.453 291.725 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 295.807 294.246 293.101 292.228 291.541 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 297.35 295.332 293.897 292.835 292.02 291.376 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 296.724 294.891 293.575 292.589 291.826 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 296.161 294.491 293.278 292.357 291.639 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 295.648 294.121 292.996 292.142 291.471 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 297.15 295.179 293.782 292.742 291.943 291.309 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 296.546 294.756 293.468 292.5 291.752 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 295.995 294.372 293.182 292.279 291.579 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 295.503 294.016 292.916 292.076 291.413 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 296.971 295.054 293.691 292.671 291.881 291.257 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 296.39 294.647 293.388 292.438 291.699 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 295.856 294.272 293.107 292.218 291.528 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 297.454 295.387 293.923 292.841 292.008 291.364 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 296.824 294.944 293.603 292.604 291.827 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 296.246 294.544 293.315 292.378 291.648 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 295.734 294.176 293.033 292.162 291.481 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 295.262 293.839 292.782 291.964 291.319 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 294.842 293.528 292.541 291.775 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 294.447 293.234 292.315 291.6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 294.078 292.958 292.106 291.431 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 293.747 292.708 291.907 291.272 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 293.437 292.47 291.719 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.05467 4.43801 4.82492 5.20613 5.59297 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.15723 4.54087 4.9261 5.31444 5.69679 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 3.87468 4.25951 4.64438 5.03047 5.41762 5.80194 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 3.97859 4.3639 4.74854 5.13665 5.52073 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.08242 4.46643 4.85252 5.23676 5.62294 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.18412 4.56941 4.95496 5.33847 5.72437 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 3.90383 4.28843 4.67164 5.05749 5.4434 5.82776 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.00618 4.39124 4.77674 5.16153 5.54606 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.1089 4.49548 4.87955 5.26633 5.6497 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 3.82848 4.21277 4.59735 4.98252 5.36806 5.75341 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 3.93172 4.31601 4.70091 5.08616 5.47163 5.85718 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.03529 4.41974 4.80475 5.19009 5.57561 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.13893 4.52355 4.9087 5.29414 5.67969 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 3.85857 4.24267 4.62751 5.01276 5.39824 5.78371 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 3.96275 4.34877 4.73266 5.11676 5.50231 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.06646 4.45239 4.83553 5.22093 5.60648 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.16984 4.55449 4.93961 5.32507 5.7106 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 3.89079 4.27407 4.6585 5.04373 5.42919 5.81476 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 3.99356 4.37767 4.76263 5.14787 5.53336 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.09698 4.48159 4.86661 5.25208 5.63757 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.20085 4.58557 4.97078 5.35625 5.74179 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 3.92052 4.30482 4.68969 5.07497 5.46051 5.84604 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.02436 4.40884 4.79387 5.17921 5.56474 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.644 276.567 277.355 278.022 278.609 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.9 276.783 277.534 278.185 278.746 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 275.137 276.143 276.988 277.711 278.337 278.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 275.42 276.382 277.19 277.887 278.484 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 275.694 276.605 277.38 278.043 278.623 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 275.945 276.818 277.562 278.2 278.759 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 275.202 276.195 277.024 277.737 278.354 278.89 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 275.482 276.428 277.226 277.908 278.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 275.75 276.654 277.416 278.075 278.644 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 274.982 276.008 276.868 277.6 278.231 278.782 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 275.278 276.254 277.074 277.776 278.384 278.917 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 275.557 276.485 277.272 277.948 278.533 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 275.826 276.712 277.464 278.111 278.674 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 275.075 276.081 276.925 277.645 278.27 278.815 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 275.365 276.329 277.135 277.825 278.424 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 275.644 276.56 277.328 277.992 278.57 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 275.903 276.774 277.516 278.156 278.713 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 275.165 276.154 276.986 277.696 278.31 278.848 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 275.447 276.39 277.186 277.868 278.46 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 275.716 276.616 277.378 278.034 278.605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 275.972 276.831 277.563 278.193 278.743 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 275.24 276.216 277.036 277.737 278.345 278.876 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 275.514 276.445 277.231 277.906 278.492 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96831 6.35656 6.74455 7.13355 7.51709 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07333 6.46568 6.84961 7.2366 7.6204 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.79222 6.18021 6.57114 6.95342 7.33665 7.72339 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.89835 6.28256 6.67477 7.05884 7.44141 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9989 6.38689 6.77542 7.15953 7.54425 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10198 6.49033 6.87585 7.26197 7.64809 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.81818 6.20769 6.59295 6.97949 7.36602 7.75201 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92217 6.30973 6.69687 7.08368 7.47001 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0268 6.41423 6.80118 7.18783 7.57402 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13121 6.51862 6.90551 7.29204 7.67809 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.84796 6.23573 6.62307 7.00995 7.39619 7.78203 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.95266 6.34028 6.72748 7.11416 7.5004 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05733 6.44481 6.83194 7.21857 7.60457 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.77427 6.16205 6.54933 6.93639 7.32283 7.7087 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87918 6.26682 6.65405 7.04083 7.42707 7.81286 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.98399 6.37148 6.75854 7.14521 7.53135 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08878 6.47622 6.86313 7.24964 7.63558 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.80587 6.19354 6.58084 6.96767 7.35403 7.73988 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9107 6.29827 6.6855 7.07221 7.45841 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01561 6.40313 6.79012 7.17668 7.56275 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12043 6.50777 6.8947 7.28119 7.66709 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.8376 6.22526 6.61251 6.99932 7.38562 7.77139 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.94253 6.33012 6.71724 7.1039 7.49009 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.645 289.494 289.366 289.257 289.164 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.592 289.447 289.324 289.219 289.129 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.701 289.539 289.401 289.285 289.185 289.098 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.645 289.493 289.358 289.247 289.15 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.595 289.447 289.319 289.212 289.119 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.547 289.405 289.283 289.177 289.088 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.661 289.498 289.362 289.246 289.145 289.059 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.608 289.455 289.324 289.212 289.114 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.56 289.412 289.286 289.176 289.084 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.512 289.37 289.25 289.146 289.056 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.627 289.468 289.332 289.215 289.114 289.027 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.578 289.425 289.294 289.182 289.085 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.532 289.384 289.259 289.15 289.057 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.652 289.487 289.346 289.225 289.121 289.03 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.604 289.445 289.309 289.191 289.091 289.004 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.555 289.402 289.272 289.161 289.064 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.51 289.364 289.238 289.129 289.035 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.633 289.467 289.325 289.203 289.1 289.011 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.582 289.424 289.29 289.174 289.072 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.536 289.384 289.253 289.141 289.044 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.489 289.343 289.218 289.112 289.018 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 289.608 289.445 289.305 289.185 289.081 288.991 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 289.558 289.402 289.267 289.151 289.052 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90302 8.28516 8.66786 9.04947 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00598 8.38712 8.77029 9.15224 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.72283 8.10604 8.4895 8.87223 9.25506 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82551 8.20919 8.59235 8.97546 9.35847 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92914 8.31244 8.6955 9.08594 9.46611 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03262 8.41535 8.79895 9.18495 9.56853 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.75138 8.13509 8.5185 8.90243 9.2848 9.6678 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.85477 8.23933 8.62377 9.0079 9.38863 9.76988 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95956 8.34315 8.72605 9.11058 9.4916 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06157 8.447 8.82914 9.21026 9.59483 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.78118 8.16494 8.54818 8.93119 9.31334 9.69462 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88467 8.26832 8.65141 9.0339 9.41595 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9882 8.37173 8.75465 9.13702 9.51882 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.70803 8.09174 8.47507 8.8579 9.24016 9.6219 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.81165 8.19523 8.5785 8.96111 9.34322 9.72473 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91523 8.29874 8.68181 9.06428 9.44627 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01882 8.40217 8.78512 9.1675 9.5493 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.7388 8.12245 8.50562 8.88843 9.27065 9.65232 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84249 8.22601 8.60912 8.99174 9.37376 9.75531 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94618 8.3296 8.71257 9.09509 9.47697 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04989 8.43317 8.81602 9.19834 9.58015 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.76993 8.15356 8.53677 8.91946 9.30163 9.6832 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87374 8.25722 8.6403 9.02284 9.40485 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.119 281.436 281.729 281.998 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.198 281.506 281.794 282.058 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.943 281.273 281.577 281.857 282.118 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.026 281.349 281.646 281.921 282.177 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.109 281.424 281.716 281.989 282.237 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.191 281.497 281.782 282.048 282.294 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.941 281.268 281.57 281.849 282.108 282.348 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.027 281.348 281.643 281.915 282.167 282.403 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.112 281.423 281.711 281.979 282.227 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.192 281.499 281.78 282.04 282.284 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.948 281.273 281.571 281.846 282.102 282.34 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.035 281.352 281.642 281.912 282.163 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.119 281.428 281.714 281.978 282.223 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.873 281.202 281.505 281.783 282.041 282.282 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.962 281.282 281.576 281.85 282.104 282.341 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.047 281.361 281.65 281.917 282.165 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.133 281.438 281.72 281.981 282.225 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.888 281.214 281.513 281.79 282.047 282.285 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.976 281.295 281.587 281.857 282.108 282.342 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.061 281.371 281.657 281.923 282.17 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.143 281.448 281.728 281.987 282.228 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.901 281.224 281.521 281.795 282.049 282.287 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.987 281.303 281.593 281.861 282.111 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.77886 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88395 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.98596 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.70334 10.0861 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80648 10.1888 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90965 10.2916 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0129 10.3967 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.73372 10.116 10.498 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.83709 10.2192 10.6005 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94035 10.3223 10.7034 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0436 10.4253 10.8062 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.76462 10.1468 10.5283 10.909 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.86804 10.2501 10.6314 11.0118 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97146 10.3533 10.7343 11.1146 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.69239 10.0748 10.4564 10.8373 11.2173 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.79593 10.1781 10.5595 10.9402 11.32 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.862 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.855 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.849 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.842 288.842 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.837 288.837 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.83 288.831 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.825 288.826 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.821 288.82 288.822 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.816 288.815 288.818 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.811 288.811 288.815 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.807 288.808 288.811 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.803 288.801 288.803 288.808 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.798 288.798 288.801 288.805 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.795 288.794 288.796 288.801 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.792 288.79 288.791 288.795 288.8 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.788 288.787 288.787 288.79 288.796 + + + + + + 5000 + 5000 + + 1.06393 1.28775 1.57858 1.9058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.11513 1.36135 1.66423 1.99819 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.1738 1.43834 1.75165 2.0913 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.23792 1.5186 1.84029 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.30764 1.60206 1.93132 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.38207 1.68804 2.02374 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.46029 1.77614 2.11744 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.54189 1.86621 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.62642 1.95819 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.71353 2.05198 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.8023 2.14541 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.8928 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.98412 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.07718 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 221.083 236.923 247.534 254.693 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 225.972 240.231 249.738 256.21 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 230.397 243.161 251.717 257.594 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 234.333 245.795 253.493 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 237.887 248.169 255.122 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 241.084 250.31 256.607 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 243.954 252.246 257.964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 246.528 253.997 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 248.843 255.597 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 250.936 257.055 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 252.808 258.366 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 254.519 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 256.045 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 257.452 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.16755 2.54243 2.92005 3.30146 3.68506 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.26803 2.64332 3.0231 3.40546 3.79057 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 1.99688 2.36773 2.74461 3.12497 3.50784 3.892 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.09547 2.46874 2.84672 3.22771 3.61122 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.19545 2.57016 2.94924 3.33121 3.71557 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.29601 2.67213 3.05238 3.43456 3.81768 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.02498 2.39742 2.7747 3.15517 3.53679 3.92121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.12496 2.49894 2.87737 3.25878 3.64061 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.22594 2.59979 2.979 3.36155 3.7432 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.32621 2.70203 3.08175 3.46259 3.84605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.0555 2.42809 2.80404 3.18368 3.56579 3.94954 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.15534 2.52859 2.90614 3.28695 3.66939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.25612 2.63032 3.00942 3.39229 3.773 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.98474 2.35595 2.73352 3.11376 3.49724 3.87677 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.08416 2.45804 2.83536 3.21503 3.59814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.18607 2.56065 2.93755 3.31834 3.70128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.28633 2.66216 3.0416 3.42333 3.80504 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.38799 2.76401 3.14348 3.52637 3.90959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.48783 2.86552 3.24624 3.62922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.58986 2.96864 3.35037 3.7322 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.69351 3.07307 3.45285 3.83591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.79497 3.17487 3.55634 3.9398 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.89686 3.27776 3.65993 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 303.661 300.901 298.874 297.315 296.088 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 302.816 300.288 298.4 296.942 295.783 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 305.261 302.051 299.72 297.964 296.599 295.51 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 304.283 301.346 299.195 297.556 296.272 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 303.388 300.694 298.702 297.172 295.964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 302.567 300.096 298.244 296.815 295.68 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 304.958 301.818 299.539 297.818 296.48 295.408 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 303.997 301.129 299.023 297.419 296.165 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 303.121 300.507 298.553 297.049 295.868 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 302.334 299.922 298.109 296.708 295.59 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 304.661 301.603 299.385 297.7 296.382 295.326 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 303.735 300.946 298.89 297.314 296.074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 302.891 300.335 298.421 296.941 295.783 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 305.4 302.127 299.757 297.981 296.596 295.509 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 304.408 301.418 299.239 297.585 296.283 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 303.494 300.761 298.751 297.203 295.984 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 302.674 300.166 298.294 296.846 295.699 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 301.921 299.614 297.871 296.51 295.427 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 301.238 299.103 297.475 296.199 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 300.601 298.621 297.098 295.9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 300.001 298.164 296.749 295.618 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 299.459 297.751 296.418 295.35 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 298.956 297.359 296.106 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.10807 4.48638 4.86899 5.24658 5.63024 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.20923 4.58805 4.96915 5.35392 5.73325 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 3.93083 4.3101 4.69034 5.0725 5.45627 5.83766 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.0331 4.41317 4.79341 5.17771 5.55853 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.13545 4.51444 4.89627 5.27689 5.65995 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.23568 4.61619 4.9977 5.37776 5.76063 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 3.95943 4.3386 4.71728 5.09923 5.48178 5.86323 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.06023 4.44009 4.82122 5.20229 5.58362 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.16143 4.54303 4.92295 5.30615 5.68645 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 3.88516 4.26385 4.64374 5.02491 5.40701 5.78935 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 3.98682 4.36575 4.74611 5.12752 5.50969 5.89238 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.08876 4.4681 4.84885 5.23054 5.61288 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.19094 4.57072 4.95173 5.33361 5.7161 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 3.91468 4.29322 4.6734 5.05471 5.43684 5.81939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.01718 4.39794 4.77744 5.15778 5.54005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.11942 4.50028 4.87919 5.26095 5.64339 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.22129 4.60116 4.98223 5.36423 5.74674 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 3.94627 4.32414 4.70401 5.08535 5.46745 5.8501 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.04748 4.42641 4.807 5.18851 5.57078 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.14941 4.52906 4.9099 5.29179 5.67419 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.25185 4.63185 5.01305 5.39508 5.77763 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 3.97555 4.35447 4.73481 5.11624 5.49848 5.88114 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.07782 4.45718 4.83792 5.21957 5.60191 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.758 272.999 274.06 274.958 275.75 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.103 273.29 274.304 275.185 275.94 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 271.08 272.434 273.574 274.547 275.39 276.123 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 271.466 272.756 273.844 274.784 275.591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 271.831 273.059 274.106 275.001 275.782 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 272.175 273.351 274.352 275.21 275.965 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 271.177 272.51 273.628 274.59 275.423 276.148 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 271.553 272.826 273.903 274.823 275.622 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 271.915 273.134 274.16 275.049 275.816 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 270.885 272.263 273.42 274.408 275.261 276.005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 271.278 272.591 273.7 274.648 275.469 276.187 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 271.658 272.909 273.968 274.877 275.668 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 272.016 273.209 274.226 275.102 275.864 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 271.004 272.361 273.503 274.475 275.316 276.05 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 271.398 272.694 273.781 274.713 275.523 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 271.768 273.004 274.044 274.943 275.722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 272.12 273.296 274.297 275.16 275.914 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 271.127 272.457 273.58 274.541 275.373 276.099 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 271.505 272.776 273.853 274.775 275.575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 271.868 273.082 274.113 274.999 275.771 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 272.213 273.372 274.361 275.215 275.96 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 271.225 272.541 273.651 274.6 275.422 276.14 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 271.599 272.854 273.915 274.827 275.619 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99855 6.38551 6.77232 7.16025 7.54287 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10317 6.49423 6.87703 7.26301 7.64593 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.82307 6.20966 6.59936 6.98057 7.3628 7.74864 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92878 6.31166 6.70265 7.08567 7.4673 7.85153 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02896 6.41565 6.80301 7.18608 7.56988 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13165 6.51873 6.90314 7.28826 7.67348 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.84888 6.23701 6.62106 7.00652 7.39205 7.77714 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.95251 6.33872 6.72465 7.11039 7.49578 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05672 6.44286 6.82868 7.21431 7.59957 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1608 6.54696 6.93272 7.31823 7.70337 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87858 6.26496 6.65107 7.03687 7.42216 7.80712 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.98288 6.36917 6.7552 7.14083 7.52611 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08719 6.47339 6.85937 7.24497 7.63005 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.80521 6.19157 6.57759 6.96353 7.34898 7.73396 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.90972 6.29599 6.68202 7.06772 7.45299 7.8379 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01418 6.40036 6.78624 7.17184 7.55703 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1186 6.50475 6.89051 7.27602 7.66106 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.83672 6.22301 6.60909 6.99482 7.38018 7.76511 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.94124 6.32745 6.71344 7.09906 7.48429 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04575 6.43195 6.81779 7.20332 7.58845 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15024 6.53632 6.92211 7.30755 7.69254 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.86847 6.25472 6.64073 7.02644 7.41176 7.79665 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.97301 6.35924 6.74518 7.13077 7.516 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.341 292.031 291.76 291.52 291.314 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.241 291.938 291.679 291.45 291.252 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.476 292.144 291.853 291.606 291.386 291.191 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.371 292.055 291.773 291.533 291.321 291.133 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.276 291.969 291.699 291.466 291.26 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.182 291.885 291.627 291.4 291.201 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.421 292.09 291.807 291.557 291.336 291.142 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.323 292.006 291.729 291.487 291.275 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.226 291.92 291.655 291.422 291.216 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.135 291.841 291.584 291.357 291.157 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.374 292.047 291.762 291.513 291.296 291.103 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.276 291.962 291.688 291.448 291.236 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.184 291.881 291.616 291.383 291.178 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.432 292.096 291.803 291.546 291.322 291.123 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.333 292.009 291.727 291.48 291.263 291.07 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.239 291.927 291.655 291.415 291.204 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.148 291.846 291.582 291.352 291.149 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.394 292.06 291.77 291.516 291.293 291.094 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.3 291.978 291.696 291.449 291.232 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.204 291.894 291.624 291.387 291.178 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.115 291.817 291.555 291.324 291.121 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 292.358 292.027 291.738 291.486 291.264 291.069 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 292.261 291.942 291.664 291.42 291.205 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92703 8.30759 8.68885 9.06912 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02956 8.40915 8.7909 9.17156 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.74765 8.12921 8.51115 8.89249 9.27405 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84986 8.23191 8.6136 8.99538 9.37715 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95304 8.33477 8.7164 9.10548 9.48443 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05608 8.43726 8.81944 9.20415 9.58657 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.77604 8.1581 8.54003 8.9226 9.30371 9.68552 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87898 8.26194 8.6449 9.02767 9.40718 9.78731 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.98329 8.36531 8.74679 9.13002 9.50985 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08486 8.46877 8.84952 9.22936 9.61275 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80566 8.18779 8.56956 8.9512 9.3321 9.71225 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90869 8.29075 8.67238 9.05355 9.43439 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01174 8.39373 8.77525 9.15633 9.53693 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.73279 8.11487 8.49668 8.87811 9.2591 9.63969 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83593 8.21788 8.59968 8.98096 9.36185 9.74223 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93903 8.32099 8.70263 9.08378 9.46455 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04219 8.42398 8.80552 9.18662 9.56726 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.76334 8.14535 8.52703 8.90849 9.28946 9.66996 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86657 8.24851 8.63015 9.01141 9.39221 9.77265 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9698 8.35166 8.73321 9.11443 9.49512 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07306 8.45483 8.83629 9.21733 9.59797 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.7943 8.1763 8.55803 8.93936 9.32028 9.70071 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89765 8.27954 8.66117 9.04239 9.42319 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.082 279.49 279.866 280.213 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.187 279.584 279.953 280.292 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.86 279.286 279.677 280.038 280.372 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.971 279.388 279.77 280.122 280.449 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.08 279.486 279.86 280.212 280.53 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.187 279.584 279.95 280.29 280.604 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.868 279.291 279.678 280.036 280.367 280.676 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.979 279.393 279.773 280.125 280.447 280.748 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.091 279.494 279.864 280.208 280.524 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.197 279.592 279.953 280.288 280.601 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.884 279.302 279.686 280.041 280.369 280.673 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.996 279.405 279.781 280.127 280.448 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.107 279.506 279.872 280.212 280.526 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.789 279.213 279.603 279.963 280.296 280.604 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.905 279.32 279.701 280.051 280.375 280.678 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.018 279.422 279.793 280.137 280.457 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.127 279.523 279.888 280.223 280.534 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.814 279.235 279.62 279.976 280.305 280.611 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.926 279.337 279.715 280.064 280.387 280.686 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.038 279.44 279.808 280.149 280.465 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.146 279.538 279.899 280.233 280.543 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.833 279.25 279.634 279.987 280.314 280.618 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.945 279.353 279.728 280.074 280.394 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80105 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90604 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0079 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.72561 10.108 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.82863 10.2106 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93171 10.3134 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0349 10.4183 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.75596 10.1379 10.5195 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.85923 10.241 10.622 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.96242 10.344 10.7248 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0656 10.447 10.8276 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.78686 10.1688 10.5499 10.9303 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89022 10.2719 10.6528 11.033 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99352 10.375 10.7557 11.1357 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.71476 10.0969 10.4781 10.8586 11.2384 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.8182 10.2 10.5811 10.9615 11.341 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.524 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.5 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.476 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.517 290.455 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.492 290.432 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.469 290.412 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.448 290.39 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.488 290.426 290.371 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.466 290.406 290.353 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.445 290.386 290.334 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.423 290.367 290.317 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.465 290.403 290.349 290.3 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.444 290.383 290.329 290.282 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.422 290.364 290.313 290.267 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.467 290.404 290.346 290.295 290.25 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.445 290.382 290.327 290.279 290.237 + + + + + + 5000 + 5000 + + 1.2995 1.48813 1.74568 2.04611 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.3417 1.55209 1.82329 2.13226 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.39058 1.61991 1.90338 2.21977 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.44512 1.69155 1.98515 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.50511 1.76668 2.0697 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.56998 1.84486 2.15612 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.63923 1.92573 2.24418 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.71214 2.0089 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.78855 2.09464 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.86798 2.18232 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.94949 2.27034 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.03347 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.11853 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.20597 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 215.95 230.181 240.735 248.4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 220.175 233.374 243.052 250.089 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 224.124 236.276 245.162 251.636 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 227.739 238.942 247.088 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 231.102 241.4 248.879 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 234.212 243.658 250.529 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 237.067 245.73 252.055 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 239.692 247.638 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 242.098 249.397 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 244.316 251.031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 246.338 252.507 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 248.199 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 249.894 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 251.463 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.26702 2.62823 2.99553 3.36881 3.74582 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.36337 2.72606 3.09611 3.47083 3.84974 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.10401 2.45932 2.8245 3.19576 3.5714 3.94971 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.19799 2.55679 2.92387 3.29636 3.67306 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.29359 2.65501 3.02391 3.39789 3.77577 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.39023 2.75396 3.12464 3.4993 3.87638 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.13069 2.48785 2.85367 3.22528 3.59984 3.97849 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.22609 2.58604 2.95377 3.32679 3.70193 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.32285 2.68372 3.05292 3.4276 3.80299 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.41926 2.78302 3.15342 3.5269 3.90434 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.15979 2.51756 2.88233 3.25322 3.62836 4.00641 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.25528 2.61481 2.98186 3.35443 3.73032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.35191 2.71342 3.08275 3.45788 3.83242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.0926 2.4481 2.8138 3.18485 3.56099 3.93468 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.18739 2.54662 2.91289 3.284 3.66028 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.28478 2.64595 3.01268 3.38542 3.76184 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.38122 2.74454 3.11431 3.48841 3.86403 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.47907 2.84357 3.21408 3.5898 3.96722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.57567 2.94256 3.31479 3.69095 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.67448 3.04316 3.41693 3.79241 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.77513 3.14528 3.51763 3.89463 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.87389 3.24495 3.61938 3.9971 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.97322 3.3458 3.72133 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 309.913 306.376 303.726 301.66 300.012 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 308.84 305.583 303.102 301.164 299.605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 311.926 307.866 304.846 302.529 300.706 299.238 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 310.703 306.956 304.153 301.988 300.269 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 309.57 306.117 303.508 301.479 299.856 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 308.53 305.339 302.902 300.998 299.474 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 311.546 307.566 304.609 302.341 300.555 299.11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 310.34 306.682 303.936 301.809 300.128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 309.232 305.871 303.312 301.315 299.732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 308.226 305.11 302.727 300.861 299.357 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 311.167 307.289 304.407 302.183 300.422 298.998 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 310.005 306.44 303.753 301.665 300.007 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 308.929 305.642 303.136 301.171 299.616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 312.082 307.958 304.894 302.554 300.707 299.244 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 310.845 307.041 304.207 302.024 300.289 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 309.683 306.19 303.569 301.52 299.885 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 308.649 305.42 302.96 301.034 299.498 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 307.678 304.696 302.404 300.591 299.135 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 306.806 304.029 301.878 300.169 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 305.978 303.391 301.374 299.771 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 305.199 302.79 300.911 299.392 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 304.493 302.243 300.467 299.03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 303.833 301.722 300.048 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.17306 4.54551 4.92306 5.29644 5.67639 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.27248 4.64575 5.02209 5.4027 5.77848 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 3.99891 4.37184 4.7467 5.12423 5.50398 5.88194 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.09932 4.47329 4.8484 5.22827 5.60533 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.19989 4.57313 4.95005 5.32643 5.70577 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.29851 4.67346 5.05023 5.42624 5.80556 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.02689 4.39979 4.7732 5.15062 5.52925 5.90729 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.12585 4.49975 4.87582 5.25255 5.63011 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.22538 4.60124 4.9763 5.35528 5.73197 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 3.95393 4.32611 4.70052 5.07704 5.45514 5.83398 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.05363 4.42644 4.80162 5.17854 5.55681 5.93609 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.15386 4.52729 4.90299 5.28037 5.659 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.25421 4.62839 5.00465 5.38243 5.76131 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 3.98277 4.35494 4.72975 5.10643 5.48453 5.86361 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.08341 4.45801 4.83237 5.20835 5.5868 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.18384 4.5589 4.93293 5.31044 5.68915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.28407 4.65838 5.03471 5.41261 5.79158 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.01368 4.38529 4.75985 5.13666 5.51484 5.89406 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.11308 4.48603 4.86155 5.23869 5.61717 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.21332 4.58724 4.9632 5.34088 5.71963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.3141 4.68861 5.06515 5.44315 5.82218 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.04243 4.41518 4.79028 5.16721 5.54554 5.92479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.14296 4.5164 4.89209 5.26941 5.64802 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 268.302 269.811 271.107 272.204 273.174 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 268.726 270.169 271.405 272.482 273.407 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 267.485 269.127 270.514 271.705 272.739 273.636 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 267.954 269.523 270.849 271.997 272.983 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 268.4 269.891 271.167 272.262 273.221 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 268.816 270.248 271.472 272.522 273.447 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 267.608 269.226 270.588 271.763 272.782 273.67 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 268.066 269.612 270.923 272.049 273.028 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 268.502 269.986 271.239 272.328 273.268 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 267.253 268.926 270.337 271.543 272.586 273.498 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 267.733 269.326 270.675 271.835 272.842 273.723 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 268.189 269.711 271.006 272.12 273.088 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 268.629 270.082 271.321 272.391 273.326 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 267.397 269.043 270.434 271.625 272.658 273.559 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 267.873 269.452 270.778 271.916 272.909 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 268.324 269.828 271.096 272.196 273.155 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 268.75 270.184 271.409 272.466 273.39 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 267.545 269.162 270.531 271.706 272.725 273.617 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 268.005 269.551 270.864 271.993 272.975 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 268.444 269.923 271.182 272.269 273.215 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 268.865 270.279 271.487 272.532 273.446 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 267.665 269.263 270.617 271.779 272.787 273.67 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 268.118 269.645 270.943 272.06 273.031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03825 6.42328 6.8084 7.19481 7.57608 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14227 6.53146 6.91268 7.29719 7.67876 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.86365 6.24823 6.6361 7.01574 7.39656 7.78112 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96874 6.34971 6.73894 7.12044 7.50071 7.88367 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.06839 6.45318 6.83887 7.22045 7.60292 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17055 6.55579 6.9386 7.32225 7.70615 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.88926 6.27539 6.65765 7.04152 7.42566 7.80947 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99228 6.37657 6.76081 7.14502 7.52905 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.096 6.48027 6.86441 7.24852 7.63244 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19952 6.58386 6.968 7.3521 7.73595 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.91876 6.30317 6.68755 7.07179 7.45565 7.83932 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02254 6.40691 6.79123 7.17531 7.55923 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12631 6.51064 6.89497 7.2791 7.66285 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.84584 6.23015 6.61439 6.99873 7.38273 7.76641 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9498 6.33411 6.71839 7.10252 7.48638 7.87003 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05373 6.43798 6.82215 7.20626 7.5901 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15759 6.54193 6.92607 7.3101 7.69379 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87728 6.26154 6.64581 7.02992 7.41384 7.79752 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9812 6.36543 6.74971 7.13381 7.51767 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0852 6.46954 6.85369 7.23767 7.62143 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18918 6.5734 6.95756 7.34156 7.72525 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.9089 6.29316 6.6774 7.06154 7.44543 7.829 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.01291 6.39721 6.78141 7.16545 7.5493 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.81 294.354 293.954 293.599 293.291 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.667 294.223 293.843 293.502 293.202 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.016 294.531 294.102 293.736 293.409 293.115 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.865 294.404 293.988 293.632 293.317 293.033 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.73 294.28 293.882 293.536 293.229 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.597 294.161 293.781 293.442 293.142 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.948 294.466 294.047 293.677 293.35 293.058 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.805 294.342 293.936 293.579 293.262 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.669 294.222 293.83 293.482 293.174 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.537 294.104 293.725 293.39 293.092 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.886 294.409 293.993 293.626 293.3 293.01 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.748 294.288 293.884 293.528 293.213 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.613 294.169 293.779 293.435 293.13 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.974 294.484 294.056 293.678 293.345 293.048 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.832 294.36 293.946 293.581 293.257 292.969 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.697 294.24 293.839 293.486 293.173 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.563 294.124 293.737 293.396 293.091 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.924 294.438 294.012 293.637 293.305 293.011 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.784 294.314 293.903 293.541 293.221 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.649 294.198 293.8 293.448 293.136 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.519 294.081 293.697 293.358 293.056 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 294.873 294.392 293.971 293.6 293.27 292.976 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 294.735 294.27 293.862 293.502 293.183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95786 8.33657 8.71615 9.09487 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05988 8.43767 8.81777 9.19692 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.77938 8.15903 8.53922 8.91895 9.29903 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8811 8.26127 8.64123 9.0214 9.40173 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.98372 8.3636 8.74357 9.13109 9.50864 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08626 8.46567 8.8462 9.22937 9.61038 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80765 8.18778 8.56794 8.94889 9.32855 9.70903 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91001 8.29109 8.67236 9.05359 9.43165 9.81044 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.0138 8.394 8.77381 9.15549 9.53392 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11484 8.49696 8.8761 9.25446 9.63647 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83703 8.21725 8.59729 8.97737 9.35681 9.73561 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93951 8.31973 8.69967 9.07929 9.4587 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04205 8.42222 8.80207 9.18165 9.56088 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.76448 8.14462 8.5247 8.90454 9.28406 9.66326 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86709 8.24718 8.62724 9.00693 9.38637 9.76543 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96963 8.34973 8.72971 9.10935 9.48873 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07227 8.4523 8.8322 9.21179 9.59102 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.79485 8.17493 8.55484 8.9347 9.31422 9.69339 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8975 8.27757 8.65752 9.03724 9.41661 9.79569 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00022 8.38025 8.76014 9.13982 9.51911 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10295 8.48294 8.86278 9.24234 9.62161 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82559 8.20568 8.58568 8.96543 9.3449 9.72398 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92841 8.30845 8.68838 9.06805 9.44742 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.219 277.71 278.16 278.577 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.347 277.825 278.267 278.674 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.958 277.469 277.938 278.37 278.771 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.091 277.591 278.051 278.475 278.867 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.225 277.713 278.161 278.583 278.964 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.354 277.829 278.269 278.679 279.056 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.971 277.48 277.947 278.377 278.773 279.142 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.108 277.605 278.062 278.482 278.869 279.231 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.243 277.727 278.172 278.585 278.964 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.371 277.847 278.281 278.681 279.057 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.996 277.5 277.961 278.386 278.78 279.145 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.132 277.623 278.075 278.491 278.877 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.265 277.746 278.187 278.594 278.971 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.885 277.396 277.864 278.295 278.694 279.064 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.023 277.522 277.981 278.403 278.793 279.155 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.161 277.649 278.095 278.507 278.888 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.292 277.768 278.206 278.61 278.985 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.914 277.422 277.887 278.315 278.71 279.076 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.053 277.548 278.001 278.42 278.807 279.168 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.186 277.67 278.114 278.524 278.903 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.317 277.789 278.224 278.624 278.996 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.941 277.445 277.906 278.33 278.723 279.088 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.077 277.568 278.019 278.434 278.82 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.82872 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93351 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0353 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.75336 10.1352 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.85622 10.2376 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95916 10.3403 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0621 10.445 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.78367 10.1651 10.5461 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88679 10.268 10.6485 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.98981 10.3708 10.7512 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0929 10.4737 10.8538 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81458 10.1959 10.5765 10.9564 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.91774 10.2989 10.6793 11.059 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0209 10.4019 10.782 11.1615 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.74262 10.1241 10.5048 10.8848 11.2641 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.8459 10.2272 10.6077 10.9876 11.3666 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.051 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.009 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.972 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.053 291.934 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.013 291.899 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.976 291.863 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.937 291.827 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.02 291.902 291.795 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.982 291.866 291.762 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.944 291.832 291.731 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.909 291.8 291.701 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.992 291.874 291.767 291.671 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.953 291.839 291.736 291.642 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.919 291.807 291.705 291.612 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.004 291.882 291.773 291.675 291.586 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.966 291.849 291.743 291.646 291.558 + + + + + + 5000 + 5000 + + 0.940685 1.18821 1.49861 1.84032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 0.998439 1.26772 1.5887 1.9358 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.06363 1.35003 1.68006 2.03187 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.13409 1.43537 1.77237 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.20987 1.52346 1.86675 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.28999 1.6137 1.96229 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.37357 1.70574 2.0589 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.46015 1.79937 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.54918 1.89469 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.64058 1.99158 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.73305 2.08772 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.82717 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.92159 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.01762 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 224.94 241.508 251.835 258.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 230.202 244.788 253.904 259.875 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 234.853 247.65 255.75 261.127 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 238.896 250.179 257.387 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 242.471 252.43 258.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 245.63 254.441 260.232 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 248.418 256.239 261.458 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 250.879 257.853 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 253.071 259.317 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 255.025 260.639 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 256.765 261.828 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 258.333 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 259.729 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 261.005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.12524 2.50615 2.88825 3.27318 3.65954 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.22754 2.60841 2.99236 3.378 3.76576 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 1.95111 2.32889 2.71093 3.09521 3.48113 3.86779 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.05179 2.43145 2.81419 3.19888 3.58527 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.15369 2.53435 2.91781 3.3032 3.6903 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.25604 2.63756 3.02196 3.40734 3.79306 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 1.97978 2.35907 2.7414 3.12571 3.51034 3.89717 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.08186 2.46212 2.84519 3.23018 3.61484 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.18474 2.56431 2.94786 3.33378 3.71811 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.28671 2.66784 3.05159 3.43558 3.82156 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.01093 2.39021 2.77105 3.15441 3.53951 3.92565 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.11276 2.49212 2.8742 3.25854 3.6438 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.21536 2.59517 2.97855 3.36473 3.74804 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.93855 2.31688 2.69966 3.08382 3.47042 3.85242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.04007 2.42046 2.80261 3.18599 3.57205 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.14397 2.52457 2.9059 3.29015 3.67581 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.24598 2.62733 3.01092 3.3959 3.78024 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.34926 2.73041 3.11377 3.4997 3.88537 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.45062 2.83302 3.21737 3.60321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.55401 2.9372 3.32234 3.70688 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.65899 3.04264 3.42559 3.81121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.76164 3.14534 3.52981 3.9157 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.86462 3.24908 3.63409 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 300.059 297.797 296.151 294.899 293.915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 299.36 297.298 295.768 294.596 293.671 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 301.382 298.731 296.835 295.416 294.319 293.451 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 300.568 298.154 296.407 295.089 294.058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 299.829 297.627 296.008 294.776 293.81 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 299.153 297.135 295.639 294.489 293.584 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 301.124 298.54 296.686 295.296 294.222 293.364 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 300.331 297.978 296.267 294.972 293.967 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 299.609 297.469 295.888 294.677 293.731 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 298.964 296.996 295.529 294.403 293.509 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 300.884 298.369 296.562 295.199 294.141 293.298 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 300.118 297.831 296.16 294.889 293.896 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 299.424 297.334 295.784 294.591 293.662 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 301.503 298.801 296.865 295.426 294.313 293.444 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 300.679 298.217 296.445 295.11 294.065 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 299.927 297.687 296.052 294.803 293.823 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 299.25 297.2 295.681 294.515 293.599 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 298.633 296.754 295.343 294.246 293.379 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 298.077 296.337 295.022 293.996 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 297.555 295.948 294.72 293.758 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 297.067 295.578 294.439 293.532 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 296.628 295.244 294.173 293.318 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 296.218 294.928 293.922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.07903 4.46004 4.84494 5.2245 5.60986 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.18092 4.56235 4.94564 5.33235 5.71332 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 3.90031 4.28253 4.66529 5.04957 5.43514 5.81812 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.00345 4.38635 4.76894 5.15528 5.53786 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.10659 4.48827 4.8724 5.25497 5.63972 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.20761 4.59069 4.97439 5.35629 5.74079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 3.92919 4.31129 4.69239 5.07644 5.4608 5.84382 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.03082 4.41348 4.79696 5.18003 5.56309 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.13283 4.51712 4.89928 5.2844 5.66635 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 3.85436 4.23605 4.61845 5.00178 5.38572 5.76968 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 3.95684 4.33865 4.72145 5.10493 5.48889 5.87312 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.05965 4.44175 4.8248 5.20845 5.59249 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.16264 4.545 4.92823 5.31203 5.69618 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 3.88416 4.26566 4.64838 5.03181 5.41575 5.79986 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 3.98758 4.37116 4.75301 5.13538 5.51939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.0906 4.47416 4.85535 5.23909 5.62321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.19327 4.57572 4.95897 5.34283 5.72696 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 3.91609 4.29687 4.67918 5.06261 5.44653 5.83075 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.01813 4.39984 4.78278 5.16631 5.55031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.12086 4.50318 4.88627 5.27008 5.65414 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.22407 4.6066 4.98997 5.37385 5.75801 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 3.94561 4.3274 4.71018 5.09369 5.47772 5.86192 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.0487 4.43084 4.81388 5.19751 5.58157 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.688 274.773 275.701 276.483 277.176 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.991 275.028 275.914 276.681 277.338 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 273.094 274.28 275.273 276.122 276.859 277.498 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 273.43 274.558 275.51 276.331 277.034 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 273.751 274.824 275.737 276.516 277.198 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 274.049 275.076 275.95 276.7 277.359 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 273.176 274.342 275.319 276.158 276.884 277.516 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 273.506 274.618 275.557 276.36 277.056 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 273.822 274.886 275.781 276.557 277.226 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 272.919 274.125 275.136 275.997 276.742 277.39 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 273.265 274.414 275.381 276.207 276.921 277.548 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 273.596 274.688 275.612 276.406 277.097 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 273.908 274.953 275.839 276.602 277.266 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 273.026 274.212 275.206 276.054 276.787 277.428 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 273.368 274.501 275.451 276.263 276.97 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 273.694 274.774 275.68 276.462 277.142 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 274.001 275.027 275.9 276.653 277.31 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 273.133 274.295 275.275 276.113 276.837 277.47 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 273.464 274.574 275.513 276.316 277.013 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 273.781 274.841 275.739 276.512 277.184 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 274.082 275.094 275.956 276.699 277.348 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 273.219 274.369 275.337 276.163 276.878 277.505 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 273.545 274.64 275.566 276.361 277.051 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.98174 6.36944 6.75695 7.14549 7.52863 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08661 6.47839 6.86185 7.24841 7.63182 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.80591 6.19332 6.58371 6.96554 7.34836 7.73471 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.91186 6.29551 6.6872 7.07082 7.453 7.83773 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01226 6.39968 6.78774 7.17139 7.55573 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11519 6.50297 6.88802 7.27373 7.65946 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.8318 6.22073 6.60548 6.99156 7.37768 7.76328 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93565 6.32264 6.70927 7.09561 7.48154 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0401 6.42698 6.81344 7.19967 7.58547 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14436 6.53125 6.91767 7.30376 7.68942 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.86157 6.24874 6.63556 7.02198 7.4078 7.79328 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96609 6.35314 6.73984 7.12608 7.51192 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0706 6.45755 6.84418 7.23038 7.61598 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.78801 6.17518 6.56193 6.94851 7.33452 7.72002 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.89276 6.2798 6.66652 7.05285 7.43867 7.82409 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9974 6.38435 6.7709 7.15713 7.54286 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10206 6.48894 6.87536 7.26143 7.647 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.81958 6.20665 6.59343 6.9798 7.36574 7.7512 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92428 6.31127 6.69798 7.08422 7.47 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02902 6.41597 6.80247 7.18859 7.57427 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13369 6.5205 6.90696 7.29299 7.6785 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.85133 6.23839 6.62511 7.01144 7.39732 7.78272 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.95609 6.3431 6.72971 7.11592 7.50171 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.992 290.761 290.563 290.389 290.238 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.917 290.691 290.502 290.334 290.188 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.088 290.842 290.626 290.445 290.286 290.143 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.008 290.774 290.566 290.389 290.236 290.099 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.935 290.707 290.509 290.338 290.189 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.866 290.644 290.454 290.288 290.143 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.04 290.794 290.584 290.401 290.241 290.1 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.966 290.731 290.527 290.348 290.193 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.893 290.666 290.469 290.299 290.149 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.823 290.606 290.417 290.251 290.106 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.001 290.758 290.547 290.363 290.204 290.064 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.928 290.693 290.49 290.314 290.16 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.858 290.633 290.437 290.266 290.117 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.043 290.792 290.575 290.385 290.22 290.076 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.97 290.727 290.517 290.335 290.176 290.037 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.896 290.665 290.464 290.288 290.134 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.83 290.605 290.41 290.239 290.091 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.013 290.763 290.546 290.36 290.196 290.052 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.941 290.701 290.494 290.311 290.151 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.871 290.638 290.438 290.263 290.111 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.801 290.579 290.387 290.218 290.069 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 290.984 290.736 290.522 290.335 290.171 290.029 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 290.91 290.672 290.465 290.285 290.128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91376 8.29518 8.67721 9.05819 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01653 8.39695 8.77947 9.16081 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.73395 8.11641 8.49915 8.88124 9.26348 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83641 8.21935 8.60183 8.98431 9.36675 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93985 8.32241 8.70481 9.09461 9.47422 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04311 8.42512 8.80807 9.19348 9.57651 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.76243 8.14538 8.52811 8.9114 9.29318 9.67563 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86562 8.24943 8.63318 9.01669 9.39685 9.77759 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97018 8.35305 8.73529 9.11922 9.49968 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07198 8.45671 8.83821 9.21873 9.60276 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.79216 8.17515 8.55771 8.94009 9.32166 9.70241 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89542 8.27833 8.66075 9.04263 9.42412 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.99873 8.38156 8.76382 9.14559 9.52683 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.71914 8.10208 8.4847 8.86688 9.24856 9.62977 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82252 8.20534 8.58794 8.96994 9.35148 9.73246 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92589 8.30868 8.69108 9.07293 9.45436 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02927 8.41189 8.7942 9.17599 9.55725 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.74979 8.13269 8.51517 8.89735 9.27899 9.6601 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.85328 8.23606 8.61848 9.00047 9.38194 9.76297 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95675 8.33944 8.72176 9.10367 9.485 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06025 8.44283 8.82503 9.20675 9.58802 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.78085 8.16371 8.54624 8.9283 9.30989 9.69093 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88443 8.26717 8.64958 9.03152 9.41297 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.101 280.463 280.797 281.107 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.192 280.546 280.873 281.176 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.901 280.279 280.628 280.948 281.245 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280 280.368 280.707 281.022 281.313 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.094 280.455 280.787 281.101 281.384 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.189 280.541 280.866 281.168 281.449 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.905 280.279 280.623 280.943 281.238 281.513 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.002 280.37 280.709 281.02 281.307 281.575 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.102 280.459 280.787 281.093 281.376 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.194 280.545 280.867 281.164 281.443 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.915 280.287 280.629 280.944 281.236 281.507 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.016 280.379 280.712 281.02 281.306 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.113 280.467 280.793 281.095 281.375 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.83 280.208 280.554 280.874 281.169 281.443 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.933 280.301 280.638 280.95 281.24 281.51 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.032 280.39 280.722 281.028 281.311 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.13 280.482 280.804 281.102 281.379 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.851 280.224 280.566 280.883 281.176 281.449 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.951 280.316 280.652 280.961 281.247 281.514 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.05 280.406 280.733 281.036 281.317 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.144 280.492 280.813 281.11 281.386 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.867 280.237 280.578 280.892 281.182 281.452 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.966 280.328 280.661 280.967 281.252 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.78893 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89398 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99594 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.71343 10.0961 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81654 10.1987 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.91966 10.3015 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0229 10.4065 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.74381 10.126 10.5078 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84713 10.2291 10.6103 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95037 10.3322 10.7132 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0536 10.4352 10.8159 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.7747 10.1568 10.5382 10.9187 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87812 10.26 10.6412 11.0215 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.98148 10.3632 10.744 11.1242 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.70254 10.0848 10.4663 10.847 11.2269 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80605 10.1881 10.5694 10.9499 11.3296 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.693 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.678 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.661 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.679 289.649 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.665 289.634 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.649 289.621 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.636 289.608 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.654 289.623 289.596 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.64 289.61 289.585 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.627 289.599 289.574 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.615 289.587 289.563 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.633 289.602 289.576 289.554 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.622 289.591 289.565 289.543 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.608 289.578 289.554 289.534 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.629 289.596 289.569 289.545 289.525 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.617 289.584 289.556 289.534 289.516 + + + + + + 5000 + 5000 + + 1.69945 1.84729 2.06004 2.31983 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.73158 1.89903 2.12612 2.39608 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.76958 1.95471 2.19499 2.474 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.81265 2.01426 2.26614 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.86061 2.07757 2.3404 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.91338 2.14431 2.41696 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.9703 2.21404 2.49564 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.03126 2.28671 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.0958 2.36201 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.16371 2.44 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.23437 2.51883 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.30777 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.38309 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.46089 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 210.69 222.486 232.201 239.928 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 214.068 225.322 234.469 241.714 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 217.311 227.974 236.588 243.385 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 220.366 230.478 238.562 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 223.292 232.845 240.432 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 226.074 235.071 242.188 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 228.705 237.163 243.838 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 231.184 239.124 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 233.521 240.977 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 235.725 242.719 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 237.775 244.324 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 239.705 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 241.49 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 243.179 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.48039 2.81518 3.16149 3.51779 3.88096 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.56891 2.90684 3.25714 3.61576 3.9814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.33175 2.65765 2.99946 3.35207 3.7125 4.0782 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.41702 2.74828 3.09339 3.44822 3.81051 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.50453 2.83997 3.18823 3.54547 3.90968 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.59349 2.93284 3.28411 3.64297 4.00701 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.35578 2.68402 3.02691 3.38007 3.73974 4.10599 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.44262 2.77534 3.12155 3.47728 3.83828 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.53132 2.86688 3.21578 3.57401 3.93593 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.62031 2.9602 3.31144 3.66945 4.03411 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.38218 2.71153 3.05396 3.40686 3.76726 4.13311 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.46934 2.80232 3.14828 3.50381 3.8657 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.55823 2.89483 3.24418 3.6031 3.96446 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.32148 2.64716 2.98931 3.34155 3.70236 4.06361 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.40753 2.73886 3.08309 3.43649 3.79814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.49671 2.83165 3.17765 3.5336 3.89628 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.58536 2.92421 3.27444 3.63268 3.99527 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.67628 3.01768 3.36968 3.73024 4.09519 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.76616 3.11134 3.4661 3.828 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.85874 3.20699 3.56416 3.92603 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.95334 3.30415 3.66098 4.02508 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.04656 3.39946 3.75907 4.12449 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.14069 3.49605 3.8575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 318.846 314.463 311.05 308.319 306.102 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 317.538 313.455 310.24 307.66 305.551 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 321.261 316.336 312.508 309.484 307.047 305.051 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 319.802 315.202 311.617 308.767 306.461 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 318.435 314.139 310.775 308.087 305.9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 317.159 313.145 309.983 307.448 305.38 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 320.81 315.967 312.211 309.238 306.849 304.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 319.367 314.852 311.333 308.534 306.274 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 318.019 313.827 310.522 307.874 305.734 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 316.782 312.852 309.748 307.262 305.224 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 320.351 315.611 311.944 309.03 306.671 304.733 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 318.95 314.54 311.093 308.341 306.108 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 317.641 313.528 310.283 307.676 305.575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 321.428 316.437 312.565 309.515 307.053 305.069 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 319.952 315.294 311.681 308.817 306.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 318.554 314.219 310.844 308.138 305.939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 317.279 313.231 310.047 307.492 305.415 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 316.086 312.306 309.311 306.889 304.911 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 314.988 311.438 308.613 306.325 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 313.945 310.612 307.943 305.782 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 312.949 309.819 307.321 305.266 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 312.04 309.099 306.725 304.773 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 311.185 308.408 306.159 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.3107 4.67151 5.03905 5.40381 5.77604 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.40694 4.76897 5.13557 5.50773 5.87621 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.14274 4.50301 4.86712 5.23537 5.607 5.97791 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.23952 4.6014 4.9662 5.33704 5.70628 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.33659 4.69827 5.0652 5.43303 5.80484 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.43192 4.79576 5.16298 5.53075 5.90279 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.16952 4.52998 4.89283 5.26104 5.63161 6.00267 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.26499 4.62692 4.99273 5.36063 5.73047 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.36104 4.72539 5.09069 5.46113 5.83044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.09911 4.45851 4.822 5.18909 5.55891 5.93053 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.19519 4.55567 4.92028 5.28813 5.65851 6.03087 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.2917 4.65343 5.0191 5.38776 5.75873 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.38882 4.75168 5.1182 5.48751 5.85902 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.12672 4.4862 4.85019 5.21759 5.58761 5.95955 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.22368 4.58617 4.95017 5.31718 5.68778 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.32064 4.68404 5.04813 5.41702 5.78818 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.41753 4.78073 5.14747 5.51705 5.8887 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.15637 4.51554 4.87945 5.24703 5.61717 5.98934 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.25228 4.61327 4.97851 5.34677 5.7175 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.34908 4.71153 5.07764 5.44679 5.81804 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.44666 4.81018 5.17719 5.54693 5.91871 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.1842 4.54459 4.90912 5.27692 5.6473 6.01959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.28115 4.64277 5.00835 5.3769 5.74783 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 262.905 264.794 266.427 267.82 269.059 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 263.433 265.245 266.81 268.179 269.36 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 261.893 263.94 265.684 267.191 268.506 269.652 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 262.476 264.436 266.107 267.565 268.823 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 263.033 264.902 266.515 267.904 269.126 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 263.555 265.353 266.9 268.237 269.417 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 262.051 264.069 265.782 267.272 268.57 269.706 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 262.618 264.553 266.208 267.638 268.885 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 263.165 265.025 266.609 267.992 269.191 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 261.611 263.693 265.464 266.992 268.323 269.489 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 262.204 264.195 265.898 267.368 268.649 269.776 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 262.777 264.681 266.313 267.727 268.964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 263.318 265.144 266.714 268.078 269.273 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 261.787 263.84 265.592 267.1 268.413 269.566 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 262.378 264.35 266.022 267.469 268.737 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 262.938 264.825 266.429 267.827 269.05 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 263.472 265.273 266.823 268.17 269.352 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 261.969 263.987 265.712 267.203 268.502 269.643 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 262.538 264.474 266.133 267.568 268.821 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 263.087 264.944 266.537 267.918 269.129 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 263.612 265.391 266.923 268.256 269.426 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 262.116 264.114 265.821 267.296 268.582 269.711 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 262.683 264.596 266.234 267.653 268.894 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1265 6.50716 6.88831 7.27117 7.64926 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22924 6.61409 6.99141 7.37258 7.75109 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.95396 6.33386 6.7175 7.09357 7.4711 7.8526 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05768 6.43418 6.81933 7.19726 7.57428 7.95433 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15605 6.53646 6.91826 7.29636 7.67568 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25699 6.63802 7.01698 7.39726 7.77808 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97911 6.36055 6.73878 7.11898 7.49978 7.88061 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08087 6.46066 6.84086 7.2215 7.60228 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18324 6.56318 6.94344 7.32412 7.7049 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.28558 6.66572 7.0461 7.42675 7.80755 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00824 6.38803 6.76829 7.14887 7.52948 7.91019 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11066 6.4906 6.87098 7.25153 7.63223 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21322 6.59325 6.97372 7.35436 7.73501 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93625 6.31586 6.6959 7.07651 7.45717 7.83781 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03888 6.41863 6.79886 7.17936 7.55996 7.94065 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14154 6.52141 6.90165 7.28221 7.66285 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.24424 6.62423 7.00456 7.38515 7.76577 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96733 6.34693 6.7271 7.10752 7.48811 7.86872 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07002 6.44975 6.82998 7.21043 7.59104 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17275 6.55265 6.93291 7.31344 7.69406 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.27554 6.65556 7.03591 7.41646 7.79703 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.99877 6.37836 6.75846 7.13891 7.51949 7.90011 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.10144 6.48127 6.8615 7.24198 7.62258 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.757 298.079 297.48 296.944 296.474 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.552 297.888 297.314 296.799 296.344 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.07 298.349 297.711 297.16 296.665 296.217 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.854 298.166 297.544 297.006 296.526 296.094 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.656 297.984 297.388 296.866 296.398 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.46 297.81 297.237 296.727 296.27 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.984 298.266 297.643 297.087 296.59 296.147 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.777 298.087 297.478 296.939 296.457 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.574 297.908 297.32 296.797 296.33 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.381 297.737 297.167 296.658 296.205 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.902 298.193 297.569 297.017 296.526 296.085 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.695 298.012 297.41 296.874 296.396 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.499 297.838 297.253 296.733 296.27 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.034 298.308 297.669 297.103 296.6 296.149 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.825 298.123 297.505 296.957 296.468 296.03 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.624 297.947 297.348 296.816 296.341 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.43 297.774 297.194 296.679 296.219 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.96 298.241 297.608 297.047 296.547 296.098 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.756 298.061 297.447 296.902 296.416 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.556 297.883 297.29 296.764 296.292 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.365 297.716 297.141 296.628 296.169 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 298.893 298.179 297.55 296.993 296.496 296.053 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 298.687 297.998 297.391 296.851 296.368 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02584 8.40073 8.77687 9.15244 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12672 8.50089 8.87765 9.25368 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84923 8.22493 8.60151 8.97793 9.35496 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9498 8.32613 8.70258 9.07956 9.45693 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05139 8.42753 8.80405 9.1883 9.56297 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15282 8.52857 8.90575 9.28586 9.66395 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87708 8.25333 8.62993 9.00763 9.38427 9.76191 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97836 8.3556 8.73339 9.11139 9.48652 9.86263 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08101 8.45751 8.83394 9.2125 9.58805 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.18102 8.55947 8.93534 9.31067 9.68982 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90606 8.28244 8.65893 9.03574 9.41217 9.78823 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00747 8.38387 8.76036 9.1368 9.51332 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10888 8.48539 8.8619 9.23838 9.61472 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83424 8.21045 8.58691 8.96342 9.33991 9.71635 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93568 8.31189 8.68847 9.06498 9.44148 9.81779 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03716 8.41353 8.79007 9.16654 9.54298 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13873 8.51507 8.89162 9.26815 9.64458 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86415 8.24034 8.61671 8.9933 9.36979 9.74616 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96573 8.34198 8.71844 9.09495 9.47138 9.84776 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06736 8.44367 8.82015 9.19672 9.57313 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.16904 8.5454 8.92192 9.29842 9.67486 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89455 8.27078 8.64721 9.02371 9.40018 9.77651 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9963 8.37254 8.749 9.12549 9.50195 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.218 274.837 275.408 275.932 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.383 274.985 275.544 276.059 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.891 274.538 275.132 275.678 276.184 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.065 274.697 275.277 275.81 276.306 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.234 274.85 275.417 275.952 276.433 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.4 275.003 275.558 276.074 276.549 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.919 274.561 275.15 275.693 276.194 276.661 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.093 274.721 275.298 275.831 276.319 276.774 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.265 274.878 275.44 275.961 276.44 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.43 275.031 275.579 276.084 276.559 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.956 274.591 275.175 275.714 276.211 276.672 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.128 274.751 275.322 275.848 276.334 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.299 274.905 275.462 275.977 276.454 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.817 274.463 275.056 275.603 276.107 276.574 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.995 274.627 275.206 275.739 276.231 276.689 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.168 274.783 275.35 275.872 276.356 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.336 274.938 275.492 276.002 276.475 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.858 274.5 275.088 275.629 276.129 276.593 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.033 274.659 275.234 275.764 276.254 276.708 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.204 274.815 275.377 275.895 276.375 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.37 274.967 275.517 276.024 276.494 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.895 274.531 275.115 275.653 276.15 276.611 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.066 274.688 275.26 275.786 276.272 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88865 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99296 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0943 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81357 10.1939 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.916 10.2959 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0185 10.3982 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1211 10.5026 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84373 10.2236 10.6033 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94645 10.3262 10.7053 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0491 10.4287 10.8076 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1517 10.5312 10.9099 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87454 10.2544 10.6336 11.0122 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97737 10.357 10.7361 11.1145 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0801 10.4596 10.8385 11.2168 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80293 10.1829 10.5622 10.9409 11.319 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90584 10.2856 10.6648 11.0433 11.4212 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.526 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.46 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.397 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.546 294.338 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.481 294.277 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.418 294.22 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.356 294.16 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.503 294.296 294.107 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.44 294.238 294.052 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.379 294.18 293.999 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.318 294.125 293.948 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.467 294.26 294.072 293.898 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.405 294.203 294.018 293.849 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.343 294.147 293.967 293.801 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.496 294.285 294.093 293.915 293.753 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.433 294.226 294.038 293.866 293.708 + + + + + + 5000 + 5000 + + 1.83312 1.97094 2.1715 2.4192 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.8629 2.01936 2.23417 2.49231 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.89817 2.07178 2.29977 2.56735 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.93841 2.12805 2.36772 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.98328 2.18797 2.43877 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.03271 2.25141 2.51234 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.08647 2.31785 2.58809 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.14392 2.38723 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.20521 2.45952 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.26968 2.53428 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.33718 2.61033 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.40741 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.47959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.55448 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 209.465 220.579 229.951 237.579 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 212.624 223.293 232.174 239.367 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 215.673 225.846 234.263 241.045 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 218.563 228.272 236.219 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 221.348 230.581 238.084 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 224.015 232.764 239.841 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 226.549 234.829 241.501 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 228.959 236.778 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 231.24 238.624 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 233.407 240.375 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 235.433 241.99 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 237.352 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 239.137 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 240.833 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.56441 2.88968 3.22824 3.57822 3.936 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.65015 2.97919 3.322 3.67451 4.03502 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.4207 2.73626 3.06965 3.41521 3.76976 4.13063 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.50307 2.82444 3.16148 3.50969 3.86635 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.58763 2.91383 3.25436 3.60532 3.9642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.6739 3.0045 3.34841 3.70118 4.06025 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.44384 2.76181 3.09633 3.44266 3.79655 4.15799 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.52764 2.8508 3.18905 3.53818 3.89372 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.6136 2.94001 3.28135 3.63329 3.99004 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.6999 3.03111 3.37525 3.72734 4.08698 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.46925 2.78863 3.12286 3.46893 3.82367 4.18473 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.55354 2.87704 3.21519 3.56425 3.92075 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.63966 2.96725 3.30923 3.66198 4.0182 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.41071 2.72607 3.05962 3.40482 3.75972 4.11608 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.49386 2.81528 3.15138 3.49805 3.85415 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.58004 2.90564 3.24405 3.59367 3.95097 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.66613 2.99609 3.33897 3.6911 4.04861 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.75438 3.08737 3.43244 3.78726 4.14739 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.84197 3.17915 3.52733 3.88364 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.93223 3.27282 3.62372 3.98039 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.02458 3.36821 3.71912 4.07821 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.11581 3.46182 3.81574 4.17634 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.20795 3.5568 3.91282 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 321.5 316.935 313.336 310.432 308.055 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 320.146 315.879 312.476 309.725 307.461 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 323.987 318.894 314.882 311.674 309.069 306.925 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 322.489 317.71 313.938 310.912 308.44 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 321.074 316.598 313.047 310.185 307.839 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 319.751 315.554 312.205 309.498 307.28 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 323.524 318.508 314.565 311.414 308.858 306.742 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 322.036 317.346 313.64 310.662 308.242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 320.645 316.269 312.778 309.956 307.661 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 319.357 315.242 311.957 309.303 307.111 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 323.049 318.138 314.285 311.19 308.667 306.581 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 321.605 317.016 313.383 310.454 308.063 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 320.249 315.951 312.524 309.745 307.489 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 324.151 318.998 314.939 311.707 309.077 306.942 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 322.638 317.804 314.004 310.96 308.47 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 321.191 316.676 313.118 310.24 307.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 319.873 315.64 312.271 309.545 307.314 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 318.626 314.66 311.487 308.9 306.774 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 317.482 313.746 310.745 308.293 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 316.387 312.868 310.027 307.711 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 315.339 312.029 309.363 307.156 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 314.383 311.26 308.723 306.623 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 313.477 310.524 308.115 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.36399 4.72048 5.08421 5.44582 5.81516 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.45896 4.8169 5.17993 5.54888 5.91462 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.19828 4.55393 4.91401 5.27876 5.64733 6.01559 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.29368 4.65112 5.01207 5.37957 5.74592 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.38947 4.74692 5.11016 5.47475 5.8437 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.48364 4.84335 5.20701 5.57167 5.94096 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.22461 4.58048 4.93938 5.30417 5.67176 6.04015 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.31872 4.67632 5.03833 5.40294 5.76987 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.41362 4.7737 5.13535 5.50253 5.86908 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.15512 4.50979 4.86923 5.23282 5.59962 5.96849 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.24982 4.60585 4.96659 5.331 5.69838 6.06808 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.34512 4.70245 5.06433 5.42973 5.79785 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.44093 4.79966 5.16256 5.52873 5.89743 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.1823 4.53718 4.89714 5.261 5.62796 5.99725 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.27791 4.63592 4.99607 5.35976 5.72742 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.3736 4.73271 5.09313 5.45875 5.82705 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.46929 4.82835 5.19153 5.55796 5.92686 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.21153 4.56611 4.92605 5.29018 5.65732 6.02681 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.30611 4.66274 5.02414 5.38909 5.75689 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.40172 4.75992 5.12233 5.48825 5.85671 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.49805 4.8575 5.22101 5.58764 5.95669 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.23899 4.59484 4.95547 5.31986 5.68723 6.05684 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.33467 4.69194 5.05369 5.41897 5.78701 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 261.209 263.207 264.94 266.419 267.738 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 261.768 263.685 265.344 266.802 268.059 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 260.142 262.303 264.151 265.752 267.151 268.372 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 260.759 262.829 264.6 266.149 267.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 261.347 263.323 265.033 266.51 267.813 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 261.897 263.801 265.443 266.865 268.123 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 260.31 262.442 264.258 265.839 267.22 268.431 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 260.91 262.953 264.708 266.227 267.556 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 261.484 263.453 265.134 266.606 267.883 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 259.848 262.045 263.921 265.542 266.956 268.2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 260.473 262.574 264.378 265.941 267.306 268.508 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 261.074 263.09 264.822 266.325 267.642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 261.648 263.579 265.246 266.696 267.97 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 260.032 262.198 264.053 265.657 267.055 268.284 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 260.655 262.738 264.512 266.049 267.399 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 261.246 263.241 264.942 266.43 267.733 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 261.809 263.716 265.362 266.796 268.055 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 260.222 262.353 264.182 265.766 267.148 268.366 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 260.824 262.869 264.628 266.154 267.489 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 261.402 263.366 265.057 266.528 267.817 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 261.957 263.841 265.468 266.886 268.133 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 260.378 262.488 264.297 265.864 267.233 268.439 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 260.975 262.998 264.738 266.246 267.567 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.16271 6.54148 6.92094 7.30235 7.67912 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.26484 6.64788 7.02365 7.40343 7.78064 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99094 6.36898 6.75086 7.12536 7.50153 7.88177 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.09408 6.46875 6.8522 7.22863 7.60438 7.98321 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19195 6.57055 6.95076 7.32737 7.70538 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.29241 6.67164 7.04906 7.42792 7.80744 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01591 6.39546 6.77197 7.15062 7.53007 7.90963 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11712 6.49503 6.87363 7.25276 7.63222 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.219 6.59712 6.9758 7.355 7.73444 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.32083 6.69919 7.07798 7.45728 7.83679 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04485 6.42274 6.80134 7.18042 7.55964 7.9391 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14678 6.52488 6.9036 7.28265 7.66201 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.24879 6.62703 7.00589 7.38513 7.7645 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97326 6.35093 6.72925 7.10832 7.48756 7.86693 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07536 6.45323 6.83177 7.21076 7.59 7.96946 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1775 6.55553 6.93412 7.31323 7.69256 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.27965 6.65791 7.03665 7.41583 7.79514 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00423 6.38192 6.76035 7.13921 7.51839 7.89777 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10637 6.48419 6.86276 7.24175 7.62103 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.20855 6.58669 6.96534 7.34439 7.72366 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.3109 6.68911 7.06787 7.44701 7.82633 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.03549 6.41319 6.79161 7.17053 7.54975 7.92908 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.13768 6.51568 6.89423 7.27319 7.65245 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.062 299.312 298.646 298.054 297.531 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.835 299.1 298.466 297.896 297.39 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.406 299.614 298.907 298.295 297.746 297.248 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.169 299.41 298.722 298.125 297.595 297.114 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.952 299.209 298.551 297.971 297.451 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.737 299.017 298.384 297.818 297.31 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.314 299.524 298.834 298.217 297.667 297.174 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.087 299.325 298.653 298.054 297.521 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.865 299.129 298.478 297.898 297.378 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.652 298.939 298.307 297.745 297.241 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.225 299.444 298.755 298.144 297.598 297.108 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300 299.246 298.578 297.984 297.453 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.782 299.052 298.405 297.83 297.316 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.372 299.571 298.866 298.24 297.681 297.18 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.142 299.369 298.685 298.078 297.535 297.049 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.921 299.173 298.51 297.921 297.395 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.706 298.982 298.341 297.77 297.259 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.293 299.5 298.8 298.178 297.622 297.125 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.067 299.299 298.62 298.017 297.48 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.846 299.105 298.449 297.865 297.341 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.637 298.918 298.281 297.713 297.205 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 300.217 299.43 298.736 298.119 297.57 297.076 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 299.992 299.232 298.56 297.961 297.426 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05294 8.42642 8.80124 9.17558 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15343 8.52617 8.90167 9.27652 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87702 8.25128 8.62647 9.00164 9.37751 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97724 8.35208 8.72718 9.10289 9.47917 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07837 8.45307 8.82831 9.21135 9.5849 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.17942 8.55379 8.92968 9.30857 9.68556 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90478 8.27951 8.65475 9.03119 9.4067 9.78329 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00562 8.3814 8.75786 9.13465 9.50864 9.88371 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10785 8.48295 8.85806 9.23542 9.60987 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.20748 8.58452 8.95911 9.33328 9.71137 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93358 8.30846 8.68363 9.0592 9.4345 9.8095 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03458 8.40957 8.78472 9.15994 9.53531 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13558 8.51067 8.88588 9.26119 9.63647 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.862 8.23673 8.61184 8.98712 9.36242 9.73777 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96306 8.33782 8.71303 9.08828 9.46365 9.83894 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06409 8.43904 8.81429 9.18956 9.5649 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.16529 8.54025 8.91551 9.29083 9.66617 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89181 8.26649 8.6415 9.01683 9.39219 9.7675 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.99296 8.36776 8.74289 9.11818 9.49347 9.8688 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09418 8.46908 8.84425 9.21962 9.59492 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.19547 8.57043 8.94567 9.321 9.69638 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92207 8.2968 8.67191 9.04715 9.42248 9.79774 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02343 8.39822 8.77335 9.14861 9.52393 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.241 273.901 274.509 275.069 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.418 274.061 274.655 275.204 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.896 273.583 274.216 274.799 275.338 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.079 273.753 274.372 274.942 275.469 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.262 273.918 274.522 275.091 275.605 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.438 274.079 274.672 275.223 275.73 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.926 273.611 274.239 274.818 275.352 275.849 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.112 273.782 274.397 274.964 275.486 275.971 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.296 273.948 274.548 275.104 275.615 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.471 274.112 274.697 275.236 275.742 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.966 273.645 274.267 274.841 275.371 275.863 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.15 273.813 274.422 274.984 275.503 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.332 273.98 274.574 275.123 275.631 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.82 273.509 274.14 274.722 275.261 275.759 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.008 273.682 274.301 274.87 275.395 275.882 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.194 273.85 274.454 275.01 275.526 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.372 274.014 274.605 275.151 275.655 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.863 273.548 274.175 274.752 275.286 275.78 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.05 273.718 274.331 274.896 275.419 275.904 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.232 273.884 274.484 275.037 275.549 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.409 274.047 274.633 275.174 275.676 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.903 273.582 274.204 274.778 275.308 275.8 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.085 273.749 274.358 274.92 275.439 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.91293 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.017 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1182 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.83795 10.2176 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94018 10.3195 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0426 10.4216 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1449 10.5258 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.86803 10.2473 10.6264 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97058 10.3497 10.7282 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.073 10.452 10.8304 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1755 10.5543 10.9325 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89882 10.278 10.6566 11.0347 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0014 10.3805 10.759 11.1368 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.104 10.483 10.8612 11.2389 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2067 10.5854 10.9635 11.341 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93004 10.3092 10.6878 11.0658 11.4431 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.354 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.279 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.208 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.379 295.14 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.305 295.073 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.234 295.008 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.164 294.94 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.332 295.097 294.88 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.262 295.03 294.817 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.191 294.965 294.758 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.124 294.903 294.7 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.294 295.058 294.841 294.642 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.223 294.992 294.781 294.587 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.154 294.93 294.723 294.532 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.088 294.867 294.664 294.479 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.256 295.021 294.807 294.609 294.427 + + + + + + 5000 + 5000 + + 2.11548 2.23575 2.41427 2.63918 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.14122 2.27855 2.47068 2.70615 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.17183 2.32496 2.53004 2.77531 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.20696 2.37507 2.59189 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.24651 2.42893 2.65689 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.29014 2.48603 2.72436 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.3378 2.54637 2.79444 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.38922 2.60946 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.44396 2.67559 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.50246 2.74445 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.56357 2.81465 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.62781 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.69397 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.76294 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 207.409 217.285 225.933 233.253 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 210.181 219.752 228.037 235.012 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 212.881 222.101 230.037 236.676 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 215.465 224.357 231.927 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 217.978 226.524 233.747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 220.41 228.599 235.48 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 222.749 230.578 237.127 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 224.993 232.469 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 227.147 234.277 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 229.207 236.003 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 231.16 237.615 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 233.022 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 234.776 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 236.455 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.74514 3.05183 3.37466 3.71119 4.0576 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.8255 3.13668 3.46435 3.80409 4.15374 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.61101 2.90652 3.22281 3.55396 3.89625 4.24663 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.68765 2.98978 3.31045 3.64487 3.98982 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.76669 3.07448 3.39938 3.7371 4.08476 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.84761 3.16052 3.48954 3.82967 4.17808 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.63228 2.93046 3.24814 3.58026 3.92209 4.27322 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.71053 3.01462 3.33663 3.67217 4.01616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.79084 3.09918 3.42514 3.76408 4.10986 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.87199 3.18594 3.51533 3.85494 4.20396 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.65596 2.9557 3.27338 3.60539 3.94828 4.29924 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.73462 3.03937 3.36175 3.69736 4.04246 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.81532 3.1251 3.45187 3.79175 4.1371 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.60158 2.89675 3.21304 3.54365 3.88623 4.23235 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.67894 2.98094 3.30068 3.6336 3.97787 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.75963 3.06666 3.38952 3.72584 4.07179 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.84037 3.15249 3.4804 3.81995 4.16687 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.92348 3.23958 3.57045 3.91314 4.26288 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.00643 3.32737 3.66176 4.0065 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.09192 3.41718 3.75506 4.10058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.18002 3.50876 3.8472 4.1956 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.2669 3.59884 3.94084 4.29129 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.35512 3.69049 4.03503 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 326.245 321.453 317.581 314.393 311.749 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 324.837 320.321 316.639 313.61 311.086 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 328.805 323.525 319.251 315.764 312.883 310.482 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 327.268 322.276 318.232 314.925 312.183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 325.806 321.094 317.265 314.123 311.511 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 324.425 319.973 316.345 313.362 310.885 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 328.328 323.118 318.912 315.48 312.651 310.278 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 326.802 321.89 317.908 314.649 311.961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 325.355 320.738 316.972 313.871 311.315 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 324.011 319.641 316.074 313.144 310.694 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 327.84 322.725 318.605 315.23 312.437 310.101 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 326.35 321.534 317.628 314.421 311.762 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 324.939 320.398 316.691 313.633 311.118 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 328.964 323.629 319.309 315.795 312.89 310.505 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 327.411 322.365 318.298 314.976 312.216 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 325.918 321.171 317.339 314.18 311.555 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 324.543 320.058 316.409 313.409 310.923 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 323.23 319.006 315.555 312.694 310.312 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 322.024 318.016 314.733 312.012 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 320.854 317.062 313.944 311.366 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 319.736 316.146 313.205 310.74 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 318.703 315.301 312.494 310.144 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 317.723 314.492 311.817 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.4881 4.83505 5.19024 5.54455 5.90722 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.58039 4.92903 5.28393 5.64567 6.0052 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.32732 4.67274 5.02388 5.38084 5.74232 6.10447 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.41987 4.76738 5.11965 5.47951 5.83924 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.51273 4.86066 5.21561 5.5729 5.93536 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.60424 4.9547 5.31035 5.66804 6.03102 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.35286 4.69853 5.04857 5.40552 5.76617 6.12863 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.44406 4.79178 5.14518 5.50244 5.8627 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.53608 4.8867 5.24024 5.60001 5.96019 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.28543 4.62965 4.97994 5.3355 5.69533 6.05799 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.377 4.72295 5.07499 5.43178 5.79241 6.15604 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.46955 4.81722 5.17062 5.52851 5.88999 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.56254 4.91189 5.26665 5.62568 5.98806 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.31156 4.65613 5.00715 5.36315 5.72311 6.08616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.40427 4.75236 5.10367 5.45984 5.82079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.49707 4.8466 5.19868 5.55695 5.91876 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.59007 4.9399 5.29502 5.65432 6.01691 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.33991 4.68427 5.03533 5.39165 5.75187 6.11526 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.43157 4.77838 5.13119 5.48862 5.84976 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.52444 4.87322 5.22733 5.58592 5.94789 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.61815 4.96843 5.3239 5.68346 6.0463 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.36655 4.71227 5.06411 5.4208 5.78135 6.14491 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.45943 4.80697 5.16021 5.51798 5.87938 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 257.78 259.977 261.897 263.546 265.022 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 258.396 260.509 262.35 263.973 265.38 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 256.618 258.985 261.023 262.801 264.366 265.736 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 257.29 259.564 261.524 263.248 264.744 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 257.935 260.111 262.005 263.65 265.108 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 258.541 260.64 262.461 264.048 265.458 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 256.801 259.138 261.144 262.904 264.447 265.805 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 257.457 259.704 261.647 263.337 264.822 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 258.088 260.254 262.116 263.758 265.19 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 256.295 258.7 260.773 262.574 264.153 265.546 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 256.981 259.288 261.28 263.016 264.541 265.891 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 257.635 259.851 261.771 263.447 264.922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 258.266 260.396 262.244 263.86 265.286 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 256.497 258.87 260.917 262.698 264.261 265.641 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 257.175 259.464 261.427 263.139 264.648 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 257.823 260.019 261.905 263.562 265.021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 258.441 260.545 262.371 263.972 265.383 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 256.701 259.039 261.06 262.821 264.367 265.732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 257.359 259.608 261.556 263.254 264.747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 257.993 260.155 262.03 263.671 265.116 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 258.602 260.682 262.49 264.074 265.47 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 256.872 259.189 261.189 262.931 264.461 265.814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 257.525 259.75 261.677 263.358 264.837 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.24338 6.61815 6.99386 7.37214 7.74586 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.34447 6.72362 7.09555 7.4723 7.84652 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07369 6.44742 6.8252 7.19648 7.56956 7.94694 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17534 6.54605 6.92574 7.299 7.67154 8.04762 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.27219 6.64665 7.02336 7.39658 7.77174 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.37157 6.74687 7.12066 7.49644 7.87306 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.09824 6.47335 6.84615 7.22135 7.59774 7.9745 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19816 6.57196 6.94686 7.32266 7.69907 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.29891 6.67299 7.04802 7.42399 7.80051 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.39951 6.77402 7.14934 7.5255 7.90212 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12674 6.50042 6.87523 7.25085 7.62696 8.00366 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22746 6.60141 6.97644 7.35223 7.72863 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.32827 6.70257 7.0779 7.4539 7.83031 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05598 6.42934 6.80378 7.17935 7.55544 7.932 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15685 6.53053 6.9053 7.28091 7.65711 8.0338 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25778 6.63175 7.00674 7.38256 7.7589 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.35886 6.73316 7.10836 7.48429 7.86073 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08665 6.46 6.83457 7.21001 7.5861 7.96265 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18749 6.56122 6.93612 7.31176 7.68796 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.28863 6.6627 7.03767 7.41344 7.7898 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.38973 6.76404 7.13935 7.51536 7.89179 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.11759 6.49106 6.86569 7.24113 7.6172 7.99372 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.21862 6.59241 6.96727 7.34294 7.71922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.595 301.711 300.926 300.224 299.604 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.332 301.468 300.717 300.038 299.434 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 303.007 302.073 301.238 300.514 299.863 299.271 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.726 301.833 301.023 300.317 299.684 299.11 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.474 301.598 300.82 300.132 299.513 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.222 301.373 300.624 299.953 299.348 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.902 301.971 301.157 300.427 299.774 299.186 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.634 301.738 300.945 300.236 299.601 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.375 301.508 300.737 300.05 299.433 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.123 301.284 300.538 299.871 299.271 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.8 301.882 301.069 300.344 299.695 299.112 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.535 301.646 300.858 300.156 299.526 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.279 301.42 300.656 299.974 299.361 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.973 302.033 301.2 300.458 299.795 299.2 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.703 301.793 300.987 300.268 299.625 299.045 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.442 301.562 300.781 300.083 299.457 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.192 301.34 300.581 299.903 299.295 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.882 301.948 301.122 300.387 299.729 299.138 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.613 301.712 300.913 300.2 299.56 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.358 301.485 300.708 300.015 299.394 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.108 301.262 300.511 299.839 299.235 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 302.792 301.869 301.051 300.32 299.666 299.078 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 302.529 301.634 300.84 300.133 299.499 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11722 8.48745 8.85921 9.23075 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.21673 8.58629 8.95889 9.33088 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9429 8.31372 8.68573 9.05803 9.43123 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04218 8.4137 8.78573 9.15854 9.53224 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.14249 8.51379 8.88597 9.26604 9.63713 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.24245 8.61364 8.98665 9.36285 9.73693 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97039 8.34171 8.71381 9.0874 9.46022 9.83429 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07025 8.44262 8.81599 9.19009 9.5614 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.17137 8.54327 8.91551 9.29 9.66179 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.27023 8.64402 9.01577 9.3872 9.76265 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.99889 8.37032 8.74232 9.11502 9.48764 9.86028 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09882 8.4705 8.84265 9.21511 9.58786 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.19897 8.57081 8.943 9.31552 9.68826 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92789 8.29911 8.67103 9.04342 9.41609 9.78899 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02793 8.39935 8.77149 9.14389 9.51658 9.8894 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12807 8.49968 8.87185 9.24437 9.61717 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.22828 8.60004 8.97237 9.34499 9.71778 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95735 8.32862 8.70049 9.0729 9.44557 9.81843 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05755 8.42899 8.80104 9.1735 9.54619 9.91912 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15782 8.52943 8.90161 9.27421 9.64696 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.25822 8.62998 9.00227 9.37489 9.74774 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.98737 8.35866 8.7306 9.10297 9.47567 9.8485 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08773 8.4592 8.83131 9.20376 9.57647 NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.218 271.959 272.644 273.275 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.416 272.14 272.811 273.43 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.83 271.606 272.319 272.973 273.58 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.038 271.796 272.492 273.135 273.731 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.243 271.984 272.665 273.306 273.884 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.445 272.167 272.833 273.454 274.027 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.869 271.639 272.346 273 273.602 274.162 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.078 271.832 272.526 273.165 273.752 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.287 272.022 272.697 273.323 273.899 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.484 272.205 272.865 273.473 274.044 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.914 271.68 272.382 273.029 273.626 274.18 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.125 271.872 272.556 273.188 273.774 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.328 272.057 272.729 273.348 273.922 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.753 271.53 272.242 272.897 273.502 274.064 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.966 271.723 272.419 273.061 273.655 274.207 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.173 271.914 272.595 273.223 273.803 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.376 272.099 272.764 273.379 273.949 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.803 271.573 272.28 272.931 273.533 274.091 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.013 271.766 272.457 273.094 273.683 274.23 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.219 271.954 272.629 273.253 273.83 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.418 272.136 272.797 273.408 273.974 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.847 271.613 272.315 272.962 273.56 274.114 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.055 271.802 272.488 273.121 273.707 NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.96698 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0704 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1713 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89221 10.2704 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99408 10.3719 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.096 10.4736 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.198 10.5775 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.92221 10.2999 10.6776 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0243 10.4019 10.7792 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1264 10.5039 10.8809 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2285 10.6058 10.9827 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95283 10.3305 10.7078 11.0846 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0551 10.4327 10.8098 11.1864 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1573 10.5347 10.9117 11.2882 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2595 10.6368 11.0137 11.39 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.98402 10.3617 10.7389 11.1156 11.4917 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.981 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.889 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.802 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.016 296.72 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.927 296.638 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.839 296.557 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.754 296.477 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.965 296.671 296.4 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.876 296.589 296.326 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.792 296.511 296.252 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.708 296.433 296.18 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.919 296.626 296.358 296.11 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.833 296.547 296.284 296.041 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.75 296.469 296.212 295.974 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.666 296.393 296.142 295.909 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.878 296.587 296.318 296.071 295.843 + + + + + + 5000 + 5000 + + 1.23823 1.43501 1.70067 2.00793 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.28243 1.50128 1.78028 2.09568 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.33358 1.57132 1.86227 2.18464 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.39039 1.64507 1.94576 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.45266 1.72229 2.032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.51983 1.80247 2.11999 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.59127 1.88516 2.20952 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.66633 1.97007 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.7448 2.05747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.82615 2.1467 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.90956 2.23617 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.99521 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.08189 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.17074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.26106 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 217.094 231.741 242.36 249.938 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 221.48 234.978 244.661 251.591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 225.551 237.901 246.748 253.104 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 229.254 240.572 248.649 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 232.678 243.022 250.407 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 235.824 245.261 252.022 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 238.696 247.31 253.513 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 241.321 249.19 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 243.716 250.915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 245.916 252.513 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 247.91 253.952 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 249.741 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 251.402 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 252.937 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 254.353 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.23151 2.59747 2.96837 3.34463 3.72401 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.32927 2.69641 3.06987 3.44734 3.82845 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.06582 2.4265 2.79581 3.17031 3.5485 3.92888 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.16142 2.52525 2.89612 3.27166 3.65078 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.25849 2.62459 2.99706 3.37391 3.75413 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.35651 2.7246 3.09868 3.47592 3.8552 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.093 2.45548 2.82532 3.20007 3.57716 3.95792 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.18997 2.55481 2.9263 3.30237 3.67981 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.28821 2.65366 3.02635 3.40385 3.78147 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.38589 2.75394 3.12766 3.50374 3.88333 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.12256 2.48548 2.85424 3.2282 3.60582 3.98591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.21958 2.58389 2.95468 3.33014 3.70836 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.31763 2.68358 3.05638 3.43431 3.811 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.05411 2.41508 2.78499 3.15928 3.53803 3.9138 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.15058 2.51492 2.88506 3.25923 3.63788 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.24957 2.6153 2.98569 3.36133 3.74002 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.34725 2.71497 3.08818 3.46499 3.84283 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.44651 2.81492 3.18865 3.56696 3.94646 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.54413 2.91489 3.29014 3.66877 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.64409 3.01641 3.39306 3.77069 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.74588 3.11926 3.49432 3.87348 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.84553 3.21976 3.5967 3.97645 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.94578 3.32133 3.69921 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 307.927 304.622 302.161 300.255 298.739 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 306.919 303.884 301.585 299.796 298.365 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 309.82 306.007 303.198 301.056 299.374 298.027 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 308.669 305.162 302.555 300.555 298.973 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 307.602 304.379 301.958 300.085 298.594 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 306.629 303.656 301.4 299.642 298.242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 309.462 305.729 302.978 300.878 299.234 297.907 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 308.325 304.903 302.354 300.39 298.842 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 307.287 304.15 301.778 299.933 298.477 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 306.346 303.443 301.235 299.516 298.133 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 309.105 305.47 302.791 300.734 299.112 297.805 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 308.012 304.68 302.187 300.257 298.73 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 307.007 303.938 301.615 299.801 298.372 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 309.969 306.095 303.243 301.077 299.376 298.03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 308.805 305.243 302.608 300.588 298.988 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 307.715 304.448 302.015 300.124 298.619 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 306.744 303.734 301.455 299.677 298.264 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 305.838 303.061 300.94 299.268 297.93 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 305.023 302.443 300.456 298.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 304.254 301.853 299.99 298.514 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 303.529 301.296 299.563 298.166 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 302.874 300.791 299.154 297.834 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 302.262 300.311 298.768 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.1554 4.52942 4.90831 5.28291 5.66373 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.25539 4.63015 5.00769 5.3894 5.76615 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 3.98051 4.35514 4.73137 5.11023 5.49095 5.86992 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.08143 4.45701 4.83346 5.21457 5.59267 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.18242 4.55719 4.93548 5.31296 5.6933 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.28153 4.65784 5.03591 5.41309 5.79339 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.00874 4.38325 4.75803 5.13665 5.51628 5.89535 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.10813 4.48362 4.86099 5.239 5.61747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.20808 4.5854 4.96184 5.34183 5.71959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.30925 4.68511 5.0629 5.44213 5.82183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.03557 4.41003 4.78658 5.16469 5.544 5.9242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.13625 4.51124 4.8883 5.26683 5.64646 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.23707 4.61276 4.9903 5.36918 5.74902 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 3.96437 4.33823 4.71448 5.09238 5.47155 5.85158 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.06549 4.44183 4.81739 5.19463 5.5741 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.16639 4.54304 4.91835 5.29699 5.67669 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.26709 4.64287 5.02047 5.39947 5.77939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 3.99546 4.36871 4.7447 5.12273 5.50196 5.88209 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.09529 4.4699 4.84675 5.22506 5.60455 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.19601 4.57147 4.94873 5.32753 5.70726 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.29724 4.67322 5.05101 5.43008 5.81005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.02435 4.39874 4.77523 5.15338 5.53274 5.91291 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.12533 4.50036 4.87738 5.25587 5.63549 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 269.155 270.601 271.84 272.887 273.814 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 269.561 270.941 272.124 273.153 274.036 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 268.371 269.945 271.272 272.41 273.398 274.253 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 268.822 270.324 271.591 272.689 273.631 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 269.248 270.675 271.896 272.942 273.857 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 269.646 271.017 272.186 273.19 274.072 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 268.489 270.039 271.341 272.465 273.437 274.286 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 268.928 270.407 271.661 272.738 273.672 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 269.346 270.765 271.964 273.004 273.901 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 269.752 271.101 272.253 273.25 274.121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 268.608 270.133 271.424 272.533 273.494 274.336 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 269.046 270.503 271.741 272.805 273.729 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 269.467 270.856 272.041 273.064 273.957 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 268.287 269.863 271.194 272.333 273.318 274.178 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 268.745 270.255 271.522 272.61 273.558 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 269.175 270.614 271.827 272.878 273.793 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 269.584 270.955 272.125 273.135 274.017 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 268.43 269.977 271.287 272.41 273.382 274.234 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 268.87 270.349 271.605 272.684 273.621 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 269.291 270.705 271.909 272.947 273.85 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 269.693 271.045 272.2 273.199 274.071 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 268.544 270.074 271.369 272.479 273.442 274.284 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 268.978 270.439 271.68 272.747 273.673 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02398 6.40977 6.79536 7.18251 7.56411 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12829 6.51821 6.89963 7.28502 7.66695 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.84911 6.2345 6.62274 7.00313 7.38445 7.76936 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.95428 6.3361 6.72593 7.10808 7.48869 7.87213 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05417 6.43959 6.82608 7.208 7.59104 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15664 6.54257 6.92579 7.31006 7.69441 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87482 6.26154 6.64452 7.02891 7.41359 7.79787 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97804 6.36299 6.74784 7.13259 7.51709 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08191 6.46687 6.8516 7.23626 7.62062 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18565 6.57063 6.95533 7.33992 7.72424 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.90437 6.28946 6.67446 7.05926 7.44363 7.82776 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00832 6.39337 6.77831 7.16294 7.54733 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11228 6.49728 6.8822 7.26684 7.65109 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.83128 6.21632 6.60119 6.98611 7.37061 7.75476 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93543 6.32045 6.70535 7.09001 7.47436 7.85847 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03955 6.42449 6.80927 7.1939 7.57822 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14361 6.52856 6.91332 7.29787 7.68206 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.86274 6.24774 6.63266 7.01734 7.40175 7.78585 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9669 6.35182 6.7367 7.12134 7.5057 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07106 6.45605 6.84081 7.22535 7.60959 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17523 6.56011 6.94484 7.32935 7.7135 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.89442 6.27938 6.66425 7.04894 7.43335 7.81739 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 5.99861 6.3836 6.76842 7.15301 7.53734 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.008 293.597 293.237 292.92 292.643 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.878 293.477 293.135 292.831 292.562 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.189 293.754 293.368 293.039 292.747 292.483 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.054 293.639 293.265 292.945 292.664 292.41 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.932 293.525 293.169 292.859 292.583 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.811 293.418 293.077 292.775 292.505 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.126 293.692 293.317 292.983 292.69 292.43 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.998 293.58 293.216 292.894 292.611 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.873 293.472 293.12 292.809 292.532 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.755 293.366 293.024 292.724 292.458 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.069 293.639 293.264 292.935 292.644 292.385 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.943 293.53 293.167 292.848 292.565 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.822 293.423 293.072 292.763 292.49 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.148 293.706 293.32 292.982 292.682 292.417 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.02 293.594 293.222 292.894 292.604 292.346 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.897 293.486 293.125 292.808 292.528 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.776 293.38 293.034 292.727 292.455 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.101 293.664 293.281 292.944 292.646 292.381 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.976 293.552 293.182 292.857 292.57 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.853 293.446 293.09 292.775 292.494 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.737 293.342 292.996 292.692 292.421 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 294.056 293.621 293.242 292.909 292.614 292.351 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 293.93 293.511 293.145 292.821 292.535 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94928 8.32844 8.70843 9.08753 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05126 8.42955 8.81023 9.18964 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.77045 8.15067 8.53128 8.91141 9.29186 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87237 8.25302 8.63341 9.01395 9.39479 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97522 8.35548 8.73588 9.12365 9.50161 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07777 8.45765 8.83864 9.22227 9.6032 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.79883 8.17944 8.56004 8.9415 9.32154 9.70228 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90132 8.28281 8.66454 9.0463 9.4246 9.80377 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00511 8.38587 8.7662 9.14818 9.52685 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10643 8.48891 8.86858 9.24729 9.62955 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82827 8.20897 8.58944 8.96992 9.34966 9.72887 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9309 8.31159 8.69194 9.07196 9.45171 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03356 8.41418 8.79446 9.17442 9.554 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13627 8.5168 8.89704 9.27691 9.65648 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.85838 8.23893 8.61943 8.99953 9.37934 9.75875 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96105 8.34161 8.72202 9.10207 9.48179 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06385 8.44431 8.82463 9.20459 9.58418 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.78604 8.16662 8.54699 8.92724 9.30714 9.68664 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88885 8.26939 8.64978 9.02989 9.40961 9.78905 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9917 8.37219 8.75249 9.13256 9.51222 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09457 8.475 8.85525 9.23519 9.6148 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.81685 8.19742 8.57785 8.958 9.33784 9.71728 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9198 8.30031 8.68067 9.06073 9.44046 9.81981 NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.693 278.165 278.599 279 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.816 278.276 278.701 279.094 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.441 277.932 278.384 278.8 279.185 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.569 278.05 278.492 278.9 279.277 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.698 278.167 278.597 279.004 279.371 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.821 278.279 278.703 279.096 279.459 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.453 277.942 278.391 278.805 279.186 279.541 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.584 278.062 278.501 278.906 279.279 279.627 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.714 278.179 278.608 279.005 279.37 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.837 278.294 278.712 279.097 279.458 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.476 277.96 278.404 278.813 279.192 279.543 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.606 278.079 278.513 278.914 279.285 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.735 278.197 278.621 279.012 279.375 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.86 278.31 278.724 279.109 279.465 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.501 277.981 278.423 278.829 279.204 279.552 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.634 278.103 278.532 278.928 279.296 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.76 278.217 278.639 279.028 279.389 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.396 277.885 278.332 278.743 279.123 279.476 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.529 278.005 278.442 278.844 279.217 279.564 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.658 278.123 278.55 278.944 279.309 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.784 278.238 278.655 279.041 279.399 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.422 277.906 278.349 278.758 279.136 279.486 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.552 278.024 278.458 278.858 279.228 279.572 NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81866 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.92323 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0251 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1253 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84617 10.2278 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94918 10.3305 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0522 10.4354 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.77359 10.1552 10.5365 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87675 10.2582 10.6388 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97985 10.3611 10.7416 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.083 10.464 10.8442 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80451 10.186 10.5668 10.9469 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90773 10.2891 10.6697 11.0496 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.011 10.3921 10.7725 11.1521 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1142 10.4951 10.8753 11.2547 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.83583 10.2173 10.5981 10.9781 11.3573 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.54 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.503 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.47 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.438 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.504 291.407 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.472 291.377 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.438 291.345 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.507 291.407 291.317 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.474 291.377 291.289 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.442 291.347 291.262 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.411 291.319 291.236 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.481 291.382 291.291 291.21 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.448 291.35 291.263 291.185 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.417 291.323 291.238 291.16 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.387 291.294 291.21 291.137 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.456 291.357 291.268 291.187 291.114 + + + + + + 5000 + 5000 + + 1.87029 2.0055 2.20286 2.44731 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.89949 2.05306 2.2646 2.51958 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.93403 2.10461 2.32933 2.59381 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 1.9735 2.16002 2.39642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.0176 2.21904 2.46661 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.06615 2.28159 2.53936 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.11908 2.34717 2.6143 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.17561 2.41564 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.23598 2.48712 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.2996 2.561 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.36621 2.63629 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.4356 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.50692 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.581 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.65721 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + 209.157 220.094 229.37 236.965 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 212.259 222.774 231.579 238.751 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 215.258 225.3 233.658 240.429 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 218.105 227.703 235.607 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 220.852 229.995 237.469 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 223.487 232.166 239.225 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 225.995 234.221 240.886 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 228.384 236.165 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 230.65 238.008 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 232.805 239.759 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 234.822 241.375 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 236.736 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 238.52 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 240.216 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 241.816 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN 2.58019 2.90372 3.24088 3.58967 3.94642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 2.66545 2.99283 3.33426 3.68564 4.04517 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.43736 2.75107 3.08291 3.42714 3.78062 4.14057 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.51921 2.83878 3.17436 3.52132 3.87693 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.60326 2.92775 3.26687 3.61665 3.97451 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 2.68903 3.01802 3.36056 3.71222 4.07034 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.46034 2.77645 3.10946 3.4545 3.80732 4.16786 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.54362 2.86502 3.20179 3.54972 3.90421 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.62906 2.9538 3.29374 3.64452 4.00031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 2.71488 3.04451 3.38732 3.7383 4.097 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.48558 2.80316 3.13587 3.48067 3.83435 4.19452 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.56936 2.89113 3.22784 3.57569 3.93119 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.65497 2.98092 3.32153 3.67312 4.02839 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 2.74092 3.0729 3.41678 3.77058 4.12603 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.51005 2.82968 3.16427 3.50971 3.86476 4.22459 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.5957 2.9196 3.25662 3.60504 3.96134 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.68132 3.00965 3.35117 3.70216 4.05873 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.76907 3.10053 3.44432 3.79807 4.15728 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.85625 3.19197 3.53891 3.89417 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 2.94606 3.28527 3.635 3.99069 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.03803 3.38033 3.73014 4.08827 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.12888 3.47362 3.82647 4.18617 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 3.22066 3.5683 3.9233 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN 321.962 317.368 313.74 310.807 308.402 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 320.601 316.305 312.871 310.092 307.801 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 324.459 319.341 315.3 312.062 309.428 307.258 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 322.956 318.15 314.348 311.291 308.792 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 321.535 317.03 313.448 310.557 308.183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 320.204 315.978 312.598 309.863 307.618 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 323.994 318.952 314.981 311.799 309.215 307.074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 322.501 317.784 314.047 311.04 308.591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 321.103 316.698 313.177 310.325 308.004 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN 319.808 315.662 312.348 309.665 307.447 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 323.517 318.581 314.697 311.572 309.022 306.91 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 322.067 317.451 313.787 310.829 308.41 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 320.704 316.378 312.92 310.111 307.829 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN 319.446 315.357 312.095 309.436 307.276 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 323.104 318.243 314.413 311.34 308.822 306.746 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 321.651 317.107 313.52 310.612 308.226 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 320.326 316.064 312.664 309.909 307.652 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 319.07 315.075 311.872 309.257 307.105 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 317.919 314.154 311.123 308.642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 316.815 313.266 310.397 308.054 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 315.76 312.419 309.725 307.492 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 314.795 311.643 309.078 306.952 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + 313.881 310.899 308.463 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.38034 4.73555 5.09812 5.45875 5.82724 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.47493 4.83162 5.19359 5.56158 5.92646 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.21529 4.56957 4.92845 5.29213 5.65977 6.02721 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.31029 4.6664 5.02619 5.39267 5.75814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.4057 4.76187 5.124 5.48762 5.8557 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 4.49952 4.85799 5.22056 5.5843 5.95274 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.24151 4.596 4.95372 5.31745 5.68413 6.05173 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.33521 4.69149 5.05236 5.41597 5.78202 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.42976 4.78856 5.1491 5.51531 5.88099 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 4.52555 4.88376 5.24629 5.61215 5.98021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.26657 4.62125 4.98083 5.34422 5.71069 6.07958 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.36151 4.71754 5.07825 5.44266 5.80991 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 4.45692 4.81441 5.17622 5.54142 5.90929 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.19934 4.55283 4.9116 5.27438 5.6404 6.00887 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.29455 4.65121 5.0102 5.37287 5.73965 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.38985 4.74767 5.10698 5.47162 5.83905 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 4.48518 4.843 5.20509 5.57058 5.93864 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.22844 4.58165 4.94039 5.30347 5.6697 6.03839 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.32262 4.67794 5.0382 5.40212 5.76905 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.41788 4.7748 5.1361 5.50103 5.86862 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 4.51384 4.87205 5.2345 5.60019 5.96841 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.25579 4.61029 4.96973 5.33309 5.69955 6.06835 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 4.3511 4.70705 5.06766 5.43193 5.7991 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN 260.719 262.747 264.508 266.012 267.353 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 261.287 263.233 264.919 266.401 267.68 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 259.638 261.829 263.706 265.333 266.757 268 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 260.263 262.364 264.163 265.738 267.099 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 260.859 262.866 264.602 266.105 267.43 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 261.418 263.351 265.02 266.466 267.746 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 259.808 261.97 263.815 265.423 266.827 268.06 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 260.417 262.49 264.273 265.818 267.169 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 260.999 262.998 264.706 266.203 267.503 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN 261.568 263.473 265.121 266.559 267.824 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 259.973 262.106 263.937 265.526 266.915 268.139 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 260.583 262.628 264.389 265.917 267.257 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN 261.166 263.126 264.819 266.294 267.59 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 259.526 261.723 263.607 265.237 266.66 267.91 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 260.157 262.272 264.074 265.637 267.009 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 260.757 262.782 264.511 266.023 267.35 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN 261.328 263.265 264.938 266.396 267.677 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 259.718 261.881 263.738 265.348 266.754 267.993 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 260.329 262.404 264.192 265.743 267.101 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 260.915 262.909 264.628 266.123 267.435 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN 261.479 263.392 265.045 266.488 267.757 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 259.876 262.018 263.855 265.448 266.841 268.068 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN 260.482 262.536 264.303 265.837 267.181 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.16962 6.54801 6.92715 7.30826 7.68477 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.27165 6.65432 7.02978 7.40928 7.78621 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99802 6.37568 6.7572 7.1314 7.5073 7.88727 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10104 6.47535 6.85845 7.23459 7.61008 7.98866 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19881 6.57705 6.95693 7.33324 7.711 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.29916 6.67804 7.05515 7.43372 7.81299 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02296 6.40212 6.77828 7.15663 7.53581 7.91511 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12404 6.5016 6.87986 7.25869 7.63788 8.01726 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22582 6.60359 6.98195 7.36085 7.74003 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.32755 6.70555 7.08404 7.46306 7.84231 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05186 6.42937 6.80764 7.18641 7.56535 7.94454 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15369 6.53142 6.90979 7.28855 7.66764 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25558 6.63346 7.01201 7.39097 7.77007 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.98034 6.35762 6.73561 7.11436 7.49331 7.87242 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08233 6.45983 6.83803 7.21671 7.59568 7.9749 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18437 6.56203 6.94029 7.31911 7.69817 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.28642 6.66432 7.04275 7.42164 7.80069 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01129 6.38859 6.76667 7.14522 7.52412 7.90325 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11331 6.49076 6.86899 7.24769 7.6267 8.00585 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21539 6.59318 6.9715 7.35025 7.72925 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.31764 6.69549 7.07394 7.4528 7.83187 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.04251 6.41983 6.79792 7.17654 7.55548 7.93455 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 6.14461 6.52223 6.90045 7.2791 7.6581 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.298 299.533 298.856 298.253 297.721 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.067 299.319 298.673 298.093 297.576 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.648 299.842 299.122 298.499 297.94 297.433 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.406 299.634 298.934 298.326 297.787 297.296 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.186 299.43 298.76 298.17 297.64 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.968 299.235 298.591 298.014 297.497 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.555 299.751 299.048 298.421 297.86 297.357 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.323 299.548 298.864 298.255 297.711 297.223 NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.097 299.349 298.687 298.095 297.566 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.881 299.155 298.512 297.94 297.427 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.464 299.669 298.969 298.346 297.791 297.291 NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.235 299.468 298.788 298.184 297.643 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.014 299.27 298.612 298.027 297.503 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.614 299.799 299.081 298.444 297.874 297.364 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.38 299.593 298.897 298.279 297.727 297.231 NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.155 299.394 298.719 298.12 297.584 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.936 299.2 298.548 297.966 297.445 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.533 299.727 299.014 298.381 297.815 297.309 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.303 299.522 298.831 298.218 297.671 297.179 NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.079 299.325 298.657 298.062 297.528 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.866 299.135 298.486 297.908 297.391 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 300.456 299.655 298.949 298.322 297.762 297.258 NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN 300.227 299.455 298.77 298.161 297.616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06111 8.43415 8.80858 9.18254 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.16148 8.53378 8.90889 9.28339 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88539 8.25919 8.63398 9.00877 9.38428 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9855 8.35989 8.73458 9.10991 9.48583 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08649 8.46076 8.8356 9.21827 9.59149 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.18742 8.56138 8.93687 9.3154 9.69205 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91313 8.2874 8.66222 9.03828 9.41343 9.78971 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01383 8.38917 8.76522 9.14163 9.5153 9.89003 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11592 8.4906 8.86532 9.24231 9.61643 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.21545 8.59206 8.96626 9.34007 9.71783 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94188 8.31629 8.69105 9.06625 9.44121 9.81589 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04274 8.4173 8.79205 9.1669 9.54192 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.14363 8.51827 8.89309 9.26804 9.64299 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87036 8.24463 8.61934 8.99424 9.36919 9.74421 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97131 8.34562 8.72042 9.09529 9.47031 9.84528 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.0722 8.44671 8.82156 9.19648 9.57148 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.17328 8.54782 8.9227 9.29765 9.67265 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90014 8.27437 8.64896 9.02391 9.39892 9.77391 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00116 8.37551 8.75024 9.12516 9.50011 9.87512 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10225 8.47672 8.8515 9.22651 9.60147 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.20343 8.57797 8.95282 9.32779 9.70284 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93036 8.30463 8.67933 9.0542 9.42918 9.80412 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03159 8.40594 8.78068 9.15557 9.53054 9.9055 NaN NaN NaN NaN + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.963 273.635 274.254 274.825 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.143 273.798 274.404 274.962 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.612 273.312 273.956 274.55 275.098 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.798 273.485 274.115 274.696 275.233 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.985 273.654 274.268 274.847 275.37 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.165 273.817 274.421 274.982 275.499 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.643 273.34 273.98 274.57 275.113 275.619 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.833 273.515 274.141 274.718 275.249 275.743 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.021 273.684 274.295 274.861 275.381 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.198 273.851 274.447 274.996 275.51 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.684 273.376 274.009 274.593 275.133 275.634 NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.872 273.547 274.167 274.739 275.268 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.058 273.717 274.323 274.881 275.398 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.537 273.238 273.881 274.473 275.021 275.529 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.728 273.414 274.043 274.623 275.158 275.654 NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.917 273.586 274.2 274.766 275.292 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.098 273.752 274.354 274.909 275.423 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.58 273.277 273.916 274.504 275.047 275.55 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.771 273.451 274.075 274.65 275.182 275.676 NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.956 273.62 274.23 274.794 275.315 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.136 273.785 274.383 274.934 275.444 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.621 273.312 273.946 274.53 275.07 275.571 NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.807 273.482 274.103 274.675 275.204 275.694 NaN NaN NaN NaN + + + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.91742 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0215 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1227 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.222 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94466 10.3238 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.047 10.4259 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1493 10.5301 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87254 10.2517 10.6307 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97505 10.354 10.7324 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0775 10.4563 10.8346 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1799 10.5586 10.9367 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90331 10.2824 10.6609 11.0388 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0059 10.3848 10.7632 11.141 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1085 10.4873 10.8654 11.243 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2111 10.5896 10.9676 11.3451 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93452 10.3136 10.692 11.0699 11.4471 + + + + 5000 + 5000 + + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.499 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.423 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.35 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.281 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.45 295.212 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.378 295.146 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.305 295.077 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.479 295.237 295.015 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.406 295.169 294.952 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.334 295.103 294.891 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.265 295.039 294.831 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.439 295.198 294.976 294.773 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.367 295.131 294.915 294.717 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.297 295.067 294.856 294.66 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.229 295.002 294.796 294.606 + NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.401 295.161 294.942 294.74 294.553 + + + + + + 6.25064122361692 + 284.478219237802 + + + 6.09198716843552 + 284.112220821742 + + + 6.12972258765456 + 284.225258143 + + + 6.12130212971328 + 284.052669982142 + + + 5.95823357350295 + 283.758000616276 + + + 6.00440443416997 + 283.869081343775 + + + 6.05770703720214 + 284.027099532072 + + + 5.98094371672299 + 283.807419436709 + + + 6.17101781342723 + 284.324458406957 + + + 6.20897376906843 + 284.423103788365 + + + 6.30264997448819 + 284.590440102053 + + + 6.02838543893148 + 283.819400338538 + + + 6.22678567178944 + 284.322311115097 + + + + + + + 3.500058 + 3.354197 + 0.022900 + 0.000000 + 0.000000 + 8.675177 + 0.268831 + 2.812220 + 83.179593 + 0.992827 + 0.571295 + 0.275278 + 0.038401 + 3.186380 + 0.000000 + 0.0 + 0.0 + 0.0 + CAMS + 0.392921 + 1.224094 + AUX_ECMWFT + 357.927923 + + + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B01.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B01.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B02.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B02.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B03.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B03.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B04.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B04.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B05.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B05.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B06.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B06.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B07.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B07.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B08.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B08.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B8A.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B8A.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B09.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B09.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B10.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B10.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B11.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B11.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B12.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B12.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_CLASSI_B00.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_CLDPRB_20m.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_SNWPRB_20m.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_CLDPRB_60m.jp2 + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_SNWPRB_60m.jp2 + + GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/T50TMK_20240411T030521_PVI.jp2 + + +""" mtd_l1c_old_xml = """ @@ -869,15 +5781,17 @@ def setup_method(self): """Set up the test case.""" from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A") - self.xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_tile_xml), filename_info, mock.MagicMock()) - self.old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), filename_info, mock.MagicMock()) - self.xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=True) + self.l1c_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), filename_info, mock.MagicMock()) + self.l2a_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l2a_tile_xml), filename_info, mock.MagicMock()) + self.l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), filename_info, mock.MagicMock()) + self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=True) + # self.l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), filename_info, mock.MagicMock(), mask_saturated=True) def test_satellite_zenith_array(self): """Test reading the satellite zenith array.""" info = dict(xml_tag="Viewing_Incidence_Angles_Grids", xml_item="Zenith") - expected_data = np.array([[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, + expected_data_l1c = np.array([[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], @@ -897,17 +5811,41 @@ def test_satellite_zenith_array(self): 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]) - res = self.xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle", + expected_data_l2a = np.array([[ 0.823021, 1.57224058, 2.40477933, 3.33521808, 4.29339294, 5.21712818, + 6.13685593, 7.07123343, 7.9968313, 8.91635508], + [ 0.99274285, 1.78598401, 2.6537931, 3.59082788, 4.54147721, 5.47021744, + 6.39166677, 7.31780035, 8.24199199, 9.16344605], + [ 1.19102539, 2.01811264, 2.90509575, 3.843318, 4.79014776, 5.71596442, + 6.63842562, 7.56669001, 8.49008303, 9.41563303], + [ 1.40805629, 2.22663763, 3.15710255, 4.11212841, 5.0389507, 5.95589868, + 6.88741709, 7.81585111, 8.74029188, 9.66309923], + [ 1.6364984, 2.47693166, 3.40635124, 4.36058177, 5.28712709, 6.20731242, + 7.1382703, 8.0645253, 8.98640945, 9.91275701], + [ 1.86939307, 2.72734103, 3.6589573, 4.61010637, 5.53711387, 6.45878796, + 7.38909762, 8.31322866, 9.23367977, 10.16133622], + [ 2.05092764, 2.97881829, 3.93023614, 4.86081228, 5.78239877, 6.71040601, + 7.63930914, 8.5619639, 9.48322901, 10.40935204], + [ 2.30188982, 3.2312058, 4.18234794, 5.11071768, 6.032489, 6.96190824, + 7.88904158, 8.81055152, 9.73186255, 10.65685334], + [ 2.55171923, 3.48266186, 4.4345628, 5.36132917, 6.28264069, 7.2133112, + 8.13807392, 9.05916615, 9.98720691, 10.90435203], + [ 2.80292458, 3.74216648, 4.68491268, 5.61065107, 6.53464742, 7.46456958, + 8.38738208, 9.3076386, 10.23571319, 11.15166785]]) + res1 = self.l1c_xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle", + resolution=60), + info)[::200, ::200] + res2 = self.l2a_xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle_l2a", resolution=60), info)[::200, ::200] - np.testing.assert_allclose(res, expected_data) + np.testing.assert_allclose(res1, expected_data_l1c) + np.testing.assert_allclose(res2, expected_data_l2a) def test_old_xml_calibration(self): """Test the calibration of older data formats (no offset).""" fake_data = xr.DataArray([[[0, 1, 2, 3], [4, 1000, 65534, 65535]]], dims=["band", "x", "y"]) - result = self.old_xml_fh.calibrate_to_reflectances(fake_data, "B01") + result = self.l1c_old_xml_fh.calibrate_to_reflectances(fake_data, "B01") np.testing.assert_allclose(result, [[[np.nan, 0.01, 0.02, 0.03], [0.04, 10, 655.34, np.inf]]]) @@ -916,7 +5854,7 @@ def test_xml_calibration(self): fake_data = xr.DataArray([[[0, 1, 2, 3], [4, 1000, 65534, 65535]]], dims=["band", "x", "y"]) - result = self.xml_fh.calibrate_to_reflectances(fake_data, "B01") + result = self.l1c_xml_fh.calibrate_to_reflectances(fake_data, "B01") np.testing.assert_allclose(result, [[[np.nan, 0.01 - 10, 0.02 - 10, 0.03 - 10], [0.04 - 10, 0, 655.34 - 10, np.inf]]]) @@ -925,7 +5863,7 @@ def test_xml_calibration_to_counts(self): fake_data = xr.DataArray([[[0, 1, 2, 3], [4, 1000, 65534, 65535]]], dims=["band", "x", "y"]) - result = self.xml_fh._sanitize_data(fake_data) + result = self.l1c_xml_fh._sanitize_data(fake_data) np.testing.assert_allclose(result, [[[np.nan, 1, 2, 3], [4, 1000, 65534, np.inf]]]) @@ -933,12 +5871,12 @@ def test_xml_calibration_unmasked_saturated(self): """Test the calibration with radiometric offset but unmasked saturated pixels.""" from satpy.readers.msi_safe import SAFEMSIMDXML filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A") - self.xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=False) + self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=False) fake_data = xr.DataArray([[[0, 1, 2, 3], [4, 1000, 65534, 65535]]], dims=["band", "x", "y"]) - result = self.xml_fh.calibrate_to_reflectances(fake_data, "B01") + result = self.l1c_xml_fh.calibrate_to_reflectances(fake_data, "B01") np.testing.assert_allclose(result, [[[np.nan, 0.01 - 10, 0.02 - 10, 0.03 - 10], [0.04 - 10, 0, 655.34 - 10, 655.35 - 10]]]) @@ -947,7 +5885,7 @@ def test_xml_calibration_with_different_offset(self): fake_data = xr.DataArray([[[0, 1, 2, 3], [4, 1000, 65534, 65535]]], dims=["band", "x", "y"]) - result = self.xml_fh.calibrate_to_reflectances(fake_data, "B10") + result = self.l1c_xml_fh.calibrate_to_reflectances(fake_data, "B10") np.testing.assert_allclose(result, [[[np.nan, 0.01 - 20, 0.02 - 20, 0.03 - 20], [0.04 - 20, -10, 655.34 - 20, np.inf]]]) @@ -956,7 +5894,7 @@ def test_xml_calibration_to_radiance(self): fake_data = xr.DataArray([[[0, 1, 2, 3], [4, 1000, 65534, 65535]]], dims=["band", "x", "y"]) - result = self.xml_fh.calibrate_to_radiances(fake_data, "B01") + result = self.l1c_xml_fh.calibrate_to_radiances(fake_data, "B01") expected = np.array([[[np.nan, -251.584265, -251.332429, -251.080593], [-250.828757, 0., 16251.99095, np.inf]]]) np.testing.assert_allclose(result, expected) @@ -967,7 +5905,7 @@ def test_xml_navigation(self): crs = CRS("EPSG:32616") dsid = make_dataid(name="B01", resolution=60) - result = self.xml_tile_fh.get_area_def(dsid) + result = self.l1c_xml_tile_fh.get_area_def(dsid) area_extents = (499980.0, 3590220.0, 609780.0, 3700020.0) assert result.crs == crs @@ -982,7 +5920,7 @@ def setup_method(self): from satpy.readers.msi_safe import SAFEMSITileMDXML self.filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B01", dtile_number=None) self.fake_data = xr.Dataset({"band_data": xr.DataArray([[[0, 1], [65534, 65535]]], dims=["band", "x", "y"])}) - self.tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_tile_xml), + self.tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), self.filename_info, mock.MagicMock()) @pytest.mark.parametrize(("mask_saturated", "calibration", "expected"), From 9d9802ab3986d9c03280eaaf351589b28488265e Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Thu, 18 Apr 2024 23:58:38 +0800 Subject: [PATCH 329/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 8cd5852ee9..fc5638e7a7 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -5812,22 +5812,22 @@ def test_satellite_zenith_array(self): [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]) expected_data_l2a = np.array([[ 0.823021, 1.57224058, 2.40477933, 3.33521808, 4.29339294, 5.21712818, - 6.13685593, 7.07123343, 7.9968313, 8.91635508], - [ 0.99274285, 1.78598401, 2.6537931, 3.59082788, 4.54147721, 5.47021744, + 6.13685593, 7.07123343, 7.9968313, 8.91635508], + [ 0.99274285, 1.78598401, 2.6537931, 3.59082788, 4.54147721, 5.47021744, 6.39166677, 7.31780035, 8.24199199, 9.16344605], [ 1.19102539, 2.01811264, 2.90509575, 3.843318, 4.79014776, 5.71596442, 6.63842562, 7.56669001, 8.49008303, 9.41563303], [ 1.40805629, 2.22663763, 3.15710255, 4.11212841, 5.0389507, 5.95589868, 6.88741709, 7.81585111, 8.74029188, 9.66309923], - [ 1.6364984, 2.47693166, 3.40635124, 4.36058177, 5.28712709, 6.20731242, - 7.1382703, 8.0645253, 8.98640945, 9.91275701], - [ 1.86939307, 2.72734103, 3.6589573, 4.61010637, 5.53711387, 6.45878796, + [ 1.6364984, 2.47693166, 3.40635124, 4.36058177, 5.28712709, 6.20731242, + 7.1382703, 8.0645253, 8.98640945, 9.91275701], + [ 1.86939307, 2.72734103, 3.6589573, 4.61010637, 5.53711387, 6.45878796, 7.38909762, 8.31322866, 9.23367977, 10.16133622], [ 2.05092764, 2.97881829, 3.93023614, 4.86081228, 5.78239877, 6.71040601, - 7.63930914, 8.5619639, 9.48322901, 10.40935204], - [ 2.30188982, 3.2312058, 4.18234794, 5.11071768, 6.032489, 6.96190824, + 7.63930914, 8.5619639, 9.48322901, 10.40935204], + [ 2.30188982, 3.2312058, 4.18234794, 5.11071768, 6.032489, 6.96190824, 7.88904158, 8.81055152, 9.73186255, 10.65685334], - [ 2.55171923, 3.48266186, 4.4345628, 5.36132917, 6.28264069, 7.2133112, + [ 2.55171923, 3.48266186, 4.4345628, 5.36132917, 6.28264069, 7.2133112, 8.13807392, 9.05916615, 9.98720691, 10.90435203], [ 2.80292458, 3.74216648, 4.68491268, 5.61065107, 6.53464742, 7.46456958, 8.38738208, 9.3076386, 10.23571319, 11.15166785]]) From 2dcb4e9f4b3f403fbd4b54de64e4b7c75a673f0a Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 18:31:29 +0800 Subject: [PATCH 330/481] Update msi_safe.yaml --- satpy/etc/readers/msi_safe.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index 8ac40f2725..d877a1ba5f 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -11,34 +11,34 @@ reader: file_types: l1c_safe_granule: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSIL1C_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSI{process_level:3s} + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] requires: [l1c_safe_metadata, l1c_safe_tile_metadata] l1c_safe_tile_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML - file_patterns: ['{fmission_id:3s}_MSIL1C_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] l1c_safe_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML - file_patterns: ['{fmission_id:3s}_MSIL1C_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSI{process_level:3s}.xml'] l2a_safe_granule_10m: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R10m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_10m.jp2'] + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSI{process_level:3s} + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R10m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_10m.jp2'] requires: [l2a_safe_metadata, l2a_safe_tile_metadata] l2a_safe_granule_20m: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R20m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_20m.jp2'] + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSI{process_level:3s} + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R20m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_20m.jp2'] requires: [l2a_safe_metadata, l2a_safe_tile_metadata] l2a_safe_granule_60m: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R60m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_60m.jp2'] + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSI{process_level:3s} + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R60m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_60m.jp2'] requires: [l2a_safe_metadata, l2a_safe_tile_metadata] l2a_safe_tile_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML - file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] l2a_safe_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML - file_patterns: ['{fmission_id:3s}_MSIL2A_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL2A.xml'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSI{process_level:3s}.xml'] datasets: B01: From 8e98a498a1f23c369e8e0c2628c1a21029e20c0b Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 18:32:25 +0800 Subject: [PATCH 331/481] Update msi_safe.py --- satpy/readers/msi_safe.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index eaf98d6a38..7bf7b537a6 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -69,10 +69,10 @@ def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_s self._start_time = filename_info["observation_time"] self._end_time = filename_info["observation_time"] self._channel = filename_info["band_name"] + self.process_level = filename_info["process_level"] self._tile_mda = tile_mda self._mda = mda self.platform_name = PLATFORMS[filename_info["fmission_id"]] - self.process_level = "L2A" if "MSIL2A" in filename else "L1C" def get_dataset(self, key, info): """Load a dataset.""" @@ -135,9 +135,9 @@ def __init__(self, filename, filename_info, filetype_info, mask_saturated=True): self._end_time = filename_info["observation_time"] self.root = ET.parse(self.filename) self.tile = filename_info["dtile_number"] + self.process_level = filename_info["process_level"] self.platform_name = PLATFORMS[filename_info["fmission_id"]] self.mask_saturated = mask_saturated - self.process_level = "L2A" if "MSIL2A" in filename else "L1C" import bottleneck # noqa import geotiepoints # noqa From 3211d769518e7cb26ff452b47833272b4ab7b205 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 18:56:17 +0800 Subject: [PATCH 332/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 5013 +-------------------- 1 file changed, 71 insertions(+), 4942 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index fc5638e7a7..c7cf8c1e28 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -575,4919 +575,6 @@ """ # noqa -mtd_l2a_tile_xml = b""" - - - S2A_OPER_MSI_L1C_TL_2APS_20240411T054822_A045975_T50TMK_N05.10 - S2A_OPER_MSI_L2A_TL_2APS_20240411T080950_A045975_T50TMK_N05.10 - S2A_OPER_MSI_L2A_DS_2APS_20240411T080950_S20240411T030632_N05.10 - NOMINAL - 2024-04-11T03:16:45.260288Z - - 2APS - 2024-04-11T08:49:40.661681Z - - - - - WGS84 / UTM zone 50N - EPSG:32650 - - 10980 - 10980 - - - 5490 - 5490 - - - 1830 - 1830 - - - 399960 - 4500000 - 10 - -10 - - - 399960 - 4500000 - 20 - -20 - - - 399960 - 4500000 - 60 - -60 - - - - - - 5000 - 5000 - - 34.9209 34.9012 34.8817 34.8621 34.8426 34.8232 34.8037 34.7844 34.765 34.7457 34.7264 34.7072 34.688 34.6689 34.6498 34.6307 34.6117 34.5927 34.5737 34.5548 34.536 34.5171 34.4983 - 34.8794 34.8598 34.8402 34.8206 34.8011 34.7816 34.7622 34.7428 34.7234 34.7041 34.6848 34.6656 34.6464 34.6272 34.6081 34.589 34.57 34.551 34.532 34.5131 34.4942 34.4754 34.4566 - 34.838 34.8184 34.7987 34.7792 34.7596 34.7401 34.7207 34.7013 34.6819 34.6626 34.6433 34.624 34.6048 34.5856 34.5665 34.5474 34.5283 34.5093 34.4903 34.4714 34.4525 34.4336 34.4148 - 34.7966 34.7769 34.7573 34.7377 34.7182 34.6986 34.6792 34.6597 34.6404 34.621 34.6017 34.5824 34.5632 34.544 34.5248 34.5057 34.4866 34.4676 34.4486 34.4296 34.4107 34.3918 34.373 - 34.7552 34.7355 34.7159 34.6963 34.6767 34.6572 34.6377 34.6182 34.5988 34.5794 34.5601 34.5408 34.5216 34.5023 34.4832 34.464 34.445 34.4259 34.4069 34.3879 34.369 34.3501 34.3312 - 34.7138 34.6941 34.6744 34.6548 34.6352 34.6157 34.5962 34.5767 34.5573 34.5379 34.5185 34.4992 34.48 34.4607 34.4415 34.4224 34.4033 34.3842 34.3652 34.3462 34.3273 34.3083 34.2895 - 34.6724 34.6527 34.633 34.6134 34.5938 34.5742 34.5547 34.5352 34.5157 34.4963 34.477 34.4577 34.4384 34.4191 34.3999 34.3808 34.3616 34.3425 34.3235 34.3045 34.2855 34.2666 34.2477 - 34.631 34.6113 34.5916 34.5719 34.5523 34.5327 34.5132 34.4937 34.4742 34.4548 34.4354 34.4161 34.3968 34.3775 34.3583 34.3391 34.32 34.3009 34.2818 34.2628 34.2438 34.2249 34.206 - 34.5896 34.5699 34.5502 34.5305 34.5109 34.4913 34.4717 34.4522 34.4327 34.4133 34.3939 34.3745 34.3552 34.3359 34.3167 34.2975 34.2783 34.2592 34.2401 34.2211 34.2021 34.1831 34.1642 - 34.5483 34.5285 34.5088 34.4891 34.4694 34.4498 34.4302 34.4107 34.3912 34.3717 34.3523 34.333 34.3136 34.2943 34.2751 34.2559 34.2367 34.2176 34.1985 34.1794 34.1604 34.1414 34.1225 - 34.5069 34.4871 34.4674 34.4477 34.428 34.4084 34.3888 34.3692 34.3497 34.3302 34.3108 34.2914 34.2721 34.2527 34.2335 34.2142 34.1951 34.1759 34.1568 34.1377 34.1187 34.0997 34.0808 - 34.4655 34.4457 34.426 34.4062 34.3866 34.3669 34.3473 34.3277 34.3082 34.2887 34.2693 34.2499 34.2305 34.2112 34.1919 34.1726 34.1534 34.1343 34.1151 34.096 34.077 34.058 34.039 - 34.4242 34.4044 34.3846 34.3648 34.3451 34.3255 34.3059 34.2863 34.2667 34.2472 34.2278 34.2083 34.1889 34.1696 34.1503 34.131 34.1118 34.0926 34.0735 34.0544 34.0353 34.0163 33.9973 - 34.3828 34.363 34.3432 34.3234 34.3037 34.284 34.2644 34.2448 34.2252 34.2057 34.1862 34.1668 34.1474 34.128 34.1087 34.0894 34.0702 34.051 34.0318 34.0127 33.9936 33.9746 33.9556 - 34.3415 34.3216 34.3018 34.2821 34.2623 34.2426 34.223 34.2033 34.1838 34.1642 34.1447 34.1253 34.1059 34.0865 34.0671 34.0478 34.0286 34.0094 33.9902 33.9711 33.952 33.9329 33.9139 - 34.3002 34.2803 34.2605 34.2407 34.2209 34.2012 34.1815 34.1619 34.1423 34.1227 34.1032 34.0838 34.0643 34.0449 34.0256 34.0063 33.987 33.9677 33.9486 33.9294 33.9103 33.8912 33.8722 - 34.2589 34.239 34.2191 34.1993 34.1795 34.1598 34.1401 34.1205 34.1008 34.0813 34.0617 34.0422 34.0228 34.0034 33.984 33.9647 33.9454 33.9261 33.9069 33.8878 33.8686 33.8495 33.8305 - 34.2175 34.1976 34.1778 34.1579 34.1381 34.1184 34.0987 34.079 34.0594 34.0398 34.0202 34.0007 33.9813 33.9618 33.9425 33.9231 33.9038 33.8845 33.8653 33.8461 33.827 33.8079 33.7888 - 34.1762 34.1563 34.1364 34.1166 34.0968 34.077 34.0573 34.0376 34.0179 33.9983 33.9788 33.9592 33.9398 33.9203 33.9009 33.8815 33.8622 33.8429 33.8237 33.8045 33.7853 33.7662 33.7471 - 34.1349 34.115 34.0951 34.0752 34.0554 34.0356 34.0159 33.9962 33.9765 33.9569 33.9373 33.9177 33.8982 33.8788 33.8594 33.84 33.8206 33.8013 33.7821 33.7629 33.7437 33.7245 33.7054 - 34.0936 34.0737 34.0537 34.0339 34.014 33.9942 33.9745 33.9547 33.9351 33.9154 33.8958 33.8763 33.8567 33.8373 33.8178 33.7984 33.7791 33.7597 33.7405 33.7212 33.702 33.6829 33.6638 - 34.0523 34.0324 34.0124 33.9925 33.9727 33.9529 33.9331 33.9133 33.8936 33.874 33.8544 33.8348 33.8152 33.7957 33.7763 33.7569 33.7375 33.7182 33.6989 33.6796 33.6604 33.6412 33.6221 - 34.0111 33.9911 33.9711 33.9512 33.9313 33.9115 33.8917 33.8719 33.8522 33.8325 33.8129 33.7933 33.7738 33.7542 33.7348 33.7153 33.6959 33.6766 33.6573 33.638 33.6188 33.5996 33.5805 - - - - 5000 - 5000 - - 152.939 153.035 153.13 153.225 153.32 153.416 153.511 153.606 153.702 153.798 153.893 153.989 154.085 154.181 154.277 154.373 154.469 154.565 154.662 154.758 154.854 154.951 155.047 - 152.916 153.011 153.107 153.202 153.297 153.392 153.488 153.583 153.679 153.775 153.87 153.966 154.062 154.158 154.254 154.35 154.446 154.542 154.639 154.735 154.831 154.928 155.025 - 152.893 152.988 153.083 153.179 153.274 153.369 153.465 153.56 153.656 153.752 153.847 153.943 154.039 154.135 154.231 154.327 154.423 154.519 154.616 154.712 154.809 154.905 155.002 - 152.87 152.965 153.06 153.155 153.251 153.346 153.442 153.537 153.633 153.728 153.824 153.92 154.016 154.112 154.208 154.304 154.4 154.496 154.593 154.689 154.786 154.882 154.979 - 152.846 152.941 153.037 153.132 153.227 153.323 153.418 153.514 153.609 153.705 153.801 153.897 153.993 154.089 154.185 154.281 154.377 154.473 154.57 154.666 154.763 154.859 154.956 - 152.823 152.918 153.013 153.109 153.204 153.299 153.395 153.49 153.586 153.682 153.778 153.873 153.969 154.065 154.161 154.258 154.354 154.45 154.547 154.643 154.739 154.836 154.933 - 152.799 152.895 152.99 153.085 153.18 153.276 153.371 153.467 153.563 153.658 153.754 153.85 153.946 154.042 154.138 154.234 154.331 154.427 154.523 154.62 154.716 154.813 154.91 - 152.776 152.871 152.966 153.062 153.157 153.252 153.348 153.444 153.539 153.635 153.731 153.827 153.923 154.019 154.115 154.211 154.307 154.404 154.5 154.597 154.693 154.79 154.886 - 152.752 152.847 152.943 153.038 153.133 153.229 153.324 153.42 153.516 153.611 153.707 153.803 153.899 153.995 154.091 154.188 154.284 154.38 154.477 154.573 154.67 154.766 154.863 - 152.728 152.824 152.919 153.014 153.11 153.205 153.301 153.396 153.492 153.588 153.684 153.78 153.876 153.972 154.068 154.164 154.26 154.357 154.453 154.55 154.646 154.743 154.84 - 152.705 152.8 152.895 152.991 153.086 153.181 153.277 153.373 153.468 153.564 153.66 153.756 153.852 153.948 154.044 154.141 154.237 154.333 154.43 154.526 154.623 154.72 154.816 - 152.681 152.776 152.871 152.967 153.062 153.158 153.253 153.349 153.445 153.541 153.636 153.732 153.829 153.925 154.021 154.117 154.213 154.31 154.406 154.503 154.599 154.696 154.793 - 152.657 152.752 152.847 152.943 153.038 153.134 153.229 153.325 153.421 153.517 153.613 153.709 153.805 153.901 153.997 154.093 154.19 154.286 154.383 154.479 154.576 154.673 154.769 - 152.633 152.728 152.823 152.919 153.014 153.11 153.206 153.301 153.397 153.493 153.589 153.685 153.781 153.877 153.973 154.07 154.166 154.263 154.359 154.456 154.552 154.649 154.746 - 152.609 152.704 152.799 152.895 152.99 153.086 153.182 153.277 153.373 153.469 153.565 153.661 153.757 153.853 153.95 154.046 154.142 154.239 154.335 154.432 154.529 154.625 154.722 - 152.585 152.68 152.775 152.871 152.966 153.062 153.158 153.253 153.349 153.445 153.541 153.637 153.733 153.829 153.926 154.022 154.118 154.215 154.311 154.408 154.505 154.602 154.698 - 152.56 152.656 152.751 152.847 152.942 153.038 153.133 153.229 153.325 153.421 153.517 153.613 153.709 153.805 153.902 153.998 154.095 154.191 154.288 154.384 154.481 154.578 154.675 - 152.536 152.631 152.727 152.822 152.918 153.014 153.109 153.205 153.301 153.397 153.493 153.589 153.685 153.781 153.878 153.974 154.071 154.167 154.264 154.36 154.457 154.554 154.651 - 152.512 152.607 152.703 152.798 152.894 152.989 153.085 153.181 153.277 153.373 153.469 153.565 153.661 153.757 153.854 153.95 154.047 154.143 154.24 154.336 154.433 154.53 154.627 - 152.487 152.583 152.678 152.774 152.869 152.965 153.061 153.157 153.252 153.348 153.445 153.541 153.637 153.733 153.829 153.926 154.022 154.119 154.216 154.312 154.409 154.506 154.603 - 152.463 152.558 152.654 152.749 152.845 152.941 153.036 153.132 153.228 153.324 153.42 153.516 153.613 153.709 153.805 153.902 153.998 154.095 154.191 154.288 154.385 154.482 154.579 - 152.438 152.534 152.629 152.725 152.82 152.916 153.012 153.108 153.204 153.3 153.396 153.492 153.588 153.685 153.781 153.877 153.974 154.071 154.167 154.264 154.361 154.458 154.555 - 152.414 152.509 152.605 152.7 152.796 152.892 152.987 153.083 153.179 153.275 153.371 153.468 153.564 153.66 153.757 153.853 153.95 154.046 154.143 154.24 154.337 154.434 154.531 - - - - - 34.2508883033046 - 153.732570441329 - - - - 5000 - 5000 - - 1.97703 2.1053 2.29413 2.5298 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.00462 2.15075 2.35339 2.59967 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.03731 2.19992 2.41573 2.67162 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.07478 2.25294 2.48052 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.1168 2.30961 2.54835 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.16312 2.36962 2.61877 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.21367 2.43296 2.6915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.26781 2.49894 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.32569 2.56807 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.38701 2.63968 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.45114 2.71276 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.51821 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.58721 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.659 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 208.344 218.797 227.795 235.278 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 211.295 221.381 229.961 237.056 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 214.157 223.829 232.007 238.731 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 216.884 226.167 233.932 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 219.525 228.405 235.779 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 222.07 230.538 237.528 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 224.503 232.56 239.186 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 226.83 234.485 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 229.047 236.314 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 231.162 238.059 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 233.155 239.675 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 235.048 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 236.822 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 238.514 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.64951 2.96573 3.29685 3.64043 3.99275 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.73274 3.05304 3.38864 3.73509 4.09035 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.51047 2.81637 3.14143 3.48007 3.82888 4.18472 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.59005 2.9021 3.2313 3.57285 3.92399 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.67197 2.98919 3.3223 3.66692 4.02043 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.75571 3.07766 3.41441 3.7612 4.11517 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.53269 2.84107 3.16751 3.50699 3.85521 4.21181 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.61388 2.92772 3.25821 3.60085 3.9508 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.69706 3.01473 3.34862 3.69441 4.04598 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.78078 3.10372 3.44082 3.78694 4.14155 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.55734 2.86715 3.19341 3.53275 3.88181 4.23811 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.63887 2.95325 3.28382 3.62646 3.97758 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.72227 3.04131 3.376 3.72263 4.07367 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.5008 2.80632 3.13157 3.46978 3.81877 4.17029 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.58119 2.89312 3.22131 3.56146 3.9119 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.66461 2.98122 3.3122 3.65548 4.00738 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.74814 3.06947 3.40515 3.75127 4.10378 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.83388 3.15864 3.49697 3.84607 4.20128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.91919 3.24865 3.59019 3.94101 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.00713 3.3404 3.68514 4.03645 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.09748 3.434 3.779 4.13296 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.18661 3.52592 3.87415 4.22993 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.27687 3.61929 3.96988 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 323.875 319.18 315.438 312.386 309.87 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 322.492 318.084 314.534 311.639 309.24 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 326.407 321.206 317.049 313.693 310.947 308.671 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 324.885 319.984 316.066 312.89 310.281 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 323.443 318.832 315.135 312.126 309.642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 322.088 317.748 314.25 311.402 309.049 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 325.936 320.806 316.721 313.42 310.725 308.479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 324.426 319.608 315.755 312.629 310.069 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 323.001 318.49 314.851 311.885 309.456 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 321.68 317.425 313.991 311.194 308.87 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 325.455 320.424 316.426 313.184 310.521 308.308 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 323.982 319.264 315.484 312.41 309.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 322.592 318.16 314.585 311.66 309.272 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 326.571 321.309 317.107 313.727 310.953 308.691 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 325.034 320.076 316.13 312.942 310.312 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 323.556 318.911 315.207 312.182 309.687 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 322.207 317.835 314.316 311.447 309.085 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 320.921 316.814 313.495 310.768 308.511 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 319.743 315.863 312.712 310.121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 318.607 314.942 311.957 309.506 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 317.521 314.064 311.256 308.915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 316.524 313.255 310.578 308.35 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 315.579 312.48 309.936 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.42528 4.77697 5.13643 5.4944 5.86044 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.51892 4.87221 5.23118 5.59655 5.95918 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.26204 4.61261 4.96819 5.32906 5.69405 6.0593 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.35606 4.70847 5.06509 5.42879 5.79188 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.45033 4.80301 5.16215 5.52309 5.8888 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.54321 4.89826 5.25789 5.61913 5.98529 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.28804 4.63877 4.99321 5.35406 5.71819 6.08372 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.38065 4.73327 5.09101 5.452 5.81556 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.47413 4.82945 5.18704 5.55048 5.91388 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.21956 4.56894 4.9238 5.28338 5.64677 6.01255 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.31264 4.66366 5.02006 5.38068 5.74465 6.11133 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.40658 4.75909 5.11671 5.47833 5.84319 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.50092 4.85501 5.21389 5.57648 5.94203 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.24618 4.59591 4.9514 5.31133 5.67477 6.04096 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.34035 4.69341 5.04906 5.40905 5.77338 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.43457 4.78889 5.14515 5.5071 5.87217 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.52892 4.88338 5.24251 5.6054 5.97116 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.27496 4.62443 4.97992 5.34015 5.70385 6.07032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.36804 4.71979 5.07693 5.4381 5.80258 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.46235 4.8158 5.17407 5.53632 5.90155 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.55735 4.91218 5.27167 5.63483 6.00077 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.30198 4.65281 5.00903 5.36959 5.73355 6.10016 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.39631 4.74868 5.10619 5.4677 5.83246 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 259.438 261.542 263.374 264.943 266.343 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 260.028 262.049 263.804 265.347 266.684 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 258.321 260.591 262.539 264.235 265.721 267.02 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 258.966 261.146 263.017 264.658 266.079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 259.585 261.668 263.474 265.04 266.424 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 260.165 262.172 263.91 265.418 266.755 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 258.496 260.737 262.655 264.331 265.796 267.083 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 259.126 261.279 263.132 264.741 266.152 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 259.73 261.803 263.582 265.143 266.501 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 258.01 260.32 262.3 264.016 265.516 266.837 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 258.669 260.88 262.782 264.436 265.886 267.166 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 259.298 261.42 263.252 264.847 266.245 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 259.904 261.939 263.701 265.239 266.592 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 258.204 260.481 262.438 264.135 265.62 266.928 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 258.857 261.05 262.924 264.553 265.986 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 259.478 261.581 263.379 264.956 266.341 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 260.071 262.082 263.824 265.345 266.683 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 258.402 260.643 262.574 264.252 265.72 267.014 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 259.034 261.188 263.046 264.663 266.081 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 259.641 261.711 263.5 265.06 266.431 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 260.226 262.214 263.937 265.441 266.766 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 258.567 260.786 262.697 264.356 265.809 267.092 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 259.193 261.324 263.162 264.762 266.166 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.20011 6.57702 6.95471 7.33472 7.71001 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.30177 6.68303 7.05691 7.43541 7.81114 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02935 6.40541 6.78524 7.15835 7.53305 7.9119 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13173 6.50461 6.88625 7.26132 7.63551 8.01305 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22913 6.60581 6.98443 7.3594 7.73613 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.32911 6.70656 7.0822 7.45966 7.83787 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05415 6.43153 6.80634 7.1834 7.56141 7.93969 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15469 6.53072 6.90756 7.28517 7.6632 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25604 6.63233 7.00929 7.38695 7.76506 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.35731 6.73386 7.11106 7.48887 7.86707 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08281 6.45877 6.8356 7.21309 7.59085 7.96898 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18422 6.56037 6.93737 7.31487 7.69287 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.28565 6.66203 7.03927 7.41702 7.79501 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01162 6.3873 6.76382 7.14125 7.51902 7.89706 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11316 6.48908 6.86586 7.24325 7.62108 7.99928 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21474 6.59085 6.96778 7.34537 7.7233 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.31639 6.6928 7.06991 7.44757 7.82553 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04248 6.41816 6.79477 7.17202 7.54977 7.92782 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.144 6.51989 6.89676 7.27422 7.65206 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.2457 6.62195 6.99889 7.37639 7.75429 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.34747 6.72384 7.10097 7.47868 7.85668 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.07357 6.4493 6.82596 7.20329 7.58102 7.95903 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.17526 6.55128 6.92808 7.30551 7.68339 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.294 300.476 299.753 299.105 298.535 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.048 300.249 299.559 298.935 298.379 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.672 300.809 300.038 299.371 298.772 298.227 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.412 300.586 299.837 299.188 298.608 298.08 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.177 300.37 299.651 299.019 298.45 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.944 300.161 299.471 298.852 298.298 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.573 300.712 299.961 299.29 298.688 298.148 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.324 300.497 299.764 299.113 298.529 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.084 300.285 299.574 298.94 298.374 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.852 300.077 299.389 298.775 298.225 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.476 300.628 299.878 299.211 298.614 298.078 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.232 300.412 299.684 299.036 298.457 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.995 300.201 299.497 298.869 298.307 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.637 300.767 299.999 299.316 298.706 298.158 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.387 300.546 299.802 299.139 298.548 298.016 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.147 300.332 299.612 298.969 298.394 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.914 300.126 299.428 298.805 298.245 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.552 300.69 299.927 299.249 298.643 298.1 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.304 300.47 299.732 299.076 298.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 301.067 300.261 299.546 298.907 298.335 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.837 300.056 299.362 298.743 298.189 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 301.468 300.614 299.859 299.188 298.586 298.045 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 301.226 300.399 299.666 299.014 298.43 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08452 8.45638 8.82965 9.20261 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.18443 8.55562 8.92971 9.30313 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90931 8.28187 8.65554 9.02927 9.4038 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00912 8.38232 8.75586 9.13013 9.50517 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10985 8.48282 8.85656 9.23808 9.61045 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.21032 8.58314 8.95763 9.33519 9.71055 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93698 8.31003 8.68369 9.05876 9.43294 9.80827 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03731 8.41139 8.78632 9.16185 9.53447 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13893 8.5125 8.88626 9.26212 9.6352 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.23827 8.61366 8.98688 9.35967 9.73641 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96562 8.33878 8.71237 9.08655 9.4605 9.83435 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06609 8.43947 8.81313 9.18696 9.56102 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.1667 8.54013 8.91385 9.28778 9.66183 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89431 8.26729 8.64086 9.01471 9.38872 9.76283 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9949 8.368 8.74168 9.11551 9.48953 9.86363 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09547 8.46873 8.84248 9.21641 9.5905 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.19618 8.56956 8.94338 9.31735 9.6914 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92397 8.29696 8.67041 9.04428 9.41832 9.79243 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02464 8.39778 8.77138 9.14528 9.51928 9.89342 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12538 8.49866 8.87236 9.24634 9.62039 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.22624 8.59962 8.97339 9.34737 9.7215 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9541 8.32712 8.70065 9.0745 9.44852 9.82258 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05496 8.42812 8.80175 9.17562 9.54964 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.205 272.908 273.556 274.152 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.393 273.079 273.714 274.297 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.839 272.573 273.245 273.865 274.44 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.034 272.751 273.411 274.019 274.582 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.229 272.93 273.573 274.179 274.725 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.419 273.101 273.732 274.319 274.86 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.873 272.602 273.271 273.889 274.458 274.987 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.071 272.785 273.44 274.045 274.6 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.269 272.963 273.601 274.194 274.738 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.454 273.137 273.761 274.336 274.875 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.916 272.64 273.304 273.914 274.479 275.003 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.114 272.82 273.467 274.066 274.62 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.307 272.997 273.631 274.216 274.757 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.763 272.497 273.17 273.789 274.361 274.893 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.963 272.68 273.339 273.946 274.507 275.026 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.16 272.861 273.504 274.096 274.646 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.351 273.035 273.664 274.245 274.784 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.809 272.538 273.206 273.822 274.39 274.917 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.008 272.72 273.373 273.975 274.532 275.049 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.202 272.897 273.536 274.125 274.671 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.391 273.07 273.695 274.272 274.807 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.851 272.575 273.239 273.85 274.415 274.939 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.047 272.753 273.402 274.001 274.555 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93809 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0418 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1429 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.8632 10.2422 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.96528 10.3439 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0675 10.4458 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1696 10.5499 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89328 10.2719 10.6503 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99559 10.374 10.7519 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0979 10.4762 10.854 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2002 10.5784 10.9559 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.924 10.3025 10.6805 11.0579 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0264 10.4048 10.7827 11.16 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1289 10.5071 10.8847 11.2619 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2313 10.6093 10.9869 11.3639 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95517 10.3337 10.7116 11.089 11.4658 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.143 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.06 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.983 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.173 295.907 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.093 295.833 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.014 295.759 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.936 295.687 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.126 295.862 295.618 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.046 295.787 295.55 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.968 295.716 295.484 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.893 295.646 295.418 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.084 295.819 295.577 295.355 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.005 295.747 295.511 295.294 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.929 295.678 295.445 295.232 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.854 295.607 295.382 295.173 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.043 295.782 295.541 295.319 295.114 - - - - - - 5000 - 5000 - - 1.43228 1.60524 1.8464 2.13265 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.47061 1.66474 1.91995 2.21533 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.51524 1.72801 1.99607 2.29961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.56542 1.79529 2.07417 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.62096 1.86621 2.15515 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.68128 1.94029 2.23816 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.74598 2.0173 2.32311 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.81462 2.09678 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.88669 2.17894 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.96221 2.26337 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.03976 2.34819 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.12021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.20185 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.28602 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 213.859 227.218 237.55 245.315 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 217.766 230.299 239.872 247.059 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 221.46 233.135 242.008 248.666 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 224.881 235.765 243.971 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 228.1 238.213 245.81 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 231.113 240.484 247.517 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 233.911 242.584 249.101 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 236.505 244.533 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 238.913 246.344 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 241.144 248.031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 243.203 249.572 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 245.104 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 246.851 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 248.48 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.33111 2.68405 3.04481 3.41291 3.78575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.42496 2.77992 3.14389 3.51368 3.88862 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.17275 2.51866 2.87653 3.2421 3.6131 3.9876 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.26386 2.61399 2.97422 3.34134 3.71369 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.3569 2.7102 3.07271 3.44153 3.8153 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.45113 2.80718 3.17193 3.54178 3.91494 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.19851 2.54651 2.90522 3.27117 3.64121 4.01608 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.29124 2.64257 3.00361 3.37133 3.74218 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.3854 2.73829 3.10125 3.47095 3.84227 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.47946 2.83579 3.20029 3.56905 3.94262 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.22682 2.57555 2.93336 3.29873 3.6694 4.0438 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.31963 2.67074 3.03128 3.39867 3.77031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.41379 2.76748 3.13068 3.50088 3.8714 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.16175 2.50772 2.86606 3.23129 3.60278 3.97273 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.25366 2.60403 2.96347 3.3292 3.70104 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.34847 2.7014 3.06171 3.4293 3.80152 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.44244 2.79805 3.16179 3.53108 3.90281 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.5381 2.89538 3.26026 3.63137 4.00498 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.63262 2.99271 3.35959 3.73144 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.72941 3.0918 3.46054 3.83192 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.82825 3.19241 3.56005 3.93314 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.92527 3.29075 3.66069 4.03471 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.02299 3.39032 3.76158 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 313.045 309.176 306.236 303.925 302.074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 311.876 308.298 305.543 303.369 301.616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 315.228 310.813 307.48 304.903 302.857 301.201 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 313.903 309.815 306.714 304.297 302.368 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 312.674 308.891 305.998 303.724 301.9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 311.54 308.027 305.322 303.188 301.471 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 314.815 310.485 307.223 304.694 302.69 301.057 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 313.513 309.512 306.472 304.098 302.208 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 312.305 308.617 305.779 303.546 301.764 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 311.207 307.777 305.125 303.034 301.338 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 314.405 310.178 306.996 304.516 302.54 300.935 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 313.143 309.241 306.268 303.938 302.073 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 311.973 308.363 305.581 303.382 301.631 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 315.391 310.91 307.534 304.929 302.86 301.212 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 314.05 309.901 306.771 304.339 302.39 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 312.792 308.968 306.062 303.772 301.933 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 311.661 308.111 305.38 303.227 301.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 310.601 307.312 304.762 302.729 301.085 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 309.643 306.57 304.17 302.254 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 308.729 305.862 303.609 301.807 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 307.87 305.192 303.087 301.376 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 307.087 304.58 302.589 300.969 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 306.353 303.999 302.117 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.21509 4.58387 4.95832 5.32901 5.70652 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.31351 4.68322 5.05653 5.43457 5.80807 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.04285 4.41182 4.78335 5.158 5.5352 5.91099 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.14218 4.51234 4.88419 5.26127 5.63591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.2416 4.61122 4.98503 5.35879 5.7358 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.3392 4.71067 5.08447 5.45792 5.83499 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.07051 4.43949 4.80959 5.18413 5.56025 5.93616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.16835 4.53848 4.91133 5.28536 5.66053 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.26676 4.63904 5.01107 5.38737 5.76178 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 3.99836 4.36651 4.73747 5.11105 5.48658 5.86321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.09685 4.46578 4.83769 5.21182 5.58767 5.96477 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.19595 4.56574 4.9383 5.31293 5.68918 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.29527 4.66587 5.0391 5.41429 5.79092 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.02672 4.39496 4.7664 5.14018 5.51578 5.89263 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.12626 4.49709 4.86816 5.24133 5.61738 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.22557 4.59699 4.96792 5.34277 5.71915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.32477 4.69561 5.06896 5.44426 5.82096 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.05728 4.42498 4.79621 5.17014 5.54584 5.92289 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.15556 4.52477 4.89707 5.27147 5.64756 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.25473 4.62508 4.99796 5.37299 5.74941 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.35451 4.72557 5.09913 5.47458 5.8514 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.08573 4.45457 4.8264 5.20051 5.57638 5.95346 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.18513 4.55488 4.92742 5.30202 5.67823 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 266.45 268.096 269.511 270.713 271.778 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 266.913 268.489 269.841 271.018 272.032 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 265.564 267.352 268.864 270.167 271.3 272.284 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 266.073 267.783 269.232 270.49 271.571 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 266.561 268.187 269.582 270.779 271.829 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 267.014 268.576 269.914 271.066 272.079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 265.698 267.461 268.948 270.235 271.351 272.325 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 266.197 267.882 269.316 270.548 271.62 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 266.674 268.29 269.66 270.853 271.884 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 265.312 267.133 268.673 269.994 271.138 272.137 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 265.836 267.572 269.046 270.313 271.416 272.384 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 266.332 267.99 269.405 270.626 271.689 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 266.809 268.397 269.753 270.925 271.949 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 265.471 267.262 268.78 270.084 271.214 272.205 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 265.987 267.706 269.157 270.405 271.493 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 266.478 268.119 269.506 270.71 271.76 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 266.943 268.507 269.846 271.006 272.019 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 265.629 267.39 268.887 270.173 271.29 272.268 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 266.129 267.815 269.251 270.487 271.564 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 266.608 268.221 269.599 270.789 271.828 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 267.066 268.61 269.934 271.08 272.081 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 265.76 267.503 268.981 270.252 271.358 272.327 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 266.254 267.919 269.337 270.56 271.626 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.06427 6.44803 6.83196 7.2174 7.59778 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.16793 6.55589 6.93589 7.31949 7.70015 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.89029 6.27351 6.66009 7.0387 7.4186 7.80228 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99495 6.37463 6.7627 7.14316 7.52246 7.90458 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.09422 6.47774 6.86233 7.24287 7.62442 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19606 6.5801 6.96173 7.34443 7.72743 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.91577 6.30049 6.6816 7.0644 7.44757 7.83053 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01841 6.40138 6.78447 7.16764 7.55068 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12175 6.50475 6.88773 7.27086 7.65387 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22489 6.60801 6.99109 7.37418 7.75714 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.94515 6.32823 6.71141 7.09457 7.47746 7.86027 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04854 6.43161 6.81476 7.19783 7.58084 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15194 6.53503 6.91825 7.30135 7.6842 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87249 6.25545 6.63846 7.02172 7.40473 7.78753 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97609 6.35907 6.74215 7.12521 7.50814 7.89093 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07961 6.4626 6.84564 7.22873 7.61163 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18318 6.56624 6.94927 7.33228 7.71508 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.90386 6.28674 6.6698 7.05284 7.43582 7.81861 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00738 6.39032 6.77345 7.15648 7.53939 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11108 6.4941 6.87708 7.26005 7.6429 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21465 6.59766 6.98072 7.36374 7.74652 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.93541 6.31833 6.70138 7.08441 7.46732 7.85004 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.03904 6.42203 6.80506 7.18807 7.57099 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.13 295.598 295.129 294.715 294.353 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.966 295.448 295.001 294.601 294.248 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.372 295.806 295.307 294.876 294.494 294.149 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.199 295.66 295.176 294.758 294.386 294.052 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.043 295.516 295.052 294.647 294.284 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.888 295.379 294.933 294.538 294.184 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.298 295.734 295.247 294.814 294.43 294.088 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.133 295.593 295.119 294.7 294.326 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.975 295.453 294.993 294.587 294.226 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.82 295.316 294.874 294.48 294.13 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.228 295.674 295.187 294.757 294.374 294.034 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.067 295.531 295.06 294.643 294.274 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.911 295.394 294.939 294.535 294.176 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.332 295.762 295.262 294.821 294.429 294.081 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.168 295.618 295.134 294.706 294.327 293.989 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.009 295.477 295.01 294.597 294.229 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.856 295.343 294.891 294.489 294.132 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.275 295.708 295.211 294.773 294.386 294.04 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.11 295.565 295.086 294.663 294.286 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.957 295.429 294.964 294.552 294.187 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.803 295.294 294.846 294.449 294.094 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 296.217 295.658 295.166 294.731 294.345 294 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 296.056 295.515 295.039 294.619 294.245 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9782 8.35573 8.73425 9.11201 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07985 8.45653 8.83562 9.21379 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80029 8.17871 8.55779 8.93653 9.31567 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90165 8.28066 8.65954 9.03872 9.41814 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00399 8.38269 8.76158 9.14809 9.52479 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10613 8.48444 8.86397 9.24621 9.62624 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82843 8.20739 8.58644 8.96639 9.34511 9.72472 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93046 8.31034 8.69055 9.07079 9.44796 9.82594 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03387 8.41296 8.79174 9.17247 9.54999 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13464 8.5156 8.89375 9.27117 9.65231 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8577 8.23673 8.61567 8.99473 9.37326 9.75124 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95982 8.33887 8.71778 9.09642 9.47493 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06206 8.4411 8.8199 9.19851 9.57685 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.78537 8.16428 8.54324 8.92207 9.30068 9.67905 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88759 8.26651 8.64553 9.02423 9.40274 9.78095 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.98983 8.36878 8.74768 9.12635 9.50484 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09211 8.47103 8.84992 9.22856 9.60693 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.81558 8.19448 8.57331 8.95214 9.33072 9.70904 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91791 8.2968 8.67568 9.05441 9.43289 9.81115 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02028 8.39918 8.77802 9.15675 9.53515 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.1227 8.50157 8.88039 9.259 9.63741 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84622 8.22512 8.60402 8.98277 9.36132 9.73957 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94869 8.32757 8.70646 9.08514 9.46361 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.209 276.743 277.235 277.688 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.349 276.869 277.352 277.796 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.925 276.484 276.995 277.465 277.901 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.073 276.617 277.117 277.579 278.007 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.218 276.75 277.24 277.699 278.113 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.361 276.879 277.357 277.803 278.214 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.944 276.497 277.006 277.475 277.907 278.309 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.093 276.635 277.133 277.591 278.012 278.405 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.241 276.769 277.253 277.703 278.116 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.381 276.899 277.373 277.809 278.218 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.972 276.521 277.025 277.489 277.917 278.314 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.122 276.658 277.149 277.602 278.022 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.266 276.79 277.271 277.715 278.126 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.852 276.41 276.921 277.39 277.824 278.227 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.005 276.548 277.047 277.507 277.933 278.328 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.153 276.685 277.173 277.623 278.038 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.299 276.816 277.293 277.733 278.142 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.886 276.438 276.945 277.413 277.844 278.243 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.036 276.576 277.071 277.527 277.949 278.341 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.183 276.71 277.194 277.64 278.054 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.326 276.84 277.314 277.751 278.156 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.916 276.464 276.968 277.431 277.859 278.255 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.064 276.6 277.091 277.544 277.963 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84649 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95109 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0528 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.77119 10.1526 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87397 10.2549 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97676 10.3574 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0796 10.4622 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80149 10.1824 10.5631 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90448 10.2852 10.6654 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0074 10.388 10.768 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1104 10.4908 10.8705 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.83236 10.2132 10.5935 10.973 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93543 10.3162 10.6962 11.0755 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0385 10.419 10.7988 11.178 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.76048 10.1415 10.5219 10.9015 11.2805 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.8637 10.2446 10.6247 11.0041 11.3829 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.871 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.821 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.775 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.879 292.731 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.832 292.687 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.784 292.643 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.739 292.601 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.843 292.695 292.56 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.796 292.652 292.521 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.751 292.61 292.482 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.707 292.57 292.444 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.812 292.664 292.53 292.408 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.766 292.623 292.492 292.373 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.722 292.581 292.453 292.337 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.829 292.677 292.541 292.417 292.304 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.784 292.638 292.503 292.38 292.269 - - - - - - 5000 - 5000 - - 1.56418 1.7238 1.95023 2.22302 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.59921 1.77927 2.02001 2.30248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.64036 1.83858 2.09237 2.38358 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.68673 1.90188 2.16697 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.73826 1.96893 2.24457 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.79465 2.03922 2.3243 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.85529 2.11248 2.40619 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.92006 2.18857 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.98817 2.26722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.05985 2.34849 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.13391 2.43022 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.21081 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.28925 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.37021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 212.152 224.705 234.751 242.531 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 215.781 227.666 237.053 244.303 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 219.241 230.416 239.192 245.95 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 222.477 232.991 241.168 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 225.551 235.405 243.032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 228.451 237.664 244.772 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 231.172 239.77 246.395 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 233.714 241.732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 236.098 243.575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 238.324 245.295 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 240.386 246.879 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 242.311 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 244.085 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 245.753 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.40295 2.74686 3.10058 3.46299 3.8311 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.49413 2.8407 3.19795 3.5624 3.93286 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.24935 2.58532 2.93538 3.2946 3.66048 4.03079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.3376 2.67833 3.03122 3.39239 3.75982 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.42791 2.7724 3.12787 3.49114 3.86028 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.51944 2.86736 3.22549 3.59004 3.95886 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.27427 2.61247 2.96345 3.3232 3.68815 4.05891 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.36407 2.70622 3.05997 3.42187 3.78801 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.45548 2.79987 3.156 3.52014 3.88692 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.54709 2.89533 3.25339 3.61692 3.9862 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.30163 2.64076 2.99104 3.35034 3.71608 4.08635 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.39159 2.73378 3.08723 3.44885 3.81579 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.48317 2.82848 3.18494 3.54964 3.91573 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.23876 2.57467 2.92501 3.28395 3.65027 4.01604 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.32768 2.66866 3.02071 3.38043 3.74737 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.41976 2.76383 3.11715 3.47907 3.84666 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.51108 2.85842 3.2156 3.57957 3.9469 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.60439 2.95394 3.31255 3.67852 4.04795 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.69663 3.04943 3.41044 3.77747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.79135 3.14687 3.51004 3.8768 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.88814 3.24581 3.60819 3.97695 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.9833 3.34266 3.70763 4.0775 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.07929 3.4408 3.80732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 316.046 311.889 308.695 306.162 304.117 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 314.798 310.942 307.938 305.553 303.614 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 318.359 313.655 310.056 307.238 304.986 303.155 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 316.958 312.582 309.221 306.575 304.446 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 315.652 311.585 308.436 305.945 303.93 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 314.435 310.651 307.699 305.354 303.456 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 317.925 313.306 309.776 307.011 304.802 302.996 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 316.542 312.256 308.956 306.356 304.274 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 315.254 311.289 308.201 305.749 303.779 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 314.08 310.376 307.483 305.183 303.308 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 317.487 312.972 309.527 306.815 304.64 302.861 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 316.144 311.962 308.734 306.179 304.122 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 314.897 311.012 307.982 305.566 303.632 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 318.526 313.757 310.109 307.267 304.991 303.168 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 317.105 312.672 309.283 306.62 304.473 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 315.77 311.664 308.504 305.993 303.965 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 314.558 310.734 307.76 305.397 303.487 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 313.423 309.87 307.082 304.843 303.024 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 312.389 309.057 306.433 304.321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 311.404 308.288 305.816 303.825 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 310.471 307.553 305.239 303.349 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 309.621 306.882 304.691 302.898 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 308.822 306.244 304.17 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.2605 4.62548 4.99656 5.36443 5.73941 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.35787 4.72387 5.09397 5.46918 5.84033 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.09031 4.4551 4.82306 5.19466 5.5692 5.94262 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.18842 4.55462 4.92307 5.29713 5.66919 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.28671 4.6525 5.02302 5.39393 5.76847 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.38322 4.75102 5.12167 5.4924 5.86705 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.11755 4.48245 4.84906 5.22055 5.59402 5.96761 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.21425 4.58044 4.9499 5.32099 5.69363 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.31151 4.67997 5.04882 5.42229 5.79427 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.04625 4.41021 4.77757 5.148 5.52081 5.89503 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.14357 4.50842 4.87683 5.24795 5.6212 5.99605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.24142 4.60735 4.97661 5.34838 5.72207 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.33968 4.70657 5.07655 5.44893 5.82314 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.07421 4.43823 4.80613 5.17686 5.54977 5.92428 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.17254 4.53936 4.90704 5.27724 5.65066 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.27072 4.63826 5.00592 5.37791 5.75181 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.3688 4.73597 5.10615 5.47871 5.85299 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.10435 4.46796 4.83567 5.20655 5.5796 5.95431 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.20149 4.56675 4.93565 5.30711 5.68064 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.2995 4.66607 5.03572 5.40791 5.78187 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.39825 4.76568 5.1361 5.5088 5.88321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.13251 4.49729 4.86558 5.23668 5.60994 5.98472 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.23072 4.59658 4.96576 5.33747 5.71115 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 264.671 266.44 267.968 269.267 270.42 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 265.167 266.865 268.325 269.601 270.697 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 263.721 265.642 267.273 268.678 269.904 270.971 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 264.267 266.105 267.668 269.028 270.199 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 264.79 266.542 268.048 269.343 270.479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 265.279 266.963 268.407 269.652 270.751 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 263.867 265.76 267.363 268.754 269.962 271.018 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 264.401 266.214 267.762 269.094 270.254 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 264.914 266.656 268.133 269.423 270.54 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 263.453 265.407 267.066 268.493 269.732 270.817 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 264.012 265.88 267.471 268.841 270.034 271.082 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 264.548 266.332 267.857 269.177 270.329 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 265.058 266.768 268.234 269.504 270.613 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 263.622 265.548 267.184 268.591 269.815 270.888 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 264.175 266.023 267.588 268.938 270.118 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 264.702 266.469 267.967 269.27 270.407 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 265.202 266.888 268.334 269.589 270.688 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 263.791 265.684 267.298 268.689 269.897 270.959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 264.327 266.141 267.691 269.029 270.195 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 264.842 266.58 268.067 269.355 270.48 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 265.333 266.998 268.429 269.67 270.757 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 263.93 265.804 267.4 268.775 269.971 271.021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 264.462 266.254 267.785 269.108 270.262 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.09385 6.47612 6.85877 7.24302 7.62227 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1971 6.58356 6.9623 7.34475 7.72437 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92056 6.30221 6.68737 7.06479 7.4436 7.82623 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02475 6.40297 6.78964 7.16889 7.54713 7.92825 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1236 6.50566 6.88894 7.2683 7.64883 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22504 6.60762 6.98803 7.36957 7.75153 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.94585 6.32906 6.70878 7.09036 7.47243 7.85436 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04809 6.42958 6.81131 7.19324 7.57524 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.151 6.53251 6.91423 7.29619 7.67815 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25374 6.63546 7.01726 7.39922 7.78111 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97515 6.35668 6.73846 7.12039 7.50219 7.88404 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07808 6.45964 6.84149 7.22339 7.60531 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18107 6.56273 6.94463 7.32658 7.70837 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.90281 6.28418 6.66578 7.04778 7.42968 7.81147 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00595 6.38738 6.76911 7.15098 7.53281 7.9146 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10906 6.49057 6.87229 7.25419 7.63601 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21222 6.59384 6.97556 7.35743 7.7392 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93404 6.31535 6.69703 7.07886 7.46071 7.84248 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03716 6.4186 6.80035 7.18216 7.56396 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14042 6.52194 6.90363 7.28544 7.66726 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.2436 6.62519 7.007 7.38885 7.77056 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.96555 6.3469 6.72853 7.11033 7.49215 7.87387 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.06872 6.45019 6.8319 7.21373 7.59557 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.453 296.846 296.312 295.838 295.419 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.269 296.675 296.164 295.706 295.301 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.731 297.087 296.515 296.025 295.587 295.189 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.535 296.922 296.367 295.888 295.463 295.078 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.358 296.758 296.227 295.762 295.347 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.184 296.602 296.093 295.638 295.232 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.65 297.009 296.452 295.957 295.517 295.122 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.464 296.849 296.307 295.825 295.398 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.284 296.688 296.164 295.698 295.284 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.109 296.535 296.027 295.576 295.172 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.575 296.943 296.386 295.893 295.455 295.065 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.391 296.779 296.242 295.766 295.341 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.214 296.624 296.103 295.641 295.228 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.693 297.044 296.473 295.968 295.52 295.121 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.507 296.879 296.327 295.838 295.404 295.015 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.326 296.72 296.187 295.713 295.291 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.152 296.567 296.049 295.59 295.181 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.627 296.983 296.417 295.917 295.473 295.075 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.443 296.822 296.274 295.789 295.356 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.266 296.664 296.133 295.664 295.246 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.093 296.513 296.001 295.545 295.137 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 297.566 296.928 296.365 295.868 295.426 295.032 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 297.381 296.764 296.222 295.741 295.313 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00067 8.37694 8.75434 9.13104 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10198 8.47744 8.85542 9.23257 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82339 8.20052 8.57839 8.95602 9.33418 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92436 8.3021 8.67984 9.05795 9.4364 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02637 8.40384 8.78158 9.16701 9.54274 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12815 8.50523 8.88365 9.26488 9.64399 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8514 8.22905 8.60695 8.98582 9.36353 9.7422 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95307 8.33169 8.71073 9.08991 9.4661 9.8432 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05611 8.43396 8.81162 9.19132 9.5679 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15651 8.53629 8.91335 9.28976 9.66995 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88054 8.25829 8.63606 9.01403 9.39156 9.76864 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9823 8.36008 8.73783 9.11545 9.49299 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08415 8.46199 8.8397 9.21727 9.59466 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80846 8.18606 8.56381 8.94154 9.31913 9.6966 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91026 8.2879 8.66577 9.04343 9.42098 9.79826 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01217 8.38988 8.76765 9.14525 9.52277 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11409 8.49177 8.86956 9.24721 9.62464 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8385 8.21611 8.59377 8.97153 9.3491 9.72648 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94048 8.3181 8.69582 9.0735 9.45099 9.82837 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04249 8.42015 8.79787 9.17557 9.55302 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.14455 8.52223 8.89995 9.27755 9.65502 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86904 8.24665 8.62437 9.00204 9.3796 9.75693 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97115 8.34876 8.72649 9.10415 9.48164 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.217 275.794 276.324 276.814 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.368 275.931 276.451 276.931 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.911 275.514 276.067 276.576 277.045 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.072 275.661 276.2 276.698 277.16 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.229 275.803 276.332 276.829 277.277 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.384 275.944 276.461 276.941 277.384 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.935 275.533 276.081 276.587 277.055 277.489 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.096 275.681 276.219 276.715 277.169 277.592 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.257 275.826 276.35 276.835 277.281 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.409 275.968 276.479 276.95 277.392 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.966 275.559 276.103 276.605 277.068 277.496 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.128 275.708 276.239 276.728 277.181 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.286 275.85 276.37 276.85 277.294 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.836 275.44 275.992 276.5 276.969 277.403 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.004 275.591 276.13 276.625 277.085 277.512 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.163 275.737 276.265 276.751 277.201 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.321 275.881 276.396 276.871 277.312 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.875 275.472 276.019 276.524 276.99 277.422 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.038 275.621 276.156 276.649 277.105 277.528 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.197 275.766 276.289 276.771 277.218 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.351 275.907 276.418 276.891 277.329 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.908 275.501 276.045 276.545 277.008 277.437 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.068 275.648 276.179 276.668 277.121 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.86676 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97122 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0728 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.79155 10.1725 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89419 10.2746 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99681 10.377 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0996 10.4816 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.82179 10.2022 10.5825 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.92464 10.3049 10.6846 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0274 10.4076 10.7871 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1303 10.5102 10.8894 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.85262 10.233 10.6128 10.9919 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.9556 10.3358 10.7154 11.0943 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0585 10.4385 10.8179 11.1967 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.78087 10.1614 10.5413 10.9205 11.299 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88398 10.2643 10.644 11.023 11.4013 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.708 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.65 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.595 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.722 293.543 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.666 293.491 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.61 293.44 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.557 293.39 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.683 293.504 293.341 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.627 293.454 293.295 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.574 293.404 293.249 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.522 293.356 293.205 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.648 293.471 293.309 293.162 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.595 293.422 293.263 293.118 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.542 293.372 293.218 293.078 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.671 293.491 293.326 293.175 293.036 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.619 293.441 293.279 293.131 292.997 - - - - - - 5000 - 5000 - - 1.55006 1.71098 1.93889 2.21306 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.58541 1.76686 2.00906 2.29285 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.6269 1.82656 2.08179 2.37429 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.67364 1.89026 2.15677 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.72557 1.95771 2.23471 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.78236 2.02838 2.31479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.84339 2.10203 2.39699 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.90856 2.17846 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.97707 2.25748 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.04914 2.33909 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.12356 2.42112 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.20083 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.27961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.3609 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.4441 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 212.32 224.957 235.037 242.819 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 215.978 227.931 237.342 244.59 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 219.461 230.691 239.482 246.233 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 222.717 233.273 241.458 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 225.807 235.692 243.32 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 228.719 237.953 245.058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 231.45 240.06 246.678 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 233.998 242.022 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 236.386 243.862 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 238.613 245.58 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 240.677 247.16 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 242.6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 244.373 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 246.037 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 247.589 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.38844 2.73414 3.08925 3.45281 3.82187 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.48013 2.82839 3.18696 3.55249 3.92386 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.23391 2.57182 2.92345 3.28394 3.65084 4.02201 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.32272 2.6653 3.01965 3.38202 3.75044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.41356 2.75981 3.11667 3.48105 3.85113 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.5056 2.85516 3.21462 3.58022 3.94993 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.25897 2.59913 2.95163 3.31264 3.6786 4.05019 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.34937 2.69333 3.04854 3.41159 3.77869 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.44131 2.78739 3.14488 3.51014 3.87783 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.53342 2.88326 3.24261 3.60719 3.97732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.28654 2.62757 2.97934 3.33985 3.70658 4.07769 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.37706 2.72101 3.07587 3.43865 3.80653 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.46914 2.81612 3.17393 3.53973 3.9067 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.56113 2.91305 3.27325 3.64061 4.00722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.31274 2.65556 3.0091 3.37003 3.73795 4.10851 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.40536 2.75119 3.1059 3.46895 3.83748 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.49719 2.84619 3.20466 3.56971 3.93793 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.59097 2.94207 3.30194 3.66893 4.0392 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.68367 3.03791 3.40011 3.76811 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.7788 3.13568 3.49998 3.86767 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.876 3.23497 3.5984 3.96803 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.97153 3.33211 3.69808 4.06879 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.06786 3.43054 3.79802 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 315.475 311.37 308.222 305.731 303.722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 314.241 310.436 307.477 305.132 303.228 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 317.766 313.112 309.562 306.789 304.574 302.777 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 316.378 312.053 308.739 306.137 304.044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 315.085 311.07 307.967 305.517 303.538 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 313.882 310.148 307.241 304.936 303.073 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 317.335 312.767 309.286 306.565 304.394 302.621 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 315.966 311.731 308.479 305.92 303.875 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 314.692 310.777 307.736 305.324 303.39 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 313.532 309.878 307.029 304.768 302.927 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 316.902 312.438 309.041 306.372 304.234 302.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 315.573 311.441 308.26 305.747 303.726 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 314.34 310.504 307.52 305.145 303.244 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 313.214 309.615 306.817 304.58 302.789 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 316.525 312.142 308.801 306.181 304.071 302.354 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 315.204 311.148 308.035 305.565 303.572 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 314.005 310.231 307.302 304.978 303.103 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 312.884 309.379 306.636 304.435 302.649 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 311.863 308.579 305.997 303.922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 310.892 307.821 305.391 303.435 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 309.972 307.098 304.824 302.967 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 309.134 306.439 304.285 302.525 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 308.348 305.811 303.773 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.25613 4.62146 4.99286 5.361 5.73621 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.35358 4.71994 5.09033 5.46581 5.83719 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.08573 4.45092 4.81922 5.19111 5.5659 5.93954 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.18397 4.55054 4.9193 5.29365 5.66595 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.28236 4.64851 5.01934 5.39052 5.7653 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.37897 4.74712 5.11807 5.48905 5.86392 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.11301 4.47831 4.84524 5.21701 5.59074 5.96454 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.20982 4.57639 4.94616 5.31753 5.69041 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.30719 4.67602 5.04516 5.4189 5.79111 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.40599 4.77369 5.14441 5.51748 5.89193 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.13907 4.5043 4.87303 5.24445 5.61795 5.99301 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.23704 4.60333 4.9729 5.34493 5.71887 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.3354 4.70263 5.07291 5.44556 5.82 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.06963 4.43405 4.80229 5.1733 5.54647 5.9212 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.16808 4.53528 4.90327 5.27375 5.64742 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.26636 4.63427 5.00224 5.3745 5.74863 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.36454 4.73206 5.10255 5.47537 5.84987 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.09982 4.46381 4.83185 5.20301 5.57631 5.95124 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.19706 4.5627 4.93192 5.30365 5.67743 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.29518 4.66211 5.03206 5.40452 5.77871 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.39403 4.7618 5.13251 5.50547 5.88011 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.12801 4.49316 4.86178 5.23317 5.60668 5.98168 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.22632 4.59255 4.96205 5.33403 5.70795 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 264.834 266.593 268.111 269.401 270.546 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 265.328 267.014 268.465 269.732 270.821 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 263.89 265.799 267.419 268.816 270.033 271.093 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 264.433 266.259 267.812 269.164 270.326 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 264.953 266.694 268.189 269.475 270.604 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 265.438 267.111 268.546 269.783 270.874 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 264.035 265.916 267.509 268.891 270.091 271.14 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 264.565 266.367 267.905 269.229 270.381 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 265.076 266.806 268.274 269.555 270.664 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 265.565 267.214 268.632 269.862 270.939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 264.179 266.036 267.616 268.977 270.162 271.202 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 264.712 266.485 268 269.311 270.455 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 265.219 266.918 268.374 269.635 270.737 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 263.791 265.705 267.331 268.729 269.945 271.01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 264.341 266.178 267.732 269.073 270.245 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 264.865 266.621 268.109 269.403 270.532 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 265.362 267.037 268.474 269.72 270.812 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 263.96 265.841 267.444 268.826 270.026 271.08 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 264.493 266.295 267.835 269.164 270.321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 265.005 266.731 268.208 269.488 270.605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 265.492 267.147 268.568 269.8 270.88 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 264.098 265.96 267.546 268.911 270.099 271.143 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 264.626 266.407 267.928 269.242 270.388 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08785 6.4704 6.8533 7.23779 7.61725 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19118 6.57793 6.95691 7.33958 7.7194 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.91441 6.29638 6.68181 7.05946 7.43848 7.82132 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0187 6.3972 6.78415 7.16362 7.54208 7.92338 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11764 6.49997 6.88351 7.2631 7.64382 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21916 6.60202 6.98266 7.36443 7.74658 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93975 6.32325 6.70324 7.08505 7.46734 7.84947 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04207 6.42384 6.80584 7.18801 7.5702 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14507 6.52685 6.90882 7.29101 7.67317 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.24787 6.62987 7.01191 7.3941 7.7762 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96907 6.3509 6.73295 7.11511 7.49712 7.87916 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07209 6.45394 6.83604 7.21816 7.6003 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17515 6.55709 6.93925 7.32142 7.70341 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.89666 6.27834 6.66022 7.04246 7.42457 7.80656 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9999 6.38162 6.76361 7.14571 7.52775 7.90974 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10308 6.48487 6.86686 7.24898 7.63101 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.20632 6.58822 6.97019 7.35228 7.73425 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92793 6.30953 6.69148 7.07355 7.45562 7.83758 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03111 6.41285 6.79487 7.17692 7.55892 7.94081 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13446 6.51628 6.89821 7.28025 7.66227 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.23772 6.61958 7.00163 7.38371 7.76563 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.95943 6.34109 6.723 7.10503 7.48706 7.86898 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.0627 6.44446 6.82643 7.20848 7.59054 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.197 296.603 296.081 295.618 295.21 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.017 296.437 295.937 295.49 295.094 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.468 296.839 296.28 295.8 295.373 294.985 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.276 296.677 296.136 295.667 295.252 294.876 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.103 296.516 295.998 295.544 295.138 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.933 296.364 295.866 295.423 295.026 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.388 296.762 296.217 295.734 295.304 294.919 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.206 296.605 296.076 295.605 295.187 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.031 296.448 295.935 295.481 295.076 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.859 296.298 295.802 295.362 294.967 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.315 296.697 296.152 295.671 295.243 294.863 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.135 296.537 296.011 295.546 295.132 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.961 296.385 295.876 295.424 295.022 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.43 296.795 296.237 295.744 295.306 294.916 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.248 296.634 296.094 295.617 295.193 294.813 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.07 296.478 295.957 295.495 295.083 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.901 296.329 295.823 295.375 294.975 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.366 296.735 296.182 295.694 295.26 294.872 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.185 296.578 296.043 295.569 295.146 294.769 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.013 296.424 295.905 295.446 295.038 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.843 296.276 295.776 295.331 294.932 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 297.305 296.681 296.132 295.646 295.214 294.829 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 297.125 296.522 295.991 295.522 295.104 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9983 8.3747 8.75221 9.12901 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09965 8.47523 8.85332 9.23057 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82096 8.19822 8.5762 8.95395 9.33221 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92197 8.29983 8.6777 9.05591 9.43445 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02402 8.4016 8.77946 9.165 9.54082 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12582 8.50304 8.88156 9.2629 9.64209 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84898 8.22677 8.60478 8.98375 9.36157 9.74033 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95069 8.32943 8.70859 9.08787 9.46417 9.84136 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05377 8.43174 8.80951 9.18931 9.56599 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15421 8.5341 8.91127 9.28778 9.66807 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87814 8.25601 8.6339 9.01198 9.38961 9.76678 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97993 8.35784 8.7357 9.11343 9.49107 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08182 8.45979 8.8376 9.21527 9.59276 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80603 8.18376 8.56164 8.93947 9.31717 9.69473 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90787 8.28564 8.66362 9.04139 9.41903 9.79641 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00982 8.38765 8.76553 9.14324 9.52086 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11177 8.48958 8.86748 9.24522 9.62275 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83609 8.21382 8.59161 8.96947 9.34714 9.72461 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9381 8.31586 8.69368 9.07147 9.44906 9.82652 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04015 8.41793 8.79576 9.17357 9.55111 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.14225 8.52004 8.89787 9.27557 9.65314 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86664 8.24437 8.62222 8.99999 9.37765 9.75508 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96878 8.34652 8.72437 9.10212 9.47972 9.85709 NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.316 275.889 276.416 276.902 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.467 276.025 276.542 277.018 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.013 275.611 276.161 276.666 277.132 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.173 275.757 276.292 276.787 277.245 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.328 275.899 276.424 276.917 277.362 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.482 276.038 276.551 277.028 277.469 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.036 275.629 276.174 276.677 277.141 277.572 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.196 275.777 276.312 276.803 277.255 277.675 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.355 275.921 276.441 276.923 277.366 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.507 276.062 276.569 277.037 277.476 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.067 275.656 276.196 276.694 277.154 277.579 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.228 275.803 276.331 276.816 277.266 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.384 275.945 276.461 276.937 277.379 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.938 275.537 276.086 276.59 277.056 277.487 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.104 275.687 276.222 276.714 277.171 277.595 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.262 275.832 276.356 276.84 277.286 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.419 275.976 276.486 276.958 277.396 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.976 275.569 276.113 276.614 277.077 277.506 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.138 275.717 276.249 276.738 277.191 277.611 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.296 275.861 276.38 276.859 277.303 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.449 276.001 276.509 276.978 277.413 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.009 275.598 276.138 276.635 277.094 277.52 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.168 275.743 276.271 276.757 277.207 277.624 NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.86249 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.96698 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0685 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1683 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88992 10.2705 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99258 10.3729 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0954 10.4775 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81751 10.1981 10.5784 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.92039 10.3008 10.6805 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0232 10.4035 10.783 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1261 10.5061 10.8854 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84835 10.2288 10.6087 10.9879 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95135 10.3317 10.7113 11.0903 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0543 10.4344 10.8139 11.1927 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1572 10.5372 10.9165 11.2951 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87971 10.2601 10.6399 11.019 11.3974 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.539 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.482 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.429 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.379 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.497 293.328 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.442 293.278 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.392 293.23 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.513 293.34 293.183 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.459 293.291 293.138 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.407 293.243 293.094 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.357 293.196 293.05 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.479 293.307 293.151 293.009 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.427 293.26 293.107 292.967 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.376 293.212 293.063 292.927 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.326 293.167 293.021 292.887 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.45 293.278 293.121 292.978 292.849 - - - - - - 5000 - 5000 - - 0.823021 1.09759 1.42808 1.78343 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 0.888617 1.18332 1.52228 1.88183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 0.96129 1.27114 1.61752 1.98058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.03882 1.36153 1.71324 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.12115 1.45411 1.81074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.20727 1.54851 1.90917 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.29632 1.64431 2.00837 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.38777 1.74128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.48123 1.83971 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.57669 1.93935 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.67273 2.03806 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.7702 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.8675 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.9663 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 229.927 246.892 256.583 262.547 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 235.513 250.034 258.465 263.767 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 240.301 252.73 260.117 264.858 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 244.336 255.069 261.572 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 247.82 257.131 262.893 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 250.834 258.945 264.076 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 253.444 260.552 265.148 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 255.718 261.987 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 257.716 263.276 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 259.472 264.438 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 261.029 265.472 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 262.413 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 263.646 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 264.758 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.09176 2.47755 2.86322 3.25088 3.63943 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.19555 2.58086 2.96816 3.35636 3.74618 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 1.9148 2.29829 2.68439 3.07176 3.46011 3.84868 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.0172 2.40205 2.78857 3.17612 3.56482 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.12068 2.50607 2.89307 3.28114 3.67038 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.22449 2.61035 2.99798 3.3859 3.77363 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 1.94398 2.3288 2.71514 3.10249 3.48949 3.87824 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.04776 2.43307 2.81985 3.20766 3.59453 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.15217 2.53634 2.92331 3.3119 3.69832 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.2555 2.64088 3.02782 3.41429 3.80226 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 1.97559 2.36027 2.74503 3.13137 3.51878 3.9068 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.07908 2.46333 2.84903 3.23614 3.62359 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.18311 2.56744 2.95418 3.34299 3.72837 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.90187 2.28599 2.67295 3.06023 3.44926 3.83319 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.00515 2.3908 2.77676 3.16306 3.55144 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.1106 2.49603 2.88093 3.26791 3.65574 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.21408 2.59983 2.98672 3.37426 3.76062 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.31864 2.70384 3.0903 3.47866 3.86625 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.42119 2.80736 3.19459 3.58269 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.52569 2.91236 3.3002 3.68688 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.63172 3.0186 3.40406 3.79169 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.7353 3.12202 3.50885 3.89664 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.83915 3.22644 3.61367 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 296.341 294.627 293.39 292.453 291.725 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 295.807 294.246 293.101 292.228 291.541 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 297.35 295.332 293.897 292.835 292.02 291.376 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 296.724 294.891 293.575 292.589 291.826 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 296.161 294.491 293.278 292.357 291.639 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 295.648 294.121 292.996 292.142 291.471 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 297.15 295.179 293.782 292.742 291.943 291.309 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 296.546 294.756 293.468 292.5 291.752 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 295.995 294.372 293.182 292.279 291.579 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 295.503 294.016 292.916 292.076 291.413 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 296.971 295.054 293.691 292.671 291.881 291.257 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 296.39 294.647 293.388 292.438 291.699 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 295.856 294.272 293.107 292.218 291.528 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 297.454 295.387 293.923 292.841 292.008 291.364 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 296.824 294.944 293.603 292.604 291.827 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 296.246 294.544 293.315 292.378 291.648 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 295.734 294.176 293.033 292.162 291.481 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 295.262 293.839 292.782 291.964 291.319 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 294.842 293.528 292.541 291.775 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 294.447 293.234 292.315 291.6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 294.078 292.958 292.106 291.431 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 293.747 292.708 291.907 291.272 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 293.437 292.47 291.719 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.05467 4.43801 4.82492 5.20613 5.59297 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.15723 4.54087 4.9261 5.31444 5.69679 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 3.87468 4.25951 4.64438 5.03047 5.41762 5.80194 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 3.97859 4.3639 4.74854 5.13665 5.52073 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.08242 4.46643 4.85252 5.23676 5.62294 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.18412 4.56941 4.95496 5.33847 5.72437 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 3.90383 4.28843 4.67164 5.05749 5.4434 5.82776 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.00618 4.39124 4.77674 5.16153 5.54606 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.1089 4.49548 4.87955 5.26633 5.6497 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 3.82848 4.21277 4.59735 4.98252 5.36806 5.75341 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 3.93172 4.31601 4.70091 5.08616 5.47163 5.85718 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.03529 4.41974 4.80475 5.19009 5.57561 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.13893 4.52355 4.9087 5.29414 5.67969 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 3.85857 4.24267 4.62751 5.01276 5.39824 5.78371 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 3.96275 4.34877 4.73266 5.11676 5.50231 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.06646 4.45239 4.83553 5.22093 5.60648 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.16984 4.55449 4.93961 5.32507 5.7106 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 3.89079 4.27407 4.6585 5.04373 5.42919 5.81476 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 3.99356 4.37767 4.76263 5.14787 5.53336 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.09698 4.48159 4.86661 5.25208 5.63757 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.20085 4.58557 4.97078 5.35625 5.74179 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 3.92052 4.30482 4.68969 5.07497 5.46051 5.84604 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.02436 4.40884 4.79387 5.17921 5.56474 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.644 276.567 277.355 278.022 278.609 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 275.9 276.783 277.534 278.185 278.746 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 275.137 276.143 276.988 277.711 278.337 278.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 275.42 276.382 277.19 277.887 278.484 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 275.694 276.605 277.38 278.043 278.623 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 275.945 276.818 277.562 278.2 278.759 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 275.202 276.195 277.024 277.737 278.354 278.89 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 275.482 276.428 277.226 277.908 278.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 275.75 276.654 277.416 278.075 278.644 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 274.982 276.008 276.868 277.6 278.231 278.782 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 275.278 276.254 277.074 277.776 278.384 278.917 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 275.557 276.485 277.272 277.948 278.533 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 275.826 276.712 277.464 278.111 278.674 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 275.075 276.081 276.925 277.645 278.27 278.815 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 275.365 276.329 277.135 277.825 278.424 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 275.644 276.56 277.328 277.992 278.57 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 275.903 276.774 277.516 278.156 278.713 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 275.165 276.154 276.986 277.696 278.31 278.848 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 275.447 276.39 277.186 277.868 278.46 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 275.716 276.616 277.378 278.034 278.605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 275.972 276.831 277.563 278.193 278.743 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 275.24 276.216 277.036 277.737 278.345 278.876 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 275.514 276.445 277.231 277.906 278.492 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96831 6.35656 6.74455 7.13355 7.51709 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07333 6.46568 6.84961 7.2366 7.6204 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.79222 6.18021 6.57114 6.95342 7.33665 7.72339 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.89835 6.28256 6.67477 7.05884 7.44141 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9989 6.38689 6.77542 7.15953 7.54425 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10198 6.49033 6.87585 7.26197 7.64809 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.81818 6.20769 6.59295 6.97949 7.36602 7.75201 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92217 6.30973 6.69687 7.08368 7.47001 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0268 6.41423 6.80118 7.18783 7.57402 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13121 6.51862 6.90551 7.29204 7.67809 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.84796 6.23573 6.62307 7.00995 7.39619 7.78203 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.95266 6.34028 6.72748 7.11416 7.5004 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05733 6.44481 6.83194 7.21857 7.60457 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.77427 6.16205 6.54933 6.93639 7.32283 7.7087 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87918 6.26682 6.65405 7.04083 7.42707 7.81286 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.98399 6.37148 6.75854 7.14521 7.53135 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08878 6.47622 6.86313 7.24964 7.63558 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.80587 6.19354 6.58084 6.96767 7.35403 7.73988 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9107 6.29827 6.6855 7.07221 7.45841 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01561 6.40313 6.79012 7.17668 7.56275 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12043 6.50777 6.8947 7.28119 7.66709 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.8376 6.22526 6.61251 6.99932 7.38562 7.77139 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.94253 6.33012 6.71724 7.1039 7.49009 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.645 289.494 289.366 289.257 289.164 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.592 289.447 289.324 289.219 289.129 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.701 289.539 289.401 289.285 289.185 289.098 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.645 289.493 289.358 289.247 289.15 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.595 289.447 289.319 289.212 289.119 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.547 289.405 289.283 289.177 289.088 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.661 289.498 289.362 289.246 289.145 289.059 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.608 289.455 289.324 289.212 289.114 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.56 289.412 289.286 289.176 289.084 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.512 289.37 289.25 289.146 289.056 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.627 289.468 289.332 289.215 289.114 289.027 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.578 289.425 289.294 289.182 289.085 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.532 289.384 289.259 289.15 289.057 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.652 289.487 289.346 289.225 289.121 289.03 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.604 289.445 289.309 289.191 289.091 289.004 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.555 289.402 289.272 289.161 289.064 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.51 289.364 289.238 289.129 289.035 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.633 289.467 289.325 289.203 289.1 289.011 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.582 289.424 289.29 289.174 289.072 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.536 289.384 289.253 289.141 289.044 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.489 289.343 289.218 289.112 289.018 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 289.608 289.445 289.305 289.185 289.081 288.991 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 289.558 289.402 289.267 289.151 289.052 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90302 8.28516 8.66786 9.04947 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00598 8.38712 8.77029 9.15224 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.72283 8.10604 8.4895 8.87223 9.25506 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82551 8.20919 8.59235 8.97546 9.35847 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92914 8.31244 8.6955 9.08594 9.46611 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03262 8.41535 8.79895 9.18495 9.56853 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.75138 8.13509 8.5185 8.90243 9.2848 9.6678 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.85477 8.23933 8.62377 9.0079 9.38863 9.76988 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95956 8.34315 8.72605 9.11058 9.4916 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06157 8.447 8.82914 9.21026 9.59483 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.78118 8.16494 8.54818 8.93119 9.31334 9.69462 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88467 8.26832 8.65141 9.0339 9.41595 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9882 8.37173 8.75465 9.13702 9.51882 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.70803 8.09174 8.47507 8.8579 9.24016 9.6219 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.81165 8.19523 8.5785 8.96111 9.34322 9.72473 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91523 8.29874 8.68181 9.06428 9.44627 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01882 8.40217 8.78512 9.1675 9.5493 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.7388 8.12245 8.50562 8.88843 9.27065 9.65232 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84249 8.22601 8.60912 8.99174 9.37376 9.75531 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94618 8.3296 8.71257 9.09509 9.47697 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04989 8.43317 8.81602 9.19834 9.58015 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.76993 8.15356 8.53677 8.91946 9.30163 9.6832 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87374 8.25722 8.6403 9.02284 9.40485 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.119 281.436 281.729 281.998 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.198 281.506 281.794 282.058 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.943 281.273 281.577 281.857 282.118 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.026 281.349 281.646 281.921 282.177 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.109 281.424 281.716 281.989 282.237 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.191 281.497 281.782 282.048 282.294 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.941 281.268 281.57 281.849 282.108 282.348 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.027 281.348 281.643 281.915 282.167 282.403 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.112 281.423 281.711 281.979 282.227 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.192 281.499 281.78 282.04 282.284 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.948 281.273 281.571 281.846 282.102 282.34 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.035 281.352 281.642 281.912 282.163 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.119 281.428 281.714 281.978 282.223 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.873 281.202 281.505 281.783 282.041 282.282 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.962 281.282 281.576 281.85 282.104 282.341 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.047 281.361 281.65 281.917 282.165 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.133 281.438 281.72 281.981 282.225 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.888 281.214 281.513 281.79 282.047 282.285 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.976 281.295 281.587 281.857 282.108 282.342 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.061 281.371 281.657 281.923 282.17 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 281.143 281.448 281.728 281.987 282.228 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.901 281.224 281.521 281.795 282.049 282.287 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.987 281.303 281.593 281.861 282.111 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.77886 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88395 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.98596 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.70334 10.0861 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80648 10.1888 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90965 10.2916 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0129 10.3967 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.73372 10.116 10.498 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.83709 10.2192 10.6005 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94035 10.3223 10.7034 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0436 10.4253 10.8062 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.76462 10.1468 10.5283 10.909 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.86804 10.2501 10.6314 11.0118 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97146 10.3533 10.7343 11.1146 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.69239 10.0748 10.4564 10.8373 11.2173 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.79593 10.1781 10.5595 10.9402 11.32 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.862 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.855 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.849 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.842 288.842 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.837 288.837 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.83 288.831 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.825 288.826 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.821 288.82 288.822 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.816 288.815 288.818 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.811 288.811 288.815 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.807 288.808 288.811 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.803 288.801 288.803 288.808 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.798 288.798 288.801 288.805 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.795 288.794 288.796 288.801 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.792 288.79 288.791 288.795 288.8 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 288.788 288.787 288.787 288.79 288.796 - - - - - - 5000 - 5000 - - 1.06393 1.28775 1.57858 1.9058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.11513 1.36135 1.66423 1.99819 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.1738 1.43834 1.75165 2.0913 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.23792 1.5186 1.84029 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.30764 1.60206 1.93132 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.38207 1.68804 2.02374 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.46029 1.77614 2.11744 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.54189 1.86621 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.62642 1.95819 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.71353 2.05198 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.8023 2.14541 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.8928 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.98412 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.07718 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 221.083 236.923 247.534 254.693 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 225.972 240.231 249.738 256.21 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 230.397 243.161 251.717 257.594 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 234.333 245.795 253.493 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 237.887 248.169 255.122 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 241.084 250.31 256.607 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 243.954 252.246 257.964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 246.528 253.997 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 248.843 255.597 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 250.936 257.055 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 252.808 258.366 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 254.519 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 256.045 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 257.452 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.16755 2.54243 2.92005 3.30146 3.68506 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.26803 2.64332 3.0231 3.40546 3.79057 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 1.99688 2.36773 2.74461 3.12497 3.50784 3.892 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.09547 2.46874 2.84672 3.22771 3.61122 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.19545 2.57016 2.94924 3.33121 3.71557 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.29601 2.67213 3.05238 3.43456 3.81768 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.02498 2.39742 2.7747 3.15517 3.53679 3.92121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.12496 2.49894 2.87737 3.25878 3.64061 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.22594 2.59979 2.979 3.36155 3.7432 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.32621 2.70203 3.08175 3.46259 3.84605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.0555 2.42809 2.80404 3.18368 3.56579 3.94954 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.15534 2.52859 2.90614 3.28695 3.66939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.25612 2.63032 3.00942 3.39229 3.773 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.98474 2.35595 2.73352 3.11376 3.49724 3.87677 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.08416 2.45804 2.83536 3.21503 3.59814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.18607 2.56065 2.93755 3.31834 3.70128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.28633 2.66216 3.0416 3.42333 3.80504 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.38799 2.76401 3.14348 3.52637 3.90959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.48783 2.86552 3.24624 3.62922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.58986 2.96864 3.35037 3.7322 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.69351 3.07307 3.45285 3.83591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.79497 3.17487 3.55634 3.9398 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.89686 3.27776 3.65993 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 303.661 300.901 298.874 297.315 296.088 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 302.816 300.288 298.4 296.942 295.783 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 305.261 302.051 299.72 297.964 296.599 295.51 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 304.283 301.346 299.195 297.556 296.272 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 303.388 300.694 298.702 297.172 295.964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 302.567 300.096 298.244 296.815 295.68 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 304.958 301.818 299.539 297.818 296.48 295.408 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 303.997 301.129 299.023 297.419 296.165 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 303.121 300.507 298.553 297.049 295.868 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 302.334 299.922 298.109 296.708 295.59 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 304.661 301.603 299.385 297.7 296.382 295.326 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 303.735 300.946 298.89 297.314 296.074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 302.891 300.335 298.421 296.941 295.783 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 305.4 302.127 299.757 297.981 296.596 295.509 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 304.408 301.418 299.239 297.585 296.283 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 303.494 300.761 298.751 297.203 295.984 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 302.674 300.166 298.294 296.846 295.699 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 301.921 299.614 297.871 296.51 295.427 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 301.238 299.103 297.475 296.199 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 300.601 298.621 297.098 295.9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 300.001 298.164 296.749 295.618 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 299.459 297.751 296.418 295.35 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 298.956 297.359 296.106 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.10807 4.48638 4.86899 5.24658 5.63024 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.20923 4.58805 4.96915 5.35392 5.73325 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 3.93083 4.3101 4.69034 5.0725 5.45627 5.83766 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.0331 4.41317 4.79341 5.17771 5.55853 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.13545 4.51444 4.89627 5.27689 5.65995 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.23568 4.61619 4.9977 5.37776 5.76063 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 3.95943 4.3386 4.71728 5.09923 5.48178 5.86323 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.06023 4.44009 4.82122 5.20229 5.58362 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.16143 4.54303 4.92295 5.30615 5.68645 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 3.88516 4.26385 4.64374 5.02491 5.40701 5.78935 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 3.98682 4.36575 4.74611 5.12752 5.50969 5.89238 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.08876 4.4681 4.84885 5.23054 5.61288 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.19094 4.57072 4.95173 5.33361 5.7161 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 3.91468 4.29322 4.6734 5.05471 5.43684 5.81939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.01718 4.39794 4.77744 5.15778 5.54005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.11942 4.50028 4.87919 5.26095 5.64339 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.22129 4.60116 4.98223 5.36423 5.74674 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 3.94627 4.32414 4.70401 5.08535 5.46745 5.8501 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.04748 4.42641 4.807 5.18851 5.57078 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.14941 4.52906 4.9099 5.29179 5.67419 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.25185 4.63185 5.01305 5.39508 5.77763 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 3.97555 4.35447 4.73481 5.11624 5.49848 5.88114 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.07782 4.45718 4.83792 5.21957 5.60191 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.758 272.999 274.06 274.958 275.75 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.103 273.29 274.304 275.185 275.94 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 271.08 272.434 273.574 274.547 275.39 276.123 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 271.466 272.756 273.844 274.784 275.591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 271.831 273.059 274.106 275.001 275.782 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 272.175 273.351 274.352 275.21 275.965 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 271.177 272.51 273.628 274.59 275.423 276.148 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 271.553 272.826 273.903 274.823 275.622 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 271.915 273.134 274.16 275.049 275.816 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 270.885 272.263 273.42 274.408 275.261 276.005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 271.278 272.591 273.7 274.648 275.469 276.187 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 271.658 272.909 273.968 274.877 275.668 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 272.016 273.209 274.226 275.102 275.864 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 271.004 272.361 273.503 274.475 275.316 276.05 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 271.398 272.694 273.781 274.713 275.523 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 271.768 273.004 274.044 274.943 275.722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 272.12 273.296 274.297 275.16 275.914 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 271.127 272.457 273.58 274.541 275.373 276.099 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 271.505 272.776 273.853 274.775 275.575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 271.868 273.082 274.113 274.999 275.771 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 272.213 273.372 274.361 275.215 275.96 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 271.225 272.541 273.651 274.6 275.422 276.14 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 271.599 272.854 273.915 274.827 275.619 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99855 6.38551 6.77232 7.16025 7.54287 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10317 6.49423 6.87703 7.26301 7.64593 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.82307 6.20966 6.59936 6.98057 7.3628 7.74864 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92878 6.31166 6.70265 7.08567 7.4673 7.85153 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02896 6.41565 6.80301 7.18608 7.56988 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13165 6.51873 6.90314 7.28826 7.67348 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.84888 6.23701 6.62106 7.00652 7.39205 7.77714 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.95251 6.33872 6.72465 7.11039 7.49578 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05672 6.44286 6.82868 7.21431 7.59957 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1608 6.54696 6.93272 7.31823 7.70337 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87858 6.26496 6.65107 7.03687 7.42216 7.80712 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.98288 6.36917 6.7552 7.14083 7.52611 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08719 6.47339 6.85937 7.24497 7.63005 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.80521 6.19157 6.57759 6.96353 7.34898 7.73396 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.90972 6.29599 6.68202 7.06772 7.45299 7.8379 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01418 6.40036 6.78624 7.17184 7.55703 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1186 6.50475 6.89051 7.27602 7.66106 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.83672 6.22301 6.60909 6.99482 7.38018 7.76511 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.94124 6.32745 6.71344 7.09906 7.48429 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04575 6.43195 6.81779 7.20332 7.58845 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15024 6.53632 6.92211 7.30755 7.69254 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.86847 6.25472 6.64073 7.02644 7.41176 7.79665 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.97301 6.35924 6.74518 7.13077 7.516 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.341 292.031 291.76 291.52 291.314 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.241 291.938 291.679 291.45 291.252 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.476 292.144 291.853 291.606 291.386 291.191 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.371 292.055 291.773 291.533 291.321 291.133 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.276 291.969 291.699 291.466 291.26 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.182 291.885 291.627 291.4 291.201 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.421 292.09 291.807 291.557 291.336 291.142 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.323 292.006 291.729 291.487 291.275 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.226 291.92 291.655 291.422 291.216 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.135 291.841 291.584 291.357 291.157 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.374 292.047 291.762 291.513 291.296 291.103 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.276 291.962 291.688 291.448 291.236 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.184 291.881 291.616 291.383 291.178 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.432 292.096 291.803 291.546 291.322 291.123 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.333 292.009 291.727 291.48 291.263 291.07 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.239 291.927 291.655 291.415 291.204 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.148 291.846 291.582 291.352 291.149 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.394 292.06 291.77 291.516 291.293 291.094 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.3 291.978 291.696 291.449 291.232 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.204 291.894 291.624 291.387 291.178 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.115 291.817 291.555 291.324 291.121 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 292.358 292.027 291.738 291.486 291.264 291.069 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 292.261 291.942 291.664 291.42 291.205 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92703 8.30759 8.68885 9.06912 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02956 8.40915 8.7909 9.17156 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.74765 8.12921 8.51115 8.89249 9.27405 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84986 8.23191 8.6136 8.99538 9.37715 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95304 8.33477 8.7164 9.10548 9.48443 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05608 8.43726 8.81944 9.20415 9.58657 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.77604 8.1581 8.54003 8.9226 9.30371 9.68552 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87898 8.26194 8.6449 9.02767 9.40718 9.78731 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.98329 8.36531 8.74679 9.13002 9.50985 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08486 8.46877 8.84952 9.22936 9.61275 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80566 8.18779 8.56956 8.9512 9.3321 9.71225 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90869 8.29075 8.67238 9.05355 9.43439 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01174 8.39373 8.77525 9.15633 9.53693 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.73279 8.11487 8.49668 8.87811 9.2591 9.63969 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83593 8.21788 8.59968 8.98096 9.36185 9.74223 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93903 8.32099 8.70263 9.08378 9.46455 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04219 8.42398 8.80552 9.18662 9.56726 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.76334 8.14535 8.52703 8.90849 9.28946 9.66996 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86657 8.24851 8.63015 9.01141 9.39221 9.77265 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9698 8.35166 8.73321 9.11443 9.49512 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07306 8.45483 8.83629 9.21733 9.59797 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.7943 8.1763 8.55803 8.93936 9.32028 9.70071 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89765 8.27954 8.66117 9.04239 9.42319 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.082 279.49 279.866 280.213 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.187 279.584 279.953 280.292 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.86 279.286 279.677 280.038 280.372 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.971 279.388 279.77 280.122 280.449 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.08 279.486 279.86 280.212 280.53 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.187 279.584 279.95 280.29 280.604 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.868 279.291 279.678 280.036 280.367 280.676 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.979 279.393 279.773 280.125 280.447 280.748 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.091 279.494 279.864 280.208 280.524 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.197 279.592 279.953 280.288 280.601 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.884 279.302 279.686 280.041 280.369 280.673 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.996 279.405 279.781 280.127 280.448 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.107 279.506 279.872 280.212 280.526 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.789 279.213 279.603 279.963 280.296 280.604 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.905 279.32 279.701 280.051 280.375 280.678 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.018 279.422 279.793 280.137 280.457 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.127 279.523 279.888 280.223 280.534 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.814 279.235 279.62 279.976 280.305 280.611 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.926 279.337 279.715 280.064 280.387 280.686 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.038 279.44 279.808 280.149 280.465 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.146 279.538 279.899 280.233 280.543 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.833 279.25 279.634 279.987 280.314 280.618 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 278.945 279.353 279.728 280.074 280.394 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80105 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90604 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0079 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.72561 10.108 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.82863 10.2106 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93171 10.3134 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0349 10.4183 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.75596 10.1379 10.5195 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.85923 10.241 10.622 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.96242 10.344 10.7248 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0656 10.447 10.8276 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.78686 10.1688 10.5499 10.9303 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89022 10.2719 10.6528 11.033 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99352 10.375 10.7557 11.1357 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.71476 10.0969 10.4781 10.8586 11.2384 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.8182 10.2 10.5811 10.9615 11.341 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.524 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.5 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.476 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.517 290.455 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.492 290.432 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.469 290.412 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.448 290.39 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.488 290.426 290.371 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.466 290.406 290.353 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.445 290.386 290.334 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.423 290.367 290.317 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.465 290.403 290.349 290.3 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.444 290.383 290.329 290.282 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.422 290.364 290.313 290.267 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.467 290.404 290.346 290.295 290.25 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.445 290.382 290.327 290.279 290.237 - - - - - - 5000 - 5000 - - 1.2995 1.48813 1.74568 2.04611 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.3417 1.55209 1.82329 2.13226 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.39058 1.61991 1.90338 2.21977 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.44512 1.69155 1.98515 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.50511 1.76668 2.0697 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.56998 1.84486 2.15612 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.63923 1.92573 2.24418 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.71214 2.0089 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.78855 2.09464 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.86798 2.18232 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.94949 2.27034 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.03347 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.11853 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.20597 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 215.95 230.181 240.735 248.4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 220.175 233.374 243.052 250.089 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 224.124 236.276 245.162 251.636 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 227.739 238.942 247.088 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 231.102 241.4 248.879 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 234.212 243.658 250.529 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 237.067 245.73 252.055 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 239.692 247.638 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 242.098 249.397 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 244.316 251.031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 246.338 252.507 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 248.199 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 249.894 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 251.463 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.26702 2.62823 2.99553 3.36881 3.74582 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.36337 2.72606 3.09611 3.47083 3.84974 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.10401 2.45932 2.8245 3.19576 3.5714 3.94971 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.19799 2.55679 2.92387 3.29636 3.67306 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.29359 2.65501 3.02391 3.39789 3.77577 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.39023 2.75396 3.12464 3.4993 3.87638 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.13069 2.48785 2.85367 3.22528 3.59984 3.97849 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.22609 2.58604 2.95377 3.32679 3.70193 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.32285 2.68372 3.05292 3.4276 3.80299 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.41926 2.78302 3.15342 3.5269 3.90434 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.15979 2.51756 2.88233 3.25322 3.62836 4.00641 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.25528 2.61481 2.98186 3.35443 3.73032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.35191 2.71342 3.08275 3.45788 3.83242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.0926 2.4481 2.8138 3.18485 3.56099 3.93468 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.18739 2.54662 2.91289 3.284 3.66028 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.28478 2.64595 3.01268 3.38542 3.76184 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.38122 2.74454 3.11431 3.48841 3.86403 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.47907 2.84357 3.21408 3.5898 3.96722 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.57567 2.94256 3.31479 3.69095 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.67448 3.04316 3.41693 3.79241 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.77513 3.14528 3.51763 3.89463 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.87389 3.24495 3.61938 3.9971 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.97322 3.3458 3.72133 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 309.913 306.376 303.726 301.66 300.012 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 308.84 305.583 303.102 301.164 299.605 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 311.926 307.866 304.846 302.529 300.706 299.238 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 310.703 306.956 304.153 301.988 300.269 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 309.57 306.117 303.508 301.479 299.856 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 308.53 305.339 302.902 300.998 299.474 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 311.546 307.566 304.609 302.341 300.555 299.11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 310.34 306.682 303.936 301.809 300.128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 309.232 305.871 303.312 301.315 299.732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 308.226 305.11 302.727 300.861 299.357 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 311.167 307.289 304.407 302.183 300.422 298.998 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 310.005 306.44 303.753 301.665 300.007 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 308.929 305.642 303.136 301.171 299.616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 312.082 307.958 304.894 302.554 300.707 299.244 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 310.845 307.041 304.207 302.024 300.289 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 309.683 306.19 303.569 301.52 299.885 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 308.649 305.42 302.96 301.034 299.498 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 307.678 304.696 302.404 300.591 299.135 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 306.806 304.029 301.878 300.169 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 305.978 303.391 301.374 299.771 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 305.199 302.79 300.911 299.392 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 304.493 302.243 300.467 299.03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 303.833 301.722 300.048 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.17306 4.54551 4.92306 5.29644 5.67639 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.27248 4.64575 5.02209 5.4027 5.77848 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 3.99891 4.37184 4.7467 5.12423 5.50398 5.88194 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.09932 4.47329 4.8484 5.22827 5.60533 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.19989 4.57313 4.95005 5.32643 5.70577 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.29851 4.67346 5.05023 5.42624 5.80556 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.02689 4.39979 4.7732 5.15062 5.52925 5.90729 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.12585 4.49975 4.87582 5.25255 5.63011 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.22538 4.60124 4.9763 5.35528 5.73197 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 3.95393 4.32611 4.70052 5.07704 5.45514 5.83398 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.05363 4.42644 4.80162 5.17854 5.55681 5.93609 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.15386 4.52729 4.90299 5.28037 5.659 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.25421 4.62839 5.00465 5.38243 5.76131 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 3.98277 4.35494 4.72975 5.10643 5.48453 5.86361 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.08341 4.45801 4.83237 5.20835 5.5868 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.18384 4.5589 4.93293 5.31044 5.68915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.28407 4.65838 5.03471 5.41261 5.79158 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.01368 4.38529 4.75985 5.13666 5.51484 5.89406 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.11308 4.48603 4.86155 5.23869 5.61717 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.21332 4.58724 4.9632 5.34088 5.71963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.3141 4.68861 5.06515 5.44315 5.82218 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.04243 4.41518 4.79028 5.16721 5.54554 5.92479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.14296 4.5164 4.89209 5.26941 5.64802 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 268.302 269.811 271.107 272.204 273.174 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 268.726 270.169 271.405 272.482 273.407 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 267.485 269.127 270.514 271.705 272.739 273.636 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 267.954 269.523 270.849 271.997 272.983 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 268.4 269.891 271.167 272.262 273.221 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 268.816 270.248 271.472 272.522 273.447 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 267.608 269.226 270.588 271.763 272.782 273.67 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 268.066 269.612 270.923 272.049 273.028 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 268.502 269.986 271.239 272.328 273.268 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 267.253 268.926 270.337 271.543 272.586 273.498 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 267.733 269.326 270.675 271.835 272.842 273.723 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 268.189 269.711 271.006 272.12 273.088 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 268.629 270.082 271.321 272.391 273.326 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 267.397 269.043 270.434 271.625 272.658 273.559 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 267.873 269.452 270.778 271.916 272.909 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 268.324 269.828 271.096 272.196 273.155 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 268.75 270.184 271.409 272.466 273.39 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 267.545 269.162 270.531 271.706 272.725 273.617 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 268.005 269.551 270.864 271.993 272.975 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 268.444 269.923 271.182 272.269 273.215 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 268.865 270.279 271.487 272.532 273.446 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 267.665 269.263 270.617 271.779 272.787 273.67 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 268.118 269.645 270.943 272.06 273.031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03825 6.42328 6.8084 7.19481 7.57608 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14227 6.53146 6.91268 7.29719 7.67876 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.86365 6.24823 6.6361 7.01574 7.39656 7.78112 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96874 6.34971 6.73894 7.12044 7.50071 7.88367 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.06839 6.45318 6.83887 7.22045 7.60292 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17055 6.55579 6.9386 7.32225 7.70615 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.88926 6.27539 6.65765 7.04152 7.42566 7.80947 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99228 6.37657 6.76081 7.14502 7.52905 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.096 6.48027 6.86441 7.24852 7.63244 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19952 6.58386 6.968 7.3521 7.73595 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.91876 6.30317 6.68755 7.07179 7.45565 7.83932 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02254 6.40691 6.79123 7.17531 7.55923 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12631 6.51064 6.89497 7.2791 7.66285 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.84584 6.23015 6.61439 6.99873 7.38273 7.76641 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9498 6.33411 6.71839 7.10252 7.48638 7.87003 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05373 6.43798 6.82215 7.20626 7.5901 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15759 6.54193 6.92607 7.3101 7.69379 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87728 6.26154 6.64581 7.02992 7.41384 7.79752 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9812 6.36543 6.74971 7.13381 7.51767 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0852 6.46954 6.85369 7.23767 7.62143 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18918 6.5734 6.95756 7.34156 7.72525 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.9089 6.29316 6.6774 7.06154 7.44543 7.829 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.01291 6.39721 6.78141 7.16545 7.5493 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.81 294.354 293.954 293.599 293.291 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.667 294.223 293.843 293.502 293.202 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.016 294.531 294.102 293.736 293.409 293.115 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.865 294.404 293.988 293.632 293.317 293.033 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.73 294.28 293.882 293.536 293.229 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.597 294.161 293.781 293.442 293.142 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.948 294.466 294.047 293.677 293.35 293.058 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.805 294.342 293.936 293.579 293.262 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.669 294.222 293.83 293.482 293.174 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.537 294.104 293.725 293.39 293.092 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.886 294.409 293.993 293.626 293.3 293.01 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.748 294.288 293.884 293.528 293.213 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.613 294.169 293.779 293.435 293.13 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.974 294.484 294.056 293.678 293.345 293.048 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.832 294.36 293.946 293.581 293.257 292.969 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.697 294.24 293.839 293.486 293.173 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.563 294.124 293.737 293.396 293.091 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.924 294.438 294.012 293.637 293.305 293.011 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.784 294.314 293.903 293.541 293.221 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.649 294.198 293.8 293.448 293.136 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.519 294.081 293.697 293.358 293.056 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 294.873 294.392 293.971 293.6 293.27 292.976 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 294.735 294.27 293.862 293.502 293.183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95786 8.33657 8.71615 9.09487 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05988 8.43767 8.81777 9.19692 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.77938 8.15903 8.53922 8.91895 9.29903 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8811 8.26127 8.64123 9.0214 9.40173 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.98372 8.3636 8.74357 9.13109 9.50864 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08626 8.46567 8.8462 9.22937 9.61038 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.80765 8.18778 8.56794 8.94889 9.32855 9.70903 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91001 8.29109 8.67236 9.05359 9.43165 9.81044 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.0138 8.394 8.77381 9.15549 9.53392 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11484 8.49696 8.8761 9.25446 9.63647 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83703 8.21725 8.59729 8.97737 9.35681 9.73561 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93951 8.31973 8.69967 9.07929 9.4587 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04205 8.42222 8.80207 9.18165 9.56088 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.76448 8.14462 8.5247 8.90454 9.28406 9.66326 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86709 8.24718 8.62724 9.00693 9.38637 9.76543 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96963 8.34973 8.72971 9.10935 9.48873 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07227 8.4523 8.8322 9.21179 9.59102 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.79485 8.17493 8.55484 8.9347 9.31422 9.69339 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.8975 8.27757 8.65752 9.03724 9.41661 9.79569 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00022 8.38025 8.76014 9.13982 9.51911 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10295 8.48294 8.86278 9.24234 9.62161 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82559 8.20568 8.58568 8.96543 9.3449 9.72398 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92841 8.30845 8.68838 9.06805 9.44742 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.219 277.71 278.16 278.577 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.347 277.825 278.267 278.674 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.958 277.469 277.938 278.37 278.771 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.091 277.591 278.051 278.475 278.867 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.225 277.713 278.161 278.583 278.964 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.354 277.829 278.269 278.679 279.056 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.971 277.48 277.947 278.377 278.773 279.142 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.108 277.605 278.062 278.482 278.869 279.231 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.243 277.727 278.172 278.585 278.964 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.371 277.847 278.281 278.681 279.057 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.996 277.5 277.961 278.386 278.78 279.145 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.132 277.623 278.075 278.491 278.877 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.265 277.746 278.187 278.594 278.971 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.885 277.396 277.864 278.295 278.694 279.064 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.023 277.522 277.981 278.403 278.793 279.155 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.161 277.649 278.095 278.507 278.888 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.292 277.768 278.206 278.61 278.985 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.914 277.422 277.887 278.315 278.71 279.076 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.053 277.548 278.001 278.42 278.807 279.168 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.186 277.67 278.114 278.524 278.903 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.317 277.789 278.224 278.624 278.996 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 276.941 277.445 277.906 278.33 278.723 279.088 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.077 277.568 278.019 278.434 278.82 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.82872 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93351 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0353 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.75336 10.1352 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.85622 10.2376 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95916 10.3403 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0621 10.445 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.78367 10.1651 10.5461 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88679 10.268 10.6485 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.98981 10.3708 10.7512 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0929 10.4737 10.8538 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81458 10.1959 10.5765 10.9564 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.91774 10.2989 10.6793 11.059 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0209 10.4019 10.782 11.1615 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.74262 10.1241 10.5048 10.8848 11.2641 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.8459 10.2272 10.6077 10.9876 11.3666 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.051 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.009 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.972 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.053 291.934 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.013 291.899 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.976 291.863 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.937 291.827 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.02 291.902 291.795 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.982 291.866 291.762 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.944 291.832 291.731 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.909 291.8 291.701 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.992 291.874 291.767 291.671 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.953 291.839 291.736 291.642 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.919 291.807 291.705 291.612 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 292.004 291.882 291.773 291.675 291.586 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.966 291.849 291.743 291.646 291.558 - - - - - - 5000 - 5000 - - 0.940685 1.18821 1.49861 1.84032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 0.998439 1.26772 1.5887 1.9358 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.06363 1.35003 1.68006 2.03187 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.13409 1.43537 1.77237 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.20987 1.52346 1.86675 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.28999 1.6137 1.96229 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.37357 1.70574 2.0589 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.46015 1.79937 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.54918 1.89469 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.64058 1.99158 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.73305 2.08772 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.82717 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.92159 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.01762 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 224.94 241.508 251.835 258.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 230.202 244.788 253.904 259.875 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 234.853 247.65 255.75 261.127 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 238.896 250.179 257.387 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 242.471 252.43 258.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 245.63 254.441 260.232 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 248.418 256.239 261.458 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 250.879 257.853 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 253.071 259.317 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 255.025 260.639 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 256.765 261.828 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 258.333 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 259.729 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 261.005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.12524 2.50615 2.88825 3.27318 3.65954 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.22754 2.60841 2.99236 3.378 3.76576 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 1.95111 2.32889 2.71093 3.09521 3.48113 3.86779 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.05179 2.43145 2.81419 3.19888 3.58527 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.15369 2.53435 2.91781 3.3032 3.6903 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.25604 2.63756 3.02196 3.40734 3.79306 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 1.97978 2.35907 2.7414 3.12571 3.51034 3.89717 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.08186 2.46212 2.84519 3.23018 3.61484 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.18474 2.56431 2.94786 3.33378 3.71811 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.28671 2.66784 3.05159 3.43558 3.82156 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.01093 2.39021 2.77105 3.15441 3.53951 3.92565 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.11276 2.49212 2.8742 3.25854 3.6438 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.21536 2.59517 2.97855 3.36473 3.74804 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.93855 2.31688 2.69966 3.08382 3.47042 3.85242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.04007 2.42046 2.80261 3.18599 3.57205 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.14397 2.52457 2.9059 3.29015 3.67581 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.24598 2.62733 3.01092 3.3959 3.78024 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.34926 2.73041 3.11377 3.4997 3.88537 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.45062 2.83302 3.21737 3.60321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.55401 2.9372 3.32234 3.70688 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.65899 3.04264 3.42559 3.81121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.76164 3.14534 3.52981 3.9157 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.86462 3.24908 3.63409 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 300.059 297.797 296.151 294.899 293.915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 299.36 297.298 295.768 294.596 293.671 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 301.382 298.731 296.835 295.416 294.319 293.451 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 300.568 298.154 296.407 295.089 294.058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 299.829 297.627 296.008 294.776 293.81 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 299.153 297.135 295.639 294.489 293.584 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 301.124 298.54 296.686 295.296 294.222 293.364 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 300.331 297.978 296.267 294.972 293.967 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 299.609 297.469 295.888 294.677 293.731 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 298.964 296.996 295.529 294.403 293.509 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 300.884 298.369 296.562 295.199 294.141 293.298 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 300.118 297.831 296.16 294.889 293.896 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 299.424 297.334 295.784 294.591 293.662 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 301.503 298.801 296.865 295.426 294.313 293.444 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 300.679 298.217 296.445 295.11 294.065 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 299.927 297.687 296.052 294.803 293.823 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 299.25 297.2 295.681 294.515 293.599 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 298.633 296.754 295.343 294.246 293.379 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 298.077 296.337 295.022 293.996 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 297.555 295.948 294.72 293.758 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 297.067 295.578 294.439 293.532 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 296.628 295.244 294.173 293.318 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 296.218 294.928 293.922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.07903 4.46004 4.84494 5.2245 5.60986 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.18092 4.56235 4.94564 5.33235 5.71332 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 3.90031 4.28253 4.66529 5.04957 5.43514 5.81812 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.00345 4.38635 4.76894 5.15528 5.53786 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.10659 4.48827 4.8724 5.25497 5.63972 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.20761 4.59069 4.97439 5.35629 5.74079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 3.92919 4.31129 4.69239 5.07644 5.4608 5.84382 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.03082 4.41348 4.79696 5.18003 5.56309 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.13283 4.51712 4.89928 5.2844 5.66635 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 3.85436 4.23605 4.61845 5.00178 5.38572 5.76968 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 3.95684 4.33865 4.72145 5.10493 5.48889 5.87312 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.05965 4.44175 4.8248 5.20845 5.59249 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.16264 4.545 4.92823 5.31203 5.69618 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 3.88416 4.26566 4.64838 5.03181 5.41575 5.79986 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 3.98758 4.37116 4.75301 5.13538 5.51939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.0906 4.47416 4.85535 5.23909 5.62321 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.19327 4.57572 4.95897 5.34283 5.72696 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 3.91609 4.29687 4.67918 5.06261 5.44653 5.83075 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.01813 4.39984 4.78278 5.16631 5.55031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.12086 4.50318 4.88627 5.27008 5.65414 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.22407 4.6066 4.98997 5.37385 5.75801 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 3.94561 4.3274 4.71018 5.09369 5.47772 5.86192 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.0487 4.43084 4.81388 5.19751 5.58157 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.688 274.773 275.701 276.483 277.176 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.991 275.028 275.914 276.681 277.338 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 273.094 274.28 275.273 276.122 276.859 277.498 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 273.43 274.558 275.51 276.331 277.034 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 273.751 274.824 275.737 276.516 277.198 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 274.049 275.076 275.95 276.7 277.359 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 273.176 274.342 275.319 276.158 276.884 277.516 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 273.506 274.618 275.557 276.36 277.056 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 273.822 274.886 275.781 276.557 277.226 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 272.919 274.125 275.136 275.997 276.742 277.39 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 273.265 274.414 275.381 276.207 276.921 277.548 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 273.596 274.688 275.612 276.406 277.097 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 273.908 274.953 275.839 276.602 277.266 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 273.026 274.212 275.206 276.054 276.787 277.428 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 273.368 274.501 275.451 276.263 276.97 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 273.694 274.774 275.68 276.462 277.142 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 274.001 275.027 275.9 276.653 277.31 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 273.133 274.295 275.275 276.113 276.837 277.47 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 273.464 274.574 275.513 276.316 277.013 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 273.781 274.841 275.739 276.512 277.184 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 274.082 275.094 275.956 276.699 277.348 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 273.219 274.369 275.337 276.163 276.878 277.505 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 273.545 274.64 275.566 276.361 277.051 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.98174 6.36944 6.75695 7.14549 7.52863 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08661 6.47839 6.86185 7.24841 7.63182 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.80591 6.19332 6.58371 6.96554 7.34836 7.73471 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.91186 6.29551 6.6872 7.07082 7.453 7.83773 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01226 6.39968 6.78774 7.17139 7.55573 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11519 6.50297 6.88802 7.27373 7.65946 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.8318 6.22073 6.60548 6.99156 7.37768 7.76328 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93565 6.32264 6.70927 7.09561 7.48154 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0401 6.42698 6.81344 7.19967 7.58547 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14436 6.53125 6.91767 7.30376 7.68942 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.86157 6.24874 6.63556 7.02198 7.4078 7.79328 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96609 6.35314 6.73984 7.12608 7.51192 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.0706 6.45755 6.84418 7.23038 7.61598 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.78801 6.17518 6.56193 6.94851 7.33452 7.72002 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.89276 6.2798 6.66652 7.05285 7.43867 7.82409 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9974 6.38435 6.7709 7.15713 7.54286 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10206 6.48894 6.87536 7.26143 7.647 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.81958 6.20665 6.59343 6.9798 7.36574 7.7512 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.92428 6.31127 6.69798 7.08422 7.47 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02902 6.41597 6.80247 7.18859 7.57427 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.13369 6.5205 6.90696 7.29299 7.6785 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.85133 6.23839 6.62511 7.01144 7.39732 7.78272 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.95609 6.3431 6.72971 7.11592 7.50171 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.992 290.761 290.563 290.389 290.238 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.917 290.691 290.502 290.334 290.188 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.088 290.842 290.626 290.445 290.286 290.143 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.008 290.774 290.566 290.389 290.236 290.099 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.935 290.707 290.509 290.338 290.189 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.866 290.644 290.454 290.288 290.143 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.04 290.794 290.584 290.401 290.241 290.1 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.966 290.731 290.527 290.348 290.193 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.893 290.666 290.469 290.299 290.149 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.823 290.606 290.417 290.251 290.106 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.001 290.758 290.547 290.363 290.204 290.064 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.928 290.693 290.49 290.314 290.16 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.858 290.633 290.437 290.266 290.117 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.043 290.792 290.575 290.385 290.22 290.076 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.97 290.727 290.517 290.335 290.176 290.037 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.896 290.665 290.464 290.288 290.134 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.83 290.605 290.41 290.239 290.091 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.013 290.763 290.546 290.36 290.196 290.052 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.941 290.701 290.494 290.311 290.151 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.871 290.638 290.438 290.263 290.111 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 290.801 290.579 290.387 290.218 290.069 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 290.984 290.736 290.522 290.335 290.171 290.029 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 290.91 290.672 290.465 290.285 290.128 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91376 8.29518 8.67721 9.05819 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01653 8.39695 8.77947 9.16081 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.73395 8.11641 8.49915 8.88124 9.26348 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83641 8.21935 8.60183 8.98431 9.36675 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93985 8.32241 8.70481 9.09461 9.47422 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04311 8.42512 8.80807 9.19348 9.57651 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.76243 8.14538 8.52811 8.9114 9.29318 9.67563 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86562 8.24943 8.63318 9.01669 9.39685 9.77759 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97018 8.35305 8.73529 9.11922 9.49968 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07198 8.45671 8.83821 9.21873 9.60276 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.79216 8.17515 8.55771 8.94009 9.32166 9.70241 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89542 8.27833 8.66075 9.04263 9.42412 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.99873 8.38156 8.76382 9.14559 9.52683 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.71914 8.10208 8.4847 8.86688 9.24856 9.62977 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82252 8.20534 8.58794 8.96994 9.35148 9.73246 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92589 8.30868 8.69108 9.07293 9.45436 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02927 8.41189 8.7942 9.17599 9.55725 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.74979 8.13269 8.51517 8.89735 9.27899 9.6601 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.85328 8.23606 8.61848 9.00047 9.38194 9.76297 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95675 8.33944 8.72176 9.10367 9.485 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06025 8.44283 8.82503 9.20675 9.58802 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.78085 8.16371 8.54624 8.9283 9.30989 9.69093 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88443 8.26717 8.64958 9.03152 9.41297 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.101 280.463 280.797 281.107 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.192 280.546 280.873 281.176 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.901 280.279 280.628 280.948 281.245 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280 280.368 280.707 281.022 281.313 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.094 280.455 280.787 281.101 281.384 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.189 280.541 280.866 281.168 281.449 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.905 280.279 280.623 280.943 281.238 281.513 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.002 280.37 280.709 281.02 281.307 281.575 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.102 280.459 280.787 281.093 281.376 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.194 280.545 280.867 281.164 281.443 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.915 280.287 280.629 280.944 281.236 281.507 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.016 280.379 280.712 281.02 281.306 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.113 280.467 280.793 281.095 281.375 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.83 280.208 280.554 280.874 281.169 281.443 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.933 280.301 280.638 280.95 281.24 281.51 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.032 280.39 280.722 281.028 281.311 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.13 280.482 280.804 281.102 281.379 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.851 280.224 280.566 280.883 281.176 281.449 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.951 280.316 280.652 280.961 281.247 281.514 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.05 280.406 280.733 281.036 281.317 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 280.144 280.492 280.813 281.11 281.386 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.867 280.237 280.578 280.892 281.182 281.452 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 279.966 280.328 280.661 280.967 281.252 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.78893 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89398 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99594 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.71343 10.0961 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81654 10.1987 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.91966 10.3015 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0229 10.4065 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.74381 10.126 10.5078 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84713 10.2291 10.6103 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95037 10.3322 10.7132 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0536 10.4352 10.8159 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.7747 10.1568 10.5382 10.9187 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87812 10.26 10.6412 11.0215 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.98148 10.3632 10.744 11.1242 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.70254 10.0848 10.4663 10.847 11.2269 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80605 10.1881 10.5694 10.9499 11.3296 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.693 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.678 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.661 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.679 289.649 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.665 289.634 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.649 289.621 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.636 289.608 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.654 289.623 289.596 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.64 289.61 289.585 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.627 289.599 289.574 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.615 289.587 289.563 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.633 289.602 289.576 289.554 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.622 289.591 289.565 289.543 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.608 289.578 289.554 289.534 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.629 289.596 289.569 289.545 289.525 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 289.617 289.584 289.556 289.534 289.516 - - - - - - 5000 - 5000 - - 1.69945 1.84729 2.06004 2.31983 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.73158 1.89903 2.12612 2.39608 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.76958 1.95471 2.19499 2.474 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.81265 2.01426 2.26614 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.86061 2.07757 2.3404 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.91338 2.14431 2.41696 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.9703 2.21404 2.49564 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.03126 2.28671 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.0958 2.36201 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.16371 2.44 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.23437 2.51883 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.30777 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.38309 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.46089 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 210.69 222.486 232.201 239.928 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 214.068 225.322 234.469 241.714 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 217.311 227.974 236.588 243.385 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 220.366 230.478 238.562 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 223.292 232.845 240.432 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 226.074 235.071 242.188 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 228.705 237.163 243.838 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 231.184 239.124 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 233.521 240.977 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 235.725 242.719 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 237.775 244.324 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 239.705 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 241.49 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 243.179 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.48039 2.81518 3.16149 3.51779 3.88096 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.56891 2.90684 3.25714 3.61576 3.9814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.33175 2.65765 2.99946 3.35207 3.7125 4.0782 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.41702 2.74828 3.09339 3.44822 3.81051 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.50453 2.83997 3.18823 3.54547 3.90968 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.59349 2.93284 3.28411 3.64297 4.00701 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.35578 2.68402 3.02691 3.38007 3.73974 4.10599 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.44262 2.77534 3.12155 3.47728 3.83828 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.53132 2.86688 3.21578 3.57401 3.93593 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.62031 2.9602 3.31144 3.66945 4.03411 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.38218 2.71153 3.05396 3.40686 3.76726 4.13311 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.46934 2.80232 3.14828 3.50381 3.8657 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.55823 2.89483 3.24418 3.6031 3.96446 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.32148 2.64716 2.98931 3.34155 3.70236 4.06361 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.40753 2.73886 3.08309 3.43649 3.79814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.49671 2.83165 3.17765 3.5336 3.89628 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.58536 2.92421 3.27444 3.63268 3.99527 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.67628 3.01768 3.36968 3.73024 4.09519 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.76616 3.11134 3.4661 3.828 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.85874 3.20699 3.56416 3.92603 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.95334 3.30415 3.66098 4.02508 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.04656 3.39946 3.75907 4.12449 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.14069 3.49605 3.8575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 318.846 314.463 311.05 308.319 306.102 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 317.538 313.455 310.24 307.66 305.551 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 321.261 316.336 312.508 309.484 307.047 305.051 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 319.802 315.202 311.617 308.767 306.461 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 318.435 314.139 310.775 308.087 305.9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 317.159 313.145 309.983 307.448 305.38 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 320.81 315.967 312.211 309.238 306.849 304.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 319.367 314.852 311.333 308.534 306.274 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 318.019 313.827 310.522 307.874 305.734 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 316.782 312.852 309.748 307.262 305.224 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 320.351 315.611 311.944 309.03 306.671 304.733 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 318.95 314.54 311.093 308.341 306.108 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 317.641 313.528 310.283 307.676 305.575 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 321.428 316.437 312.565 309.515 307.053 305.069 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 319.952 315.294 311.681 308.817 306.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 318.554 314.219 310.844 308.138 305.939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 317.279 313.231 310.047 307.492 305.415 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 316.086 312.306 309.311 306.889 304.911 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 314.988 311.438 308.613 306.325 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 313.945 310.612 307.943 305.782 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 312.949 309.819 307.321 305.266 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 312.04 309.099 306.725 304.773 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 311.185 308.408 306.159 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.3107 4.67151 5.03905 5.40381 5.77604 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.40694 4.76897 5.13557 5.50773 5.87621 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.14274 4.50301 4.86712 5.23537 5.607 5.97791 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.23952 4.6014 4.9662 5.33704 5.70628 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.33659 4.69827 5.0652 5.43303 5.80484 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.43192 4.79576 5.16298 5.53075 5.90279 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.16952 4.52998 4.89283 5.26104 5.63161 6.00267 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.26499 4.62692 4.99273 5.36063 5.73047 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.36104 4.72539 5.09069 5.46113 5.83044 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.09911 4.45851 4.822 5.18909 5.55891 5.93053 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.19519 4.55567 4.92028 5.28813 5.65851 6.03087 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.2917 4.65343 5.0191 5.38776 5.75873 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.38882 4.75168 5.1182 5.48751 5.85902 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.12672 4.4862 4.85019 5.21759 5.58761 5.95955 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.22368 4.58617 4.95017 5.31718 5.68778 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.32064 4.68404 5.04813 5.41702 5.78818 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.41753 4.78073 5.14747 5.51705 5.8887 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.15637 4.51554 4.87945 5.24703 5.61717 5.98934 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.25228 4.61327 4.97851 5.34677 5.7175 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.34908 4.71153 5.07764 5.44679 5.81804 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.44666 4.81018 5.17719 5.54693 5.91871 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.1842 4.54459 4.90912 5.27692 5.6473 6.01959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.28115 4.64277 5.00835 5.3769 5.74783 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 262.905 264.794 266.427 267.82 269.059 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 263.433 265.245 266.81 268.179 269.36 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 261.893 263.94 265.684 267.191 268.506 269.652 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 262.476 264.436 266.107 267.565 268.823 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 263.033 264.902 266.515 267.904 269.126 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 263.555 265.353 266.9 268.237 269.417 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 262.051 264.069 265.782 267.272 268.57 269.706 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 262.618 264.553 266.208 267.638 268.885 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 263.165 265.025 266.609 267.992 269.191 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 261.611 263.693 265.464 266.992 268.323 269.489 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 262.204 264.195 265.898 267.368 268.649 269.776 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 262.777 264.681 266.313 267.727 268.964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 263.318 265.144 266.714 268.078 269.273 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 261.787 263.84 265.592 267.1 268.413 269.566 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 262.378 264.35 266.022 267.469 268.737 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 262.938 264.825 266.429 267.827 269.05 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 263.472 265.273 266.823 268.17 269.352 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 261.969 263.987 265.712 267.203 268.502 269.643 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 262.538 264.474 266.133 267.568 268.821 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 263.087 264.944 266.537 267.918 269.129 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 263.612 265.391 266.923 268.256 269.426 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 262.116 264.114 265.821 267.296 268.582 269.711 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 262.683 264.596 266.234 267.653 268.894 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1265 6.50716 6.88831 7.27117 7.64926 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22924 6.61409 6.99141 7.37258 7.75109 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.95396 6.33386 6.7175 7.09357 7.4711 7.8526 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05768 6.43418 6.81933 7.19726 7.57428 7.95433 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15605 6.53646 6.91826 7.29636 7.67568 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25699 6.63802 7.01698 7.39726 7.77808 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97911 6.36055 6.73878 7.11898 7.49978 7.88061 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08087 6.46066 6.84086 7.2215 7.60228 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18324 6.56318 6.94344 7.32412 7.7049 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.28558 6.66572 7.0461 7.42675 7.80755 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00824 6.38803 6.76829 7.14887 7.52948 7.91019 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11066 6.4906 6.87098 7.25153 7.63223 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21322 6.59325 6.97372 7.35436 7.73501 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93625 6.31586 6.6959 7.07651 7.45717 7.83781 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03888 6.41863 6.79886 7.17936 7.55996 7.94065 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14154 6.52141 6.90165 7.28221 7.66285 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.24424 6.62423 7.00456 7.38515 7.76577 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.96733 6.34693 6.7271 7.10752 7.48811 7.86872 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07002 6.44975 6.82998 7.21043 7.59104 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17275 6.55265 6.93291 7.31344 7.69406 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.27554 6.65556 7.03591 7.41646 7.79703 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.99877 6.37836 6.75846 7.13891 7.51949 7.90011 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.10144 6.48127 6.8615 7.24198 7.62258 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.757 298.079 297.48 296.944 296.474 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.552 297.888 297.314 296.799 296.344 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.07 298.349 297.711 297.16 296.665 296.217 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.854 298.166 297.544 297.006 296.526 296.094 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.656 297.984 297.388 296.866 296.398 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.46 297.81 297.237 296.727 296.27 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.984 298.266 297.643 297.087 296.59 296.147 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.777 298.087 297.478 296.939 296.457 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.574 297.908 297.32 296.797 296.33 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.381 297.737 297.167 296.658 296.205 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.902 298.193 297.569 297.017 296.526 296.085 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.695 298.012 297.41 296.874 296.396 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.499 297.838 297.253 296.733 296.27 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.034 298.308 297.669 297.103 296.6 296.149 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.825 298.123 297.505 296.957 296.468 296.03 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.624 297.947 297.348 296.816 296.341 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.43 297.774 297.194 296.679 296.219 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.96 298.241 297.608 297.047 296.547 296.098 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.756 298.061 297.447 296.902 296.416 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.556 297.883 297.29 296.764 296.292 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 298.365 297.716 297.141 296.628 296.169 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 298.893 298.179 297.55 296.993 296.496 296.053 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 298.687 297.998 297.391 296.851 296.368 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02584 8.40073 8.77687 9.15244 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12672 8.50089 8.87765 9.25368 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.84923 8.22493 8.60151 8.97793 9.35496 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9498 8.32613 8.70258 9.07956 9.45693 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05139 8.42753 8.80405 9.1883 9.56297 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15282 8.52857 8.90575 9.28586 9.66395 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87708 8.25333 8.62993 9.00763 9.38427 9.76191 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97836 8.3556 8.73339 9.11139 9.48652 9.86263 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08101 8.45751 8.83394 9.2125 9.58805 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.18102 8.55947 8.93534 9.31067 9.68982 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90606 8.28244 8.65893 9.03574 9.41217 9.78823 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00747 8.38387 8.76036 9.1368 9.51332 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10888 8.48539 8.8619 9.23838 9.61472 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.83424 8.21045 8.58691 8.96342 9.33991 9.71635 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93568 8.31189 8.68847 9.06498 9.44148 9.81779 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03716 8.41353 8.79007 9.16654 9.54298 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13873 8.51507 8.89162 9.26815 9.64458 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.86415 8.24034 8.61671 8.9933 9.36979 9.74616 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96573 8.34198 8.71844 9.09495 9.47138 9.84776 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06736 8.44367 8.82015 9.19672 9.57313 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.16904 8.5454 8.92192 9.29842 9.67486 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89455 8.27078 8.64721 9.02371 9.40018 9.77651 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9963 8.37254 8.749 9.12549 9.50195 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.218 274.837 275.408 275.932 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.383 274.985 275.544 276.059 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.891 274.538 275.132 275.678 276.184 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.065 274.697 275.277 275.81 276.306 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.234 274.85 275.417 275.952 276.433 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.4 275.003 275.558 276.074 276.549 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.919 274.561 275.15 275.693 276.194 276.661 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.093 274.721 275.298 275.831 276.319 276.774 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.265 274.878 275.44 275.961 276.44 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.43 275.031 275.579 276.084 276.559 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.956 274.591 275.175 275.714 276.211 276.672 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.128 274.751 275.322 275.848 276.334 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.299 274.905 275.462 275.977 276.454 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.817 274.463 275.056 275.603 276.107 276.574 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.995 274.627 275.206 275.739 276.231 276.689 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.168 274.783 275.35 275.872 276.356 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.336 274.938 275.492 276.002 276.475 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.858 274.5 275.088 275.629 276.129 276.593 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.033 274.659 275.234 275.764 276.254 276.708 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.204 274.815 275.377 275.895 276.375 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.37 274.967 275.517 276.024 276.494 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.895 274.531 275.115 275.653 276.15 276.611 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 274.066 274.688 275.26 275.786 276.272 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.88865 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99296 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0943 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81357 10.1939 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.916 10.2959 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0185 10.3982 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1211 10.5026 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84373 10.2236 10.6033 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94645 10.3262 10.7053 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0491 10.4287 10.8076 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1517 10.5312 10.9099 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87454 10.2544 10.6336 11.0122 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97737 10.357 10.7361 11.1145 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0801 10.4596 10.8385 11.2168 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80293 10.1829 10.5622 10.9409 11.319 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90584 10.2856 10.6648 11.0433 11.4212 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.526 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.46 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.397 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.546 294.338 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.481 294.277 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.418 294.22 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.356 294.16 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.503 294.296 294.107 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.44 294.238 294.052 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.379 294.18 293.999 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.318 294.125 293.948 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.467 294.26 294.072 293.898 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.405 294.203 294.018 293.849 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.343 294.147 293.967 293.801 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.496 294.285 294.093 293.915 293.753 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.433 294.226 294.038 293.866 293.708 - - - - - - 5000 - 5000 - - 1.83312 1.97094 2.1715 2.4192 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.8629 2.01936 2.23417 2.49231 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.89817 2.07178 2.29977 2.56735 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.93841 2.12805 2.36772 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.98328 2.18797 2.43877 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.03271 2.25141 2.51234 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.08647 2.31785 2.58809 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.14392 2.38723 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.20521 2.45952 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.26968 2.53428 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.33718 2.61033 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.40741 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.47959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.55448 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 209.465 220.579 229.951 237.579 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 212.624 223.293 232.174 239.367 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 215.673 225.846 234.263 241.045 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 218.563 228.272 236.219 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 221.348 230.581 238.084 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 224.015 232.764 239.841 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 226.549 234.829 241.501 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 228.959 236.778 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 231.24 238.624 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 233.407 240.375 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 235.433 241.99 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 237.352 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 239.137 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 240.833 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.56441 2.88968 3.22824 3.57822 3.936 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.65015 2.97919 3.322 3.67451 4.03502 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.4207 2.73626 3.06965 3.41521 3.76976 4.13063 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.50307 2.82444 3.16148 3.50969 3.86635 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.58763 2.91383 3.25436 3.60532 3.9642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.6739 3.0045 3.34841 3.70118 4.06025 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.44384 2.76181 3.09633 3.44266 3.79655 4.15799 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.52764 2.8508 3.18905 3.53818 3.89372 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.6136 2.94001 3.28135 3.63329 3.99004 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.6999 3.03111 3.37525 3.72734 4.08698 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.46925 2.78863 3.12286 3.46893 3.82367 4.18473 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.55354 2.87704 3.21519 3.56425 3.92075 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.63966 2.96725 3.30923 3.66198 4.0182 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.41071 2.72607 3.05962 3.40482 3.75972 4.11608 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.49386 2.81528 3.15138 3.49805 3.85415 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.58004 2.90564 3.24405 3.59367 3.95097 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.66613 2.99609 3.33897 3.6911 4.04861 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.75438 3.08737 3.43244 3.78726 4.14739 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.84197 3.17915 3.52733 3.88364 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.93223 3.27282 3.62372 3.98039 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.02458 3.36821 3.71912 4.07821 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.11581 3.46182 3.81574 4.17634 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.20795 3.5568 3.91282 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 321.5 316.935 313.336 310.432 308.055 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 320.146 315.879 312.476 309.725 307.461 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 323.987 318.894 314.882 311.674 309.069 306.925 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 322.489 317.71 313.938 310.912 308.44 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 321.074 316.598 313.047 310.185 307.839 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 319.751 315.554 312.205 309.498 307.28 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 323.524 318.508 314.565 311.414 308.858 306.742 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 322.036 317.346 313.64 310.662 308.242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 320.645 316.269 312.778 309.956 307.661 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 319.357 315.242 311.957 309.303 307.111 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 323.049 318.138 314.285 311.19 308.667 306.581 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 321.605 317.016 313.383 310.454 308.063 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 320.249 315.951 312.524 309.745 307.489 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 324.151 318.998 314.939 311.707 309.077 306.942 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 322.638 317.804 314.004 310.96 308.47 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 321.191 316.676 313.118 310.24 307.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 319.873 315.64 312.271 309.545 307.314 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 318.626 314.66 311.487 308.9 306.774 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 317.482 313.746 310.745 308.293 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 316.387 312.868 310.027 307.711 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 315.339 312.029 309.363 307.156 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 314.383 311.26 308.723 306.623 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 313.477 310.524 308.115 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.36399 4.72048 5.08421 5.44582 5.81516 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.45896 4.8169 5.17993 5.54888 5.91462 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.19828 4.55393 4.91401 5.27876 5.64733 6.01559 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.29368 4.65112 5.01207 5.37957 5.74592 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.38947 4.74692 5.11016 5.47475 5.8437 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.48364 4.84335 5.20701 5.57167 5.94096 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.22461 4.58048 4.93938 5.30417 5.67176 6.04015 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.31872 4.67632 5.03833 5.40294 5.76987 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.41362 4.7737 5.13535 5.50253 5.86908 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.15512 4.50979 4.86923 5.23282 5.59962 5.96849 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.24982 4.60585 4.96659 5.331 5.69838 6.06808 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.34512 4.70245 5.06433 5.42973 5.79785 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.44093 4.79966 5.16256 5.52873 5.89743 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.1823 4.53718 4.89714 5.261 5.62796 5.99725 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.27791 4.63592 4.99607 5.35976 5.72742 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.3736 4.73271 5.09313 5.45875 5.82705 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.46929 4.82835 5.19153 5.55796 5.92686 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.21153 4.56611 4.92605 5.29018 5.65732 6.02681 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.30611 4.66274 5.02414 5.38909 5.75689 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.40172 4.75992 5.12233 5.48825 5.85671 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.49805 4.8575 5.22101 5.58764 5.95669 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.23899 4.59484 4.95547 5.31986 5.68723 6.05684 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.33467 4.69194 5.05369 5.41897 5.78701 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 261.209 263.207 264.94 266.419 267.738 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 261.768 263.685 265.344 266.802 268.059 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 260.142 262.303 264.151 265.752 267.151 268.372 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 260.759 262.829 264.6 266.149 267.488 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 261.347 263.323 265.033 266.51 267.813 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 261.897 263.801 265.443 266.865 268.123 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 260.31 262.442 264.258 265.839 267.22 268.431 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 260.91 262.953 264.708 266.227 267.556 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 261.484 263.453 265.134 266.606 267.883 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 259.848 262.045 263.921 265.542 266.956 268.2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 260.473 262.574 264.378 265.941 267.306 268.508 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 261.074 263.09 264.822 266.325 267.642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 261.648 263.579 265.246 266.696 267.97 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 260.032 262.198 264.053 265.657 267.055 268.284 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 260.655 262.738 264.512 266.049 267.399 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 261.246 263.241 264.942 266.43 267.733 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 261.809 263.716 265.362 266.796 268.055 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 260.222 262.353 264.182 265.766 267.148 268.366 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 260.824 262.869 264.628 266.154 267.489 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 261.402 263.366 265.057 266.528 267.817 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 261.957 263.841 265.468 266.886 268.133 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 260.378 262.488 264.297 265.864 267.233 268.439 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 260.975 262.998 264.738 266.246 267.567 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.16271 6.54148 6.92094 7.30235 7.67912 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.26484 6.64788 7.02365 7.40343 7.78064 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99094 6.36898 6.75086 7.12536 7.50153 7.88177 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.09408 6.46875 6.8522 7.22863 7.60438 7.98321 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19195 6.57055 6.95076 7.32737 7.70538 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.29241 6.67164 7.04906 7.42792 7.80744 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01591 6.39546 6.77197 7.15062 7.53007 7.90963 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11712 6.49503 6.87363 7.25276 7.63222 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.219 6.59712 6.9758 7.355 7.73444 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.32083 6.69919 7.07798 7.45728 7.83679 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.04485 6.42274 6.80134 7.18042 7.55964 7.9391 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14678 6.52488 6.9036 7.28265 7.66201 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.24879 6.62703 7.00589 7.38513 7.7645 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97326 6.35093 6.72925 7.10832 7.48756 7.86693 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07536 6.45323 6.83177 7.21076 7.59 7.96946 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.1775 6.55553 6.93412 7.31323 7.69256 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.27965 6.65791 7.03665 7.41583 7.79514 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00423 6.38192 6.76035 7.13921 7.51839 7.89777 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10637 6.48419 6.86276 7.24175 7.62103 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.20855 6.58669 6.96534 7.34439 7.72366 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.3109 6.68911 7.06787 7.44701 7.82633 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.03549 6.41319 6.79161 7.17053 7.54975 7.92908 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.13768 6.51568 6.89423 7.27319 7.65245 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.062 299.312 298.646 298.054 297.531 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.835 299.1 298.466 297.896 297.39 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.406 299.614 298.907 298.295 297.746 297.248 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.169 299.41 298.722 298.125 297.595 297.114 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.952 299.209 298.551 297.971 297.451 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.737 299.017 298.384 297.818 297.31 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.314 299.524 298.834 298.217 297.667 297.174 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.087 299.325 298.653 298.054 297.521 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.865 299.129 298.478 297.898 297.378 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.652 298.939 298.307 297.745 297.241 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.225 299.444 298.755 298.144 297.598 297.108 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300 299.246 298.578 297.984 297.453 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.782 299.052 298.405 297.83 297.316 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.372 299.571 298.866 298.24 297.681 297.18 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.142 299.369 298.685 298.078 297.535 297.049 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.921 299.173 298.51 297.921 297.395 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.706 298.982 298.341 297.77 297.259 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.293 299.5 298.8 298.178 297.622 297.125 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.067 299.299 298.62 298.017 297.48 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.846 299.105 298.449 297.865 297.341 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.637 298.918 298.281 297.713 297.205 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 300.217 299.43 298.736 298.119 297.57 297.076 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 299.992 299.232 298.56 297.961 297.426 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05294 8.42642 8.80124 9.17558 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15343 8.52617 8.90167 9.27652 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87702 8.25128 8.62647 9.00164 9.37751 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97724 8.35208 8.72718 9.10289 9.47917 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07837 8.45307 8.82831 9.21135 9.5849 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.17942 8.55379 8.92968 9.30857 9.68556 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90478 8.27951 8.65475 9.03119 9.4067 9.78329 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00562 8.3814 8.75786 9.13465 9.50864 9.88371 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10785 8.48295 8.85806 9.23542 9.60987 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.20748 8.58452 8.95911 9.33328 9.71137 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93358 8.30846 8.68363 9.0592 9.4345 9.8095 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03458 8.40957 8.78472 9.15994 9.53531 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13558 8.51067 8.88588 9.26119 9.63647 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.862 8.23673 8.61184 8.98712 9.36242 9.73777 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96306 8.33782 8.71303 9.08828 9.46365 9.83894 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06409 8.43904 8.81429 9.18956 9.5649 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.16529 8.54025 8.91551 9.29083 9.66617 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.89181 8.26649 8.6415 9.01683 9.39219 9.7675 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.99296 8.36776 8.74289 9.11818 9.49347 9.8688 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09418 8.46908 8.84425 9.21962 9.59492 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.19547 8.57043 8.94567 9.321 9.69638 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92207 8.2968 8.67191 9.04715 9.42248 9.79774 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02343 8.39822 8.77335 9.14861 9.52393 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.241 273.901 274.509 275.069 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.418 274.061 274.655 275.204 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.896 273.583 274.216 274.799 275.338 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.079 273.753 274.372 274.942 275.469 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.262 273.918 274.522 275.091 275.605 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.438 274.079 274.672 275.223 275.73 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.926 273.611 274.239 274.818 275.352 275.849 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.112 273.782 274.397 274.964 275.486 275.971 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.296 273.948 274.548 275.104 275.615 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.471 274.112 274.697 275.236 275.742 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.966 273.645 274.267 274.841 275.371 275.863 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.15 273.813 274.422 274.984 275.503 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.332 273.98 274.574 275.123 275.631 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.82 273.509 274.14 274.722 275.261 275.759 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.008 273.682 274.301 274.87 275.395 275.882 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.194 273.85 274.454 275.01 275.526 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.372 274.014 274.605 275.151 275.655 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.863 273.548 274.175 274.752 275.286 275.78 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.05 273.718 274.331 274.896 275.419 275.904 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.232 273.884 274.484 275.037 275.549 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.409 274.047 274.633 275.174 275.676 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.903 273.582 274.204 274.778 275.308 275.8 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.085 273.749 274.358 274.92 275.439 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.91293 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.017 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1182 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.83795 10.2176 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94018 10.3195 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0426 10.4216 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1449 10.5258 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.86803 10.2473 10.6264 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97058 10.3497 10.7282 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.073 10.452 10.8304 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1755 10.5543 10.9325 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89882 10.278 10.6566 11.0347 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0014 10.3805 10.759 11.1368 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.104 10.483 10.8612 11.2389 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2067 10.5854 10.9635 11.341 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93004 10.3092 10.6878 11.0658 11.4431 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.354 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.279 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.208 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.379 295.14 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.305 295.073 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.234 295.008 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.164 294.94 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.332 295.097 294.88 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.262 295.03 294.817 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.191 294.965 294.758 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.124 294.903 294.7 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.294 295.058 294.841 294.642 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.223 294.992 294.781 294.587 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.154 294.93 294.723 294.532 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.088 294.867 294.664 294.479 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.256 295.021 294.807 294.609 294.427 - - - - - - 5000 - 5000 - - 2.11548 2.23575 2.41427 2.63918 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.14122 2.27855 2.47068 2.70615 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.17183 2.32496 2.53004 2.77531 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.20696 2.37507 2.59189 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.24651 2.42893 2.65689 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.29014 2.48603 2.72436 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.3378 2.54637 2.79444 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.38922 2.60946 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.44396 2.67559 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.50246 2.74445 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.56357 2.81465 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.62781 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.69397 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.76294 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 207.409 217.285 225.933 233.253 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 210.181 219.752 228.037 235.012 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 212.881 222.101 230.037 236.676 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 215.465 224.357 231.927 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 217.978 226.524 233.747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 220.41 228.599 235.48 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 222.749 230.578 237.127 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 224.993 232.469 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 227.147 234.277 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 229.207 236.003 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 231.16 237.615 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 233.022 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 234.776 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 236.455 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.74514 3.05183 3.37466 3.71119 4.0576 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.8255 3.13668 3.46435 3.80409 4.15374 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.61101 2.90652 3.22281 3.55396 3.89625 4.24663 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.68765 2.98978 3.31045 3.64487 3.98982 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.76669 3.07448 3.39938 3.7371 4.08476 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.84761 3.16052 3.48954 3.82967 4.17808 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.63228 2.93046 3.24814 3.58026 3.92209 4.27322 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.71053 3.01462 3.33663 3.67217 4.01616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.79084 3.09918 3.42514 3.76408 4.10986 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.87199 3.18594 3.51533 3.85494 4.20396 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.65596 2.9557 3.27338 3.60539 3.94828 4.29924 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.73462 3.03937 3.36175 3.69736 4.04246 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.81532 3.1251 3.45187 3.79175 4.1371 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.60158 2.89675 3.21304 3.54365 3.88623 4.23235 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.67894 2.98094 3.30068 3.6336 3.97787 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.75963 3.06666 3.38952 3.72584 4.07179 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.84037 3.15249 3.4804 3.81995 4.16687 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.92348 3.23958 3.57045 3.91314 4.26288 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.00643 3.32737 3.66176 4.0065 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.09192 3.41718 3.75506 4.10058 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.18002 3.50876 3.8472 4.1956 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.2669 3.59884 3.94084 4.29129 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.35512 3.69049 4.03503 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 326.245 321.453 317.581 314.393 311.749 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 324.837 320.321 316.639 313.61 311.086 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 328.805 323.525 319.251 315.764 312.883 310.482 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 327.268 322.276 318.232 314.925 312.183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 325.806 321.094 317.265 314.123 311.511 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 324.425 319.973 316.345 313.362 310.885 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 328.328 323.118 318.912 315.48 312.651 310.278 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 326.802 321.89 317.908 314.649 311.961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 325.355 320.738 316.972 313.871 311.315 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 324.011 319.641 316.074 313.144 310.694 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 327.84 322.725 318.605 315.23 312.437 310.101 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 326.35 321.534 317.628 314.421 311.762 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 324.939 320.398 316.691 313.633 311.118 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 328.964 323.629 319.309 315.795 312.89 310.505 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 327.411 322.365 318.298 314.976 312.216 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 325.918 321.171 317.339 314.18 311.555 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 324.543 320.058 316.409 313.409 310.923 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 323.23 319.006 315.555 312.694 310.312 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 322.024 318.016 314.733 312.012 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 320.854 317.062 313.944 311.366 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 319.736 316.146 313.205 310.74 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 318.703 315.301 312.494 310.144 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 317.723 314.492 311.817 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.4881 4.83505 5.19024 5.54455 5.90722 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.58039 4.92903 5.28393 5.64567 6.0052 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.32732 4.67274 5.02388 5.38084 5.74232 6.10447 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.41987 4.76738 5.11965 5.47951 5.83924 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.51273 4.86066 5.21561 5.5729 5.93536 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.60424 4.9547 5.31035 5.66804 6.03102 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.35286 4.69853 5.04857 5.40552 5.76617 6.12863 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.44406 4.79178 5.14518 5.50244 5.8627 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.53608 4.8867 5.24024 5.60001 5.96019 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.28543 4.62965 4.97994 5.3355 5.69533 6.05799 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.377 4.72295 5.07499 5.43178 5.79241 6.15604 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.46955 4.81722 5.17062 5.52851 5.88999 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.56254 4.91189 5.26665 5.62568 5.98806 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.31156 4.65613 5.00715 5.36315 5.72311 6.08616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.40427 4.75236 5.10367 5.45984 5.82079 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.49707 4.8466 5.19868 5.55695 5.91876 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.59007 4.9399 5.29502 5.65432 6.01691 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.33991 4.68427 5.03533 5.39165 5.75187 6.11526 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.43157 4.77838 5.13119 5.48862 5.84976 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.52444 4.87322 5.22733 5.58592 5.94789 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.61815 4.96843 5.3239 5.68346 6.0463 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.36655 4.71227 5.06411 5.4208 5.78135 6.14491 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.45943 4.80697 5.16021 5.51798 5.87938 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 257.78 259.977 261.897 263.546 265.022 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 258.396 260.509 262.35 263.973 265.38 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 256.618 258.985 261.023 262.801 264.366 265.736 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 257.29 259.564 261.524 263.248 264.744 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 257.935 260.111 262.005 263.65 265.108 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 258.541 260.64 262.461 264.048 265.458 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 256.801 259.138 261.144 262.904 264.447 265.805 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 257.457 259.704 261.647 263.337 264.822 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 258.088 260.254 262.116 263.758 265.19 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 256.295 258.7 260.773 262.574 264.153 265.546 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 256.981 259.288 261.28 263.016 264.541 265.891 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 257.635 259.851 261.771 263.447 264.922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 258.266 260.396 262.244 263.86 265.286 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 256.497 258.87 260.917 262.698 264.261 265.641 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 257.175 259.464 261.427 263.139 264.648 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 257.823 260.019 261.905 263.562 265.021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 258.441 260.545 262.371 263.972 265.383 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 256.701 259.039 261.06 262.821 264.367 265.732 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 257.359 259.608 261.556 263.254 264.747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 257.993 260.155 262.03 263.671 265.116 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 258.602 260.682 262.49 264.074 265.47 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 256.872 259.189 261.189 262.931 264.461 265.814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 257.525 259.75 261.677 263.358 264.837 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.24338 6.61815 6.99386 7.37214 7.74586 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.34447 6.72362 7.09555 7.4723 7.84652 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07369 6.44742 6.8252 7.19648 7.56956 7.94694 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17534 6.54605 6.92574 7.299 7.67154 8.04762 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.27219 6.64665 7.02336 7.39658 7.77174 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.37157 6.74687 7.12066 7.49644 7.87306 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.09824 6.47335 6.84615 7.22135 7.59774 7.9745 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19816 6.57196 6.94686 7.32266 7.69907 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.29891 6.67299 7.04802 7.42399 7.80051 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.39951 6.77402 7.14934 7.5255 7.90212 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12674 6.50042 6.87523 7.25085 7.62696 8.00366 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22746 6.60141 6.97644 7.35223 7.72863 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.32827 6.70257 7.0779 7.4539 7.83031 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05598 6.42934 6.80378 7.17935 7.55544 7.932 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15685 6.53053 6.9053 7.28091 7.65711 8.0338 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25778 6.63175 7.00674 7.38256 7.7589 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.35886 6.73316 7.10836 7.48429 7.86073 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08665 6.46 6.83457 7.21001 7.5861 7.96265 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18749 6.56122 6.93612 7.31176 7.68796 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.28863 6.6627 7.03767 7.41344 7.7898 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.38973 6.76404 7.13935 7.51536 7.89179 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.11759 6.49106 6.86569 7.24113 7.6172 7.99372 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.21862 6.59241 6.96727 7.34294 7.71922 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.595 301.711 300.926 300.224 299.604 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.332 301.468 300.717 300.038 299.434 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 303.007 302.073 301.238 300.514 299.863 299.271 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.726 301.833 301.023 300.317 299.684 299.11 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.474 301.598 300.82 300.132 299.513 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.222 301.373 300.624 299.953 299.348 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.902 301.971 301.157 300.427 299.774 299.186 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.634 301.738 300.945 300.236 299.601 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.375 301.508 300.737 300.05 299.433 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.123 301.284 300.538 299.871 299.271 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.8 301.882 301.069 300.344 299.695 299.112 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.535 301.646 300.858 300.156 299.526 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.279 301.42 300.656 299.974 299.361 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.973 302.033 301.2 300.458 299.795 299.2 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.703 301.793 300.987 300.268 299.625 299.045 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.442 301.562 300.781 300.083 299.457 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.192 301.34 300.581 299.903 299.295 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.882 301.948 301.122 300.387 299.729 299.138 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.613 301.712 300.913 300.2 299.56 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.358 301.485 300.708 300.015 299.394 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 302.108 301.262 300.511 299.839 299.235 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 302.792 301.869 301.051 300.32 299.666 299.078 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 302.529 301.634 300.84 300.133 299.499 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11722 8.48745 8.85921 9.23075 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.21673 8.58629 8.95889 9.33088 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9429 8.31372 8.68573 9.05803 9.43123 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04218 8.4137 8.78573 9.15854 9.53224 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.14249 8.51379 8.88597 9.26604 9.63713 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.24245 8.61364 8.98665 9.36285 9.73693 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97039 8.34171 8.71381 9.0874 9.46022 9.83429 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07025 8.44262 8.81599 9.19009 9.5614 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.17137 8.54327 8.91551 9.29 9.66179 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.27023 8.64402 9.01577 9.3872 9.76265 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.99889 8.37032 8.74232 9.11502 9.48764 9.86028 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09882 8.4705 8.84265 9.21511 9.58786 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.19897 8.57081 8.943 9.31552 9.68826 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.92789 8.29911 8.67103 9.04342 9.41609 9.78899 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.02793 8.39935 8.77149 9.14389 9.51658 9.8894 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.12807 8.49968 8.87185 9.24437 9.61717 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.22828 8.60004 8.97237 9.34499 9.71778 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.95735 8.32862 8.70049 9.0729 9.44557 9.81843 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05755 8.42899 8.80104 9.1735 9.54619 9.91912 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.15782 8.52943 8.90161 9.27421 9.64696 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.25822 8.62998 9.00227 9.37489 9.74774 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.98737 8.35866 8.7306 9.10297 9.47567 9.8485 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08773 8.4592 8.83131 9.20376 9.57647 NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.218 271.959 272.644 273.275 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.416 272.14 272.811 273.43 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.83 271.606 272.319 272.973 273.58 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.038 271.796 272.492 273.135 273.731 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.243 271.984 272.665 273.306 273.884 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.445 272.167 272.833 273.454 274.027 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.869 271.639 272.346 273 273.602 274.162 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.078 271.832 272.526 273.165 273.752 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.287 272.022 272.697 273.323 273.899 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.484 272.205 272.865 273.473 274.044 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.914 271.68 272.382 273.029 273.626 274.18 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.125 271.872 272.556 273.188 273.774 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.328 272.057 272.729 273.348 273.922 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.753 271.53 272.242 272.897 273.502 274.064 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.966 271.723 272.419 273.061 273.655 274.207 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.173 271.914 272.595 273.223 273.803 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.376 272.099 272.764 273.379 273.949 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.803 271.573 272.28 272.931 273.533 274.091 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.013 271.766 272.457 273.094 273.683 274.23 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.219 271.954 272.629 273.253 273.83 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.418 272.136 272.797 273.408 273.974 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 270.847 271.613 272.315 272.962 273.56 274.114 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 271.055 271.802 272.488 273.121 273.707 NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.96698 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0704 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1713 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.89221 10.2704 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.99408 10.3719 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.096 10.4736 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.198 10.5775 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.92221 10.2999 10.6776 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0243 10.4019 10.7792 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1264 10.5039 10.8809 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2285 10.6058 10.9827 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.95283 10.3305 10.7078 11.0846 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0551 10.4327 10.8098 11.1864 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1573 10.5347 10.9117 11.2882 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2595 10.6368 11.0137 11.39 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.98402 10.3617 10.7389 11.1156 11.4917 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.981 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.889 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.802 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 297.016 296.72 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.927 296.638 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.839 296.557 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.754 296.477 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.965 296.671 296.4 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.876 296.589 296.326 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.792 296.511 296.252 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.708 296.433 296.18 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.919 296.626 296.358 296.11 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.833 296.547 296.284 296.041 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.75 296.469 296.212 295.974 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.666 296.393 296.142 295.909 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 296.878 296.587 296.318 296.071 295.843 - - - - - - 5000 - 5000 - - 1.23823 1.43501 1.70067 2.00793 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.28243 1.50128 1.78028 2.09568 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.33358 1.57132 1.86227 2.18464 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.39039 1.64507 1.94576 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.45266 1.72229 2.032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.51983 1.80247 2.11999 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.59127 1.88516 2.20952 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.66633 1.97007 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.7448 2.05747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.82615 2.1467 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.90956 2.23617 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.99521 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.08189 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.17074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.26106 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 217.094 231.741 242.36 249.938 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 221.48 234.978 244.661 251.591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 225.551 237.901 246.748 253.104 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 229.254 240.572 248.649 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 232.678 243.022 250.407 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 235.824 245.261 252.022 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 238.696 247.31 253.513 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 241.321 249.19 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 243.716 250.915 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 245.916 252.513 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 247.91 253.952 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 249.741 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 251.402 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 252.937 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 254.353 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.23151 2.59747 2.96837 3.34463 3.72401 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.32927 2.69641 3.06987 3.44734 3.82845 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.06582 2.4265 2.79581 3.17031 3.5485 3.92888 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.16142 2.52525 2.89612 3.27166 3.65078 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.25849 2.62459 2.99706 3.37391 3.75413 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.35651 2.7246 3.09868 3.47592 3.8552 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.093 2.45548 2.82532 3.20007 3.57716 3.95792 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.18997 2.55481 2.9263 3.30237 3.67981 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.28821 2.65366 3.02635 3.40385 3.78147 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.38589 2.75394 3.12766 3.50374 3.88333 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.12256 2.48548 2.85424 3.2282 3.60582 3.98591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.21958 2.58389 2.95468 3.33014 3.70836 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.31763 2.68358 3.05638 3.43431 3.811 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.05411 2.41508 2.78499 3.15928 3.53803 3.9138 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.15058 2.51492 2.88506 3.25923 3.63788 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.24957 2.6153 2.98569 3.36133 3.74002 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.34725 2.71497 3.08818 3.46499 3.84283 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.44651 2.81492 3.18865 3.56696 3.94646 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.54413 2.91489 3.29014 3.66877 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.64409 3.01641 3.39306 3.77069 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.74588 3.11926 3.49432 3.87348 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.84553 3.21976 3.5967 3.97645 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.94578 3.32133 3.69921 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 307.927 304.622 302.161 300.255 298.739 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 306.919 303.884 301.585 299.796 298.365 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 309.82 306.007 303.198 301.056 299.374 298.027 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 308.669 305.162 302.555 300.555 298.973 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 307.602 304.379 301.958 300.085 298.594 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 306.629 303.656 301.4 299.642 298.242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 309.462 305.729 302.978 300.878 299.234 297.907 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 308.325 304.903 302.354 300.39 298.842 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 307.287 304.15 301.778 299.933 298.477 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 306.346 303.443 301.235 299.516 298.133 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 309.105 305.47 302.791 300.734 299.112 297.805 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 308.012 304.68 302.187 300.257 298.73 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 307.007 303.938 301.615 299.801 298.372 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 309.969 306.095 303.243 301.077 299.376 298.03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 308.805 305.243 302.608 300.588 298.988 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 307.715 304.448 302.015 300.124 298.619 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 306.744 303.734 301.455 299.677 298.264 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 305.838 303.061 300.94 299.268 297.93 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 305.023 302.443 300.456 298.881 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 304.254 301.853 299.99 298.514 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 303.529 301.296 299.563 298.166 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 302.874 300.791 299.154 297.834 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 302.262 300.311 298.768 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.1554 4.52942 4.90831 5.28291 5.66373 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.25539 4.63015 5.00769 5.3894 5.76615 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 3.98051 4.35514 4.73137 5.11023 5.49095 5.86992 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.08143 4.45701 4.83346 5.21457 5.59267 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.18242 4.55719 4.93548 5.31296 5.6933 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.28153 4.65784 5.03591 5.41309 5.79339 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.00874 4.38325 4.75803 5.13665 5.51628 5.89535 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.10813 4.48362 4.86099 5.239 5.61747 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.20808 4.5854 4.96184 5.34183 5.71959 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.30925 4.68511 5.0629 5.44213 5.82183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.03557 4.41003 4.78658 5.16469 5.544 5.9242 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.13625 4.51124 4.8883 5.26683 5.64646 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.23707 4.61276 4.9903 5.36918 5.74902 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 3.96437 4.33823 4.71448 5.09238 5.47155 5.85158 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.06549 4.44183 4.81739 5.19463 5.5741 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.16639 4.54304 4.91835 5.29699 5.67669 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.26709 4.64287 5.02047 5.39947 5.77939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 3.99546 4.36871 4.7447 5.12273 5.50196 5.88209 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.09529 4.4699 4.84675 5.22506 5.60455 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.19601 4.57147 4.94873 5.32753 5.70726 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.29724 4.67322 5.05101 5.43008 5.81005 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.02435 4.39874 4.77523 5.15338 5.53274 5.91291 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.12533 4.50036 4.87738 5.25587 5.63549 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 269.155 270.601 271.84 272.887 273.814 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 269.561 270.941 272.124 273.153 274.036 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 268.371 269.945 271.272 272.41 273.398 274.253 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 268.822 270.324 271.591 272.689 273.631 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 269.248 270.675 271.896 272.942 273.857 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 269.646 271.017 272.186 273.19 274.072 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 268.489 270.039 271.341 272.465 273.437 274.286 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 268.928 270.407 271.661 272.738 273.672 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 269.346 270.765 271.964 273.004 273.901 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 269.752 271.101 272.253 273.25 274.121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 268.608 270.133 271.424 272.533 273.494 274.336 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 269.046 270.503 271.741 272.805 273.729 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 269.467 270.856 272.041 273.064 273.957 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 268.287 269.863 271.194 272.333 273.318 274.178 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 268.745 270.255 271.522 272.61 273.558 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 269.175 270.614 271.827 272.878 273.793 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 269.584 270.955 272.125 273.135 274.017 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 268.43 269.977 271.287 272.41 273.382 274.234 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 268.87 270.349 271.605 272.684 273.621 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 269.291 270.705 271.909 272.947 273.85 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 269.693 271.045 272.2 273.199 274.071 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 268.544 270.074 271.369 272.479 273.442 274.284 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 268.978 270.439 271.68 272.747 273.673 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02398 6.40977 6.79536 7.18251 7.56411 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12829 6.51821 6.89963 7.28502 7.66695 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.84911 6.2345 6.62274 7.00313 7.38445 7.76936 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.95428 6.3361 6.72593 7.10808 7.48869 7.87213 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05417 6.43959 6.82608 7.208 7.59104 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15664 6.54257 6.92579 7.31006 7.69441 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.87482 6.26154 6.64452 7.02891 7.41359 7.79787 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.97804 6.36299 6.74784 7.13259 7.51709 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08191 6.46687 6.8516 7.23626 7.62062 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18565 6.57063 6.95533 7.33992 7.72424 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.90437 6.28946 6.67446 7.05926 7.44363 7.82776 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.00832 6.39337 6.77831 7.16294 7.54733 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11228 6.49728 6.8822 7.26684 7.65109 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.83128 6.21632 6.60119 6.98611 7.37061 7.75476 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.93543 6.32045 6.70535 7.09001 7.47436 7.85847 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.03955 6.42449 6.80927 7.1939 7.57822 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.14361 6.52856 6.91332 7.29787 7.68206 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.86274 6.24774 6.63266 7.01734 7.40175 7.78585 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.9669 6.35182 6.7367 7.12134 7.5057 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.07106 6.45605 6.84081 7.22535 7.60959 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.17523 6.56011 6.94484 7.32935 7.7135 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.89442 6.27938 6.66425 7.04894 7.43335 7.81739 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 5.99861 6.3836 6.76842 7.15301 7.53734 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.008 293.597 293.237 292.92 292.643 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.878 293.477 293.135 292.831 292.562 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.189 293.754 293.368 293.039 292.747 292.483 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.054 293.639 293.265 292.945 292.664 292.41 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.932 293.525 293.169 292.859 292.583 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.811 293.418 293.077 292.775 292.505 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.126 293.692 293.317 292.983 292.69 292.43 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.998 293.58 293.216 292.894 292.611 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.873 293.472 293.12 292.809 292.532 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.755 293.366 293.024 292.724 292.458 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.069 293.639 293.264 292.935 292.644 292.385 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.943 293.53 293.167 292.848 292.565 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.822 293.423 293.072 292.763 292.49 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.148 293.706 293.32 292.982 292.682 292.417 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.02 293.594 293.222 292.894 292.604 292.346 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.897 293.486 293.125 292.808 292.528 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.776 293.38 293.034 292.727 292.455 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 294.101 293.664 293.281 292.944 292.646 292.381 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.976 293.552 293.182 292.857 292.57 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.853 293.446 293.09 292.775 292.494 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 293.737 293.342 292.996 292.692 292.421 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 294.056 293.621 293.242 292.909 292.614 292.351 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 293.93 293.511 293.145 292.821 292.535 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94928 8.32844 8.70843 9.08753 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.05126 8.42955 8.81023 9.18964 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.77045 8.15067 8.53128 8.91141 9.29186 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87237 8.25302 8.63341 9.01395 9.39479 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97522 8.35548 8.73588 9.12365 9.50161 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.07777 8.45765 8.83864 9.22227 9.6032 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.79883 8.17944 8.56004 8.9415 9.32154 9.70228 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90132 8.28281 8.66454 9.0463 9.4246 9.80377 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00511 8.38587 8.7662 9.14818 9.52685 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10643 8.48891 8.86858 9.24729 9.62955 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.82827 8.20897 8.58944 8.96992 9.34966 9.72887 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9309 8.31159 8.69194 9.07196 9.45171 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03356 8.41418 8.79446 9.17442 9.554 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.13627 8.5168 8.89704 9.27691 9.65648 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.85838 8.23893 8.61943 8.99953 9.37934 9.75875 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.96105 8.34161 8.72202 9.10207 9.48179 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06385 8.44431 8.82463 9.20459 9.58418 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.78604 8.16662 8.54699 8.92724 9.30714 9.68664 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88885 8.26939 8.64978 9.02989 9.40961 9.78905 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9917 8.37219 8.75249 9.13256 9.51222 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.09457 8.475 8.85525 9.23519 9.6148 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.81685 8.19742 8.57785 8.958 9.33784 9.71728 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9198 8.30031 8.68067 9.06073 9.44046 9.81981 NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.693 278.165 278.599 279 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.816 278.276 278.701 279.094 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.441 277.932 278.384 278.8 279.185 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.569 278.05 278.492 278.9 279.277 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.698 278.167 278.597 279.004 279.371 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.821 278.279 278.703 279.096 279.459 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.453 277.942 278.391 278.805 279.186 279.541 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.584 278.062 278.501 278.906 279.279 279.627 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.714 278.179 278.608 279.005 279.37 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.837 278.294 278.712 279.097 279.458 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.476 277.96 278.404 278.813 279.192 279.543 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.606 278.079 278.513 278.914 279.285 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.735 278.197 278.621 279.012 279.375 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.86 278.31 278.724 279.109 279.465 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.501 277.981 278.423 278.829 279.204 279.552 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.634 278.103 278.532 278.928 279.296 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.76 278.217 278.639 279.028 279.389 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.396 277.885 278.332 278.743 279.123 279.476 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.529 278.005 278.442 278.844 279.217 279.564 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.658 278.123 278.55 278.944 279.309 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.784 278.238 278.655 279.041 279.399 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.422 277.906 278.349 278.758 279.136 279.486 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 277.552 278.024 278.458 278.858 279.228 279.572 NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.81866 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.92323 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0251 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1253 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.84617 10.2278 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94918 10.3305 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0522 10.4354 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.77359 10.1552 10.5365 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87675 10.2582 10.6388 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97985 10.3611 10.7416 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.083 10.464 10.8442 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.80451 10.186 10.5668 10.9469 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90773 10.2891 10.6697 11.0496 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.011 10.3921 10.7725 11.1521 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1142 10.4951 10.8753 11.2547 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.83583 10.2173 10.5981 10.9781 11.3573 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.54 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.503 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.47 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.438 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.504 291.407 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.472 291.377 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.438 291.345 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.507 291.407 291.317 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.474 291.377 291.289 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.442 291.347 291.262 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.411 291.319 291.236 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.481 291.382 291.291 291.21 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.448 291.35 291.263 291.185 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.417 291.323 291.238 291.16 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.387 291.294 291.21 291.137 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 291.456 291.357 291.268 291.187 291.114 - - - - - - 5000 - 5000 - - 1.87029 2.0055 2.20286 2.44731 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.89949 2.05306 2.2646 2.51958 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.93403 2.10461 2.32933 2.59381 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 1.9735 2.16002 2.39642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.0176 2.21904 2.46661 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.06615 2.28159 2.53936 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.11908 2.34717 2.6143 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.17561 2.41564 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.23598 2.48712 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.2996 2.561 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.36621 2.63629 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.4356 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.50692 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.581 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.65721 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - 209.157 220.094 229.37 236.965 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 212.259 222.774 231.579 238.751 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 215.258 225.3 233.658 240.429 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 218.105 227.703 235.607 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 220.852 229.995 237.469 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 223.487 232.166 239.225 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 225.995 234.221 240.886 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 228.384 236.165 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 230.65 238.008 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 232.805 239.759 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 234.822 241.375 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 236.736 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 238.52 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 240.216 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 241.816 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN 2.58019 2.90372 3.24088 3.58967 3.94642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 2.66545 2.99283 3.33426 3.68564 4.04517 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.43736 2.75107 3.08291 3.42714 3.78062 4.14057 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.51921 2.83878 3.17436 3.52132 3.87693 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.60326 2.92775 3.26687 3.61665 3.97451 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 2.68903 3.01802 3.36056 3.71222 4.07034 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.46034 2.77645 3.10946 3.4545 3.80732 4.16786 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.54362 2.86502 3.20179 3.54972 3.90421 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.62906 2.9538 3.29374 3.64452 4.00031 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 2.71488 3.04451 3.38732 3.7383 4.097 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.48558 2.80316 3.13587 3.48067 3.83435 4.19452 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.56936 2.89113 3.22784 3.57569 3.93119 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.65497 2.98092 3.32153 3.67312 4.02839 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 2.74092 3.0729 3.41678 3.77058 4.12603 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.51005 2.82968 3.16427 3.50971 3.86476 4.22459 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.5957 2.9196 3.25662 3.60504 3.96134 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.68132 3.00965 3.35117 3.70216 4.05873 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.76907 3.10053 3.44432 3.79807 4.15728 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.85625 3.19197 3.53891 3.89417 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 2.94606 3.28527 3.635 3.99069 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.03803 3.38033 3.73014 4.08827 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.12888 3.47362 3.82647 4.18617 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 3.22066 3.5683 3.9233 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN 321.962 317.368 313.74 310.807 308.402 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 320.601 316.305 312.871 310.092 307.801 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 324.459 319.341 315.3 312.062 309.428 307.258 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 322.956 318.15 314.348 311.291 308.792 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 321.535 317.03 313.448 310.557 308.183 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 320.204 315.978 312.598 309.863 307.618 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 323.994 318.952 314.981 311.799 309.215 307.074 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 322.501 317.784 314.047 311.04 308.591 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 321.103 316.698 313.177 310.325 308.004 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN 319.808 315.662 312.348 309.665 307.447 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 323.517 318.581 314.697 311.572 309.022 306.91 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 322.067 317.451 313.787 310.829 308.41 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 320.704 316.378 312.92 310.111 307.829 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN 319.446 315.357 312.095 309.436 307.276 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 323.104 318.243 314.413 311.34 308.822 306.746 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 321.651 317.107 313.52 310.612 308.226 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 320.326 316.064 312.664 309.909 307.652 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 319.07 315.075 311.872 309.257 307.105 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 317.919 314.154 311.123 308.642 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 316.815 313.266 310.397 308.054 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 315.76 312.419 309.725 307.492 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 314.795 311.643 309.078 306.952 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - 313.881 310.899 308.463 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.38034 4.73555 5.09812 5.45875 5.82724 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.47493 4.83162 5.19359 5.56158 5.92646 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.21529 4.56957 4.92845 5.29213 5.65977 6.02721 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.31029 4.6664 5.02619 5.39267 5.75814 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.4057 4.76187 5.124 5.48762 5.8557 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 4.49952 4.85799 5.22056 5.5843 5.95274 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.24151 4.596 4.95372 5.31745 5.68413 6.05173 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.33521 4.69149 5.05236 5.41597 5.78202 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.42976 4.78856 5.1491 5.51531 5.88099 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 4.52555 4.88376 5.24629 5.61215 5.98021 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.26657 4.62125 4.98083 5.34422 5.71069 6.07958 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.36151 4.71754 5.07825 5.44266 5.80991 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 4.45692 4.81441 5.17622 5.54142 5.90929 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.19934 4.55283 4.9116 5.27438 5.6404 6.00887 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.29455 4.65121 5.0102 5.37287 5.73965 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.38985 4.74767 5.10698 5.47162 5.83905 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 4.48518 4.843 5.20509 5.57058 5.93864 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.22844 4.58165 4.94039 5.30347 5.6697 6.03839 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.32262 4.67794 5.0382 5.40212 5.76905 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.41788 4.7748 5.1361 5.50103 5.86862 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 4.51384 4.87205 5.2345 5.60019 5.96841 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.25579 4.61029 4.96973 5.33309 5.69955 6.06835 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 4.3511 4.70705 5.06766 5.43193 5.7991 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN 260.719 262.747 264.508 266.012 267.353 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 261.287 263.233 264.919 266.401 267.68 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 259.638 261.829 263.706 265.333 266.757 268 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 260.263 262.364 264.163 265.738 267.099 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 260.859 262.866 264.602 266.105 267.43 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 261.418 263.351 265.02 266.466 267.746 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 259.808 261.97 263.815 265.423 266.827 268.06 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 260.417 262.49 264.273 265.818 267.169 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 260.999 262.998 264.706 266.203 267.503 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN 261.568 263.473 265.121 266.559 267.824 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 259.973 262.106 263.937 265.526 266.915 268.139 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 260.583 262.628 264.389 265.917 267.257 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN 261.166 263.126 264.819 266.294 267.59 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 259.526 261.723 263.607 265.237 266.66 267.91 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 260.157 262.272 264.074 265.637 267.009 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 260.757 262.782 264.511 266.023 267.35 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN 261.328 263.265 264.938 266.396 267.677 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 259.718 261.881 263.738 265.348 266.754 267.993 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 260.329 262.404 264.192 265.743 267.101 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 260.915 262.909 264.628 266.123 267.435 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN 261.479 263.392 265.045 266.488 267.757 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 259.876 262.018 263.855 265.448 266.841 268.068 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN 260.482 262.536 264.303 265.837 267.181 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.16962 6.54801 6.92715 7.30826 7.68477 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.27165 6.65432 7.02978 7.40928 7.78621 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.99802 6.37568 6.7572 7.1314 7.5073 7.88727 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.10104 6.47535 6.85845 7.23459 7.61008 7.98866 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.19881 6.57705 6.95693 7.33324 7.711 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.29916 6.67804 7.05515 7.43372 7.81299 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.02296 6.40212 6.77828 7.15663 7.53581 7.91511 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.12404 6.5016 6.87986 7.25869 7.63788 8.01726 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.22582 6.60359 6.98195 7.36085 7.74003 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.32755 6.70555 7.08404 7.46306 7.84231 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.05186 6.42937 6.80764 7.18641 7.56535 7.94454 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.15369 6.53142 6.90979 7.28855 7.66764 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.25558 6.63346 7.01201 7.39097 7.77007 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.98034 6.35762 6.73561 7.11436 7.49331 7.87242 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.08233 6.45983 6.83803 7.21671 7.59568 7.9749 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.18437 6.56203 6.94029 7.31911 7.69817 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.28642 6.66432 7.04275 7.42164 7.80069 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.01129 6.38859 6.76667 7.14522 7.52412 7.90325 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.11331 6.49076 6.86899 7.24769 7.6267 8.00585 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.21539 6.59318 6.9715 7.35025 7.72925 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 6.31764 6.69549 7.07394 7.4528 7.83187 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.04251 6.41983 6.79792 7.17654 7.55548 7.93455 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 6.14461 6.52223 6.90045 7.2791 7.6581 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.298 299.533 298.856 298.253 297.721 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.067 299.319 298.673 298.093 297.576 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.648 299.842 299.122 298.499 297.94 297.433 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.406 299.634 298.934 298.326 297.787 297.296 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.186 299.43 298.76 298.17 297.64 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.968 299.235 298.591 298.014 297.497 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.555 299.751 299.048 298.421 297.86 297.357 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.323 299.548 298.864 298.255 297.711 297.223 NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.097 299.349 298.687 298.095 297.566 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.881 299.155 298.512 297.94 297.427 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.464 299.669 298.969 298.346 297.791 297.291 NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.235 299.468 298.788 298.184 297.643 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.014 299.27 298.612 298.027 297.503 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.614 299.799 299.081 298.444 297.874 297.364 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.38 299.593 298.897 298.279 297.727 297.231 NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.155 299.394 298.719 298.12 297.584 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.936 299.2 298.548 297.966 297.445 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.533 299.727 299.014 298.381 297.815 297.309 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.303 299.522 298.831 298.218 297.671 297.179 NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 300.079 299.325 298.657 298.062 297.528 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN 299.866 299.135 298.486 297.908 297.391 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 300.456 299.655 298.949 298.322 297.762 297.258 NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN 300.227 299.455 298.77 298.161 297.616 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.06111 8.43415 8.80858 9.18254 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.16148 8.53378 8.90889 9.28339 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.88539 8.25919 8.63398 9.00877 9.38428 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.9855 8.35989 8.73458 9.10991 9.48583 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.08649 8.46076 8.8356 9.21827 9.59149 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.18742 8.56138 8.93687 9.3154 9.69205 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.91313 8.2874 8.66222 9.03828 9.41343 9.78971 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.01383 8.38917 8.76522 9.14163 9.5153 9.89003 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.11592 8.4906 8.86532 9.24231 9.61643 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.21545 8.59206 8.96626 9.34007 9.71783 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.94188 8.31629 8.69105 9.06625 9.44121 9.81589 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.04274 8.4173 8.79205 9.1669 9.54192 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.14363 8.51827 8.89309 9.26804 9.64299 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.87036 8.24463 8.61934 8.99424 9.36919 9.74421 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.97131 8.34562 8.72042 9.09529 9.47031 9.84528 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.0722 8.44671 8.82156 9.19648 9.57148 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.17328 8.54782 8.9227 9.29765 9.67265 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.90014 8.27437 8.64896 9.02391 9.39892 9.77391 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.00116 8.37551 8.75024 9.12516 9.50011 9.87512 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.10225 8.47672 8.8515 9.22651 9.60147 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.20343 8.57797 8.95282 9.32779 9.70284 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.93036 8.30463 8.67933 9.0542 9.42918 9.80412 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8.03159 8.40594 8.78068 9.15557 9.53054 9.9055 NaN NaN NaN NaN - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.963 273.635 274.254 274.825 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.143 273.798 274.404 274.962 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.612 273.312 273.956 274.55 275.098 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.798 273.485 274.115 274.696 275.233 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.985 273.654 274.268 274.847 275.37 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.165 273.817 274.421 274.982 275.499 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.643 273.34 273.98 274.57 275.113 275.619 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.833 273.515 274.141 274.718 275.249 275.743 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.021 273.684 274.295 274.861 275.381 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.198 273.851 274.447 274.996 275.51 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.684 273.376 274.009 274.593 275.133 275.634 NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.872 273.547 274.167 274.739 275.268 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.058 273.717 274.323 274.881 275.398 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.537 273.238 273.881 274.473 275.021 275.529 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.728 273.414 274.043 274.623 275.158 275.654 NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.917 273.586 274.2 274.766 275.292 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.098 273.752 274.354 274.909 275.423 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.58 273.277 273.916 274.504 275.047 275.55 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.771 273.451 274.075 274.65 275.182 275.676 NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.956 273.62 274.23 274.794 275.315 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 273.136 273.785 274.383 274.934 275.444 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.621 273.312 273.946 274.53 275.07 275.571 NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 272.807 273.482 274.103 274.675 275.204 275.694 NaN NaN NaN NaN - - - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.91742 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0215 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1227 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.222 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.94466 10.3238 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.047 10.4259 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1493 10.5301 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.87254 10.2517 10.6307 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.97505 10.354 10.7324 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0775 10.4563 10.8346 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1799 10.5586 10.9367 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.90331 10.2824 10.6609 11.0388 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0059 10.3848 10.7632 11.141 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.1085 10.4873 10.8654 11.243 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.2111 10.5896 10.9676 11.3451 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9.93452 10.3136 10.692 11.0699 11.4471 - - - - 5000 - 5000 - - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.499 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.423 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.35 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.281 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.45 295.212 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.378 295.146 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.305 295.077 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.479 295.237 295.015 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.406 295.169 294.952 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.334 295.103 294.891 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.265 295.039 294.831 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.439 295.198 294.976 294.773 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.367 295.131 294.915 294.717 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.297 295.067 294.856 294.66 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.229 295.002 294.796 294.606 - NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 295.401 295.161 294.942 294.74 294.553 - - - - - - 6.25064122361692 - 284.478219237802 - - - 6.09198716843552 - 284.112220821742 - - - 6.12972258765456 - 284.225258143 - - - 6.12130212971328 - 284.052669982142 - - - 5.95823357350295 - 283.758000616276 - - - 6.00440443416997 - 283.869081343775 - - - 6.05770703720214 - 284.027099532072 - - - 5.98094371672299 - 283.807419436709 - - - 6.17101781342723 - 284.324458406957 - - - 6.20897376906843 - 284.423103788365 - - - 6.30264997448819 - 284.590440102053 - - - 6.02838543893148 - 283.819400338538 - - - 6.22678567178944 - 284.322311115097 - - - - - - - 3.500058 - 3.354197 - 0.022900 - 0.000000 - 0.000000 - 8.675177 - 0.268831 - 2.812220 - 83.179593 - 0.992827 - 0.571295 - 0.275278 - 0.038401 - 3.186380 - 0.000000 - 0.0 - 0.0 - 0.0 - CAMS - 0.392921 - 1.224094 - AUX_ECMWFT - 357.927923 - - - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B01.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B01.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B02.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B02.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B03.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B03.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B04.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B04.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B05.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B05.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B06.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B06.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B07.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B07.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B08.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B08.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B8A.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B8A.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B09.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B09.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B10.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B10.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B11.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B11.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_DETFOO_B12.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_QUALIT_B12.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_CLASSI_B00.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_CLDPRB_20m.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_SNWPRB_20m.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_CLDPRB_60m.jp2 - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/MSK_SNWPRB_60m.jp2 - - GRANULE/L2A_T50TMK_A045975_20240411T030632/QI_DATA/T50TMK_20240411T030521_PVI.jp2 - - -""" - mtd_l1c_old_xml = """ @@ -5774,24 +861,84 @@ """ # noqa +class TestTileXML: + """Test the SAFE TILE XML file handler.""" + + def setup_method(self): + """Set up the test case.""" + from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML + filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") + self.l1c_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), filename_info, mock.MagicMock()) + + @pytest.mark.parametrize(("angles_name", "angle_block", "angle_type", "expected"), + [("satellite_zenith_angle", "Viewing_Incidence_Angles_Grids", "Zenith", + [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, + 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], + [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, + 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], + [11.6823579, 10.7763071, 9.86302106, 8.93879112, 8.04005637, + 7.15028077, 6.21461062, 5.25780953, 4.39876601, 3.68620793], + [11.06724679, 10.35723901, 9.63958896, 8.73072512, 7.83680864, + 6.94792574, 5.9889201, 5.05445872, 4.26089708, 3.50984272], + [6.28411038, 6.28411038, 6.28411038, 6.28411038, 6.28411038, + 5.99769643, 5.62586167, 4.85165966, 4.13238314, 3.33781401], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), + ("satellite_zenith_angle_l2a", "Viewing_Incidence_Angles_Grids", "Zenith", + [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, + 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], + [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, + 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], + [11.6823579, 10.7763071, 9.86302106, 8.93879112, 8.04005637, + 7.15028077, 6.21461062, 5.25780953, 4.39876601, 3.68620793], + [11.06724679, 10.35723901, 9.63958896, 8.73072512, 7.83680864, + 6.94792574, 5.9889201, 5.05445872, 4.26089708, 3.50984272], + [6.28411038, 6.28411038, 6.28411038, 6.28411038, 6.28411038, + 5.99769643, 5.62586167, 4.85165966, 4.13238314, 3.33781401], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), + ]) + def test_angles(self, angles_name, angle_block, angle_type, expected): + info = dict(xml_tag=angle_block, xml_item=angle_type) + res = self.l1c_xml_tile_fh.get_dataset(make_dataid(name=angles_name, + resolution=60), info)[::200, ::200] + np.testing.assert_allclose(res, expected) + + + + class TestMTDXML: """Test the SAFE MTD XML file handler.""" def setup_method(self): """Set up the test case.""" from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML - filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A") + filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") self.l1c_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), filename_info, mock.MagicMock()) - self.l2a_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l2a_tile_xml), filename_info, mock.MagicMock()) self.l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), filename_info, mock.MagicMock()) self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=True) - # self.l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), filename_info, mock.MagicMock(), mask_saturated=True) def test_satellite_zenith_array(self): """Test reading the satellite zenith array.""" info = dict(xml_tag="Viewing_Incidence_Angles_Grids", xml_item="Zenith") - expected_data_l1c = np.array([[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, + expected_data = np.array([[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], @@ -5811,34 +958,15 @@ def test_satellite_zenith_array(self): 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]) - expected_data_l2a = np.array([[ 0.823021, 1.57224058, 2.40477933, 3.33521808, 4.29339294, 5.21712818, - 6.13685593, 7.07123343, 7.9968313, 8.91635508], - [ 0.99274285, 1.78598401, 2.6537931, 3.59082788, 4.54147721, 5.47021744, - 6.39166677, 7.31780035, 8.24199199, 9.16344605], - [ 1.19102539, 2.01811264, 2.90509575, 3.843318, 4.79014776, 5.71596442, - 6.63842562, 7.56669001, 8.49008303, 9.41563303], - [ 1.40805629, 2.22663763, 3.15710255, 4.11212841, 5.0389507, 5.95589868, - 6.88741709, 7.81585111, 8.74029188, 9.66309923], - [ 1.6364984, 2.47693166, 3.40635124, 4.36058177, 5.28712709, 6.20731242, - 7.1382703, 8.0645253, 8.98640945, 9.91275701], - [ 1.86939307, 2.72734103, 3.6589573, 4.61010637, 5.53711387, 6.45878796, - 7.38909762, 8.31322866, 9.23367977, 10.16133622], - [ 2.05092764, 2.97881829, 3.93023614, 4.86081228, 5.78239877, 6.71040601, - 7.63930914, 8.5619639, 9.48322901, 10.40935204], - [ 2.30188982, 3.2312058, 4.18234794, 5.11071768, 6.032489, 6.96190824, - 7.88904158, 8.81055152, 9.73186255, 10.65685334], - [ 2.55171923, 3.48266186, 4.4345628, 5.36132917, 6.28264069, 7.2133112, - 8.13807392, 9.05916615, 9.98720691, 10.90435203], - [ 2.80292458, 3.74216648, 4.68491268, 5.61065107, 6.53464742, 7.46456958, - 8.38738208, 9.3076386, 10.23571319, 11.15166785]]) + res1 = self.l1c_xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle", resolution=60), info)[::200, ::200] - res2 = self.l2a_xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle_l2a", + res2 = self.l1c_xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle_l2a", resolution=60), info)[::200, ::200] - np.testing.assert_allclose(res1, expected_data_l1c) - np.testing.assert_allclose(res2, expected_data_l2a) + np.testing.assert_allclose(res1, expected_data) + np.testing.assert_allclose(res2, expected_data) def test_old_xml_calibration(self): """Test the calibration of older data formats (no offset).""" @@ -5870,7 +998,7 @@ def test_xml_calibration_to_counts(self): def test_xml_calibration_unmasked_saturated(self): """Test the calibration with radiometric offset but unmasked saturated pixels.""" from satpy.readers.msi_safe import SAFEMSIMDXML - filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A") + filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=False) fake_data = xr.DataArray([[[0, 1, 2, 3], @@ -5918,7 +1046,8 @@ class TestSAFEMSIL1C: def setup_method(self): """Set up the test.""" from satpy.readers.msi_safe import SAFEMSITileMDXML - self.filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B01", dtile_number=None) + self.filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B01", dtile_number=None, + process_level="L1C") self.fake_data = xr.Dataset({"band_data": xr.DataArray([[[0, 1], [65534, 65535]]], dims=["band", "x", "y"])}) self.tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), self.filename_info, mock.MagicMock()) From 59a3f7830ae18ca7a863095b7ce400aac7176d42 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 19:37:47 +0800 Subject: [PATCH 333/481] Update msi_safe.yaml --- satpy/etc/readers/msi_safe.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index d877a1ba5f..d3efb0a1ea 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -11,7 +11,7 @@ reader: file_types: l1c_safe_granule: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSI{process_level:3s} + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] requires: [l1c_safe_metadata, l1c_safe_tile_metadata] l1c_safe_tile_metadata: @@ -22,15 +22,15 @@ file_types: file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSI{process_level:3s}.xml'] l2a_safe_granule_10m: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSI{process_level:3s} + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R10m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_10m.jp2'] requires: [l2a_safe_metadata, l2a_safe_tile_metadata] l2a_safe_granule_20m: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSI{process_level:3s} + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R20m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_20m.jp2'] requires: [l2a_safe_metadata, l2a_safe_tile_metadata] l2a_safe_granule_60m: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSI{process_level:3s} + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R60m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_60m.jp2'] requires: [l2a_safe_metadata, l2a_safe_tile_metadata] l2a_safe_tile_metadata: From d3cbffa8cf4ed796e37cc996fec54a6678d43d00 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 20:34:06 +0800 Subject: [PATCH 334/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 35 +++++------------------ 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index c7cf8c1e28..385b86843a 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -862,15 +862,17 @@ class TestTileXML: - """Test the SAFE TILE XML file handler.""" + """Test the SAFE TILE XML file handler. + Since L1C/L2A share almost the same Tile XML, we just need to test L1C. + """ def setup_method(self): """Set up the test case.""" - from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML + from satpy.readers.msi_safe import SAFEMSITileMDXML filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") self.l1c_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), filename_info, mock.MagicMock()) - @pytest.mark.parametrize(("angles_name", "angle_block", "angle_type", "expected"), + @pytest.mark.parametrize(("angle_name", "angle_block", "angle_type", "expected"), [("satellite_zenith_angle", "Viewing_Incidence_Angles_Grids", "Zenith", [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], @@ -892,37 +894,14 @@ def setup_method(self): 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), - ("satellite_zenith_angle_l2a", "Viewing_Incidence_Angles_Grids", "Zenith", - [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, - 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], - [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, - 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], - [11.6823579, 10.7763071, 9.86302106, 8.93879112, 8.04005637, - 7.15028077, 6.21461062, 5.25780953, 4.39876601, 3.68620793], - [11.06724679, 10.35723901, 9.63958896, 8.73072512, 7.83680864, - 6.94792574, 5.9889201, 5.05445872, 4.26089708, 3.50984272], - [6.28411038, 6.28411038, 6.28411038, 6.28411038, 6.28411038, - 5.99769643, 5.62586167, 4.85165966, 4.13238314, 3.33781401], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), ]) - def test_angles(self, angles_name, angle_block, angle_type, expected): + def test_angles(self, angle_name, angle_block, angle_type, expected): info = dict(xml_tag=angle_block, xml_item=angle_type) - res = self.l1c_xml_tile_fh.get_dataset(make_dataid(name=angles_name, + res = self.l1c_xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info)[::200, ::200] np.testing.assert_allclose(res, expected) - - class TestMTDXML: """Test the SAFE MTD XML file handler.""" From 89a0c3e43bcc99ba163ede75042ddc9ecc2c80e4 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Fri, 19 Apr 2024 09:11:35 -0500 Subject: [PATCH 335/481] Fix cftime not being uninstalled in unstable CI --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c472709bc8..8d0af4123e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -77,7 +77,7 @@ jobs: numpy \ pandas \ scipy - mamba remove --force-remove -y pykdtree pyresample trollimage pyhdf netcdf4 h5py + conda remove --force-remove -y pykdtree pyresample trollimage pyhdf netcdf4 h5py cftime python -m pip install --upgrade --no-deps --pre --no-build-isolation \ git+https://github.com/storpipfugl/pykdtree \ git+https://github.com/pytroll/pyresample \ From 14e1214e3cda0564e1174864d8a9a137eed7ceb2 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Fri, 19 Apr 2024 09:25:21 -0500 Subject: [PATCH 336/481] Remove conda remove of trollimage which is pip installed --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8d0af4123e..9636148db2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -77,7 +77,7 @@ jobs: numpy \ pandas \ scipy - conda remove --force-remove -y pykdtree pyresample trollimage pyhdf netcdf4 h5py cftime + conda remove --force-remove -y pykdtree pyresample pyhdf netcdf4 h5py cftime python -m pip install --upgrade --no-deps --pre --no-build-isolation \ git+https://github.com/storpipfugl/pykdtree \ git+https://github.com/pytroll/pyresample \ From b420b193f91714aa850a2c714271b5e8fd40d4bb Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 22:52:04 +0800 Subject: [PATCH 337/481] yaml and test --- satpy/etc/readers/msi_safe.yaml | 16 +++++----- satpy/tests/reader_tests/test_msi_safe.py | 36 +++++++++++++++++++++-- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index d3efb0a1ea..16a74e64ea 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -12,33 +12,33 @@ reader: file_types: l1c_safe_granule: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] requires: [l1c_safe_metadata, l1c_safe_tile_metadata] l1c_safe_tile_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] l1c_safe_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSI{process_level:3s}.xml'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] l2a_safe_granule_10m: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R10m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_10m.jp2'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R10m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_10m.jp2'] requires: [l2a_safe_metadata, l2a_safe_tile_metadata] l2a_safe_granule_20m: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R20m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_20m.jp2'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R20m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_20m.jp2'] requires: [l2a_safe_metadata, l2a_safe_tile_metadata] l2a_safe_granule_60m: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R60m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_60m.jp2'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R60m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_60m.jp2'] requires: [l2a_safe_metadata, l2a_safe_tile_metadata] l2a_safe_tile_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/{process_level:3s}_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] l2a_safe_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSI{process_level:3s}.xml'] + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL2A.xml'] datasets: B01: diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 385b86843a..8d797bcf16 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -894,12 +894,42 @@ def setup_method(self): 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), + ("solar_zenith_angle_l2a", "Sun_Angles_Grid", "Zenith", + [[39.8824, 39.83721367, 39.79230847, 39.74758442, 39.7030415, + 39.65867687, 39.61455566, 39.57061558, 39.52685664, 39.48331372], + [39.78150175, 39.73629896, 39.69128852, 39.64643679, 39.6018404, + 39.5574369, 39.51323286, 39.46920212, 39.4253673, 39.38179377], + [39.6806035, 39.63532838, 39.5902497, 39.54538507, 39.5007087, + 39.45621756, 39.41195347, 39.36779169, 39.3239121, 39.28027381], + [39.57980525, 39.53445664, 39.48931088, 39.44434154, 39.39957879, + 39.35503587, 39.31067408, 39.26649344, 39.22249393, 39.17876143], + [39.479007, 39.43355483, 39.38829092, 39.34328573, 39.29846167, + 39.25381983, 39.2093947, 39.16513007, 39.12109926, 39.07726878], + [39.37820875, 39.33268069, 39.28735495, 39.24224914, 39.19736058, + 39.15267709, 39.1081719, 39.06385068, 39.01973446, 38.97584982], + [39.2774105, 39.23184303, 39.18646737, 39.14130809, 39.09632176, + 39.05153988, 39.00696049, 38.9625713, 38.91842056, 38.87444401], + [39.17671225, 39.13104478, 39.08559031, 39.04034757, 38.99528294, + 38.95039991, 38.9057971, 38.86130793, 38.81705183, 38.77303821], + [39.076014, 39.03026112, 38.98477906, 38.93940875, 38.89425338, + 38.84936063, 38.80464763, 38.76011645, 38.7157479, 38.67164839], + [38.97531575, 38.92950771, 38.88389967, 38.83852091, 38.7933053, + 38.74831897, 38.7034912, 38.65891427, 38.61446851, 38.57030388]]), + ("moon_zenith_angle", "Sun_Angles_Grid", "Zenith", None) ]) def test_angles(self, angle_name, angle_block, angle_type, expected): - info = dict(xml_tag=angle_block, xml_item=angle_type) + info = dict(xml_tag=angle_block, xml_item=angle_type) if "satellite" in angle_name else \ + dict(xml_tag=angle_block + "/" + angle_type) + res = self.l1c_xml_tile_fh.get_dataset(make_dataid(name=angle_name, - resolution=60), info)[::200, ::200] - np.testing.assert_allclose(res, expected) + resolution=60), info) + if res is not None: + res = res[::200, ::200] + + if expected is not None: + np.testing.assert_allclose(res, expected) + else: + assert res is expected class TestMTDXML: From da5f04d88fd67e93357de9250716e8b20e59020d Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 22:54:24 +0800 Subject: [PATCH 338/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 8d797bcf16..48f835b352 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -864,6 +864,7 @@ class TestTileXML: """Test the SAFE TILE XML file handler. Since L1C/L2A share almost the same Tile XML, we just need to test L1C. + """ def setup_method(self): @@ -918,6 +919,7 @@ def setup_method(self): ("moon_zenith_angle", "Sun_Angles_Grid", "Zenith", None) ]) def test_angles(self, angle_name, angle_block, angle_type, expected): + """Test reading angles array.""" info = dict(xml_tag=angle_block, xml_item=angle_type) if "satellite" in angle_name else \ dict(xml_tag=angle_block + "/" + angle_type) From 0aeab3bc72c5f62f627b2396d89d69a88bd248b0 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Fri, 19 Apr 2024 09:55:36 -0500 Subject: [PATCH 339/481] Install geotiepoints from source in unstable CI --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9636148db2..7e1ce4bb80 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -77,11 +77,12 @@ jobs: numpy \ pandas \ scipy - conda remove --force-remove -y pykdtree pyresample pyhdf netcdf4 h5py cftime + conda remove --force-remove -y pykdtree pyresample python-geotiepoints pyhdf netcdf4 h5py cftime python -m pip install --upgrade --no-deps --pre --no-build-isolation \ git+https://github.com/storpipfugl/pykdtree \ git+https://github.com/pytroll/pyresample \ git+https://github.com/pytroll/trollimage \ + git+https://github.com/pytroll/python-geotiepoints \ git+https://github.com/fhs/pyhdf \ git+https://github.com/h5py/h5py \ git+https://github.com/h5netcdf/h5netcdf \ From 504590cd963ff7a551742517ed77b5fba39a5110 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 22:55:54 +0800 Subject: [PATCH 340/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 1 + 1 file changed, 1 insertion(+) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 48f835b352..0e0c1e1845 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -863,6 +863,7 @@ class TestTileXML: """Test the SAFE TILE XML file handler. + Since L1C/L2A share almost the same Tile XML, we just need to test L1C. """ From b50ee5b628d6c0cd87810ae6c814d67b07e5a4ac Mon Sep 17 00:00:00 2001 From: David Hoese Date: Fri, 19 Apr 2024 10:18:32 -0500 Subject: [PATCH 341/481] Force pyerfa to be installed from PyPI --- .github/workflows/ci.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7e1ce4bb80..ce4a16006f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -67,6 +67,9 @@ jobs: # Install pykdtree with --no-build-isolation so it builds with numpy 2.0 # We must get LD_PRELOAD for stdlibc++ or else the manylinux wheels # may break the conda-forge libraries trying to use newer glibc versions + # NOTE: Many of the packages removed and then reinstalled below are to avoid + # compatibility issues with numpy 2. When conda-forge has numpy 2 available + # this shouldn't be needed. run: | python -m pip install versioneer extension-helpers setuptools-scm configobj pkgconfig python -m pip install \ @@ -77,7 +80,7 @@ jobs: numpy \ pandas \ scipy - conda remove --force-remove -y pykdtree pyresample python-geotiepoints pyhdf netcdf4 h5py cftime + conda remove --force-remove -y pykdtree pyresample python-geotiepoints pyhdf netcdf4 h5py cftime astropy pyerfa python -m pip install --upgrade --no-deps --pre --no-build-isolation \ git+https://github.com/storpipfugl/pykdtree \ git+https://github.com/pytroll/pyresample \ From f851334dc287edb382f578d558409416010ddb48 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 23:42:00 +0800 Subject: [PATCH 342/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 656 ++++++++++++++++++++-- 1 file changed, 598 insertions(+), 58 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 0e0c1e1845..e13a923cd4 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -860,22 +860,579 @@ """ # noqa +mtd_l2a_xml = """ + + + + 2024-04-11T03:05:21.024Z + 2024-04-11T03:05:21.024Z + S2A_MSIL2A_20240411T030521_N0510_R075_T50TMK_20240411T080950.SAFE + Level-2A + S2MSI2A + 05.10 + https://doi.org/10.5270/S2_-znk9xsj + 2024-04-11T08:09:50.000000Z + Not applicable + Not applicable + + Sentinel-2A + INS-NOBS + 2024-04-11T03:05:21.024Z + 75 + DESCENDING + + +SAFE_COMPACT + + + + + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B02_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B03_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B04_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B08_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_TCI_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_AOT_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_WVP_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B01_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B02_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B03_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B04_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B05_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B06_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B07_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B8A_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B11_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B12_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_TCI_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_AOT_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_WVP_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_SCL_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B01_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B02_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B03_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B04_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B05_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B06_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B07_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B8A_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B09_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B11_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B12_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_TCI_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_AOT_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_WVP_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_SCL_60m + + + + + + + NODATA + 0 + + + SATURATED + 65535 + + + 3 + 2 + 1 + + + 10000 + 1000.0 + 1000.0 + + + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + + + 0.998279632507911 + + 1884.69 + 1959.66 + 1823.24 + 1512.06 + 1424.64 + 1287.61 + 1162.08 + 1041.63 + 955.32 + 812.92 + 367.15 + 245.59 + 85.25 + + + + + 60 + + 412 + 456 + 442.7 + + + 1 + 0.001775742 0.004073061 0.003626143 0.003515199 0.005729163 0.003780292 0.002636732 0.001262113 0.001987583 0.001368913 0.001250444 0.000463454 0.000814293 0.001376431 0.001485086 0.001823735 0.001626817 0.004392062 0.029008099 0.11874593 0.32387506 0.57281921 0.71472749 0.76196778 0.78929702 0.80862387 0.81089382 0.82419876 0.85415811 0.87079088 0.88731097 0.92619924 0.98228149 1 0.9752382 0.93596338 0.88997148 0.85021048 0.82569453 0.78390239 0.61417422 0.33007109 0.12410831 0.04365694 0.014749595 + + + + 10 + + 456 + 533 + 492.7 + + + 1 + 0.04255531 0.0722983 0.15374322 0.32799225 0.55336788 0.71011166 0.75285179 0.75232691 0.75668081 0.76326948 0.76239425 0.7852515 0.81546669 0.86179176 0.89282599 0.9195221 0.91900649 0.91315754 0.90035366 0.88989693 0.8823246 0.87606118 0.88429987 0.90695544 0.93232085 0.93947252 0.94383543 0.92204086 0.8860231 0.84743609 0.81251687 0.7823971 0.7731087 0.77209054 0.78742652 0.81217177 0.84605052 0.88767996 0.92793997 0.95069235 0.96573311 0.96938253 0.96570294 0.95832003 0.95405064 0.95178268 0.95699722 0.96556515 0.9770514 0.97709574 0.97436606 0.95903183 0.93506318 0.90190134 0.87165792 0.84402444 0.82280852 0.81536043 0.82057639 0.8395149 0.86992171 0.91526205 0.96067028 0.99163699 1 0.98356097 0.91130763 0.74018256 0.50395858 0.3050155 0.18004605 0.10738342 0.06593592 0.04207746 0.02662129 0.0143396 0.00265779 0.00081822 + + + + 10 + + 538 + 583 + 559.8 + + + 1 + 0.01448181 0.03422251 0.07346335 0.15444843 0.31661425 0.55322279 0.74859406 0.84890306 0.89772216 0.9215368 0.92572845 0.91122688 0.88818924 0.86523756 0.84718187 0.8387572 0.84459081 0.86219653 0.88838714 0.92443236 0.96017974 0.98685516 1 0.9986008 0.98076472 0.94522089 0.8981778 0.85580323 0.81841734 0.78862048 0.76460653 0.74963745 0.75055111 0.76137888 0.78244479 0.79890086 0.81016957 0.81408886 0.77358596 0.62881065 0.40397555 0.21542098 0.10715281 0.04792877 0.01848693 0.00108588 + + + + 10 + + 646 + 684 + 664.6 + + + 1 + 0.00141521 0.02590238 0.11651178 0.39088616 0.74959342 0.94485805 0.98011173 0.99406309 1 0.99545475 0.99052772 0.97733476 0.94055988 0.87894956 0.81629384 0.77345952 0.75448766 0.75991531 0.7826343 0.8101689 0.83612975 0.86125424 0.88609106 0.91138767 0.93405146 0.95042063 0.9592573 0.96039555 0.95913395 0.95809013 0.95527459 0.94376465 0.89490799 0.74426308 0.476777 0.22960399 0.08009118 0.02617076 0.00415242 + + + + 20 + + 695 + 714 + 704.1 + + + 1 + 0.02835786 0.12369337 0.39378774 0.76113071 0.97108502 0.99889523 1 0.99412258 0.98321789 0.96704093 0.94847389 0.92714833 0.90372458 0.88614713 0.86723745 0.79075319 0.58840332 0.26334833 0.05675422 0.00618833 + + + + 20 + + 731 + 749 + 740.5 + + + 1 + 0.00171088 0.05467153 0.25806676 0.64722098 0.89218999 0.90232877 0.91508768 0.94115846 0.96299993 0.97510481 0.9770217 0.98736251 1 0.98880277 0.97179916 0.90126739 0.60672391 0.20520227 0.0267569 + + + + 20 + + 769 + 797 + 782.8 + + + 1 + 0.00045899 0.0117201 0.05219715 0.16561733 0.36903355 0.63685453 0.86119638 0.97002897 0.99119602 0.99897921 1 0.97725155 0.92572385 0.86605804 0.81969611 0.79407674 0.79111029 0.80431552 0.81902721 0.82571292 0.82011829 0.79222195 0.72054559 0.58767794 0.41430355 0.23088817 0.09850282 0.02736551 0.00516235 + + + + 10 + + 760 + 907 + 832.8 + + + 1 + 0.00067259 0.00388856 0 0 0 0 0 0 0 0 0 0 0 0.00028956 0.00702964 0.01752391 0.03231111 0.05328661 0.08299885 0.12748502 0.19591065 0.30246323 0.43553954 0.57141637 0.69766701 0.80303852 0.89115744 0.95284584 0.98894161 1 0.98840653 0.96389216 0.94207967 0.93694643 0.94227343 0.95395718 0.96828896 0.97966549 0.9854444 0.98592681 0.98391181 0.97793903 0.97722771 0.97810609 0.98144486 0.98764558 0.98857708 0.9862422 0.98070921 0.97078624 0.95721089 0.93865821 0.91672388 0.89620759 0.872888 0.85160331 0.8246394 0.80078117 0.7823386 0.76360274 0.74962771 0.7387221 0.73079407 0.72271237 0.72507708 0.72563856 0.72304217 0.72229211 0.71616364 0.71159446 0.70826954 0.70157205 0.69924532 0.70093762 0.70692733 0.71824001 0.73124634 0.7484061 0.76818541 0.78394807 0.7968381 0.80260206 0.8045194 0.80240918 0.79699072 0.78920304 0.77691621 0.76518406 0.75119717 0.73700357 0.72262399 0.70412578 0.68410805 0.66474528 0.64736891 0.63005125 0.61564222 0.60249557 0.58988992 0.57993399 0.57136506 0.56094242 0.55235105 0.54568236 0.53958052 0.53510215 0.53093675 0.53016508 0.52984662 0.53036682 0.53211463 0.53271918 0.53246806 0.53331158 0.5319278 0.53051055 0.52951499 0.52996848 0.53253373 0.53705085 0.54235344 0.54912497 0.55523055 0.56011135 0.55767999 0.54821984 0.53144613 0.50763528 0.47811224 0.45092793 0.42798466 0.41051405 0.40039139 0.40087302 0.40829375 0.42086556 0.43007022 0.42456692 0.39136817 0.33009008 0.25720509 0.18189031 0.11650668 0.07031579 0.04275381 0.02593154 0.01574394 0.00394326 + + + + 20 + + 837 + 881 + 864.7 + + + 1 + 0.00030097 0 0 0 0 0 0 0 0 0 0.00157217 0.00249886 0.01332037 0.02614866 0.05260479 0.10779709 0.22160755 0.39721628 0.60986885 0.81658883 0.9322445 0.97210033 0.97545482 0.97538048 0.97328205 0.97607828 0.98034955 0.98690928 0.99087465 0.99741818 0.99984673 0.99939141 0.99587928 0.99541228 1 0.99640762 0.92359433 0.74137684 0.48965971 0.25020643 0.11221246 0.04755984 0.02297815 0.01061438 0.00108149 + + + + 60 + + 932 + 958 + 945.1 + + + 1 + 0.01662953 0.06111857 0.17407094 0.38946454 0.6645915 0.87454114 0.93695988 0.96751014 0.9893391 0.9951269 1 0.97845762 0.98069118 0.9922335 0.98798379 0.99428313 0.98348041 0.97820013 0.95023367 0.95299604 0.92240308 0.85573828 0.70970227 0.46429542 0.21538427 0.06534121 0.01625596 + + + + 60 + + 1337 + 1412 + 1373.5 + + + 1 + 0.00024052 5.404e-05 3.052e-05 2.872e-05 7.632e-05 0.00010949 8.804e-05 0.00012356 0.00017424 0.0003317 0.00036891 0.0004467 0.00065919 0.0010913 0.00196903 0.00373668 0.00801754 0.01884719 0.04466732 0.10165546 0.20111776 0.34284841 0.50710992 0.6632068 0.78377143 0.86153862 0.91000261 0.94193255 0.96182259 0.97365119 0.98169786 0.98795826 0.99283342 0.99649788 0.99906011 1 0.99907734 0.99601604 0.9909083 0.98479854 0.97802142 0.97030114 0.96080954 0.94849765 0.93314108 0.91482336 0.8937997 0.86825426 0.83023193 0.76384193 0.65440009 0.50671604 0.35014737 0.21799972 0.12643091 0.06768988 0.0322709 0.013544 0.00544557 0.00237642 0.00111267 0.00053796 0.0003457 0.00017488 0.00021619 0.00019479 0.00010421 5.919e-05 5.109e-05 6.115e-05 5.527e-05 3.856e-05 3.147e-05 0.00012289 0.0001089 2.502e-05 + + + + 20 + + 1539 + 1682 + 1613.7 + + + 1 + 6.79e-06 6.66e-06 8e-06 2.734e-05 3.685e-05 8.851e-05 0.00014522 0.00024812 0.00047627 0.00056335 0.00065326 0.00089835 0.00114664 0.00165604 0.00241611 0.00350246 0.00524274 0.0081538 0.01237062 0.0186097 0.02721853 0.03879155 0.05379167 0.07353187 0.09932758 0.1334178 0.18029249 0.24484994 0.32834511 0.42749961 0.53576798 0.64570396 0.74245998 0.81447017 0.85866596 0.87924777 0.88665266 0.888727 0.89105732 0.89725046 0.90632982 0.91627527 0.9263751 0.93515828 0.94226446 0.94739906 0.95131987 0.95416808 0.95635128 0.95813297 0.96062738 0.96344083 0.96577764 0.96818134 0.97104025 0.97343195 0.97597444 0.97865413 0.97994672 0.98064126 0.98094979 0.98143338 0.98123856 0.98068083 0.98033995 0.98101894 0.98268503 0.98507875 0.98777658 0.9903608 0.99202087 0.9933069 0.99256744 0.99044883 0.98717314 0.98353656 0.9800432 0.97617287 0.97253451 0.96977033 0.96762556 0.9662626 0.96572411 0.96592079 0.96729798 0.96975438 0.97337748 0.97862858 0.98345358 0.98765317 0.9919238 0.99554959 0.99767411 0.99866451 0.99941783 0.99930984 0.99885298 0.99913515 0.99973164 0.99973592 1 0.9998438 0.9967639 0.99175576 0.9859206 0.97887302 0.97029262 0.96135891 0.95379752 0.94709017 0.94228614 0.93919512 0.93616637 0.92889205 0.9129921 0.88158383 0.82602164 0.74412949 0.64281662 0.53483955 0.42772166 0.32439525 0.23488131 0.16445229 0.11056237 0.07271886 0.04634859 0.02949618 0.01941871 0.0133487 0.00934594 0.00654231 0.00487921 0.00341903 0.00249864 0.00196431 0.00142754 0.00105878 0.00049978 0.00022833 0.00015999 3.415e-05 4.517e-05 1.313e-05 + + + + 20 + + 2078 + 2320 + 2202.4 + + + 1 + 0.00063835 0.00102286 0.00288712 0.00399879 0.00658916 0.00765458 0.00799918 0.00853524 0.00929493 0.00999614 0.01096645 0.01208363 0.01335837 0.01501119 0.01711931 0.01977307 0.02332743 0.02765779 0.03320435 0.04020464 0.04886709 0.0596238 0.07315348 0.09050885 0.11143964 0.13686671 0.16776886 0.20341457 0.24281992 0.28484195 0.32711894 0.36834301 0.40794043 0.4447145 0.47647207 0.50303896 0.52524762 0.54328057 0.55717994 0.5685619 0.57895708 0.58860881 0.59881758 0.60990899 0.62128986 0.63421311 0.64847648 0.66363778 0.67997936 0.69609688 0.71189957 0.7269499 0.74124079 0.75734734 0.77201504 0.78552587 0.79818641 0.80962939 0.81965718 0.82855741 0.83668178 0.84440292 0.85106862 0.85321701 0.85471321 0.8561428 0.85778963 0.8594989 0.86142876 0.86322831 0.86511218 0.8672932 0.86967076 0.87427502 0.87856212 0.88241466 0.88590611 0.8894516 0.89320419 0.8966738 0.89987484 0.90257636 0.90481219 0.90550545 0.90564491 0.90548208 0.90513822 0.90476379 0.90406427 0.90332978 0.90274309 0.90235795 0.90196488 0.90340528 0.90429478 0.90529761 0.90642862 0.90807348 0.91010493 0.91293181 0.91556686 0.91842631 0.92128288 0.92431702 0.92719913 0.92972159 0.93190455 0.93412538 0.93588954 0.93707083 0.93762594 0.93828534 0.93763643 0.94042634 0.94250397 0.94324531 0.94301861 0.94210283 0.94061808 0.93841726 0.93665003 0.93524569 0.93301102 0.92686708 0.92104485 0.91547175 0.91100989 0.90828339 0.9072733 0.90817907 0.91115631 0.91617845 0.92284525 0.92059829 0.91947472 0.91947973 0.92126575 0.92451632 0.92772589 0.93196884 0.93676408 0.94147739 0.94679545 0.95119533 0.95443018 0.95704142 0.95972628 0.9625372 0.96485326 0.96603599 0.96664138 0.96630455 0.96545713 0.96484036 0.96365512 0.96169531 0.95944859 0.95732078 0.95513625 0.95355574 0.95273072 0.95217795 0.95172542 0.9521403 0.95263595 0.95405248 0.95707559 0.96063594 0.96421772 0.96830187 0.97268597 0.97741944 0.98289489 0.9871429 0.99073348 0.99398244 0.99678431 0.99875181 1 0.9999284 0.9991523 0.99712951 0.99388228 0.98968273 0.98373274 0.97621057 0.96780985 0.95833495 0.94842856 0.93818752 0.9277078 0.91702104 0.90597951 0.89384371 0.88165575 0.86861704 0.85460324 0.84058628 0.82598123 0.80948042 0.79182917 0.7724052 0.74907137 0.72031195 0.68815487 0.65125598 0.6100244 0.56600904 0.52095058 0.47464344 0.42924778 0.38584718 0.34208462 0.30067509 0.26317221 0.22770037 0.19571781 0.16808736 0.14467686 0.12482737 0.10823403 0.09439655 0.08235799 0.07149445 0.0626855 0.05498009 0.04818852 0.04285814 0.03859244 0.03494044 0.03199172 0.02958044 0.02741084 0.02556884 0.02395058 0.02166741 0.0191457 0.01632139 0.0109837 0.00736032 0.00649061 0.00469736 0.00205874 + + + + 4.10137842 + 3.75605469 + 4.18741753 + 4.52205376 + 5.20680393 + 4.8729478 + 4.5356737 + 6.16247757 + 5.13772343 + 8.53898524 + 55.10485389 + 35.30373192 + 106.24732599 + + + SC_NODATA + 0 + + + SC_SATURATED_DEFECTIVE + 1 + + + SC_DARK_FEATURE_SHADOW + 2 + + + SC_CLOUD_SHADOW + 3 + + + SC_VEGETATION + 4 + + + SC_NOT_VEGETATED + 5 + + + SC_WATER + 6 + + + SC_UNCLASSIFIED + 7 + + + SC_CLOUD_MEDIUM_PROBA + 8 + + + SC_CLOUD_HIGH_PROBA + 9 + + + SC_THIN_CIRRUS + 10 + + + SC_SNOW_ICE + 11 + + + + + + + + + 40.64479480422486 115.81682739339685 40.65079881136531 117.1154430676197 39.66155122739065 117.11377991452629 39.655752572676114 115.83386830444628 40.64479480422486 115.81682739339685 + + + POINT + 1 + + + EPSG + GEOGRAPHIC + + + + + S2A_OPER_GIP_INVLOC_MPC__20171206T000000_V20150703T000000_21000101T000000_B00 + S2A_OPER_GIP_LREXTR_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_ATMIMA_MPC__20150605T094744_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_ATMSAD_MPC__20160729T000005_V20150703T000000_21000101T000000_B00 + S2A_OPER_GIP_BLINDP_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_CLOINV_MPC__20210609T000005_V20210823T030000_21000101T000000_B00 + S2A_OPER_GIP_CLOPAR_MPC__20220120T000001_V20220125T022000_21000101T000000_B00 + S2A_OPER_GIP_CONVER_MPC__20150710T131444_V20150627T000000_21000101T000000_B00 + S2A_OPER_GIP_DATATI_MPC__20151117T131048_V20150703T000000_21000101T000000_B00 + S2A_OPER_GIP_DECOMP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 + S2__OPER_GIP_EARMOD_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_ECMWFP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 + S2A_OPER_GIP_G2PARA_MPC__20231208T000027_V20231213T070000_21000101T000000_B00 + S2A_OPER_GIP_G2PARE_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_GEOPAR_MPC__20150605T094741_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_INTDET_MPC__20220120T000010_V20220125T022000_21000101T000000_B00 + S2A_OPER_GIP_JP2KPA_MPC__20220120T000006_V20220125T022000_21000101T000000_B00 + S2A_OPER_GIP_MASPAR_MPC__20220120T000009_V20220125T022000_21000101T000000_B00 + S2A_OPER_GIP_OLQCPA_MPC__20220715T000042_V20220830T002500_21000101T000000_B00 + S2A_OPER_GIP_PRDLOC_MPC__20180301T130000_V20180305T005000_21000101T000000_B00 + S2A_OPER_GIP_PROBAS_MPC__20240305T000510_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_R2ABCA_MPC__20240315T121000_V20240319T003000_21000101T000000_B00 + S2A_OPER_GIP_R2BINN_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_R2CRCO_MPC__20151023T224715_V20150622T224715_21000101T000000_B00 + S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2DENT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2DEPI_MPC__20230424T160000_V20230426T000000_21000101T000000_B00 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B12 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B03 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B07 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B09 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B10 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B01 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B05 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B8A + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B06 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B04 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B11 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B02 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B08 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B10 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B05 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B04 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B06 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B08 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B03 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B01 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B12 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B11 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B02 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B07 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B8A + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B09 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2NOMO_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_R2PARA_MPC__20221206T000009_V20221206T073000_21000101T000000_B00 + S2A_OPER_GIP_R2SWIR_MPC__20180406T000021_V20180604T100000_21000101T000000_B00 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_RESPAR_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_SPAMOD_MPC__20231122T110026_V20231123T010000_21000101T000000_B00 + S2A_OPER_GIP_TILPAR_MPC__20151209T095117_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B8A + S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B03 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B08 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131048_V20150703T000000_21000101T000000_B01 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B11 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B10 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B06 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B04 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B02 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B05 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131051_V20150703T000000_21000101T000000_B12 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B09 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B07 + S2__OPER_GIP_L2ACSC_MPC__20220121T000003_V20220125T022000_21000101T000000_B00 + S2__OPER_GIP_L2ACAC_MPC__20220121T000004_V20220125T022000_21000101T000000_B00 + S2__OPER_GIP_PROBA2_MPC__20231208T000510_V20231213T070000_21000101T000000_B00 + + + CopernicusDEM30 + S2__OPER_AUX_UT1UTC_PDMC_20240404T000000_V20240405T000000_20250404T000000 + + S2__OPER_AUX_ECMWFD_ADG__20240410T120000_V20240410T210000_20240412T150000 + + None + + GlobalSnowMap.tiff + ESACCI-LC-L4-WB-Map-150m-P13Y-2000-v4.0.tif + ESACCI-LC-L4-LCCS-Map-300m-P1Y-2015-v2.0.7.tif + ESACCI-LC-L4-Snow-Cond-500m-MONTHLY-2000-2012-v2.4 + + + 3.500058 + + 0.0 + 0 + + + + PASSED + PASSED + PASSED + PASSED + PASSED + PASSED + + + + + 3.354197 + 0.0 + 0.0 + 8.675177 + 0.268831 + 2.81222 + 83.179593 + 0.992827 + 0.571295 + 0.275278 + 0.038401 + 3.18638 + 0.0 + 0.0 + 0.0 + 0.0 + CAMS + 0.392921 + 1.224094 + AUX_ECMWFT + 357.927923 + + + +""" # noqa + class TestTileXML: """Test the SAFE TILE XML file handler. - - Since L1C/L2A share almost the same Tile XML, we just need to test L1C. + + Since L1C/L2A share almost the same Tile XML, we only use L1C Tile here. """ def setup_method(self): """Set up the test case.""" from satpy.readers.msi_safe import SAFEMSITileMDXML - filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") - self.l1c_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), filename_info, mock.MagicMock()) + l1c_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") + l2a_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L2A") + self.l1c_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), l1c_filename_info, mock.MagicMock()) + self.l2a_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), l2a_filename_info, mock.MagicMock()) - @pytest.mark.parametrize(("angle_name", "angle_block", "angle_type", "expected"), - [("satellite_zenith_angle", "Viewing_Incidence_Angles_Grids", "Zenith", + @pytest.mark.parametrize(("process_level","angle_name", "angle_block", "angle_type", "expected"), + [("L1C", "satellite_zenith_angle", "Viewing_Incidence_Angles_Grids", "Zenith", [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, @@ -896,7 +1453,7 @@ def setup_method(self): 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), - ("solar_zenith_angle_l2a", "Sun_Angles_Grid", "Zenith", + ("L2A", "solar_zenith_angle_l2a", "Sun_Angles_Grid", "Zenith", [[39.8824, 39.83721367, 39.79230847, 39.74758442, 39.7030415, 39.65867687, 39.61455566, 39.57061558, 39.52685664, 39.48331372], [39.78150175, 39.73629896, 39.69128852, 39.64643679, 39.6018404, @@ -917,23 +1474,52 @@ def setup_method(self): 38.84936063, 38.80464763, 38.76011645, 38.7157479, 38.67164839], [38.97531575, 38.92950771, 38.88389967, 38.83852091, 38.7933053, 38.74831897, 38.7034912, 38.65891427, 38.61446851, 38.57030388]]), - ("moon_zenith_angle", "Sun_Angles_Grid", "Zenith", None) + ("L1C", "moon_zenith_angle", "Sun_Angles_Grid", "Zenith", None) ]) - def test_angles(self, angle_name, angle_block, angle_type, expected): + def test_angles(self, process_level, angle_name, angle_block, angle_type, expected): """Test reading angles array.""" info = dict(xml_tag=angle_block, xml_item=angle_type) if "satellite" in angle_name else \ dict(xml_tag=angle_block + "/" + angle_type) - res = self.l1c_xml_tile_fh.get_dataset(make_dataid(name=angle_name, - resolution=60), info) + if process_level == "L1C": + res = self.l1c_xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) + else: + res = self.l2a_xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) if res is not None: res = res[::200, ::200] - if expected is not None: + if res is not None: np.testing.assert_allclose(res, expected) else: assert res is expected + def test_navigation(self): + """Test the navigation.""" + from pyproj import CRS + crs = CRS("EPSG:32616") + + dsid = make_dataid(name="B01", resolution=60) + result = self.l1c_xml_tile_fh.get_area_def(dsid) + area_extent = (499980.0, 3590220.0, 609780.0, 3700020.0) + assert result.crs == crs + np.testing.assert_allclose(result.area_extent, area_extent) + + +# class TestMTDXML: +# """Test the SAFE MTD XML file handler.""" +# +# def setup_method(self): +# """Set up the test case.""" +# from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML +# l1c_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") +# l2a_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L2A") +# self.l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), l1c_filename_info, mock.MagicMock()) +# self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), l1c_filename_info, mock.MagicMock(), mask_saturated=True) +# self.l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), l1c_filename_info, mock.MagicMock(), mask_saturated=True) +# +# def test_calibration_and_masking(self, process_level, calibration): + + class TestMTDXML: """Test the SAFE MTD XML file handler.""" @@ -946,40 +1532,6 @@ def setup_method(self): self.l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), filename_info, mock.MagicMock()) self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=True) - def test_satellite_zenith_array(self): - """Test reading the satellite zenith array.""" - info = dict(xml_tag="Viewing_Incidence_Angles_Grids", xml_item="Zenith") - - expected_data = np.array([[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, - 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], - [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, - 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], - [11.6823579, 10.7763071, 9.86302106, 8.93879112, 8.04005637, - 7.15028077, 6.21461062, 5.25780953, 4.39876601, 3.68620793], - [11.06724679, 10.35723901, 9.63958896, 8.73072512, 7.83680864, - 6.94792574, 5.9889201, 5.05445872, 4.26089708, 3.50984272], - [6.28411038, 6.28411038, 6.28411038, 6.28411038, 6.28411038, - 5.99769643, 5.62586167, 4.85165966, 4.13238314, 3.33781401], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]) - - res1 = self.l1c_xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle", - resolution=60), - info)[::200, ::200] - res2 = self.l1c_xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle_l2a", - resolution=60), - info)[::200, ::200] - np.testing.assert_allclose(res1, expected_data) - np.testing.assert_allclose(res2, expected_data) - def test_old_xml_calibration(self): """Test the calibration of older data formats (no offset).""" fake_data = xr.DataArray([[[0, 1, 2, 3], @@ -1039,18 +1591,6 @@ def test_xml_calibration_to_radiance(self): [-250.828757, 0., 16251.99095, np.inf]]]) np.testing.assert_allclose(result, expected) - def test_xml_navigation(self): - """Test the navigation.""" - from pyproj import CRS - crs = CRS("EPSG:32616") - - dsid = make_dataid(name="B01", resolution=60) - result = self.l1c_xml_tile_fh.get_area_def(dsid) - - area_extents = (499980.0, 3590220.0, 609780.0, 3700020.0) - assert result.crs == crs - np.testing.assert_allclose(result.area_extent, area_extents) - class TestSAFEMSIL1C: """Test case for image reading (jp2k).""" From e0c06de89e5aaa93bd9e1cdcb9cc377b865c2195 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 23:43:28 +0800 Subject: [PATCH 343/481] Update __init__.py --- satpy/composites/__init__.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 0b4d01c833..a390e9dd16 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1674,22 +1674,22 @@ class BackgroundCompositor(GenericCompositor): The output image mode will be determined by both foreground and background. Generally, when the background has an alpha band, the output image will also have one. - # L/L -> L - # L/LA -> LA - # L/RGB -> RGB - # L/RGBA -> RGBA - # LA/L -> L - # LA/LA -> LA - # LA/RGB -> RGB - # LA/RGBA -> RGBA - # RGB/L -> RGB - # RGB/LA -> RGBA - # RGB/RGB -> RGB - # RGB/RGBA -> RGBA - # RGBA/L -> RGB - # RGBA/LA -> RGBA - # RGBA/RGB -> RGB - # RGBA/RGBA -> RGBA + # L/L -> L + # L/LA -> LA + # L/RGB -> RGB + # L/RGBA -> RGBA + # LA/L -> L + # LA/LA -> LA + # LA/RGB -> RGB + # LA/RGBA -> RGBA + # RGB/L -> RGB + # RGB/LA -> RGBA + # RGB/RGB -> RGB + # RGB/RGBA -> RGBA + # RGBA/L -> RGB + # RGBA/LA -> RGBA + # RGBA/RGB -> RGB + # RGBA/RGBA -> RGBA """ From 82899d98af95bd6a471a0afcb5bb2313ffd41a61 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Fri, 19 Apr 2024 10:50:53 -0500 Subject: [PATCH 344/481] Add missing pyerfa dependency --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ce4a16006f..8955a154f1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -82,6 +82,7 @@ jobs: scipy conda remove --force-remove -y pykdtree pyresample python-geotiepoints pyhdf netcdf4 h5py cftime astropy pyerfa python -m pip install --upgrade --no-deps --pre --no-build-isolation \ + pyerfa \ git+https://github.com/storpipfugl/pykdtree \ git+https://github.com/pytroll/pyresample \ git+https://github.com/pytroll/trollimage \ From 057e89ec69d2cf2715c42eb4a1ff8692591c1b46 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Fri, 19 Apr 2024 23:59:07 +0800 Subject: [PATCH 345/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index e13a923cd4..453d2f67c7 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1515,9 +1515,20 @@ def test_navigation(self): # l2a_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L2A") # self.l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), l1c_filename_info, mock.MagicMock()) # self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), l1c_filename_info, mock.MagicMock(), mask_saturated=True) -# self.l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), l1c_filename_info, mock.MagicMock(), mask_saturated=True) +# self.l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), l2a_filename_info, mock.MagicMock(), mask_saturated=True) +# self.fake_data = xr.DataArray([[[0, 1, 2, 3], +# [4, 1000, 65534, 65535]]], +# dims=["band", "x", "y"]) # -# def test_calibration_and_masking(self, process_level, calibration): +# def test_old_xml_calibration(self): +# """Test the calibration of older data formats (no offset).""" +# fake_data = xr.DataArray([[[0, 1, 2, 3], +# [4, 1000, 65534, 65535]]], +# dims=["band", "x", "y"]) +# result = self.l1c_old_xml_fh.calibrate_to_reflectances(fake_data, "B01") +# np.testing.assert_allclose(result, [[[np.nan, 0.01, 0.02, 0.03], +# [0.04, 10, 655.34, np.inf]]]) + From 807e0a4cdc1d657a553b300ee8e02a02f86ee56f Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 00:09:19 +0800 Subject: [PATCH 346/481] Update __init__.py --- satpy/composites/__init__.py | 51 +++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index a390e9dd16..746e6ddf37 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1674,22 +1674,41 @@ class BackgroundCompositor(GenericCompositor): The output image mode will be determined by both foreground and background. Generally, when the background has an alpha band, the output image will also have one. - # L/L -> L - # L/LA -> LA - # L/RGB -> RGB - # L/RGBA -> RGBA - # LA/L -> L - # LA/LA -> LA - # LA/RGB -> RGB - # LA/RGBA -> RGBA - # RGB/L -> RGB - # RGB/LA -> RGBA - # RGB/RGB -> RGB - # RGB/RGBA -> RGBA - # RGBA/L -> RGB - # RGBA/LA -> RGBA - # RGBA/RGB -> RGB - # RGBA/RGBA -> RGBA + ============ ============ ======== + Foreground Background Result + ============ ============ ======== + L L L + ------------------------------------ + L LA LA + ------------------------------------ + L RGB RGB + ------------------------------------ + L RGBA RGBA + ------------------------------------ + LA L L + ------------------------------------ + LA LA LA + ------------------------------------ + LA RGB RGB + ------------------------------------ + LA RGBA RGBA + ------------------------------------ + RGB L RGB + ------------------------------------ + RGB LA RGBA + ------------------------------------ + RGB RGB RGB + ------------------------------------ + RGB RGBA RGBA + ------------------------------------ + RGBA L RGB + ------------------------------------ + RGBA LA RGBA + ------------------------------------ + RGBA RGB RGB + ------------------------------------ + RGBA RGBA RGBA + ------------------------------------ """ From 5f8c3ebfdc98fd1393f24ba6e19d57cb8aa38b46 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 00:16:56 +0800 Subject: [PATCH 347/481] 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 746e6ddf37..1539d349bd 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1709,6 +1709,7 @@ class BackgroundCompositor(GenericCompositor): ------------------------------------ RGBA RGBA RGBA ------------------------------------ + ============ ============ ======== """ From 58901ef53485c109bacf5652fb2d85976e29c22c Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 10:25:31 +0800 Subject: [PATCH 348/481] 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 1539d349bd..52832d34d0 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1674,8 +1674,9 @@ class BackgroundCompositor(GenericCompositor): The output image mode will be determined by both foreground and background. Generally, when the background has an alpha band, the output image will also have one. + ============ ============ ======== - Foreground Background Result + Foreground Background Result ============ ============ ======== L L L ------------------------------------ From 00f1710ffe179f5f002f92144c18d01588cbfd66 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 10:39:20 +0800 Subject: [PATCH 349/481] Update __init__.py --- satpy/composites/__init__.py | 64 ++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/satpy/composites/__init__.py b/satpy/composites/__init__.py index 52832d34d0..41c0fbc368 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1678,38 +1678,38 @@ class BackgroundCompositor(GenericCompositor): ============ ============ ======== Foreground Background Result ============ ============ ======== - L L L - ------------------------------------ - L LA LA - ------------------------------------ - L RGB RGB - ------------------------------------ - L RGBA RGBA - ------------------------------------ - LA L L - ------------------------------------ - LA LA LA - ------------------------------------ - LA RGB RGB - ------------------------------------ - LA RGBA RGBA - ------------------------------------ - RGB L RGB - ------------------------------------ - RGB LA RGBA - ------------------------------------ - RGB RGB RGB - ------------------------------------ - RGB RGBA RGBA - ------------------------------------ - RGBA L RGB - ------------------------------------ - RGBA LA RGBA - ------------------------------------ - RGBA RGB RGB - ------------------------------------ - RGBA RGBA RGBA - ------------------------------------ + L L L + ------------ ------------ -------- + L LA LA + ------------ ------------ -------- + L RGB RGB + ------------ ------------ -------- + L RGBA RGBA + ------------ ------------ -------- + LA L L + ------------ ------------ -------- + LA LA LA + ------------ ------------ -------- + LA RGB RGB + ------------ ------------ -------- + LA RGBA RGBA + ------------ ------------ -------- + RGB L RGB + ------------ ------------ -------- + RGB LA RGBA + ------------ ------------ -------- + RGB RGB RGB + ------------ ------------ -------- + RGB RGBA RGBA + ------------ ------------ -------- + RGBA L RGB + ------------ ------------ -------- + RGBA LA RGBA + ------------ ------------ -------- + RGBA RGB RGB + ------------ ------------ -------- + RGBA RGBA RGBA + ------------ ------------ -------- ============ ============ ======== """ From 05fdcbf8c2300ebd195c3fc08805dab58e2225ec Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 10:47:01 +0800 Subject: [PATCH 350/481] Update __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 41c0fbc368..9ab658954f 100644 --- a/satpy/composites/__init__.py +++ b/satpy/composites/__init__.py @@ -1709,7 +1709,6 @@ class BackgroundCompositor(GenericCompositor): RGBA RGB RGB ------------ ------------ -------- RGBA RGBA RGBA - ------------ ------------ -------- ============ ============ ======== """ From bfa5f4b6866db59090173c30f6f4cfc2ec599a35 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 12:14:12 +0800 Subject: [PATCH 351/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 179 ++++++++++++---------- 1 file changed, 94 insertions(+), 85 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 453d2f67c7..32832b17e5 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1419,7 +1419,7 @@ class TestTileXML: """Test the SAFE TILE XML file handler. - Since L1C/L2A share almost the same Tile XML, we only use L1C Tile here. + Since L1C/L2A share almost the same Tile XML structure, we only use L1C Tile here. """ @@ -1432,7 +1432,8 @@ def setup_method(self): self.l2a_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), l2a_filename_info, mock.MagicMock()) @pytest.mark.parametrize(("process_level","angle_name", "angle_block", "angle_type", "expected"), - [("L1C", "satellite_zenith_angle", "Viewing_Incidence_Angles_Grids", "Zenith", + [ + ("L1C", "satellite_zenith_angle", "Viewing_Incidence_Angles_Grids", "Zenith", [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, @@ -1505,102 +1506,110 @@ def test_navigation(self): np.testing.assert_allclose(result.area_extent, area_extent) -# class TestMTDXML: -# """Test the SAFE MTD XML file handler.""" -# -# def setup_method(self): -# """Set up the test case.""" -# from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML -# l1c_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") -# l2a_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L2A") -# self.l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), l1c_filename_info, mock.MagicMock()) -# self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), l1c_filename_info, mock.MagicMock(), mask_saturated=True) -# self.l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), l2a_filename_info, mock.MagicMock(), mask_saturated=True) -# self.fake_data = xr.DataArray([[[0, 1, 2, 3], -# [4, 1000, 65534, 65535]]], -# dims=["band", "x", "y"]) -# -# def test_old_xml_calibration(self): -# """Test the calibration of older data formats (no offset).""" -# fake_data = xr.DataArray([[[0, 1, 2, 3], -# [4, 1000, 65534, 65535]]], -# dims=["band", "x", "y"]) -# result = self.l1c_old_xml_fh.calibrate_to_reflectances(fake_data, "B01") -# np.testing.assert_allclose(result, [[[np.nan, 0.01, 0.02, 0.03], -# [0.04, 10, 655.34, np.inf]]]) - - - - class TestMTDXML: """Test the SAFE MTD XML file handler.""" def setup_method(self): """Set up the test case.""" - from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML - filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") - self.l1c_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), filename_info, mock.MagicMock()) - self.l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), filename_info, mock.MagicMock()) - self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=True) + self.l1c_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") + self.l2a_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L2A") + self.fake_data = xr.DataArray([[[0, 1, 2, 3], + [4, 1000, 65534, 65535]]], + dims=["band", "x", "y"]) - def test_old_xml_calibration(self): - """Test the calibration of older data formats (no offset).""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.l1c_old_xml_fh.calibrate_to_reflectances(fake_data, "B01") - np.testing.assert_allclose(result, [[[np.nan, 0.01, 0.02, 0.03], - [0.04, 10, 655.34, np.inf]]]) + @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), + [ + ("L1C", True, "B01", [[[np.nan, -9.99, -9.98, -9.97], + [-9.96, 0, 645.34, np.inf]]]), + ("L1C", False, "B10", [[[np.nan, -19.99, -19.98, -19.97], + [-19.96, -10, 635.34, 635.35]]]), + ("oldL1C", True, "B01", [[[np.nan, 0.01, 0.02, 0.03], + [0.04, 10, 655.34, np.inf]]]), + ("L2A", False, "B03", [[[np.nan, -9.99, -9.98, -9.97], + [-9.96, 0, 645.34, 645.35]]]), + ]) + def test_xml_calibration_to_reflectance(self, process_level, mask_saturated, band_name, expected): + """Test the calibration to reflectance.""" + from satpy.readers.msi_safe import SAFEMSIMDXML + l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), self.l1c_filename_info, mock.MagicMock()) + l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.l1c_filename_info, mock.MagicMock(), + mask_saturated=mask_saturated) + l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), self.l2a_filename_info, mock.MagicMock(), + mask_saturated=mask_saturated) - def test_xml_calibration(self): - """Test the calibration with radiometric offset.""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.l1c_xml_fh.calibrate_to_reflectances(fake_data, "B01") - np.testing.assert_allclose(result, [[[np.nan, 0.01 - 10, 0.02 - 10, 0.03 - 10], - [0.04 - 10, 0, 655.34 - 10, np.inf]]]) + if process_level == "oldL1C": + result = l1c_old_xml_fh.calibrate_to_reflectances(self.fake_data, band_name) + elif process_level == "L1C": + result = l1c_xml_fh.calibrate_to_reflectances(self.fake_data, band_name) + else: + result = l2a_xml_fh.calibrate_to_reflectances(self.fake_data, band_name) - def test_xml_calibration_to_counts(self): - """Test the calibration to counts.""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.l1c_xml_fh._sanitize_data(fake_data) - np.testing.assert_allclose(result, [[[np.nan, 1, 2, 3], - [4, 1000, 65534, np.inf]]]) + np.testing.assert_allclose(result, expected) - def test_xml_calibration_unmasked_saturated(self): - """Test the calibration with radiometric offset but unmasked saturated pixels.""" + @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), + [ + ("L1C", True, "B01", [[[np.nan, -251.584265, -251.332429, -251.080593], + [-250.828757, 0., 16251.99095, np.inf]]]), + ("L1C", False, "B10", [[[np.nan, -35.465976, -35.448234, -35.430493], + [-35.412751, -17.741859, 1127.211275, 1127.229017]]]), + ("oldL1C", True, "B01", [[[np.nan, 0.251836101, 0.503672202, 0.755508303], + [1.00734440, 251.836101, 16503.8271, np.inf]]]), + ("L2A", False, "B03", [[[np.nan, -238.571863, -238.333052, -238.094241], + [-237.855431, 0, 15411.407995, 15411.646806]]]), + ]) + def test_xml_calibration_to_radiance(self, process_level, mask_saturated, band_name, expected): + """Test the calibration to reflectance.""" from satpy.readers.msi_safe import SAFEMSIMDXML - filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") - self.l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=False) + l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), self.l1c_filename_info, mock.MagicMock()) + l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.l1c_filename_info, mock.MagicMock(), + mask_saturated=mask_saturated) + l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), self.l2a_filename_info, mock.MagicMock(), + mask_saturated=mask_saturated) + if process_level == "oldL1C": + result = l1c_old_xml_fh.calibrate_to_radiances(self.fake_data, band_name) + elif process_level == "L1C": + result = l1c_xml_fh.calibrate_to_radiances(self.fake_data, band_name) + else: + result = l2a_xml_fh.calibrate_to_radiances(self.fake_data, band_name) - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.l1c_xml_fh.calibrate_to_reflectances(fake_data, "B01") - np.testing.assert_allclose(result, [[[np.nan, 0.01 - 10, 0.02 - 10, 0.03 - 10], - [0.04 - 10, 0, 655.34 - 10, 655.35 - 10]]]) + np.testing.assert_allclose(result, expected) - def test_xml_calibration_with_different_offset(self): - """Test the calibration with a different offset.""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.l1c_xml_fh.calibrate_to_reflectances(fake_data, "B10") - np.testing.assert_allclose(result, [[[np.nan, 0.01 - 20, 0.02 - 20, 0.03 - 20], - [0.04 - 20, -10, 655.34 - 20, np.inf]]]) + @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), + [ + ("L1C", True, "B01", None), + ("L2A", False, "AOT", [[[np.nan, 0.001, 0.002, 0.003], + [0.004, 1., 65.534, 65.535]]]), + ("L2A", True, "WVP", [[[np.nan, 0.001, 0.002, 0.003], + [0.004, 1., 65.534, np.inf]]]), + ("L2A", False, "CLOUD", None), + ]) + def test_xml_calibration_to_atmospheric(self, process_level, mask_saturated, band_name, expected): + """Test the calibration to L2A atmospheric products.""" + from satpy.readers.msi_safe import SAFEMSIMDXML + l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.l1c_filename_info, mock.MagicMock(), + mask_saturated=mask_saturated) + l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), self.l2a_filename_info, mock.MagicMock(), + mask_saturated=mask_saturated) + if process_level == "L1C": + result = l1c_xml_fh.calibrate_to_atmospheric(self.fake_data, band_name) + else: + result = l2a_xml_fh.calibrate_to_atmospheric(self.fake_data, band_name) + + if result is not None: + np.set_printoptions(suppress=True) + np.testing.assert_allclose(result, expected) + else: + assert result is expected + + def test_xml_calibration_to_counts(self): + """Test the calibration to counts.""" + from satpy.readers.msi_safe import SAFEMSIMDXML + l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.l1c_filename_info, mock.MagicMock(), + mask_saturated=True) + result = l1c_xml_fh._sanitize_data(self.fake_data) + np.testing.assert_allclose(result, [[[np.nan, 1, 2, 3], + [4, 1000, 65534, np.inf]]]) - def test_xml_calibration_to_radiance(self): - """Test the calibration with a different offset.""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.l1c_xml_fh.calibrate_to_radiances(fake_data, "B01") - expected = np.array([[[np.nan, -251.584265, -251.332429, -251.080593], - [-250.828757, 0., 16251.99095, np.inf]]]) - np.testing.assert_allclose(result, expected) class TestSAFEMSIL1C: From c038cfdf1dff02552980f7d966b90bbdfc7a61d6 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 12:14:32 +0800 Subject: [PATCH 352/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 32832b17e5..77cd49a9e8 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1611,7 +1611,6 @@ def test_xml_calibration_to_counts(self): [4, 1000, 65534, np.inf]]]) - class TestSAFEMSIL1C: """Test case for image reading (jp2k).""" From e00e4d3cdd498a013bd6466f5986f81b5fc22025 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 12:15:21 +0800 Subject: [PATCH 353/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 77cd49a9e8..6a0b8d9275 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1596,7 +1596,6 @@ def test_xml_calibration_to_atmospheric(self, process_level, mask_saturated, ban result = l2a_xml_fh.calibrate_to_atmospheric(self.fake_data, band_name) if result is not None: - np.set_printoptions(suppress=True) np.testing.assert_allclose(result, expected) else: assert result is expected From e86b122dcc8e93abfac23fdc96a2db8129e57365 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 13:57:34 +0800 Subject: [PATCH 354/481] fix --- satpy/readers/msi_safe.py | 6 +- satpy/tests/reader_tests/test_msi_safe.py | 77 ++++++++++++++++++----- 2 files changed, 64 insertions(+), 19 deletions(-) diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index 7bf7b537a6..d99101f1bf 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -86,6 +86,8 @@ def get_dataset(self, key, info): logger.debug("Reading %s.", key["name"]) proj = self._read_from_file(key) + if proj is None: + return proj.attrs = info.copy() proj.attrs["units"] = "%" proj.attrs["platform_name"] = self.platform_name @@ -164,8 +166,8 @@ def calibrate_to_reflectances(self, data, band_name): def calibrate_to_atmospheric(self, data, band_name): """Calibrate L2A AOT/WVP product.""" - atmospheric_products = ["AOT", "WVP"] - if self.process_level == "L1C" or (self.process_level == "L2A" and band_name not in atmospheric_products): + atmospheric_bands = ["AOT", "WVP"] + if self.process_level == "L1C" or (self.process_level == "L2A" and band_name not in atmospheric_bands): return quantification = float(self.root.find(f".//{band_name}_QUANTIFICATION_VALUE").text) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 6a0b8d9275..af93939c20 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1615,26 +1615,69 @@ class TestSAFEMSIL1C: def setup_method(self): """Set up the test.""" - from satpy.readers.msi_safe import SAFEMSITileMDXML - self.filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B01", dtile_number=None, - process_level="L1C") self.fake_data = xr.Dataset({"band_data": xr.DataArray([[[0, 1], [65534, 65535]]], dims=["band", "x", "y"])}) - self.tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), - self.filename_info, mock.MagicMock()) - @pytest.mark.parametrize(("mask_saturated", "calibration", "expected"), - [(True, "reflectance", [[np.nan, 0.01 - 10], [645.34, np.inf]]), - (False, "reflectance", [[np.nan, 0.01 - 10], [645.34, 645.35]]), - (True, "radiance", [[np.nan, -251.58426503], [16251.99095011, np.inf]]), - (False, "counts", [[np.nan, 1], [65534, 65535]])]) - def test_calibration_and_masking(self, mask_saturated, calibration, expected): + + @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "calibration", "expected"), + [ + ("L1C", True, "B01", "reflectance", [[np.nan, -9.99], [645.34, np.inf]]), + ("L1C", False, "B02", "radiance", [[np.nan, -262.148396], [16934.419021, 16934.681431]]), + ("L1C", True, "B03", "counts", [[np.nan, 1], [65534, np.inf]]), + ("L1C", True, "B01", "aerosol_thickness", None), + ("L2A", False, "AOT_L2A", "aerosol_thickness", [[np.nan, 0.001], [65.534, 65.535]]), + ("L2A", True, "WVP_L2A", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), + ("L2A", True, "SNOW_L2A", "water_vapor", None), + ]) + def test_calibration_and_masking(self, process_level, mask_saturated, band_name, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" - from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML + from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML, SAFEMSITileMDXML + l1c_filename_info = dict(observation_time=None, fmission_id="S2A", band_name=band_name, dtile_number=None, + process_level="L1C") + l2a_filename_info = dict(observation_time=None, fmission_id="S2A", band_name=band_name.replace("_L2A", ""), + dtile_number=None, process_level="L2A") + l1c_tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), l1c_filename_info, + mock.MagicMock()) + l2a_tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), l2a_filename_info, + mock.MagicMock()) + l1c_mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), l1c_filename_info, mock.MagicMock(), + mask_saturated=mask_saturated) + l2a_mda = SAFEMSIMDXML(StringIO(mtd_l2a_xml), l2a_filename_info, mock.MagicMock(), + mask_saturated=mask_saturated) - mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) - self.jp2_fh = SAFEMSIL1C("somefile", self.filename_info, mock.MagicMock(), mda, self.tile_mda) + if process_level == "L1C": + jp2_fh = SAFEMSIL1C("somefile", l1c_filename_info, mock.MagicMock(), l1c_mda, l1c_tile_mda) + else: + jp2_fh = SAFEMSIL1C("somefile", l2a_filename_info, mock.MagicMock(), l2a_mda, l2a_tile_mda) with mock.patch("xarray.open_dataset", return_value=self.fake_data): - res = self.jp2_fh.get_dataset(make_dataid(name="B01", calibration=calibration), info=dict()) - np.testing.assert_allclose(res, expected) + res = jp2_fh.get_dataset(make_dataid(name=band_name, calibration=calibration), info=dict()) + if res is not None: + np.testing.assert_allclose(res, expected) + else: + assert res is expected + + def test_filename_dsname_mismatch(self): + """Test when satpy's dataset name and file's band name mismatch, the data and its area definition should + both be None. + + """ + from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML, SAFEMSITileMDXML + l1c_filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B01", dtile_number=None, + process_level="L1C") + l2a_filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B10", dtile_number=None, + process_level="L2A") + l1c_tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), l1c_filename_info, + mock.MagicMock()) + l2a_tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), l2a_filename_info, + mock.MagicMock()) + l1c_mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), l1c_filename_info, mock.MagicMock(), mask_saturated=True) + l2a_mda = SAFEMSIMDXML(StringIO(mtd_l2a_xml), l2a_filename_info, mock.MagicMock(), mask_saturated=True) + l1c_jp2_fh = SAFEMSIL1C("somefile", l1c_filename_info, mock.MagicMock(), l1c_mda, l1c_tile_mda) + l2a_jp2_fh = SAFEMSIL1C("somefile", l2a_filename_info, mock.MagicMock(), l2a_mda, l2a_tile_mda) + + with mock.patch("xarray.open_dataset", return_value=self.fake_data): + res1 = l1c_jp2_fh.get_dataset(make_dataid(name="B02"), info=dict()) + res2 = l1c_jp2_fh.get_dataset(make_dataid(name="B10_L2A"), info=dict()) + res3 = l1c_jp2_fh.get_area_def(make_dataid(name="B02")) + res4 = l1c_jp2_fh.get_area_def(make_dataid(name="B10_L2A")) + assert res1 is None and res2 is None and res3 is None and res4 is None \ No newline at end of file From 6b53da032b9c06055e63db325271e6a1003bbf8b Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 14:02:22 +0800 Subject: [PATCH 355/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index af93939c20..776547a953 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1657,10 +1657,7 @@ def test_calibration_and_masking(self, process_level, mask_saturated, band_name, assert res is expected def test_filename_dsname_mismatch(self): - """Test when satpy's dataset name and file's band name mismatch, the data and its area definition should - both be None. - - """ + """Test when dataset name and file name mismatch, the data and its area definition should both be None.""" from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML, SAFEMSITileMDXML l1c_filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B01", dtile_number=None, process_level="L1C") @@ -1675,9 +1672,13 @@ def test_filename_dsname_mismatch(self): l1c_jp2_fh = SAFEMSIL1C("somefile", l1c_filename_info, mock.MagicMock(), l1c_mda, l1c_tile_mda) l2a_jp2_fh = SAFEMSIL1C("somefile", l2a_filename_info, mock.MagicMock(), l2a_mda, l2a_tile_mda) - with mock.patch("xarray.open_dataset", return_value=self.fake_data): + with (mock.patch("xarray.open_dataset", return_value=self.fake_data)): res1 = l1c_jp2_fh.get_dataset(make_dataid(name="B02"), info=dict()) - res2 = l1c_jp2_fh.get_dataset(make_dataid(name="B10_L2A"), info=dict()) + res2 = l2a_jp2_fh.get_dataset(make_dataid(name="B11_L2A"), info=dict()) res3 = l1c_jp2_fh.get_area_def(make_dataid(name="B02")) - res4 = l1c_jp2_fh.get_area_def(make_dataid(name="B10_L2A")) - assert res1 is None and res2 is None and res3 is None and res4 is None \ No newline at end of file + res4 = l2a_jp2_fh.get_area_def(make_dataid(name="B11_L2A")) + assert res1 is None + assert res2 is None + assert res3 is None + assert res4 is None + \ No newline at end of file From 77b1753929e9e26acc71735e983d90c4f40635a0 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 14:03:34 +0800 Subject: [PATCH 356/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 776547a953..f9e19f790f 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1681,4 +1681,3 @@ def test_filename_dsname_mismatch(self): assert res2 is None assert res3 is None assert res4 is None - \ No newline at end of file From a788854b96be35f030ebf6869fe52f0a3e6c3ea8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 20 Apr 2024 06:17:02 +0000 Subject: [PATCH 357/481] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- satpy/tests/reader_tests/test_msi_safe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index f9e19f790f..2408b0d491 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1357,7 +1357,7 @@ S2__OPER_GIP_L2ACSC_MPC__20220121T000003_V20220125T022000_21000101T000000_B00 S2__OPER_GIP_L2ACAC_MPC__20220121T000004_V20220125T022000_21000101T000000_B00 S2__OPER_GIP_PROBA2_MPC__20231208T000510_V20231213T070000_21000101T000000_B00 - + CopernicusDEM30 S2__OPER_AUX_UT1UTC_PDMC_20240404T000000_V20240405T000000_20250404T000000 From fe8ac5cee6f14dc520dae0c21f0de7172801b0de Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 16:34:25 +0800 Subject: [PATCH 358/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 236 +++++++++------------- 1 file changed, 98 insertions(+), 138 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 2408b0d491..03c52ac22e 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1415,6 +1415,38 @@ """ # noqa +PROCESS_LEVELS = ["L1C", "oldL1C", "L2A"] +MTD_XMLS = [mtd_l1c_xml, mtd_l1c_old_xml, mtd_l2a_xml] +TILE_XMLS = [mtd_l1c_tile_xml, mtd_l1c_tile_xml, mtd_l1c_tile_xml] + +def mtd_xml_builder(process_level, mask_saturated=True, band_name=None): + """Build fake SAFE MTD XML.""" + from satpy.readers.msi_safe import SAFEMSIMDXML + filename_info = dict(observation_time=None, dtile_number=None, band_name=band_name, fmission_id="S2A", + process_level=process_level.replace("old", "")) + xml_fh = SAFEMSIMDXML(StringIO(MTD_XMLS[PROCESS_LEVELS.index(process_level)]), + filename_info, mock.MagicMock(), mask_saturated=mask_saturated) + return xml_fh + +def tile_xml_builder(process_level, band_name=None): + """Build fake SAFE Tile XML.""" + from satpy.readers.msi_safe import SAFEMSITileMDXML + filename_info = dict(observation_time=None, dtile_number=None, band_name=band_name, fmission_id="S2A", + process_level=process_level.replace("old", "")) + xml_tile_fh = SAFEMSITileMDXML(BytesIO(TILE_XMLS[PROCESS_LEVELS.index(process_level)]), + filename_info, mock.MagicMock()) + return xml_tile_fh + +def jp2_builder(process_level, band_name, mask_saturated=True): + """Build fake SAFE jp2 image file.""" + from satpy.readers.msi_safe import SAFEMSIL1C + filename_info = dict(observation_time=None, dtile_number=None, band_name=band_name, fmission_id="S2A", + process_level=process_level.replace("old", "")) + xml_xh = mtd_xml_builder(process_level, mask_saturated, band_name) + tile_xml_xh = tile_xml_builder(process_level, band_name) + jp2_fh = SAFEMSIL1C("somefile", filename_info, mock.MagicMock(), xml_xh, tile_xml_xh) + return jp2_fh + class TestTileXML: """Test the SAFE TILE XML file handler. @@ -1423,17 +1455,9 @@ class TestTileXML: """ - def setup_method(self): - """Set up the test case.""" - from satpy.readers.msi_safe import SAFEMSITileMDXML - l1c_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") - l2a_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L2A") - self.l1c_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), l1c_filename_info, mock.MagicMock()) - self.l2a_xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_l1c_tile_xml), l2a_filename_info, mock.MagicMock()) - - @pytest.mark.parametrize(("process_level","angle_name", "angle_block", "angle_type", "expected"), + @pytest.mark.parametrize(("process_level","angle_name", "angle_tag", "expected"), [ - ("L1C", "satellite_zenith_angle", "Viewing_Incidence_Angles_Grids", "Zenith", + ("L1C", "satellite_zenith_angle", ("Viewing_Incidence_Angles_Grids", "Zenith"), [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, @@ -1454,7 +1478,7 @@ def setup_method(self): 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), - ("L2A", "solar_zenith_angle_l2a", "Sun_Angles_Grid", "Zenith", + ("L2A", "solar_zenith_angle_l2a", ("Sun_Angles_Grid", "Zenith"), [[39.8824, 39.83721367, 39.79230847, 39.74758442, 39.7030415, 39.65867687, 39.61455566, 39.57061558, 39.52685664, 39.48331372], [39.78150175, 39.73629896, 39.69128852, 39.64643679, 39.6018404, @@ -1475,17 +1499,15 @@ def setup_method(self): 38.84936063, 38.80464763, 38.76011645, 38.7157479, 38.67164839], [38.97531575, 38.92950771, 38.88389967, 38.83852091, 38.7933053, 38.74831897, 38.7034912, 38.65891427, 38.61446851, 38.57030388]]), - ("L1C", "moon_zenith_angle", "Sun_Angles_Grid", "Zenith", None) + ("L1C", "moon_zenith_angle", ("Sun_Angles_Grid", "Zenith"), None) ]) - def test_angles(self, process_level, angle_name, angle_block, angle_type, expected): + def test_angles(self, process_level, angle_name, angle_tag, expected): """Test reading angles array.""" - info = dict(xml_tag=angle_block, xml_item=angle_type) if "satellite" in angle_name else \ - dict(xml_tag=angle_block + "/" + angle_type) + info = dict(xml_tag=angle_tag[0], xml_item=angle_tag[1]) if "satellite" in angle_name else \ + dict(xml_tag=angle_tag[0] + "/" + angle_tag[1]) + xml_tile_fh = tile_xml_builder(process_level) - if process_level == "L1C": - res = self.l1c_xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) - else: - res = self.l2a_xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) + res = xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) if res is not None: res = res[::200, ::200] @@ -1500,7 +1522,8 @@ def test_navigation(self): crs = CRS("EPSG:32616") dsid = make_dataid(name="B01", resolution=60) - result = self.l1c_xml_tile_fh.get_area_def(dsid) + xml_tile_fh = tile_xml_builder("L1C") + result = xml_tile_fh.get_area_def(dsid) area_extent = (499980.0, 3590220.0, 609780.0, 3700020.0) assert result.crs == crs np.testing.assert_allclose(result.area_extent, area_extent) @@ -1511,68 +1534,45 @@ class TestMTDXML: def setup_method(self): """Set up the test case.""" - self.l1c_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L1C") - self.l2a_filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A", process_level="L2A") - self.fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) + self.fake_data = xr.DataArray([[[0, 1, 2, 3], [4, 1000, 65534, 65535]]], dims=["band", "x", "y"]) @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), [ - ("L1C", True, "B01", [[[np.nan, -9.99, -9.98, -9.97], - [-9.96, 0, 645.34, np.inf]]]), - ("L1C", False, "B10", [[[np.nan, -19.99, -19.98, -19.97], - [-19.96, -10, 635.34, 635.35]]]), - ("oldL1C", True, "B01", [[[np.nan, 0.01, 0.02, 0.03], - [0.04, 10, 655.34, np.inf]]]), - ("L2A", False, "B03", [[[np.nan, -9.99, -9.98, -9.97], - [-9.96, 0, 645.34, 645.35]]]), - ]) - def test_xml_calibration_to_reflectance(self, process_level, mask_saturated, band_name, expected): - """Test the calibration to reflectance.""" - from satpy.readers.msi_safe import SAFEMSIMDXML - l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), self.l1c_filename_info, mock.MagicMock()) - l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.l1c_filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) - l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), self.l2a_filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) + ("L1C", True, "B01", ([[[np.nan, -9.99, -9.98, -9.97], + [-9.96, 0, 645.34, np.inf]]], + [[[np.nan, -251.584265, -251.332429, -251.080593], + [-250.828757, 0., 16251.99095, np.inf]]], + [[[np.nan, 1, 2, 3], + [4, 1000, 65534, np.inf]]])), + ("L1C", False, "B10", ([[[np.nan, -19.99, -19.98, -19.97], + [-19.96, -10, 635.34, 635.35]]], + [[[np.nan, -35.465976, -35.448234, -35.430493], + [-35.412751, -17.741859, 1127.211275, 1127.229017]]], + [[[np.nan, 1, 2, 3], + [4, 1000, 65534, 65535]]])), + ("oldL1C", True, "B01", ([[[np.nan, 0.01, 0.02, 0.03], + [0.04, 10, 655.34, np.inf]]], + [[[np.nan, 0.251836101, 0.503672202, 0.755508303], + [1.00734440, 251.836101, 16503.8271, np.inf]]], + [[[np.nan, 1, 2, 3], + [4, 1000, 65534, np.inf]]])), + ("L2A", False, "B03", ([[[np.nan, -9.99, -9.98, -9.97], + [-9.96, 0, 645.34, 645.35]]], + [[[np.nan, -238.571863, -238.333052, -238.094241], + [-237.855431, 0, 15411.407995, 15411.646806]]], + [[[np.nan, 1, 2, 3], + [4, 1000, 65534, 65535]]])), + ]) + def test_xml_calibration(self, process_level, mask_saturated, band_name, expected): + """Test the calibration to reflectance/radiance/counts.""" + xml_fh = mtd_xml_builder(process_level, mask_saturated) - if process_level == "oldL1C": - result = l1c_old_xml_fh.calibrate_to_reflectances(self.fake_data, band_name) - elif process_level == "L1C": - result = l1c_xml_fh.calibrate_to_reflectances(self.fake_data, band_name) - else: - result = l2a_xml_fh.calibrate_to_reflectances(self.fake_data, band_name) + res1 = xml_fh.calibrate_to_reflectances(self.fake_data, band_name) + res2 = xml_fh.calibrate_to_radiances(self.fake_data, band_name) + res3 = xml_fh._sanitize_data(self.fake_data) - np.testing.assert_allclose(result, expected) - - @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), - [ - ("L1C", True, "B01", [[[np.nan, -251.584265, -251.332429, -251.080593], - [-250.828757, 0., 16251.99095, np.inf]]]), - ("L1C", False, "B10", [[[np.nan, -35.465976, -35.448234, -35.430493], - [-35.412751, -17.741859, 1127.211275, 1127.229017]]]), - ("oldL1C", True, "B01", [[[np.nan, 0.251836101, 0.503672202, 0.755508303], - [1.00734440, 251.836101, 16503.8271, np.inf]]]), - ("L2A", False, "B03", [[[np.nan, -238.571863, -238.333052, -238.094241], - [-237.855431, 0, 15411.407995, 15411.646806]]]), - ]) - def test_xml_calibration_to_radiance(self, process_level, mask_saturated, band_name, expected): - """Test the calibration to reflectance.""" - from satpy.readers.msi_safe import SAFEMSIMDXML - l1c_old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), self.l1c_filename_info, mock.MagicMock()) - l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.l1c_filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) - l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), self.l2a_filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) - if process_level == "oldL1C": - result = l1c_old_xml_fh.calibrate_to_radiances(self.fake_data, band_name) - elif process_level == "L1C": - result = l1c_xml_fh.calibrate_to_radiances(self.fake_data, band_name) - else: - result = l2a_xml_fh.calibrate_to_radiances(self.fake_data, band_name) - - np.testing.assert_allclose(result, expected) + results = (res1, res2, res3) + np.testing.assert_allclose(results, expected) @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), [ @@ -1582,33 +1582,19 @@ def test_xml_calibration_to_radiance(self, process_level, mask_saturated, band_n ("L2A", True, "WVP", [[[np.nan, 0.001, 0.002, 0.003], [0.004, 1., 65.534, np.inf]]]), ("L2A", False, "CLOUD", None), + ("L2A", False, "B10", None), ]) def test_xml_calibration_to_atmospheric(self, process_level, mask_saturated, band_name, expected): """Test the calibration to L2A atmospheric products.""" - from satpy.readers.msi_safe import SAFEMSIMDXML - l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.l1c_filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) - l2a_xml_fh = SAFEMSIMDXML(StringIO(mtd_l2a_xml), self.l2a_filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) - if process_level == "L1C": - result = l1c_xml_fh.calibrate_to_atmospheric(self.fake_data, band_name) - else: - result = l2a_xml_fh.calibrate_to_atmospheric(self.fake_data, band_name) + xml_fh = mtd_xml_builder(process_level, mask_saturated) + + result =xml_fh.calibrate_to_atmospheric(self.fake_data, band_name) if result is not None: np.testing.assert_allclose(result, expected) else: assert result is expected - def test_xml_calibration_to_counts(self): - """Test the calibration to counts.""" - from satpy.readers.msi_safe import SAFEMSIMDXML - l1c_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.l1c_filename_info, mock.MagicMock(), - mask_saturated=True) - result = l1c_xml_fh._sanitize_data(self.fake_data) - np.testing.assert_allclose(result, [[[np.nan, 1, 2, 3], - [4, 1000, 65534, np.inf]]]) - class TestSAFEMSIL1C: """Test case for image reading (jp2k).""" @@ -1618,7 +1604,7 @@ def setup_method(self): self.fake_data = xr.Dataset({"band_data": xr.DataArray([[[0, 1], [65534, 65535]]], dims=["band", "x", "y"])}) - @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "calibration", "expected"), + @pytest.mark.parametrize(("process_level", "mask_saturated", "dataset_name", "calibration", "expected"), [ ("L1C", True, "B01", "reflectance", [[np.nan, -9.99], [645.34, np.inf]]), ("L1C", False, "B02", "radiance", [[np.nan, -262.148396], [16934.419021, 16934.681431]]), @@ -1628,56 +1614,30 @@ def setup_method(self): ("L2A", True, "WVP_L2A", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), ("L2A", True, "SNOW_L2A", "water_vapor", None), ]) - def test_calibration_and_masking(self, process_level, mask_saturated, band_name, calibration, expected): + def test_calibration_and_masking(self, process_level, mask_saturated, dataset_name, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" - from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML, SAFEMSITileMDXML - l1c_filename_info = dict(observation_time=None, fmission_id="S2A", band_name=band_name, dtile_number=None, - process_level="L1C") - l2a_filename_info = dict(observation_time=None, fmission_id="S2A", band_name=band_name.replace("_L2A", ""), - dtile_number=None, process_level="L2A") - l1c_tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), l1c_filename_info, - mock.MagicMock()) - l2a_tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), l2a_filename_info, - mock.MagicMock()) - l1c_mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), l1c_filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) - l2a_mda = SAFEMSIMDXML(StringIO(mtd_l2a_xml), l2a_filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) - - if process_level == "L1C": - jp2_fh = SAFEMSIL1C("somefile", l1c_filename_info, mock.MagicMock(), l1c_mda, l1c_tile_mda) - else: - jp2_fh = SAFEMSIL1C("somefile", l2a_filename_info, mock.MagicMock(), l2a_mda, l2a_tile_mda) + jp2_fh = jp2_builder(process_level, dataset_name.replace("_L2A", ""), mask_saturated) with mock.patch("xarray.open_dataset", return_value=self.fake_data): - res = jp2_fh.get_dataset(make_dataid(name=band_name, calibration=calibration), info=dict()) + res = jp2_fh.get_dataset(make_dataid(name=dataset_name, calibration=calibration), info=dict()) if res is not None: np.testing.assert_allclose(res, expected) else: assert res is expected - def test_filename_dsname_mismatch(self): - """Test when dataset name and file name mismatch, the data and its area definition should both be None.""" - from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML, SAFEMSITileMDXML - l1c_filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B01", dtile_number=None, - process_level="L1C") - l2a_filename_info = dict(observation_time=None, fmission_id="S2A", band_name="B10", dtile_number=None, - process_level="L2A") - l1c_tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), l1c_filename_info, - mock.MagicMock()) - l2a_tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_l1c_tile_xml), l2a_filename_info, - mock.MagicMock()) - l1c_mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), l1c_filename_info, mock.MagicMock(), mask_saturated=True) - l2a_mda = SAFEMSIMDXML(StringIO(mtd_l2a_xml), l2a_filename_info, mock.MagicMock(), mask_saturated=True) - l1c_jp2_fh = SAFEMSIL1C("somefile", l1c_filename_info, mock.MagicMock(), l1c_mda, l1c_tile_mda) - l2a_jp2_fh = SAFEMSIL1C("somefile", l2a_filename_info, mock.MagicMock(), l2a_mda, l2a_tile_mda) + @pytest.mark.parametrize(("process_level", "band_name", "dataset_name"), + [ + ("L1C", "B01", "B03"), + ("L2A", "B02", "B03_L2A"), + ]) + def test_filename_dsname_mismatch(self, process_level, band_name, dataset_name): + """Test when dataset name and file band name mismatch, the data and its area definition should both be None.""" + jp2_fh = jp2_builder(process_level, band_name) + + with mock.patch("xarray.open_dataset", return_value=self.fake_data): + res1 = jp2_fh.get_dataset(make_dataid(name=dataset_name), info=dict()) + res2 = jp2_fh.get_area_def(make_dataid(name=dataset_name)) - with (mock.patch("xarray.open_dataset", return_value=self.fake_data)): - res1 = l1c_jp2_fh.get_dataset(make_dataid(name="B02"), info=dict()) - res2 = l2a_jp2_fh.get_dataset(make_dataid(name="B11_L2A"), info=dict()) - res3 = l1c_jp2_fh.get_area_def(make_dataid(name="B02")) - res4 = l2a_jp2_fh.get_area_def(make_dataid(name="B11_L2A")) assert res1 is None assert res2 is None - assert res3 is None - assert res4 is None + From 80278e173b38ddedb0e728510c27560190252a50 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 20 Apr 2024 08:35:30 +0000 Subject: [PATCH 359/481] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- satpy/tests/reader_tests/test_msi_safe.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 03c52ac22e..96e48f1ac1 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1640,4 +1640,3 @@ def test_filename_dsname_mismatch(self, process_level, band_name, dataset_name): assert res1 is None assert res2 is None - From dfb7e3ceb5c7d2d91a123c86528828a0ed7d7a8b Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 16:58:38 +0800 Subject: [PATCH 360/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 40 ++++++++++------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 96e48f1ac1..5c4b8c7b49 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1419,32 +1419,24 @@ MTD_XMLS = [mtd_l1c_xml, mtd_l1c_old_xml, mtd_l2a_xml] TILE_XMLS = [mtd_l1c_tile_xml, mtd_l1c_tile_xml, mtd_l1c_tile_xml] -def mtd_xml_builder(process_level, mask_saturated=True, band_name=None): - """Build fake SAFE MTD XML.""" - from satpy.readers.msi_safe import SAFEMSIMDXML +def xml_builder(process_level, mask_saturated=True, band_name=None): + """Build fake SAFE MTD/Tile XML.""" + from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML filename_info = dict(observation_time=None, dtile_number=None, band_name=band_name, fmission_id="S2A", process_level=process_level.replace("old", "")) xml_fh = SAFEMSIMDXML(StringIO(MTD_XMLS[PROCESS_LEVELS.index(process_level)]), filename_info, mock.MagicMock(), mask_saturated=mask_saturated) - return xml_fh - -def tile_xml_builder(process_level, band_name=None): - """Build fake SAFE Tile XML.""" - from satpy.readers.msi_safe import SAFEMSITileMDXML - filename_info = dict(observation_time=None, dtile_number=None, band_name=band_name, fmission_id="S2A", - process_level=process_level.replace("old", "")) xml_tile_fh = SAFEMSITileMDXML(BytesIO(TILE_XMLS[PROCESS_LEVELS.index(process_level)]), filename_info, mock.MagicMock()) - return xml_tile_fh + return xml_fh, xml_tile_fh def jp2_builder(process_level, band_name, mask_saturated=True): """Build fake SAFE jp2 image file.""" from satpy.readers.msi_safe import SAFEMSIL1C filename_info = dict(observation_time=None, dtile_number=None, band_name=band_name, fmission_id="S2A", process_level=process_level.replace("old", "")) - xml_xh = mtd_xml_builder(process_level, mask_saturated, band_name) - tile_xml_xh = tile_xml_builder(process_level, band_name) - jp2_fh = SAFEMSIL1C("somefile", filename_info, mock.MagicMock(), xml_xh, tile_xml_xh) + xml_fh, tile_xml_fh = xml_builder(process_level, mask_saturated, band_name) + jp2_fh = SAFEMSIL1C("somefile", filename_info, mock.MagicMock(), xml_fh, tile_xml_fh) return jp2_fh @@ -1505,7 +1497,7 @@ def test_angles(self, process_level, angle_name, angle_tag, expected): """Test reading angles array.""" info = dict(xml_tag=angle_tag[0], xml_item=angle_tag[1]) if "satellite" in angle_name else \ dict(xml_tag=angle_tag[0] + "/" + angle_tag[1]) - xml_tile_fh = tile_xml_builder(process_level) + xml_tile_fh = xml_builder(process_level)[1] res = xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) if res is not None: @@ -1522,7 +1514,7 @@ def test_navigation(self): crs = CRS("EPSG:32616") dsid = make_dataid(name="B01", resolution=60) - xml_tile_fh = tile_xml_builder("L1C") + xml_tile_fh = xml_builder("L1C")[1] result = xml_tile_fh.get_area_def(dsid) area_extent = (499980.0, 3590220.0, 609780.0, 3700020.0) assert result.crs == crs @@ -1565,7 +1557,7 @@ def setup_method(self): ]) def test_xml_calibration(self, process_level, mask_saturated, band_name, expected): """Test the calibration to reflectance/radiance/counts.""" - xml_fh = mtd_xml_builder(process_level, mask_saturated) + xml_fh = xml_builder(process_level, mask_saturated)[0] res1 = xml_fh.calibrate_to_reflectances(self.fake_data, band_name) res2 = xml_fh.calibrate_to_radiances(self.fake_data, band_name) @@ -1586,7 +1578,7 @@ def test_xml_calibration(self, process_level, mask_saturated, band_name, expecte ]) def test_xml_calibration_to_atmospheric(self, process_level, mask_saturated, band_name, expected): """Test the calibration to L2A atmospheric products.""" - xml_fh = mtd_xml_builder(process_level, mask_saturated) + xml_fh = xml_builder(process_level, mask_saturated)[0] result =xml_fh.calibrate_to_atmospheric(self.fake_data, band_name) @@ -1606,16 +1598,20 @@ def setup_method(self): @pytest.mark.parametrize(("process_level", "mask_saturated", "dataset_name", "calibration", "expected"), [ - ("L1C", True, "B01", "reflectance", [[np.nan, -9.99], [645.34, np.inf]]), - ("L1C", False, "B02", "radiance", [[np.nan, -262.148396], [16934.419021, 16934.681431]]), - ("L1C", True, "B03", "counts", [[np.nan, 1], [65534, np.inf]]), - ("L1C", True, "B01", "aerosol_thickness", None), + # ("L1C", True, "B01", "reflectance", [[np.nan, -9.99], [645.34, np.inf]]), + # ("L1C", False, "B02", "radiance", [[np.nan, -262.148396], [16934.419021, 16934.681431]]), + # ("L1C", True, "B03", "counts", [[np.nan, 1], [65534, np.inf]]), + # ("L1C", True, "B01", "aerosol_thickness", None), + ("L2A", False, "B01_L2A", "reflectance", [[np.nan, -9.99], [645.34, 645.35]]), + ("L2A", True, "B02_L2A", "radiance", [[np.nan, -265.970568], [17181.325973, np.inf]]), + ("L2A", True, "B03_L2A", "counts", [[np.nan, 1], [65534, np.inf]]), ("L2A", False, "AOT_L2A", "aerosol_thickness", [[np.nan, 0.001], [65.534, 65.535]]), ("L2A", True, "WVP_L2A", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), ("L2A", True, "SNOW_L2A", "water_vapor", None), ]) def test_calibration_and_masking(self, process_level, mask_saturated, dataset_name, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" + jp2_fh = jp2_builder(process_level, dataset_name.replace("_L2A", ""), mask_saturated) with mock.patch("xarray.open_dataset", return_value=self.fake_data): From 59b93b4d4933aad7d597fa7171ab29cefe36e2fe Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 17:11:59 +0800 Subject: [PATCH 361/481] fix --- satpy/readers/msi_safe.py | 4 +++- satpy/tests/reader_tests/test_msi_safe.py | 23 +++++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index d99101f1bf..d0aa94538c 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -167,7 +167,9 @@ def calibrate_to_reflectances(self, data, band_name): def calibrate_to_atmospheric(self, data, band_name): """Calibrate L2A AOT/WVP product.""" atmospheric_bands = ["AOT", "WVP"] - if self.process_level == "L1C" or (self.process_level == "L2A" and band_name not in atmospheric_bands): + if self.process_level == "L1C": + return + elif self.process_level == "L2A" and band_name not in atmospheric_bands: return quantification = float(self.root.find(f".//{band_name}_QUANTIFICATION_VALUE").text) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 5c4b8c7b49..59c3564fd4 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1596,23 +1596,18 @@ def setup_method(self): self.fake_data = xr.Dataset({"band_data": xr.DataArray([[[0, 1], [65534, 65535]]], dims=["band", "x", "y"])}) - @pytest.mark.parametrize(("process_level", "mask_saturated", "dataset_name", "calibration", "expected"), + @pytest.mark.parametrize(("mask_saturated", "dataset_name", "calibration", "expected"), [ - # ("L1C", True, "B01", "reflectance", [[np.nan, -9.99], [645.34, np.inf]]), - # ("L1C", False, "B02", "radiance", [[np.nan, -262.148396], [16934.419021, 16934.681431]]), - # ("L1C", True, "B03", "counts", [[np.nan, 1], [65534, np.inf]]), - # ("L1C", True, "B01", "aerosol_thickness", None), - ("L2A", False, "B01_L2A", "reflectance", [[np.nan, -9.99], [645.34, 645.35]]), - ("L2A", True, "B02_L2A", "radiance", [[np.nan, -265.970568], [17181.325973, np.inf]]), - ("L2A", True, "B03_L2A", "counts", [[np.nan, 1], [65534, np.inf]]), - ("L2A", False, "AOT_L2A", "aerosol_thickness", [[np.nan, 0.001], [65.534, 65.535]]), - ("L2A", True, "WVP_L2A", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), - ("L2A", True, "SNOW_L2A", "water_vapor", None), + (False, "B01_L2A", "reflectance", [[np.nan, -9.99], [645.34, 645.35]]), + (True, "B02_L2A", "radiance", [[np.nan, -265.970568], [17181.325973, np.inf]]), + (True, "B03_L2A", "counts", [[np.nan, 1], [65534, np.inf]]), + (False, "AOT_L2A", "aerosol_thickness", [[np.nan, 0.001], [65.534, 65.535]]), + (True, "WVP_L2A", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), + (True, "SNOW_L2A", "water_vapor", None), ]) - def test_calibration_and_masking(self, process_level, mask_saturated, dataset_name, calibration, expected): + def test_calibration_and_masking(self, mask_saturated, dataset_name, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" - - jp2_fh = jp2_builder(process_level, dataset_name.replace("_L2A", ""), mask_saturated) + jp2_fh = jp2_builder("L2A", dataset_name.replace("_L2A", ""), mask_saturated) with mock.patch("xarray.open_dataset", return_value=self.fake_data): res = jp2_fh.get_dataset(make_dataid(name=dataset_name, calibration=calibration), info=dict()) From 93ee913bea4b7a51b8493c9ea13f134deda2bc91 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sat, 20 Apr 2024 21:19:23 +0800 Subject: [PATCH 362/481] composites --- satpy/etc/composites/msi.yaml | 75 +++++++++++++++++++++++++++++++++ satpy/etc/enhancements/msi.yaml | 58 +++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 satpy/etc/enhancements/msi.yaml diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index 010bd240b0..14a637b941 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -145,3 +145,78 @@ composites: - name: 'B02' #modifiers: [effective_solar_pathlength_corrected] standard_name: true_color + + urban_color: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B12' + modifiers: [effective_solar_pathlength_corrected] + - name: 'B11' + modifiers: [effective_solar_pathlength_corrected] + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + standard_name: natural_color + + false_color: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B08' + modifiers: [effective_solar_pathlength_corrected] + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected] + standard_name: natural_color + + true_color_l2a: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B04_L2A' + - name: 'B03_L2A' + - name: 'B02_L2A' + standard_name: true_color + + natural_color_l2a: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B11_L2A' + - name: 'B08_L2A' + - name: 'B04_L2A' + standard_name: natural_color + + urban_color_l2a: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B12_L2A' + - name: 'B11_L2A' + - name: 'B04_L2A' + standard_name: natural_color + + false_color_l2a: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B08_L2A' + - name: 'B04_L2A' + - name: 'B03_L2A' + standard_name: natural_color + + aerosol_optical_thickness: + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - name: AOT_L2A + calibration: aerosol_thickness + standard_name: aot_msi + + water_vapor_map: + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - name: WVP_L2A + calibration: water_vapor + standard_name: wvp_msi + + scene_class: + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - name: SCL_L2A + standard_name: scl_msi + diff --git a/satpy/etc/enhancements/msi.yaml b/satpy/etc/enhancements/msi.yaml new file mode 100644 index 0000000000..d72d4bb9c9 --- /dev/null +++ b/satpy/etc/enhancements/msi.yaml @@ -0,0 +1,58 @@ +enhancements: + aot_msi: + standard_name: aot_msi + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - colors: oranges + min_value: 0 + max_value: 1 + + wvp_msi: + standard_name: wvp_msi + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - colors: pubu + min_value: 0 + max_value: 4 + + scl_msi: + # The palette is defined by Sentinel-2 Products Specification Document V14.9, page 319 + # Please review https://sentinels.copernicus.eu/documents/247904/685211/S2-PDGS-TAS-DI-PSD-V14.9.pdf/3d3b6c9c-4334-dcc4-3aa7-f7c0deffbaf7?t=1643013091529 + standard_name: scl_msi + operations: + - name: palettize + method: !!python/name:satpy.enhancements.palettize + kwargs: + palettes: + - values: [ + 0, #Nodata + 1, #Saturated_defective + 2, #Topograhic_shadow + 3, #Cloud_shadow + 4, #Vegetation + 5, #Not_vegetated + 6, #Water + 7, #Unclassified + 8, #Cloud_medium_probability + 9, #Cloud_high_probability + 10, #Thin_cirrus + 11, #Snow/ice + ] + colors: [[0, 0, 0], + [255, 0, 0], + [89, 89, 89], + [148, 54, 52], + [0, 176, 80], + [255, 255, 0], + [0, 112, 192], + [128, 128, 128], + [191, 191, 191], + [255, 255, 255], + [146, 205, 220], + [112, 48, 160]] From 9f0553790f88ae41c9aa25ceea88585021ec7602 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 20 Apr 2024 13:20:32 +0000 Subject: [PATCH 363/481] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- satpy/etc/composites/msi.yaml | 3 +-- satpy/etc/enhancements/msi.yaml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index 14a637b941..0b8e340327 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -212,11 +212,10 @@ composites: prerequisites: - name: WVP_L2A calibration: water_vapor - standard_name: wvp_msi + standard_name: wvp_msi scene_class: compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: - name: SCL_L2A standard_name: scl_msi - diff --git a/satpy/etc/enhancements/msi.yaml b/satpy/etc/enhancements/msi.yaml index d72d4bb9c9..47cb8aa36b 100644 --- a/satpy/etc/enhancements/msi.yaml +++ b/satpy/etc/enhancements/msi.yaml @@ -43,7 +43,7 @@ enhancements: 9, #Cloud_high_probability 10, #Thin_cirrus 11, #Snow/ice - ] + ] colors: [[0, 0, 0], [255, 0, 0], [89, 89, 89], From 4fbfdcc88607ef9572e253bda5a2ae029266220f Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 21 Apr 2024 00:00:32 +0800 Subject: [PATCH 364/481] nvdi --- satpy/etc/composites/msi.yaml | 34 +++++++++++++++++++++++++++++++-- satpy/etc/enhancements/msi.yaml | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index 0b8e340327..c82dc09bf8 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -1,8 +1,6 @@ sensor_name: visir/msi - modifiers: - rayleigh_corrected: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard @@ -168,6 +166,22 @@ composites: modifiers: [effective_solar_pathlength_corrected] standard_name: natural_color + ndvi: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndvi/ + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.RatioCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: B08 + - name: B04 + - compositor: !!python/name:satpy.composites.SumCompositor + prerequisites: + - name: B08 + - name: B04 + standard_name: ndvi_msi + true_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: @@ -219,3 +233,19 @@ composites: prerequisites: - name: SCL_L2A standard_name: scl_msi + + ndvi_l2a: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndvi/ + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.RatioCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: B08_L2A + - name: B04_L2A + - compositor: !!python/name:satpy.composites.SumCompositor + prerequisites: + - name: B08_L2A + - name: B04_L2A + standard_name: ndvi_msi diff --git a/satpy/etc/enhancements/msi.yaml b/satpy/etc/enhancements/msi.yaml index 47cb8aa36b..9aa8118c37 100644 --- a/satpy/etc/enhancements/msi.yaml +++ b/satpy/etc/enhancements/msi.yaml @@ -1,4 +1,38 @@ enhancements: + ndvi_msi: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndvi/ + standard_name: ndvi_msi + operations: + - name: palettize + method: !!python/name:satpy.enhancements.palettize + kwargs: + palettes: + - min_value: -1 + max_value: 1 + values: [-1, -0.5, -0.2, -0.1, 0, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 1] + colors: [[12, 12, 12], + [12, 12, 12], + [191, 191, 191], + [219, 219, 219], + [234, 234, 234], + [255, 249, 204], + [237, 232, 181], + [221, 216, 155], + [204, 198, 130], + [188, 183, 107], + [175, 193, 96], + [163, 204, 89], + [145, 191, 81], + [127, 178, 71], + [112, 163, 63], + [96, 150, 53], + [79, 137, 45], + [63, 124, 35], + [48, 109, 28], + [33, 96, 17], + [15, 84, 10], + [0, 68, 0]] + aot_msi: standard_name: aot_msi operations: From 72af85752d7dfc95083b3c5b5b26d2dc7cd30bfb Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 21 Apr 2024 18:32:31 +0800 Subject: [PATCH 365/481] composites --- satpy/etc/composites/msi.yaml | 120 ++++++++++++++++++++++++++++ satpy/etc/enhancements/msi.yaml | 134 ++++++++++++++++++++++++++++++-- 2 files changed, 246 insertions(+), 8 deletions(-) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index c82dc09bf8..e6b2159182 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -182,6 +182,66 @@ composites: - name: B04 standard_name: ndvi_msi + ndmi: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndmi/ + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.RatioCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: B08 + - name: B11 + - compositor: !!python/name:satpy.composites.SumCompositor + prerequisites: + - name: B08 + - name: B11 + standard_name: ndmi_msi + + ndwi: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndwi/ + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.RatioCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: B03 + - name: B08 + - compositor: !!python/name:satpy.composites.SumCompositor + prerequisites: + - name: B03 + - name: B08 + standard_name: ndwi_msi + + ndsi: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndsi/ + compositor: !!python/name:satpy.composites.MaskingCompositor + prerequisites: + - name: B11 + - compositor: !!python/name:satpy.composites.RatioCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: B03 + - name: B11 + - compositor: !!python/name:satpy.composites.SumCompositor + prerequisites: + - name: B03 + - name: B11 + conditions: + - method: less_equal + value: 0.42 + transparency: 100 + standard_name: ndsi_msi + + ndsi_with_true_color: + compositor: !!python/name:satpy.composites.BackgroundCompositor + prerequisites: + - name: ndsi + - name: true_color + standard_name: no_enhancement + true_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: @@ -249,3 +309,63 @@ composites: - name: B08_L2A - name: B04_L2A standard_name: ndvi_msi + + ndmi_l2a: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndvi/ + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.RatioCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: B8A_L2A + - name: B11_L2A + - compositor: !!python/name:satpy.composites.SumCompositor + prerequisites: + - name: B8A_L2A + - name: B11_L2A + standard_name: ndmi_msi + + ndwi_l2a: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndwi/ + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.RatioCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: B03_L2A + - name: B08_L2A + - compositor: !!python/name:satpy.composites.SumCompositor + prerequisites: + - name: B03_L2A + - name: B08_L2A + standard_name: ndwi_msi + + ndsi_l2a: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndsi/ + compositor: !!python/name:satpy.composites.MaskingCompositor + prerequisites: + - name: B11_L2A + - compositor: !!python/name:satpy.composites.RatioCompositor + prerequisites: + - compositor: !!python/name:satpy.composites.DifferenceCompositor + prerequisites: + - name: B03_L2A + - name: B11_L2A + - compositor: !!python/name:satpy.composites.SumCompositor + prerequisites: + - name: B03_L2A + - name: B11_L2A + conditions: + - method: less_equal + value: 0.42 + transparency: 100 + standard_name: ndsi_msi + + ndsi_l2a_with_true_color_l2a: + compositor: !!python/name:satpy.composites.BackgroundCompositor + prerequisites: + - name: ndsi_l2a + - name: true_color_l2a + standard_name: no_enhancement diff --git a/satpy/etc/enhancements/msi.yaml b/satpy/etc/enhancements/msi.yaml index 9aa8118c37..d221008c99 100644 --- a/satpy/etc/enhancements/msi.yaml +++ b/satpy/etc/enhancements/msi.yaml @@ -9,19 +9,42 @@ enhancements: palettes: - min_value: -1 max_value: 1 - values: [-1, -0.5, -0.2, -0.1, 0, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 1] - colors: [[12, 12, 12], + values: [ + -1, + -0.5, + -0.2, + -0.1, + 0, + 0.025, + 0.05, + 0.075, + 0.1, + 0.125, + 0.15, + 0.175, + 0.2, + 0.25, + 0.3, + 0.35, + 0.4, + 0.45, + 0.5, + 0.55, + 0.6, + 1, + ] + colors: [ [12, 12, 12], [191, 191, 191], [219, 219, 219], [234, 234, 234], [255, 249, 204], [237, 232, 181], - [221, 216, 155], + [221, 216, 155], [204, 198, 130], [188, 183, 107], [175, 193, 96], - [163, 204, 89], + [163, 204, 89], [145, 191, 81], [127, 178, 71], [112, 163, 63], @@ -31,7 +54,96 @@ enhancements: [48, 109, 28], [33, 96, 17], [15, 84, 10], - [0, 68, 0]] + [0, 68, 0], + [0, 68, 0], + ] + + ndmi_msi: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndmi/ + standard_name: ndmi_msi + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - min_value: -0.8 + max_value: 0.8 + values: [ + -0.8, + -0.24, + -0.032, + 0.032, + 0.24, + 0.8, + ] + colors: [ + [128, 0, 0], + [255, 0, 0], + [255, 255, 0], + [0, 255, 255], + [0, 0, 255], + [0, 0, 128], + ] + + ndwi_msi: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndwi/ + standard_name: ndwi_msi + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - min_value: -0.8 + max_value: 0.8 + values: [ + -0.8, + -0.7, + -0.6, + -0.5, + -0.4, + -0.3, + -0.2, + -0.1, + 0, + 0.1, + 0.2, + 0.3, + 0.4, + 0.5, + 0.6, + 0.7, + 0.8 + ] + colors: [ + [0, 128, 0], + [32, 144, 32], + [64, 160, 64], + [96, 176, 96], + [128, 192, 128], + [160, 208, 160], + [192, 223, 192], + [224, 239, 224], + [255, 255, 255], + [224, 224, 249], + [192, 192, 242], + [160, 160, 236], + [128, 128, 230], + [96, 96, 223], + [64, 64, 217], + [32, 32, 210], + [0, 0, 204], + ] + + ndsi_msi: + # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndwi/ + standard_name: ndsi_msi + operations: + - name: colorize + method: !!python/name:satpy.enhancements.colorize + kwargs: + palettes: + - values: [0] + colors: [[0, 240, 240]] aot_msi: standard_name: aot_msi @@ -40,9 +152,10 @@ enhancements: method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - colors: oranges + - colors: rdylgn min_value: 0 max_value: 1 + reverse: True wvp_msi: standard_name: wvp_msi @@ -51,9 +164,10 @@ enhancements: method: !!python/name:satpy.enhancements.colorize kwargs: palettes: - - colors: pubu + - colors: rdylbu min_value: 0 - max_value: 4 + max_value: 5 + reverse: True scl_msi: # The palette is defined by Sentinel-2 Products Specification Document V14.9, page 319 @@ -90,3 +204,7 @@ enhancements: [255, 255, 255], [146, 205, 220], [112, 48, 160]] + + no_enhancement: + standard_name: no_enhancement + operations: [] From 110641cea951b99ed5b08365c2d559bfff4075be Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 21 Apr 2024 19:25:04 +0800 Subject: [PATCH 366/481] Update msi.yaml --- satpy/etc/composites/msi.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index e6b2159182..b17aa0e856 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -167,6 +167,7 @@ composites: standard_name: natural_color ndvi: + # Normalized Difference Vegetation Index # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndvi/ compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: @@ -183,6 +184,7 @@ composites: standard_name: ndvi_msi ndmi: + # Normalized Difference Moisture Index # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndmi/ compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: @@ -199,6 +201,7 @@ composites: standard_name: ndmi_msi ndwi: + # Normalized Difference Water Index # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndwi/ compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: @@ -215,6 +218,7 @@ composites: standard_name: ndwi_msi ndsi: + # Normalized Difference Snow Index # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndsi/ compositor: !!python/name:satpy.composites.MaskingCompositor prerequisites: @@ -295,6 +299,7 @@ composites: standard_name: scl_msi ndvi_l2a: + # Normalized Difference Vegetation Index # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndvi/ compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: @@ -311,6 +316,7 @@ composites: standard_name: ndvi_msi ndmi_l2a: + # Normalized Difference Moisture Index # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndvi/ compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: @@ -327,6 +333,7 @@ composites: standard_name: ndmi_msi ndwi_l2a: + # Normalized Difference Water Index # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndwi/ compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: @@ -343,6 +350,7 @@ composites: standard_name: ndwi_msi ndsi_l2a: + # Normalized Difference Snow Index # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndsi/ compositor: !!python/name:satpy.composites.MaskingCompositor prerequisites: From 87d072d039e543090cfe9c3e978a3d6eedd0d8ac Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 22 Apr 2024 08:48:42 +0200 Subject: [PATCH 367/481] Remove doc references to setup.py --- doc/source/dev_guide/index.rst | 4 ++-- doc/source/dev_guide/plugins.rst | 13 ------------- doc/source/install.rst | 2 +- 3 files changed, 3 insertions(+), 16 deletions(-) diff --git a/doc/source/dev_guide/index.rst b/doc/source/dev_guide/index.rst index e877fd1c63..bcd536f614 100644 --- a/doc/source/dev_guide/index.rst +++ b/doc/source/dev_guide/index.rst @@ -29,7 +29,7 @@ and all code should follow the practices `_. Satpy is now Python 3 only and it is no longer needed to support Python 2. -Check ``setup.py`` for the current Python versions any new code needs +Check ``pyproject.toml`` for the current Python versions any new code needs to support. .. _devinstall: @@ -63,7 +63,7 @@ clone your fork. The package can then be installed in development mode by doing: The first command will install all dependencies needed by the Satpy conda-forge package, but won't actually install Satpy. The second command should be run from the root of the cloned Satpy repository (where the -``setup.py`` is) and will install the actual package. +``pyproject.toml`` is) and will install the actual package. You can now edit the python files in your cloned repository and have them immediately reflected in your conda environment. diff --git a/doc/source/dev_guide/plugins.rst b/doc/source/dev_guide/plugins.rst index bce72dabae..35c772c2a6 100644 --- a/doc/source/dev_guide/plugins.rst +++ b/doc/source/dev_guide/plugins.rst @@ -156,19 +156,6 @@ have a ``etc/`` directory in the root of the package structure. Even so, for future compatibility, it is best to use the name of the package directory on the right-hand side of the ``=``. -.. warning:: - - Due to some limitations in setuptools you must also define a ``setup.py`` - file in addition to ``pyproject.toml`` if you'd like to use "editable" - installations (``pip install -e .``). Once - `this setuptools issue `_ - is resolved this won't be needed. For now this minimal ``setup.py`` will - work: - - .. code-block:: python - - from setuptools import setup - setup() **Alternative: setup.py** diff --git a/doc/source/install.rst b/doc/source/install.rst index 3c3ba26a41..619903b34c 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -86,7 +86,7 @@ To install the `satpy` package and the minimum amount of python dependencies: Additional dependencies can be installed as "extras" and are grouped by reader, writer, or feature added. Extras available can be found in the -`setup.py `_ file. +`pyproject.toml `_ file. They can be installed individually: .. code-block:: bash From f1fb2fd08281e630067e10ac05db314245052ab3 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 22 Apr 2024 18:34:14 +0800 Subject: [PATCH 368/481] separate l1c/l2a yaml --- satpy/etc/readers/msi_safe.yaml | 309 +-------------------------- satpy/etc/readers/msi_safe_l2a.yaml | 315 ++++++++++++++++++++++++++++ 2 files changed, 318 insertions(+), 306 deletions(-) create mode 100644 satpy/etc/readers/msi_safe_l2a.yaml diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index 16a74e64ea..cc39c26a74 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -1,8 +1,8 @@ reader: name: msi_safe - short_name: MSI SAFE - long_name: Sentinel-2 A and B MSI data in SAFE format - description: SAFE Reader for MSI data (Sentinel-2) + short_name: MSI SAFE L1C + long_name: Sentinel-2 A and B MSI L1C data in SAFE format + description: SAFE Reader for MSI L1C data (Sentinel-2) status: Nominal supports_fsspec: false sensors: [msi] @@ -21,25 +21,6 @@ file_types: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] - l2a_safe_granule_10m: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R10m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_10m.jp2'] - requires: [l2a_safe_metadata, l2a_safe_tile_metadata] - l2a_safe_granule_20m: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R20m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_20m.jp2'] - requires: [l2a_safe_metadata, l2a_safe_tile_metadata] - l2a_safe_granule_60m: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R60m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_60m.jp2'] - requires: [l2a_safe_metadata, l2a_safe_tile_metadata] - l2a_safe_tile_metadata: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] - l2a_safe_metadata: - file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL2A.xml'] - datasets: B01: name: B01 @@ -58,24 +39,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B01_L2A: - name: B01_L2A - sensor: msi - wavelength: [0.415, 0.443, 0.470] - resolution: - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B02: name: B02 sensor: msi @@ -93,25 +56,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B02_L2A: - name: B02_L2A - sensor: msi - wavelength: [0.440, 0.490, 0.540] - resolution: - 10: {file_type: l2a_safe_granule_10m} - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B03: name: B03 sensor: msi @@ -129,25 +73,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B03_L2A: - name: B03_L2A - sensor: msi - wavelength: [0.540, 0.560, 0.580] - resolution: - 10: {file_type: l2a_safe_granule_10m} - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B04: name: B04 sensor: msi @@ -165,25 +90,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B04_L2A: - name: B04_L2A - sensor: msi - wavelength: [0.645, 0.665, 0.685] - resolution: - 10: {file_type: l2a_safe_granule_10m} - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B05: name: B05 sensor: msi @@ -201,24 +107,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B05_L2A: - name: B05_L2A - sensor: msi - wavelength: [0.695, 0.705, 0.715] - resolution: - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B06: name: B06 sensor: msi @@ -236,24 +124,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B06_L2A: - name: B06_L2A - sensor: msi - wavelength: [0.731, 0.740, 0.749] - resolution: - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B07: name: B07 sensor: msi @@ -271,24 +141,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B07_L2A: - name: B07_L2A - sensor: msi - wavelength: [0.764, 0.783, 0.802] - resolution: - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B08: name: B08 sensor: msi @@ -306,23 +158,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B08_L2A: - name: B08_L2A - sensor: msi - wavelength: [0.780, 0.842, 0.905] - resolution: - 10: {file_type: l2a_safe_granule_10m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B8A: name: B8A sensor: msi @@ -340,24 +175,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B8A_L2A: - name: B8A_L2A - sensor: msi - wavelength: [0.855, 0.865, 0.875] - resolution: - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B09: name: B09 sensor: msi @@ -375,23 +192,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B09_L2A: - name: B09_L2A - sensor: msi - wavelength: [0.935, 0.945, 0.955] - resolution: - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B10: name: B10 sensor: msi @@ -426,24 +226,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B11_L2A: - name: B11_L2A - sensor: msi - wavelength: [1.565, 1.610, 1.655] - resolution: - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - B12: name: B12 sensor: msi @@ -461,65 +243,6 @@ datasets: units: "1" file_type: l1c_safe_granule - B12_L2A: - name: B12_L2A - sensor: msi - wavelength: [2.100, 2.190, 2.280] - resolution: - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - reflectance: - standard_name: toa_bidirectional_reflectance - units: "%" - radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength - units: W m-2 um-1 sr-1 - counts: - standard_name: counts - units: "1" - - AOT_L2A: - name: AOT_L2A - sensor: msi - resolution: - 10: {file_type: l2a_safe_granule_10m} - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - aerosol_thickness: - standard_name: aerosol_optical_thickness - units: "1" - counts: - standard_name: counts - units: "1" - - WVP_L2A: - name: WVP_L2A - sensor: msi - resolution: - 10: {file_type: l2a_safe_granule_10m} - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - water_vapor: - standard_name: water_vapor - units: cm - counts: - standard_name: counts - units: "1" - - SCL_L2A: - name: SCL_L2A - sensor: msi - resolution: - 20: {file_type: l2a_safe_granule_20m} - 60: {file_type: l2a_safe_granule_60m} - calibration: - counts: - standard_name: counts - units: "1" - solar_zenith_angle: name: solar_zenith_angle resolution: [10, 20, 60] @@ -545,29 +268,3 @@ datasets: file_type: l1c_safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids xml_item: Zenith - - solar_zenith_angle_l2a: - name: solar_zenith_angle_l2a - resolution: [10, 20, 60] - file_type: l2a_safe_tile_metadata - xml_tag: Sun_Angles_Grid/Zenith - - solar_azimuth_angle_l2a: - name: solar_azimuth_angle_l2a - resolution: [10, 20, 60] - file_type: l2a_safe_tile_metadata - xml_tag: Sun_Angles_Grid/Azimuth - - satellite_azimuth_angle_l2a: - name: satellite_azimuth_angle_l2a - resolution: [10, 20, 60] - file_type: l2a_safe_tile_metadata - xml_tag: Viewing_Incidence_Angles_Grids - xml_item: Azimuth - - satellite_zenith_angle_l2a: - name: satellite_zenith_angle_l2a - resolution: [10, 20, 60] - file_type: l2a_safe_tile_metadata - xml_tag: Viewing_Incidence_Angles_Grids - xml_item: Zenith diff --git a/satpy/etc/readers/msi_safe_l2a.yaml b/satpy/etc/readers/msi_safe_l2a.yaml new file mode 100644 index 0000000000..e11b521f51 --- /dev/null +++ b/satpy/etc/readers/msi_safe_l2a.yaml @@ -0,0 +1,315 @@ +reader: + name: msi_safe_l2a + short_name: MSI SAFE L2A + long_name: Sentinel-2 A and B MSI L2A data in SAFE format + description: SAFE Reader for MSI L2A data (Sentinel-2) + status: Nominal + supports_fsspec: false + sensors: [msi] + default_channels: [] + reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader + +file_types: + l2a_safe_granule_10m: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R10m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_10m.jp2'] + requires: [l2a_safe_metadata, l2a_safe_tile_metadata] + l2a_safe_granule_20m: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R20m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_20m.jp2'] + requires: [l2a_safe_metadata, l2a_safe_tile_metadata] + l2a_safe_granule_60m: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/R60m/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}_60m.jp2'] + requires: [l2a_safe_metadata, l2a_safe_tile_metadata] + l2a_safe_tile_metadata: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L2A_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + l2a_safe_metadata: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL2A.xml'] + +datasets: + B01_L2A: + name: B01_L2A + sensor: msi + wavelength: [0.415, 0.443, 0.470] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B02_L2A: + name: B02_L2A + sensor: msi + wavelength: [0.440, 0.490, 0.540] + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B03_L2A: + name: B03_L2A + sensor: msi + wavelength: [0.540, 0.560, 0.580] + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B04_L2A: + name: B04_L2A + sensor: msi + wavelength: [0.645, 0.665, 0.685] + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B05_L2A: + name: B05_L2A + sensor: msi + wavelength: [0.695, 0.705, 0.715] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B06_L2A: + name: B06_L2A + sensor: msi + wavelength: [0.731, 0.740, 0.749] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B07_L2A: + name: B07_L2A + sensor: msi + wavelength: [0.764, 0.783, 0.802] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B08_L2A: + name: B08_L2A + sensor: msi + wavelength: [0.780, 0.842, 0.905] + resolution: + 10: {file_type: l2a_safe_granule_10m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B8A_L2A: + name: B8A_L2A + sensor: msi + wavelength: [0.855, 0.865, 0.875] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B09_L2A: + name: B09_L2A + sensor: msi + wavelength: [0.935, 0.945, 0.955] + resolution: + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B11_L2A: + name: B11_L2A + sensor: msi + wavelength: [1.565, 1.610, 1.655] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + B12_L2A: + name: B12_L2A + sensor: msi + wavelength: [2.100, 2.190, 2.280] + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + reflectance: + standard_name: toa_bidirectional_reflectance + units: "%" + radiance: + standard_name: toa_outgoing_radiance_per_unit_wavelength + units: W m-2 um-1 sr-1 + counts: + standard_name: counts + units: "1" + + AOT_L2A: + name: AOT_L2A + sensor: msi + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + aerosol_thickness: + standard_name: aerosol_optical_thickness + units: "1" + counts: + standard_name: counts + units: "1" + + WVP_L2A: + name: WVP_L2A + sensor: msi + resolution: + 10: {file_type: l2a_safe_granule_10m} + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + water_vapor: + standard_name: water_vapor + units: cm + counts: + standard_name: counts + units: "1" + + SCL_L2A: + name: SCL_L2A + sensor: msi + resolution: + 20: {file_type: l2a_safe_granule_20m} + 60: {file_type: l2a_safe_granule_60m} + calibration: + counts: + standard_name: counts + units: "1" + + solar_zenith_angle_l2a: + name: solar_zenith_angle_l2a + resolution: [10, 20, 60] + file_type: l2a_safe_tile_metadata + xml_tag: Sun_Angles_Grid/Zenith + + solar_azimuth_angle_l2a: + name: solar_azimuth_angle_l2a + resolution: [10, 20, 60] + file_type: l2a_safe_tile_metadata + xml_tag: Sun_Angles_Grid/Azimuth + + satellite_azimuth_angle_l2a: + name: satellite_azimuth_angle_l2a + resolution: [10, 20, 60] + file_type: l2a_safe_tile_metadata + xml_tag: Viewing_Incidence_Angles_Grids + xml_item: Azimuth + + satellite_zenith_angle_l2a: + name: satellite_zenith_angle_l2a + resolution: [10, 20, 60] + file_type: l2a_safe_tile_metadata + xml_tag: Viewing_Incidence_Angles_Grids + xml_item: Zenith From 478f2e1d9ffcc67f45cb094dd8d3c2f08a93a5ff Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 22 Apr 2024 18:41:08 +0800 Subject: [PATCH 369/481] Update msi.yaml --- satpy/etc/composites/msi.yaml | 296 +++++++++++++++++++++++++--------- 1 file changed, 220 insertions(+), 76 deletions(-) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index b17aa0e856..74dd859dfd 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -1,70 +1,137 @@ sensor_name: visir/msi modifiers: - rayleigh_corrected: + rayleigh_corr: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: rayleigh_only prerequisites: - - name: 'B04' - modifiers: [sunz_corrected] - optional_prerequisites: - - satellite_azimuth_angle - - satellite_zenith_angle - - solar_azimuth_angle - - solar_zenith_angle - - rayleigh_corrected_marine_clean: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_antarctic: + modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance + atmosphere: us-standard + aerosol_type: antarctic_aerosol + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_continental_average: + modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance + atmosphere: us-standard + aerosol_type: continental_average_aerosol + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_continental_clean: + modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance + atmosphere: us-standard + aerosol_type: continental_clean_aerosol + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_continental_polluted: + modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance + atmosphere: us-standard + aerosol_type: continental_polluted_aerosol + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_desert: + modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance + atmosphere: us-standard + aerosol_type: desert_aerosol + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_marine_clean: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: marine_clean_aerosol prerequisites: - - name: 'B04' - modifiers: [sunz_corrected] - optional_prerequisites: - - satellite_azimuth_angle - - satellite_zenith_angle - - solar_azimuth_angle - - solar_zenith_angle - - rayleigh_corrected_marine_tropical: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_marine_polluted: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance - atmosphere: tropical + atmosphere: us-standard + aerosol_type: marine_polluted_aerosol + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_marine_tropical: + modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance + atmosphere: us-standard aerosol_type: marine_tropical_aerosol prerequisites: - - name: 'B04' - modifiers: [sunz_corrected] - optional_prerequisites: - - satellite_azimuth_angle - - satellite_zenith_angle - - solar_azimuth_angle - - solar_zenith_angle - - rayleigh_corrected_desert: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_rural: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance - atmosphere: tropical - aerosol_type: desert_aerosol + atmosphere: us-standard + aerosol_type: rural_aerosol prerequisites: - - name: 'B04' - modifiers: [sunz_corrected] - optional_prerequisites: - - satellite_azimuth_angle - - satellite_zenith_angle - - solar_azimuth_angle - - solar_zenith_angle - - rayleigh_corrected_land: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + rayleigh_corr_urban: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard - aerosol_type: continental_average_aerosol + aerosol_type: urban_aerosol prerequisites: - - name: 'B04' - modifiers: [sunz_corrected] - optional_prerequisites: - - satellite_azimuth_angle - - satellite_zenith_angle - - solar_azimuth_angle - - solar_zenith_angle + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle composites: @@ -82,55 +149,132 @@ composites: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr] standard_name: true_color - true_color_land: + true_color_antarctic: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_land] - - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_land] - - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_land] + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_antarctic] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_antarctic] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_antarctic] + standard_name: true_color + + true_color_continental_average: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_average] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_average] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_average] + standard_name: true_color + + true_color_continental_clean: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_clean] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_clean] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_clean] + standard_name: true_color + + true_color_continental_polluted: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_polluted] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_polluted] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_polluted] standard_name: true_color true_color_desert: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_desert] - - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_desert] - - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_desert] + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_desert] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_desert] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_desert] standard_name: true_color true_color_marine_clean: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_clean] - - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_clean] - - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_clean] + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_clean] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_clean] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_clean] + standard_name: true_color + + true_color_marine_polluted: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_polluted] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_polluted] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_polluted] standard_name: true_color true_color_marine_tropical: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_tropical] - - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_tropical] - - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_tropical] + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_tropical] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_tropical] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_tropical] + standard_name: true_color + + true_color_rural: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_rural] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_rural] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_rural] + standard_name: true_color + + true_color_urban: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_urban] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_urban] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_urban] + standard_name: true_color + + true_color_uncorr: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected] + - name: 'B02' + modifiers: [effective_solar_pathlength_corrected] standard_name: true_color true_color_raw: From a5a9815864ff9ec7a5abfca5ae6f0dd5735d1e04 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Mon, 22 Apr 2024 13:06:36 +0300 Subject: [PATCH 370/481] Fix datetime imports --- doc/source/conf.py | 4 +- satpy/cf/decoding.py | 6 +- satpy/composites/viirs.py | 6 +- satpy/dataset/metadata.py | 9 +- satpy/modifiers/angles.py | 10 +-- satpy/readers/__init__.py | 8 +- satpy/readers/aapp_l1b.py | 12 +-- satpy/readers/abi_base.py | 7 +- satpy/readers/acspo.py | 6 +- satpy/readers/ahi_hsd.py | 21 ++--- satpy/readers/ahi_l2_nc.py | 11 +-- satpy/readers/ami_l1b.py | 11 +-- satpy/readers/amsr2_l2_gaasp.py | 7 +- satpy/readers/ascat_l2_soilmoisture_bufr.py | 5 +- satpy/readers/atms_l1b_nc.py | 7 +- satpy/readers/avhrr_l1b_gaclac.py | 19 ++-- satpy/readers/caliop_l2_cloud.py | 5 +- satpy/readers/electrol_hrit.py | 6 +- satpy/readers/epic_l1b_h5.py | 7 +- satpy/readers/eum_base.py | 8 +- satpy/readers/fci_l1c_nc.py | 8 +- satpy/readers/fy4_base.py | 11 +-- satpy/readers/gerb_l2_hr_h5.py | 6 +- satpy/readers/ghrsst_l2.py | 7 +- satpy/readers/ghrsst_l3c_sst.py | 5 +- satpy/readers/glm_l2.py | 8 +- satpy/readers/goci2_l2_nc.py | 11 +-- satpy/readers/goes_imager_hrit.py | 17 ++-- satpy/readers/goes_imager_nc.py | 34 ++++--- satpy/readers/gpm_imerg.py | 27 +++--- satpy/readers/grib.py | 6 +- satpy/readers/hdfeos_base.py | 7 +- satpy/readers/hrit_base.py | 5 +- satpy/readers/hrit_jma.py | 11 +-- satpy/readers/hrpt.py | 9 +- satpy/readers/hsaf_grib.py | 8 +- satpy/readers/hsaf_h5.py | 6 +- satpy/readers/hy2_scat_l2b_h5.py | 10 +-- satpy/readers/iasi_l2_so2_bufr.py | 5 +- satpy/readers/ici_l1b_nc.py | 11 +-- satpy/readers/insat3d_img_l1b_h5.py | 9 +- satpy/readers/mersi_l1b.py | 6 +- satpy/readers/msu_gsa_l1b.py | 6 +- satpy/readers/mws_l1b.py | 13 +-- satpy/readers/nwcsaf_msg2013_hdf5.py | 5 +- satpy/readers/nwcsaf_nc.py | 9 +- satpy/readers/oceancolorcci_l3_nc.py | 5 +- satpy/readers/omps_edr.py | 8 +- satpy/readers/osisaf_l3_nc.py | 4 +- satpy/readers/scatsat1_l2b.py | 8 +- satpy/readers/scmi.py | 5 +- satpy/readers/seadas_l2.py | 7 +- satpy/readers/seviri_base.py | 13 +-- satpy/readers/seviri_l1b_hrit.py | 7 +- satpy/readers/seviri_l1b_icare.py | 12 +-- satpy/readers/seviri_l1b_native.py | 11 +-- satpy/readers/seviri_l1b_nc.py | 13 ++- satpy/readers/seviri_l2_bufr.py | 7 +- satpy/readers/seviri_l2_grib.py | 4 +- satpy/readers/sgli_l1b.py | 7 +- satpy/readers/slstr_l1b.py | 19 ++-- satpy/readers/smos_l2_wind.py | 6 +- satpy/readers/tropomi_l2.py | 6 +- satpy/readers/vii_base_nc.py | 10 +-- satpy/readers/viirs_atms_sdr_base.py | 8 +- satpy/readers/viirs_compact.py | 6 +- satpy/readers/viirs_l1b.py | 4 +- satpy/readers/viirs_l2.py | 5 +- satpy/readers/viirs_sdr.py | 7 +- satpy/readers/viirs_vgac_l1c_nc.py | 10 +-- satpy/readers/virr_l1b.py | 6 +- satpy/tests/cf_tests/test_decoding.py | 12 +-- satpy/tests/compositor_tests/test_viirs.py | 9 +- satpy/tests/features/steps/steps-load.py | 12 +-- satpy/tests/modifier_tests/test_angles.py | 13 ++- satpy/tests/modifier_tests/test_crefl.py | 18 ++-- satpy/tests/multiscene_tests/test_blend.py | 50 +++++------ .../multiscene_tests/test_save_animation.py | 51 +++++------ satpy/tests/reader_tests/_li_test_utils.py | 12 +-- .../modis_tests/_modis_fixtures.py | 16 ++-- satpy/tests/reader_tests/test_abi_l1b.py | 8 +- satpy/tests/reader_tests/test_abi_l2_nc.py | 8 +- satpy/tests/reader_tests/test_acspo.py | 8 +- satpy/tests/reader_tests/test_ahi_hsd.py | 88 ++++++++++--------- satpy/tests/reader_tests/test_ahi_l2_nc.py | 6 +- satpy/tests/reader_tests/test_ami_l1b.py | 6 +- .../tests/reader_tests/test_amsr2_l2_gaasp.py | 6 +- .../test_ascat_l2_soilmoisture_bufr.py | 7 +- satpy/tests/reader_tests/test_atms_l1b_nc.py | 19 ++-- .../tests/reader_tests/test_atms_sdr_hdf5.py | 6 +- .../reader_tests/test_avhrr_l1b_gaclac.py | 9 +- satpy/tests/reader_tests/test_epic_l1b_h5.py | 6 +- satpy/tests/reader_tests/test_eum_base.py | 21 ++--- .../tests/reader_tests/test_generic_image.py | 4 +- satpy/tests/reader_tests/test_ghrsst_l2.py | 10 +-- satpy/tests/reader_tests/test_glm_l2.py | 6 +- satpy/tests/reader_tests/test_goci2_l2_nc.py | 8 +- satpy/tests/reader_tests/test_gpm_imerg.py | 8 +- satpy/tests/reader_tests/test_hrit_base.py | 10 +-- satpy/tests/reader_tests/test_hsaf_grib.py | 4 +- satpy/tests/reader_tests/test_hsaf_h5.py | 5 +- .../reader_tests/test_hy2_scat_l2b_h5.py | 6 +- satpy/tests/reader_tests/test_ici_l1b_nc.py | 21 ++--- .../reader_tests/test_insat3d_img_l1b_h5.py | 7 +- satpy/tests/reader_tests/test_li_l2_nc.py | 6 +- .../reader_tests/test_mimic_TPW2_lowres.py | 4 +- .../tests/reader_tests/test_mimic_TPW2_nc.py | 7 +- satpy/tests/reader_tests/test_mirs.py | 10 ++- satpy/tests/reader_tests/test_mws_l1b_nc.py | 20 ++--- .../reader_tests/test_oceancolorcci_l3_nc.py | 7 +- satpy/tests/reader_tests/test_osisaf_l3.py | 18 ++-- satpy/tests/reader_tests/test_satpy_cf_nc.py | 18 ++-- satpy/tests/reader_tests/test_scmi.py | 6 +- satpy/tests/reader_tests/test_seviri_base.py | 74 ++++++++-------- .../test_seviri_l1b_calibration.py | 6 +- .../reader_tests/test_seviri_l1b_hrit.py | 17 ++-- .../test_seviri_l1b_hrit_setup.py | 25 +++--- .../reader_tests/test_seviri_l1b_icare.py | 4 +- .../reader_tests/test_seviri_l1b_native.py | 30 +++---- .../tests/reader_tests/test_seviri_l1b_nc.py | 28 +++--- .../tests/reader_tests/test_seviri_l2_bufr.py | 4 +- satpy/tests/reader_tests/test_sgli_l1b.py | 11 +-- satpy/tests/reader_tests/test_slstr_l1b.py | 12 +-- satpy/tests/reader_tests/test_smos_l2_wind.py | 6 +- satpy/tests/reader_tests/test_tropomi_l2.py | 15 ++-- satpy/tests/reader_tests/test_utils.py | 7 +- satpy/tests/reader_tests/test_viirs_edr.py | 12 +-- satpy/tests/reader_tests/test_viirs_l1b.py | 8 +- satpy/tests/reader_tests/test_viirs_l2.py | 9 +- satpy/tests/reader_tests/test_viirs_sdr.py | 14 +-- .../reader_tests/test_viirs_vgac_l1c_nc.py | 17 ++-- satpy/tests/scene_tests/test_conversions.py | 24 ++--- satpy/tests/scene_tests/test_saving.py | 12 +-- satpy/tests/test_composites.py | 9 +- satpy/tests/test_dataset.py | 67 +++++++------- satpy/tests/test_file_handlers.py | 25 +++--- satpy/tests/test_modifiers.py | 8 +- satpy/tests/test_readers.py | 40 +++------ satpy/tests/test_writers.py | 10 +-- satpy/tests/test_yaml_reader.py | 78 ++++++++-------- satpy/tests/utils.py | 6 +- satpy/tests/writer_tests/test_awips_tiled.py | 8 +- satpy/tests/writer_tests/test_cf.py | 58 ++++++------ satpy/tests/writer_tests/test_geotiff.py | 6 +- satpy/tests/writer_tests/test_mitiff.py | 46 +++------- satpy/tests/writer_tests/test_simple_image.py | 4 +- satpy/writers/awips_tiled.py | 13 +-- 147 files changed, 1006 insertions(+), 916 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 020544ee4a..4bf20b0e38 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -14,9 +14,9 @@ from __future__ import annotations +import datetime as dt import os import sys -from datetime import datetime # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the @@ -117,7 +117,7 @@ def __getattr__(cls, name): # General information about the project. project = u"Satpy" -copyright = u"2009-{}, The PyTroll Team".format(datetime.utcnow().strftime("%Y")) # noqa: A001 +copyright = u"2009-{}, The PyTroll Team".format(dt.datetime.utcnow().strftime("%Y")) # noqa: A001 # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/satpy/cf/decoding.py b/satpy/cf/decoding.py index 0d7a9d22be..2515f6bd38 100644 --- a/satpy/cf/decoding.py +++ b/satpy/cf/decoding.py @@ -15,10 +15,12 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """CF decoding.""" + import copy +import datetime as dt import json -from datetime import datetime def decode_attrs(attrs): @@ -69,6 +71,6 @@ def _datetime_parser_json(json_dict): def _str2datetime(string): """Convert string to datetime object.""" try: - return datetime.fromisoformat(string) + return dt.datetime.fromisoformat(string) except (TypeError, ValueError): return None diff --git a/satpy/composites/viirs.py b/satpy/composites/viirs.py index 5df2d482af..a9a047fd21 100644 --- a/satpy/composites/viirs.py +++ b/satpy/composites/viirs.py @@ -15,12 +15,14 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Composite classes for the VIIRS instrument.""" + from __future__ import annotations +import datetime as dt import logging import math -from datetime import datetime import dask import dask.array as da @@ -842,7 +844,7 @@ def _linear_normalization_from_0to1( data[mask] = data[mask] / theoretical_max -def _check_moon_phase(moon_datasets: list[xr.DataArray], start_time: datetime) -> float: +def _check_moon_phase(moon_datasets: list[xr.DataArray], start_time: dt.datetime) -> float: """Check if we have Moon phase as an input dataset and, if not, calculate it.""" if moon_datasets: # convert to decimal instead of % diff --git a/satpy/dataset/metadata.py b/satpy/dataset/metadata.py index a328402e0a..03208ebc50 100644 --- a/satpy/dataset/metadata.py +++ b/satpy/dataset/metadata.py @@ -15,11 +15,12 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Utilities for merging metadata from various sources.""" +import datetime as dt import warnings from collections.abc import Collection -from datetime import datetime from functools import partial, reduce from operator import eq, is_ @@ -135,7 +136,7 @@ def _combine_time_parameters(values): def _filter_time_values(values): """Remove values that are not datetime objects.""" - return [v for v in values if isinstance(v, datetime)] + return [v for v in values if isinstance(v, dt.datetime)] def average_datetimes(datetime_list): @@ -152,8 +153,8 @@ def average_datetimes(datetime_list): Returns: Average datetime as a datetime object """ - total = [datetime.timestamp(dt) for dt in datetime_list] - return datetime.fromtimestamp(sum(total) / len(total)) + total = [dt.datetime.timestamp(d) for d in datetime_list] + return dt.datetime.fromtimestamp(sum(total) / len(total)) def _are_values_combinable(values): diff --git a/satpy/modifiers/angles.py b/satpy/modifiers/angles.py index 1471ba3669..5ea8530612 100644 --- a/satpy/modifiers/angles.py +++ b/satpy/modifiers/angles.py @@ -18,11 +18,11 @@ """Utilties for getting various angles for a dataset..""" from __future__ import annotations +import datetime as dt import hashlib import os import shutil import warnings -from datetime import datetime from functools import update_wrapper from glob import glob from typing import Any, Callable, Optional, Union @@ -45,7 +45,7 @@ # pyorbital's get_observer_look function. # The difference is on the order of 1e-10 at most as time changes so we force # it to a single time for easier caching. It is *only* used if caching. -STATIC_EARTH_INERTIAL_DATETIME = datetime(2000, 1, 1, 12, 0, 0) +STATIC_EARTH_INERTIAL_DATETIME = dt.datetime(2000, 1, 1, 12, 0, 0) DEFAULT_UNCACHE_TYPES = (SwathDefinition, xr.DataArray, da.Array) HASHABLE_GEOMETRIES = (AreaDefinition, StackedAreaDefinition) @@ -263,7 +263,7 @@ def _hash_args(*args, unhashable_types=DEFAULT_UNCACHE_TYPES): raise TypeError(f"Unhashable type ({type(arg)}).") if isinstance(arg, HASHABLE_GEOMETRIES): arg = hash(arg) - elif isinstance(arg, datetime): + elif isinstance(arg, dt.datetime): arg = arg.isoformat(" ") hashable_args.append(arg) arg_hash = hashlib.sha1() # nosec @@ -274,7 +274,7 @@ def _hash_args(*args, unhashable_types=DEFAULT_UNCACHE_TYPES): def _sanitize_observer_look_args(*args): new_args = [] for arg in args: - if isinstance(arg, datetime): + if isinstance(arg, dt.datetime): new_args.append(STATIC_EARTH_INERTIAL_DATETIME) elif isinstance(arg, (float, np.float64, np.float32)): # Round floating point numbers to nearest tenth. Numpy types don't @@ -448,7 +448,7 @@ def _cos_zen_ndarray(lons, lats, utc_time): return pyob_cos_zen(utc_time, lons, lats) -def _get_sun_azimuth_ndarray(lons: np.ndarray, lats: np.ndarray, start_time: datetime) -> np.ndarray: +def _get_sun_azimuth_ndarray(lons: np.ndarray, lats: np.ndarray, start_time: dt.datetime) -> np.ndarray: with ignore_invalid_float_warnings(): suna = get_alt_az(start_time, lons, lats)[1] suna = np.rad2deg(suna) diff --git a/satpy/readers/__init__.py b/satpy/readers/__init__.py index ca131b101f..7835292eff 100644 --- a/satpy/readers/__init__.py +++ b/satpy/readers/__init__.py @@ -15,15 +15,17 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Shared objects of the various reader classes.""" + from __future__ import annotations +import datetime as dt import logging import os import pathlib import pickle # nosec B403 import warnings -from datetime import datetime, timedelta from functools import total_ordering import yaml @@ -213,7 +215,7 @@ def _get_sorted_file_groups(all_file_keys, time_threshold): # noqa: D417 # interest of sorting flat_keys = ((v[0], rn, v[1]) for (rn, vL) in all_file_keys.items() for v in vL) prev_key = None - threshold = timedelta(seconds=time_threshold) + threshold = dt.timedelta(seconds=time_threshold) # file_groups is sorted, because dictionaries are sorted by insertion # order in Python 3.7+ file_groups = {} @@ -222,7 +224,7 @@ def _get_sorted_file_groups(all_file_keys, time_threshold): # noqa: D417 if prev_key is None: is_new_group = True prev_key = gk - elif isinstance(gk[0], datetime): + elif isinstance(gk[0], dt.datetime): # datetimes within threshold difference are "the same time" is_new_group = (gk[0] - prev_key[0]) > threshold else: diff --git a/satpy/readers/aapp_l1b.py b/satpy/readers/aapp_l1b.py index e502a9da64..6e3072b4d0 100644 --- a/satpy/readers/aapp_l1b.py +++ b/satpy/readers/aapp_l1b.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for aapp level 1b data. Options for loading: @@ -24,9 +25,10 @@ https://nwp-saf.eumetsat.int/site/download/documentation/aapp/NWPSAF-MF-UD-003_Formats_v8.0.pdf """ + +import datetime as dt import functools import logging -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -102,14 +104,14 @@ def _set_filedata_layout(self): @property def start_time(self): """Get the time of the first observation.""" - return datetime(self._data["scnlinyr"][0], 1, 1) + timedelta( + return dt.datetime(self._data["scnlinyr"][0], 1, 1) + dt.timedelta( days=int(self._data["scnlindy"][0]) - 1, milliseconds=int(self._data["scnlintime"][0])) @property def end_time(self): """Get the time of the final observation.""" - return datetime(self._data["scnlinyr"][-1], 1, 1) + timedelta( + return dt.datetime(self._data["scnlinyr"][-1], 1, 1) + dt.timedelta( days=int(self._data["scnlindy"][-1]) - 1, milliseconds=int(self._data["scnlintime"][-1])) @@ -129,10 +131,10 @@ def _get_platform_name(self, platform_names_lookup): def read(self): """Read the data.""" - tic = datetime.now() + tic = dt.datetime.now() header = np.memmap(self.filename, dtype=self._header_type, mode="r", shape=(1, )) data = np.memmap(self.filename, dtype=self._scan_type, offset=self._header_offset, mode="r") - logger.debug("Reading time %s", str(datetime.now() - tic)) + logger.debug("Reading time %s", str(dt.datetime.now() - tic)) self._header = header self._data = data diff --git a/satpy/readers/abi_base.py b/satpy/readers/abi_base.py index 107382d7ba..ecfd20a830 100644 --- a/satpy/readers/abi_base.py +++ b/satpy/readers/abi_base.py @@ -15,12 +15,13 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Advance Baseline Imager reader base class for the Level 1b and l2+ reader.""" +import datetime as dt import logging import math from contextlib import suppress -from datetime import datetime import dask import numpy as np @@ -291,12 +292,12 @@ def _get_areadef_fixedgrid(self, key): @property def start_time(self): """Start time of the current file's observations.""" - return datetime.strptime(self.nc.attrs["time_coverage_start"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["time_coverage_start"], "%Y-%m-%dT%H:%M:%S.%fZ") @property def end_time(self): """End time of the current file's observations.""" - return datetime.strptime(self.nc.attrs["time_coverage_end"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["time_coverage_end"], "%Y-%m-%dT%H:%M:%S.%fZ") def spatial_resolution_to_number(self): """Convert the 'spatial_resolution' global attribute to meters.""" diff --git a/satpy/readers/acspo.py b/satpy/readers/acspo.py index 8a8262af33..90356f46e2 100644 --- a/satpy/readers/acspo.py +++ b/satpy/readers/acspo.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """ACSPO SST Reader. See the following page for more information: @@ -22,8 +23,9 @@ https://podaac.jpl.nasa.gov/dataset/VIIRS_NPP-OSPO-L2P-v2.3 """ + +import datetime as dt import logging -from datetime import datetime import numpy as np @@ -83,7 +85,7 @@ def get_shape(self, ds_id, ds_info): @staticmethod def _parse_datetime(datestr): - return datetime.strptime(datestr, "%Y%m%dT%H%M%SZ") + return dt.datetime.strptime(datestr, "%Y%m%dT%H%M%SZ") @property def start_time(self): diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index bf2ab09e79..7ea83a6820 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Advanced Himawari Imager (AHI) standard format data reader. References: @@ -58,10 +59,10 @@ """ +import datetime as dt import logging import os import warnings -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -419,12 +420,12 @@ def end_time(self): @property def observation_start_time(self): """Get the observation start time.""" - return datetime(1858, 11, 17) + timedelta(days=float(self.basic_info["observation_start_time"].item())) + return dt.datetime(1858, 11, 17) + dt.timedelta(days=float(self.basic_info["observation_start_time"].item())) @property def observation_end_time(self): """Get the observation end time.""" - return datetime(1858, 11, 17) + timedelta(days=float(self.basic_info["observation_end_time"].item())) + return dt.datetime(1858, 11, 17) + dt.timedelta(days=float(self.basic_info["observation_end_time"].item())) @property def _timeline(self): @@ -760,7 +761,7 @@ def __init__(self, timeline, area): def _parse_timeline(self, timeline): try: - return datetime.strptime(timeline, "%H%M").time() + return dt.datetime.strptime(timeline, "%H%M").time() except ValueError: return None @@ -771,8 +772,8 @@ def get_nominal_start_time(self, observation_start_time): def get_nominal_end_time(self, nominal_start_time): """Get nominal end time of the scan.""" freq = self._observation_frequency - return nominal_start_time + timedelta(minutes=freq // 60, - seconds=freq % 60) + return nominal_start_time + dt.timedelta(minutes=freq // 60, + seconds=freq % 60) def _modify_observation_time_for_nominal(self, observation_time): """Round observation time to a nominal time based on known observation frequency. @@ -793,8 +794,8 @@ def _modify_observation_time_for_nominal(self, observation_time): ) return observation_time timeline = self._get_closest_timeline(observation_time) - dt = self._get_offset_relative_to_timeline() - return timeline + timedelta(minutes=dt//60, seconds=dt % 60) + date = self._get_offset_relative_to_timeline() + return timeline + dt.timedelta(minutes=date//60, seconds=date % 60) def _get_closest_timeline(self, observation_time): """Find the closest timeline for the given observation time. @@ -808,11 +809,11 @@ def _get_closest_timeline(self, observation_time): """ delta_days = [-1, 0, 1] surrounding_dates = [ - (observation_time + timedelta(days=delta)).date() + (observation_time + dt.timedelta(days=delta)).date() for delta in delta_days ] timelines = [ - datetime.combine(date, self.timeline) + dt.datetime.combine(date, self.timeline) for date in surrounding_dates ] diffs = [ diff --git a/satpy/readers/ahi_l2_nc.py b/satpy/readers/ahi_l2_nc.py index d6e6caa887..92c2915a1e 100644 --- a/satpy/readers/ahi_l2_nc.py +++ b/satpy/readers/ahi_l2_nc.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for Himawari L2 cloud products from NOAA's big data programme. For more information about the data, see: . @@ -43,8 +44,8 @@ supported. These include the CldHgtFlag and the CloudMaskPacked variables. """ +import datetime as dt import logging -from datetime import datetime import xarray as xr @@ -82,14 +83,14 @@ def __init__(self, filename, filename_info, filetype_info): @property def start_time(self): """Start timestamp of the dataset.""" - dt = self.nc.attrs["time_coverage_start"] - return datetime.strptime(dt, "%Y-%m-%dT%H:%M:%SZ") + date = self.nc.attrs["time_coverage_start"] + return dt.datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ") @property def end_time(self): """End timestamp of the dataset.""" - dt = self.nc.attrs["time_coverage_end"] - return datetime.strptime(dt, "%Y-%m-%dT%H:%M:%SZ") + date = self.nc.attrs["time_coverage_end"] + return dt.datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ") def get_dataset(self, key, info): """Load a dataset.""" diff --git a/satpy/readers/ami_l1b.py b/satpy/readers/ami_l1b.py index db8c8444d8..6841189eef 100644 --- a/satpy/readers/ami_l1b.py +++ b/satpy/readers/ami_l1b.py @@ -15,10 +15,11 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Advanced Meteorological Imager reader for the Level 1b NetCDF4 format.""" +import datetime as dt import logging -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -117,14 +118,14 @@ def __init__(self, filename, filename_info, filetype_info, @property def start_time(self): """Get observation start time.""" - base = datetime(2000, 1, 1, 12, 0, 0) - return base + timedelta(seconds=self.nc.attrs["observation_start_time"]) + base = dt.datetime(2000, 1, 1, 12, 0, 0) + return base + dt.timedelta(seconds=self.nc.attrs["observation_start_time"]) @property def end_time(self): """Get observation end time.""" - base = datetime(2000, 1, 1, 12, 0, 0) - return base + timedelta(seconds=self.nc.attrs["observation_end_time"]) + base = dt.datetime(2000, 1, 1, 12, 0, 0) + return base + dt.timedelta(seconds=self.nc.attrs["observation_end_time"]) def get_area_def(self, dsid): """Get area definition for this file.""" diff --git a/satpy/readers/amsr2_l2_gaasp.py b/satpy/readers/amsr2_l2_gaasp.py index 54a3769747..21442f6f3a 100644 --- a/satpy/readers/amsr2_l2_gaasp.py +++ b/satpy/readers/amsr2_l2_gaasp.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """GCOM-W1 AMSR2 Level 2 files from the GAASP software. GAASP output files are in the NetCDF4 format. Software is provided by NOAA @@ -36,8 +37,8 @@ """ +import datetime as dt import logging -from datetime import datetime from typing import Tuple import numpy as np @@ -94,7 +95,7 @@ def start_time(self): return self.filename_info["start_time"] except KeyError: time_str = self.nc.attrs["time_coverage_start"] - return datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S.%fZ") @property def end_time(self): @@ -103,7 +104,7 @@ def end_time(self): return self.filename_info["end_time"] except KeyError: time_str = self.nc.attrs["time_coverage_end"] - return datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S.%fZ") @property def sensor_names(self): diff --git a/satpy/readers/ascat_l2_soilmoisture_bufr.py b/satpy/readers/ascat_l2_soilmoisture_bufr.py index a5f77fd7eb..9619977e89 100644 --- a/satpy/readers/ascat_l2_soilmoisture_bufr.py +++ b/satpy/readers/ascat_l2_soilmoisture_bufr.py @@ -15,14 +15,15 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """ASCAT Soil moisture product reader for BUFR messages. Based on the IASI L2 SO2 BUFR reader. """ +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -82,7 +83,7 @@ def extract_msg_date_extremes(self, bufr, date_min=None, date_max=None): minutes = np.resize(ec.codes_get_array(bufr, "minute"), size) seconds = np.resize(ec.codes_get_array(bufr, "second"), size) for year, month, day, hour, minute, second in zip(years, months, days, hours, minutes, seconds): - time_stamp = datetime(year, month, day, hour, minute, second) + time_stamp = dt.datetime(year, month, day, hour, minute, second) date_min = time_stamp if not date_min else min(date_min, time_stamp) date_max = time_stamp if not date_max else max(date_max, time_stamp) return date_min, date_max diff --git a/satpy/readers/atms_l1b_nc.py b/satpy/readers/atms_l1b_nc.py index 95d48b81cd..4b8587c824 100644 --- a/satpy/readers/atms_l1b_nc.py +++ b/satpy/readers/atms_l1b_nc.py @@ -12,6 +12,7 @@ # # You should have received a copy of the GNU General Public License # along with satpy. If not, see . + """Advanced Technology Microwave Sounder (ATMS) Level 1B product reader. The format is explained in the `ATMS L1B Product User Guide`_ @@ -21,8 +22,8 @@ """ +import datetime as dt import logging -from datetime import datetime from satpy.readers.netcdf_utils import NetCDF4FileHandler @@ -43,12 +44,12 @@ def __init__(self, filename, filename_info, filetype_info, **kwargs): @property def start_time(self): """Get observation start time.""" - return datetime.strptime(self["/attr/time_coverage_start"], DATE_FMT) + return dt.datetime.strptime(self["/attr/time_coverage_start"], DATE_FMT) @property def end_time(self): """Get observation end time.""" - return datetime.strptime(self["/attr/time_coverage_end"], DATE_FMT) + return dt.datetime.strptime(self["/attr/time_coverage_end"], DATE_FMT) @property def platform_name(self): diff --git a/satpy/readers/avhrr_l1b_gaclac.py b/satpy/readers/avhrr_l1b_gaclac.py index 96a13449f7..47f0d97283 100644 --- a/satpy/readers/avhrr_l1b_gaclac.py +++ b/satpy/readers/avhrr_l1b_gaclac.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reading and calibrating GAC and LAC AVHRR data. Uses Pygac under the hood. See the `Pygac Documentation`_ for supported data @@ -29,8 +30,8 @@ https://pygac.readthedocs.io/en/stable """ +import datetime as dt import logging -from datetime import date, datetime, timedelta import dask.array as da import numpy as np @@ -93,14 +94,14 @@ def __init__(self, filename, filename_info, filetype_info, # noqa: D417 self.first_valid_lat = None self.last_valid_lat = None self._start_time = filename_info["start_time"] - self._end_time = datetime.combine(filename_info["start_time"].date(), - filename_info["end_time"].time()) + self._end_time = dt.datetime.combine(filename_info["start_time"].date(), + filename_info["end_time"].time()) if self._end_time < self._start_time: - self._end_time += timedelta(days=1) + self._end_time += dt.timedelta(days=1) self.platform_id = filename_info["platform_id"] if len(self.platform_id) == 3: - self.reader_kwargs["header_date"] = date(2000, 1, 1) + self.reader_kwargs["header_date"] = dt.date(2000, 1, 1) if self._is_avhrr3(): if filename_info.get("transfer_mode") == "GHRR": @@ -184,8 +185,8 @@ def get_dataset(self, key, info): # Update start/end time using the actual scanline timestamps times = self.reader.get_times() - self._start_time = times[0].astype(datetime) - self._end_time = times[-1].astype(datetime) + self._start_time = times[0].astype(dt.datetime) + self._end_time = times[-1].astype(dt.datetime) # Select user-defined scanlines and/or strip invalid coordinates if (self.start_line is not None or self.end_line is not None @@ -223,8 +224,8 @@ def slice(self, data, times): # noqa: A003 """ sliced = self._slice(data) times = self._slice(times) - self._start_time = times[0].astype(datetime) - self._end_time = times[-1].astype(datetime) + self._start_time = times[0].astype(dt.datetime) + self._end_time = times[-1].astype(dt.datetime) return sliced, times def _slice(self, data): diff --git a/satpy/readers/caliop_l2_cloud.py b/satpy/readers/caliop_l2_cloud.py index 54dd100ffc..e088dfd853 100644 --- a/satpy/readers/caliop_l2_cloud.py +++ b/satpy/readers/caliop_l2_cloud.py @@ -16,12 +16,13 @@ # You should have received a copy of the GNU General Public License along with # satpy. If not, see . # type: ignore + """Interface to CALIOP L2 HDF4 cloud products.""" +import datetime as dt import logging import os.path import re -from datetime import datetime from pyhdf.SD import SD, SDC @@ -56,7 +57,7 @@ def get_end_time(self): mda_dict = self.filehandle.attributes() core_mda = mda_dict["coremetadata"] end_time_str = self.parse_metadata_string(core_mda) - self._end_time = datetime.strptime(end_time_str, "%Y-%m-%dT%H:%M:%SZ") + self._end_time = dt.datetime.strptime(end_time_str, "%Y-%m-%dT%H:%M:%SZ") @staticmethod def parse_metadata_string(metadata_string): diff --git a/satpy/readers/electrol_hrit.py b/satpy/readers/electrol_hrit.py index c773850a73..62f99fb0a4 100644 --- a/satpy/readers/electrol_hrit.py +++ b/satpy/readers/electrol_hrit.py @@ -24,8 +24,8 @@ """ +import datetime as dt import logging -from datetime import datetime import numpy as np import xarray as xr @@ -299,7 +299,7 @@ def get_dataset(self, key, info): def calibrate(self, data, calibration): """Calibrate the data.""" - tic = datetime.now() + tic = dt.datetime.now() if calibration == "counts": res = data elif calibration in ["radiance", "brightness_temperature"]: @@ -311,7 +311,7 @@ def calibrate(self, data, calibration): res.attrs["standard_name"] = calibration res.attrs["calibration"] = calibration - logger.debug("Calibration time " + str(datetime.now() - tic)) + logger.debug("Calibration time " + str(dt.datetime.now() - tic)) return res @staticmethod diff --git a/satpy/readers/epic_l1b_h5.py b/satpy/readers/epic_l1b_h5.py index 3fb8f69c01..0d993b0b6c 100644 --- a/satpy/readers/epic_l1b_h5.py +++ b/satpy/readers/epic_l1b_h5.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """File handler for DSCOVR EPIC L1B data in hdf5 format. The ``epic_l1b_h5`` reader reads and calibrates EPIC L1B image data in hdf5 format. @@ -37,8 +38,8 @@ """ +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -74,13 +75,13 @@ def __init__(self, filename, filename_info, filetype_info): @property def start_time(self): """Get the start time.""" - start_time = datetime.strptime(self.file_content["/attr/begin_time"], "%Y-%m-%d %H:%M:%S") + start_time = dt.datetime.strptime(self.file_content["/attr/begin_time"], "%Y-%m-%d %H:%M:%S") return start_time @property def end_time(self): """Get the end time.""" - end_time = datetime.strptime(self.file_content["/attr/end_time"], "%Y-%m-%d %H:%M:%S") + end_time = dt.datetime.strptime(self.file_content["/attr/end_time"], "%Y-%m-%d %H:%M:%S") return end_time @staticmethod diff --git a/satpy/readers/eum_base.py b/satpy/readers/eum_base.py index 3cbbb46433..fe4579301d 100644 --- a/satpy/readers/eum_base.py +++ b/satpy/readers/eum_base.py @@ -17,7 +17,7 @@ # satpy. If not, see . """Utilities for EUMETSAT satellite data.""" -from datetime import datetime, timedelta +import datetime as dt import numpy as np @@ -44,9 +44,9 @@ def timecds2datetime(tcds): except (KeyError, ValueError): pass - reference = datetime(1958, 1, 1) - delta = timedelta(days=days, milliseconds=milliseconds, - microseconds=microseconds) + reference = dt.datetime(1958, 1, 1) + delta = dt.timedelta(days=days, milliseconds=milliseconds, + microseconds=microseconds) return reference + delta diff --git a/satpy/readers/fci_l1c_nc.py b/satpy/readers/fci_l1c_nc.py index 0c7b9fb8cc..1344549fa9 100644 --- a/satpy/readers/fci_l1c_nc.py +++ b/satpy/readers/fci_l1c_nc.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Interface to MTG-FCI L1c NetCDF files. This module defines the :class:`FCIL1cNCFileHandler` file handler, to @@ -111,8 +112,8 @@ from __future__ import absolute_import, division, print_function, unicode_literals +import datetime as dt import logging -from datetime import timedelta from functools import cached_property import dask.array as da @@ -227,12 +228,13 @@ def rc_period_min(self): def nominal_start_time(self): """Get nominal start time.""" rc_date = self.observation_start_time.replace(hour=0, minute=0, second=0, microsecond=0) - return rc_date + timedelta(minutes=(self.filename_info["repeat_cycle_in_day"]-1)*self.rc_period_min) + return rc_date + dt.timedelta( + minutes=(self.filename_info["repeat_cycle_in_day"]-1)*self.rc_period_min) @property def nominal_end_time(self): """Get nominal end time.""" - return self.nominal_start_time + timedelta(minutes=self.rc_period_min) + return self.nominal_start_time + dt.timedelta(minutes=self.rc_period_min) @property def observation_start_time(self): diff --git a/satpy/readers/fy4_base.py b/satpy/readers/fy4_base.py index b0452a5735..160b5795dd 100644 --- a/satpy/readers/fy4_base.py +++ b/satpy/readers/fy4_base.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Base reader for the L1 HDF data from the AGRI and GHI instruments aboard the FengYun-4A/B satellites. The files read by this reader are described in the official Real Time Data Service: @@ -23,8 +24,8 @@ """ +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -200,20 +201,20 @@ def start_time(self): """Get the start time.""" start_time = self["/attr/Observing Beginning Date"] + "T" + self["/attr/Observing Beginning Time"] + "Z" try: - return datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%S.%fZ") except ValueError: # For some data there is no sub-second component - return datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%SZ") + return dt.datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%SZ") @property def end_time(self): """Get the end time.""" end_time = self["/attr/Observing Ending Date"] + "T" + self["/attr/Observing Ending Time"] + "Z" try: - return datetime.strptime(end_time, "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(end_time, "%Y-%m-%dT%H:%M:%S.%fZ") except ValueError: # For some data there is no sub-second component - return datetime.strptime(end_time, "%Y-%m-%dT%H:%M:%SZ") + return dt.datetime.strptime(end_time, "%Y-%m-%dT%H:%M:%SZ") def get_area_def(self, key): """Get the area definition.""" diff --git a/satpy/readers/gerb_l2_hr_h5.py b/satpy/readers/gerb_l2_hr_h5.py index 4f34c1fde8..6b3ceb5e0a 100644 --- a/satpy/readers/gerb_l2_hr_h5.py +++ b/satpy/readers/gerb_l2_hr_h5.py @@ -16,16 +16,14 @@ # You should have received a copy of the GNU General Public License along with # satpy. If not, see . - """GERB L2 HR HDF5 reader. A reader for the Top of Atmosphere outgoing fluxes from the Geostationary Earth Radiation Budget instrument aboard the Meteosat Second Generation satellites. """ - +import datetime as dt import logging -from datetime import timedelta from satpy.readers.hdf5_utils import HDF5FileHandler from satpy.resample import get_area_def @@ -55,7 +53,7 @@ class GERB_HR_FileHandler(HDF5FileHandler): @property def end_time(self): """Get end time.""" - return self.start_time + timedelta(minutes=15) + return self.start_time + dt.timedelta(minutes=15) @property def start_time(self): diff --git a/satpy/readers/ghrsst_l2.py b/satpy/readers/ghrsst_l2.py index 6c4005623e..d407d49f14 100644 --- a/satpy/readers/ghrsst_l2.py +++ b/satpy/readers/ghrsst_l2.py @@ -14,12 +14,13 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for the GHRSST level-2 formatted data.""" +import datetime as dt import os import tarfile from contextlib import suppress -from datetime import datetime from functools import cached_property import xarray as xr @@ -39,9 +40,9 @@ def __init__(self, filename, filename_info, filetype_info, engine=None): self._engine = engine self._tarfile = None - self.filename_info["start_time"] = datetime.strptime( + self.filename_info["start_time"] = dt.datetime.strptime( self.nc.start_time, "%Y%m%dT%H%M%SZ") - self.filename_info["end_time"] = datetime.strptime( + self.filename_info["end_time"] = dt.datetime.strptime( self.nc.stop_time, "%Y%m%dT%H%M%SZ") @cached_property diff --git a/satpy/readers/ghrsst_l3c_sst.py b/satpy/readers/ghrsst_l3c_sst.py index ef1dd220a9..8960275995 100644 --- a/satpy/readers/ghrsst_l3c_sst.py +++ b/satpy/readers/ghrsst_l3c_sst.py @@ -16,10 +16,11 @@ # You should have received a copy of the GNU General Public License along with # satpy. If not, see . # type: ignore + """An OSISAF SST reader for the netCDF GHRSST format.""" +import datetime as dt import logging -from datetime import datetime import numpy as np @@ -37,7 +38,7 @@ class GHRSST_OSISAFL2(NetCDF4FileHandler): """Reader for the OSISAF SST GHRSST format.""" def _parse_datetime(self, datestr): - return datetime.strptime(datestr, "%Y%m%dT%H%M%SZ") + return dt.datetime.strptime(datestr, "%Y%m%dT%H%M%SZ") def get_area_def(self, area_id, area_info): """Override abstract baseclass method.""" diff --git a/satpy/readers/glm_l2.py b/satpy/readers/glm_l2.py index ceb11a33bc..7f1e77cd50 100644 --- a/satpy/readers/glm_l2.py +++ b/satpy/readers/glm_l2.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Geostationary Lightning Mapper reader for the Level 2 format from glmtools. More information about `glmtools` and the files it produces can be found on @@ -23,8 +24,9 @@ https://github.com/deeplycloudy/glmtools """ + +import datetime as dt import logging -from datetime import datetime import numpy as np @@ -52,12 +54,12 @@ def sensor(self): @property def start_time(self): """Start time of the current file's observations.""" - return datetime.strptime(self.nc.attrs["time_coverage_start"], "%Y-%m-%dT%H:%M:%SZ") + return dt.datetime.strptime(self.nc.attrs["time_coverage_start"], "%Y-%m-%dT%H:%M:%SZ") @property def end_time(self): """End time of the current file's observations.""" - return datetime.strptime(self.nc.attrs["time_coverage_end"], "%Y-%m-%dT%H:%M:%SZ") + return dt.datetime.strptime(self.nc.attrs["time_coverage_end"], "%Y-%m-%dT%H:%M:%SZ") def _is_category_product(self, data_arr): # if after autoscaling we still have an integer diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index a79d582544..b60a3e3876 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -15,13 +15,14 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for GK-2B GOCI-II L2 products from NOSC. For more information about the data, see: """ +import datetime as dt import logging -from datetime import datetime import xarray as xr @@ -65,14 +66,14 @@ def _merge_navigation_data(self, filetype): @property def start_time(self): """Start timestamp of the dataset.""" - dt = self.attrs["observation_start_time"] - return datetime.strptime(dt, "%Y%m%d_%H%M%S") + date = self.attrs["observation_start_time"] + return dt.datetime.strptime(date, "%Y%m%d_%H%M%S") @property def end_time(self): """End timestamp of the dataset.""" - dt = self.attrs["observation_end_time"] - return datetime.strptime(dt, "%Y%m%d_%H%M%S") + date = self.attrs["observation_end_time"] + return dt.datetime.strptime(date, "%Y%m%d_%H%M%S") def get_dataset(self, key, info): """Load a dataset.""" diff --git a/satpy/readers/goes_imager_hrit.py b/satpy/readers/goes_imager_hrit.py index d90ebb4a72..401274debb 100644 --- a/satpy/readers/goes_imager_hrit.py +++ b/satpy/readers/goes_imager_hrit.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """GOES HRIT format reader. References: @@ -24,8 +25,8 @@ """ +import datetime as dt import logging -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -116,21 +117,21 @@ class CalibrationError(Exception): ("msecs", "u1")]) -def make_sgs_time(sgs_time_array: ArrayLike) -> datetime: +def make_sgs_time(sgs_time_array: ArrayLike) -> dt.datetime: """Make sgs time.""" epoch_year = _epoch_year_from_sgs_time(sgs_time_array) doy_offset = _epoch_doy_offset_from_sgs_time(sgs_time_array) return epoch_year + doy_offset -def _epoch_year_from_sgs_time(sgs_time_array: ArrayLike) -> datetime: +def _epoch_year_from_sgs_time(sgs_time_array: ArrayLike) -> dt.datetime: century = sgs_time_array["century"].astype(np.int64) year = sgs_time_array["year"].astype(np.int64) year = ((century >> 4) * 1000 + (century & 15) * 100 + (year >> 4) * 10 + (year & 15)) - return datetime(int(year), 1, 1) + return dt.datetime(int(year), 1, 1) -def _epoch_doy_offset_from_sgs_time(sgs_time_array: ArrayLike) -> timedelta: +def _epoch_doy_offset_from_sgs_time(sgs_time_array: ArrayLike) -> dt.timedelta: doy1 = sgs_time_array["doy1"].astype(np.int64) doy_hours = sgs_time_array["doy_hours"].astype(np.int64) hours_mins = sgs_time_array["hours_mins"].astype(np.int64) @@ -143,7 +144,7 @@ def _epoch_doy_offset_from_sgs_time(sgs_time_array: ArrayLike) -> timedelta: mins = ((hours_mins & 15) * 10 + (mins_secs >> 4)) secs = ((mins_secs & 15) * 10 + (secs_msecs >> 4)) msecs = ((secs_msecs & 15) * 100 + (msecs >> 4) * 10 + (msecs & 15)) - return timedelta( + return dt.timedelta( days=int(doy - 1), hours=int(hours), minutes=int(mins), @@ -426,7 +427,7 @@ def _get_calibration_params(self): def calibrate(self, data, calibration): """Calibrate the data.""" logger.debug("Calibration") - tic = datetime.now() + tic = dt.datetime.now() if calibration == "counts": return data if calibration == "reflectance": @@ -437,7 +438,7 @@ def calibrate(self, data, calibration): raise NotImplementedError("Don't know how to calibrate to " + str(calibration)) - logger.debug("Calibration time " + str(datetime.now() - tic)) + logger.debug("Calibration time " + str(dt.datetime.now() - tic)) return res def _calibrate(self, data): diff --git a/satpy/readers/goes_imager_nc.py b/satpy/readers/goes_imager_nc.py index 1b88919886..2916a36436 100644 --- a/satpy/readers/goes_imager_nc.py +++ b/satpy/readers/goes_imager_nc.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for GOES 8-15 imager data in netCDF format. Supports netCDF files from both NOAA-CLASS and EUMETSAT. @@ -223,10 +224,10 @@ .. _[SCHED-E]: http://www.ospo.noaa.gov/Operations/GOES/east/imager-routine.html """ +import datetime as dt import logging import re from abc import abstractmethod -from datetime import datetime, timedelta import numpy as np import pyresample.geometry @@ -593,11 +594,11 @@ } # (nlines, ncols) SCAN_DURATION = { - FULL_DISC: timedelta(minutes=26), - NORTH_HEMIS_WEST: timedelta(minutes=10, seconds=5), - SOUTH_HEMIS_WEST: timedelta(minutes=6, seconds=54), - NORTH_HEMIS_EAST: timedelta(minutes=14, seconds=15), - SOUTH_HEMIS_EAST: timedelta(minutes=4, seconds=49) + FULL_DISC: dt.timedelta(minutes=26), + NORTH_HEMIS_WEST: dt.timedelta(minutes=10, seconds=5), + SOUTH_HEMIS_WEST: dt.timedelta(minutes=6, seconds=54), + NORTH_HEMIS_EAST: dt.timedelta(minutes=14, seconds=15), + SOUTH_HEMIS_EAST: dt.timedelta(minutes=4, seconds=49) } # Source: [SCHED-W], [SCHED-E] @@ -730,10 +731,15 @@ def _get_area_def_uniform_sampling(self, lon0, channel): @property def start_time(self): """Start timestamp of the dataset.""" - dt = self.nc["time"].dt - return datetime(year=int(dt.year.item()), month=int(dt.month.item()), day=int(dt.day.item()), - hour=int(dt.hour.item()), minute=int(dt.minute.item()), - second=int(dt.second.item()), microsecond=int(dt.microsecond.item())) + date = self.nc["time"].dt + return dt.datetime( + year=int(date.year.item()), + month=int(date.month.item()), + day=int(date.day.item()), + hour=int(date.hour.item()), + minute=int(date.minute.item()), + second=int(date.second.item()), + microsecond=int(date.microsecond.item())) @property def end_time(self): @@ -1018,11 +1024,11 @@ def get_dataset(self, key, info): elif "latitude" in key["name"]: data = self.geo_data["lat"] else: - tic = datetime.now() + tic = dt.datetime.now() data = self.calibrate(self.nc["data"].isel(time=0), calibration=key["calibration"], channel=key["name"]) - logger.debug("Calibration time: {}".format(datetime.now() - tic)) + logger.debug("Calibration time: {}".format(dt.datetime.now() - tic)) # Mask space pixels data = data.where(self.meta["earth_mask"]) @@ -1076,11 +1082,11 @@ def get_dataset(self, key, info): """Load dataset designated by the given key from file.""" logger.debug("Reading dataset {}".format(key["name"])) - tic = datetime.now() + tic = dt.datetime.now() data = self.calibrate(self.nc["data"].isel(time=0), calibration=key["calibration"], channel=key["name"]) - logger.debug("Calibration time: {}".format(datetime.now() - tic)) + logger.debug("Calibration time: {}".format(dt.datetime.now() - tic)) # Mask space pixels data = data.where(self.meta["earth_mask"]) diff --git a/satpy/readers/gpm_imerg.py b/satpy/readers/gpm_imerg.py index 7bc65ac4c6..4463be31b9 100644 --- a/satpy/readers/gpm_imerg.py +++ b/satpy/readers/gpm_imerg.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for GPM imerg data on half-hourly timesteps. References: @@ -23,8 +24,8 @@ """ +import datetime as dt import logging -from datetime import datetime import dask.array as da import h5py @@ -49,22 +50,22 @@ def __init__(self, filename, filename_info, filetype_info): @property def start_time(self): """Find the start time from filename info.""" - return datetime(self.finfo["date"].year, - self.finfo["date"].month, - self.finfo["date"].day, - self.finfo["start_time"].hour, - self.finfo["start_time"].minute, - self.finfo["start_time"].second) + return dt.datetime(self.finfo["date"].year, + self.finfo["date"].month, + self.finfo["date"].day, + self.finfo["start_time"].hour, + self.finfo["start_time"].minute, + self.finfo["start_time"].second) @property def end_time(self): """Find the end time from filename info.""" - return datetime(self.finfo["date"].year, - self.finfo["date"].month, - self.finfo["date"].day, - self.finfo["end_time"].hour, - self.finfo["end_time"].minute, - self.finfo["end_time"].second) + return dt.datetime(self.finfo["date"].year, + self.finfo["date"].month, + self.finfo["date"].day, + self.finfo["end_time"].hour, + self.finfo["end_time"].minute, + self.finfo["end_time"].second) def get_dataset(self, dataset_id, ds_info): """Load a dataset.""" diff --git a/satpy/readers/grib.py b/satpy/readers/grib.py index dadccce77a..4372226c12 100644 --- a/satpy/readers/grib.py +++ b/satpy/readers/grib.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Generic Reader for GRIB2 files. Currently this reader depends on the `pygrib` python package. The `eccodes` @@ -22,8 +23,9 @@ of writing. """ + +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -105,7 +107,7 @@ def _create_dataset_ids(self, keys): @staticmethod def _convert_datetime(msg, date_key, time_key, date_format="%Y%m%d%H%M"): date_str = "{:d}{:04d}".format(msg[date_key], msg[time_key]) - return datetime.strptime(date_str, date_format) + return dt.datetime.strptime(date_str, date_format) @property def start_time(self): diff --git a/satpy/readers/hdfeos_base.py b/satpy/readers/hdfeos_base.py index 37fe714435..3fd920c01f 100644 --- a/satpy/readers/hdfeos_base.py +++ b/satpy/readers/hdfeos_base.py @@ -15,15 +15,16 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Base HDF-EOS reader.""" from __future__ import annotations +import datetime as dt import logging import re from ast import literal_eval from contextlib import suppress -from datetime import datetime import numpy as np import xarray as xr @@ -182,7 +183,7 @@ def start_time(self): try: date = (self.metadata["INVENTORYMETADATA"]["RANGEDATETIME"]["RANGEBEGINNINGDATE"]["VALUE"] + " " + self.metadata["INVENTORYMETADATA"]["RANGEDATETIME"]["RANGEBEGINNINGTIME"]["VALUE"]) - return datetime.strptime(date, "%Y-%m-%d %H:%M:%S.%f") + return dt.datetime.strptime(date, "%Y-%m-%d %H:%M:%S.%f") except KeyError: return self._start_time_from_filename() @@ -195,7 +196,7 @@ def end_time(self): try: date = (self.metadata["INVENTORYMETADATA"]["RANGEDATETIME"]["RANGEENDINGDATE"]["VALUE"] + " " + self.metadata["INVENTORYMETADATA"]["RANGEDATETIME"]["RANGEENDINGTIME"]["VALUE"]) - return datetime.strptime(date, "%Y-%m-%d %H:%M:%S.%f") + return dt.datetime.strptime(date, "%Y-%m-%d %H:%M:%S.%f") except KeyError: return self.start_time diff --git a/satpy/readers/hrit_base.py b/satpy/readers/hrit_base.py index bf53d84a65..d0b9ee44db 100644 --- a/satpy/readers/hrit_base.py +++ b/satpy/readers/hrit_base.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """HRIT/LRIT format reader. This module is the base module for all HRIT-based formats. Here, you will find @@ -28,10 +29,10 @@ """ +import datetime as dt import logging import os from contextlib import contextmanager, nullcontext -from datetime import timedelta from io import BytesIO from subprocess import PIPE, Popen # nosec B404 @@ -176,7 +177,7 @@ def __init__(self, filename, filename_info, filetype_info, hdr_info): self.hdr_info = hdr_info self._get_hd(self.hdr_info) self._start_time = filename_info["start_time"] - self._end_time = self._start_time + timedelta(minutes=15) + self._end_time = self._start_time + dt.timedelta(minutes=15) def _get_hd(self, hdr_info): """Open the file, read and get the basic file header info and set the mda dictionary.""" diff --git a/satpy/readers/hrit_jma.py b/satpy/readers/hrit_jma.py index 0c88faf46b..bfdd5da93b 100644 --- a/satpy/readers/hrit_jma.py +++ b/satpy/readers/hrit_jma.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """HRIT format reader for JMA data. Introduction @@ -107,8 +108,8 @@ .. _AHI sample data: https://www.data.jma.go.jp/mscweb/en/himawari89/space_segment/sample_hrit.html """ +import datetime as dt import logging -from datetime import datetime import numpy as np import xarray as xr @@ -453,7 +454,7 @@ def _interp(arr, cal): def calibrate(self, data, calibration): """Calibrate the data.""" - tic = datetime.now() + tic = dt.datetime.now() if calibration == "counts": return data @@ -466,17 +467,17 @@ def calibrate(self, data, calibration): dims=data.dims, attrs=data.attrs, coords=data.coords) res = res.where(data < 65535) - logger.debug("Calibration time " + str(datetime.now() - tic)) + logger.debug("Calibration time " + str(dt.datetime.now() - tic)) return res @property def start_time(self): """Get start time of the scan.""" if self._use_acquisition_time_as_start_time: - return self.acq_time[0].astype(datetime) + return self.acq_time[0].astype(dt.datetime) return self._start_time @property def end_time(self): """Get end time of the scan.""" - return self.acq_time[-1].astype(datetime) + return self.acq_time[-1].astype(dt.datetime) diff --git a/satpy/readers/hrpt.py b/satpy/readers/hrpt.py index c4862e8169..cac8b9cd3d 100644 --- a/satpy/readers/hrpt.py +++ b/satpy/readers/hrpt.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reading and calibrating hrpt avhrr data. Todo: @@ -29,8 +30,8 @@ """ +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -130,7 +131,7 @@ def __init__(self, filename, filename_info, filetype_info): self.channels = {i: None for i in AVHRR_CHANNEL_NAMES} self.units = {i: "counts" for i in AVHRR_CHANNEL_NAMES} - self.year = filename_info.get("start_time", datetime.utcnow()).year + self.year = filename_info.get("start_time", dt.datetime.utcnow()).year @cached_property def times(self): @@ -272,10 +273,10 @@ def _get_avhrr_tiepoints(self, scan_points, scanline_nb): def start_time(self): """Get the start time.""" return time_seconds(self._data["timecode"][0, np.newaxis, :], - self.year).astype(datetime)[0] + self.year).astype(dt.datetime)[0] @property def end_time(self): """Get the end time.""" return time_seconds(self._data["timecode"][-1, np.newaxis, :], - self.year).astype(datetime)[0] + self.year).astype(dt.datetime)[0] diff --git a/satpy/readers/hsaf_grib.py b/satpy/readers/hsaf_grib.py index a041bf0c73..b8238f17a5 100644 --- a/satpy/readers/hsaf_grib.py +++ b/satpy/readers/hsaf_grib.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """A reader for files produced by the Hydrology SAF. Currently this reader depends on the `pygrib` python package. The `eccodes` @@ -22,8 +23,9 @@ of writing. """ + +import datetime as dt import logging -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -68,7 +70,7 @@ def __init__(self, filename, filename_info, filetype_info): @staticmethod def _get_datetime(msg): dtstr = str(msg["dataDate"]) + str(msg["dataTime"]).zfill(4) - return datetime.strptime(dtstr, "%Y%m%d%H%M") + return dt.datetime.strptime(dtstr, "%Y%m%d%H%M") @property def analysis_time(self): @@ -151,7 +153,7 @@ def get_dataset(self, ds_id, ds_info): flen = len(self.filename) timedelt = self.filename[flen-10:flen-8] ds_info["start_time"] = (ds_info["end_time"] - - timedelta(hours=int(timedelt))) + dt.timedelta(hours=int(timedelt))) else: ds_info["start_time"] = ds_info["end_time"] fill = msg["missingValue"] diff --git a/satpy/readers/hsaf_h5.py b/satpy/readers/hsaf_h5.py index 478b91ce2d..25b42ec6a5 100644 --- a/satpy/readers/hsaf_h5.py +++ b/satpy/readers/hsaf_h5.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """A reader for HDF5 Snow Cover (SC) file produced by the Hydrology SAF.""" + +import datetime as dt import logging -from datetime import timedelta import dask.array as da import h5py @@ -47,7 +49,7 @@ def __init__(self, filename, filename_info, filetype_info): @property def end_time(self): """Get end time.""" - return self.start_time + timedelta(hours=23, minutes=59, seconds=59) + return self.start_time + dt.timedelta(hours=23, minutes=59, seconds=59) @property def start_time(self): diff --git a/satpy/readers/hy2_scat_l2b_h5.py b/satpy/readers/hy2_scat_l2b_h5.py index 929d7dc934..dae6e44bf6 100644 --- a/satpy/readers/hy2_scat_l2b_h5.py +++ b/satpy/readers/hy2_scat_l2b_h5.py @@ -21,7 +21,7 @@ Also handle the HDF5 files from NSOAS, based on a file example. """ -from datetime import datetime +import datetime as dt import numpy as np import xarray as xr @@ -35,14 +35,14 @@ class HY2SCATL2BH5FileHandler(HDF5FileHandler): @property def start_time(self): """Time for first observation.""" - return datetime.strptime(self["/attr/Range_Beginning_Time"], - "%Y%m%dT%H:%M:%S") + return dt.datetime.strptime(self["/attr/Range_Beginning_Time"], + "%Y%m%dT%H:%M:%S") @property def end_time(self): """Time for final observation.""" - return datetime.strptime(self["/attr/Range_Ending_Time"], - "%Y%m%dT%H:%M:%S") + return dt.datetime.strptime(self["/attr/Range_Ending_Time"], + "%Y%m%dT%H:%M:%S") @property def platform_name(self): diff --git a/satpy/readers/iasi_l2_so2_bufr.py b/satpy/readers/iasi_l2_so2_bufr.py index b5088aa041..d66edb7995 100644 --- a/satpy/readers/iasi_l2_so2_bufr.py +++ b/satpy/readers/iasi_l2_so2_bufr.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + r"""IASI L2 SO2 BUFR format reader. Introduction @@ -84,8 +85,8 @@ # TDB: this reader is based on iasi_l2.py and seviri_l2_bufr.py +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -154,7 +155,7 @@ def get_start_end_date(self): minute = ec.codes_get(bufr, "minute") second = ec.codes_get(bufr, "second") - obs_time = datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second) + obs_time = dt.datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second) if i == 0: start_time = obs_time diff --git a/satpy/readers/ici_l1b_nc.py b/satpy/readers/ici_l1b_nc.py index 7adef62e4b..a5fd23c23b 100644 --- a/satpy/readers/ici_l1b_nc.py +++ b/satpy/readers/ici_l1b_nc.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with satpy. If not, see . + """EUMETSAT EPS-SG Ice Cloud Imager (ICI) Level 1B products reader. The format is explained in the @@ -26,8 +27,8 @@ """ +import datetime as dt import logging -from datetime import datetime from enum import Enum from functools import cached_property @@ -77,12 +78,12 @@ def __init__(self, filename, filename_info, filetype_info, **kwargs): def start_time(self): """Get observation start time.""" try: - start_time = datetime.strptime( + start_time = dt.datetime.strptime( self["/attr/sensing_start_time_utc"], "%Y%m%d%H%M%S.%f", ) except ValueError: - start_time = datetime.strptime( + start_time = dt.datetime.strptime( self["/attr/sensing_start_time_utc"], "%Y-%m-%d %H:%M:%S.%f", ) @@ -92,12 +93,12 @@ def start_time(self): def end_time(self): """Get observation end time.""" try: - end_time = datetime.strptime( + end_time = dt.datetime.strptime( self["/attr/sensing_end_time_utc"], "%Y%m%d%H%M%S.%f", ) except ValueError: - end_time = datetime.strptime( + end_time = dt.datetime.strptime( self["/attr/sensing_end_time_utc"], "%Y-%m-%d %H:%M:%S.%f", ) diff --git a/satpy/readers/insat3d_img_l1b_h5.py b/satpy/readers/insat3d_img_l1b_h5.py index 205f4d17b2..41ddee5df6 100644 --- a/satpy/readers/insat3d_img_l1b_h5.py +++ b/satpy/readers/insat3d_img_l1b_h5.py @@ -1,6 +1,7 @@ """File handler for Insat 3D L1B data in hdf5 format.""" + +import datetime as dt from contextlib import suppress -from datetime import datetime from functools import cached_property import dask.array as da @@ -120,13 +121,15 @@ class Insat3DIMGL1BH5FileHandler(BaseFileHandler): @property def start_time(self): """Get the start time.""" - start_time = datetime.strptime(self.datatree.attrs["Acquisition_Start_Time"], "%d-%b-%YT%H:%M:%S") + start_time = dt.datetime.strptime( + self.datatree.attrs["Acquisition_Start_Time"], "%d-%b-%YT%H:%M:%S") return start_time @property def end_time(self): """Get the end time.""" - end_time = datetime.strptime(self.datatree.attrs["Acquisition_End_Time"], "%d-%b-%YT%H:%M:%S") + end_time = dt.datetime.strptime( + self.datatree.attrs["Acquisition_End_Time"], "%d-%b-%YT%H:%M:%S") return end_time @cached_property diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 7675bd1624..1ccb895c25 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for the FY-3D MERSI-2 L1B file format. The files for this reader are HDF5 and come in four varieties; band data @@ -24,7 +25,8 @@ platforms as well assuming no file format changes. """ -from datetime import datetime + +import datetime as dt import dask.array as da import numpy as np @@ -44,7 +46,7 @@ def _strptime(self, date_attr, time_attr): time = self[time_attr] # "18:27:39.720" # cuts off microseconds because of unknown meaning # is .720 == 720 microseconds or 720000 microseconds - return datetime.strptime(date + " " + time.split(".")[0], "%Y-%m-%d %H:%M:%S") + return dt.datetime.strptime(date + " " + time.split(".")[0], "%Y-%m-%d %H:%M:%S") @property def start_time(self): diff --git a/satpy/readers/msu_gsa_l1b.py b/satpy/readers/msu_gsa_l1b.py index c4e45aa333..4a4ff3518f 100644 --- a/satpy/readers/msu_gsa_l1b.py +++ b/satpy/readers/msu_gsa_l1b.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for the Arctica-M1 MSU-GS/A data. The files for this reader are HDF5 and contain channel data at 1km resolution @@ -24,7 +25,8 @@ This reader was tested on sample data provided by EUMETSAT. """ -from datetime import datetime + +import datetime as dt import numpy as np @@ -38,7 +40,7 @@ class MSUGSAFileHandler(HDF5FileHandler): def start_time(self): """Time for timeslot scan start.""" dtstr = self["/attr/timestamp_without_timezone"] - return datetime.strptime(dtstr, "%Y-%m-%dT%H:%M:%S") + return dt.datetime.strptime(dtstr, "%Y-%m-%dT%H:%M:%S") @property def satellite_altitude(self): diff --git a/satpy/readers/mws_l1b.py b/satpy/readers/mws_l1b.py index 372a59ac37..1dc076e68f 100644 --- a/satpy/readers/mws_l1b.py +++ b/satpy/readers/mws_l1b.py @@ -1,24 +1,25 @@ # Copyright (c) 2022 Pytroll Developers - +# # This program 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. - +# # This program 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 this program. If not, see . + """Reader for the EPS-SG Microwave Sounder (MWS) level-1b data. Documentation: https://www.eumetsat.int/media/44139 """ +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -101,13 +102,13 @@ def __init__(self, filename, filename_info, filetype_info): @property def start_time(self): """Get start time.""" - return datetime.strptime(self["/attr/sensing_start_time_utc"], + return dt.datetime.strptime(self["/attr/sensing_start_time_utc"], "%Y-%m-%d %H:%M:%S.%f") @property def end_time(self): """Get end time.""" - return datetime.strptime(self["/attr/sensing_end_time_utc"], + return dt.datetime.strptime(self["/attr/sensing_end_time_utc"], "%Y-%m-%d %H:%M:%S.%f") @property diff --git a/satpy/readers/nwcsaf_msg2013_hdf5.py b/satpy/readers/nwcsaf_msg2013_hdf5.py index 40a6441655..a3bc9ca168 100644 --- a/satpy/readers/nwcsaf_msg2013_hdf5.py +++ b/satpy/readers/nwcsaf_msg2013_hdf5.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for the old NWCSAF/Geo (v2013 and earlier) cloud product format. References: @@ -27,8 +28,8 @@ """ +import datetime as dt import logging -from datetime import datetime import h5py import numpy as np @@ -127,7 +128,7 @@ def get_area_def(self, dsid): @property def start_time(self): """Return the start time of the object.""" - return datetime.strptime(self.file_content["/attr/IMAGE_ACQUISITION_TIME"], "%Y%m%d%H%M") + return dt.datetime.strptime(self.file_content["/attr/IMAGE_ACQUISITION_TIME"], "%Y%m%d%H%M") def get_area_extent(cfac, lfac, coff, loff, numcols, numlines): diff --git a/satpy/readers/nwcsaf_nc.py b/satpy/readers/nwcsaf_nc.py index e9809bdce5..64a284200d 100644 --- a/satpy/readers/nwcsaf_nc.py +++ b/satpy/readers/nwcsaf_nc.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Nowcasting SAF common PPS&MSG NetCDF/CF format reader. References: @@ -22,11 +23,11 @@ """ +import datetime as dt import functools import logging import os from contextlib import suppress -from datetime import datetime import dask.array as da import numpy as np @@ -435,9 +436,9 @@ def read_nwcsaf_time(time_value): try: # MSG: try: - return datetime.strptime(time_value, "%Y-%m-%dT%H:%M:%SZ") + return dt.datetime.strptime(time_value, "%Y-%m-%dT%H:%M:%SZ") except TypeError: # Remove this in summer 2024 (this is not needed since h5netcdf 0.14) - return datetime.strptime(time_value.astype(str), "%Y-%m-%dT%H:%M:%SZ") + return dt.datetime.strptime(time_value.astype(str), "%Y-%m-%dT%H:%M:%SZ") except ValueError: # PPS: - return datetime.strptime(time_value, "%Y%m%dT%H%M%S%fZ") + return dt.datetime.strptime(time_value, "%Y%m%dT%H%M%S%fZ") diff --git a/satpy/readers/oceancolorcci_l3_nc.py b/satpy/readers/oceancolorcci_l3_nc.py index 075e885b36..d38e91c9e6 100644 --- a/satpy/readers/oceancolorcci_l3_nc.py +++ b/satpy/readers/oceancolorcci_l3_nc.py @@ -23,8 +23,9 @@ are supported and both the merged product files (OC_PRODUCTS) and single product (RRS, CHLOR_A, IOP, K_490) are supported. """ + +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -41,7 +42,7 @@ class OCCCIFileHandler(NetCDF4FileHandler): @staticmethod def _parse_datetime(datestr): """Parse datetime.""" - return datetime.strptime(datestr, "%Y%m%d%H%MZ") + return dt.datetime.strptime(datestr, "%Y%m%d%H%MZ") @property def start_time(self): diff --git a/satpy/readers/omps_edr.py b/satpy/readers/omps_edr.py index 5421ae2cd2..12ef7d0ce4 100644 --- a/satpy/readers/omps_edr.py +++ b/satpy/readers/omps_edr.py @@ -15,16 +15,18 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Interface to OMPS EDR format.""" + +import datetime as dt import logging -from datetime import datetime, timedelta import numpy as np from satpy.readers.hdf5_utils import HDF5FileHandler -NO_DATE = datetime(1958, 1, 1) -EPSILON_TIME = timedelta(days=2) +NO_DATE = dt.datetime(1958, 1, 1) +EPSILON_TIME = dt.timedelta(days=2) LOG = logging.getLogger(__name__) diff --git a/satpy/readers/osisaf_l3_nc.py b/satpy/readers/osisaf_l3_nc.py index 56d4773a43..1356471524 100644 --- a/satpy/readers/osisaf_l3_nc.py +++ b/satpy/readers/osisaf_l3_nc.py @@ -15,8 +15,8 @@ # satpy. If not, see . """A reader for OSI-SAF level 3 products in netCDF format.""" +import datetime as dt import logging -from datetime import datetime from satpy.readers.netcdf_utils import NetCDF4FileHandler @@ -197,7 +197,7 @@ def _get_platname(self): def _parse_datetime(datestr): for dt_format in ("%Y-%m-%d %H:%M:%S","%Y%m%dT%H%M%SZ", "%Y-%m-%dT%H:%M:%SZ"): try: - return datetime.strptime(datestr, dt_format) + return dt.datetime.strptime(datestr, dt_format) except ValueError: continue raise ValueError(f"Unsupported date format: {datestr}") diff --git a/satpy/readers/scatsat1_l2b.py b/satpy/readers/scatsat1_l2b.py index 886ce458b3..d14665759d 100644 --- a/satpy/readers/scatsat1_l2b.py +++ b/satpy/readers/scatsat1_l2b.py @@ -17,7 +17,7 @@ # type: ignore """ScatSat-1 L2B Reader, distributed by Eumetsat in HDF5 format.""" -from datetime import datetime +import datetime as dt import h5py @@ -34,8 +34,10 @@ def __init__(self, filename, filename_info, filetype_info): self.h5f = h5py.File(self.filename, "r") h5data = self.h5f["science_data"] - self.filename_info["start_time"] = datetime.strptime(h5data.attrs["Range Beginning Date"], "%Y-%jT%H:%M:%S.%f") - self.filename_info["end_time"] = datetime.strptime(h5data.attrs["Range Ending Date"], "%Y-%jT%H:%M:%S.%f") + self.filename_info["start_time"] = dt.datetime.strptime( + h5data.attrs["Range Beginning Date"], "%Y-%jT%H:%M:%S.%f") + self.filename_info["end_time"] = dt.datetime.strptime( + h5data.attrs["Range Ending Date"], "%Y-%jT%H:%M:%S.%f") self.lons = None self.lats = None diff --git a/satpy/readers/scmi.py b/satpy/readers/scmi.py index a4b8620f8b..fe19c63d8d 100644 --- a/satpy/readers/scmi.py +++ b/satpy/readers/scmi.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """SCMI NetCDF4 Reader. SCMI files are typically used for data for the ABI instrument onboard the @@ -40,9 +41,9 @@ """ +import datetime as dt import logging import os -from datetime import datetime import numpy as np import xarray as xr @@ -273,7 +274,7 @@ def get_area_def(self, key): @property def start_time(self): """Get the start time.""" - return datetime.strptime(self.nc.attrs["start_date_time"], "%Y%j%H%M%S") + return dt.datetime.strptime(self.nc.attrs["start_date_time"], "%Y%j%H%M%S") @property def end_time(self): diff --git a/satpy/readers/seadas_l2.py b/satpy/readers/seadas_l2.py index 03fa648330..24ee429fda 100644 --- a/satpy/readers/seadas_l2.py +++ b/satpy/readers/seadas_l2.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Reader for SEADAS L2 products. This reader currently only supports MODIS and VIIRS Chlorophyll A from SEADAS. @@ -28,7 +29,7 @@ """ -from datetime import datetime +import datetime as dt from .hdf4_utils import HDF4FileHandler from .netcdf_utils import NetCDF4FileHandler @@ -66,13 +67,13 @@ def _platform_name(self): def start_time(self): """Get the starting observation time of this file's data.""" start_time = self[self.start_time_attr_name] - return datetime.strptime(start_time[:-3], self.time_format) + return dt.datetime.strptime(start_time[:-3], self.time_format) @property def end_time(self): """Get the ending observation time of this file's data.""" end_time = self[self.end_time_attr_name] - return datetime.strptime(end_time[:-3], self.time_format) + return dt.datetime.strptime(end_time[:-3], self.time_format) @property def sensor_names(self): diff --git a/satpy/readers/seviri_base.py b/satpy/readers/seviri_base.py index 5b19e56833..ace63e3f12 100644 --- a/satpy/readers/seviri_base.py +++ b/satpy/readers/seviri_base.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Common functionality for SEVIRI L1.5 data readers. Introduction @@ -186,8 +187,8 @@ """ from __future__ import annotations +import datetime as dt import warnings -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -387,7 +388,7 @@ # To obtain the slope for the calibration, one should use the routine get_seviri_meirink_slope # Epoch for the MEIRINK re-calibration -MEIRINK_EPOCH = datetime(2000, 1, 1) +MEIRINK_EPOCH = dt.datetime(2000, 1, 1) MEIRINK_COEFS: dict[str, dict[int, dict[str, tuple[float, float]]]] = {} MEIRINK_COEFS["2023"] = {} @@ -1093,17 +1094,17 @@ def mask_bad_quality(data, line_validity, line_geometric_quality, line_radiometr return data -def round_nom_time(dt, time_delta): +def round_nom_time(date, time_delta): """Round a datetime object to a multiple of a timedelta. - dt : datetime.datetime object, default now. + date : datetime.datetime object, default now. time_delta : timedelta object, we round to a multiple of this, default 1 minute. adapted for SEVIRI from: https://stackoverflow.com/questions/3463930/how-to-round-the-minute-of-a-datetime-object-python """ - seconds = (dt - dt.min).seconds + seconds = (date - date.min).seconds round_to = time_delta.total_seconds() rounding = (seconds + round_to / 2) // round_to * round_to - return dt + timedelta(0, rounding - seconds, - dt.microsecond) + return date + dt.timedelta(0, rounding - seconds, - date.microsecond) diff --git a/satpy/readers/seviri_l1b_hrit.py b/satpy/readers/seviri_l1b_hrit.py index 804198da0f..f65faa8ecc 100644 --- a/satpy/readers/seviri_l1b_hrit.py +++ b/satpy/readers/seviri_l1b_hrit.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + r"""SEVIRI Level 1.5 HRIT format reader. Introduction @@ -213,8 +214,8 @@ from __future__ import division import copy +import datetime as dt import logging -from datetime import timedelta import dask.array as da import numpy as np @@ -528,14 +529,14 @@ def nominal_start_time(self): """Get the start time and round it according to scan law.""" tm = self.prologue["ImageAcquisition"][ "PlannedAcquisitionTime"]["TrueRepeatCycleStart"] - return round_nom_time(tm, time_delta=timedelta(minutes=self._repeat_cycle_duration)) + return round_nom_time(tm, time_delta=dt.timedelta(minutes=self._repeat_cycle_duration)) @property def nominal_end_time(self): """Get the end time and round it according to scan law.""" tm = self.prologue["ImageAcquisition"][ "PlannedAcquisitionTime"]["PlannedRepeatCycleEnd"] - return round_nom_time(tm, time_delta=timedelta(minutes=self._repeat_cycle_duration)) + return round_nom_time(tm, time_delta=dt.timedelta(minutes=self._repeat_cycle_duration)) @property def observation_start_time(self): diff --git a/satpy/readers/seviri_l1b_icare.py b/satpy/readers/seviri_l1b_icare.py index 2024c46532..4d3243f5c8 100644 --- a/satpy/readers/seviri_l1b_icare.py +++ b/satpy/readers/seviri_l1b_icare.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + r"""Interface to SEVIRI L1B data from ICARE (Lille). Introduction @@ -69,7 +70,8 @@ ancillary_variables: [] """ -from datetime import datetime + +import datetime as dt import numpy as np @@ -169,9 +171,9 @@ def end_time(self): attr = str(attr.astype(str)) # In some versions milliseconds are present, sometimes not. try: - endacq = datetime.strptime(attr, "%Y-%m-%dT%H:%M:%SZ") + endacq = dt.datetime.strptime(attr, "%Y-%m-%dT%H:%M:%SZ") except ValueError: - endacq = datetime.strptime(attr, "%Y-%m-%dT%H:%M:%S.%fZ") + endacq = dt.datetime.strptime(attr, "%Y-%m-%dT%H:%M:%S.%fZ") return endacq @property @@ -182,9 +184,9 @@ def start_time(self): attr = str(attr.astype(str)) # In some versions milliseconds are present, sometimes not. try: - stacq = datetime.strptime(attr, "%Y-%m-%dT%H:%M:%SZ") + stacq = dt.datetime.strptime(attr, "%Y-%m-%dT%H:%M:%SZ") except ValueError: - stacq = datetime.strptime(attr, "%Y-%m-%dT%H:%M:%S.%fZ") + stacq = dt.datetime.strptime(attr, "%Y-%m-%dT%H:%M:%S.%fZ") return stacq @property diff --git a/satpy/readers/seviri_l1b_native.py b/satpy/readers/seviri_l1b_native.py index 361dd1bb50..976cb7c338 100644 --- a/satpy/readers/seviri_l1b_native.py +++ b/satpy/readers/seviri_l1b_native.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + r"""SEVIRI Level 1.5 native format reader. Introduction @@ -97,9 +98,9 @@ https://www-cdn.eumetsat.int/files/2020-04/pdf_fg15_msg-native-format-15.pdf """ +import datetime as dt import logging import warnings -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -207,13 +208,13 @@ def _repeat_cycle_duration(self): def nominal_start_time(self): """Get the repeat cycle nominal start time from file header and round it to expected nominal time slot.""" tm = self.header["15_DATA_HEADER"]["ImageAcquisition"]["PlannedAcquisitionTime"]["TrueRepeatCycleStart"] - return round_nom_time(tm, time_delta=timedelta(minutes=self._repeat_cycle_duration)) + return round_nom_time(tm, time_delta=dt.timedelta(minutes=self._repeat_cycle_duration)) @property def nominal_end_time(self): """Get the repeat cycle nominal end time from file header and round it to expected nominal time slot.""" tm = self.header["15_DATA_HEADER"]["ImageAcquisition"]["PlannedAcquisitionTime"]["PlannedRepeatCycleEnd"] - return round_nom_time(tm, time_delta=timedelta(minutes=self._repeat_cycle_duration)) + return round_nom_time(tm, time_delta=dt.timedelta(minutes=self._repeat_cycle_duration)) @property def observation_start_time(self): @@ -609,7 +610,7 @@ def _get_hrv_channel(self): def calibrate(self, data, dataset_id): """Calibrate the data.""" - tic = datetime.now() + tic = dt.datetime.now() channel_name = dataset_id["name"] calib = SEVIRICalibrationHandler( platform_id=self.platform_id, @@ -619,7 +620,7 @@ def calibrate(self, data, dataset_id): scan_time=self.observation_start_time ) res = calib.calibrate(data, dataset_id["calibration"]) - logger.debug("Calibration time " + str(datetime.now() - tic)) + logger.debug("Calibration time " + str(dt.datetime.now() - tic)) return res def _get_calib_coefs(self, channel_name): diff --git a/satpy/readers/seviri_l1b_nc.py b/satpy/readers/seviri_l1b_nc.py index 22b55eceda..fd19634fda 100644 --- a/satpy/readers/seviri_l1b_nc.py +++ b/satpy/readers/seviri_l1b_nc.py @@ -17,9 +17,8 @@ # satpy. If not, see . """SEVIRI netcdf format reader.""" -import datetime +import datetime as dt import logging -from datetime import timedelta import numpy as np @@ -67,7 +66,7 @@ def __init__(self, filename, filename_info, filetype_info, self.ext_calib_coefs = ext_calib_coefs or {} self.mask_bad_quality_scan_lines = mask_bad_quality_scan_lines self.mda = {} - self.reference = datetime.datetime(1958, 1, 1) + self.reference = dt.datetime(1958, 1, 1) self.get_metadata() @property @@ -82,13 +81,13 @@ def _repeat_cycle_duration(self): def nominal_start_time(self): """Read the repeat cycle nominal start time from metadata and round it to expected nominal time slot.""" tm = self.deltaSt - return round_nom_time(tm, time_delta=timedelta(minutes=self._repeat_cycle_duration)) + return round_nom_time(tm, time_delta=dt.timedelta(minutes=self._repeat_cycle_duration)) @property def nominal_end_time(self): """Read the repeat cycle nominal end time from metadata and round it to expected nominal time slot.""" tm = self.deltaEnd - return round_nom_time(tm, time_delta=timedelta(minutes=self._repeat_cycle_duration)) + return round_nom_time(tm, time_delta=dt.timedelta(minutes=self._repeat_cycle_duration)) @property def observation_start_time(self): @@ -146,11 +145,11 @@ def get_metadata(self): # self.mda['hrv_number_of_lines'] = int(self.nc.dims['num_rows_hrv']) # self.mda['hrv_number_of_columns'] = int(self.nc.dims['num_columns_hrv']) - self.deltaSt = self.reference + datetime.timedelta( + self.deltaSt = self.reference + dt.timedelta( days=int(self.nc.attrs["true_repeat_cycle_start_day"]), milliseconds=int(self.nc.attrs["true_repeat_cycle_start_mi_sec"])) - self.deltaEnd = self.reference + datetime.timedelta( + self.deltaEnd = self.reference + dt.timedelta( days=int(self.nc.attrs["planned_repeat_cycle_end_day"]), milliseconds=int(self.nc.attrs["planned_repeat_cycle_end_mi_sec"])) diff --git a/satpy/readers/seviri_l2_bufr.py b/satpy/readers/seviri_l2_bufr.py index 02aa0c2767..a48a7e00d6 100644 --- a/satpy/readers/seviri_l2_bufr.py +++ b/satpy/readers/seviri_l2_bufr.py @@ -23,8 +23,9 @@ https://navigator.eumetsat.int/ """ + +import datetime as dt import logging -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -95,7 +96,7 @@ def __init__(self, filename, filename_info, filetype_info, with_area_definition= else: # Product was retrieved from the EUMETSAT Data Center timeStr = self.get_attribute("typicalDate")+self.get_attribute("typicalTime") - buf_start_time = datetime.strptime(timeStr, "%Y%m%d%H%M%S") + buf_start_time = dt.datetime.strptime(timeStr, "%Y%m%d%H%M%S") sc_id = self.get_attribute("satelliteIdentifier") self.mpef_header = {} self.mpef_header["NominalTime"] = buf_start_time @@ -120,7 +121,7 @@ def start_time(self): @property def end_time(self): """Return the repeat cycle end time.""" - return self.start_time + timedelta(minutes=15) + return self.start_time + dt.timedelta(minutes=15) @property def platform_name(self): diff --git a/satpy/readers/seviri_l2_grib.py b/satpy/readers/seviri_l2_grib.py index b69c60e7ac..d178d6b716 100644 --- a/satpy/readers/seviri_l2_grib.py +++ b/satpy/readers/seviri_l2_grib.py @@ -22,8 +22,8 @@ https://navigator.eumetsat.int/ """ +import datetime as dt import logging -from datetime import timedelta import dask.array as da import numpy as np @@ -62,7 +62,7 @@ def start_time(self): @property def end_time(self): """Return the sensing end time.""" - return self.start_time + timedelta(minutes=REPEAT_CYCLE_DURATION) + return self.start_time + dt.timedelta(minutes=REPEAT_CYCLE_DURATION) def get_area_def(self, dataset_id): """Return the area definition for a dataset.""" diff --git a/satpy/readers/sgli_l1b.py b/satpy/readers/sgli_l1b.py index 1e2a64f783..079f93d2f3 100644 --- a/satpy/readers/sgli_l1b.py +++ b/satpy/readers/sgli_l1b.py @@ -13,6 +13,7 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """GCOM-C SGLI L1b reader. GCOM-C has an imager instrument: SGLI @@ -27,8 +28,8 @@ """ +import datetime as dt import logging -from datetime import datetime import dask.array as da import h5py @@ -63,13 +64,13 @@ def __init__(self, filename, filename_info, filetype_info): def start_time(self): """Get the start time.""" the_time = self.h5file["Global_attributes"].attrs["Scene_start_time"].item() - return datetime.strptime(the_time.decode("ascii"), "%Y%m%d %H:%M:%S.%f") + return dt.datetime.strptime(the_time.decode("ascii"), "%Y%m%d %H:%M:%S.%f") @property def end_time(self): """Get the end time.""" the_time = self.h5file["Global_attributes"].attrs["Scene_end_time"].item() - return datetime.strptime(the_time.decode("ascii"), "%Y%m%d %H:%M:%S.%f") + return dt.datetime.strptime(the_time.decode("ascii"), "%Y%m%d %H:%M:%S.%f") def get_dataset(self, key, info): """Get the dataset from the file.""" diff --git a/satpy/readers/slstr_l1b.py b/satpy/readers/slstr_l1b.py index 02aae9f72b..3353ade4d3 100644 --- a/satpy/readers/slstr_l1b.py +++ b/satpy/readers/slstr_l1b.py @@ -15,13 +15,14 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """SLSTR L1b reader.""" +import datetime as dt import logging import os import re import warnings -from datetime import datetime import dask.array as da import numpy as np @@ -95,12 +96,12 @@ def get_dataset(self, key, info): @property def start_time(self): """Get the start time.""" - return datetime.strptime(self.nc.attrs["start_time"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["start_time"], "%Y-%m-%dT%H:%M:%S.%fZ") @property def end_time(self): """Get the end time.""" - return datetime.strptime(self.nc.attrs["stop_time"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["stop_time"], "%Y-%m-%dT%H:%M:%S.%fZ") class NCSLSTR1B(BaseFileHandler): @@ -224,12 +225,12 @@ def get_dataset(self, key, info): @property def start_time(self): """Get the start time.""" - return datetime.strptime(self.nc.attrs["start_time"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["start_time"], "%Y-%m-%dT%H:%M:%S.%fZ") @property def end_time(self): """Get the end time.""" - return datetime.strptime(self.nc.attrs["stop_time"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["stop_time"], "%Y-%m-%dT%H:%M:%S.%fZ") class NCSLSTRAngles(BaseFileHandler): @@ -326,12 +327,12 @@ def get_dataset(self, key, info): @property def start_time(self): """Get the start time.""" - return datetime.strptime(self.nc.attrs["start_time"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["start_time"], "%Y-%m-%dT%H:%M:%S.%fZ") @property def end_time(self): """Get the end time.""" - return datetime.strptime(self.nc.attrs["stop_time"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["stop_time"], "%Y-%m-%dT%H:%M:%S.%fZ") class NCSLSTRFlag(BaseFileHandler): @@ -376,9 +377,9 @@ def get_dataset(self, key, info): @property def start_time(self): """Get the start time.""" - return datetime.strptime(self.nc.attrs["start_time"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["start_time"], "%Y-%m-%dT%H:%M:%S.%fZ") @property def end_time(self): """Get the end time.""" - return datetime.strptime(self.nc.attrs["stop_time"], "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(self.nc.attrs["stop_time"], "%Y-%m-%dT%H:%M:%S.%fZ") diff --git a/satpy/readers/smos_l2_wind.py b/satpy/readers/smos_l2_wind.py index 4a909ee2e4..c4d349ea67 100644 --- a/satpy/readers/smos_l2_wind.py +++ b/satpy/readers/smos_l2_wind.py @@ -24,8 +24,8 @@ SMOS_WIND_DS_PDD_20191107_signed.pdf """ +import datetime as dt import logging -from datetime import datetime import numpy as np from pyresample.geometry import AreaDefinition @@ -41,12 +41,12 @@ class SMOSL2WINDFileHandler(NetCDF4FileHandler): @property def start_time(self): """Get start time.""" - return datetime.strptime(self["/attr/time_coverage_start"], "%Y-%m-%dT%H:%M:%S Z") + return dt.datetime.strptime(self["/attr/time_coverage_start"], "%Y-%m-%dT%H:%M:%S Z") @property def end_time(self): """Get end time.""" - return datetime.strptime(self["/attr/time_coverage_end"], "%Y-%m-%dT%H:%M:%S Z") + return dt.datetime.strptime(self["/attr/time_coverage_end"], "%Y-%m-%dT%H:%M:%S Z") @property def platform_shortname(self): diff --git a/satpy/readers/tropomi_l2.py b/satpy/readers/tropomi_l2.py index 768ca70948..2d571e2f12 100644 --- a/satpy/readers/tropomi_l2.py +++ b/satpy/readers/tropomi_l2.py @@ -29,8 +29,8 @@ """ +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -65,12 +65,12 @@ def platform_shortname(self): @property def time_coverage_start(self): """Get time_coverage_start.""" - return datetime.strptime(self["/attr/time_coverage_start"], DATE_FMT) + return dt.datetime.strptime(self["/attr/time_coverage_start"], DATE_FMT) @property def time_coverage_end(self): """Get time_coverage_end.""" - return datetime.strptime(self["/attr/time_coverage_end"], DATE_FMT) + return dt.datetime.strptime(self["/attr/time_coverage_end"], DATE_FMT) @property def sensor(self): diff --git a/satpy/readers/vii_base_nc.py b/satpy/readers/vii_base_nc.py index 83056189dc..07c5f6749a 100644 --- a/satpy/readers/vii_base_nc.py +++ b/satpy/readers/vii_base_nc.py @@ -19,8 +19,8 @@ """EUMETSAT EPS-SG Visible/Infrared Imager (VII) readers base class.""" +import datetime as dt import logging -from datetime import datetime from geotiepoints.viiinterpolator import tie_points_geo_interpolation, tie_points_interpolation @@ -213,18 +213,18 @@ def _get_global_attributes(self): def start_time(self): """Get observation start time.""" try: - start_time = datetime.strptime(self["/attr/sensing_start_time_utc"], "%Y%m%d%H%M%S.%f") + start_time = dt.datetime.strptime(self["/attr/sensing_start_time_utc"], "%Y%m%d%H%M%S.%f") except ValueError: - start_time = datetime.strptime(self["/attr/sensing_start_time_utc"], "%Y-%m-%d %H:%M:%S.%f") + start_time = dt.datetime.strptime(self["/attr/sensing_start_time_utc"], "%Y-%m-%d %H:%M:%S.%f") return start_time @property def end_time(self): """Get observation end time.""" try: - end_time = datetime.strptime(self["/attr/sensing_end_time_utc"], "%Y%m%d%H%M%S.%f") + end_time = dt.datetime.strptime(self["/attr/sensing_end_time_utc"], "%Y%m%d%H%M%S.%f") except ValueError: - end_time = datetime.strptime(self["/attr/sensing_end_time_utc"], "%Y-%m-%d %H:%M:%S.%f") + end_time = dt.datetime.strptime(self["/attr/sensing_end_time_utc"], "%Y-%m-%d %H:%M:%S.%f") return end_time @property diff --git a/satpy/readers/viirs_atms_sdr_base.py b/satpy/readers/viirs_atms_sdr_base.py index 159a84a070..b55368e92b 100644 --- a/satpy/readers/viirs_atms_sdr_base.py +++ b/satpy/readers/viirs_atms_sdr_base.py @@ -18,8 +18,8 @@ """Common utilities for reading VIIRS and ATMS SDR data.""" +import datetime as dt import logging -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -27,8 +27,8 @@ from satpy.readers.hdf5_utils import HDF5FileHandler -NO_DATE = datetime(1958, 1, 1) -EPSILON_TIME = timedelta(days=2) +NO_DATE = dt.datetime(1958, 1, 1) +EPSILON_TIME = dt.timedelta(days=2) LOG = logging.getLogger(__name__) @@ -106,7 +106,7 @@ def _parse_datetime(self, datestr, timestr): timestr = str(timestr.data.compute().astype(str)) datetime_str = datestr + timestr - time_val = datetime.strptime(datetime_str, "%Y%m%d%H%M%S.%fZ") + time_val = dt.datetime.strptime(datetime_str, "%Y%m%d%H%M%S.%fZ") if abs(time_val - NO_DATE) < EPSILON_TIME: # catch rare case when SDR files have incorrect date raise ValueError("Datetime invalid {}".format(time_val)) diff --git a/satpy/readers/viirs_compact.py b/satpy/readers/viirs_compact.py index af3a4ce766..bb3bd83b71 100644 --- a/satpy/readers/viirs_compact.py +++ b/satpy/readers/viirs_compact.py @@ -29,9 +29,9 @@ """ +import datetime as dt import logging from contextlib import suppress -from datetime import datetime, timedelta import dask.array as da import h5py @@ -173,10 +173,10 @@ def start_time(self): @property def end_time(self): """Get the end time.""" - end_time = datetime.combine(self.start_time.date(), + end_time = dt.datetime.combine(self.start_time.date(), self.finfo["end_time"].time()) if end_time < self.start_time: - end_time += timedelta(days=1) + end_time += dt.timedelta(days=1) return end_time def read_geo(self, key, info): diff --git a/satpy/readers/viirs_l1b.py b/satpy/readers/viirs_l1b.py index 510a37165d..7dd3079dbb 100644 --- a/satpy/readers/viirs_l1b.py +++ b/satpy/readers/viirs_l1b.py @@ -17,8 +17,8 @@ # satpy. If not, see . """Interface to VIIRS L1B format.""" +import datetime as dt import logging -from datetime import datetime import numpy as np @@ -32,7 +32,7 @@ class VIIRSL1BFileHandler(NetCDF4FileHandler): def _parse_datetime(self, datestr): """Parse datetime.""" - return datetime.strptime(datestr, "%Y-%m-%dT%H:%M:%S.000Z") + return dt.datetime.strptime(datestr, "%Y-%m-%dT%H:%M:%S.000Z") @property def start_orbit_number(self): diff --git a/satpy/readers/viirs_l2.py b/satpy/readers/viirs_l2.py index 9277620320..7a54b3e10c 100644 --- a/satpy/readers/viirs_l2.py +++ b/satpy/readers/viirs_l2.py @@ -9,8 +9,9 @@ 3. Cloud Top Height 4. Deep Blue Aerosol Optical Thickness (Land and Ocean) """ + +import datetime as dt import logging -from datetime import datetime import numpy as np @@ -23,7 +24,7 @@ class VIIRSL2FileHandler(NetCDF4FileHandler): """NetCDF File Handler for VIIRS L2 Products.""" def _parse_datetime(self, datestr): """Parse datetime.""" - return datetime.strptime(datestr, "%Y-%m-%dT%H:%M:%S.000Z") + return dt.datetime.strptime(datestr, "%Y-%m-%dT%H:%M:%S.000Z") @property def start_time(self): diff --git a/satpy/readers/viirs_sdr.py b/satpy/readers/viirs_sdr.py index eef02f7777..28854b185d 100644 --- a/satpy/readers/viirs_sdr.py +++ b/satpy/readers/viirs_sdr.py @@ -28,10 +28,11 @@ - http://npp.gsfc.nasa.gov/science/sciencedocuments/082012/474-00001-03_CDFCBVolIII_RevC.pdf """ + +import datetime as dt import logging import os.path from contextlib import suppress -from datetime import datetime, timedelta from glob import glob import numpy as np @@ -39,8 +40,8 @@ from satpy.readers.viirs_atms_sdr_base import ATMS_DATASET_KEYS, DATASET_KEYS, VIIRS_DATASET_KEYS, JPSS_SDR_FileHandler from satpy.readers.yaml_reader import FileYAMLReader -NO_DATE = datetime(1958, 1, 1) -EPSILON_TIME = timedelta(days=2) +NO_DATE = dt.datetime(1958, 1, 1) +EPSILON_TIME = dt.timedelta(days=2) LOG = logging.getLogger(__name__) diff --git a/satpy/readers/viirs_vgac_l1c_nc.py b/satpy/readers/viirs_vgac_l1c_nc.py index 578e19bed3..2f43ffd2a2 100644 --- a/satpy/readers/viirs_vgac_l1c_nc.py +++ b/satpy/readers/viirs_vgac_l1c_nc.py @@ -15,8 +15,8 @@ # satpy. If not, see . """Reading VIIRS VGAC data.""" +import datetime as dt import logging -from datetime import datetime import numpy as np import xarray as xr @@ -68,20 +68,20 @@ def fix_radiances_not_in_percent(self, data): def set_time_attrs(self, data): """Set time from attributes.""" if "StartTime" in data.attrs: - data.attrs["start_time"] = datetime.strptime(data.attrs["StartTime"], "%Y-%m-%dT%H:%M:%S") - data.attrs["end_time"] = datetime.strptime(data.attrs["EndTime"], "%Y-%m-%dT%H:%M:%S") + data.attrs["start_time"] = dt.datetime.strptime(data.attrs["StartTime"], "%Y-%m-%dT%H:%M:%S") + data.attrs["end_time"] = dt.datetime.strptime(data.attrs["EndTime"], "%Y-%m-%dT%H:%M:%S") self._end_time = data.attrs["end_time"] self._start_time = data.attrs["start_time"] def dt64_to_datetime(self, dt64): """Conversion of numpy.datetime64 to datetime objects.""" if isinstance(dt64, np.datetime64): - return dt64.astype(datetime) + return dt64.astype(dt.datetime) return dt64 def extract_time_data(self, data, nc): """Decode time data.""" - reference_time = np.datetime64(datetime.strptime(nc["proj_time0"].attrs["units"], + reference_time = np.datetime64(dt.datetime.strptime(nc["proj_time0"].attrs["units"], "days since %d/%m/%YT%H:%M:%S")) delta_part_of_day, delta_full_days = np.modf(nc["proj_time0"].values) delta_full_days = np.timedelta64(delta_full_days.astype(np.int64), "D").astype("timedelta64[us]") diff --git a/satpy/readers/virr_l1b.py b/satpy/readers/virr_l1b.py index 260666ff8b..23e0339c93 100644 --- a/satpy/readers/virr_l1b.py +++ b/satpy/readers/virr_l1b.py @@ -40,8 +40,8 @@ """ +import datetime as dt import logging -from datetime import datetime import dask.array as da import numpy as np @@ -162,10 +162,10 @@ def _correct_slope(self, slope): def start_time(self): """Get starting observation time.""" start_time = self["/attr/Observing Beginning Date"] + "T" + self["/attr/Observing Beginning Time"] + "Z" - return datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%S.%fZ") @property def end_time(self): """Get ending observation time.""" end_time = self["/attr/Observing Ending Date"] + "T" + self["/attr/Observing Ending Time"] + "Z" - return datetime.strptime(end_time, "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.datetime.strptime(end_time, "%Y-%m-%dT%H:%M:%S.%fZ") diff --git a/satpy/tests/cf_tests/test_decoding.py b/satpy/tests/cf_tests/test_decoding.py index c20cddf6da..51c1bfecaf 100644 --- a/satpy/tests/cf_tests/test_decoding.py +++ b/satpy/tests/cf_tests/test_decoding.py @@ -15,8 +15,10 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Tests for CF decoding.""" -from datetime import datetime + +import datetime as dt import pytest @@ -46,11 +48,11 @@ def expected(self): "my_integer": 0, "my_float": 0.0, "my_list": [1, 2, 3], - "my_timestamp1": datetime(2000, 1, 1), - "my_timestamp2": datetime(2000, 1, 1, 12, 15, 33), - "my_timestamp3": datetime(2000, 1, 1, 12, 15, 33, 123456), + "my_timestamp1": dt.datetime(2000, 1, 1), + "my_timestamp2": dt.datetime(2000, 1, 1, 12, 15, 33), + "my_timestamp3": dt.datetime(2000, 1, 1, 12, 15, 33, 123456), "my_dict": {"a": {"b": [1, 2, 3]}, - "c": {"d": datetime(2000, 1, 1, 12, 15, 33, 123456)}} + "c": {"d": dt.datetime(2000, 1, 1, 12, 15, 33, 123456)}} } def test_decoding(self, attrs, expected): diff --git a/satpy/tests/compositor_tests/test_viirs.py b/satpy/tests/compositor_tests/test_viirs.py index 1641e4248b..95ff3e0d39 100644 --- a/satpy/tests/compositor_tests/test_viirs.py +++ b/satpy/tests/compositor_tests/test_viirs.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Tests for VIIRS compositors.""" -from datetime import datetime +import datetime as dt import dask.array as da import numpy as np @@ -52,7 +53,7 @@ def dnb(self, area): c01 = xr.DataArray(dnb, dims=("y", "x"), attrs={"name": "DNB", "area": area, - "start_time": datetime(2020, 1, 1, 12, 0, 0)}) + "start_time": dt.datetime(2020, 1, 1, 12, 0, 0)}) return c01 @pytest.fixture() @@ -66,7 +67,7 @@ def sza(self, area): c02 = xr.DataArray(sza, dims=("y", "x"), attrs={"name": "solar_zenith_angle", "area": area, - "start_time": datetime(2020, 1, 1, 12, 0, 0)}) + "start_time": dt.datetime(2020, 1, 1, 12, 0, 0)}) return c02 @pytest.fixture() @@ -79,7 +80,7 @@ def lza(self, area): c03 = xr.DataArray(lza, dims=("y", "x"), attrs={"name": "lunar_zenith_angle", "area": area, - "start_time": datetime(2020, 1, 1, 12, 0, 0) + "start_time": dt.datetime(2020, 1, 1, 12, 0, 0) }) return c03 diff --git a/satpy/tests/features/steps/steps-load.py b/satpy/tests/features/steps/steps-load.py index 7e2d1829a2..d83ac24754 100644 --- a/satpy/tests/features/steps/steps-load.py +++ b/satpy/tests/features/steps/steps-load.py @@ -45,13 +45,13 @@ def step_impl_data_available(context): @when(u"user loads the data without providing a config file") def step_impl_user_loads_no_config(context): """Load the data without a config.""" - from datetime import datetime + import datetime as dt from satpy import Scene, find_files_and_readers os.chdir("/tmp/") readers_files = find_files_and_readers(sensor="viirs", - start_time=datetime(2015, 3, 11, 11, 20), - end_time=datetime(2015, 3, 11, 11, 26)) + start_time=dt.datetime(2015, 3, 11, 11, 20), + end_time=dt.datetime(2015, 3, 11, 11, 26)) scn = Scene(filenames=readers_files) scn.load(["M02"]) context.scene = scn @@ -73,13 +73,13 @@ def step_impl_items_not_available(context): @when(u"user wants to know what data is available") def step_impl_user_checks_availability(context): """Check availability.""" - from datetime import datetime + import datetime as dt from satpy import Scene, find_files_and_readers os.chdir("/tmp/") reader_files = find_files_and_readers(sensor="viirs", - start_time=datetime(2015, 3, 11, 11, 20), - end_time=datetime(2015, 3, 11, 11, 26)) + start_time=dt.datetime(2015, 3, 11, 11, 20), + end_time=dt.datetime(2015, 3, 11, 11, 26)) scn = Scene(filenames=reader_files) context.available_dataset_ids = scn.available_dataset_ids() diff --git a/satpy/tests/modifier_tests/test_angles.py b/satpy/tests/modifier_tests/test_angles.py index ecf0805ca8..b4f5430436 100644 --- a/satpy/tests/modifier_tests/test_angles.py +++ b/satpy/tests/modifier_tests/test_angles.py @@ -14,10 +14,11 @@ # A PARTICULAR PURPOSE. See the GNU General Public License for more details. """Tests for the angles in modifiers.""" + import contextlib +import datetime as dt import warnings from copy import deepcopy -from datetime import datetime, timedelta from glob import glob from typing import Optional, Union from unittest import mock @@ -74,7 +75,7 @@ def _get_angle_test_data(area_def: Optional[Union[AreaDefinition, StackedAreaDef "satellite_nominal_longitude": 10.0, "satellite_nominal_latitude": 0.0, } - stime = datetime(2020, 1, 1, 12, 0, 0) + stime = dt.datetime(2020, 1, 1, 12, 0, 0) data = da.zeros(shape, chunks=chunks) vis = xr.DataArray(data, dims=dims, @@ -113,7 +114,7 @@ def _similar_sat_pos_datetime(orig_data, lon_offset=0.04): new_data = orig_data.copy() old_lon = new_data.attrs["orbital_parameters"]["satellite_nominal_longitude"] new_data.attrs["orbital_parameters"]["satellite_nominal_longitude"] = old_lon + lon_offset - new_data.attrs["start_time"] = new_data.attrs["start_time"] + timedelta(hours=36) + new_data.attrs["start_time"] = new_data.attrs["start_time"] + dt.timedelta(hours=36) return new_data @@ -372,15 +373,13 @@ def test_relative_azimuth_calculation(self): def test_solazi_correction(self): """Test that solar azimuth angles are corrected into the right range.""" - from datetime import datetime - from satpy.modifiers.angles import _get_sun_azimuth_ndarray lats = np.array([-80, 40, 0, 40, 80]) lons = np.array([-80, 40, 0, 40, 80]) - dt = datetime(2022, 1, 5, 12, 50, 0) + date = dt.datetime(2022, 1, 5, 12, 50, 0) - azi = _get_sun_azimuth_ndarray(lats, lons, dt) + azi = _get_sun_azimuth_ndarray(lats, lons, date) assert np.all(azi > 0) diff --git a/satpy/tests/modifier_tests/test_crefl.py b/satpy/tests/modifier_tests/test_crefl.py index dc9f4a232a..27c9847030 100644 --- a/satpy/tests/modifier_tests/test_crefl.py +++ b/satpy/tests/modifier_tests/test_crefl.py @@ -13,8 +13,8 @@ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. """Tests for the CREFL ReflectanceCorrector modifier.""" +import datetime as dt from contextlib import contextmanager -from datetime import datetime from unittest import mock import numpy as np @@ -82,8 +82,8 @@ def _make_viirs_xarray(data, area, name, standard_name, wavelength=None, units=" "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, + "start_time": dt.datetime(2012, 2, 25, 18, 1, 24, 570942), + "end_time": dt.datetime(2012, 2, 25, 18, 11, 21, 175760), "area": area, "ancillary_variables": [] }) @@ -259,8 +259,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"] == dt.datetime(2012, 2, 25, 18, 1, 24, 570942) + assert res.attrs["end_time"] == dt.datetime(2012, 2, 25, 18, 11, 21, 175760) assert res.attrs["area"] == area assert res.attrs["ancillary_variables"] == [] data = res.values @@ -304,8 +304,8 @@ def make_xarray(name, calibration, wavelength=None, modifiers=None, resolution=1 "calibration": calibration, "resolution": resolution, "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": dt.datetime(2012, 8, 13, 18, 46, 1, 439838), + "end_time": dt.datetime(2012, 8, 13, 18, 57, 47, 746296), "area": area, "ancillary_variables": [] }) @@ -327,8 +327,8 @@ def make_xarray(name, calibration, wavelength=None, modifiers=None, resolution=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"] == dt.datetime(2012, 8, 13, 18, 46, 1, 439838) + assert res.attrs["end_time"] == dt.datetime(2012, 8, 13, 18, 57, 47, 746296) assert res.attrs["area"] == area assert res.attrs["ancillary_variables"] == [] data = res.values diff --git a/satpy/tests/multiscene_tests/test_blend.py b/satpy/tests/multiscene_tests/test_blend.py index c964501225..c003106dea 100644 --- a/satpy/tests/multiscene_tests/test_blend.py +++ b/satpy/tests/multiscene_tests/test_blend.py @@ -19,7 +19,7 @@ """Unit tests for blending datasets with the Multiscene object.""" -from datetime import datetime +import datetime as dt import dask.array as da import numpy as np @@ -101,8 +101,8 @@ def cloud_type_data_array1(test_area, data_type, image_mode): "satellite_nominal_longitude": 0.0, "satellite_nominal_latitude": 0, } - data_arr.attrs["start_time"] = datetime(2023, 1, 16, 11, 9, 17) - data_arr.attrs["end_time"] = datetime(2023, 1, 16, 11, 12, 22) + data_arr.attrs["start_time"] = dt.datetime(2023, 1, 16, 11, 9, 17) + data_arr.attrs["end_time"] = dt.datetime(2023, 1, 16, 11, 12, 22) data_arr.attrs["_satpy_id"] = dsid1 return data_arr @@ -127,8 +127,8 @@ def cloud_type_data_array2(test_area, data_type, image_mode): data_arr.attrs["sensor"] = {"avhrr-3"} data_arr.attrs["units"] = "1" data_arr.attrs["long_name"] = "SAFNWC PPS CT Cloud Type" - data_arr.attrs["start_time"] = datetime(2023, 1, 16, 11, 12, 57, 500000) - data_arr.attrs["end_time"] = datetime(2023, 1, 16, 11, 28, 1, 900000) + data_arr.attrs["start_time"] = dt.datetime(2023, 1, 16, 11, 12, 57, 500000) + data_arr.attrs["end_time"] = dt.datetime(2023, 1, 16, 11, 28, 1, 900000) data_arr.attrs["_satpy_id"] = dsid1 return data_arr @@ -152,8 +152,8 @@ def scene1_with_weights(cloud_type_data_array1, test_area): modifiers=() ) scene[dsid2] = _create_test_int8_dataset(name="geo-cma", area=test_area, values=2) - scene[dsid2].attrs["start_time"] = datetime(2023, 1, 16, 11, 9, 17) - scene[dsid2].attrs["end_time"] = datetime(2023, 1, 16, 11, 12, 22) + scene[dsid2].attrs["start_time"] = dt.datetime(2023, 1, 16, 11, 9, 17) + scene[dsid2].attrs["end_time"] = dt.datetime(2023, 1, 16, 11, 12, 22) wgt2 = _create_test_dataset(name="geo-cma-wgt", area=test_area, values=0) @@ -176,8 +176,8 @@ def scene2_with_weights(cloud_type_data_array2, test_area): modifiers=() ) scene[dsid2] = _create_test_int8_dataset(name="polar-cma", area=test_area, values=4) - scene[dsid2].attrs["start_time"] = datetime(2023, 1, 16, 11, 12, 57, 500000) - scene[dsid2].attrs["end_time"] = datetime(2023, 1, 16, 11, 28, 1, 900000) + scene[dsid2].attrs["start_time"] = dt.datetime(2023, 1, 16, 11, 12, 57, 500000) + scene[dsid2].attrs["end_time"] = dt.datetime(2023, 1, 16, 11, 28, 1, 900000) wgt2 = _create_test_dataset(name="polar-cma-wgt", area=test_area, values=1) return scene, [wgt1, wgt2] @@ -223,8 +223,8 @@ def test_blend_two_scenes_using_stack(self, multi_scene_and_weights, groups, xr.testing.assert_equal(result, expected.compute()) _check_stacked_metadata(result, "CloudType") - assert result.attrs["start_time"] == datetime(2023, 1, 16, 11, 9, 17) - assert result.attrs["end_time"] == datetime(2023, 1, 16, 11, 28, 1, 900000) + assert result.attrs["start_time"] == dt.datetime(2023, 1, 16, 11, 9, 17) + assert result.attrs["end_time"] == dt.datetime(2023, 1, 16, 11, 28, 1, 900000) def test_blend_two_scenes_bad_blend_type(self, multi_scene_and_weights, groups): """Test exception is raised when bad 'blend_type' is used.""" @@ -274,8 +274,8 @@ def test_blend_two_scenes_using_stack_weighted(self, multi_scene_and_weights, gr np.testing.assert_allclose(result.data, expected.data) _check_stacked_metadata(result, "CloudType") - assert result.attrs["start_time"] == datetime(2023, 1, 16, 11, 9, 17) - assert result.attrs["end_time"] == datetime(2023, 1, 16, 11, 28, 1, 900000) + assert result.attrs["start_time"] == dt.datetime(2023, 1, 16, 11, 9, 17) + assert result.attrs["end_time"] == dt.datetime(2023, 1, 16, 11, 28, 1, 900000) @pytest.fixture() def datasets_and_weights(self): @@ -286,23 +286,23 @@ def datasets_and_weights(self): shape[1], shape[0], [-200, -200, 200, 200]) ds1 = xr.DataArray(da.ones(shape, chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1, 0, 0, 0), "area": area}) + attrs={"start_time": dt.datetime(2018, 1, 1, 0, 0, 0), "area": area}) ds2 = xr.DataArray(da.ones(shape, chunks=-1) * 2, dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1, 1, 0, 0), "area": area}) + attrs={"start_time": dt.datetime(2018, 1, 1, 1, 0, 0), "area": area}) ds3 = xr.DataArray(da.ones(shape, chunks=-1) * 3, dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1, 1, 0, 0), "area": area}) + attrs={"start_time": dt.datetime(2018, 1, 1, 1, 0, 0), "area": area}) ds4 = xr.DataArray(da.zeros(shape, chunks=-1), dims=("y", "time"), - attrs={"start_time": datetime(2018, 1, 1, 0, 0, 0), "area": area}) + attrs={"start_time": dt.datetime(2018, 1, 1, 0, 0, 0), "area": area}) ds5 = xr.DataArray(da.zeros(shape, chunks=-1), dims=("y", "time"), - attrs={"start_time": datetime(2018, 1, 1, 1, 0, 0), "area": area}) + attrs={"start_time": dt.datetime(2018, 1, 1, 1, 0, 0), "area": area}) wgt1 = xr.DataArray(da.ones(shape, chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1, 0, 0, 0), "area": area}) + attrs={"start_time": dt.datetime(2018, 1, 1, 0, 0, 0), "area": area}) wgt2 = xr.DataArray(da.zeros(shape, chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1, 0, 0, 0), "area": area}) + attrs={"start_time": dt.datetime(2018, 1, 1, 0, 0, 0), "area": area}) wgt3 = xr.DataArray(da.zeros(shape, chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1, 0, 0, 0), "area": area}) + attrs={"start_time": dt.datetime(2018, 1, 1, 0, 0, 0), "area": area}) datastruct = {"shape": shape, "area": area, @@ -392,9 +392,9 @@ class TestTemporalRGB: @pytest.fixture() def nominal_data(self): """Return the input arrays for the nominal use case.""" - da1 = xr.DataArray([1, 0, 0], attrs={"start_time": datetime(2023, 5, 22, 9, 0, 0)}) - da2 = xr.DataArray([0, 1, 0], attrs={"start_time": datetime(2023, 5, 22, 10, 0, 0)}) - da3 = xr.DataArray([0, 0, 1], attrs={"start_time": datetime(2023, 5, 22, 11, 0, 0)}) + da1 = xr.DataArray([1, 0, 0], attrs={"start_time": dt.datetime(2023, 5, 22, 9, 0, 0)}) + da2 = xr.DataArray([0, 1, 0], attrs={"start_time": dt.datetime(2023, 5, 22, 10, 0, 0)}) + da3 = xr.DataArray([0, 0, 1], attrs={"start_time": dt.datetime(2023, 5, 22, 11, 0, 0)}) return [da1, da2, da3] @@ -422,7 +422,7 @@ def test_extra_datasets(self, nominal_data, expected_result): """Test that only the first three arrays affect the usage.""" from satpy.multiscene import temporal_rgb - da4 = xr.DataArray([0, 0, 1], attrs={"start_time": datetime(2023, 5, 22, 12, 0, 0)}) + da4 = xr.DataArray([0, 0, 1], attrs={"start_time": dt.datetime(2023, 5, 22, 12, 0, 0)}) res = temporal_rgb(nominal_data + [da4,]) diff --git a/satpy/tests/multiscene_tests/test_save_animation.py b/satpy/tests/multiscene_tests/test_save_animation.py index 7ec1a53df8..67158c2334 100644 --- a/satpy/tests/multiscene_tests/test_save_animation.py +++ b/satpy/tests/multiscene_tests/test_save_animation.py @@ -15,17 +15,18 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Unit tests for saving animations using Multiscene.""" # NOTE: # The following fixtures are not defined in this file, but are used and injected by Pytest: # - tmp_path +import datetime as dt import os import shutil import tempfile import unittest -from datetime import datetime from unittest import mock import pytest @@ -63,12 +64,12 @@ def test_save_mp4_distributed(self): scenes[1]["ds3"] = _create_test_dataset("ds3") # Add a start and end time for ds_id in ["ds1", "ds2", "ds3"]: - scenes[1][ds_id].attrs["start_time"] = datetime(2018, 1, 2) - scenes[1][ds_id].attrs["end_time"] = datetime(2018, 1, 2, 12) + scenes[1][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 2) + scenes[1][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 2, 12) if ds_id == "ds3": continue - scenes[0][ds_id].attrs["start_time"] = datetime(2018, 1, 1) - scenes[0][ds_id].attrs["end_time"] = datetime(2018, 1, 1, 12) + scenes[0][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 1) + scenes[0][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 1, 12) mscn = MultiScene(scenes) fn = os.path.join( @@ -125,12 +126,12 @@ def test_save_mp4_no_distributed(self): scenes[1]["ds3"] = _create_test_dataset("ds3") # Add a start and end time for ds_id in ["ds1", "ds2", "ds3"]: - scenes[1][ds_id].attrs["start_time"] = datetime(2018, 1, 2) - scenes[1][ds_id].attrs["end_time"] = datetime(2018, 1, 2, 12) + scenes[1][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 2) + scenes[1][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 2, 12) if ds_id == "ds3": continue - scenes[0][ds_id].attrs["start_time"] = datetime(2018, 1, 1) - scenes[0][ds_id].attrs["end_time"] = datetime(2018, 1, 1, 12) + scenes[0][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 1) + scenes[0][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 1, 12) mscn = MultiScene(scenes) fn = os.path.join( @@ -165,12 +166,12 @@ def test_save_datasets_simple(self): scenes[1]["ds3"] = _create_test_dataset("ds3") # Add a start and end time for ds_id in ["ds1", "ds2", "ds3"]: - scenes[1][ds_id].attrs["start_time"] = datetime(2018, 1, 2) - scenes[1][ds_id].attrs["end_time"] = datetime(2018, 1, 2, 12) + scenes[1][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 2) + scenes[1][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 2, 12) if ds_id == "ds3": continue - scenes[0][ds_id].attrs["start_time"] = datetime(2018, 1, 1) - scenes[0][ds_id].attrs["end_time"] = datetime(2018, 1, 1, 12) + scenes[0][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 1) + scenes[0][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 1, 12) mscn = MultiScene(scenes) client_mock = mock.MagicMock() @@ -198,12 +199,12 @@ def test_save_datasets_distributed_delayed(self): scenes[1]["ds3"] = _create_test_dataset("ds3") # Add a start and end time for ds_id in ["ds1", "ds2", "ds3"]: - scenes[1][ds_id].attrs["start_time"] = datetime(2018, 1, 2) - scenes[1][ds_id].attrs["end_time"] = datetime(2018, 1, 2, 12) + scenes[1][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 2) + scenes[1][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 2, 12) if ds_id == "ds3": continue - scenes[0][ds_id].attrs["start_time"] = datetime(2018, 1, 1) - scenes[0][ds_id].attrs["end_time"] = datetime(2018, 1, 1, 12) + scenes[0][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 1) + scenes[0][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 1, 12) mscn = MultiScene(scenes) client_mock = mock.MagicMock() @@ -233,12 +234,12 @@ def test_save_datasets_distributed_source_target(self): scenes[1]["ds3"] = _create_test_dataset("ds3") # Add a start and end time for ds_id in ["ds1", "ds2", "ds3"]: - scenes[1][ds_id].attrs["start_time"] = datetime(2018, 1, 2) - scenes[1][ds_id].attrs["end_time"] = datetime(2018, 1, 2, 12) + scenes[1][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 2) + scenes[1][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 2, 12) if ds_id == "ds3": continue - scenes[0][ds_id].attrs["start_time"] = datetime(2018, 1, 1) - scenes[0][ds_id].attrs["end_time"] = datetime(2018, 1, 1, 12) + scenes[0][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 1) + scenes[0][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 1, 12) mscn = MultiScene(scenes) client_mock = mock.MagicMock() @@ -313,12 +314,12 @@ def test_save_mp4(smg, tmp_path): scenes[1]["ds3"] = _create_test_dataset("ds3") # Add a start and end time for ds_id in ["ds1", "ds2", "ds3"]: - scenes[1][ds_id].attrs["start_time"] = datetime(2018, 1, 2) - scenes[1][ds_id].attrs["end_time"] = datetime(2018, 1, 2, 12) + scenes[1][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 2) + scenes[1][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 2, 12) if ds_id == "ds3": continue - scenes[0][ds_id].attrs["start_time"] = datetime(2018, 1, 1) - scenes[0][ds_id].attrs["end_time"] = datetime(2018, 1, 1, 12) + scenes[0][ds_id].attrs["start_time"] = dt.datetime(2018, 1, 1) + scenes[0][ds_id].attrs["end_time"] = dt.datetime(2018, 1, 1, 12) mscn = MultiScene(scenes) fn = str(tmp_path / diff --git a/satpy/tests/reader_tests/_li_test_utils.py b/satpy/tests/reader_tests/_li_test_utils.py index 32107006fc..6b4d3f7629 100644 --- a/satpy/tests/reader_tests/_li_test_utils.py +++ b/satpy/tests/reader_tests/_li_test_utils.py @@ -14,7 +14,7 @@ # along with satpy. If not, see . """Common utility modules used for LI mock-oriented unit tests.""" -from datetime import datetime +import datetime as dt import numpy as np import xarray as xr @@ -127,8 +127,8 @@ def rand_u16(num): def l2_lef_schema(settings=None): """Define schema for LI L2 LEF product.""" - epoch_ts = datetime(2000, 1, 1, 0, 0, 0, 0) - start_time = datetime.now() + epoch_ts = dt.datetime(2000, 1, 1, 0, 0, 0, 0) + start_time = dt.datetime.now() start_ts = (start_time - epoch_ts).total_seconds() settings = settings or {} @@ -287,9 +287,9 @@ def l2_lfl_schema(settings=None): settings = settings or {} nobs = settings.get("num_obs", 1234) - epoch = datetime(2000, 1, 1) - stime = (datetime(2019, 1, 1) - epoch).total_seconds() - etime = (datetime(2019, 1, 2) - epoch).total_seconds() + epoch = dt.datetime(2000, 1, 1) + stime = (dt.datetime(2019, 1, 1) - epoch).total_seconds() + etime = (dt.datetime(2019, 1, 2) - epoch).total_seconds() return { "providers": settings.get("providers", {}), diff --git a/satpy/tests/reader_tests/modis_tests/_modis_fixtures.py b/satpy/tests/reader_tests/modis_tests/_modis_fixtures.py index 6dc4bf2d05..d663f7b9d9 100644 --- a/satpy/tests/reader_tests/modis_tests/_modis_fixtures.py +++ b/satpy/tests/reader_tests/modis_tests/_modis_fixtures.py @@ -15,10 +15,12 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """MODIS L1b and L2 test fixtures.""" + from __future__ import annotations -from datetime import datetime, timedelta +import datetime as dt from typing import Optional import numpy as np @@ -216,13 +218,13 @@ def _get_l1b_geo_variable_info(filename: str, def generate_nasa_l1b_filename(prefix): """Generate a filename that follows NASA MODIS L1b convention.""" - now = datetime.now() + now = dt.datetime.now() return f"{prefix}_A{now:%y%j_%H%M%S}_{now:%Y%j%H%M%S}.hdf" def generate_imapp_filename(suffix): """Generate a filename that follows IMAPP MODIS L1b convention.""" - now = datetime.now() + now = dt.datetime.now() return f"t1.{now:%y%j.%H%M}.{suffix}.hdf" @@ -275,8 +277,8 @@ def _add_variable_to_file(h, var_name, var_info): def _create_core_metadata(file_shortname: str) -> str: - beginning_date = datetime.now() - ending_date = beginning_date + timedelta(minutes=5) + beginning_date = dt.datetime.now() + ending_date = beginning_date + dt.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" \ @@ -593,7 +595,7 @@ def _get_mask_byte1_variable_info() -> dict: def generate_nasa_l2_filename(prefix: str) -> str: """Generate a file name that follows MODIS 35 L2 convention in a temporary directory.""" - now = datetime.now() + now = dt.datetime.now() return f"{prefix}_L2.A{now:%Y%j.%H%M}.061.{now:%Y%j%H%M%S}.hdf" @@ -614,7 +616,7 @@ def modis_l2_nasa_mod35_file(tmpdir_factory) -> list[str]: def generate_nasa_l3_filename(prefix: str) -> str: """Generate a file name that follows MODIS 09 L3 convention in a temporary directory.""" - now = datetime.now() + now = dt.datetime.now() return f"{prefix}.A{now:%Y%j}.061.{now:%Y%j%H%M%S}.hdf" diff --git a/satpy/tests/reader_tests/test_abi_l1b.py b/satpy/tests/reader_tests/test_abi_l1b.py index 969c497410..9755190318 100644 --- a/satpy/tests/reader_tests/test_abi_l1b.py +++ b/satpy/tests/reader_tests/test_abi_l1b.py @@ -15,10 +15,12 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """The abi_l1b reader tests package.""" + from __future__ import annotations -from datetime import datetime +import datetime as dt from pathlib import Path from typing import Any, Callable from unittest import mock @@ -372,8 +374,8 @@ def test_get_dataset(self, c01_data_arr): "timeline_ID": None, "suffix": "suffix", "units": "W m-2 um-1 sr-1", - "start_time": datetime(2017, 9, 20, 17, 30, 40, 800000), - "end_time": datetime(2017, 9, 20, 17, 41, 17, 500000), + "start_time": dt.datetime(2017, 9, 20, 17, 30, 40, 800000), + "end_time": dt.datetime(2017, 9, 20, 17, 41, 17, 500000), } res = c01_data_arr diff --git a/satpy/tests/reader_tests/test_abi_l2_nc.py b/satpy/tests/reader_tests/test_abi_l2_nc.py index 4b8d3a9578..98a050aa48 100644 --- a/satpy/tests/reader_tests/test_abi_l2_nc.py +++ b/satpy/tests/reader_tests/test_abi_l2_nc.py @@ -14,7 +14,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . + """The abi_l2_nc reader tests package.""" + import contextlib from typing import Optional from unittest import mock @@ -151,7 +153,7 @@ class TestMCMIPReading: @mock.patch("satpy.readers.abi_base.xr") def test_mcmip_get_dataset(self, xr_, product, exp_metadata): """Test getting channel from MCMIP file.""" - from datetime import datetime + import datetime as dt from pyresample.geometry import AreaDefinition @@ -183,8 +185,8 @@ def test_mcmip_get_dataset(self, xr_, product, exp_metadata): "scene_id": None, "sensor": "abi", "timeline_ID": None, - "start_time": datetime(2017, 9, 20, 17, 30, 40, 800000), - "end_time": datetime(2017, 9, 20, 17, 41, 17, 500000), + "start_time": dt.datetime(2017, 9, 20, 17, 30, 40, 800000), + "end_time": dt.datetime(2017, 9, 20, 17, 41, 17, 500000), "ancillary_variables": [], } exp_attrs.update(exp_metadata) diff --git a/satpy/tests/reader_tests/test_acspo.py b/satpy/tests/reader_tests/test_acspo.py index 723d1dbecd..b85232bad4 100644 --- a/satpy/tests/reader_tests/test_acspo.py +++ b/satpy/tests/reader_tests/test_acspo.py @@ -17,8 +17,8 @@ # satpy. If not, see . """Module for testing the satpy.readers.acspo module.""" +import datetime as dt import os -from datetime import datetime, timedelta from unittest import mock import numpy as np @@ -43,7 +43,7 @@ class FakeNetCDF4FileHandler2(FakeNetCDF4FileHandler): def get_test_content(self, filename, filename_info, filetype_info): """Mimic reader input file content.""" - dt = filename_info.get("start_time", datetime(2016, 1, 1, 12, 0, 0)) + date = filename_info.get("start_time", dt.datetime(2016, 1, 1, 12, 0, 0)) sat, inst = { "VIIRS_NPP": ("NPP", "VIIRS"), "VIIRS_N20": ("N20", "VIIRS"), @@ -53,8 +53,8 @@ def get_test_content(self, filename, filename_info, filetype_info): "/attr/platform": sat, "/attr/sensor": inst, "/attr/spatial_resolution": "742 m at nadir", - "/attr/time_coverage_start": dt.strftime("%Y%m%dT%H%M%SZ"), - "/attr/time_coverage_end": (dt + timedelta(minutes=6)).strftime("%Y%m%dT%H%M%SZ"), + "/attr/time_coverage_start": date.strftime("%Y%m%dT%H%M%SZ"), + "/attr/time_coverage_end": (date + dt.timedelta(minutes=6)).strftime("%Y%m%dT%H%M%SZ"), } file_content["lat"] = DEFAULT_LAT_DATA diff --git a/satpy/tests/reader_tests/test_ahi_hsd.py b/satpy/tests/reader_tests/test_ahi_hsd.py index 393afca1c8..fbb0857734 100644 --- a/satpy/tests/reader_tests/test_ahi_hsd.py +++ b/satpy/tests/reader_tests/test_ahi_hsd.py @@ -15,13 +15,15 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """The ahi_hsd reader tests package.""" + from __future__ import annotations import contextlib +import datetime as dt import unittest import warnings -from datetime import datetime from typing import Any, Dict from unittest import mock @@ -340,10 +342,10 @@ def test_read_band(self, calibrate, *mocks): np.testing.assert_allclose(value, actual_obs_params[key]) time_params_exp = { - "nominal_start_time": datetime(2018, 10, 22, 3, 0, 0, 0), - "nominal_end_time": datetime(2018, 10, 22, 3, 10, 0, 0), - "observation_start_time": datetime(2018, 10, 22, 3, 0, 20, 596896), - "observation_end_time": datetime(2018, 10, 22, 3, 10, 20, 596896), + "nominal_start_time": dt.datetime(2018, 10, 22, 3, 0, 0, 0), + "nominal_end_time": dt.datetime(2018, 10, 22, 3, 10, 0, 0), + "observation_start_time": dt.datetime(2018, 10, 22, 3, 0, 20, 596896), + "observation_end_time": dt.datetime(2018, 10, 22, 3, 10, 20, 596896), } actual_time_params = im.attrs["time_parameters"] for key, value in time_params_exp.items(): @@ -416,12 +418,12 @@ def test_scene_loading(self, calibrate, *mocks): def test_time_properties(self): """Test start/end/scheduled time properties.""" with _fake_hsd_handler() as fh: - assert fh.start_time == datetime(2018, 10, 22, 3, 0) - assert fh.end_time == datetime(2018, 10, 22, 3, 10) - assert fh.observation_start_time == datetime(2018, 10, 22, 3, 0, 20, 596896) - assert fh.observation_end_time == datetime(2018, 10, 22, 3, 10, 20, 596896) - assert fh.nominal_start_time == datetime(2018, 10, 22, 3, 0, 0, 0) - assert fh.nominal_end_time == datetime(2018, 10, 22, 3, 10, 0, 0) + assert fh.start_time == dt.datetime(2018, 10, 22, 3, 0) + assert fh.end_time == dt.datetime(2018, 10, 22, 3, 10) + assert fh.observation_start_time == dt.datetime(2018, 10, 22, 3, 0, 20, 596896) + assert fh.observation_end_time == dt.datetime(2018, 10, 22, 3, 10, 20, 596896) + assert fh.nominal_start_time == dt.datetime(2018, 10, 22, 3, 0, 0, 0) + assert fh.nominal_end_time == dt.datetime(2018, 10, 22, 3, 10, 0, 0) def test_blocklen_error(self, *mocks): """Test erraneous blocklength.""" @@ -639,14 +641,14 @@ class TestNominalTimeCalculator: @pytest.mark.parametrize( ("timeline", "expected"), [ - ("0300", datetime(2020, 1, 1, 3, 0, 0)), - ("65526", datetime(2020, 1, 1, 12, 0, 0)) + ("0300", dt.datetime(2020, 1, 1, 3, 0, 0)), + ("65526", dt.datetime(2020, 1, 1, 12, 0, 0)) ] ) def test_invalid_timeline(self, timeline, expected): """Test handling of invalid timeline.""" calc = _NominalTimeCalculator(timeline, "FLDK") - res = calc.get_nominal_start_time(datetime(2020, 1, 1, 12, 0, 0)) + res = calc.get_nominal_start_time(dt.datetime(2020, 1, 1, 12, 0, 0)) assert res == expected @pytest.mark.parametrize( @@ -654,49 +656,49 @@ def test_invalid_timeline(self, timeline, expected): [ ( "JP01", - {"tstart": datetime(2018, 10, 22, 3, 0, 0), - "tend": datetime(2018, 10, 22, 3, 2, 30)} + {"tstart": dt.datetime(2018, 10, 22, 3, 0, 0), + "tend": dt.datetime(2018, 10, 22, 3, 2, 30)} ), ( "JP04", - {"tstart": datetime(2018, 10, 22, 3, 7, 30, 0), - "tend": datetime(2018, 10, 22, 3, 10, 0, 0)} + {"tstart": dt.datetime(2018, 10, 22, 3, 7, 30, 0), + "tend": dt.datetime(2018, 10, 22, 3, 10, 0, 0)} ), ( "R301", - {"tstart": datetime(2018, 10, 22, 3, 0, 0), - "tend": datetime(2018, 10, 22, 3, 2, 30)} + {"tstart": dt.datetime(2018, 10, 22, 3, 0, 0), + "tend": dt.datetime(2018, 10, 22, 3, 2, 30)} ), ( "R304", - {"tstart": datetime(2018, 10, 22, 3, 7, 30, 0), - "tend": datetime(2018, 10, 22, 3, 10, 0, 0)} + {"tstart": dt.datetime(2018, 10, 22, 3, 7, 30, 0), + "tend": dt.datetime(2018, 10, 22, 3, 10, 0, 0)} ), ( "R401", - {"tstart": datetime(2018, 10, 22, 3, 0, 0), - "tend": datetime(2018, 10, 22, 3, 0, 30)} + {"tstart": dt.datetime(2018, 10, 22, 3, 0, 0), + "tend": dt.datetime(2018, 10, 22, 3, 0, 30)} ), ( "R420", - {"tstart": datetime(2018, 10, 22, 3, 9, 30, 0), - "tend": datetime(2018, 10, 22, 3, 10, 0, 0)} + {"tstart": dt.datetime(2018, 10, 22, 3, 9, 30, 0), + "tend": dt.datetime(2018, 10, 22, 3, 10, 0, 0)} ), ( "R501", - {"tstart": datetime(2018, 10, 22, 3, 0, 0), - "tend": datetime(2018, 10, 22, 3, 0, 30)} + {"tstart": dt.datetime(2018, 10, 22, 3, 0, 0), + "tend": dt.datetime(2018, 10, 22, 3, 0, 30)} ), ( "R520", - {"tstart": datetime(2018, 10, 22, 3, 9, 30, 0), - "tend": datetime(2018, 10, 22, 3, 10, 0, 0)} + {"tstart": dt.datetime(2018, 10, 22, 3, 9, 30, 0), + "tend": dt.datetime(2018, 10, 22, 3, 10, 0, 0)} ), ] ) def test_areas(self, area, expected): """Test nominal timestamps for multiple areas.""" - obs_start_time = datetime(2018, 10, 22, 3, 0, 20, 596896) + obs_start_time = dt.datetime(2018, 10, 22, 3, 0, 20, 596896) calc = _NominalTimeCalculator("0300", area) nom_start_time = calc.get_nominal_start_time(obs_start_time) nom_end_time = calc.get_nominal_end_time(nom_start_time) @@ -708,27 +710,27 @@ def test_areas(self, area, expected): [ ( "2350", - datetime(2022, 12, 31, 23, 50, 1), - {"tstart": datetime(2022, 12, 31, 23, 50, 0), - "tend": datetime(2023, 1, 1, 0, 0, 0)} + dt.datetime(2022, 12, 31, 23, 50, 1), + {"tstart": dt.datetime(2022, 12, 31, 23, 50, 0), + "tend": dt.datetime(2023, 1, 1, 0, 0, 0)} ), ( "2350", - datetime(2022, 12, 31, 23, 49, 59), - {"tstart": datetime(2022, 12, 31, 23, 50, 0), - "tend": datetime(2023, 1, 1, 0, 0, 0)} + dt.datetime(2022, 12, 31, 23, 49, 59), + {"tstart": dt.datetime(2022, 12, 31, 23, 50, 0), + "tend": dt.datetime(2023, 1, 1, 0, 0, 0)} ), ( "0000", - datetime(2023, 1, 1, 0, 0, 1), - {"tstart": datetime(2023, 1, 1, 0, 0, 0), - "tend": datetime(2023, 1, 1, 0, 10, 0)} + dt.datetime(2023, 1, 1, 0, 0, 1), + {"tstart": dt.datetime(2023, 1, 1, 0, 0, 0), + "tend": dt.datetime(2023, 1, 1, 0, 10, 0)} ), ( "0000", - datetime(2022, 12, 31, 23, 59, 59), - {"tstart": datetime(2023, 1, 1, 0, 0, 0), - "tend": datetime(2023, 1, 1, 0, 10, 0)} + dt.datetime(2022, 12, 31, 23, 59, 59), + {"tstart": dt.datetime(2023, 1, 1, 0, 0, 0), + "tend": dt.datetime(2023, 1, 1, 0, 10, 0)} ), ] ) diff --git a/satpy/tests/reader_tests/test_ahi_l2_nc.py b/satpy/tests/reader_tests/test_ahi_l2_nc.py index 817738bb82..fcb1c34658 100644 --- a/satpy/tests/reader_tests/test_ahi_l2_nc.py +++ b/satpy/tests/reader_tests/test_ahi_l2_nc.py @@ -1,6 +1,6 @@ """Tests for the Himawari L2 netCDF reader.""" -from datetime import datetime +import datetime as dt import numpy as np import pytest @@ -15,8 +15,8 @@ lat_data = rng.uniform(-90, 90, (5500, 5500)) lon_data = rng.uniform(-180, 180, (5500, 5500)) -start_time = datetime(2023, 8, 24, 5, 40, 21) -end_time = datetime(2023, 8, 24, 5, 49, 40) +start_time = dt.datetime(2023, 8, 24, 5, 40, 21) +end_time = dt.datetime(2023, 8, 24, 5, 49, 40) dimensions = {"Columns": 5500, "Rows": 5500} diff --git a/satpy/tests/reader_tests/test_ami_l1b.py b/satpy/tests/reader_tests/test_ami_l1b.py index 7dd2cfcb33..6af6c1099f 100644 --- a/satpy/tests/reader_tests/test_ami_l1b.py +++ b/satpy/tests/reader_tests/test_ami_l1b.py @@ -173,9 +173,9 @@ def test_filename_grouping(self): def test_basic_attributes(self): """Test getting basic file attributes.""" - from datetime import datetime - assert self.reader.start_time == datetime(2019, 9, 30, 3, 0, 31, 957882) - assert self.reader.end_time == datetime(2019, 9, 30, 3, 9, 35, 606133) + import datetime as dt + assert self.reader.start_time == dt.datetime(2019, 9, 30, 3, 0, 31, 957882) + assert self.reader.end_time == dt.datetime(2019, 9, 30, 3, 9, 35, 606133) def test_get_dataset(self): """Test gettting radiance data.""" diff --git a/satpy/tests/reader_tests/test_amsr2_l2_gaasp.py b/satpy/tests/reader_tests/test_amsr2_l2_gaasp.py index 2f1b3ad7b0..d6e6597d69 100644 --- a/satpy/tests/reader_tests/test_amsr2_l2_gaasp.py +++ b/satpy/tests/reader_tests/test_amsr2_l2_gaasp.py @@ -17,8 +17,8 @@ # satpy. If not, see . """Tests for the 'amsr2_l2_gaasp' reader.""" +import datetime as dt import os -from datetime import datetime from unittest import mock import dask.array as da @@ -259,8 +259,8 @@ def _check_attrs(data_arr): assert "add_offset" not in attrs assert attrs["platform_name"] == "GCOM-W1" assert attrs["sensor"] == "amsr2" - assert attrs["start_time"] == datetime(2020, 8, 12, 5, 58, 31) - assert attrs["end_time"] == datetime(2020, 8, 12, 6, 7, 1) + assert attrs["start_time"] == dt.datetime(2020, 8, 12, 5, 58, 31) + assert attrs["end_time"] == dt.datetime(2020, 8, 12, 6, 7, 1) @pytest.mark.parametrize( ("filenames", "loadable_ids"), diff --git a/satpy/tests/reader_tests/test_ascat_l2_soilmoisture_bufr.py b/satpy/tests/reader_tests/test_ascat_l2_soilmoisture_bufr.py index 07ed218e72..dc3e371b46 100644 --- a/satpy/tests/reader_tests/test_ascat_l2_soilmoisture_bufr.py +++ b/satpy/tests/reader_tests/test_ascat_l2_soilmoisture_bufr.py @@ -15,12 +15,13 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Unittesting the ASCAT SCATTEROMETER SOIL MOISTURE BUFR reader.""" +import datetime as dt import os import sys import unittest -from datetime import datetime import numpy as np @@ -152,8 +153,8 @@ def test_scene(self): fname = os.path.join(self.base_dir, FILENAME) scn = Scene(reader="ascat_l2_soilmoisture_bufr", filenames=[fname]) assert "scatterometer" in scn.sensor_names - assert datetime(2020, 12, 21, 9, 33, 0) == scn.start_time - assert datetime(2020, 12, 21, 9, 33, 59) == scn.end_time + assert dt.datetime(2020, 12, 21, 9, 33, 0) == scn.start_time + assert dt.datetime(2020, 12, 21, 9, 33, 59) == scn.end_time @unittest.skipIf(sys.platform.startswith("win"), "'eccodes' not supported on Windows") def test_scene_load_available_datasets(self): diff --git a/satpy/tests/reader_tests/test_atms_l1b_nc.py b/satpy/tests/reader_tests/test_atms_l1b_nc.py index 6b27081ed9..f1f729311a 100644 --- a/satpy/tests/reader_tests/test_atms_l1b_nc.py +++ b/satpy/tests/reader_tests/test_atms_l1b_nc.py @@ -12,9 +12,10 @@ # # You should have received a copy of the GNU General Public License # along with satpy. If not, see . + """The atms_l1b_nc reader tests package.""" -from datetime import datetime +import datetime as dt import numpy as np import pytest @@ -32,7 +33,7 @@ def reader(l1b_file): """Return reader of ATMS level1b data.""" return AtmsL1bNCFileHandler( filename=l1b_file, - filename_info={"creation_time": datetime(2020, 1, 2, 3, 4, 5)}, + filename_info={"creation_time": dt.datetime(2020, 1, 2, 3, 4, 5)}, filetype_info={"antenna_temperature": "antenna_temp"}, ) @@ -78,11 +79,11 @@ class TestAtsmsL1bNCFileHandler: def test_start_time(self, reader): """Test start time.""" - assert reader.start_time == datetime(2000, 1, 2, 3, 4, 5) + assert reader.start_time == dt.datetime(2000, 1, 2, 3, 4, 5) def test_end_time(self, reader): """Test end time.""" - assert reader.end_time == datetime(2000, 1, 2, 4, 5, 6) + assert reader.end_time == dt.datetime(2000, 1, 2, 4, 5, 6) def test_sensor(self, reader): """Test sensor.""" @@ -100,8 +101,8 @@ def test_antenna_temperature(self, reader, atms_fake_dataset): ) @pytest.mark.parametrize(("param", "expect"), [ - ("start_time", datetime(2000, 1, 2, 3, 4, 5)), - ("end_time", datetime(2000, 1, 2, 4, 5, 6)), + ("start_time", dt.datetime(2000, 1, 2, 3, 4, 5)), + ("end_time", dt.datetime(2000, 1, 2, 4, 5, 6)), ("platform_name", "JPSS-1"), ("sensor", "ATMS"), ]) @@ -135,11 +136,11 @@ def test_drop_coords(self, reader): assert coords not in data.coords @pytest.mark.parametrize(("param", "expect"), [ - ("start_time", datetime(2000, 1, 2, 3, 4, 5)), - ("end_time", datetime(2000, 1, 2, 4, 5, 6)), + ("start_time", dt.datetime(2000, 1, 2, 3, 4, 5)), + ("end_time", dt.datetime(2000, 1, 2, 4, 5, 6)), ("platform_name", "JPSS-1"), ("sensor", "ATMS"), - ("creation_time", datetime(2020, 1, 2, 3, 4, 5)), + ("creation_time", dt.datetime(2020, 1, 2, 3, 4, 5)), ("type", "test_data"), ("name", "test"), ]) diff --git a/satpy/tests/reader_tests/test_atms_sdr_hdf5.py b/satpy/tests/reader_tests/test_atms_sdr_hdf5.py index 8971c2d933..4fe6c120a1 100644 --- a/satpy/tests/reader_tests/test_atms_sdr_hdf5.py +++ b/satpy/tests/reader_tests/test_atms_sdr_hdf5.py @@ -18,8 +18,8 @@ """Module for testing the ATMS SDR HDF5 reader.""" +import datetime as dt import os -from datetime import datetime from unittest import mock import numpy as np @@ -288,8 +288,8 @@ def test_init_start_end_time(self): """Test basic init with start and end times around the start/end times of the provided file.""" r = load_reader(self.reader_configs, filter_parameters={ - "start_time": datetime(2022, 12, 19), - "end_time": datetime(2022, 12, 21) + "start_time": dt.datetime(2022, 12, 19), + "end_time": dt.datetime(2022, 12, 21) }) loadables = r.select_files_from_pathnames([ "SATMS_j01_d20221220_t0910240_e0921356_b26361_c20221220100456348770_cspp_dev.h5", diff --git a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py index 4f4e8e974a..3040a46750 100644 --- a/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py +++ b/satpy/tests/reader_tests/test_avhrr_l1b_gaclac.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Pygac interface.""" -from datetime import date, datetime +import datetime as dt from unittest import TestCase, mock import dask.array as da @@ -190,7 +191,7 @@ def test_init_eosip(self): fh = self._get_eosip_fh(filename, **kwargs) assert fh.start_time < fh.end_time assert fh.reader_class is reader_cls - assert fh.reader_kwargs["header_date"] > date(1994, 11, 15) + assert fh.reader_kwargs["header_date"] > dt.date(1994, 11, 15) def test_read_raw_data(self): """Test raw data reading.""" @@ -456,8 +457,8 @@ def _slice_patched(data): data_slc, times_slc = fh.slice(data, times) np.testing.assert_array_equal(data_slc, data[1:3]) np.testing.assert_array_equal(times_slc, times[1:3]) - assert fh.start_time == datetime(1970, 1, 1, 0, 0, 0, 2) - assert fh.end_time == datetime(1970, 1, 1, 0, 0, 0, 3) + assert fh.start_time == dt.datetime(1970, 1, 1, 0, 0, 0, 2) + assert fh.end_time == dt.datetime(1970, 1, 1, 0, 0, 0, 3) @mock.patch("satpy.readers.avhrr_l1b_gaclac.GACLACFile._get_qual_flags") @mock.patch("satpy.readers.avhrr_l1b_gaclac.GACLACFile._strip_invalid_lat") diff --git a/satpy/tests/reader_tests/test_epic_l1b_h5.py b/satpy/tests/reader_tests/test_epic_l1b_h5.py index 472cda7f2d..18eedbad6d 100644 --- a/satpy/tests/reader_tests/test_epic_l1b_h5.py +++ b/satpy/tests/reader_tests/test_epic_l1b_h5.py @@ -89,11 +89,11 @@ def setup_method(self): def test_times(self, setup_hdf5_file): """Test start and end times load properly.""" - from datetime import datetime + import datetime as dt test_reader = self._setup_h5(setup_hdf5_file) - assert test_reader.start_time == datetime(2015, 6, 13, 12, 0, 37) - assert test_reader.end_time == datetime(2015, 6, 13, 12, 5, 1) + assert test_reader.start_time == dt.datetime(2015, 6, 13, 12, 0, 37) + assert test_reader.end_time == dt.datetime(2015, 6, 13, 12, 5, 1) def test_counts_calibration(self, setup_hdf5_file): """Test that data is correctly calibrated.""" diff --git a/satpy/tests/reader_tests/test_eum_base.py b/satpy/tests/reader_tests/test_eum_base.py index 55ac977b59..35b29aa79c 100644 --- a/satpy/tests/reader_tests/test_eum_base.py +++ b/satpy/tests/reader_tests/test_eum_base.py @@ -15,10 +15,11 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """EUMETSAT base reader tests package.""" +import datetime as dt import unittest -from datetime import datetime import numpy as np @@ -40,18 +41,18 @@ def test_fun(self): """Test function for TestMakeTimeCdsDictionary.""" # time_cds_short tcds = {"Days": np.array(1), "Milliseconds": np.array(2)} - expected = datetime(1958, 1, 2, 0, 0, 0, 2000) + expected = dt.datetime(1958, 1, 2, 0, 0, 0, 2000) assert timecds2datetime(tcds) == expected # time_cds tcds = {"Days": np.array(1), "Milliseconds": np.array(2), "Microseconds": np.array(3)} - expected = datetime(1958, 1, 2, 0, 0, 0, 2003) + expected = dt.datetime(1958, 1, 2, 0, 0, 0, 2003) assert timecds2datetime(tcds) == expected # time_cds_expanded tcds = {"Days": np.array(1), "Milliseconds": np.array(2), "Microseconds": np.array(3), "Nanoseconds": np.array(4)} - expected = datetime(1958, 1, 2, 0, 0, 0, 2003) + expected = dt.datetime(1958, 1, 2, 0, 0, 0, 2003) assert timecds2datetime(tcds) == expected @@ -62,17 +63,17 @@ def test_fun(self): """Test function for TestMakeTimeCdsRecarray.""" # time_cds_short tcds = np.array([(1, 2)], dtype=np.dtype(time_cds_short)) - expected = datetime(1958, 1, 2, 0, 0, 0, 2000) + expected = dt.datetime(1958, 1, 2, 0, 0, 0, 2000) assert timecds2datetime(tcds) == expected # time_cds tcds = np.array([(1, 2, 3)], dtype=np.dtype(time_cds)) - expected = datetime(1958, 1, 2, 0, 0, 0, 2003) + expected = dt.datetime(1958, 1, 2, 0, 0, 0, 2003) assert timecds2datetime(tcds) == expected # time_cds_expanded tcds = np.array([(1, 2, 3, 4)], dtype=np.dtype(time_cds_expanded)) - expected = datetime(1958, 1, 2, 0, 0, 0, 2003) + expected = dt.datetime(1958, 1, 2, 0, 0, 0, 2003) assert timecds2datetime(tcds) == expected @@ -97,9 +98,9 @@ def test_timestamps(self): (21916, 42309417, 918, 443))]]], dtype=pat_dt) expected = { - "TrueRepeatCycleStart": datetime(2018, 1, 2, 11, 30, 9, 544305), - "PlanForwardScanEnd": datetime(2018, 1, 2, 11, 42, 40, 340660), - "PlannedRepeatCycleEnd": datetime(2018, 1, 2, 11, 45, 9, 417918) + "TrueRepeatCycleStart": dt.datetime(2018, 1, 2, 11, 30, 9, 544305), + "PlanForwardScanEnd": dt.datetime(2018, 1, 2, 11, 42, 40, 340660), + "PlannedRepeatCycleEnd": dt.datetime(2018, 1, 2, 11, 45, 9, 417918) } assert recarray2dict(pat) == expected diff --git a/satpy/tests/reader_tests/test_generic_image.py b/satpy/tests/reader_tests/test_generic_image.py index cd347ce07e..65e21edd38 100644 --- a/satpy/tests/reader_tests/test_generic_image.py +++ b/satpy/tests/reader_tests/test_generic_image.py @@ -32,14 +32,14 @@ class TestGenericImage(unittest.TestCase): def setUp(self): """Create temporary images to test on.""" + import datetime as dt import tempfile - from datetime import datetime from pyresample.geometry import AreaDefinition from satpy.scene import Scene - self.date = datetime(2018, 1, 1) + self.date = dt.datetime(2018, 1, 1) # Create area definition pcs_id = "ETRS89 / LAEA Europe" diff --git a/satpy/tests/reader_tests/test_ghrsst_l2.py b/satpy/tests/reader_tests/test_ghrsst_l2.py index 66c030e91d..b4cabccfa4 100644 --- a/satpy/tests/reader_tests/test_ghrsst_l2.py +++ b/satpy/tests/reader_tests/test_ghrsst_l2.py @@ -17,9 +17,9 @@ # satpy. If not, see . """Module for testing the satpy.readers.ghrsst_l2 module.""" +import datetime as dt import os import tarfile -from datetime import datetime from pathlib import Path import numpy as np @@ -124,7 +124,7 @@ def test_get_dataset(self, tmp_path): def test_get_sensor(self, tmp_path): """Test retrieval of the sensor name from the netCDF file.""" - dt_valid = datetime(2022, 3, 21, 11, 26, 40) # 202203211200Z + dt_valid = dt.datetime(2022, 3, 21, 11, 26, 40) # 202203211200Z filename_info = {"field_type": "NARSST", "generating_centre": "FRA_", "satid": "NOAA20_", "valid_time": dt_valid} @@ -136,9 +136,9 @@ def test_get_sensor(self, tmp_path): def test_get_start_and_end_times(self, tmp_path): """Test retrieval of the sensor name from the netCDF file.""" - dt_valid = datetime(2022, 3, 21, 11, 26, 40) # 202203211200Z - good_start_time = datetime(2022, 3, 21, 11, 26, 40) # 20220321T112640Z - good_stop_time = datetime(2022, 3, 21, 14, 57, 11) # 20220321T145711Z + dt_valid = dt.datetime(2022, 3, 21, 11, 26, 40) # 202203211200Z + good_start_time = dt.datetime(2022, 3, 21, 11, 26, 40) # 20220321T112640Z + good_stop_time = dt.datetime(2022, 3, 21, 14, 57, 11) # 20220321T145711Z filename_info = {"field_type": "NARSST", "generating_centre": "FRA_", "satid": "NOAA20_", "valid_time": dt_valid} diff --git a/satpy/tests/reader_tests/test_glm_l2.py b/satpy/tests/reader_tests/test_glm_l2.py index 81636ba630..8ee53e29a2 100644 --- a/satpy/tests/reader_tests/test_glm_l2.py +++ b/satpy/tests/reader_tests/test_glm_l2.py @@ -128,9 +128,9 @@ def setUp(self, xr_): def test_basic_attributes(self): """Test getting basic file attributes.""" - from datetime import datetime - assert self.reader.start_time == datetime(2017, 9, 20, 17, 30, 40) - assert self.reader.end_time == datetime(2017, 9, 20, 17, 41, 17) + import datetime as dt + assert self.reader.start_time == dt.datetime(2017, 9, 20, 17, 30, 40) + assert self.reader.end_time == dt.datetime(2017, 9, 20, 17, 41, 17) def test_get_dataset(self): """Test the get_dataset method.""" diff --git a/satpy/tests/reader_tests/test_goci2_l2_nc.py b/satpy/tests/reader_tests/test_goci2_l2_nc.py index 865ac3184e..e8bdae0e58 100644 --- a/satpy/tests/reader_tests/test_goci2_l2_nc.py +++ b/satpy/tests/reader_tests/test_goci2_l2_nc.py @@ -15,8 +15,10 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Module for testing the satpy.readers.goci2_l2_nc module.""" -from datetime import datetime + +import datetime as dt import numpy as np import pytest @@ -30,8 +32,8 @@ # - tmp_path_factory -start_time = datetime(2024, 2, 14, 2, 32, 27) -end_time = datetime(2024, 2, 14, 2, 33, 31) +start_time = dt.datetime(2024, 2, 14, 2, 32, 27) +end_time = dt.datetime(2024, 2, 14, 2, 33, 31) global_attrs = { "observation_start_time": start_time.strftime("%Y%m%d_%H%M%S"), diff --git a/satpy/tests/reader_tests/test_gpm_imerg.py b/satpy/tests/reader_tests/test_gpm_imerg.py index a75e59863f..d038d0f0d7 100644 --- a/satpy/tests/reader_tests/test_gpm_imerg.py +++ b/satpy/tests/reader_tests/test_gpm_imerg.py @@ -14,12 +14,12 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . -"""Unittests for GPM IMERG reader.""" +"""Unittests for GPM IMERG reader.""" +import datetime as dt import os import unittest -from datetime import datetime from unittest import mock import dask.array as da @@ -127,8 +127,8 @@ def test_load_data(self): assert reader.file_handlers res = reader.load(["IRprecipitation"]) assert 1 == len(res) - assert res["IRprecipitation"].start_time == datetime(2020, 1, 31, 23, 30, 0) - assert res["IRprecipitation"].end_time == datetime(2020, 1, 31, 23, 59, 59) + assert res["IRprecipitation"].start_time == dt.datetime(2020, 1, 31, 23, 30, 0) + assert res["IRprecipitation"].end_time == dt.datetime(2020, 1, 31, 23, 59, 59) assert res["IRprecipitation"].resolution == 0.1 assert res["IRprecipitation"].area.width == 3600 assert res["IRprecipitation"].area.height == 1800 diff --git a/satpy/tests/reader_tests/test_hrit_base.py b/satpy/tests/reader_tests/test_hrit_base.py index 12317f11f1..dd57c12fdd 100644 --- a/satpy/tests/reader_tests/test_hrit_base.py +++ b/satpy/tests/reader_tests/test_hrit_base.py @@ -18,10 +18,10 @@ """The HRIT base reader tests package.""" import bz2 +import datetime as dt import gzip import os import unittest -from datetime import datetime, timedelta from tempfile import NamedTemporaryFile, gettempdir from unittest import mock @@ -189,7 +189,7 @@ def setup_method(self, method): with mock.patch.object(HRITFileHandler, "_get_hd", new=new_get_hd): self.reader = HRITFileHandler("filename", {"platform_shortname": "MSG3", - "start_time": datetime(2016, 3, 3, 0, 0)}, + "start_time": dt.datetime(2016, 3, 3, 0, 0)}, {"filetype": "info"}, [mock.MagicMock(), mock.MagicMock(), mock.MagicMock()]) @@ -269,9 +269,9 @@ def test_read_band_gzip_stream(self, stub_gzipped_hrit_file): def test_start_end_time(self): """Test reading and converting start/end time.""" - assert self.reader.start_time == datetime(2016, 3, 3, 0, 0) + assert self.reader.start_time == dt.datetime(2016, 3, 3, 0, 0) assert self.reader.start_time == self.reader.observation_start_time - assert self.reader.end_time == datetime(2016, 3, 3, 0, 0) + timedelta(minutes=15) + assert self.reader.end_time == dt.datetime(2016, 3, 3, 0, 0) + dt.timedelta(minutes=15) assert self.reader.end_time == self.reader.observation_end_time @@ -292,7 +292,7 @@ def test_read_band_filepath(self, stub_compressed_hrit_file): with mock.patch.object(HRITFileHandler, "_get_hd", side_effect=new_get_hd, autospec=True) as get_hd: self.reader = HRITFileHandler(filename, {"platform_shortname": "MSG3", - "start_time": datetime(2016, 3, 3, 0, 0)}, + "start_time": dt.datetime(2016, 3, 3, 0, 0)}, {"filetype": "info"}, [mock.MagicMock(), mock.MagicMock(), mock.MagicMock()]) diff --git a/satpy/tests/reader_tests/test_hsaf_grib.py b/satpy/tests/reader_tests/test_hsaf_grib.py index da0f6dd86b..296bb921c4 100644 --- a/satpy/tests/reader_tests/test_hsaf_grib.py +++ b/satpy/tests/reader_tests/test_hsaf_grib.py @@ -17,9 +17,9 @@ # satpy. If not, see . """Module for testing the satpy.readers.grib module.""" +import datetime as dt import sys import unittest -from datetime import datetime from unittest import mock import numpy as np @@ -132,7 +132,7 @@ def tearDown(self): def test_init(self, pg): """Test the init function, ensure that the correct dates and metadata are returned.""" pg.open.return_value = FakeGRIB() - correct_dt = datetime(2019, 6, 3, 16, 45, 0) + correct_dt = dt.datetime(2019, 6, 3, 16, 45, 0) from satpy.readers.hsaf_grib import HSAFFileHandler fh = HSAFFileHandler("filename", mock.MagicMock(), mock.MagicMock()) assert fh._analysis_time == correct_dt diff --git a/satpy/tests/reader_tests/test_hsaf_h5.py b/satpy/tests/reader_tests/test_hsaf_h5.py index 49658e6727..bdd523ad0d 100644 --- a/satpy/tests/reader_tests/test_hsaf_h5.py +++ b/satpy/tests/reader_tests/test_hsaf_h5.py @@ -1,6 +1,7 @@ """Tests for the H-SAF H5 reader.""" + +import datetime as dt import os -from datetime import datetime import h5py import numpy as np @@ -50,7 +51,7 @@ def test_hsaf_sc_datetime(sc_h5_file): loaded_scene = _get_scene_with_loaded_sc_datasets(sc_h5_file) fname = os.path.basename(sc_h5_file) dtstr = fname.split("_")[1] - obs_time = datetime.strptime(dtstr, "%Y%m%d") + obs_time = dt.datetime.strptime(dtstr, "%Y%m%d") assert loaded_scene["SC"].attrs["data_time"] == obs_time diff --git a/satpy/tests/reader_tests/test_hy2_scat_l2b_h5.py b/satpy/tests/reader_tests/test_hy2_scat_l2b_h5.py index f90da00613..999fb50045 100644 --- a/satpy/tests/reader_tests/test_hy2_scat_l2b_h5.py +++ b/satpy/tests/reader_tests/test_hy2_scat_l2b_h5.py @@ -509,7 +509,7 @@ def test_reading_attrs_nsoas(self): def test_properties(self): """Test platform_name.""" - from datetime import datetime + import datetime as dt from satpy.readers import load_reader filenames = [ @@ -521,5 +521,5 @@ def test_properties(self): # Make sure we have some files res = reader.load(["wvc_lon"]) assert res["wvc_lon"].platform_name == "HY-2B" - assert res["wvc_lon"].start_time == datetime(2020, 3, 26, 1, 11, 7) - assert res["wvc_lon"].end_time == datetime(2020, 3, 26, 2, 55, 40) + assert res["wvc_lon"].start_time == dt.datetime(2020, 3, 26, 1, 11, 7) + assert res["wvc_lon"].end_time == dt.datetime(2020, 3, 26, 2, 55, 40) diff --git a/satpy/tests/reader_tests/test_ici_l1b_nc.py b/satpy/tests/reader_tests/test_ici_l1b_nc.py index a5909b249d..ab8bad2527 100644 --- a/satpy/tests/reader_tests/test_ici_l1b_nc.py +++ b/satpy/tests/reader_tests/test_ici_l1b_nc.py @@ -15,13 +15,14 @@ # # You should have received a copy of the GNU General Public License # along with satpy. If not, see . + """The ici_l1b_nc reader tests package. This version tests the reader for ICI test data as per PFS V3A. """ -from datetime import datetime +import datetime as dt from unittest.mock import patch import numpy as np @@ -50,13 +51,13 @@ def reader(fake_file): filename=fake_file, filename_info={ "sensing_start_time": ( - datetime.fromisoformat("2000-01-01T01:00:00") + dt.datetime.fromisoformat("2000-01-01T01:00:00") ), "sensing_end_time": ( - datetime.fromisoformat("2000-01-01T02:00:00") + dt.datetime.fromisoformat("2000-01-01T02:00:00") ), "creation_time": ( - datetime.fromisoformat("2000-01-01T03:00:00") + dt.datetime.fromisoformat("2000-01-01T03:00:00") ), }, filetype_info={ @@ -217,11 +218,11 @@ class TestIciL1bNCFileHandler: def test_start_time(self, reader): """Test start time.""" - assert reader.start_time == datetime(2000, 1, 2, 3, 4, 5) + assert reader.start_time == dt.datetime(2000, 1, 2, 3, 4, 5) def test_end_time(self, reader): """Test end time.""" - assert reader.end_time == datetime(2000, 1, 2, 4, 5, 6) + assert reader.end_time == dt.datetime(2000, 1, 2, 4, 5, 6) def test_sensor(self, reader): """Test sensor.""" @@ -517,13 +518,13 @@ def test_get_global_attributes(self, reader): attributes = reader._get_global_attributes() assert attributes == { "filename": reader.filename, - "start_time": datetime(2000, 1, 2, 3, 4, 5), - "end_time": datetime(2000, 1, 2, 4, 5, 6), + "start_time": dt.datetime(2000, 1, 2, 3, 4, 5), + "end_time": dt.datetime(2000, 1, 2, 4, 5, 6), "spacecraft_name": "SGB", "ssp_lon": None, "sensor": "ICI", - "filename_start_time": datetime(2000, 1, 1, 1, 0), - "filename_end_time": datetime(2000, 1, 1, 2, 0), + "filename_start_time": dt.datetime(2000, 1, 1, 1, 0), + "filename_end_time": dt.datetime(2000, 1, 1, 2, 0), "platform_name": "SGB", "quality_group": { "duration_of_product": np.array(1000., dtype=np.float32), diff --git a/satpy/tests/reader_tests/test_insat3d_img_l1b_h5.py b/satpy/tests/reader_tests/test_insat3d_img_l1b_h5.py index 9fa7af224d..0cefac2a2f 100644 --- a/satpy/tests/reader_tests/test_insat3d_img_l1b_h5.py +++ b/satpy/tests/reader_tests/test_insat3d_img_l1b_h5.py @@ -1,6 +1,7 @@ """Tests for the Insat3D reader.""" + +import datetime as dt import os -from datetime import datetime import dask.array as da import h5netcdf @@ -72,8 +73,8 @@ "ALBEDO": "%", "TEMP": "K"} -start_time = datetime(2009, 6, 9, 9, 0) -end_time = datetime(2009, 6, 9, 9, 30) +start_time = dt.datetime(2009, 6, 9, 9, 0) +end_time = dt.datetime(2009, 6, 9, 9, 30) subsatellite_longitude = 82 time_pattern = "%d-%b-%YT%H:%M:%S" diff --git a/satpy/tests/reader_tests/test_li_l2_nc.py b/satpy/tests/reader_tests/test_li_l2_nc.py index 5e9d0ff563..05eb37b4e4 100644 --- a/satpy/tests/reader_tests/test_li_l2_nc.py +++ b/satpy/tests/reader_tests/test_li_l2_nc.py @@ -12,9 +12,11 @@ # # You should have received a copy of the GNU General Public License # along with satpy. If not, see . + """Unit tests on the LI L2 reader using the conventional mock constructed context.""" + +import datetime as dt import os -from datetime import datetime from unittest import mock import numpy as np @@ -405,7 +407,7 @@ def test_report_datetimes(self, filetype_infos): assert dset.values.dtype == np.dtype("datetime64[ns]") # The default epoch_time should be 1.234 seconds after epoch: - ref_time = np.datetime64(datetime(2000, 1, 1, 0, 0, 1, 234000)) + ref_time = np.datetime64(dt.datetime(2000, 1, 1, 0, 0, 1, 234000)) assert np.all(dset.values == ref_time) # Check time_offset: diff --git a/satpy/tests/reader_tests/test_mimic_TPW2_lowres.py b/satpy/tests/reader_tests/test_mimic_TPW2_lowres.py index 4083f7de00..be0bc12ee1 100644 --- a/satpy/tests/reader_tests/test_mimic_TPW2_lowres.py +++ b/satpy/tests/reader_tests/test_mimic_TPW2_lowres.py @@ -18,10 +18,10 @@ # Satpy. If not, see . """Module for testing the satpy.readers.tropomi_l2 module.""" +import datetime as dt import itertools import os import unittest -from datetime import datetime from unittest import mock import numpy as np @@ -31,7 +31,7 @@ DEFAULT_FILE_DTYPE = np.float32 DEFAULT_FILE_SHAPE = (721, 1440) -DEFAULT_DATE = datetime(2019, 6, 19, 13, 0) +DEFAULT_DATE = dt.datetime(2019, 6, 19, 13, 0) DEFAULT_LAT = np.linspace(-90, 90, DEFAULT_FILE_SHAPE[0], dtype=DEFAULT_FILE_DTYPE) DEFAULT_LON = np.linspace(-180, 180, DEFAULT_FILE_SHAPE[1], dtype=DEFAULT_FILE_DTYPE) DEFAULT_FILE_FLOAT_DATA = np.arange(DEFAULT_FILE_SHAPE[0] * DEFAULT_FILE_SHAPE[1], diff --git a/satpy/tests/reader_tests/test_mimic_TPW2_nc.py b/satpy/tests/reader_tests/test_mimic_TPW2_nc.py index 63214b0477..29857afbed 100644 --- a/satpy/tests/reader_tests/test_mimic_TPW2_nc.py +++ b/satpy/tests/reader_tests/test_mimic_TPW2_nc.py @@ -16,11 +16,12 @@ # # You should have received a copy of the GNU General Public License along with # Satpy. If not, see . + """Module for testing the satpy.readers.tropomi_l2 module.""" +import datetime as dt import os import unittest -from datetime import datetime from unittest import mock import numpy as np @@ -43,8 +44,8 @@ class FakeNetCDF4FileHandlerMimic(FakeNetCDF4FileHandler): def get_test_content(self, filename, filename_info, filetype_info): """Mimic reader input file content.""" from xarray import DataArray - dt_s = filename_info.get("start_time", datetime(2019, 6, 19, 13, 0)) - dt_e = filename_info.get("end_time", datetime(2019, 6, 19, 13, 0)) + dt_s = filename_info.get("start_time", dt.datetime(2019, 6, 19, 13, 0)) + dt_e = filename_info.get("end_time", dt.datetime(2019, 6, 19, 13, 0)) if filetype_info["file_type"] == "mimicTPW2_comp": file_content = { diff --git a/satpy/tests/reader_tests/test_mirs.py b/satpy/tests/reader_tests/test_mirs.py index b857147e47..e4e547bdf8 100644 --- a/satpy/tests/reader_tests/test_mirs.py +++ b/satpy/tests/reader_tests/test_mirs.py @@ -16,11 +16,13 @@ # # You should have received a copy of the GNU General Public License along with # Satpy. If not, see . + """Module for testing the satpy.readers.mirs module.""" + from __future__ import annotations +import datetime as dt import os -from datetime import datetime from unittest import mock import numpy as np @@ -45,7 +47,7 @@ N_SCANLINE = 100 DEFAULT_FILE_DTYPE = np.float32 DEFAULT_2D_SHAPE = (N_SCANLINE, N_FOV) -DEFAULT_DATE = datetime(2019, 6, 19, 13, 0) +DEFAULT_DATE = dt.datetime(2019, 6, 19, 13, 0) DEFAULT_LAT = np.linspace(23.09356, 36.42844, N_SCANLINE * N_FOV, dtype=DEFAULT_FILE_DTYPE) DEFAULT_LON = np.linspace(127.6879, 144.5284, N_SCANLINE * N_FOV, @@ -71,8 +73,8 @@ PLATFORM = {"M2": "metop-a", "NPP": "npp", "GPM": "gpm"} SENSOR = {"m2": "amsu-mhs", "npp": "atms", "gpm": "GPI"} -START_TIME = datetime(2017, 2, 6, 16, 1, 0) -END_TIME = datetime(2017, 2, 6, 16, 7, 0) +START_TIME = dt.datetime(2017, 2, 6, 16, 1, 0) +END_TIME = dt.datetime(2017, 2, 6, 16, 7, 0) def fake_coeff_from_fn(fn): diff --git a/satpy/tests/reader_tests/test_mws_l1b_nc.py b/satpy/tests/reader_tests/test_mws_l1b_nc.py index 2d227822a4..52a894bd00 100644 --- a/satpy/tests/reader_tests/test_mws_l1b_nc.py +++ b/satpy/tests/reader_tests/test_mws_l1b_nc.py @@ -19,8 +19,8 @@ """ +import datetime as dt import logging -from datetime import datetime from unittest.mock import patch import numpy as np @@ -50,13 +50,13 @@ def reader(fake_file): filename=fake_file, filename_info={ "start_time": ( - datetime.fromisoformat("2000-01-01T01:00:00") + dt.datetime.fromisoformat("2000-01-01T01:00:00") ), "end_time": ( - datetime.fromisoformat("2000-01-01T02:00:00") + dt.datetime.fromisoformat("2000-01-01T02:00:00") ), "creation_time": ( - datetime.fromisoformat("2000-01-01T03:00:00") + dt.datetime.fromisoformat("2000-01-01T03:00:00") ), }, filetype_info={ @@ -207,11 +207,11 @@ class TestMwsL1bNCFileHandler: def test_start_time(self, reader): """Test acquiring the start time.""" - assert reader.start_time == datetime(2000, 1, 2, 3, 4, 5) + assert reader.start_time == dt.datetime(2000, 1, 2, 3, 4, 5) def test_end_time(self, reader): """Test acquiring the end time.""" - assert reader.end_time == datetime(2000, 1, 2, 4, 5, 6) + assert reader.end_time == dt.datetime(2000, 1, 2, 4, 5, 6) def test_sensor(self, reader): """Test sensor.""" @@ -356,12 +356,12 @@ def test_get_global_attributes(self, reader): attributes = reader._get_global_attributes() assert attributes == { "filename": reader.filename, - "start_time": datetime(2000, 1, 2, 3, 4, 5), - "end_time": datetime(2000, 1, 2, 4, 5, 6), + "start_time": dt.datetime(2000, 1, 2, 3, 4, 5), + "end_time": dt.datetime(2000, 1, 2, 4, 5, 6), "spacecraft_name": "Metop-SG-A1", "sensor": "MWS", - "filename_start_time": datetime(2000, 1, 1, 1, 0), - "filename_end_time": datetime(2000, 1, 1, 2, 0), + "filename_start_time": dt.datetime(2000, 1, 1, 1, 0), + "filename_end_time": dt.datetime(2000, 1, 1, 2, 0), "platform_name": "Metop-SG-A1", "quality_group": { "duration_of_product": np.array(5944., dtype=np.float32), diff --git a/satpy/tests/reader_tests/test_oceancolorcci_l3_nc.py b/satpy/tests/reader_tests/test_oceancolorcci_l3_nc.py index 90b9d4432f..0293a88fe3 100644 --- a/satpy/tests/reader_tests/test_oceancolorcci_l3_nc.py +++ b/satpy/tests/reader_tests/test_oceancolorcci_l3_nc.py @@ -16,10 +16,11 @@ # # You should have received a copy of the GNU General Public License along with # Satpy. If not, see . + """Module for testing the satpy.readers.oceancolorcci_l3_nc module.""" +import datetime as dt import os -from datetime import datetime import numpy as np import pytest @@ -243,12 +244,12 @@ def test_get_dataset_5d_allprods(self, fake_dataset, fake_file_dict): def test_start_time(self, fake_file_dict): """Test start time property.""" reader = self._create_reader_for_resolutions([fake_file_dict["k490_1d"]]) - assert reader.start_time == datetime(2021, 8, 1, 0, 0, 0) + assert reader.start_time == dt.datetime(2021, 8, 1, 0, 0, 0) def test_end_time(self, fake_file_dict): """Test end time property.""" reader = self._create_reader_for_resolutions([fake_file_dict["iop_8d"]]) - assert reader.end_time == datetime(2021, 8, 31, 23, 59, 0) + assert reader.end_time == dt.datetime(2021, 8, 31, 23, 59, 0) def test_correct_dimnames(self, fake_file_dict): """Check that the loaded dimension names are correct.""" diff --git a/satpy/tests/reader_tests/test_osisaf_l3.py b/satpy/tests/reader_tests/test_osisaf_l3.py index 80fb581db7..106687a509 100644 --- a/satpy/tests/reader_tests/test_osisaf_l3.py +++ b/satpy/tests/reader_tests/test_osisaf_l3.py @@ -15,8 +15,8 @@ # satpy. If not, see . """Module for testing the satpy.readers.osisaf_l3 module.""" +import datetime as dt import os -from datetime import datetime import numpy as np import pytest @@ -206,8 +206,8 @@ def setup_method(self): super().setup_method(tester="ice") self.filename_info = {"grid": "ease"} self.filetype_info = {"file_type": "osi_sea_ice_conc"} - self.good_start_time = datetime(2022, 12, 15, 0, 0, 0) - self.good_stop_time = datetime(2022, 12, 16, 0, 0, 0) + self.good_start_time = dt.datetime(2022, 12, 15, 0, 0, 0) + self.good_stop_time = dt.datetime(2022, 12, 16, 0, 0, 0) self.varname = "ice_conc" self.stdname = "sea_ice_area_fraction" self.fillv = -999 @@ -260,8 +260,8 @@ def setup_method(self): super().setup_method(tester="flux_stere") self.filename_info = {"grid": "polstere"} self.filetype_info = {"file_type": "osi_radflux_stere"} - self.good_start_time = datetime(2023, 10, 10, 0, 0, 0) - self.good_stop_time = datetime(2023, 10, 10, 23, 59, 59) + self.good_start_time = dt.datetime(2023, 10, 10, 0, 0, 0) + self.good_stop_time = dt.datetime(2023, 10, 10, 23, 59, 59) self.varname = "ssi" self.stdname = "surface_downwelling_shortwave_flux_in_air" self.fillv = -999.99 @@ -295,8 +295,8 @@ def setup_method(self): super().setup_method(tester="flux_geo") self.filename_info = {} self.filetype_info = {"file_type": "osi_radflux_grid"} - self.good_start_time = datetime(2022, 12, 28, 18, 30, 0) - self.good_stop_time = datetime(2022, 12, 28, 19, 30, 0) + self.good_start_time = dt.datetime(2022, 12, 28, 18, 30, 0) + self.good_stop_time = dt.datetime(2022, 12, 28, 19, 30, 0) self.varname = "ssi" self.stdname = "surface_downwelling_shortwave_flux_in_air" self.fillv = -32768 @@ -332,8 +332,8 @@ def setup_method(self): super().setup_method(tester="sst") self.filename_info = {} self.filetype_info = {"file_type": "osi_sst"} - self.good_start_time = datetime(2022, 12, 15, 0, 0, 0) - self.good_stop_time = datetime(2022, 12, 16, 0, 0, 0) + self.good_start_time = dt.datetime(2022, 12, 15, 0, 0, 0) + self.good_stop_time = dt.datetime(2022, 12, 16, 0, 0, 0) self.varname = "surface_temperature" self.stdname = "sea_ice_surface_temperature" self.fillv = -32768 diff --git a/satpy/tests/reader_tests/test_satpy_cf_nc.py b/satpy/tests/reader_tests/test_satpy_cf_nc.py index f94ae55cc0..fb4fd6831b 100644 --- a/satpy/tests/reader_tests/test_satpy_cf_nc.py +++ b/satpy/tests/reader_tests/test_satpy_cf_nc.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Tests for the CF reader.""" + +import datetime as dt import warnings -from datetime import datetime import numpy as np import pytest @@ -66,8 +68,8 @@ def _create_test_netcdf(filename, resolution=742): "solar_zenith_angle": solar_zenith_angle_i } - tstart = datetime(2019, 4, 1, 12, 0) - tend = datetime(2019, 4, 1, 12, 15) + tstart = dt.datetime(2019, 4, 1, 12, 0) + tend = dt.datetime(2019, 4, 1, 12, 15) common_attrs = { "start_time": tstart, "end_time": tend, @@ -107,12 +109,12 @@ def area(): def common_attrs(area): """Get common dataset attributes.""" return { - "start_time": datetime(2019, 4, 1, 12, 0, 0, 123456), - "end_time": datetime(2019, 4, 1, 12, 15), + "start_time": dt.datetime(2019, 4, 1, 12, 0, 0, 123456), + "end_time": dt.datetime(2019, 4, 1, 12, 15), "platform_name": "tirosn", "orbit_number": 99999, "area": area, - "my_timestamp": datetime(2000, 1, 1) + "my_timestamp": dt.datetime(2000, 1, 1) } @@ -263,7 +265,7 @@ def cf_scene(datasets, common_attrs): @pytest.fixture() def nc_filename(tmp_path): """Create an nc filename for viirs m band.""" - now = datetime.utcnow() + now = dt.datetime.utcnow() filename = f"testingcfwriter{now:%Y%j%H%M%S}-viirs-mband-20201007075915-20201007080744.nc" return str(tmp_path / filename) @@ -271,7 +273,7 @@ def nc_filename(tmp_path): @pytest.fixture() def nc_filename_i(tmp_path): """Create an nc filename for viirs i band.""" - now = datetime.utcnow() + now = dt.datetime.utcnow() filename = f"testingcfwriter{now:%Y%j%H%M%S}-viirs-iband-20201007075915-20201007080744.nc" return str(tmp_path / filename) diff --git a/satpy/tests/reader_tests/test_scmi.py b/satpy/tests/reader_tests/test_scmi.py index 13c74a7d5c..12fbb7dc2a 100644 --- a/satpy/tests/reader_tests/test_scmi.py +++ b/satpy/tests/reader_tests/test_scmi.py @@ -103,11 +103,11 @@ def setUp(self, xr_): def test_basic_attributes(self): """Test getting basic file attributes.""" - from datetime import datetime + import datetime as dt from satpy.tests.utils import make_dataid - assert self.reader.start_time == datetime(2017, 7, 29, 12, 0, 0, 0) - assert self.reader.end_time == datetime(2017, 7, 29, 12, 0, 0, 0) + assert self.reader.start_time == dt.datetime(2017, 7, 29, 12, 0, 0, 0) + assert self.reader.end_time == dt.datetime(2017, 7, 29, 12, 0, 0, 0) assert self.reader.get_shape(make_dataid(name="C05"), {}) == (2, 5) def test_data_load(self): diff --git a/satpy/tests/reader_tests/test_seviri_base.py b/satpy/tests/reader_tests/test_seviri_base.py index a07bb799bc..f705796521 100644 --- a/satpy/tests/reader_tests/test_seviri_base.py +++ b/satpy/tests/reader_tests/test_seviri_base.py @@ -17,8 +17,8 @@ # satpy. If not, see . """Test the MSG common (native and hrit format) functionionalities.""" +import datetime as dt import unittest -from datetime import datetime, timedelta import dask.array as da import numpy as np @@ -117,18 +117,18 @@ def test_pad_data_vertically_bad_shape(self): def observation_start_time(self): """Get scan start timestamp for testing.""" - return datetime(2023, 3, 20, 15, 0, 10, 691000) + return dt.datetime(2023, 3, 20, 15, 0, 10, 691000) def observation_end_time(self): """Get scan end timestamp for testing.""" - return datetime(2023, 3, 20, 15, 12, 43, 843000) + return dt.datetime(2023, 3, 20, 15, 12, 43, 843000) def test_round_nom_time(self): """Test the rouding of start/end_time.""" - assert round_nom_time(dt=self.observation_start_time(), - time_delta=timedelta(minutes=15)) == datetime(2023, 3, 20, 15, 0) - assert round_nom_time(dt=self.observation_end_time(), - time_delta=timedelta(minutes=15)) == datetime(2023, 3, 20, 15, 15) + assert round_nom_time(date=self.observation_start_time(), + time_delta=dt.timedelta(minutes=15)) == dt.datetime(2023, 3, 20, 15, 0) + assert round_nom_time(date=self.observation_end_time(), + time_delta=dt.timedelta(minutes=15)) == dt.datetime(2023, 3, 20, 15, 15) @staticmethod def test_pad_data_horizontally(): @@ -177,13 +177,13 @@ def test_get_padding_area_int(): ORBIT_POLYNOMIALS = { "StartTime": np.array([ [ - datetime(2006, 1, 1, 6), datetime(2006, 1, 1, 12), - datetime(2006, 1, 1, 18), datetime(1958, 1, 1, 0)] + dt.datetime(2006, 1, 1, 6), dt.datetime(2006, 1, 1, 12), + dt.datetime(2006, 1, 1, 18), dt.datetime(1958, 1, 1, 0)] ]), "EndTime": np.array([ [ - datetime(2006, 1, 1, 12), datetime(2006, 1, 1, 18), - datetime(2006, 1, 2, 0), datetime(1958, 1, 1, 0) + dt.datetime(2006, 1, 1, 12), dt.datetime(2006, 1, 1, 18), + dt.datetime(2006, 1, 2, 0), dt.datetime(1958, 1, 1, 0) ] ]), "X": [np.zeros(8), @@ -212,18 +212,18 @@ def test_get_padding_area_int(): # 01-03: Overlap (10:00 - 13:00) "StartTime": np.array([ [ - datetime(2005, 12, 31, 10), datetime(2005, 12, 31, 12), - datetime(2006, 1, 1, 10), datetime(2006, 1, 1, 13), - datetime(2006, 1, 2, 0), datetime(2006, 1, 2, 18), - datetime(2006, 1, 3, 6), datetime(2006, 1, 3, 10), + dt.datetime(2005, 12, 31, 10), dt.datetime(2005, 12, 31, 12), + dt.datetime(2006, 1, 1, 10), dt.datetime(2006, 1, 1, 13), + dt.datetime(2006, 1, 2, 0), dt.datetime(2006, 1, 2, 18), + dt.datetime(2006, 1, 3, 6), dt.datetime(2006, 1, 3, 10), ] ]), "EndTime": np.array([ [ - datetime(2005, 12, 31, 12), datetime(2005, 12, 31, 18), - datetime(2006, 1, 1, 12), datetime(2006, 1, 1, 18), - datetime(2006, 1, 2, 4), datetime(2006, 1, 2, 22), - datetime(2006, 1, 3, 13), datetime(2006, 1, 3, 18), + dt.datetime(2005, 12, 31, 12), dt.datetime(2005, 12, 31, 18), + dt.datetime(2006, 1, 1, 12), dt.datetime(2006, 1, 1, 18), + dt.datetime(2006, 1, 2, 4), dt.datetime(2006, 1, 2, 22), + dt.datetime(2006, 1, 3, 13), dt.datetime(2006, 1, 3, 18), ] ]), "X": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0], @@ -233,12 +233,12 @@ def test_get_padding_area_int(): ORBIT_POLYNOMIALS_INVALID = { "StartTime": np.array([ [ - datetime(1958, 1, 1), datetime(1958, 1, 1) + dt.datetime(1958, 1, 1), dt.datetime(1958, 1, 1) ] ]), "EndTime": np.array([ [ - datetime(1958, 1, 1), datetime(1958, 1, 1) + dt.datetime(1958, 1, 1), dt.datetime(1958, 1, 1) ] ]), "X": [1, 2], @@ -254,8 +254,8 @@ class TestSatellitePosition: def orbit_polynomial(self): """Get an orbit polynomial for testing.""" return OrbitPolynomial( - start_time=datetime(2006, 1, 1, 12), - end_time=datetime(2006, 1, 1, 18), + start_time=dt.datetime(2006, 1, 1, 12), + end_time=dt.datetime(2006, 1, 1, 18), coefs=( np.array([8.41607082e+04, 2.94319260e+00, 9.86748617e-01, -2.70135453e-01, -3.84364650e-02, 8.48718433e-03, @@ -272,7 +272,7 @@ def orbit_polynomial(self): @pytest.fixture() def time(self): """Get scan timestamp for testing.""" - return datetime(2006, 1, 1, 12, 15, 9, 304888) + return dt.datetime(2006, 1, 1, 12, 15, 9, 304888) def test_eval_polynomial(self, orbit_polynomial, time): """Test getting the position in cartesian coordinates.""" @@ -305,7 +305,7 @@ class TestOrbitPolynomialFinder: # Contiguous validity intervals (that's the norm) ( ORBIT_POLYNOMIALS_SYNTH, - datetime(2005, 12, 31, 12, 15), + dt.datetime(2005, 12, 31, 12, 15), OrbitPolynomial( coefs=(2.0, 2.1, 2.2), start_time=np.datetime64("2005-12-31 12:00"), @@ -316,7 +316,7 @@ class TestOrbitPolynomialFinder: # not too far away ( ORBIT_POLYNOMIALS_SYNTH, - datetime(2006, 1, 1, 12, 15), + dt.datetime(2006, 1, 1, 12, 15), OrbitPolynomial( coefs=(3.0, 3.1, 3.2), start_time=np.datetime64("2006-01-01 10:00"), @@ -326,7 +326,7 @@ class TestOrbitPolynomialFinder: # Overlapping intervals ( ORBIT_POLYNOMIALS_SYNTH, - datetime(2006, 1, 3, 12, 15), + dt.datetime(2006, 1, 3, 12, 15), OrbitPolynomial( coefs=(8.0, 8.1, 8.2), start_time=np.datetime64("2006-01-03 10:00"), @@ -351,9 +351,9 @@ def test_get_orbit_polynomial(self, orbit_polynomials, time, [ # No interval enclosing the given timestamp and closest interval # too far away - (ORBIT_POLYNOMIALS_SYNTH, datetime(2006, 1, 2, 12, 15)), + (ORBIT_POLYNOMIALS_SYNTH, dt.datetime(2006, 1, 2, 12, 15)), # No valid polynomials at all - (ORBIT_POLYNOMIALS_INVALID, datetime(2006, 1, 1, 12, 15)) + (ORBIT_POLYNOMIALS_INVALID, dt.datetime(2006, 1, 1, 12, 15)) ] ) def test_get_orbit_polynomial_exceptions(self, orbit_polynomials, time): @@ -378,14 +378,14 @@ def test_get_meirink_slope_epoch(self, platform_id, channel_name): assert calibration_handler.get_gain_offset()[0] == MEIRINK_COEFS["2023"][platform_id][channel_name][0]/1000. @pytest.mark.parametrize(("platform_id", "time", "expected"), [ - (321, datetime(2005, 1, 18, 0, 0), [0.0250354716, 0.0315626684, 0.022880986]), - (321, datetime(2010, 12, 31, 0, 0), [0.0258479563, 0.0322386887, 0.022895110500000003]), - (322, datetime(2010, 1, 18, 0, 0), [0.021964051999999998, 0.027548445, 0.021576766]), - (322, datetime(2015, 6, 1, 0, 0), [0.022465028, 0.027908105, 0.021674373999999996]), - (323, datetime(2005, 1, 18, 0, 0), [0.0209088464, 0.0265355228, 0.0230132616]), - (323, datetime(2010, 12, 31, 0, 0), [0.022181355200000002, 0.0280103379, 0.0229511138]), - (324, datetime(2010, 1, 18, 0, 0), [0.0218362, 0.027580748, 0.022285370999999998]), - (324, datetime(2015, 6, 1, 0, 0), [0.0225418, 0.028530172, 0.022248718999999997]), + (321, dt.datetime(2005, 1, 18, 0, 0), [0.0250354716, 0.0315626684, 0.022880986]), + (321, dt.datetime(2010, 12, 31, 0, 0), [0.0258479563, 0.0322386887, 0.022895110500000003]), + (322, dt.datetime(2010, 1, 18, 0, 0), [0.021964051999999998, 0.027548445, 0.021576766]), + (322, dt.datetime(2015, 6, 1, 0, 0), [0.022465028, 0.027908105, 0.021674373999999996]), + (323, dt.datetime(2005, 1, 18, 0, 0), [0.0209088464, 0.0265355228, 0.0230132616]), + (323, dt.datetime(2010, 12, 31, 0, 0), [0.022181355200000002, 0.0280103379, 0.0229511138]), + (324, dt.datetime(2010, 1, 18, 0, 0), [0.0218362, 0.027580748, 0.022285370999999998]), + (324, dt.datetime(2015, 6, 1, 0, 0), [0.0225418, 0.028530172, 0.022248718999999997]), ]) def test_get_meirink_slope_2020(self, platform_id, time, expected): """Test the value of the slope of the Meirink calibration.""" diff --git a/satpy/tests/reader_tests/test_seviri_l1b_calibration.py b/satpy/tests/reader_tests/test_seviri_l1b_calibration.py index e6c2cdcf16..8eaf2b83da 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_calibration.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_calibration.py @@ -17,8 +17,8 @@ # satpy. If not, see . """Unittesting the native msg reader.""" +import datetime as dt import unittest -from datetime import datetime import numpy as np import pytest @@ -110,7 +110,7 @@ def setUp(self): """Set up the SEVIRI Calibration algorithm for testing.""" self.algo = SEVIRICalibrationAlgorithm( platform_id=PLATFORM_ID, - scan_time=datetime(2020, 8, 15, 13, 0, 40) + scan_time=dt.datetime(2020, 8, 15, 13, 0, 40) ) def test_convert_to_radiance(self): @@ -212,7 +212,7 @@ class TestFileHandlerCalibrationBase: gains_gsics = [0, 0, 0, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 0] offsets_gsics = [0, 0, 0, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9, -1.0, -1.1, 0] radiance_types = 2 * np.ones(12) - scan_time = datetime(2020, 1, 1) + scan_time = dt.datetime(2020, 1, 1) external_coefs = { "VIS006": {"gain": 10, "offset": -10}, "IR_108": {"gain": 20, "offset": -20}, diff --git a/satpy/tests/reader_tests/test_seviri_l1b_hrit.py b/satpy/tests/reader_tests/test_seviri_l1b_hrit.py index 3fe00edc80..1d0313621c 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_hrit.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_hrit.py @@ -15,10 +15,11 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """The HRIT msg reader tests package.""" +import datetime as dt import unittest -from datetime import datetime from unittest import mock import numpy as np @@ -47,7 +48,7 @@ class TestHRITMSGFileHandlerHRV(TestHRITMSGBase): def setUp(self): """Set up the hrit file handler for testing HRV.""" - self.observation_start_time = datetime(2006, 1, 1, 12, 15, 9, 304888) + self.observation_start_time = dt.datetime(2006, 1, 1, 12, 15, 9, 304888) self.nlines = 464 self.reader = setup.get_fake_file_handler( observation_start_time=self.observation_start_time, @@ -139,7 +140,7 @@ class TestHRITMSGFileHandler(TestHRITMSGBase): def setUp(self): """Set up the hrit file handler for testing.""" - self.observation_start_time = datetime(2006, 1, 1, 12, 15, 9, 304888) + self.observation_start_time = dt.datetime(2006, 1, 1, 12, 15, 9, 304888) self.nlines = 464 self.ncols = 3712 self.projection_longitude = 9.5 @@ -214,13 +215,13 @@ def test_get_dataset(self, calibrate, parent_get_dataset): setup.get_attrs_exp(self.projection_longitude) ) # testing start/end time - assert datetime(2006, 1, 1, 12, 15, 9, 304888) == self.reader.observation_start_time - assert datetime(2006, 1, 1, 12, 15) == self.reader.start_time + assert dt.datetime(2006, 1, 1, 12, 15, 9, 304888) == self.reader.observation_start_time + assert dt.datetime(2006, 1, 1, 12, 15) == self.reader.start_time assert self.reader.start_time == self.reader.nominal_start_time - assert datetime(2006, 1, 1, 12, 27, 39) == self.reader.observation_end_time + assert dt.datetime(2006, 1, 1, 12, 27, 39) == self.reader.observation_end_time assert self.reader.end_time == self.reader.nominal_end_time - assert datetime(2006, 1, 1, 12, 30) == self.reader.end_time + assert dt.datetime(2006, 1, 1, 12, 30) == self.reader.end_time # test repeat cycle duration assert 15 == self.reader._repeat_cycle_duration # Change the reducescan scenario to test the repeat cycle duration handling @@ -292,7 +293,7 @@ class TestHRITMSGPrologueFileHandler(unittest.TestCase): def setUp(self, *mocks): """Set up the test case.""" fh = setup.get_fake_file_handler( - observation_start_time=datetime(2016, 3, 3, 0, 0), + observation_start_time=dt.datetime(2016, 3, 3, 0, 0), nlines=464, ncols=3712, ) diff --git a/satpy/tests/reader_tests/test_seviri_l1b_hrit_setup.py b/satpy/tests/reader_tests/test_seviri_l1b_hrit_setup.py index d668fe5240..21c42c0281 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_hrit_setup.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_hrit_setup.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Setup for SEVIRI HRIT reader tests.""" -from datetime import datetime +import datetime as dt from unittest import mock import numpy as np @@ -126,8 +127,8 @@ def get_fake_prologue(projection_longitude, orbit_polynomials): }, "ImageAcquisition": { "PlannedAcquisitionTime": { - "TrueRepeatCycleStart": datetime(2006, 1, 1, 12, 15, 9, 304888), - "PlannedRepeatCycleEnd": datetime(2006, 1, 1, 12, 30, 0, 0) + "TrueRepeatCycleStart": dt.datetime(2006, 1, 1, 12, 15, 9, 304888), + "PlannedRepeatCycleEnd": dt.datetime(2006, 1, 1, 12, 30, 0, 0) } } } @@ -149,8 +150,8 @@ def get_fake_epilogue(): }, "ActualScanningSummary": { "ReducedScan": 0, - "ForwardScanStart": datetime(2006, 1, 1, 12, 15, 9, 304888), - "ForwardScanEnd": datetime(2006, 1, 1, 12, 27, 39, 0) + "ForwardScanStart": dt.datetime(2006, 1, 1, 12, 15, 9, 304888), + "ForwardScanEnd": dt.datetime(2006, 1, 1, 12, 27, 39, 0) } } } @@ -198,7 +199,7 @@ def get_fake_dataset_info(): def get_acq_time_cds(start_time, nlines): """Get fake scanline acquisition times.""" - days_since_1958 = (start_time - datetime(1958, 1, 1)).days + days_since_1958 = (start_time - dt.datetime(1958, 1, 1)).days tline = np.zeros( nlines, dtype=[("days", ">u2"), ("milliseconds", ">u4")] @@ -238,12 +239,12 @@ def get_attrs_exp(projection_longitude=0.0): "satellite_actual_latitude": -0.5711243456528018, "satellite_actual_altitude": 35783296.150123544}, "georef_offset_corrected": True, - "nominal_start_time": datetime(2006, 1, 1, 12, 15), - "nominal_end_time": datetime(2006, 1, 1, 12, 30), + "nominal_start_time": dt.datetime(2006, 1, 1, 12, 15), + "nominal_end_time": dt.datetime(2006, 1, 1, 12, 30), "time_parameters": { - "nominal_start_time": datetime(2006, 1, 1, 12, 15), - "nominal_end_time": datetime(2006, 1, 1, 12, 30), - "observation_start_time": datetime(2006, 1, 1, 12, 15, 9, 304888), - "observation_end_time": datetime(2006, 1, 1, 12, 27, 39, 0) + "nominal_start_time": dt.datetime(2006, 1, 1, 12, 15), + "nominal_end_time": dt.datetime(2006, 1, 1, 12, 30), + "observation_start_time": dt.datetime(2006, 1, 1, 12, 15, 9, 304888), + "observation_end_time": dt.datetime(2006, 1, 1, 12, 27, 39, 0) } } diff --git a/satpy/tests/reader_tests/test_seviri_l1b_icare.py b/satpy/tests/reader_tests/test_seviri_l1b_icare.py index 7c32001168..cb8a1fb6af 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_icare.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_icare.py @@ -124,7 +124,7 @@ def test_init(self): def test_load_dataset_vis(self): """Test loading all datasets from a full swath file.""" - from datetime import datetime + import datetime as dt r = load_reader(self.reader_configs) loadables = r.select_files_from_pathnames([ "GEO_L1B-MSG1_2004-12-29T12-15-00_G_VIS08_V1-04.hdf" @@ -133,7 +133,7 @@ def test_load_dataset_vis(self): datasets = r.load(["VIS008"]) assert len(datasets) == 1 for v in datasets.values(): - dt = datetime(2004, 12, 29, 12, 27, 44) + dt = dt.datetime(2004, 12, 29, 12, 27, 44) assert v.attrs["end_time"] == dt assert v.attrs["calibration"] == "reflectance" diff --git a/satpy/tests/reader_tests/test_seviri_l1b_native.py b/satpy/tests/reader_tests/test_seviri_l1b_native.py index 6382517b55..8f4e46e2fb 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_native.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_native.py @@ -19,10 +19,10 @@ from __future__ import annotations +import datetime as dt import os import unittest import warnings -from datetime import datetime from unittest import mock import dask.array as da @@ -889,8 +889,8 @@ def file_handler(self): "15TRAILER": { "ImageProductionStats": { "ActualScanningSummary": { - "ForwardScanStart": datetime(2006, 1, 1, 12, 15, 9, 304888), - "ForwardScanEnd": datetime(2006, 1, 1, 12, 27, 9, 304888), + "ForwardScanStart": dt.datetime(2006, 1, 1, 12, 15, 9, 304888), + "ForwardScanEnd": dt.datetime(2006, 1, 1, 12, 27, 9, 304888), "ReducedScan": 0 } } @@ -941,8 +941,8 @@ def _fake_header(): }, "ImageAcquisition": { "PlannedAcquisitionTime": { - "TrueRepeatCycleStart": datetime(2006, 1, 1, 12, 15, 0, 0), - "PlannedRepeatCycleEnd": datetime(2006, 1, 1, 12, 30, 0, 0), + "TrueRepeatCycleStart": dt.datetime(2006, 1, 1, 12, 15, 0, 0), + "PlannedRepeatCycleEnd": dt.datetime(2006, 1, 1, 12, 30, 0, 0), } } }, @@ -993,19 +993,19 @@ def test_get_dataset(self, file_handler): expected = self._exp_data_array() xr.testing.assert_equal(xarr, expected) assert "raw_metadata" not in xarr.attrs - assert file_handler.start_time == datetime(2006, 1, 1, 12, 15, 0) - assert file_handler.end_time == datetime(2006, 1, 1, 12, 30, 0) + assert file_handler.start_time == dt.datetime(2006, 1, 1, 12, 15, 0) + assert file_handler.end_time == dt.datetime(2006, 1, 1, 12, 30, 0) assert_attrs_equal(xarr.attrs, expected.attrs, tolerance=1e-4) def test_time(self, file_handler): """Test start/end nominal/observation time handling.""" - assert datetime(2006, 1, 1, 12, 15, 9, 304888) == file_handler.observation_start_time - assert datetime(2006, 1, 1, 12, 15,) == file_handler.start_time + assert dt.datetime(2006, 1, 1, 12, 15, 9, 304888) == file_handler.observation_start_time + assert dt.datetime(2006, 1, 1, 12, 15,) == file_handler.start_time assert file_handler.start_time == file_handler.nominal_start_time - assert datetime(2006, 1, 1, 12, 27, 9, 304888) == file_handler.observation_end_time + assert dt.datetime(2006, 1, 1, 12, 27, 9, 304888) == file_handler.observation_end_time assert file_handler.end_time == file_handler.nominal_end_time - assert datetime(2006, 1, 1, 12, 30,) == file_handler.end_time + assert dt.datetime(2006, 1, 1, 12, 30,) == file_handler.end_time def test_repeat_cycle_duration(self, file_handler): """Test repeat cycle handling for FD or ReduscedScan.""" @@ -1035,10 +1035,10 @@ def _exp_data_array(): "projection_altitude": 35785831.0 }, "time_parameters": { - "nominal_start_time": datetime(2006, 1, 1, 12, 15, 0), - "nominal_end_time": datetime(2006, 1, 1, 12, 30, 0), - "observation_start_time": datetime(2006, 1, 1, 12, 15, 9, 304888), - "observation_end_time": datetime(2006, 1, 1, 12, 27, 9, 304888), + "nominal_start_time": dt.datetime(2006, 1, 1, 12, 15, 0), + "nominal_end_time": dt.datetime(2006, 1, 1, 12, 30, 0), + "observation_start_time": dt.datetime(2006, 1, 1, 12, 15, 9, 304888), + "observation_end_time": dt.datetime(2006, 1, 1, 12, 27, 9, 304888), }, "georef_offset_corrected": True, "platform_name": "MSG-3", diff --git a/satpy/tests/reader_tests/test_seviri_l1b_nc.py b/satpy/tests/reader_tests/test_seviri_l1b_nc.py index cd5e2c713f..d77933b9a0 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_nc.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_nc.py @@ -17,7 +17,7 @@ # satpy. If not, see . """The HRIT msg reader tests package.""" -from datetime import datetime +import datetime as dt from unittest import mock import numpy as np @@ -34,7 +34,7 @@ def to_cds_time(time): """Convert datetime to (days, msecs) since 1958-01-01.""" - if isinstance(time, datetime): + if isinstance(time, dt.datetime): time = np.datetime64(time) t0 = np.datetime64("1958-01-01 00:00") delta = time - t0 @@ -62,13 +62,13 @@ def _get_fake_dataset(self, counts, h5netcdf): line_validity = np.repeat([3, 3], 11).reshape(2, 11) line_geom_radio_quality = np.repeat([4, 4], 11).reshape(2, 11) orbit_poly_start_day, orbit_poly_start_msec = to_cds_time( - np.array([datetime(2019, 12, 31, 18), - datetime(2019, 12, 31, 22)], + np.array([dt.datetime(2019, 12, 31, 18), + dt.datetime(2019, 12, 31, 22)], dtype="datetime64") ) orbit_poly_end_day, orbit_poly_end_msec = to_cds_time( - np.array([datetime(2019, 12, 31, 22), - datetime(2020, 1, 1, 2)], + np.array([dt.datetime(2019, 12, 31, 22), + dt.datetime(2020, 1, 1, 2)], dtype="datetime64") ) counts = counts.rename({ @@ -325,10 +325,10 @@ def test_get_dataset(self, file_handler, channel, calibration, mask_bad_quality_ "projection_altitude": 35785831.0 }, "time_parameters": { - "nominal_start_time": datetime(2020, 1, 1, 0, 0), - "nominal_end_time": datetime(2020, 1, 1, 0, 0), - "observation_start_time": datetime(2020, 1, 1, 0, 0), - "observation_end_time": datetime(2020, 1, 1, 0, 0), + "nominal_start_time": dt.datetime(2020, 1, 1, 0, 0), + "nominal_end_time": dt.datetime(2020, 1, 1, 0, 0), + "observation_start_time": dt.datetime(2020, 1, 1, 0, 0), + "observation_end_time": dt.datetime(2020, 1, 1, 0, 0), }, "georef_offset_corrected": True, "platform_name": "Meteosat-11", @@ -352,13 +352,13 @@ def test_get_dataset(self, file_handler, channel, calibration, mask_bad_quality_ def test_time(self, file_handler): """Test start/end nominal/observation time handling.""" - assert datetime(2020, 1, 1, 0, 0) == file_handler.observation_start_time - assert datetime(2020, 1, 1, 0, 0) == file_handler.start_time + assert dt.datetime(2020, 1, 1, 0, 0) == file_handler.observation_start_time + assert dt.datetime(2020, 1, 1, 0, 0) == file_handler.start_time assert file_handler.start_time == file_handler.nominal_start_time - assert datetime(2020, 1, 1, 0, 0) == file_handler.observation_end_time + assert dt.datetime(2020, 1, 1, 0, 0) == file_handler.observation_end_time assert file_handler.end_time == file_handler.nominal_end_time - assert datetime(2020, 1, 1, 0, 0) == file_handler.end_time + assert dt.datetime(2020, 1, 1, 0, 0) == file_handler.end_time def test_repeat_cycle_duration(self, file_handler): """Test repeat cycle handling for FD or ReduscedScan.""" diff --git a/satpy/tests/reader_tests/test_seviri_l2_bufr.py b/satpy/tests/reader_tests/test_seviri_l2_bufr.py index ec3fdf7b56..9a6e6e6f83 100644 --- a/satpy/tests/reader_tests/test_seviri_l2_bufr.py +++ b/satpy/tests/reader_tests/test_seviri_l2_bufr.py @@ -17,9 +17,9 @@ # satpy. If not, see . """Unittesting the SEVIRI L2 BUFR reader.""" +import datetime as dt import sys import unittest -from datetime import datetime from unittest import mock import dask.array as da @@ -37,7 +37,7 @@ "spacecraft": "MSG2", "server": "TESTSERVER"} MPEF_PRODUCT_HEADER = { - "NominalTime": datetime(2019, 11, 6, 18, 0), + "NominalTime": dt.datetime(2019, 11, 6, 18, 0), "SpacecraftName": "09", "RectificationLongitude": "E0455" } diff --git a/satpy/tests/reader_tests/test_sgli_l1b.py b/satpy/tests/reader_tests/test_sgli_l1b.py index 7f5fffa70c..db09e04edb 100644 --- a/satpy/tests/reader_tests/test_sgli_l1b.py +++ b/satpy/tests/reader_tests/test_sgli_l1b.py @@ -1,6 +1,7 @@ """Tests for the SGLI L1B backend.""" + +import datetime as dt import sys -from datetime import datetime, timedelta import dask import h5py @@ -9,8 +10,8 @@ from satpy.readers.sgli_l1b import HDF5SGLI -START_TIME = datetime.now() -END_TIME = START_TIME + timedelta(minutes=5) +START_TIME = dt.datetime.now() +END_TIME = START_TIME + dt.timedelta(minutes=5) FULL_KM_ARRAY = np.arange(1955 * 1250, dtype=np.uint16).reshape((1955, 1250)) MASK = 16383 LON_LAT_ARRAY = np.arange(197 * 126, dtype=np.float32).reshape((197, 126)) @@ -168,14 +169,14 @@ def test_start_time(sgli_vn_file): """Test that the start time is extracted.""" handler = HDF5SGLI(sgli_vn_file, {"resolution": "L"}, {}) microseconds = START_TIME.microsecond % 1000 - assert handler.start_time == START_TIME - timedelta(microseconds=microseconds) + assert handler.start_time == START_TIME - dt.timedelta(microseconds=microseconds) def test_end_time(sgli_vn_file): """Test that the end time is extracted.""" handler = HDF5SGLI(sgli_vn_file, {"resolution": "L"}, {}) microseconds = END_TIME.microsecond % 1000 - assert handler.end_time == END_TIME - timedelta(microseconds=microseconds) + assert handler.end_time == END_TIME - dt.timedelta(microseconds=microseconds) def test_get_dataset_counts(sgli_vn_file): """Test that counts can be extracted from a file.""" diff --git a/satpy/tests/reader_tests/test_slstr_l1b.py b/satpy/tests/reader_tests/test_slstr_l1b.py index b6784d4e2b..becc1455b2 100644 --- a/satpy/tests/reader_tests/test_slstr_l1b.py +++ b/satpy/tests/reader_tests/test_slstr_l1b.py @@ -15,10 +15,12 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Module for testing the satpy.readers.nc_slstr module.""" + +import datetime as dt import unittest import unittest.mock as mock -from datetime import datetime import numpy as np import pytest @@ -136,10 +138,10 @@ def test_instantiate(self, bvs_, xr_): bvs_.return_value = self.FakeSpl xr_.open_dataset.return_value = self.fake_dataset - good_start = datetime.strptime(self.start_time, - "%Y-%m-%dT%H:%M:%S.%fZ") - good_end = datetime.strptime(self.end_time, - "%Y-%m-%dT%H:%M:%S.%fZ") + good_start = dt.datetime.strptime(self.start_time, + "%Y-%m-%dT%H:%M:%S.%fZ") + good_end = dt.datetime.strptime(self.end_time, + "%Y-%m-%dT%H:%M:%S.%fZ") ds_id = make_dataid(name="foo", calibration="radiance", stripe="a", view="nadir") diff --git a/satpy/tests/reader_tests/test_smos_l2_wind.py b/satpy/tests/reader_tests/test_smos_l2_wind.py index 519030447b..409feb62ad 100644 --- a/satpy/tests/reader_tests/test_smos_l2_wind.py +++ b/satpy/tests/reader_tests/test_smos_l2_wind.py @@ -18,9 +18,9 @@ # Satpy. If not, see . """Module for testing the satpy.readers.smos_l2_wind module.""" +import datetime as dt import os import unittest -from datetime import datetime from unittest import mock import numpy as np @@ -35,8 +35,8 @@ class FakeNetCDF4FileHandlerSMOSL2WIND(FakeNetCDF4FileHandler): def get_test_content(self, filename, filename_info, filetype_info): """Mimic reader input file content.""" from xarray import DataArray - dt_s = filename_info.get("start_time", datetime(2020, 4, 22, 12, 0, 0)) - dt_e = filename_info.get("end_time", datetime(2020, 4, 22, 12, 0, 0)) + dt_s = filename_info.get("start_time", dt.datetime(2020, 4, 22, 12, 0, 0)) + dt_e = filename_info.get("end_time", dt.datetime(2020, 4, 22, 12, 0, 0)) if filetype_info["file_type"] == "smos_l2_wind": file_content = { diff --git a/satpy/tests/reader_tests/test_tropomi_l2.py b/satpy/tests/reader_tests/test_tropomi_l2.py index 7305bf365c..4bdf3f67d2 100644 --- a/satpy/tests/reader_tests/test_tropomi_l2.py +++ b/satpy/tests/reader_tests/test_tropomi_l2.py @@ -16,11 +16,12 @@ # # You should have received a copy of the GNU General Public License along with # Satpy. If not, see . + """Module for testing the satpy.readers.tropomi_l2 module.""" +import datetime as dt import os import unittest -from datetime import datetime, timedelta from unittest import mock import numpy as np @@ -41,13 +42,13 @@ class FakeNetCDF4FileHandlerTL2(FakeNetCDF4FileHandler): def get_test_content(self, filename, filename_info, filetype_info): """Mimic reader input file content.""" - dt_s = filename_info.get("start_time", datetime(2016, 1, 1, 12, 0, 0)) - dt_e = filename_info.get("end_time", datetime(2016, 1, 1, 12, 0, 0)) + dt_s = filename_info.get("start_time", dt.datetime(2016, 1, 1, 12, 0, 0)) + dt_e = filename_info.get("end_time", dt.datetime(2016, 1, 1, 12, 0, 0)) if filetype_info["file_type"] == "tropomi_l2": file_content = { - "/attr/time_coverage_start": (dt_s+timedelta(minutes=22)).strftime("%Y-%m-%dT%H:%M:%SZ"), - "/attr/time_coverage_end": (dt_e-timedelta(minutes=22)).strftime("%Y-%m-%dT%H:%M:%SZ"), + "/attr/time_coverage_start": (dt_s+dt.timedelta(minutes=22)).strftime("%Y-%m-%dT%H:%M:%SZ"), + "/attr/time_coverage_end": (dt_e-dt.timedelta(minutes=22)).strftime("%Y-%m-%dT%H:%M:%SZ"), "/attr/platform_shortname": "S5P", "/attr/sensor": "TROPOMI", } @@ -141,8 +142,8 @@ def test_load_no2(self): for d in ds.values(): assert d.attrs["platform_shortname"] == "S5P" assert d.attrs["sensor"] == "tropomi" - assert d.attrs["time_coverage_start"] == datetime(2018, 7, 9, 17, 25, 34) - assert d.attrs["time_coverage_end"] == datetime(2018, 7, 9, 18, 23, 4) + assert d.attrs["time_coverage_start"] == dt.datetime(2018, 7, 9, 17, 25, 34) + assert d.attrs["time_coverage_end"] == dt.datetime(2018, 7, 9, 18, 23, 4) assert "area" in d.attrs assert d.attrs["area"] is not None assert "y" in d.dims diff --git a/satpy/tests/reader_tests/test_utils.py b/satpy/tests/reader_tests/test_utils.py index 67bdb41374..ba43688b76 100644 --- a/satpy/tests/reader_tests/test_utils.py +++ b/satpy/tests/reader_tests/test_utils.py @@ -15,11 +15,12 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Testing of helper functions.""" +import datetime as dt import os import unittest -from datetime import datetime from unittest import mock import dask.array as da @@ -430,7 +431,7 @@ class TestSunEarthDistanceCorrection: def setup_method(self): """Create input / output arrays for the tests.""" - self.test_date = datetime(2020, 8, 15, 13, 0, 40) + self.test_date = dt.datetime(2020, 8, 15, 13, 0, 40) raw_refl = xr.DataArray(da.from_array([10., 20., 40., 1., 98., 50.]), attrs={"start_time": self.test_date, @@ -462,7 +463,7 @@ def test_get_utc_time(self): # Now check correct time is returned with utc_date passed tmp_array = self.raw_refl.copy() - new_test_date = datetime(2019, 2, 1, 15, 2, 12) + new_test_date = dt.datetime(2019, 2, 1, 15, 2, 12) utc_time = hf.get_array_date(tmp_array, new_test_date) assert utc_time == new_test_date diff --git a/satpy/tests/reader_tests/test_viirs_edr.py b/satpy/tests/reader_tests/test_viirs_edr.py index d764891760..49cf7a4885 100644 --- a/satpy/tests/reader_tests/test_viirs_edr.py +++ b/satpy/tests/reader_tests/test_viirs_edr.py @@ -21,8 +21,8 @@ """ from __future__ import annotations +import datetime as dt import shutil -from datetime import datetime, timedelta from pathlib import Path from typing import Iterable @@ -40,8 +40,8 @@ I_ROWS = 32 # one scan M_COLS = 3200 M_ROWS = 16 # one scan -START_TIME = datetime(2023, 5, 30, 17, 55, 41, 0) -END_TIME = datetime(2023, 5, 30, 17, 57, 5, 0) +START_TIME = dt.datetime(2023, 5, 30, 17, 55, 41, 0) +END_TIME = dt.datetime(2023, 5, 30, 17, 57, 5, 0) QF1_FLAG_MEANINGS = """ \tBits are listed from the MSB (bit 7) to the LSB (bit 0): \tBit Description @@ -78,7 +78,7 @@ def surface_reflectance_file(tmp_path_factory: TempPathFactory) -> Path: @pytest.fixture(scope="module") def surface_reflectance_file2(tmp_path_factory: TempPathFactory) -> Path: """Generate fake surface reflectance EDR file.""" - return _create_surface_reflectance_file(tmp_path_factory, START_TIME + timedelta(minutes=5), + return _create_surface_reflectance_file(tmp_path_factory, START_TIME + dt.timedelta(minutes=5), include_veg_indices=False) @@ -97,7 +97,7 @@ def surface_reflectance_with_veg_indices_file(tmp_path_factory: TempPathFactory) @pytest.fixture(scope="module") def surface_reflectance_with_veg_indices_file2(tmp_path_factory: TempPathFactory) -> Path: """Generate fake surface reflectance EDR file with vegetation indexes included.""" - return _create_surface_reflectance_file(tmp_path_factory, START_TIME + timedelta(minutes=5), + return _create_surface_reflectance_file(tmp_path_factory, START_TIME + dt.timedelta(minutes=5), include_veg_indices=True) @@ -110,7 +110,7 @@ def multiple_surface_reflectance_files_with_veg_indices(surface_reflectance_with def _create_surface_reflectance_file( tmp_path_factory: TempPathFactory, - start_time: datetime, + start_time: dt.datetime, include_veg_indices: bool = False, ) -> Path: fn = f"SurfRefl_v1r2_npp_s{start_time:%Y%m%d%H%M%S}0_e{END_TIME:%Y%m%d%H%M%S}0_c202305302025590.nc" diff --git a/satpy/tests/reader_tests/test_viirs_l1b.py b/satpy/tests/reader_tests/test_viirs_l1b.py index e60f83cfd0..b2a5c4b476 100644 --- a/satpy/tests/reader_tests/test_viirs_l1b.py +++ b/satpy/tests/reader_tests/test_viirs_l1b.py @@ -17,8 +17,8 @@ # satpy. If not, see . """Module for testing the satpy.readers.viirs_l1b module.""" +import datetime as dt import os -from datetime import datetime, timedelta from unittest import mock import numpy as np @@ -49,7 +49,7 @@ class FakeNetCDF4FileHandlerDay(FakeNetCDF4FileHandler): def get_test_content(self, filename, filename_info, filetype_info): """Mimic reader input file content.""" - dt = filename_info.get("start_time", datetime(2016, 1, 1, 12, 0, 0)) + date = filename_info.get("start_time", dt.datetime(2016, 1, 1, 12, 0, 0)) file_type = filename[:5].lower() num_lines = DEFAULT_FILE_SHAPE[0] num_pixels = DEFAULT_FILE_SHAPE[1] @@ -60,8 +60,8 @@ def get_test_content(self, filename, filename_info, filetype_info): "/dimension/number_of_lines": num_lines, "/dimension/number_of_pixels": num_pixels, "/dimension/number_of_LUT_values": num_luts, - "/attr/time_coverage_start": dt.strftime("%Y-%m-%dT%H:%M:%S.000Z"), - "/attr/time_coverage_end": (dt + timedelta(minutes=6)).strftime("%Y-%m-%dT%H:%M:%S.000Z"), + "/attr/time_coverage_start": date.strftime("%Y-%m-%dT%H:%M:%S.000Z"), + "/attr/time_coverage_end": (date + dt.timedelta(minutes=6)).strftime("%Y-%m-%dT%H:%M:%S.000Z"), "/attr/orbit_number": 26384, "/attr/instrument": "VIIRS", "/attr/platform": "Suomi-NPP", diff --git a/satpy/tests/reader_tests/test_viirs_l2.py b/satpy/tests/reader_tests/test_viirs_l2.py index 79884f3d4f..01801535ed 100644 --- a/satpy/tests/reader_tests/test_viirs_l2.py +++ b/satpy/tests/reader_tests/test_viirs_l2.py @@ -1,6 +1,7 @@ """Module for testing the satpy.readers.viirs_l2 module.""" + +import datetime as dt import os -from datetime import datetime, timedelta from unittest import mock import numpy as np @@ -27,7 +28,7 @@ class FakeNetCDF4FileHandlerVIIRSL2(FakeNetCDF4FileHandler): def get_test_content(self, filename, filename_info, filetype_info): """Mimic reader input file content.""" - dt = filename_info.get("start_time", datetime(2023, 12, 30, 22, 30, 0)) + date = filename_info.get("start_time", dt.datetime(2023, 12, 30, 22, 30, 0)) file_type = filename[:6] num_lines = DEFAULT_FILE_SHAPE[0] num_pixels = DEFAULT_FILE_SHAPE[1] @@ -36,8 +37,8 @@ def get_test_content(self, filename, filename_info, filetype_info): "/dimension/number_of_scans": num_scans, "/dimension/number_of_lines": num_lines, "/dimension/number_of_pixels": num_pixels, - "/attr/time_coverage_start": dt.strftime("%Y-%m-%dT%H:%M:%S.000Z"), - "/attr/time_coverage_end": (dt + timedelta(minutes=6)).strftime( + "/attr/time_coverage_start": date.strftime("%Y-%m-%dT%H:%M:%S.000Z"), + "/attr/time_coverage_end": (date + dt.timedelta(minutes=6)).strftime( "%Y-%m-%dT%H:%M:%S.000Z" ), "/attr/orbit_number": 26384, diff --git a/satpy/tests/reader_tests/test_viirs_sdr.py b/satpy/tests/reader_tests/test_viirs_sdr.py index 952224daaf..2758ceb81c 100644 --- a/satpy/tests/reader_tests/test_viirs_sdr.py +++ b/satpy/tests/reader_tests/test_viirs_sdr.py @@ -354,12 +354,12 @@ def test_init_start_time_is_nodate(self): def test_init_start_time_beyond(self): """Test basic init with start_time after the provided files.""" - from datetime import datetime + import datetime as dt from satpy.readers import load_reader r = load_reader(self.reader_configs, filter_parameters={ - "start_time": datetime(2012, 2, 26) + "start_time": dt.datetime(2012, 2, 26) }) fhs = r.create_filehandlers([ "SVI01_npp_d20120225_t1801245_e1802487_b01708_c20120226002130255476_noaa_ops.h5", @@ -368,12 +368,12 @@ def test_init_start_time_beyond(self): def test_init_end_time_beyond(self): """Test basic init with end_time before the provided files.""" - from datetime import datetime + import datetime as dt from satpy.readers import load_reader r = load_reader(self.reader_configs, filter_parameters={ - "end_time": datetime(2012, 2, 24) + "end_time": dt.datetime(2012, 2, 24) }) fhs = r.create_filehandlers([ "SVI01_npp_d20120225_t1801245_e1802487_b01708_c20120226002130255476_noaa_ops.h5", @@ -382,14 +382,14 @@ def test_init_end_time_beyond(self): def test_init_start_end_time(self): """Test basic init with end_time before the provided files.""" - from datetime import datetime + import datetime as dt from satpy.readers import load_reader r = load_reader(self.reader_configs, filter_parameters={ - "start_time": datetime(2012, 2, 24), - "end_time": datetime(2012, 2, 26) + "start_time": dt.datetime(2012, 2, 24), + "end_time": dt.datetime(2012, 2, 26) }) loadables = r.select_files_from_pathnames([ "SVI01_npp_d20120225_t1801245_e1802487_b01708_c20120226002130255476_noaa_ops.h5", diff --git a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py index ba9b83d707..b03052ea30 100644 --- a/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py +++ b/satpy/tests/reader_tests/test_viirs_vgac_l1c_nc.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with satpy. If not, see . + """The viirs_vgac_l1b_nc reader tests package. This version tests the readers for VIIIRS VGAC data preliminary version. @@ -22,7 +23,7 @@ """ -from datetime import datetime +import datetime as dt import numpy as np import pytest @@ -33,7 +34,7 @@ @pytest.fixture() def nc_filename(tmp_path): """Create an nc test data file and return its filename.""" - now = datetime.utcnow() + now = dt.datetime.utcnow() filename = f"VGAC_VJ10XMOD_A{now:%Y%j_%H%M}_n004946_K005.nc" filename_str = str(tmp_path / filename) # Create test data @@ -107,10 +108,10 @@ def test_read_vgac(self, nc_filename): assert (diff_e > np.timedelta64(-5, "us")) assert (scn_["M05"][0, 0] == 100) assert (scn_["M15"][0, 0] == 400) - assert scn_.start_time == datetime(year=2023, month=3, day=28, - hour=9, minute=8, second=7) - assert scn_.end_time == datetime(year=2023, month=3, day=28, - hour=10, minute=11, second=12) + assert scn_.start_time == dt.datetime(year=2023, month=3, day=28, + hour=9, minute=8, second=7) + assert scn_.end_time == dt.datetime(year=2023, month=3, day=28, + hour=10, minute=11, second=12) def test_dt64_to_datetime(self): """Test datetime conversion branch.""" @@ -118,8 +119,8 @@ def test_dt64_to_datetime(self): fh = VGACFileHandler(filename="", filename_info={"start_time": "2023-03-28T09:08:07"}, filetype_info="") - in_dt = datetime(year=2023, month=3, day=28, - hour=9, minute=8, second=7) + in_dt = dt.datetime(year=2023, month=3, day=28, + hour=9, minute=8, second=7) out_dt = fh.dt64_to_datetime(in_dt) assert out_dt == in_dt diff --git a/satpy/tests/scene_tests/test_conversions.py b/satpy/tests/scene_tests/test_conversions.py index 9b0dd9098e..4490903880 100644 --- a/satpy/tests/scene_tests/test_conversions.py +++ b/satpy/tests/scene_tests/test_conversions.py @@ -13,8 +13,10 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Unit tests for Scene conversion functionality.""" -from datetime import datetime + +import datetime as dt import pytest import xarray as xr @@ -61,7 +63,7 @@ def test_geoviews_basic_with_area(self): {"proj": "geos", "lon_0": -95.5, "h": 35786023.0}, 2, 2, [-200, -200, 200, 200]) scn["ds1"] = xr.DataArray(da.zeros((2, 2), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area}) gv_obj = scn.to_geoviews() # we assume that if we got something back, geoviews can use it @@ -75,7 +77,7 @@ def test_geoviews_basic_with_swath(self): lats = xr.DataArray(da.zeros((2, 2))) area = SwathDefinition(lons, lats) scn["ds1"] = xr.DataArray(da.zeros((2, 2), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area}) gv_obj = scn.to_geoviews() # we assume that if we got something back, geoviews can use it @@ -89,7 +91,7 @@ def test_hvplot_basic_with_area(self): {"proj": "geos", "lon_0": -95.5, "h": 35786023.0}, 2, 2, [-200, -200, 200, 200]) scn["ds1"] = xr.DataArray(da.zeros((2, 2), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area, "units": "m"}) hv_obj = scn.to_hvplot() # we assume that if we got something back, hvplot can use it @@ -103,13 +105,13 @@ def test_hvplot_rgb_with_area(self): {"proj": "geos", "lon_0": -95.5, "h": 35786023.0}, 2, 2, [-200, -200, 200, 200]) scn["ds1"] = xr.DataArray(da.zeros((2, 2), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area, "units": "m"}) scn["ds2"] = xr.DataArray(da.zeros((2, 2), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area, "units": "m"}) scn["ds3"] = xr.DataArray(da.zeros((2, 2), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area, "units": "m"}) hv_obj = scn.to_hvplot() # we assume that if we got something back, hvplot can use it @@ -123,7 +125,7 @@ def test_hvplot_basic_with_swath(self): latitude = xr.DataArray(da.zeros((2, 2))) area = SwathDefinition(longitude, latitude) scn["ds1"] = xr.DataArray(da.zeros((2, 2), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area, "units": "m"}) hv_obj = scn.to_hvplot() # we assume that if we got something back, hvplot can use it @@ -150,7 +152,7 @@ def single_area_scn(self): 2, 2, [-200, -200, 200, 200]) data_array = xr.DataArray(da.zeros((2, 2), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), "area": area}) + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area}) scn = Scene() scn["var1"] = data_array return scn @@ -169,10 +171,10 @@ def multi_area_scn(self): data_array1 = xr.DataArray(da.zeros((2, 2), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), "area": area1}) + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area1}) data_array2 = xr.DataArray(da.zeros((4, 4), chunks=-1), dims=("y", "x"), - attrs={"start_time": datetime(2018, 1, 1), "area": area2}) + attrs={"start_time": dt.datetime(2018, 1, 1), "area": area2}) scn = Scene() scn["var1"] = data_array1 scn["var2"] = data_array2 diff --git a/satpy/tests/scene_tests/test_saving.py b/satpy/tests/scene_tests/test_saving.py index 32c6ff61c2..b67f41cc2e 100644 --- a/satpy/tests/scene_tests/test_saving.py +++ b/satpy/tests/scene_tests/test_saving.py @@ -13,9 +13,11 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Unit tests for saving-related functionality in scene.py.""" + +import datetime as dt import os -from datetime import datetime from unittest import mock import pytest @@ -39,7 +41,7 @@ def test_save_datasets_default(self, tmp_path): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "test", - "start_time": datetime(2018, 1, 1, 0, 0, 0)} + "start_time": dt.datetime(2018, 1, 1, 0, 0, 0)} ) scn = Scene() scn["test"] = ds1 @@ -52,7 +54,7 @@ def test_save_datasets_by_ext(self, tmp_path): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "test", - "start_time": datetime(2018, 1, 1, 0, 0, 0)} + "start_time": dt.datetime(2018, 1, 1, 0, 0, 0)} ) scn = Scene() scn["test"] = ds1 @@ -70,7 +72,7 @@ def test_save_datasets_bad_writer(self, tmp_path): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "test", - "start_time": datetime.utcnow()} + "start_time": dt.datetime.utcnow()} ) scn = Scene() scn["test"] = ds1 @@ -98,7 +100,7 @@ def test_save_dataset_default(self, tmp_path): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "test", - "start_time": datetime(2018, 1, 1, 0, 0, 0)} + "start_time": dt.datetime(2018, 1, 1, 0, 0, 0)} ) scn = Scene() scn["test"] = ds1 diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index c075755d17..b8af090121 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -15,11 +15,12 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Tests for compositors in composites/__init__.py.""" +import datetime as dt import os import unittest -from datetime import datetime from unittest import mock import dask @@ -175,7 +176,7 @@ def setup_method(self): {"proj": "merc"}, 2, 2, (-2000, -2000, 2000, 2000)) attrs = {"area": area, - "start_time": datetime(2018, 1, 1, 18), + "start_time": dt.datetime(2018, 1, 1, 18), "modifiers": tuple(), "resolution": 1000, "calibration": "reflectance", @@ -347,7 +348,7 @@ def setUp(self): {"proj": "merc"}, 2, 2, (-2000, -2000, 2000, 2000)) attrs = {"area": area, - "start_time": datetime(2018, 1, 1, 18), + "start_time": dt.datetime(2018, 1, 1, 18), "modifiers": tuple(), "resolution": 1000, "name": "test_vis"} @@ -430,7 +431,7 @@ class TestDayNightCompositor(unittest.TestCase): def setUp(self): """Create test data.""" bands = ["R", "G", "B"] - start_time = datetime(2018, 1, 1, 18, 0, 0) + start_time = dt.datetime(2018, 1, 1, 18, 0, 0) # RGB a = np.zeros((3, 2, 2), dtype=np.float32) diff --git a/satpy/tests/test_dataset.py b/satpy/tests/test_dataset.py index 82b3a6c1cd..6ca3b25d72 100644 --- a/satpy/tests/test_dataset.py +++ b/satpy/tests/test_dataset.py @@ -13,10 +13,11 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Test objects and functions in the dataset module.""" +import datetime as dt import unittest -from datetime import datetime import numpy as np import pytest @@ -103,38 +104,38 @@ def setUp(self): """Set up the test case.""" # The times need to be in ascending order (oldest first) self.start_time_dts = ( - {"start_time": datetime(2018, 2, 1, 11, 58, 0)}, - {"start_time": datetime(2018, 2, 1, 11, 59, 0)}, - {"start_time": datetime(2018, 2, 1, 12, 0, 0)}, - {"start_time": datetime(2018, 2, 1, 12, 1, 0)}, - {"start_time": datetime(2018, 2, 1, 12, 2, 0)}, + {"start_time": dt.datetime(2018, 2, 1, 11, 58, 0)}, + {"start_time": dt.datetime(2018, 2, 1, 11, 59, 0)}, + {"start_time": dt.datetime(2018, 2, 1, 12, 0, 0)}, + {"start_time": dt.datetime(2018, 2, 1, 12, 1, 0)}, + {"start_time": dt.datetime(2018, 2, 1, 12, 2, 0)}, ) self.end_time_dts = ( - {"end_time": datetime(2018, 2, 1, 11, 58, 0)}, - {"end_time": datetime(2018, 2, 1, 11, 59, 0)}, - {"end_time": datetime(2018, 2, 1, 12, 0, 0)}, - {"end_time": datetime(2018, 2, 1, 12, 1, 0)}, - {"end_time": datetime(2018, 2, 1, 12, 2, 0)}, + {"end_time": dt.datetime(2018, 2, 1, 11, 58, 0)}, + {"end_time": dt.datetime(2018, 2, 1, 11, 59, 0)}, + {"end_time": dt.datetime(2018, 2, 1, 12, 0, 0)}, + {"end_time": dt.datetime(2018, 2, 1, 12, 1, 0)}, + {"end_time": dt.datetime(2018, 2, 1, 12, 2, 0)}, ) self.other_time_dts = ( - {"other_time": datetime(2018, 2, 1, 11, 58, 0)}, - {"other_time": datetime(2018, 2, 1, 11, 59, 0)}, - {"other_time": datetime(2018, 2, 1, 12, 0, 0)}, - {"other_time": datetime(2018, 2, 1, 12, 1, 0)}, - {"other_time": datetime(2018, 2, 1, 12, 2, 0)}, + {"other_time": dt.datetime(2018, 2, 1, 11, 58, 0)}, + {"other_time": dt.datetime(2018, 2, 1, 11, 59, 0)}, + {"other_time": dt.datetime(2018, 2, 1, 12, 0, 0)}, + {"other_time": dt.datetime(2018, 2, 1, 12, 1, 0)}, + {"other_time": dt.datetime(2018, 2, 1, 12, 2, 0)}, ) self.start_time_dts_with_none = ( {"start_time": None}, - {"start_time": datetime(2018, 2, 1, 11, 59, 0)}, - {"start_time": datetime(2018, 2, 1, 12, 0, 0)}, - {"start_time": datetime(2018, 2, 1, 12, 1, 0)}, - {"start_time": datetime(2018, 2, 1, 12, 2, 0)}, + {"start_time": dt.datetime(2018, 2, 1, 11, 59, 0)}, + {"start_time": dt.datetime(2018, 2, 1, 12, 0, 0)}, + {"start_time": dt.datetime(2018, 2, 1, 12, 1, 0)}, + {"start_time": dt.datetime(2018, 2, 1, 12, 2, 0)}, ) self.end_time_dts_with_none = ( - {"end_time": datetime(2018, 2, 1, 11, 58, 0)}, - {"end_time": datetime(2018, 2, 1, 11, 59, 0)}, - {"end_time": datetime(2018, 2, 1, 12, 0, 0)}, - {"end_time": datetime(2018, 2, 1, 12, 1, 0)}, + {"end_time": dt.datetime(2018, 2, 1, 11, 58, 0)}, + {"end_time": dt.datetime(2018, 2, 1, 11, 59, 0)}, + {"end_time": dt.datetime(2018, 2, 1, 12, 0, 0)}, + {"end_time": dt.datetime(2018, 2, 1, 12, 1, 0)}, {"end_time": None}, ) @@ -142,11 +143,11 @@ def test_average_datetimes(self): """Test the average_datetimes helper function.""" from satpy.dataset.metadata import average_datetimes dts = ( - datetime(2018, 2, 1, 11, 58, 0), - datetime(2018, 2, 1, 11, 59, 0), - datetime(2018, 2, 1, 12, 0, 0), - datetime(2018, 2, 1, 12, 1, 0), - datetime(2018, 2, 1, 12, 2, 0), + dt.datetime(2018, 2, 1, 11, 58, 0), + dt.datetime(2018, 2, 1, 11, 59, 0), + dt.datetime(2018, 2, 1, 12, 0, 0), + dt.datetime(2018, 2, 1, 12, 1, 0), + dt.datetime(2018, 2, 1, 12, 2, 0), ) ret = average_datetimes(dts) assert dts[2] == ret @@ -373,10 +374,10 @@ def test_combine_dicts_close(): "c": [1, 2, 3], "d": { "e": np.str_("bar"), - "f": datetime(2020, 1, 1, 12, 15, 30), + "f": dt.datetime(2020, 1, 1, 12, 15, 30), "g": np.array([1, 2, 3]), }, - "h": np.array([datetime(2020, 1, 1), datetime(2020, 1, 1)]) + "h": np.array([dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 1)]) } } attrs_close = { @@ -386,10 +387,10 @@ def test_combine_dicts_close(): "c": np.array([1, 2, 3]) + 1E-12, "d": { "e": np.str_("bar"), - "f": datetime(2020, 1, 1, 12, 15, 30), + "f": dt.datetime(2020, 1, 1, 12, 15, 30), "g": np.array([1, 2, 3]) + 1E-12 }, - "h": np.array([datetime(2020, 1, 1), datetime(2020, 1, 1)]) + "h": np.array([dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 1)]) } } test_metadata = [attrs, attrs_close] diff --git a/satpy/tests/test_file_handlers.py b/satpy/tests/test_file_handlers.py index 925da3e561..7e1424414e 100644 --- a/satpy/tests/test_file_handlers.py +++ b/satpy/tests/test_file_handlers.py @@ -15,10 +15,11 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """test file handler baseclass.""" +import datetime as dt import unittest -from datetime import datetime, timedelta from unittest import mock import numpy as np @@ -49,8 +50,8 @@ def setUp(self): """Set up the test.""" self.fh = BaseFileHandler( "filename", {"filename_info": "bla"}, "filetype_info") - self.early_time = datetime(2024, 2, 12, 11, 00) - self.late_time = datetime(2024, 2, 12, 12, 00) + self.early_time = dt.datetime(2024, 2, 12, 11, 00) + self.late_time = dt.datetime(2024, 2, 12, 12, 00) def test_combine_times(self): """Combine times.""" @@ -161,13 +162,13 @@ def test_combine_orbital_parameters(self): def test_combine_time_parameters(self): """Combine times in 'time_parameters.""" time_params1 = { - "nominal_start_time": datetime(2020, 1, 1, 12, 0, 0), - "nominal_end_time": datetime(2020, 1, 1, 12, 2, 30), - "observation_start_time": datetime(2020, 1, 1, 12, 0, 2, 23821), - "observation_end_time": datetime(2020, 1, 1, 12, 2, 23, 12348), + "nominal_start_time": dt.datetime(2020, 1, 1, 12, 0, 0), + "nominal_end_time": dt.datetime(2020, 1, 1, 12, 2, 30), + "observation_start_time": dt.datetime(2020, 1, 1, 12, 0, 2, 23821), + "observation_end_time": dt.datetime(2020, 1, 1, 12, 2, 23, 12348), } time_params2 = {} - time_shift = timedelta(seconds=1.5) + time_shift = dt.timedelta(seconds=1.5) for key, value in time_params1.items(): time_params2[key] = value + time_shift res = self.fh.combine_info([ @@ -175,10 +176,10 @@ def test_combine_time_parameters(self): {"time_parameters": time_params2} ]) res_time_params = res["time_parameters"] - assert res_time_params["nominal_start_time"] == datetime(2020, 1, 1, 12, 0, 0) - assert res_time_params["nominal_end_time"] == datetime(2020, 1, 1, 12, 2, 31, 500000) - assert res_time_params["observation_start_time"] == datetime(2020, 1, 1, 12, 0, 2, 23821) - assert res_time_params["observation_end_time"] == datetime(2020, 1, 1, 12, 2, 24, 512348) + assert res_time_params["nominal_start_time"] == dt.datetime(2020, 1, 1, 12, 0, 0) + assert res_time_params["nominal_end_time"] == dt.datetime(2020, 1, 1, 12, 2, 31, 500000) + assert res_time_params["observation_start_time"] == dt.datetime(2020, 1, 1, 12, 0, 2, 23821) + assert res_time_params["observation_end_time"] == dt.datetime(2020, 1, 1, 12, 2, 24, 512348) def test_file_is_kept_intact(self): """Test that the file object passed (string, path, or other) is kept intact.""" diff --git a/satpy/tests/test_modifiers.py b/satpy/tests/test_modifiers.py index 0c8eb51b3f..3bc7ca91c8 100644 --- a/satpy/tests/test_modifiers.py +++ b/satpy/tests/test_modifiers.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Tests for modifiers in modifiers/__init__.py.""" + +import datetime as dt import unittest -from datetime import datetime from unittest import mock import dask.array as da @@ -57,7 +59,7 @@ def _sunz_stacked_area_def(): def _shared_sunz_attrs(area_def): attrs = {"area": area_def, - "start_time": datetime(2018, 1, 1, 18), + "start_time": dt.datetime(2018, 1, 1, 18), "modifiers": tuple(), "name": "test_vis"} return attrs @@ -591,7 +593,7 @@ def test_call(self): lats[1, 1] = np.inf lats = da.from_array(lats, chunks=5) area = SwathDefinition(lons, lats) - stime = datetime(2020, 1, 1, 12, 0, 0) + stime = dt.datetime(2020, 1, 1, 12, 0, 0) orb_params = { "satellite_actual_altitude": 12345678, "nadir_longitude": 0.0, diff --git a/satpy/tests/test_readers.py b/satpy/tests/test_readers.py index db3d1ccb1d..0f2244348d 100644 --- a/satpy/tests/test_readers.py +++ b/satpy/tests/test_readers.py @@ -15,10 +15,12 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Test classes and functions in the readers/__init__.py module.""" import builtins import contextlib +import datetime as dt import os import sys import unittest @@ -399,43 +401,37 @@ def test_missing_requirements(self, *mocks): def test_all_filtered(self): """Test behaviour if no file matches the filter parameters.""" - import datetime - from satpy.readers import load_readers filenames = { "viirs_sdr": ["SVI01_npp_d20120225_t1801245_e1802487_b01708_c20120226002130255476_noaa_ops.h5"], } - filter_params = {"start_time": datetime.datetime(1970, 1, 1), - "end_time": datetime.datetime(1970, 1, 2), + filter_params = {"start_time": dt.datetime(1970, 1, 1), + "end_time": dt.datetime(1970, 1, 2), "area": None} with pytest.raises(ValueError, match="No dataset could be loaded.*"): load_readers(filenames=filenames, reader_kwargs={"filter_parameters": filter_params}) def test_all_filtered_multiple(self): """Test behaviour if no file matches the filter parameters.""" - import datetime - from satpy.readers import load_readers filenames = { "viirs_sdr": ["SVI01_npp_d20120225_t1801245_e1802487_b01708_c20120226002130255476_noaa_ops.h5"], "abi_l1b": ["OR_ABI-L1b-RadF-M3C01_G16_s20120561730408_e20120561741175_c20172631741218.nc"], } - filter_params = {"start_time": datetime.datetime(1970, 1, 1), - "end_time": datetime.datetime(1970, 1, 2)} + filter_params = {"start_time": dt.datetime(1970, 1, 1), + "end_time": dt.datetime(1970, 1, 2)} with pytest.raises(ValueError, match="No dataset could be loaded."): load_readers(filenames=filenames, reader_kwargs={"filter_parameters": filter_params}) def test_almost_all_filtered(self): """Test behaviour if only one reader has datasets.""" - import datetime - from satpy.readers import load_readers filenames = { "viirs_sdr": ["SVI01_npp_d20120225_t1801245_e1802487_b01708_c20120226002130255476_noaa_ops.h5"], "abi_l1b": ["OR_ABI-L1b-RadF-M3C01_G16_s20172631730408_e20172631741175_c20172631741218.nc"], } - filter_params = {"start_time": datetime.datetime(2012, 2, 25), - "end_time": datetime.datetime(2012, 2, 26)} + filter_params = {"start_time": dt.datetime(2012, 2, 25), + "end_time": dt.datetime(2012, 2, 26)} # viirs has data that matches the request, abi doesn't readers = load_readers(filenames=filenames, reader_kwargs={"filter_parameters": filter_params}) assert "viirs_sdr" in readers @@ -480,11 +476,9 @@ def test_reader_other_name(self, monkeypatch, tmp_path): def test_reader_name_matched_start_end_time(self, viirs_file): """Test with start and end time matching the filename.""" - from datetime import datetime - ri = find_files_and_readers(reader="viirs_sdr", - start_time=datetime(2012, 2, 25, 18, 0, 0), - end_time=datetime(2012, 2, 25, 19, 0, 0), + start_time=dt.datetime(2012, 2, 25, 18, 0, 0), + end_time=dt.datetime(2012, 2, 25, 19, 0, 0), ) assert list(ri.keys()) == ["viirs_sdr"] assert ri["viirs_sdr"] == [viirs_file] @@ -494,9 +488,7 @@ def test_reader_name_matched_start_time(self, viirs_file): Start time in the middle of the file time should still match the file. """ - from datetime import datetime - - ri = find_files_and_readers(reader="viirs_sdr", start_time=datetime(2012, 2, 25, 18, 1, 30)) + ri = find_files_and_readers(reader="viirs_sdr", start_time=dt.datetime(2012, 2, 25, 18, 1, 30)) assert list(ri.keys()) == ["viirs_sdr"] assert ri["viirs_sdr"] == [viirs_file] @@ -506,20 +498,16 @@ def test_reader_name_matched_end_time(self, viirs_file): End time in the middle of the file time should still match the file. """ - from datetime import datetime - - ri = find_files_and_readers(reader="viirs_sdr", end_time=datetime(2012, 2, 25, 18, 1, 30)) + ri = find_files_and_readers(reader="viirs_sdr", end_time=dt.datetime(2012, 2, 25, 18, 1, 30)) assert list(ri.keys()) == ["viirs_sdr"] assert ri["viirs_sdr"] == [viirs_file] def test_reader_name_unmatched_start_end_time(self, viirs_file): """Test with start and end time matching the filename.""" - from datetime import datetime - with pytest.raises(ValueError, match="No supported files found"): find_files_and_readers(reader="viirs_sdr", - start_time=datetime(2012, 2, 26, 18, 0, 0), - end_time=datetime(2012, 2, 26, 19, 0, 0)) + start_time=dt.datetime(2012, 2, 26, 18, 0, 0), + end_time=dt.datetime(2012, 2, 26, 19, 0, 0)) def test_no_parameters(self, viirs_file): """Test with no limiting parameters.""" diff --git a/satpy/tests/test_writers.py b/satpy/tests/test_writers.py index bc68d767c1..701347cdbe 100644 --- a/satpy/tests/test_writers.py +++ b/satpy/tests/test_writers.py @@ -18,7 +18,7 @@ from __future__ import annotations -import datetime +import datetime as dt import os import shutil import unittest @@ -546,7 +546,6 @@ class TestComputeWriterResults(unittest.TestCase): def setUp(self): """Create temporary directory to save files to and a mock scene.""" import tempfile - from datetime import datetime from pyresample.geometry import AreaDefinition @@ -560,7 +559,7 @@ def setUp(self): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "test", - "start_time": datetime(2018, 1, 1, 0, 0, 0), + "start_time": dt.datetime(2018, 1, 1, 0, 0, 0), "area": adef} ) self.scn = Scene() @@ -655,7 +654,6 @@ class TestBaseWriter: def setup_method(self): """Set up tests.""" import tempfile - from datetime import datetime from pyresample.geometry import AreaDefinition @@ -670,7 +668,7 @@ def setup_method(self): dims=("y", "x"), attrs={ "name": "test", - "start_time": datetime(2018, 1, 1, 0, 0, 0), + "start_time": dt.datetime(2018, 1, 1, 0, 0, 0), "sensor": "fake_sensor", "area": adef, } @@ -881,7 +879,7 @@ def test_group_results_by_output_file(tmp_path): "kraken_depth": dat}, daskify=True, area=fake_area, - common_attrs={"start_time": datetime.datetime(2022, 11, 16, 13, 27)}) + common_attrs={"start_time": dt.datetime(2022, 11, 16, 13, 27)}) # NB: even if compute=False, ``save_datasets`` creates (empty) files (sources, targets) = fake_scene.save_datasets( filename=os.fspath(tmp_path / "test-{name}.tif"), diff --git a/satpy/tests/test_yaml_reader.py b/satpy/tests/test_yaml_reader.py index 0b0293e453..699f6619b6 100644 --- a/satpy/tests/test_yaml_reader.py +++ b/satpy/tests/test_yaml_reader.py @@ -15,12 +15,13 @@ # # You should have received a copy of the GNU General Public License along with # satpy. If not, see . + """Testing the yaml_reader module.""" +import datetime as dt import os import random import unittest -from datetime import datetime from tempfile import mkdtemp from unittest.mock import MagicMock, call, patch @@ -182,8 +183,8 @@ def __init__(self, filename, filename_info, filetype_info): """Initialize the dummy reader.""" super(DummyReader, self).__init__( filename, filename_info, filetype_info) - self._start_time = datetime(2000, 1, 1, 12, 1) - self._end_time = datetime(2000, 1, 1, 12, 2) + self._start_time = dt.datetime(2000, 1, 1, 12, 1) + self._end_time = dt.datetime(2000, 1, 1, 12, 2) self.metadata = {} @property @@ -227,8 +228,8 @@ def setUp(self): self.config = res_dict self.reader = yr.FileYAMLReader(self.config, filter_parameters={ - "start_time": datetime(2000, 1, 1), - "end_time": datetime(2000, 1, 2)}) + "start_time": dt.datetime(2000, 1, 1), + "end_time": dt.datetime(2000, 1, 2)}) def test_select_from_pathnames(self): """Check select_files_from_pathnames.""" @@ -280,8 +281,8 @@ def setUp(self): self.config = MHS_YAML_READER_DICT self.reader = yr.FileYAMLReader(MHS_YAML_READER_DICT, filter_parameters={ - "start_time": datetime(2000, 1, 1), - "end_time": datetime(2000, 1, 2), + "start_time": dt.datetime(2000, 1, 1), + "end_time": dt.datetime(2000, 1, 2), }) def test_custom_type_with_dict_contents_gets_parsed_correctly(self): @@ -321,8 +322,8 @@ def setUp(self): self.config = res_dict self.reader = yr.FileYAMLReader(res_dict, filter_parameters={ - "start_time": datetime(2000, 1, 1), - "end_time": datetime(2000, 1, 2), + "start_time": dt.datetime(2000, 1, 1), + "end_time": dt.datetime(2000, 1, 2), }) def test_deprecated_passing_config_files(self): @@ -362,17 +363,18 @@ def test_available_dataset_names(self): def test_filter_fh_by_time(self): """Check filtering filehandlers by time.""" - fh0 = FakeFH(datetime(1999, 12, 30), datetime(1999, 12, 31)) - fh1 = FakeFH(datetime(1999, 12, 31, 10, 0), - datetime(2000, 1, 1, 12, 30)) - fh2 = FakeFH(datetime(2000, 1, 1, 10, 0), - datetime(2000, 1, 1, 12, 30)) - fh3 = FakeFH(datetime(2000, 1, 1, 12, 30), - datetime(2000, 1, 2, 12, 30)) - fh4 = FakeFH(datetime(2000, 1, 2, 12, 30), - datetime(2000, 1, 3, 12, 30)) - fh5 = FakeFH(datetime(1999, 12, 31, 10, 0), - datetime(2000, 1, 3, 12, 30)) + fh0 = FakeFH(dt.datetime(1999, 12, 30), + dt.datetime(1999, 12, 31)) + fh1 = FakeFH(dt.datetime(1999, 12, 31, 10, 0), + dt.datetime(2000, 1, 1, 12, 30)) + fh2 = FakeFH(dt.datetime(2000, 1, 1, 10, 0), + dt.datetime(2000, 1, 1, 12, 30)) + fh3 = FakeFH(dt.datetime(2000, 1, 1, 12, 30), + dt.datetime(2000, 1, 2, 12, 30)) + fh4 = FakeFH(dt.datetime(2000, 1, 2, 12, 30), + dt.datetime(2000, 1, 3, 12, 30)) + fh5 = FakeFH(dt.datetime(1999, 12, 31, 10, 0), + dt.datetime(2000, 1, 3, 12, 30)) for idx, fh in enumerate([fh0, fh1, fh2, fh3, fh4, fh5]): res = self.reader.time_matches(fh.start_time, fh.end_time) @@ -388,8 +390,8 @@ def test_filter_fh_by_time(self): @patch("satpy.readers.yaml_reader.Boundary") def test_file_covers_area(self, bnd, adb, gad): """Test that area coverage is checked properly.""" - file_handler = FakeFH(datetime(1999, 12, 31, 10, 0), - datetime(2000, 1, 3, 12, 30)) + file_handler = FakeFH(dt.datetime(1999, 12, 31, 10, 0), + dt.datetime(2000, 1, 3, 12, 30)) self.reader.filter_parameters["area"] = True bnd.return_value.contour_poly.intersection.return_value = True @@ -417,18 +419,18 @@ def test_start_end_time(self): with pytest.raises(RuntimeError): self.reader.end_time - fh0 = FakeFH(datetime(1999, 12, 30, 0, 0), - datetime(1999, 12, 31, 0, 0)) - fh1 = FakeFH(datetime(1999, 12, 31, 10, 0), - datetime(2000, 1, 1, 12, 30)) - fh2 = FakeFH(datetime(2000, 1, 1, 10, 0), - datetime(2000, 1, 1, 12, 30)) - fh3 = FakeFH(datetime(2000, 1, 1, 12, 30), - datetime(2000, 1, 2, 12, 30)) - fh4 = FakeFH(datetime(2000, 1, 2, 12, 30), - datetime(2000, 1, 3, 12, 30)) - fh5 = FakeFH(datetime(1999, 12, 31, 10, 0), - datetime(2000, 1, 3, 12, 30)) + fh0 = FakeFH(dt.datetime(1999, 12, 30, 0, 0), + dt.datetime(1999, 12, 31, 0, 0)) + fh1 = FakeFH(dt.datetime(1999, 12, 31, 10, 0), + dt.datetime(2000, 1, 1, 12, 30)) + fh2 = FakeFH(dt.datetime(2000, 1, 1, 10, 0), + dt.datetime(2000, 1, 1, 12, 30)) + fh3 = FakeFH(dt.datetime(2000, 1, 1, 12, 30), + dt.datetime(2000, 1, 2, 12, 30)) + fh4 = FakeFH(dt.datetime(2000, 1, 2, 12, 30), + dt.datetime(2000, 1, 3, 12, 30)) + fh5 = FakeFH(dt.datetime(1999, 12, 31, 10, 0), + dt.datetime(2000, 1, 3, 12, 30)) self.reader.file_handlers = { "0": [fh1, fh2, fh3, fh4, fh5], @@ -436,8 +438,8 @@ def test_start_end_time(self): "2": [fh2, fh3], } - assert self.reader.start_time == datetime(1999, 12, 30, 0, 0) - assert self.reader.end_time == datetime(2000, 1, 3, 12, 30) + assert self.reader.start_time == dt.datetime(1999, 12, 30, 0, 0) + assert self.reader.end_time == dt.datetime(2000, 1, 3, 12, 30) def test_select_from_pathnames(self): """Check select_files_from_pathnames.""" @@ -572,8 +574,8 @@ def setUp(self): self.config = res_dict self.reader = yr.FileYAMLReader(res_dict, filter_parameters={ - "start_time": datetime(2000, 1, 1), - "end_time": datetime(2000, 1, 2), + "start_time": dt.datetime(2000, 1, 1), + "end_time": dt.datetime(2000, 1, 2), }) fake_fh = FakeFH(None, None) self.lons = xr.DataArray(np.ones((2, 2)) * 2, diff --git a/satpy/tests/utils.py b/satpy/tests/utils.py index a6ebf8753e..b2e3576d0f 100644 --- a/satpy/tests/utils.py +++ b/satpy/tests/utils.py @@ -16,8 +16,8 @@ # along with this program. If not, see . """Utilities for various satpy tests.""" +import datetime as dt from contextlib import contextmanager -from datetime import datetime from typing import Any from unittest import mock @@ -34,8 +34,8 @@ from satpy.modifiers import ModifierBase from satpy.readers.file_handlers import BaseFileHandler -FAKE_FILEHANDLER_START = datetime(2020, 1, 1, 0, 0, 0) -FAKE_FILEHANDLER_END = datetime(2020, 1, 1, 1, 0, 0) +FAKE_FILEHANDLER_START = dt.datetime(2020, 1, 1, 0, 0, 0) +FAKE_FILEHANDLER_END = dt.datetime(2020, 1, 1, 1, 0, 0) def make_dataid(**items): diff --git a/satpy/tests/writer_tests/test_awips_tiled.py b/satpy/tests/writer_tests/test_awips_tiled.py index dbc1bc82d7..364d0c6b8e 100644 --- a/satpy/tests/writer_tests/test_awips_tiled.py +++ b/satpy/tests/writer_tests/test_awips_tiled.py @@ -17,10 +17,10 @@ # satpy. If not, see . """Tests for the AWIPS Tiled writer.""" +import datetime as dt import logging import os import shutil -from datetime import datetime, timedelta from glob import glob import dask @@ -32,8 +32,8 @@ from satpy.resample import update_resampled_coords -START_TIME = datetime(2018, 1, 1, 12, 0, 0) -END_TIME = START_TIME + timedelta(minutes=20) +START_TIME = dt.datetime(2018, 1, 1, 12, 0, 0) +END_TIME = START_TIME + dt.timedelta(minutes=20) # NOTE: # The following fixtures are not defined in this file, but are used and injected by Pytest: @@ -378,7 +378,7 @@ def test_lettered_tiles_sector_ref(self, tmp_path): unmasked_ds = xr.open_dataset(fn, mask_and_scale=False) masked_ds = xr.open_dataset(fn, mask_and_scale=True) check_required_properties(unmasked_ds, masked_ds) - expected_start = (START_TIME + timedelta(minutes=20)).strftime("%Y-%m-%dT%H:%M:%S") + expected_start = (START_TIME + dt.timedelta(minutes=20)).strftime("%Y-%m-%dT%H:%M:%S") assert masked_ds.attrs["start_date_time"] == expected_start def test_lettered_tiles_no_fit(self, tmp_path): diff --git a/satpy/tests/writer_tests/test_cf.py b/satpy/tests/writer_tests/test_cf.py index 6d1d15527b..18a3682fc7 100644 --- a/satpy/tests/writer_tests/test_cf.py +++ b/satpy/tests/writer_tests/test_cf.py @@ -17,10 +17,10 @@ # satpy. If not, see . """Tests for the CF writer.""" +import datetime as dt import os import tempfile import warnings -from datetime import datetime import numpy as np import pytest @@ -74,8 +74,8 @@ def test_init(self): def test_save_array(self): """Test saving an array to netcdf/cf.""" scn = Scene() - start_time = datetime(2018, 5, 30, 10, 0) - end_time = datetime(2018, 5, 30, 10, 15) + start_time = dt.datetime(2018, 5, 30, 10, 0) + end_time = dt.datetime(2018, 5, 30, 10, 15) scn["test-array"] = xr.DataArray([1, 2, 3], attrs=dict(start_time=start_time, end_time=end_time, @@ -90,8 +90,8 @@ def test_save_array(self): def test_save_array_coords(self): """Test saving array with coordinates.""" scn = Scene() - start_time = datetime(2018, 5, 30, 10, 0) - end_time = datetime(2018, 5, 30, 10, 15) + start_time = dt.datetime(2018, 5, 30, 10, 0) + end_time = dt.datetime(2018, 5, 30, 10, 15) coords = { "x": np.arange(3), "y": np.arange(1), @@ -162,8 +162,8 @@ def test_ancillary_variables(self): """Test ancillary_variables cited each other.""" from satpy.tests.utils import make_dataid scn = Scene() - start_time = datetime(2018, 5, 30, 10, 0) - end_time = datetime(2018, 5, 30, 10, 15) + start_time = dt.datetime(2018, 5, 30, 10, 0) + end_time = dt.datetime(2018, 5, 30, 10, 15) da = xr.DataArray([1, 2, 3], attrs=dict(start_time=start_time, end_time=end_time, @@ -180,8 +180,8 @@ def test_ancillary_variables(self): def test_groups(self): """Test creating a file with groups.""" - tstart = datetime(2019, 4, 1, 12, 0) - tend = datetime(2019, 4, 1, 12, 15) + tstart = dt.datetime(2019, 4, 1, 12, 0) + tend = dt.datetime(2019, 4, 1, 12, 15) data_visir = [[1, 2], [3, 4]] y_visir = [1, 2] @@ -238,8 +238,8 @@ def test_groups(self): def test_single_time_value(self): """Test setting a single time value.""" scn = Scene() - start_time = datetime(2018, 5, 30, 10, 0) - end_time = datetime(2018, 5, 30, 10, 15) + start_time = dt.datetime(2018, 5, 30, 10, 0) + end_time = dt.datetime(2018, 5, 30, 10, 15) test_array = np.array([[1, 2], [3, 4]]) scn["test-array"] = xr.DataArray(test_array, dims=["x", "y"], @@ -272,8 +272,8 @@ def test_time_coordinate_on_a_swath(self): def test_bounds(self): """Test setting time bounds.""" scn = Scene() - start_time = datetime(2018, 5, 30, 10, 0) - end_time = datetime(2018, 5, 30, 10, 15) + start_time = dt.datetime(2018, 5, 30, 10, 0) + end_time = dt.datetime(2018, 5, 30, 10, 15) test_array = np.array([[1, 2], [3, 4]]).reshape(2, 2, 1) scn["test-array"] = xr.DataArray(test_array, dims=["x", "y", "time"], @@ -307,10 +307,10 @@ def test_bounds(self): def test_bounds_minimum(self): """Test minimum bounds.""" scn = Scene() - start_timeA = datetime(2018, 5, 30, 10, 0) # expected to be used - end_timeA = datetime(2018, 5, 30, 10, 20) - start_timeB = datetime(2018, 5, 30, 10, 3) - end_timeB = datetime(2018, 5, 30, 10, 15) # expected to be used + start_timeA = dt.datetime(2018, 5, 30, 10, 0) # expected to be used + end_timeA = dt.datetime(2018, 5, 30, 10, 20) + start_timeB = dt.datetime(2018, 5, 30, 10, 3) + end_timeB = dt.datetime(2018, 5, 30, 10, 15) # expected to be used test_arrayA = np.array([[1, 2], [3, 4]]).reshape(2, 2, 1) test_arrayB = np.array([[1, 2], [3, 5]]).reshape(2, 2, 1) scn["test-arrayA"] = xr.DataArray(test_arrayA, @@ -333,8 +333,8 @@ def test_bounds_minimum(self): def test_bounds_missing_time_info(self): """Test time bounds generation in case of missing time.""" scn = Scene() - start_timeA = datetime(2018, 5, 30, 10, 0) - end_timeA = datetime(2018, 5, 30, 10, 15) + start_timeA = dt.datetime(2018, 5, 30, 10, 0) + end_timeA = dt.datetime(2018, 5, 30, 10, 15) test_arrayA = np.array([[1, 2], [3, 4]]).reshape(2, 2, 1) test_arrayB = np.array([[1, 2], [3, 5]]).reshape(2, 2, 1) scn["test-arrayA"] = xr.DataArray(test_arrayA, @@ -355,8 +355,8 @@ def test_bounds_missing_time_info(self): def test_unlimited_dims_kwarg(self): """Test specification of unlimited dimensions.""" scn = Scene() - start_time = datetime(2018, 5, 30, 10, 0) - end_time = datetime(2018, 5, 30, 10, 15) + start_time = dt.datetime(2018, 5, 30, 10, 0) + end_time = dt.datetime(2018, 5, 30, 10, 15) test_array = np.array([[1, 2], [3, 4]]) scn["test-array"] = xr.DataArray(test_array, dims=["x", "y"], @@ -372,8 +372,8 @@ def test_unlimited_dims_kwarg(self): def test_header_attrs(self): """Check global attributes are set.""" scn = Scene() - start_time = datetime(2018, 5, 30, 10, 0) - end_time = datetime(2018, 5, 30, 10, 15) + start_time = dt.datetime(2018, 5, 30, 10, 0) + end_time = dt.datetime(2018, 5, 30, 10, 15) scn["test-array"] = xr.DataArray([1, 2, 3], attrs=dict(start_time=start_time, end_time=end_time)) @@ -423,8 +423,8 @@ def test_load_module_with_old_pyproj(self): def test_global_attr_default_history_and_Conventions(self): """Test saving global attributes history and Conventions.""" scn = Scene() - start_time = datetime(2018, 5, 30, 10, 0) - end_time = datetime(2018, 5, 30, 10, 15) + start_time = dt.datetime(2018, 5, 30, 10, 0) + end_time = dt.datetime(2018, 5, 30, 10, 15) scn["test-array"] = xr.DataArray([[1, 2, 3]], dims=("y", "x"), attrs=dict(start_time=start_time, @@ -439,8 +439,8 @@ def test_global_attr_default_history_and_Conventions(self): def test_global_attr_history_and_Conventions(self): """Test saving global attributes history and Conventions.""" scn = Scene() - start_time = datetime(2018, 5, 30, 10, 0) - end_time = datetime(2018, 5, 30, 10, 15) + start_time = dt.datetime(2018, 5, 30, 10, 0) + end_time = dt.datetime(2018, 5, 30, 10, 15) scn["test-array"] = xr.DataArray([[1, 2, 3]], dims=("y", "x"), attrs=dict(start_time=start_time, @@ -465,8 +465,8 @@ def scene(self): """Create a fake scene.""" scn = Scene() attrs = { - "start_time": datetime(2018, 5, 30, 10, 0), - "end_time": datetime(2018, 5, 30, 10, 15) + "start_time": dt.datetime(2018, 5, 30, 10, 0), + "end_time": dt.datetime(2018, 5, 30, 10, 15) } scn["test-array"] = xr.DataArray([1., 2, 3], attrs=attrs) return scn diff --git a/satpy/tests/writer_tests/test_geotiff.py b/satpy/tests/writer_tests/test_geotiff.py index 8925857637..d0e879c4b2 100644 --- a/satpy/tests/writer_tests/test_geotiff.py +++ b/satpy/tests/writer_tests/test_geotiff.py @@ -17,7 +17,7 @@ # satpy. If not, see . """Tests for the geotiff writer.""" -from datetime import datetime +import datetime as dt from unittest import mock import dask.array as da @@ -42,7 +42,7 @@ def _get_test_datasets_2d(): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "test", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "units": "K", "area": adef} ) @@ -72,7 +72,7 @@ def _get_test_datasets_3d(): dims=("bands", "y", "x"), coords={"bands": ["R", "G", "B"]}, attrs={"name": "test", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "area": adef} ) return [ds1] diff --git a/satpy/tests/writer_tests/test_mitiff.py b/satpy/tests/writer_tests/test_mitiff.py index 2dafdd5896..1642510583 100644 --- a/satpy/tests/writer_tests/test_mitiff.py +++ b/satpy/tests/writer_tests/test_mitiff.py @@ -20,6 +20,8 @@ Based on the test for geotiff writer """ + +import datetime as dt import logging import os import unittest @@ -48,8 +50,6 @@ def tearDown(self): def _get_test_datasets(self): """Create a datasets list.""" - from datetime import datetime - import dask.array as da import xarray as xr from pyproj import CRS @@ -68,7 +68,7 @@ def _get_test_datasets(self): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "1", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": "TEST_SENSOR_NAME", "area": area_def, @@ -91,7 +91,7 @@ def _get_test_datasets(self): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "4", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": "TEST_SENSOR_NAME", "area": area_def, @@ -114,8 +114,6 @@ def _get_test_datasets(self): def _get_test_datasets_sensor_set(self): """Create a datasets list.""" - from datetime import datetime - import dask.array as da import xarray as xr from pyproj import CRS @@ -134,7 +132,7 @@ def _get_test_datasets_sensor_set(self): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "1", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": {"TEST_SENSOR_NAME"}, "area": area_def, @@ -157,7 +155,7 @@ def _get_test_datasets_sensor_set(self): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "4", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": {"TEST_SENSOR_NAME"}, "area": area_def, @@ -180,8 +178,6 @@ def _get_test_datasets_sensor_set(self): def _get_test_dataset(self, bands=3): """Create a single test dataset.""" - from datetime import datetime - import dask.array as da import xarray as xr from pyproj import CRS @@ -201,7 +197,7 @@ def _get_test_dataset(self, bands=3): da.zeros((bands, 100, 200), chunks=50), dims=("bands", "y", "x"), attrs={"name": "test", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": "TEST_SENSOR_NAME", "area": area_def, @@ -211,8 +207,6 @@ def _get_test_dataset(self, bands=3): def _get_test_one_dataset(self): """Create a single test dataset.""" - from datetime import datetime - import dask.array as da import xarray as xr from pyproj import CRS @@ -232,7 +226,7 @@ def _get_test_one_dataset(self): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "test", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": "avhrr", "area": area_def, @@ -242,8 +236,6 @@ def _get_test_one_dataset(self): def _get_test_one_dataset_sensor_set(self): """Create a single test dataset.""" - from datetime import datetime - import dask.array as da import xarray as xr from pyproj import CRS @@ -263,7 +255,7 @@ def _get_test_one_dataset_sensor_set(self): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "test", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": {"avhrr"}, "area": area_def, @@ -273,8 +265,6 @@ def _get_test_one_dataset_sensor_set(self): def _get_test_dataset_with_bad_values(self, bands=3): """Create a single test dataset.""" - from datetime import datetime - import xarray as xr from pyproj import CRS from pyresample.geometry import AreaDefinition @@ -298,7 +288,7 @@ def _get_test_dataset_with_bad_values(self, bands=3): ds1 = xr.DataArray(rgb_data, dims=("bands", "y", "x"), attrs={"name": "test", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": "TEST_SENSOR_NAME", "area": area_def, @@ -307,8 +297,6 @@ def _get_test_dataset_with_bad_values(self, bands=3): def _get_test_dataset_calibration(self, bands=6): """Create a single test dataset.""" - from datetime import datetime - import dask.array as da import xarray as xr from pyproj import CRS @@ -362,7 +350,7 @@ def _get_test_dataset_calibration(self, bands=6): bands.append(p.attrs["name"]) data["bands"] = list(bands) new_attrs = {"name": "datasets", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": "test-sensor", "area": area_def, @@ -411,8 +399,6 @@ def _get_test_dataset_calibration(self, bands=6): def _get_test_dataset_calibration_one_dataset(self, bands=1): """Create a single test dataset.""" - from datetime import datetime - import dask.array as da import xarray as xr from pyproj import CRS @@ -441,7 +427,7 @@ def _get_test_dataset_calibration_one_dataset(self, bands=1): for p in scene: calibration.append(p.attrs["calibration"]) new_attrs = {"name": "datasets", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": "test-sensor", "area": area_def, @@ -465,8 +451,6 @@ def _get_test_dataset_calibration_one_dataset(self, bands=1): def _get_test_dataset_three_bands_two_prereq(self, bands=3): """Create a single test dataset.""" - from datetime import datetime - import dask.array as da import xarray as xr from pyproj import CRS @@ -488,7 +472,7 @@ def _get_test_dataset_three_bands_two_prereq(self, bands=3): coords=[["R", "G", "B"], list(range(100)), list(range(200))], dims=("bands", "y", "x"), attrs={"name": "test", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": "TEST_SENSOR_NAME", "area": area_def, @@ -499,8 +483,6 @@ def _get_test_dataset_three_bands_two_prereq(self, bands=3): def _get_test_dataset_three_bands_prereq(self, bands=3): """Create a single test dataset.""" - from datetime import datetime - import dask.array as da import xarray as xr from pyproj import CRS @@ -522,7 +504,7 @@ def _get_test_dataset_three_bands_prereq(self, bands=3): coords=[["R", "G", "B"], list(range(100)), list(range(200))], dims=("bands", "y", "x"), attrs={"name": "test", - "start_time": datetime.utcnow(), + "start_time": dt.datetime.utcnow(), "platform_name": "TEST_PLATFORM_NAME", "sensor": "TEST_SENSOR_NAME", "area": area_def, diff --git a/satpy/tests/writer_tests/test_simple_image.py b/satpy/tests/writer_tests/test_simple_image.py index 01d89a22ad..6a4eba95e3 100644 --- a/satpy/tests/writer_tests/test_simple_image.py +++ b/satpy/tests/writer_tests/test_simple_image.py @@ -38,7 +38,7 @@ def tearDown(self): @staticmethod def _get_test_datasets(): """Create DataArray for testing.""" - from datetime import datetime + import datetime as dt import dask.array as da import xarray as xr @@ -46,7 +46,7 @@ def _get_test_datasets(): da.zeros((100, 200), chunks=50), dims=("y", "x"), attrs={"name": "test", - "start_time": datetime.utcnow()} + "start_time": dt.datetime.utcnow()} ) return [ds1] diff --git a/satpy/writers/awips_tiled.py b/satpy/writers/awips_tiled.py index 8fe9a8d2cc..1652a3786e 100644 --- a/satpy/writers/awips_tiled.py +++ b/satpy/writers/awips_tiled.py @@ -213,13 +213,14 @@ lettered tile locations. """ + +import datetime as dt import logging import os import string import sys import warnings from collections import namedtuple -from datetime import datetime, timedelta import dask import dask.array as da @@ -1101,7 +1102,7 @@ def apply_misc_metadata(self, new_ds, sector_id=None, creator=None, creation_tim if creator is None: creator = "Satpy Version {} - AWIPS Tiled Writer".format(__version__) if creation_time is None: - creation_time = datetime.utcnow() + creation_time = dt.datetime.utcnow() self._add_sector_id_global(new_ds, sector_id) new_ds.attrs["Conventions"] = "CF-1.7" @@ -1493,8 +1494,8 @@ def _save_nonempty_mfdatasets(self, datasets_to_save, output_filenames, **kwargs def _adjust_metadata_times(self, ds_info): debug_shift_time = int(os.environ.get("DEBUG_TIME_SHIFT", 0)) if debug_shift_time: - ds_info["start_time"] += timedelta(minutes=debug_shift_time) - ds_info["end_time"] += timedelta(minutes=debug_shift_time) + ds_info["start_time"] += dt.timedelta(minutes=debug_shift_time) + ds_info["end_time"] += dt.timedelta(minutes=debug_shift_time) def _get_tile_data_info(self, data_arrs, creation_time, source_name): # use the first data array as a "representative" for the group @@ -1597,7 +1598,7 @@ def save_datasets(self, datasets, sector_id=None, # noqa: D417 area_data_arrs = self._group_by_area(datasets) datasets_to_save = [] output_filenames = [] - creation_time = datetime.utcnow() + creation_time = dt.datetime.utcnow() area_tile_data_gen = self._iter_area_tile_info_and_datasets( area_data_arrs, template, lettered_grid, sector_id, num_subtiles, tile_size, tile_count, use_sector_reference) @@ -1775,7 +1776,7 @@ def create_debug_lettered_tiles(**writer_kwargs): sector_info = writer.awips_sectors[sector_id] area_def, arr = _create_debug_array(sector_info, save_kwargs["num_subtiles"]) - now = datetime.utcnow() + now = dt.datetime.utcnow() product = xr.DataArray(da.from_array(arr, chunks="auto"), attrs=dict( name="debug_{}".format(sector_id), platform_name="DEBUG", From 7c139590a3c5fbd60c72b0b8af7034b94b3ea52e Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 22 Apr 2024 15:30:14 +0200 Subject: [PATCH 371/481] change default with_area_definition value --- satpy/readers/li_l2_nc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/readers/li_l2_nc.py b/satpy/readers/li_l2_nc.py index 4fe0826380..03ab46545f 100644 --- a/satpy/readers/li_l2_nc.py +++ b/satpy/readers/li_l2_nc.py @@ -46,7 +46,7 @@ class LIL2NCFileHandler(LINCFileHandler): """Implementation class for the unified LI L2 satpy reader.""" - def __init__(self, filename, filename_info, filetype_info, with_area_definition=False): + def __init__(self, filename, filename_info, filetype_info, with_area_definition=True): """Initialize LIL2NCFileHandler.""" super(LIL2NCFileHandler, self).__init__(filename, filename_info, filetype_info) From 1f089fad64c76a3fef1ad9932d12d229201d7e2f Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 22 Apr 2024 15:59:48 +0200 Subject: [PATCH 372/481] fix tests by specifying with_area_definition=False --- satpy/tests/reader_tests/test_li_l2_nc.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/satpy/tests/reader_tests/test_li_l2_nc.py b/satpy/tests/reader_tests/test_li_l2_nc.py index 5e9d0ff563..c6e13a7fe3 100644 --- a/satpy/tests/reader_tests/test_li_l2_nc.py +++ b/satpy/tests/reader_tests/test_li_l2_nc.py @@ -174,7 +174,8 @@ def test_dataset_loading(self, filetype_infos): "end_time": "1000" } - handler = LIL2NCFileHandler("filename", filename_info, extract_filetype_info(filetype_infos, ftype)) + handler = LIL2NCFileHandler("filename", filename_info, extract_filetype_info(filetype_infos, ftype), + with_area_definition=False) ds_desc = handler.ds_desc # retrieve the schema that what used to generate the content for that product: @@ -480,7 +481,8 @@ def test_combine_info(self, filetype_infos): def test_coordinates_projection(self, filetype_infos): """Should automatically generate lat/lon coords from projection data.""" - handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_af_nc")) + handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_af_nc"), + with_area_definition=False) dsid = make_dataid(name="flash_accumulation") dset = handler.get_dataset(dsid) @@ -492,7 +494,8 @@ def test_coordinates_projection(self, filetype_infos): with pytest.raises(NotImplementedError): handler.get_area_def(dsid) - handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_afr_nc")) + handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_afr_nc"), + with_area_definition=False) dsid = make_dataid(name="flash_radiance") dset = handler.get_dataset(dsid) @@ -501,7 +504,8 @@ def test_coordinates_projection(self, filetype_infos): assert dset.attrs["coordinates"][0] == "longitude" assert dset.attrs["coordinates"][1] == "latitude" - handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_afa_nc")) + handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_afa_nc"), + with_area_definition=False) dsid = make_dataid(name="accumulated_flash_area") dset = handler.get_dataset(dsid) From de0e3c7c52ef9e365d0c361465abfe5d9f91c59e Mon Sep 17 00:00:00 2001 From: andream Date: Mon, 22 Apr 2024 17:52:01 +0200 Subject: [PATCH 373/481] update documentation --- satpy/readers/li_l2_nc.py | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/satpy/readers/li_l2_nc.py b/satpy/readers/li_l2_nc.py index 03ab46545f..09efecd688 100644 --- a/satpy/readers/li_l2_nc.py +++ b/satpy/readers/li_l2_nc.py @@ -13,18 +13,36 @@ # You should have received a copy of the GNU General Public License # along with satpy. If not, see . -"""MTG Lighting Imager (LI) L2 unified reader. +"""MTG Lightning Imager (LI) L2 unified reader. This reader supports reading all the products from the LI L2 processing level: - * L2-LE - * L2-LGR - * L2-AFA - * L2-LEF - * L2-LFL - * L2-AF - * L2-AFR + * L2-LE Lightning Events + * L2-LEF Lightning Events Filtered + * L2-LFL Lightning Flashes + * L2-LGR Lightning Groups + * L2-AF Accumulated Flashes + * L2-AFA Accumulated Flash Area + * L2-AFR Accumulated Flash Radiance + +Point-based products (LE, LEF, LFL, LGR) are provided as 1-D arrays, with a ``pyresample.geometry.SwathDefinition`` area +attribute containing the points lat-lon coordinates. + +Accumulated products (AF, AFA, AFR) are provided as 2-D arrays in the FCI 2km grid as per intended usage, +with a ``pyresample.geometry.AreaDefinition`` area attribute containing the grid geolocation information. +In this way, the products can directly be overlaid to FCI data. +If needed, the products can still be accessed as 1-d array by setting the reader kwarg ``with_area_definition=False``, +eg:: + + scn = Scene(filenames=filenames, reader="li_l2_nc", reader_kwargs={'with_area_definition': False}) + +The lat-lon coordinates of the points/grid pixels can be accessed using e.g. +``scn['dataset_name'].attrs['area'].get_lonlats()``. + +See the LI L2 Product User Guide `PUG`_ for more information on the products. + +.. _PUG: https://www-dr.eumetsat.int/media/49348 """ From a141d5ef7b0dc62f220fed3c4bf4da1bdf67e46e Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 22 Apr 2024 18:19:48 +0200 Subject: [PATCH 374/481] Update changelog for v0.48.0 --- CHANGELOG.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52d47ad47f..7281a80ceb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,49 @@ +## Version 0.48.0 (2024/04/22) + +### Issues Closed + +* [Issue 2782](https://github.com/pytroll/satpy/issues/2782) - Documentation points to missing setup.py ([PR 2786](https://github.com/pytroll/satpy/pull/2786) by [@mraspaud](https://github.com/mraspaud)) +* [Issue 2771](https://github.com/pytroll/satpy/issues/2771) - Load data in another datatype rather than float64 +* [Issue 2759](https://github.com/pytroll/satpy/issues/2759) - 'defusedxml' missing in "msi_safe" extras ([PR 2761](https://github.com/pytroll/satpy/pull/2761) by [@fwfichtner](https://github.com/fwfichtner)) +* [Issue 2749](https://github.com/pytroll/satpy/issues/2749) - [Question] Resample of mesoscale data gives blank data +* [Issue 2747](https://github.com/pytroll/satpy/issues/2747) - Cannot load from MTG FCI L1C data +* [Issue 2729](https://github.com/pytroll/satpy/issues/2729) - Add Viirs L2 Reader + Enhancments ([PR 2740](https://github.com/pytroll/satpy/pull/2740) by [@wjsharpe](https://github.com/wjsharpe)) +* [Issue 2695](https://github.com/pytroll/satpy/issues/2695) - Improvements for BackgroundCompositor ([PR 2696](https://github.com/pytroll/satpy/pull/2696) by [@yukaribbba](https://github.com/yukaribbba)) + +In this release 7 issues were closed. + +### Pull Requests Merged + +#### Bugs fixed + +* [PR 2786](https://github.com/pytroll/satpy/pull/2786) - Remove doc references to setup.py ([2782](https://github.com/pytroll/satpy/issues/2782)) +* [PR 2779](https://github.com/pytroll/satpy/pull/2779) - Convert Sentinel-2 MSI sensor name to lowercase in the reader YAML config file and add support for "counts" calibration +* [PR 2774](https://github.com/pytroll/satpy/pull/2774) - Fix the viirs EDR tests for newer xarray +* [PR 2761](https://github.com/pytroll/satpy/pull/2761) - Add missing defusedxml ([2759](https://github.com/pytroll/satpy/issues/2759)) +* [PR 2754](https://github.com/pytroll/satpy/pull/2754) - Bugfix vgac reader +* [PR 2701](https://github.com/pytroll/satpy/pull/2701) - Ici reader tiepoints bugfix +* [PR 2696](https://github.com/pytroll/satpy/pull/2696) - Add double alpha channel support and improve metadata behaviours for BackgroundCompositor ([2695](https://github.com/pytroll/satpy/issues/2695)) + +#### Features added + +* [PR 2780](https://github.com/pytroll/satpy/pull/2780) - Add new (Eumetrain) FCI RGB composites +* [PR 2767](https://github.com/pytroll/satpy/pull/2767) - Use flags from file when available in OLCI NC reader +* [PR 2763](https://github.com/pytroll/satpy/pull/2763) - Replace setup with pyproject.toml +* [PR 2762](https://github.com/pytroll/satpy/pull/2762) - Add support for EO-SIP AVHRR LAC data +* [PR 2753](https://github.com/pytroll/satpy/pull/2753) - Add fsspec support to `li_l2_nc` reader +* [PR 2740](https://github.com/pytroll/satpy/pull/2740) - Add VIIRS L2 Reader ([2729](https://github.com/pytroll/satpy/issues/2729)) +* [PR 2696](https://github.com/pytroll/satpy/pull/2696) - Add double alpha channel support and improve metadata behaviours for BackgroundCompositor ([2695](https://github.com/pytroll/satpy/issues/2695)) +* [PR 2595](https://github.com/pytroll/satpy/pull/2595) - VGAC decode the time variable + +#### Documentation changes + +* [PR 2786](https://github.com/pytroll/satpy/pull/2786) - Remove doc references to setup.py ([2782](https://github.com/pytroll/satpy/issues/2782)) +* [PR 2766](https://github.com/pytroll/satpy/pull/2766) - Add Data Store to EUMETSAT part +* [PR 2750](https://github.com/pytroll/satpy/pull/2750) - Add missing `h` docstring information to _geos_area.py + +In this release 18 pull requests were closed. + + ## Version 0.47.0 (2024/02/21) ### Issues Closed From f24622eb69e7fd8c50e9d4872249becbb4f3692f Mon Sep 17 00:00:00 2001 From: clement laplace Date: Tue, 23 Apr 2024 10:10:52 +0000 Subject: [PATCH 375/481] fix: Fix the issue found in codefactor https://github.com/pytroll/satpy/pull/2778/checks?check_run_id=24029557750 --- satpy/readers/fci_l1c_nc.py | 10 ++++----- satpy/tests/reader_tests/test_fci_l1c_nc.py | 4 ++-- satpy/tests/reader_tests/test_olci_nc.py | 24 ++++++++++----------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/satpy/readers/fci_l1c_nc.py b/satpy/readers/fci_l1c_nc.py index 5b7c669d21..f90ae912d6 100644 --- a/satpy/readers/fci_l1c_nc.py +++ b/satpy/readers/fci_l1c_nc.py @@ -30,7 +30,9 @@ .. note:: This reader currently supports Full Disk High Spectral Resolution Imagery (FDHSI) ,High Spatial Resolution Fast Imagery (HRFI) data in full-disc ("FD") scanning mode. - The african case ("AF") scanning mode has been added. + In addition it also supports the L1C format for the African dissemination ("AF"), where each file + contains the masked full-dic of a single channel + (https://www-cdn.eumetsat.int/files/2022-07/MTG%20EUMETCast%20Africa%20Product%20User%20Guide%20%5BAfricaPUG%5D_v2E.pdf) If the user provides a list of both FDHSI and HRFI files from the same repeat cycle to the Satpy ``Scene``, Satpy will automatically read the channels from the source with the finest resolution, i.e. from the HRFI files for the vis_06, nir_22, ir_38, and ir_105 channels. @@ -148,14 +150,12 @@ "grid_width": 22272}, "fci_l1c_fdhsi": {"grid_type": "1km", "grid_width": 11136}, - "fci_l1c_af": {"grid_type": "1km", - "grid_width": 11136}} + } LOW_RES_GRID_INFO = {"fci_l1c_hrfi": {"grid_type": "1km", "grid_width": 11136}, "fci_l1c_fdhsi": {"grid_type": "2km", "grid_width": 5568}, - "fci_l1c_af":{"grid_type": "3km", - "grid_width": 3712}} + } def _get_aux_data_name_from_dsname(dsname): diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index c87db9c6c2..5710586466 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -433,7 +433,7 @@ def clear_cache(reader): "grid_width": 3712 }, }, - "fci_af_vis_06" : {"3km": {"start_position_row": 1, + "fci_af_vis_06" : {"3km": {"start_position_row": 1, "end_position_row": 67, "segment_height": 67, "grid_width": 3712 @@ -742,7 +742,7 @@ def test_get_segment_position_info(self, reader_configs, fh_param, expected_pos_ @mock.patch("satpy.readers.yaml_reader.GEOVariableSegmentYAMLReader") @pytest.mark.parametrize(("channel", "resolution"), generate_parameters("radiance")) def test_not_get_segment_info_called_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,channel,resolution): - """Test that checks that the get_segment_position_info has not be called for AF data.""" + """Test that checks that the get_segment_position_info has not been called for AF data.""" with mock.patch("satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler.get_segment_position_info") as gspi: fh_param = FakeFCIFileHandlerAF_fixture reader = _get_reader_with_filehandlers(fh_param["filenames"], reader_configs) diff --git a/satpy/tests/reader_tests/test_olci_nc.py b/satpy/tests/reader_tests/test_olci_nc.py index 2834578176..fe384b9dc3 100644 --- a/satpy/tests/reader_tests/test_olci_nc.py +++ b/satpy/tests/reader_tests/test_olci_nc.py @@ -268,10 +268,10 @@ def test_bitflags(self): "CLOUD_MARGIN", "CLOUD_AMBIGUOUS", "LOWRW", "LAND"] mask = reduce(np.logical_or, [bflags[item] for item in items]) - expected = np.array([True, False, True, True, True, True, False, - False, True, True, False, False, False, False, - False, False, False, True, False, True, False, - False, False, True, True, False, False, True, + expected = np.array([True, False, True, True, True, True, False, + False, True, True, False, False, False, False, + False, False, False, True, False, True, False, + False, False, True, True, False, False, True, False]) assert all(mask == expected) @@ -335,10 +335,10 @@ def test_bitflags_with_dataarray_without_flags(self): "CLOUD_MARGIN", "CLOUD_AMBIGUOUS", "LOWRW", "LAND"] mask = reduce(np.logical_or, [bflags[item] for item in items]) - expected = np.array([True, False, True, True, True, True, False, - False, True, True, False, False, False, False, - False, False, False, True, False, True, False, - False, False, True, True, False, False, True, + expected = np.array([True, False, True, True, True, True, False, + False, True, True, False, False, False, False, + False, False, False, True, False, True, False, + False, False, True, True, False, False, True, False]) assert all(mask == expected) @@ -367,9 +367,9 @@ def test_bitflags_with_custom_flag_list(self): "CLOUD_MARGIN", "CLOUD_AMBIGUOUS", "LOWRW", "LAND"] mask = reduce(np.logical_or, [bflags[item] for item in items]) - expected = np.array([True, False, True, True, True, True, False, - False, True, True, False, False, False, False, - False, False, False, True, False, True, False, - False, False, True, True, False, False, True, + expected = np.array([True, False, True, True, True, True, False, + False, True, True, False, False, False, False, + False, False, False, True, False, True, False, + False, False, True, True, False, False, True, False]) assert all(mask == expected) From 98993a45d327e11238466abe5f339909484c4328 Mon Sep 17 00:00:00 2001 From: andream Date: Tue, 23 Apr 2024 16:53:23 +0200 Subject: [PATCH 376/481] enhance documentation --- satpy/readers/li_l2_nc.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/satpy/readers/li_l2_nc.py b/satpy/readers/li_l2_nc.py index 09efecd688..dffc243c32 100644 --- a/satpy/readers/li_l2_nc.py +++ b/satpy/readers/li_l2_nc.py @@ -13,34 +13,50 @@ # You should have received a copy of the GNU General Public License # along with satpy. If not, see . -"""MTG Lightning Imager (LI) L2 unified reader. +"""MTG Lightning Imager (LI) Level-2 (L2) unified reader. This reader supports reading all the products from the LI L2 processing level: +Point products: * L2-LE Lightning Events * L2-LEF Lightning Events Filtered * L2-LFL Lightning Flashes * L2-LGR Lightning Groups +Accumulated products: * L2-AF Accumulated Flashes * L2-AFA Accumulated Flash Area * L2-AFR Accumulated Flash Radiance -Point-based products (LE, LEF, LFL, LGR) are provided as 1-D arrays, with a ``pyresample.geometry.SwathDefinition`` area +Per default, the unified LI L2 reader returns the data either as an 1-D array +or as a 2-D array depending on the product type. + +Point-based products (LE, LEF, LFL, LGR) are "classic" lightning products +consisting of values with attached latitude and longitude coordinates. +Hence, these products are provided by the reader as 1-D arrays, +with a ``pyresample.geometry.SwathDefinition`` area attribute containing the points lat-lon coordinates. -Accumulated products (AF, AFA, AFR) are provided as 2-D arrays in the FCI 2km grid as per intended usage, -with a ``pyresample.geometry.AreaDefinition`` area attribute containing the grid geolocation information. +Accumulated products (AF, AFA, AFR) are the result of temporal accumulation +of events (e.g. over 30 seconds), and are gridded in the FCI 2km geostationary +projection grid, in order to facilitate the synergistic usage together with FCI. +Compared to the point products, the gridded products also give information +about the spatial extent of the lightning activity. +Hence, these products are provided by the reader as 2-D arrays in the FCI 2km +grid as per intended usage, with a ``pyresample.geometry.AreaDefinition`` area +attribute containing the grid geolocation information. In this way, the products can directly be overlaid to FCI data. -If needed, the products can still be accessed as 1-d array by setting the reader kwarg ``with_area_definition=False``, -eg:: +If needed, the accumulated products can also be accessed as 1-d array by +setting the reader kwarg ``with_area_definition=False``, +e.g.:: scn = Scene(filenames=filenames, reader="li_l2_nc", reader_kwargs={'with_area_definition': False}) -The lat-lon coordinates of the points/grid pixels can be accessed using e.g. +For both 1-d and 2-d products, the lat-lon coordinates of the points/grid pixels +can be accessed using e.g. ``scn['dataset_name'].attrs['area'].get_lonlats()``. -See the LI L2 Product User Guide `PUG`_ for more information on the products. +See the LI L2 Product User Guide `PUG`_ for more information. .. _PUG: https://www-dr.eumetsat.int/media/49348 From 609fdcbbaa7ef76ac82eb38a9bb9a8abade93c2b Mon Sep 17 00:00:00 2001 From: Will Sharpe Date: Tue, 23 Apr 2024 16:31:42 +0000 Subject: [PATCH 377/481] fixed DNB_SENZ file_key --- satpy/etc/readers/viirs_l1b.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/readers/viirs_l1b.yaml b/satpy/etc/readers/viirs_l1b.yaml index 4622f7e415..8f5a417acf 100644 --- a/satpy/etc/readers/viirs_l1b.yaml +++ b/satpy/etc/readers/viirs_l1b.yaml @@ -481,7 +481,7 @@ datasets: resolution: 743 coordinates: [dnb_lon, dnb_lat] file_type: vgeod - file_key: geolocation_data/solar_zenith + file_key: geolocation_data/sensor_zenith DNB_LZA: name: dnb_lunar_zenith_angle standard_name: lunar_zenith_angle From aa18b7f247e8f289c9be415215cc9dd54fa787d5 Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Wed, 24 Apr 2024 18:04:37 +0300 Subject: [PATCH 378/481] Fix variable name overwriting module name --- satpy/tests/reader_tests/test_seviri_l1b_icare.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/tests/reader_tests/test_seviri_l1b_icare.py b/satpy/tests/reader_tests/test_seviri_l1b_icare.py index cb8a1fb6af..f75d22d385 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_icare.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_icare.py @@ -133,8 +133,8 @@ def test_load_dataset_vis(self): datasets = r.load(["VIS008"]) assert len(datasets) == 1 for v in datasets.values(): - dt = dt.datetime(2004, 12, 29, 12, 27, 44) - assert v.attrs["end_time"] == dt + date = dt.datetime(2004, 12, 29, 12, 27, 44) + assert v.attrs["end_time"] == date assert v.attrs["calibration"] == "reflectance" def test_load_dataset_ir(self): From 37301177ea7bded84500ca596c82e621a1b1ef4d Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Wed, 24 Apr 2024 18:28:58 +0300 Subject: [PATCH 379/481] Clarify variable naming --- satpy/readers/ahi_hsd.py | 4 ++-- satpy/readers/ahi_l2_nc.py | 8 ++++---- satpy/readers/goci2_l2_nc.py | 8 ++++---- satpy/readers/goes_imager_nc.py | 18 +++++++++--------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/satpy/readers/ahi_hsd.py b/satpy/readers/ahi_hsd.py index 7ea83a6820..cedc626408 100644 --- a/satpy/readers/ahi_hsd.py +++ b/satpy/readers/ahi_hsd.py @@ -794,8 +794,8 @@ def _modify_observation_time_for_nominal(self, observation_time): ) return observation_time timeline = self._get_closest_timeline(observation_time) - date = self._get_offset_relative_to_timeline() - return timeline + dt.timedelta(minutes=date//60, seconds=date % 60) + offset = self._get_offset_relative_to_timeline() + return timeline + dt.timedelta(minutes=offset//60, seconds=offset % 60) def _get_closest_timeline(self, observation_time): """Find the closest timeline for the given observation time. diff --git a/satpy/readers/ahi_l2_nc.py b/satpy/readers/ahi_l2_nc.py index 92c2915a1e..74872d5410 100644 --- a/satpy/readers/ahi_l2_nc.py +++ b/satpy/readers/ahi_l2_nc.py @@ -83,14 +83,14 @@ def __init__(self, filename, filename_info, filetype_info): @property def start_time(self): """Start timestamp of the dataset.""" - date = self.nc.attrs["time_coverage_start"] - return dt.datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ") + date_str = self.nc.attrs["time_coverage_start"] + return dt.datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%SZ") @property def end_time(self): """End timestamp of the dataset.""" - date = self.nc.attrs["time_coverage_end"] - return dt.datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ") + date_str = self.nc.attrs["time_coverage_end"] + return dt.datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%SZ") def get_dataset(self, key, info): """Load a dataset.""" diff --git a/satpy/readers/goci2_l2_nc.py b/satpy/readers/goci2_l2_nc.py index b60a3e3876..0679be41ff 100644 --- a/satpy/readers/goci2_l2_nc.py +++ b/satpy/readers/goci2_l2_nc.py @@ -66,14 +66,14 @@ def _merge_navigation_data(self, filetype): @property def start_time(self): """Start timestamp of the dataset.""" - date = self.attrs["observation_start_time"] - return dt.datetime.strptime(date, "%Y%m%d_%H%M%S") + date_str = self.attrs["observation_start_time"] + return dt.datetime.strptime(date_str, "%Y%m%d_%H%M%S") @property def end_time(self): """End timestamp of the dataset.""" - date = self.attrs["observation_end_time"] - return dt.datetime.strptime(date, "%Y%m%d_%H%M%S") + date_str = self.attrs["observation_end_time"] + return dt.datetime.strptime(date_str, "%Y%m%d_%H%M%S") def get_dataset(self, key, info): """Load a dataset.""" diff --git a/satpy/readers/goes_imager_nc.py b/satpy/readers/goes_imager_nc.py index 2916a36436..44a01e44f2 100644 --- a/satpy/readers/goes_imager_nc.py +++ b/satpy/readers/goes_imager_nc.py @@ -731,15 +731,15 @@ def _get_area_def_uniform_sampling(self, lon0, channel): @property def start_time(self): """Start timestamp of the dataset.""" - date = self.nc["time"].dt - return dt.datetime( - year=int(date.year.item()), - month=int(date.month.item()), - day=int(date.day.item()), - hour=int(date.hour.item()), - minute=int(date.minute.item()), - second=int(date.second.item()), - microsecond=int(date.microsecond.item())) + timestamp = self.nc["time"].dt + return dt.timestamptime( + year=int(timestamp.year.item()), + month=int(timestamp.month.item()), + day=int(timestamp.day.item()), + hour=int(timestamp.hour.item()), + minute=int(timestamp.minute.item()), + second=int(timestamp.second.item()), + microsecond=int(timestamp.microsecond.item())) @property def end_time(self): From d3a7ab035eba223338fb0c97fbcb4f82d1d5959b Mon Sep 17 00:00:00 2001 From: Simon Proud Date: Thu, 25 Apr 2024 09:06:34 +0200 Subject: [PATCH 380/481] Update MSI SAFE to use actual sensing time --- satpy/readers/msi_safe.py | 22 ++++------------------ satpy/tests/reader_tests/test_msi_safe.py | 10 ++++------ 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index 8c0fb730b7..5ec5ff3ea0 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -28,17 +28,6 @@ reader_kwargs={'mask_saturated': False}) scene.load(['B01']) -MSI data typically have the same start time across multiple tiles, which can cause -problems if iterating over multiple tiles, as the saved imagery from one tile -may be overwritten by the next tile. -To overcome this, the user can specify `use_tile_time`, which will determine the start -time from the tile metadata rather than from the filename:: - - scene = satpy.Scene(filenames, - reader='msi_safe', - reader_kwargs={'use_tile_time': True}) - scene.load(['B01']) - L1C format description for the files read here: https://sentinels.copernicus.eu/documents/247904/0/Sentinel-2-product-specifications-document-V14-9.pdf/ @@ -70,7 +59,7 @@ class SAFEMSIL1C(BaseFileHandler): """File handler for SAFE MSI files (jp2).""" - def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_saturated=True, use_tile_time=False): + def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_saturated=True): """Initialize the reader.""" super(SAFEMSIL1C, self).__init__(filename, filename_info, filetype_info) @@ -80,10 +69,7 @@ def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_s self._mda = mda self.platform_name = PLATFORMS[filename_info["fmission_id"]] - if use_tile_time: - self._start_time = self._tile_mda.start_time() - else: - self._start_time = filename_info["observation_time"] + self._start_time = self._tile_mda.start_time() self._end_time = filename_info["observation_time"] def get_dataset(self, key, info): @@ -128,7 +114,7 @@ def get_area_def(self, dsid): class SAFEMSIXMLMetadata(BaseFileHandler): """Base class for SAFE MSI XML metadata filehandlers.""" - def __init__(self, filename, filename_info, filetype_info, mask_saturated=True, use_tile_time=False): + def __init__(self, filename, filename_info, filetype_info, mask_saturated=True): """Init the reader.""" super().__init__(filename, filename_info, filetype_info) self._start_time = filename_info["observation_time"] @@ -244,7 +230,7 @@ def _fill_swath_edges(angles): class SAFEMSITileMDXML(SAFEMSIXMLMetadata): """File handle for sentinel 2 safe XML tile metadata.""" - def __init__(self, filename, filename_info, filetype_info, mask_saturated=True, use_tile_time=False): + def __init__(self, filename, filename_info, filetype_info, mask_saturated=True): """Init the reader.""" super().__init__(filename, filename_info, filetype_info, mask_saturated) self.geocoding = self.root.find(".//Tile_Geocoding") diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index e53cf9adfb..b919278bf5 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1012,14 +1012,12 @@ def test_calibration_and_masking(self, mask_saturated, calibration, expected): res = self.jp2_fh.get_dataset(make_dataid(name="B01", calibration=calibration), info=dict()) np.testing.assert_allclose(res, expected) - @pytest.mark.parametrize(("use_obs_time", "expected"), - [(True, tilemd_dt), - (False, fname_dt)]) - def test_start_time(self, use_obs_time, expected): + + def test_start_time(self): """Test that the correct start time is returned.""" from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.filename_info, mock.MagicMock()) self.jp2_fh = SAFEMSIL1C("somefile", self.filename_info, mock.MagicMock(), - mda, self.tile_mda, use_tile_time=use_obs_time) - assert expected == self.jp2_fh.start_time + mda, self.tile_mda) + assert tilemd_dt == self.jp2_fh.start_time From 3d926645d40dd839d91e1a18226ea200ca30773d Mon Sep 17 00:00:00 2001 From: Panu Lahtinen Date: Thu, 25 Apr 2024 14:35:45 +0300 Subject: [PATCH 381/481] Fix search/replace error --- satpy/readers/goes_imager_nc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/readers/goes_imager_nc.py b/satpy/readers/goes_imager_nc.py index 44a01e44f2..1c5b513f36 100644 --- a/satpy/readers/goes_imager_nc.py +++ b/satpy/readers/goes_imager_nc.py @@ -732,7 +732,7 @@ def _get_area_def_uniform_sampling(self, lon0, channel): def start_time(self): """Start timestamp of the dataset.""" timestamp = self.nc["time"].dt - return dt.timestamptime( + return dt.datetime( year=int(timestamp.year.item()), month=int(timestamp.month.item()), day=int(timestamp.day.item()), From de20173930b265a99decdb6fcd208b99682e838d Mon Sep 17 00:00:00 2001 From: clement laplace Date: Thu, 25 Apr 2024 12:03:04 +0000 Subject: [PATCH 382/481] style: Add the hyperlink in the fci_l1c_nc.py and do the corrections according to sauli in https://github.com/pytroll/satpy/pull/2778 --- satpy/etc/readers/fci_l1c_nc.yaml | 551 ++------------------ satpy/readers/fci_l1c_nc.py | 4 +- satpy/tests/reader_tests/test_fci_l1c_nc.py | 243 +++++---- 3 files changed, 169 insertions(+), 629 deletions(-) diff --git a/satpy/etc/readers/fci_l1c_nc.yaml b/satpy/etc/readers/fci_l1c_nc.yaml index 5f86ad2326..8f39097479 100644 --- a/satpy/etc/readers/fci_l1c_nc.yaml +++ b/satpy/etc/readers/fci_l1c_nc.yaml @@ -13,6 +13,35 @@ reader: # Source: MTG FCI L1 Product User Guide [FCIL1PUG] # https://www.eumetsat.int/media/45923 +required_netcdf_variables: &required-variables + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time + file_types: fci_l1c_fdhsi: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler @@ -21,34 +50,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-FDHSI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc", ] expected_segments: 40 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - vis_04 @@ -74,34 +76,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-HRFI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc", ] expected_segments: 40 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - vis_06_hr @@ -116,34 +91,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - vis_06 @@ -154,34 +102,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - vis_04 @@ -192,34 +113,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - vis_05 @@ -230,34 +124,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - vis_08 @@ -268,34 +135,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - vis_09 @@ -306,34 +146,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - nir_13 @@ -344,34 +157,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - nir_16 @@ -382,34 +168,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - nir_22 @@ -420,34 +179,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - ir_38 @@ -458,34 +190,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - wv_63 @@ -496,34 +201,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - wv_73 @@ -534,34 +212,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - ir_87 @@ -572,34 +223,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - ir_97 @@ -610,34 +234,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - ir_105 @@ -648,34 +245,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - ir_123 @@ -686,34 +256,7 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 - required_netcdf_variables: - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time + required_netcdf_variables: *required-variables variable_name_replacements: channel_name: - ir_133 diff --git a/satpy/readers/fci_l1c_nc.py b/satpy/readers/fci_l1c_nc.py index f90ae912d6..f94377b91c 100644 --- a/satpy/readers/fci_l1c_nc.py +++ b/satpy/readers/fci_l1c_nc.py @@ -31,8 +31,7 @@ This reader currently supports Full Disk High Spectral Resolution Imagery (FDHSI) ,High Spatial Resolution Fast Imagery (HRFI) data in full-disc ("FD") scanning mode. In addition it also supports the L1C format for the African dissemination ("AF"), where each file - contains the masked full-dic of a single channel - (https://www-cdn.eumetsat.int/files/2022-07/MTG%20EUMETCast%20Africa%20Product%20User%20Guide%20%5BAfricaPUG%5D_v2E.pdf) + contains the masked full-dic of a single channel see `AF PUG`_. If the user provides a list of both FDHSI and HRFI files from the same repeat cycle to the Satpy ``Scene``, Satpy will automatically read the channels from the source with the finest resolution, i.e. from the HRFI files for the vis_06, nir_22, ir_38, and ir_105 channels. @@ -107,6 +106,7 @@ If you use ``hdf5plugin``, make sure to add the line ``import hdf5plugin`` at the top of your script. +.. _AF PUG: https://www-cdn.eumetsat.int/files/2022-07/MTG%20EUMETCast%20Africa%20Product%20User%20Guide%20%5BAfricaPUG%5D_v2E.pdf .. _PUG: https://www-cdn.eumetsat.int/files/2020-07/pdf_mtg_fci_l1_pug.pdf .. _EUMETSAT: https://www.eumetsat.int/mtg-flexible-combined-imager # noqa: E501 .. _test data releases: https://www.eumetsat.int/mtg-test-data diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index 5710586466..52485a18d9 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -65,7 +65,127 @@ }, } +list_channel_solar = ["vis_04", "vis_05", "vis_06", "vis_08", "vis_09", + "nir_13", "nir_16", "nir_22"] +list_channel_terran = ["ir_38", "wv_63", "wv_73", "ir_87", "ir_97", "ir_105", + "ir_123", "ir_133"] +list_total_channel = list_channel_solar + list_channel_terran +list_resolution_v06 = ["1km","3km"] +list_resolution = ["3km"] +expected_pos_info_for_filetype = { + "fdhsi": {"1km": {"start_position_row": 1, + "end_position_row": 200, + "segment_height": 200, + "grid_width": 11136}, + "2km": {"start_position_row": 1, + "end_position_row": 100, + "segment_height": 100, + "grid_width": 5568}}, + "hrfi": {"500m": {"start_position_row": 1, + "end_position_row": 400, + "segment_height": 400, + "grid_width": 22272}, + "1km": {"start_position_row": 1, + "end_position_row": 200, + "grid_width": 11136, + "segment_height": 200}}, + "fci_af" : {"3km": {"start_position_row": 1, + "end_position_row": 67, + "segment_height": 67, + "grid_width": 3712 + }, + }, + "fci_af_vis_06" : {"3km": {"start_position_row": 1, + "end_position_row": 67, + "segment_height": 67, + "grid_width": 3712 + }, + "1km": {"start_position_row": 1, + "end_position_row": 200, + "grid_width": 11136, + "segment_height": 200} + } + } + +_chans_fdhsi = {"solar": list_channel_solar, + "solar_grid_type": ["1km"] * 8, + "terran": list_channel_terran, + "terran_grid_type": ["2km"] * 8} + +_chans_hrfi = {"solar": ["vis_06", "nir_22"], + "solar_grid_type": ["500m"] * 2, + "terran": ["ir_38", "ir_105"], + "terran_grid_type": ["1km"] * 2} + +dict_calibration = { "radiance" : {"dtype": np.float32, + "value_1": 15, + "value_0":9700, + "attrs_dict":{"calibration":"radiance", + "units":"mW m-2 sr-1 (cm-1)-1", + "radiance_unit_conversion_coefficient": np.float32(1234.56) + }, + }, + + "reflectance" : {"dtype": np.float32, + "attrs_dict":{"calibration":"reflectance", + "units":"%" + }, + }, + + "counts" : {"dtype": np.uint16, + "value_1": 1, + "value_0": 5000, + "attrs_dict":{"calibration":"counts", + "units":"count", + }, + }, + "brightness_temperature" : {"dtype": np.float32, + "value_1": np.float32(209.68275), + "value_0": np.float32(1888.8513), + "attrs_dict":{"calibration":"brightness_temperature", + "units":"K", + }, + }, +} +_test_filenames = {"fdhsi": [ + "W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--" + "CHK-BODY--L2P-NC4E_C_EUMT_20170410114434_GTT_DEV_" + "20170410113925_20170410113934_N__C_0070_0067.nc" +], + "hrfi": [ + "W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-HRFI-FD--" + "CHK-BODY--L2P-NC4E_C_EUMT_20170410114434_GTT_DEV_" + "20170410113925_20170410113934_N__C_0070_0067.nc" + ] +} + +def resolutions(channel): + """Get the resolutions.""" + if channel == "vis_06": + return list_resolution_v06 + else: + return list_resolution + +def fill_chans_af(): + """Fill the dict _chans_af with the right channel and resolution.""" + _chans_af = {} + for channel in list_total_channel: + list_resol = resolutions(channel) + for resol in list_resol: + chann_upp = channel.replace("_","").upper() + _test_filenames[f"af_{channel}_{resol}"] = [f"W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD" + f"-{resol.upper()}-AF-{chann_upp}-x-x---NC4E_C_EUMT_20240125144655_DT_OPE" + f"_20240109080007_20240109080924_N_JLS_T_0049_0000.nc"] + if channel.split("_")[0] in ["vis","nir"]: + _chans_af[f"{channel}_{resol}"] = {"solar":[channel], + "solar_grid_type": [resol]} + elif channel.split("_")[0] in ["ir","wv"]: + _chans_af[f"{channel}_{resol}"] = {"terran":[channel], + "terran_grid_type": [resol]} + return _chans_af + +_chans_af = fill_chans_af() # ---------------------------------------------------- # Filehandlers preparation --------------------------- # ---------------------------------------------------- @@ -403,56 +523,6 @@ def clear_cache(reader): for fh in fhs: fh.cached_file_content = {} -list_channel_solar = ["vis_04", "vis_05", "vis_06", "vis_08", "vis_09", - "nir_13", "nir_16", "nir_22"] -list_channel_terran = ["ir_38", "wv_63", "wv_73", "ir_87", "ir_97", "ir_105", - "ir_123", "ir_133"] -list_total_channel = list_channel_solar + list_channel_terran -list_resolution_v06 = ["1km","3km"] -list_resolution = ["3km"] -expected_pos_info_for_filetype = { - "fdhsi": {"1km": {"start_position_row": 1, - "end_position_row": 200, - "segment_height": 200, - "grid_width": 11136}, - "2km": {"start_position_row": 1, - "end_position_row": 100, - "segment_height": 100, - "grid_width": 5568}}, - "hrfi": {"500m": {"start_position_row": 1, - "end_position_row": 400, - "segment_height": 400, - "grid_width": 22272}, - "1km": {"start_position_row": 1, - "end_position_row": 200, - "grid_width": 11136, - "segment_height": 200}}, - "fci_af" : {"3km": {"start_position_row": 1, - "end_position_row": 67, - "segment_height": 67, - "grid_width": 3712 - }, - }, - "fci_af_vis_06" : {"3km": {"start_position_row": 1, - "end_position_row": 67, - "segment_height": 67, - "grid_width": 3712 - }, - "1km": {"start_position_row": 1, - "end_position_row": 200, - "grid_width": 11136, - "segment_height": 200} - } - } - - -def resolutions(channel): - """Get the resolutions.""" - if channel == "vis_06": - return list_resolution_v06 - else: - return list_resolution - def get_list_channel_calibration(calibration): """Get the channel's list according the calibration.""" if calibration == "reflectance": @@ -468,79 +538,6 @@ def generate_parameters(calibration): for resolution in resolutions(channel): yield (channel, resolution) -_chans_fdhsi = {"solar": list_channel_solar, - "solar_grid_type": ["1km"] * 8, - "terran": list_channel_terran, - "terran_grid_type": ["2km"] * 8} - -_chans_hrfi = {"solar": ["vis_06", "nir_22"], - "solar_grid_type": ["500m"] * 2, - "terran": ["ir_38", "ir_105"], - "terran_grid_type": ["1km"] * 2} - -dict_calibration = { "radiance" : {"dtype": np.float32, - "value_1": 15, - "value_0":9700, - "attrs_dict":{"calibration":"radiance", - "units":"mW m-2 sr-1 (cm-1)-1", - "radiance_unit_conversion_coefficient": np.float32(1234.56) - }, - }, - - "reflectance" : {"dtype": np.float32, - "attrs_dict":{"calibration":"reflectance", - "units":"%" - }, - }, - - "counts" : {"dtype": np.uint16, - "value_1": 1, - "value_0": 5000, - "attrs_dict":{"calibration":"counts", - "units":"count", - }, - }, - - "brightness_temperature" : {"dtype": np.float32, - "value_1": np.float32(209.68275), - "value_0": np.float32(1888.8513), - "attrs_dict":{"calibration":"brightness_temperature", - "units":"K", - }, - }, -} -_test_filenames = {"fdhsi": [ - "W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--" - "CHK-BODY--L2P-NC4E_C_EUMT_20170410114434_GTT_DEV_" - "20170410113925_20170410113934_N__C_0070_0067.nc" -], - "hrfi": [ - "W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-HRFI-FD--" - "CHK-BODY--L2P-NC4E_C_EUMT_20170410114434_GTT_DEV_" - "20170410113925_20170410113934_N__C_0070_0067.nc" - ] -} - -def fill_chans_af(): - """Fill the dict _chans_af with the right channel and resolution.""" - _chans_af = {} - for channel in list_total_channel: - list_resol = resolutions(channel) - for resol in list_resol: - chann_upp = channel.replace("_","").upper() - _test_filenames[f"af_{channel}_{resol}"] = [f"W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD" - f"-{resol.upper()}-AF-{chann_upp}-x-x---NC4E_C_EUMT_20240125144655_DT_OPE" - f"_20240109080007_20240109080924_N_JLS_T_0049_0000.nc"] - if channel.split("_")[0] in ["vis","nir"]: - _chans_af[f"{channel}_{resol}"] = {"solar":[channel], - "solar_grid_type": [resol]} - elif channel.split("_")[0] in ["ir","wv"]: - _chans_af[f"{channel}_{resol}"] = {"terran":[channel], - "terran_grid_type": [resol]} - return _chans_af - -_chans_af = fill_chans_af() - @contextlib.contextmanager def mocked_basefilehandler(filehandler): """Mock patch the base class of the FCIL1cNCFileHandler with the content of our fake files (filehandler).""" From 47a0fa2c3249f0117128bbce71f9b8f9e2edabe6 Mon Sep 17 00:00:00 2001 From: clement laplace Date: Thu, 25 Apr 2024 12:47:59 +0000 Subject: [PATCH 383/481] style: Put in uppercase the contant into the test_fci_l1c.py file --- satpy/tests/reader_tests/test_fci_l1c_nc.py | 62 ++++++++++----------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index 52485a18d9..56130190af 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -65,14 +65,14 @@ }, } -list_channel_solar = ["vis_04", "vis_05", "vis_06", "vis_08", "vis_09", +LIST_CHANNEL_SOLAR = ["vis_04", "vis_05", "vis_06", "vis_08", "vis_09", "nir_13", "nir_16", "nir_22"] -list_channel_terran = ["ir_38", "wv_63", "wv_73", "ir_87", "ir_97", "ir_105", +LIST_CHANNEL_TERRAN = ["ir_38", "wv_63", "wv_73", "ir_87", "ir_97", "ir_105", "ir_123", "ir_133"] -list_total_channel = list_channel_solar + list_channel_terran -list_resolution_v06 = ["1km","3km"] -list_resolution = ["3km"] -expected_pos_info_for_filetype = { +LIST_TOTAL_CHANNEL = LIST_CHANNEL_SOLAR + LIST_CHANNEL_TERRAN +LIST_RESOLUTION_V06 = ["1km","3km"] +LIST_RESOLUTION = ["3km"] +EXPECTED_POS_INFO_FOR_FILETYPE = { "fdhsi": {"1km": {"start_position_row": 1, "end_position_row": 200, "segment_height": 200, @@ -107,17 +107,17 @@ } } -_chans_fdhsi = {"solar": list_channel_solar, +_CHANS_FDHSI = {"solar": LIST_CHANNEL_SOLAR, "solar_grid_type": ["1km"] * 8, - "terran": list_channel_terran, + "terran": LIST_CHANNEL_TERRAN, "terran_grid_type": ["2km"] * 8} -_chans_hrfi = {"solar": ["vis_06", "nir_22"], +_CHANS_HRFI = {"solar": ["vis_06", "nir_22"], "solar_grid_type": ["500m"] * 2, "terran": ["ir_38", "ir_105"], "terran_grid_type": ["1km"] * 2} -dict_calibration = { "radiance" : {"dtype": np.float32, +DICT_CALIBRATION = { "radiance" : {"dtype": np.float32, "value_1": 15, "value_0":9700, "attrs_dict":{"calibration":"radiance", @@ -163,14 +163,14 @@ def resolutions(channel): """Get the resolutions.""" if channel == "vis_06": - return list_resolution_v06 + return LIST_RESOLUTION_V06 else: - return list_resolution + return LIST_RESOLUTION def fill_chans_af(): - """Fill the dict _chans_af with the right channel and resolution.""" - _chans_af = {} - for channel in list_total_channel: + """Fill the dict _CHANS_AF and the list _test_filenames with the right channel and resolution.""" + _CHANS_AF = {} + for channel in LIST_TOTAL_CHANNEL: list_resol = resolutions(channel) for resol in list_resol: chann_upp = channel.replace("_","").upper() @@ -178,14 +178,14 @@ def fill_chans_af(): f"-{resol.upper()}-AF-{chann_upp}-x-x---NC4E_C_EUMT_20240125144655_DT_OPE" f"_20240109080007_20240109080924_N_JLS_T_0049_0000.nc"] if channel.split("_")[0] in ["vis","nir"]: - _chans_af[f"{channel}_{resol}"] = {"solar":[channel], + _CHANS_AF[f"{channel}_{resol}"] = {"solar":[channel], "solar_grid_type": [resol]} elif channel.split("_")[0] in ["ir","wv"]: - _chans_af[f"{channel}_{resol}"] = {"terran":[channel], + _CHANS_AF[f"{channel}_{resol}"] = {"terran":[channel], "terran_grid_type": [resol]} - return _chans_af + return _CHANS_AF,_test_filenames -_chans_af = fill_chans_af() +_CHANS_AF,_test_filenames = fill_chans_af() # ---------------------------------------------------- # Filehandlers preparation --------------------------- # ---------------------------------------------------- @@ -526,11 +526,11 @@ def clear_cache(reader): def get_list_channel_calibration(calibration): """Get the channel's list according the calibration.""" if calibration == "reflectance": - return list_channel_solar + return LIST_CHANNEL_SOLAR elif calibration == "brightness_temperature": - return list_channel_terran + return LIST_CHANNEL_TERRAN else: - return list_total_channel + return LIST_TOTAL_CHANNEL def generate_parameters(calibration): """Generate dinamicaly the parameters.""" @@ -553,7 +553,7 @@ def FakeFCIFileHandlerFDHSI_fixture(): with mocked_basefilehandler(FakeFCIFileHandlerFDHSI): param_dict = { "filetype": "fci_l1c_fdhsi", - "channels": _chans_fdhsi, + "channels": _CHANS_FDHSI, "filenames": _test_filenames["fdhsi"] } yield param_dict @@ -565,7 +565,7 @@ def FakeFCIFileHandlerHRFI_fixture(): with mocked_basefilehandler(FakeFCIFileHandlerHRFI): param_dict = { "filetype": "fci_l1c_hrfi", - "channels": _chans_hrfi, + "channels": _CHANS_HRFI, "filenames": _test_filenames["hrfi"] } yield param_dict @@ -579,7 +579,7 @@ def FakeFCIFileHandlerAF_fixture(channel,resolution): with mocked_basefilehandler(FakeFCIFileHandlerAF): param_dict = { "filetype": "fci_l1c_af", - "channels": _chans_af[f"{channel}_{resolution}"], + "channels": _CHANS_AF[f"{channel}_{resolution}"], "filenames": _test_filenames[f"af_{channel}_{resolution}"], } yield param_dict @@ -592,9 +592,9 @@ def FakeFCIFileHandlerAF_fixture(channel,resolution): class TestFCIL1cNCReader: """Test FCI L1c NetCDF reader with nominal data.""" - fh_param_for_filetype = {"hrfi": {"channels": _chans_hrfi, + fh_param_for_filetype = {"hrfi": {"channels": _CHANS_HRFI, "filenames": _test_filenames["hrfi"]}, - "fdhsi": {"channels": _chans_fdhsi, + "fdhsi": {"channels": _CHANS_FDHSI, "filenames": _test_filenames["fdhsi"]}} def _get_type_ter_AF(self,channel): @@ -682,7 +682,7 @@ def test_load_calibration(self, reader_configs, fh_param, assert expected_res_n[res_type] == len(res) for ch, grid_type in zip(list_chan, list_grid): - self._get_assert_load(res,ch,grid_type,dict_calibration[calibration]) + self._get_assert_load(res,ch,grid_type,DICT_CALIBRATION[calibration]) @pytest.mark.parametrize(("calibration", "channel", "resolution"), [ (calibration, channel, resolution) @@ -700,7 +700,7 @@ def test_load_calibration_af(self,FakeFCIFileHandlerAF_fixture,reader_configs,ch assert expected_res_n == len(res) for ch, grid_type in zip(fh_param["channels"][type_ter], fh_param["channels"][f"{type_ter}_grid_type"]): - self._get_assert_load(res,ch,grid_type,dict_calibration[calibration]) + self._get_assert_load(res,ch,grid_type,DICT_CALIBRATION[calibration]) @pytest.mark.parametrize("fh_param", [(lazy_fixture("FakeFCIFileHandlerFDHSI_fixture")), @@ -726,8 +726,8 @@ def test_orbital_parameters_attr(self, reader_configs, fh_param): } @pytest.mark.parametrize(("fh_param", "expected_pos_info"), [ - (lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), expected_pos_info_for_filetype["fdhsi"]), - (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), expected_pos_info_for_filetype["hrfi"]) + (lazy_fixture("FakeFCIFileHandlerFDHSI_fixture"), EXPECTED_POS_INFO_FOR_FILETYPE["fdhsi"]), + (lazy_fixture("FakeFCIFileHandlerHRFI_fixture"), EXPECTED_POS_INFO_FOR_FILETYPE["hrfi"]) ]) def test_get_segment_position_info(self, reader_configs, fh_param, expected_pos_info): """Test the segment position info method.""" From 391f04bd375960efb854d955a7b815ba01edc68d Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 28 Apr 2024 22:38:16 +0800 Subject: [PATCH 384/481] reader and composites --- satpy/etc/composites/mersi-1.yaml | 73 ++++ satpy/etc/readers/fy3a_mersi1_l1b.yaml | 422 ++++++++++++++++++++++ satpy/etc/readers/fy3b_mersi1_l1b.yaml | 428 ++++++++++++++++++++++ satpy/etc/readers/fy3c_mersi1_l1b.yaml | 480 +++++++++++++++++++++++++ satpy/readers/mersi_l1b.py | 65 +++- 5 files changed, 1453 insertions(+), 15 deletions(-) create mode 100644 satpy/etc/composites/mersi-1.yaml create mode 100644 satpy/etc/readers/fy3a_mersi1_l1b.yaml create mode 100644 satpy/etc/readers/fy3b_mersi1_l1b.yaml create mode 100644 satpy/etc/readers/fy3c_mersi1_l1b.yaml diff --git a/satpy/etc/composites/mersi-1.yaml b/satpy/etc/composites/mersi-1.yaml new file mode 100644 index 0000000000..fce0127697 --- /dev/null +++ b/satpy/etc/composites/mersi-1.yaml @@ -0,0 +1,73 @@ +sensor_name: visir/mersi-1 + +modifiers: + rayleigh_corrected: + modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance + atmosphere: us-standard + aerosol_type: rayleigh_only + prerequisites: + - name: '3' + modifiers: [sunz_corrected] + optional_prerequisites: + - name: satellite_azimuth_angle + - name: satellite_zenith_angle + - name: solar_azimuth_angle + - name: solar_zenith_angle + + # sunz_corrected: + # modifier: !!python/name:satpy.modifiers.SunZenithCorrector + # prerequisites: + # - solar_zenith_angle + + nir_reflectance: + modifier: !!python/name:satpy.modifiers.NIRReflectance + prerequisites: + - name: '24' + optional_prerequisites: + - solar_zenith_angle + + +composites: + colorized_ir: + compositor: !!python/name:satpy.composites.SingleBandCompositor + prerequisites: + - name: '5' + standard_name: colorized_ir_clouds + + true_color_uncorr: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: '3' + modifiers: [sunz_corrected] + - name: '2' + modifiers: [sunz_corrected] + - name: '1' + modifiers: [sunz_corrected] + standard_name: true_color + + natural_color: + compositor: !!python/name:satpy.composites.RatioSharpenedRGB + prerequisites: + - name: '6' + modifiers: [sunz_corrected] + - name: '16' + modifiers: [sunz_corrected] + - name: '3' + modifiers: [sunz_corrected] + optional_prerequisites: + - name: '4' + modifiers: [sunz_corrected] + high_resolution_band: green + neutral_resolution_band: blue + standard_name: natural_color + + overview: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: '3' + modifiers: [sunz_corrected] + - name: '4' + modifiers: [sunz_corrected] + - name: '5' + standard_name: overview + diff --git a/satpy/etc/readers/fy3a_mersi1_l1b.yaml b/satpy/etc/readers/fy3a_mersi1_l1b.yaml new file mode 100644 index 0000000000..2db2617f6d --- /dev/null +++ b/satpy/etc/readers/fy3a_mersi1_l1b.yaml @@ -0,0 +1,422 @@ +reader: + name: fy3a_mersi1_l1b + short_name: FY3A MERSI-1 l1b + long_name: FY-3A MERSI-1 L1B data in HDF5 format + description: FY-3A Medium Resolution Spectral Imager 1 (MERSI-1) L1B Reader + status: Beta + supports_fsspec: false + sensors: [mersi-1] + reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader + +file_types: + fy3a_mersi1_l1b_1000: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 10 + file_patterns: + - 'FY3A_MERSI_GBAL_L1_{start_time:%Y%m%d_%H%M}_1000M_MS.{ext:3s}' + + fy3a_mersi1_l1b_250: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 40 + file_patterns: + - 'FY3A_MERSI_GBAL_L1_{start_time:%Y%m%d_%H%M}_0250M_MS.{ext:3s}' + +datasets: + '1': + name: '1' + wavelength: [0.445, 0.470, 0.495] + resolution: + 1000: + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_RefSB + band_index: 0 + 250: + file_type: fy3a_mersi1_l1b_250 + file_key: EV_250_RefSB_b1 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '2': + name: '2' + wavelength: [0.525, 0.550, 0.575] + resolution: + 1000: + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_RefSB + band_index: 1 + 250: + file_type: fy3a_mersi1_l1b_250 + file_key: EV_250_RefSB_b2 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '3': + name: '3' + wavelength: [0.625, 0.650, 0.675] + resolution: + 1000: + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_RefSB + band_index: 2 + 250: + file_type: fy3a_mersi1_l1b_250 + file_key: EV_250_RefSB_b3 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '4': + name: '4' + wavelength: [0.840, 0.865, 0.890] + resolution: + 1000: + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_RefSB + band_index: 3 + 250: + file_type: fy3a_mersi1_l1b_250 + file_key: EV_250_RefSB_b4 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '5': + name: '5' + wavelength: [10, 11.25, 12.5] + resolution: + 1000: + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_Emissive + 250: + file_type: fy3a_mersi1_l1b_250 + file_key: EV_250_Emissive + coordinates: [longitude, latitude] + calibration: + brightness_temperature: + units: "K" + standard_name: toa_brightness_temperature + counts: + units: "1" + standard_name: counts + + '6': + name: '6' + wavelength: [1.615, 1.640, 1.665] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 0 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '7': + name: '7' + wavelength: [2.105, 2.130, 2.155] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 1 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '8': + name: '8' + wavelength: [0.402, 0.412, 0.422] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 2 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '9': + name: '9' + wavelength: [0.433, 0.443, 0.453] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 3 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '10': + name: '10' + wavelength: [0.480, 0.490, 0.500] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 4 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '11': + name: '11' + wavelength: [0.510, 0.520, 0.530] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 5 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '12': + name: '12' + wavelength: [0.555, 0.565, 0.575] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 6 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '13': + name: '13' + wavelength: [0.640, 0.650, 0.660] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 7 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '14': + name: '14' + wavelength: [0.675, 0.685, 0.695] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 8 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '15': + name: '15' + wavelength: [0.755, 0.765, 0.775] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 9 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '16': + name: '16' + wavelength: [0.855, 0.865, 0.875] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 10 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '17': + name: '17' + wavelength: [0.895, 0.905, 0.915] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 11 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '18': + name: '18' + wavelength: [0.930, 0.940, 0.950] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 12 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '19': + name: '19' + wavelength: [0.970, 0.980, 0.990] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 13 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '20': + name: '20' + wavelength: [1.020, 1.030, 1.040] + resolution: 1000 + file_type: fy3a_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 14 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + longitude: + name: longitude + units: degrees_east + standard_name: longitude + resolution: + 1000: + file_type: fy3a_mersi1_l1b_1000 + file_key: Longitude + 250: + file_type: fy3a_mersi1_l1b_250 + file_key: Longitude + + latitude: + name: latitude + units: degrees_north + standard_name: latitude + resolution: + 1000: + file_type: fy3a_mersi1_l1b_1000 + file_key: Latitude + 250: + file_type: fy3a_mersi1_l1b_250 + file_key: Latitude + + solar_zenith_angle: + name: solar_zenith_angle + units: degree + standard_name: solar_zenith_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3a_mersi1_l1b_1000 + file_key: SolarZenith + + solar_azimuth_angle: + name: solar_azimuth_angle + units: degree + standard_name: solar_azimuth_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3a_mersi1_l1b_1000 + file_key: SolarAzimuth + + satellite_zenith_angle: + name: satellite_zenith_angle + units: degree + standard_name: sensor_zenith_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3a_mersi1_l1b_1000 + file_key: SensorZenith + + satellite_azimuth_angle: + name: satellite_azimuth_angle + units: degree + standard_name: sensor_azimuth_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3a_mersi1_l1b_1000 + file_key: SensorAzimuth diff --git a/satpy/etc/readers/fy3b_mersi1_l1b.yaml b/satpy/etc/readers/fy3b_mersi1_l1b.yaml new file mode 100644 index 0000000000..464c079868 --- /dev/null +++ b/satpy/etc/readers/fy3b_mersi1_l1b.yaml @@ -0,0 +1,428 @@ +reader: + name: fy3b_mersi1_l1b + short_name: FY3B MERSI-1 l1b + long_name: FY-3B MERSI-1 L1B data in HDF5 format + description: FY-3B Medium Resolution Spectral Imager 1 (MERSI-1) L1B Reader + status: Beta + supports_fsspec: false + sensors: [mersi-1] + reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader + +file_types: + fy3b_mersi1_l1b_1000: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 10 + file_patterns: + - 'FY3B_MERSI_GBAL_L1_{start_time:%Y%m%d_%H%M}_1000M_MS.{ext:3s}' + + fy3b_mersi1_l1b_250: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 40 + file_patterns: + - 'FY3B_MERSI_GBAL_L1_{start_time:%Y%m%d_%H%M}_0250M_MS.{ext:3s}' + + fy3b_mersi1_l1b_geo: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 40 + file_patterns: + - 'FY3B_MERSI_GBAL_L1_{start_time:%Y%m%d_%H%M}_GEOXX_MS.{ext:3s}' + +datasets: + '1': + name: '1' + wavelength: [0.445, 0.470, 0.495] + resolution: + 1000: + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_RefSB + band_index: 0 + 250: + file_type: fy3b_mersi1_l1b_250 + file_key: EV_250_RefSB_b1 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '2': + name: '2' + wavelength: [0.525, 0.550, 0.575] + resolution: + 1000: + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_RefSB + band_index: 1 + 250: + file_type: fy3b_mersi1_l1b_250 + file_key: EV_250_RefSB_b2 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '3': + name: '3' + wavelength: [0.625, 0.650, 0.675] + resolution: + 1000: + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_RefSB + band_index: 2 + 250: + file_type: fy3b_mersi1_l1b_250 + file_key: EV_250_RefSB_b3 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '4': + name: '4' + wavelength: [0.840, 0.865, 0.890] + resolution: + 1000: + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_RefSB + band_index: 3 + 250: + file_type: fy3b_mersi1_l1b_250 + file_key: EV_250_RefSB_b4 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '5': + name: '5' + wavelength: [10, 11.25, 12.5] + resolution: + 1000: + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_250_Aggr.1KM_Emissive + 250: + file_type: fy3b_mersi1_l1b_250 + file_key: EV_250_Emissive + coordinates: [longitude, latitude] + calibration: + brightness_temperature: + units: "K" + standard_name: toa_brightness_temperature + counts: + units: "1" + standard_name: counts + + '6': + name: '6' + wavelength: [1.615, 1.640, 1.665] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 0 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '7': + name: '7' + wavelength: [2.105, 2.130, 2.155] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 1 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '8': + name: '8' + wavelength: [0.402, 0.412, 0.422] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 2 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '9': + name: '9' + wavelength: [0.433, 0.443, 0.453] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 3 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '10': + name: '10' + wavelength: [0.480, 0.490, 0.500] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 4 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '11': + name: '11' + wavelength: [0.510, 0.520, 0.530] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 5 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '12': + name: '12' + wavelength: [0.555, 0.565, 0.575] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 6 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '13': + name: '13' + wavelength: [0.640, 0.650, 0.660] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 7 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '14': + name: '14' + wavelength: [0.675, 0.685, 0.695] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 8 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '15': + name: '15' + wavelength: [0.755, 0.765, 0.775] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 9 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '16': + name: '16' + wavelength: [0.855, 0.865, 0.875] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 10 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '17': + name: '17' + wavelength: [0.895, 0.905, 0.915] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 11 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '18': + name: '18' + wavelength: [0.930, 0.940, 0.950] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 12 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '19': + name: '19' + wavelength: [0.970, 0.980, 0.990] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 13 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '20': + name: '20' + wavelength: [1.020, 1.030, 1.040] + resolution: 1000 + file_type: fy3b_mersi1_l1b_1000 + file_key: EV_1KM_RefSB + band_index: 14 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + longitude: + name: longitude + units: degrees_east + standard_name: longitude + resolution: + 1000: + file_type: fy3b_mersi1_l1b_1000 + file_key: Longitude + 250: + file_type: fy3b_mersi1_l1b_geo + file_key: Longitude + + latitude: + name: latitude + units: degrees_north + standard_name: latitude + resolution: + 1000: + file_type: fy3b_mersi1_l1b_1000 + file_key: Latitude + 250: + file_type: fy3b_mersi1_l1b_geo + file_key: Latitude + + solar_zenith_angle: + name: solar_zenith_angle + units: degree + standard_name: solar_zenith_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3b_mersi1_l1b_1000 + file_key: SolarZenith + + solar_azimuth_angle: + name: solar_azimuth_angle + units: degree + standard_name: solar_azimuth_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3b_mersi1_l1b_1000 + file_key: SolarAzimuth + + satellite_zenith_angle: + name: satellite_zenith_angle + units: degree + standard_name: sensor_zenith_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3b_mersi1_l1b_1000 + file_key: SensorZenith + + satellite_azimuth_angle: + name: satellite_azimuth_angle + units: degree + standard_name: sensor_azimuth_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3b_mersi1_l1b_1000 + file_key: SensorAzimuth diff --git a/satpy/etc/readers/fy3c_mersi1_l1b.yaml b/satpy/etc/readers/fy3c_mersi1_l1b.yaml new file mode 100644 index 0000000000..31c52d5ee5 --- /dev/null +++ b/satpy/etc/readers/fy3c_mersi1_l1b.yaml @@ -0,0 +1,480 @@ +reader: + name: fy3c_mersi1_l1b + short_name: FY3C MERSI-1 l1b + long_name: FY-3C MERSI-1 L1B data in HDF5 format + description: FY-3B Medium Resolution Spectral Imager 1 (MERSI-1) L1B Reader + status: Beta + supports_fsspec: false + sensors: [mersi-1] + reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader + +file_types: + fy3c_mersi1_l1b_1000: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 10 + file_patterns: + - 'FY3C_MERSI_GBAL_L1_{start_time:%Y%m%d_%H%M}_1000M_MS.{ext:3s}' + + fy3c_mersi1_l1b_250: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 40 + file_patterns: + - 'FY3C_MERSI_GBAL_L1_{start_time:%Y%m%d_%H%M}_0250M_MS.{ext:3s}' + + fy3c_mersi1_l1b_1000_geo: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 10 + file_patterns: + - 'FY3C_MERSI_GBAL_L1_{start_time:%Y%m%d_%H%M}_GEO1K_MS.{ext:3s}' + + fy3c_mersi1_l1b_250_geo: + file_reader: !!python/name:satpy.readers.mersi_l1b.MERSIL1B + rows_per_scan: 40 + file_patterns: + - 'FY3C_MERSI_GBAL_L1_{start_time:%Y%m%d_%H%M}_GEOQK_MS.{ext:3s}' + +datasets: + '1': + name: '1' + wavelength: [0.445, 0.470, 0.495] + resolution: + 1000: + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_250_Aggr.1KM_RefSB + band_index: 0 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 0 + 250: + file_type: fy3c_mersi1_l1b_250 + file_key: Data/EV_250_RefSB_b1 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 0 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '2': + name: '2' + wavelength: [0.525, 0.550, 0.575] + resolution: + 1000: + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_250_Aggr.1KM_RefSB + band_index: 1 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 1 + 250: + file_type: fy3c_mersi1_l1b_250 + file_key: Data/EV_250_RefSB_b2 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 1 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '3': + name: '3' + wavelength: [0.625, 0.650, 0.675] + resolution: + 1000: + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_250_Aggr.1KM_RefSB + band_index: 2 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 2 + 250: + file_type: fy3c_mersi1_l1b_250 + file_key: Data/EV_250_RefSB_b3 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 2 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '4': + name: '4' + wavelength: [0.840, 0.865, 0.890] + resolution: + 1000: + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_250_Aggr.1KM_RefSB + band_index: 3 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 3 + 250: + file_type: fy3c_mersi1_l1b_250 + file_key: Data/EV_250_RefSB_b4 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 3 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '5': + name: '5' + wavelength: [10, 11.25, 12.5] + resolution: + 1000: + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_250_Aggr.1KM_Emissive + 250: + file_type: fy3c_mersi1_l1b_250 + file_key: Data/EV_250_Emissive + coordinates: [longitude, latitude] + calibration: + brightness_temperature: + units: "K" + standard_name: toa_brightness_temperature + counts: + units: "1" + standard_name: counts + + '6': + name: '6' + wavelength: [1.615, 1.640, 1.665] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 0 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 4 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '7': + name: '7' + wavelength: [2.105, 2.130, 2.155] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 1 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 5 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '8': + name: '8' + wavelength: [0.402, 0.412, 0.422] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 2 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 6 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '9': + name: '9' + wavelength: [0.433, 0.443, 0.453] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 3 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 7 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '10': + name: '10' + wavelength: [0.480, 0.490, 0.500] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 4 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 8 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '11': + name: '11' + wavelength: [0.510, 0.520, 0.530] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 5 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 9 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '12': + name: '12' + wavelength: [0.555, 0.565, 0.575] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 6 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 10 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '13': + name: '13' + wavelength: [0.640, 0.650, 0.660] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 7 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 11 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '14': + name: '14' + wavelength: [0.675, 0.685, 0.695] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 8 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 12 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '15': + name: '15' + wavelength: [0.755, 0.765, 0.775] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 9 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 13 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '16': + name: '16' + wavelength: [0.855, 0.865, 0.875] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 10 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 14 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '17': + name: '17' + wavelength: [0.895, 0.905, 0.915] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 11 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 15 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '18': + name: '18' + wavelength: [0.930, 0.940, 0.950] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 12 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 16 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '19': + name: '19' + wavelength: [0.970, 0.980, 0.990] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 13 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 17 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + '20': + name: '20' + wavelength: [1.020, 1.030, 1.040] + resolution: 1000 + file_type: fy3c_mersi1_l1b_1000 + file_key: Data/EV_1KM_RefSB + band_index: 14 + calibration_key: Calibration/VIS_Cal_Coeff + calibration_index: 18 + coordinates: [longitude, latitude] + calibration: + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts + + longitude: + name: longitude + units: degrees_east + standard_name: longitude + resolution: + 1000: + file_type: fy3c_mersi1_l1b_1000_geo + file_key: Geolocation/Longitude + 250: + file_type: fy3c_mersi1_l1b_250_geo + file_key: Longitude + + latitude: + name: latitude + units: degrees_north + standard_name: latitude + resolution: + 1000: + file_type: fy3c_mersi1_l1b_1000_geo + file_key: Geolocation/Latitude + 250: + file_type: fy3c_mersi1_l1b_250_geo + file_key: Latitude + + solar_zenith_angle: + name: solar_zenith_angle + units: degree + standard_name: solar_zenith_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3c_mersi1_l1b_1000_geo + file_key: Geolocation/SolarZenith + + solar_azimuth_angle: + name: solar_azimuth_angle + units: degree + standard_name: solar_azimuth_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3c_mersi1_l1b_1000_geo + file_key: Geolocation/SolarAzimuth + + satellite_zenith_angle: + name: satellite_zenith_angle + units: degree + standard_name: sensor_zenith_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3c_mersi1_l1b_1000_geo + file_key: Geolocation/SensorZenith + + satellite_azimuth_angle: + name: satellite_azimuth_angle + units: degree + standard_name: sensor_azimuth_angle + resolution: 1000 + coordinates: [longitude, latitude] + file_type: fy3c_mersi1_l1b_1000_geo + file_key: Geolocation/SensorAzimuth diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 7675bd1624..f615ee2d40 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -33,10 +33,17 @@ from satpy.readers.hdf5_utils import HDF5FileHandler N_TOT_IR_CHANS_LL = 6 +PLATFORMS_INSTRUMENTS = {"FY-3A": "mersi-1", + "FY-3B": "mersi-1", + "FY-3C": "mersi-1", + "FY-3D": "mersi-2", + "FY-3E": "mersi-ll", + "FY-3F": "mersi-3", + "FY-3G": "mersi-rm"} class MERSIL1B(HDF5FileHandler): - """MERSI-2/MERSI-LL/MERSI-RM L1B file reader.""" + """MERSI-1/MERSI-2/MERSI-LL/MERSI-RM L1B file reader.""" def _strptime(self, date_attr, time_attr): """Parse date/time strings.""" @@ -59,13 +66,12 @@ def end_time(self): @property def sensor_name(self): """Map sensor name to Satpy 'standard' sensor names.""" - file_sensor = self["/attr/Sensor Identification Code"] - sensor = { - "MERSI": "mersi-2", - "MERSI LL": "mersi-ll", - "MERSI RM": "mersi-rm", - }.get(file_sensor, file_sensor) - return sensor + return PLATFORMS_INSTRUMENTS.get(self.platform_name) + + @property + def platform_name(self): + """Platform name.""" + return self["/attr/Satellite Name"] def get_refl_mult(self): """Get reflectance multiplier.""" @@ -84,6 +90,7 @@ def _get_single_slope_intercept(self, slope, intercept, cal_index): return slope[cal_index], intercept[cal_index] def _get_coefficients(self, cal_key, cal_index): + """Get VIS calibration coeffs from calibration datasets""" coeffs = self[cal_key][cal_index] slope = coeffs.attrs.pop("Slope", None) intercept = coeffs.attrs.pop("Intercept", None) @@ -93,11 +100,25 @@ def _get_coefficients(self, cal_key, cal_index): coeffs = coeffs * slope + intercept return coeffs + def _get_coefficients_mersi1(self, band_index): + """Get VIS calibration coeffs from attributes. Only for MERSI-1 on FY-3A/B""" + try: + # This is found in the actual file. + coeffs = self["/attr/VIR_Cal_Coeff"] + except KeyError: + # This is in the official manual. + coeffs = self["/attr/VIS_Cal_Coeff"] + coeffs = coeffs.reshape(19, 3) + if band_index is not None: + coeffs = coeffs[band_index] + return coeffs + def get_dataset(self, dataset_id, ds_info): """Load data variable and metadata and calibrate if needed.""" file_key = ds_info.get("file_key", dataset_id["name"]) band_index = ds_info.get("band_index") data = self[file_key] + if band_index is not None: data = data[band_index] if data.ndim >= 2: @@ -115,18 +136,26 @@ def get_dataset(self, dataset_id, ds_info): if band_index is not None and slope.size > 1: slope = slope[band_index] intercept = intercept[band_index] + # There's a bug in the slope for MERSI-1 11.25(5) + if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" and slope in [100, 1]: + slope = 0.01 data = data * slope + intercept if dataset_id.get("calibration") == "reflectance": - coeffs = self._get_coefficients(ds_info["calibration_key"], - ds_info["calibration_index"]) + # Only FY-3A/B stores VIS calibration coefficients in attributes + coeffs = self._get_coefficients_mersi1(band_index) if self.platform_name in ["FY-3A", "FY-3B"] else \ + self._get_coefficients(ds_info["calibration_key"], + ds_info["calibration_index"]) + data = coeffs[0] + coeffs[1] * data + coeffs[2] * data ** 2 data = data * self.get_refl_mult() + elif dataset_id.get("calibration") == "brightness_temperature": - calibration_index = ds_info["calibration_index"] # Converts um^-1 (wavenumbers) and (mW/m^2)/(str/cm^-1) (radiance data) # to SI units m^-1, mW*m^-3*str^-1. wave_number = 1. / (dataset_id["wavelength"][1] / 1e6) + # MERSI-1 doesn't have additional corrections + calibration_index = None if self.sensor_name == "mersi-1" else ds_info["calibration_index"] data = self._get_bt_dataset(data, calibration_index, wave_number) data.attrs = attrs @@ -137,7 +166,7 @@ def get_dataset(self, dataset_id, ds_info): data.attrs[key] = val.decode("utf8") data.attrs.update({ - "platform_name": self["/attr/Satellite Name"], + "platform_name": self.platform_name, "sensor": self.sensor_name, }) @@ -145,7 +174,8 @@ def get_dataset(self, dataset_id, ds_info): def _mask_data(self, data, dataset_id, attrs): """Mask the data using fill_value and valid_range attributes.""" - fill_value = attrs.pop("FillValue", np.nan) # covered by valid_range + fill_value = attrs.pop("_FillValue", np.nan) if self.platform_name in ["FY-3A", "FY-3B"] else \ + attrs.pop("FillValue", np.nan) # covered by valid_range valid_range = attrs.pop("valid_range", None) if dataset_id.get("calibration") == "counts": # preserve integer type of counts if possible @@ -156,8 +186,13 @@ def _mask_data(self, data, dataset_id, attrs): if valid_range is not None: # Due to a bug in the valid_range upper limit in the 10.8(24) and 12.0(25) # in the HDF data, this is hardcoded here. - if dataset_id["name"] in ["24", "25"] and valid_range[1] == 4095: - valid_range[1] = 25000 + if self.sensor_name == "mersi-2": + if dataset_id["name"] in ["24", "25"] and valid_range[1] == 4095: + valid_range[1] = 25000 + # Similar bug also found in MERSI-1 + elif self.sensor_name == "mersi-1": + if dataset_id["name"] == "5" and valid_range[1] == 4095: + valid_range[1] = 25000 # typically bad_values == 65535, saturated == 65534 # dead detector == 65533 data = data.where((data >= valid_range[0]) & From a54b641049e331e7e3d995d3c11a8c9862ced798 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 28 Apr 2024 22:50:36 +0800 Subject: [PATCH 385/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index f615ee2d40..ced1deb0ab 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -118,7 +118,6 @@ def get_dataset(self, dataset_id, ds_info): file_key = ds_info.get("file_key", dataset_id["name"]) band_index = ds_info.get("band_index") data = self[file_key] - if band_index is not None: data = data[band_index] if data.ndim >= 2: From b0aa1fd91bd09a3ed6c90efae0a33d55e411cc59 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 28 Apr 2024 22:53:44 +0800 Subject: [PATCH 386/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index ced1deb0ab..5c9f68713e 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -90,7 +90,7 @@ def _get_single_slope_intercept(self, slope, intercept, cal_index): return slope[cal_index], intercept[cal_index] def _get_coefficients(self, cal_key, cal_index): - """Get VIS calibration coeffs from calibration datasets""" + """Get VIS calibration coeffs from calibration datasets.""" coeffs = self[cal_key][cal_index] slope = coeffs.attrs.pop("Slope", None) intercept = coeffs.attrs.pop("Intercept", None) @@ -101,7 +101,7 @@ def _get_coefficients(self, cal_key, cal_index): return coeffs def _get_coefficients_mersi1(self, band_index): - """Get VIS calibration coeffs from attributes. Only for MERSI-1 on FY-3A/B""" + """Get VIS calibration coeffs from attributes. Only for MERSI-1 on FY-3A/B.""" try: # This is found in the actual file. coeffs = self["/attr/VIR_Cal_Coeff"] From 9f1ad43123224177a86a7f5ffd1ca51aa628a6c1 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 28 Apr 2024 23:01:25 +0800 Subject: [PATCH 387/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 5c9f68713e..d760ec6170 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -113,6 +113,20 @@ def _get_coefficients_mersi1(self, band_index): coeffs = coeffs[band_index] return coeffs + def _get_dn_corrections(self, data ,band_index, dataset_id, attrs): + """Use slope and intercept to get DN corrections.""" + slope = attrs.pop("Slope", None) + intercept = attrs.pop("Intercept", None) + if slope is not None and dataset_id.get("calibration") != "counts": + if band_index is not None and slope.size > 1: + slope = slope[band_index] + intercept = intercept[band_index] + # There's a bug in the slope for MERSI-1 11.25(5) + if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" and slope in [100, 1]: + slope = 0.01 + data = data * slope + intercept + return data + def get_dataset(self, dataset_id, ds_info): """Load data variable and metadata and calibrate if needed.""" file_key = ds_info.get("file_key", dataset_id["name"]) @@ -128,17 +142,7 @@ def get_dataset(self, dataset_id, ds_info): attrs.setdefault("rows_per_scan", self.filetype_info["rows_per_scan"]) data = self._mask_data(data, dataset_id, attrs) - - slope = attrs.pop("Slope", None) - intercept = attrs.pop("Intercept", None) - if slope is not None and dataset_id.get("calibration") != "counts": - if band_index is not None and slope.size > 1: - slope = slope[band_index] - intercept = intercept[band_index] - # There's a bug in the slope for MERSI-1 11.25(5) - if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" and slope in [100, 1]: - slope = 0.01 - data = data * slope + intercept + data = self._get_dn_corrections(data, band_index, dataset_id, attrs) if dataset_id.get("calibration") == "reflectance": # Only FY-3A/B stores VIS calibration coefficients in attributes From 06b806daf2b4cd3763ffd3251c2e7180182e4d99 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 28 Apr 2024 23:01:42 +0800 Subject: [PATCH 388/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index d760ec6170..263d3ab992 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -113,7 +113,7 @@ def _get_coefficients_mersi1(self, band_index): coeffs = coeffs[band_index] return coeffs - def _get_dn_corrections(self, data ,band_index, dataset_id, attrs): + def _get_dn_corrections(self, data, band_index, dataset_id, attrs): """Use slope and intercept to get DN corrections.""" slope = attrs.pop("Slope", None) intercept = attrs.pop("Intercept", None) From d67fe2076819cf65aa51b69f34c60666db1c65a6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 28 Apr 2024 15:03:14 +0000 Subject: [PATCH 389/481] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- satpy/etc/composites/mersi-1.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/etc/composites/mersi-1.yaml b/satpy/etc/composites/mersi-1.yaml index fce0127697..ee92ee9ed4 100644 --- a/satpy/etc/composites/mersi-1.yaml +++ b/satpy/etc/composites/mersi-1.yaml @@ -70,4 +70,3 @@ composites: modifiers: [sunz_corrected] - name: '5' standard_name: overview - From 911e2fd0f436fdfe41e2eab35ce5a2cd10b34104 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Sun, 28 Apr 2024 23:42:48 +0800 Subject: [PATCH 390/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 62 +++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index a3145d3f76..a190b80336 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -86,6 +86,45 @@ def _get_250m_data(num_scans, rows_per_scan, num_cols): } return data +def _get_mersi1_250m_data(num_scans, rows_per_scan, num_cols, old_form=False): + # Set some default attributes + def_attrs = {"FillValue": 65535, + "valid_range": [0, 4095], + "Slope": np.array([1.] * 1), "Intercept": np.array([0.] * 1) + } + nounits_attrs = {**def_attrs, **{"units": "NO"}} + # Old form from FY-3A/B + prefix = "" if old_form else "Data/" + + data = { + f"{prefix}EV_250_RefSB_b1": + xr.DataArray( + da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs=nounits_attrs, + dims=("_rows", "_cols")), + f"{prefix}EV_250_RefSB_b2": + xr.DataArray( + da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs=nounits_attrs, + dims=("_rows", "_cols")), + f"{prefix}EV_250_RefSB_b3": + xr.DataArray( + da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs=nounits_attrs, + dims=("_rows", "_cols")), + f"{prefix}EV_250_RefSB_b4": + xr.DataArray( + da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs=nounits_attrs, + dims=("_rows", "_cols")), + f"{prefix}EV_250_Emissive": + xr.DataArray( + da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs=radunits_attrs, + dims=("_rows", "_cols")), + } + return data + def _get_500m_data(num_scans, rows_per_scan, num_cols): data = { @@ -278,7 +317,19 @@ def get_test_content(self, filename, filename_info, filetype_info): return test_content def _set_sensor_attrs(self, global_attrs): - if "mersi2_l1b" in self.filetype_info["file_type"]: + if "fy3a_mersi1" in self.filetype_info["file_type"]: + global_attrs["/attr/Satellite Name"] = "FY-3A" + global_attrs["/attr/Sensor Identification Code"] = "MERSI" + ftype = "VIS" + elif "fy3b_mersi1" in self.filetype_info["file_type"]: + global_attrs["/attr/Satellite Name"] = "FY-3B" + global_attrs["/attr/Sensor Identification Code"] = "MERSI" + ftype = "VIS" + elif "fy3c_mersi1" in self.filetype_info["file_type"]: + global_attrs["/attr/Satellite Name"] = "FY-3C" + global_attrs["/attr/Sensor Identification Code"] = "MERSI" + ftype = "VIS" + elif "mersi2_l1b" in self.filetype_info["file_type"]: global_attrs["/attr/Satellite Name"] = "FY-3D" global_attrs["/attr/Sensor Identification Code"] = "MERSI" ftype = "VIS" @@ -308,11 +359,20 @@ def _add_band_data_file_content(self): num_cols = self._num_cols_for_file_type num_scans = self.num_scans rows_per_scan = self._rows_per_scan + is_fy3a_mersi1 = self.filetype_info["file_type"].startswith("fy3a_mersi1") + is_fy3b_mersi1 = self.filetype_info["file_type"].startswith("fy3b_mersi1") + is_fy3c_mersi1 = self.filetype_info["file_type"].startswith("fy3c_mersi1") is_mersi2 = self.filetype_info["file_type"].startswith("mersi2_") is_mersill = self.filetype_info["file_type"].startswith("mersi_ll") is_1km = "_1000" in self.filetype_info["file_type"] if is_1km: data_func = _get_1km_data + elif is_fy3a_mersi1: + data_func = _get_mersi1_250m_data(old_form=True) + elif is_fy3b_mersi1: + data_func = _get_mersi1_250m_data(old_form=True) + elif is_fy3c_mersi1: + data_func = _get_mersi1_250m_data elif is_mersi2: data_func = _get_250m_data elif is_mersill: From 5faebd1fa3a83b204a0f917c6e723a9e1d2b2c52 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 11:26:02 +0800 Subject: [PATCH 391/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 66 +++++++++++++--------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index a190b80336..151801db0b 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -86,38 +86,36 @@ def _get_250m_data(num_scans, rows_per_scan, num_cols): } return data -def _get_mersi1_250m_data(num_scans, rows_per_scan, num_cols, old_form=False): +def _get_mersi1_250m_data(num_scans, rows_per_scan, num_cols, key_prefix="Data/"): # Set some default attributes def_attrs = {"FillValue": 65535, "valid_range": [0, 4095], "Slope": np.array([1.] * 1), "Intercept": np.array([0.] * 1) } nounits_attrs = {**def_attrs, **{"units": "NO"}} - # Old form from FY-3A/B - prefix = "" if old_form else "Data/" data = { - f"{prefix}EV_250_RefSB_b1": + f"{key_prefix}EV_250_RefSB_b1": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=nounits_attrs, dims=("_rows", "_cols")), - f"{prefix}EV_250_RefSB_b2": + f"{key_prefix}EV_250_RefSB_b2": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=nounits_attrs, dims=("_rows", "_cols")), - f"{prefix}EV_250_RefSB_b3": + f"{key_prefix}EV_250_RefSB_b3": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=nounits_attrs, dims=("_rows", "_cols")), - f"{prefix}EV_250_RefSB_b4": + f"{key_prefix}EV_250_RefSB_b4": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=nounits_attrs, dims=("_rows", "_cols")), - f"{prefix}EV_250_Emissive": + f"{key_prefix}EV_250_Emissive": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=radunits_attrs, @@ -157,9 +155,9 @@ def _get_500m_data(num_scans, rows_per_scan, num_cols): return data -def _get_1km_data(num_scans, rows_per_scan, num_cols): +def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix="Data/"): data = { - "Data/EV_1KM_LL": + f"{key_prefix}EV_1KM_LL": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), @@ -171,7 +169,7 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols): "long_name": b"1km Earth View Science Data", }, dims=("_rows", "_cols")), - "Data/EV_1KM_RefSB": + f"{key_prefix}EV_1KM_RefSB": xr.DataArray( da.ones((15, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), @@ -183,7 +181,7 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols): "long_name": b"1km Earth View Science Data", }, dims=("_ref_bands", "_rows", "_cols")), - "Data/EV_1KM_Emissive": + f"{key_prefix}EV_1KM_Emissive": xr.DataArray( da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), @@ -196,7 +194,7 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols): b"Science Data", }, dims=("_ir_bands", "_rows", "_cols")), - "Data/EV_250_Aggr.1KM_RefSB": + f"{key_prefix}EV_250_Aggr.1KM_RefSB": xr.DataArray( da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), @@ -209,7 +207,7 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols): b"Science Data Aggregated to 1 km" }, dims=("_ref250_bands", "_rows", "_cols")), - "Data/EV_250_Aggr.1KM_Emissive": + f"{key_prefix}EV_250_Aggr.1KM_Emissive": xr.DataArray( da.ones((2, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), @@ -305,6 +303,12 @@ def get_test_content(self, filename, filename_info, filetype_info): "/attr/Observing Beginning Time": "18:27:39.720", "/attr/Observing Ending Time": "18:38:36.728", } + fy3a_attrs = { + "/attr/VIR_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" + } # noqa + fy3b_attrs = { + "/attr/VIS_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" + } # noqa global_attrs, ftype = self._set_sensor_attrs(global_attrs) self._add_tbb_coefficients(global_attrs) @@ -313,7 +317,12 @@ def get_test_content(self, filename, filename_info, filetype_info): test_content = {} test_content.update(global_attrs) test_content.update(data) - test_content.update(_get_calibration(self.num_scans, ftype)) + if "fy3a_mersi1" in self.filetype_info["file_type"]: + test_content.update(fy3a_attrs) + elif "fy3b_mersi1" in self.filetype_info["file_type"]: + test_content.update(fy3b_attrs) + if not self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")): + test_content.update(_get_calibration(self.num_scans, ftype)) return test_content def _set_sensor_attrs(self, global_attrs): @@ -359,18 +368,18 @@ def _add_band_data_file_content(self): num_cols = self._num_cols_for_file_type num_scans = self.num_scans rows_per_scan = self._rows_per_scan - is_fy3a_mersi1 = self.filetype_info["file_type"].startswith("fy3a_mersi1") - is_fy3b_mersi1 = self.filetype_info["file_type"].startswith("fy3b_mersi1") + is_fy3ab_mersi1 = self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")) is_fy3c_mersi1 = self.filetype_info["file_type"].startswith("fy3c_mersi1") is_mersi2 = self.filetype_info["file_type"].startswith("mersi2_") is_mersill = self.filetype_info["file_type"].startswith("mersi_ll") - is_1km = "_1000" in self.filetype_info["file_type"] + is_fy3ab_1km = "_1000" in self.filetype_info["file_type"] and is_fy3ab_mersi1 + is_1km = "_1000" in self.filetype_info["file_type"] and not is_fy3ab_1km if is_1km: data_func = _get_1km_data - elif is_fy3a_mersi1: - data_func = _get_mersi1_250m_data(old_form=True) - elif is_fy3b_mersi1: - data_func = _get_mersi1_250m_data(old_form=True) + elif is_fy3ab_1km: + data_func = _get_1km_data(key_prefix="") + elif is_fy3ab_mersi1: + data_func = _get_mersi1_250m_data(key_prefix="") elif is_fy3c_mersi1: data_func = _get_mersi1_250m_data elif is_mersi2: @@ -398,12 +407,15 @@ def _num_cols_for_file_type(self): @property def _geo_prefix_for_file_type(self): - if "1000" in self.filetype_info["file_type"]: - return "Geolocation/" - elif "500" in self.filetype_info["file_type"]: - return "Geolocation/" - else: + if self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")): return "" + else: + if "1000" in self.filetype_info["file_type"]: + return "Geolocation/" + elif "500" in self.filetype_info["file_type"]: + return "Geolocation/" + else: + return "" def _test_helper(res): From fa3e5feae829bf3fd7e0e3902e303fad2e019ce2 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 11:27:03 +0800 Subject: [PATCH 392/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 151801db0b..c7027a38e7 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -118,7 +118,7 @@ def _get_mersi1_250m_data(num_scans, rows_per_scan, num_cols, key_prefix="Data/" f"{key_prefix}EV_250_Emissive": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), - attrs=radunits_attrs, + attrs=nounits_attrs, dims=("_rows", "_cols")), } return data From df915c6a91ae55d53754ced19eaa5e21329d4a65 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 11:27:42 +0800 Subject: [PATCH 393/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index c7027a38e7..516bd18da9 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -304,11 +304,13 @@ def get_test_content(self, filename, filename_info, filetype_info): "/attr/Observing Ending Time": "18:38:36.728", } fy3a_attrs = { - "/attr/VIR_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" - } # noqa + "/attr/VIR_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" + " 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" + } fy3b_attrs = { - "/attr/VIS_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" - } # noqa + "/attr/VIS_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 " + "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" + } global_attrs, ftype = self._set_sensor_attrs(global_attrs) self._add_tbb_coefficients(global_attrs) From 2336640cb640baa15cb341eea420fdd5c8286d0b Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 11:34:03 +0800 Subject: [PATCH 394/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 516bd18da9..4afb0f6e58 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -155,7 +155,7 @@ def _get_500m_data(num_scans, rows_per_scan, num_cols): return data -def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix="Data/"): +def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix="Data/", radunits="mW/ (m2 cm-1 sr)"): data = { f"{key_prefix}EV_1KM_LL": xr.DataArray( @@ -214,7 +214,7 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix="Data/"): attrs={ "Slope": np.array([1.] * 2), "Intercept": np.array([0.] * 2), "FillValue": 65535, - "units": "mW/ (m2 cm-1 sr)", + "units": radunits, "valid_range": [0, 4095], "long_name": b"250m Emissive Bands Earth View " b"Science Data Aggregated to 1 km" @@ -308,8 +308,8 @@ def get_test_content(self, filename, filename_info, filetype_info): " 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" } fy3b_attrs = { - "/attr/VIS_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 " - "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" + "/attr/VIS_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" + " 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" } global_attrs, ftype = self._set_sensor_attrs(global_attrs) @@ -375,11 +375,14 @@ def _add_band_data_file_content(self): is_mersi2 = self.filetype_info["file_type"].startswith("mersi2_") is_mersill = self.filetype_info["file_type"].startswith("mersi_ll") is_fy3ab_1km = "_1000" in self.filetype_info["file_type"] and is_fy3ab_mersi1 + is_fy3c_1km = "_1000" in self.filetype_info["file_type"] and is_fy3c_mersi1 is_1km = "_1000" in self.filetype_info["file_type"] and not is_fy3ab_1km if is_1km: data_func = _get_1km_data elif is_fy3ab_1km: - data_func = _get_1km_data(key_prefix="") + data_func = _get_1km_data(key_prefix="", radunits="NO") + elif is_fy3c_1km: + data_func = _get_1km_data(radunits="NO") elif is_fy3ab_mersi1: data_func = _get_mersi1_250m_data(key_prefix="") elif is_fy3c_mersi1: From bdda69725fb4142fee611ca9440e1cb7c2b12310 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 13:38:58 +0800 Subject: [PATCH 395/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 75 ++++++++++++++-------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 4afb0f6e58..2bba910a2c 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -86,7 +86,7 @@ def _get_250m_data(num_scans, rows_per_scan, num_cols): } return data -def _get_mersi1_250m_data(num_scans, rows_per_scan, num_cols, key_prefix="Data/"): +def _get_mersi1_250m_data(num_scans, rows_per_scan, num_cols, key_prefix): # Set some default attributes def_attrs = {"FillValue": 65535, "valid_range": [0, 4095], @@ -155,7 +155,7 @@ def _get_500m_data(num_scans, rows_per_scan, num_cols): return data -def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix="Data/", radunits="mW/ (m2 cm-1 sr)"): +def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix, radunits): data = { f"{key_prefix}EV_1KM_LL": xr.DataArray( @@ -304,12 +304,12 @@ def get_test_content(self, filename, filename_info, filetype_info): "/attr/Observing Ending Time": "18:38:36.728", } fy3a_attrs = { - "/attr/VIR_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" - " 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" + "/attr/VIR_Cal_Coeff": "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 " + "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0", } fy3b_attrs = { - "/attr/VIS_Cal_Coeff: 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" - " 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0" + "/attr/VIS_Cal_Coeff": "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 " + "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0", } global_attrs, ftype = self._set_sensor_attrs(global_attrs) @@ -371,29 +371,28 @@ def _add_band_data_file_content(self): num_scans = self.num_scans rows_per_scan = self._rows_per_scan is_fy3ab_mersi1 = self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")) - is_fy3c_mersi1 = self.filetype_info["file_type"].startswith("fy3c_mersi1") + is_mersi1 = self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1", "fy3c_mersi1")) is_mersi2 = self.filetype_info["file_type"].startswith("mersi2_") is_mersill = self.filetype_info["file_type"].startswith("mersi_ll") - is_fy3ab_1km = "_1000" in self.filetype_info["file_type"] and is_fy3ab_mersi1 - is_fy3c_1km = "_1000" in self.filetype_info["file_type"] and is_fy3c_mersi1 - is_1km = "_1000" in self.filetype_info["file_type"] and not is_fy3ab_1km + is_1km = "_1000" in self.filetype_info["file_type"] + is_250m = "_250" in self.filetype_info["file_type"] + + key_prefix = "" if is_fy3ab_mersi1 else "Data/" + radunits = "NO" if is_mersi1 else "mW/ (m2 cm-1 sr)" + if is_1km: - data_func = _get_1km_data - elif is_fy3ab_1km: - data_func = _get_1km_data(key_prefix="", radunits="NO") - elif is_fy3c_1km: - data_func = _get_1km_data(radunits="NO") - elif is_fy3ab_mersi1: - data_func = _get_mersi1_250m_data(key_prefix="") - elif is_fy3c_mersi1: - data_func = _get_mersi1_250m_data - elif is_mersi2: - data_func = _get_250m_data - elif is_mersill: - data_func = _get_250m_ll_data + return _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix, radunits) + elif is_250m: + if is_mersi1: + return _get_mersi1_250m_data(num_scans, rows_per_scan, num_cols, key_prefix) + elif is_mersi2: + return _get_250m_data(num_scans, rows_per_scan, num_cols) + elif is_mersill: + return _get_250m_ll_data(num_scans, rows_per_scan, num_cols) + else: + return else: - data_func = _get_500m_data - return data_func(num_scans, rows_per_scan, num_cols) + return _get_500m_data(num_scans, rows_per_scan, num_cols) def _add_tbb_coefficients(self, global_attrs): if not self.filetype_info["file_type"].startswith("mersi2_"): @@ -457,6 +456,32 @@ def teardown_method(self): self.p.stop() +class TestFY3AMERSI1L1B(MERSIL1BTester): + """Test the FY3A MERSI1 L1B reader.""" + + yaml_file = "fy3a_mersi1_l1b.yaml" + filenames_1000m = ["FY3A_MERSI_GBAL_L1_20090601_1200_1000M_MS.hdf"] + filenames_250m = ["FY3A_MERSI_GBAL_L1_20090601_1200_0250M_MS.hdf"] + filenames_all = filenames_1000m + filenames_250m + + def test_all_resolutions(self): + """Test loading data when all resolutions are available.""" + from satpy.dataset.data_dict import get_key + from satpy.readers import load_reader + from satpy.tests.utils import make_dataid + filenames = self.filenames_all + reader = load_reader(self.reader_configs) + files = reader.select_files_from_pathnames(filenames) + assert 2 == len(files) + reader.create_filehandlers(files) + # Make sure we have some files + assert reader.file_handlers + + + + + + class TestMERSI2L1B(MERSIL1BTester): """Test the FY3D MERSI2 L1B reader.""" From 8fcc32c5a42fd2b6d0b04a27fc3fc88cc34dbe8e Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 29 Apr 2024 15:29:19 +0200 Subject: [PATCH 396/481] Bugfix --- satpy/readers/__init__.py | 2 +- satpy/readers/yaml_reader.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/satpy/readers/__init__.py b/satpy/readers/__init__.py index 33196b3aab..34d2f9a9d6 100644 --- a/satpy/readers/__init__.py +++ b/satpy/readers/__init__.py @@ -639,7 +639,7 @@ def _get_reader_kwargs(reader, reader_kwargs): reader_kwargs = reader_kwargs or {} if isinstance(reader, str): - reader = list(reader) + reader = [reader] # ensure one reader_kwargs per reader, None if not provided if reader is None: diff --git a/satpy/readers/yaml_reader.py b/satpy/readers/yaml_reader.py index 84c4fcd068..5bbaba4a6c 100644 --- a/satpy/readers/yaml_reader.py +++ b/satpy/readers/yaml_reader.py @@ -346,8 +346,6 @@ def __init__(self, config_dict, filter_parameters=None, filter_filenames=True): self.filter_parameters = filter_parameters or {} self.filter_filenames = self.info.get("filter_filenames", filter_filenames) - - def filter_selected_filenames(self, filenames): """Filter provided files based on metadata in the filename.""" if not isinstance(filenames, set): From 08c7af220e2d26f8374683453e6ea31563069948 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 29 Apr 2024 15:40:27 +0200 Subject: [PATCH 397/481] Fix breaking change --- satpy/readers/sar_c_safe.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/readers/sar_c_safe.py b/satpy/readers/sar_c_safe.py index c175b17b3c..a5ec535462 100644 --- a/satpy/readers/sar_c_safe.py +++ b/satpy/readers/sar_c_safe.py @@ -36,6 +36,7 @@ import functools import logging +import warnings from collections import defaultdict from datetime import timezone as tz from functools import cached_property @@ -714,14 +715,13 @@ def end_time(self): def load(self, dataset_keys, **kwargs): """Load some data.""" if kwargs: - raise NotImplementedError(f"Don't know how to handle kwargs {kwargs}") + warnings.warn(f"Don't know how to handle kwargs {kwargs}") datasets = DatasetDict() for key in dataset_keys: for handler in self.storage_items.values(): val = handler.get_dataset(key, info=dict()) if val is not None: val.attrs["start_time"] = handler.start_time - # val.attrs["footprint"] = self.footprint if key["name"] not in ["longitude", "latitude"]: lonlats = self.load([DataID(self._id_keys, name="longitude", polarization=key["polarization"]), DataID(self._id_keys, name="latitude", polarization=key["polarization"])]) From 3b406759752e27c3ffcc76cecc327609ea578a80 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 29 Apr 2024 16:00:27 +0200 Subject: [PATCH 398/481] Restore get_reader_kwargs --- satpy/readers/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/satpy/readers/__init__.py b/satpy/readers/__init__.py index 34d2f9a9d6..aefb8ba0da 100644 --- a/satpy/readers/__init__.py +++ b/satpy/readers/__init__.py @@ -638,9 +638,6 @@ def _get_reader_kwargs(reader, reader_kwargs): """ reader_kwargs = reader_kwargs or {} - if isinstance(reader, str): - reader = [reader] - # ensure one reader_kwargs per reader, None if not provided if reader is None: reader_kwargs = {None: reader_kwargs} From c9aabb7f2d9b8292b872cd2a52dca9e91d23d302 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Thu, 25 Apr 2024 12:14:17 -0500 Subject: [PATCH 399/481] Fix ABI L2 datasets when unitless and no calibration --- satpy/readers/abi_l2_nc.py | 2 +- satpy/tests/reader_tests/test_abi_l2_nc.py | 28 ++++++++++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/satpy/readers/abi_l2_nc.py b/satpy/readers/abi_l2_nc.py index 2324d3e1fd..5e8ae1c7bb 100644 --- a/satpy/readers/abi_l2_nc.py +++ b/satpy/readers/abi_l2_nc.py @@ -43,7 +43,7 @@ def get_dataset(self, key, info): self._remove_problem_attrs(variable) # convert to satpy standard units - if variable.attrs["units"] == "1" and key["calibration"] == "reflectance": + if variable.attrs["units"] == "1" and key.get("calibration") == "reflectance": variable *= 100.0 variable.attrs["units"] = "%" diff --git a/satpy/tests/reader_tests/test_abi_l2_nc.py b/satpy/tests/reader_tests/test_abi_l2_nc.py index 4b8d3a9578..3d2b063edc 100644 --- a/satpy/tests/reader_tests/test_abi_l2_nc.py +++ b/satpy/tests/reader_tests/test_abi_l2_nc.py @@ -96,23 +96,36 @@ def _create_mcmip_dataset(): return ds1 +def _create_aod_dataset(): + ds1 = _create_cmip_dataset("AOD") + ds1["AOD"].attrs["units"] = "1" + return ds1 + + class Test_NC_ABI_L2_get_dataset: """Test get dataset function of the NC_ABI_L2 reader.""" - def test_get_dataset(self): + @pytest.mark.parametrize( + ("obs_type", "ds_func", "var_name", "var_attrs"), + [ + ("ACHA", _create_cmip_dataset, "HT", {"units": "m"}), + ("AOD", _create_aod_dataset, "AOD", {"units": "1"}), + ] + ) + def test_get_dataset(self, obs_type, ds_func, var_name, var_attrs): """Test basic L2 load.""" from satpy.tests.utils import make_dataid - key = make_dataid(name="HT") - with _create_reader_for_fake_data("ACHA", _create_cmip_dataset()) as reader: - res = reader.get_dataset(key, {"file_key": "HT"}) + key = make_dataid(name=var_name) + with _create_reader_for_fake_data(obs_type, ds_func()) as reader: + res = reader.get_dataset(key, {"file_key": var_name}) exp_data = np.array([[2 * 0.3052037, np.nan], [32768 * 0.3052037, 32767 * 0.3052037]]) exp_attrs = {"instrument_ID": None, "modifiers": (), - "name": "HT", - "observation_type": "ACHA", + "name": var_name, + "observation_type": obs_type, "orbital_slot": None, "platform_name": "GOES-16", "platform_shortname": "G16", @@ -122,7 +135,8 @@ def test_get_dataset(self): "scene_id": None, "sensor": "abi", "timeline_ID": None, - "units": "m"} + } + exp_attrs.update(var_attrs) np.testing.assert_allclose(res.data, exp_data, equal_nan=True) _compare_subdict(res.attrs, exp_attrs) From 6d0311db97fd2524f5989d272b344601bb0b7700 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 23:08:57 +0800 Subject: [PATCH 400/481] nearly complete --- satpy/etc/readers/fy3a_mersi1_l1b.yaml | 23 ++ satpy/etc/readers/fy3b_mersi1_l1b.yaml | 31 +- satpy/readers/mersi_l1b.py | 15 +- satpy/tests/reader_tests/test_mersi_l1b.py | 408 +++++++++++---------- 4 files changed, 277 insertions(+), 200 deletions(-) diff --git a/satpy/etc/readers/fy3a_mersi1_l1b.yaml b/satpy/etc/readers/fy3a_mersi1_l1b.yaml index 2db2617f6d..0f16f46454 100644 --- a/satpy/etc/readers/fy3a_mersi1_l1b.yaml +++ b/satpy/etc/readers/fy3a_mersi1_l1b.yaml @@ -30,9 +30,11 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_250_Aggr.1KM_RefSB band_index: 0 + calibration_index: 0 250: file_type: fy3a_mersi1_l1b_250 file_key: EV_250_RefSB_b1 + calibration_index: 0 coordinates: [longitude, latitude] calibration: reflectance: @@ -50,9 +52,11 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_250_Aggr.1KM_RefSB band_index: 1 + calibration_index: 1 250: file_type: fy3a_mersi1_l1b_250 file_key: EV_250_RefSB_b2 + calibration_index: 1 coordinates: [longitude, latitude] calibration: reflectance: @@ -70,9 +74,11 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_250_Aggr.1KM_RefSB band_index: 2 + calibration_index: 2 250: file_type: fy3a_mersi1_l1b_250 file_key: EV_250_RefSB_b3 + calibration_index: 2 coordinates: [longitude, latitude] calibration: reflectance: @@ -90,9 +96,11 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_250_Aggr.1KM_RefSB band_index: 3 + calibration_index: 3 250: file_type: fy3a_mersi1_l1b_250 file_key: EV_250_RefSB_b4 + calibration_index: 3 coordinates: [longitude, latitude] calibration: reflectance: @@ -128,6 +136,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 0 + calibration_index: 4 coordinates: [longitude, latitude] calibration: reflectance: @@ -144,6 +153,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 1 + calibration_index: 5 coordinates: [longitude, latitude] calibration: reflectance: @@ -160,6 +170,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 2 + calibration_index: 6 coordinates: [longitude, latitude] calibration: reflectance: @@ -176,6 +187,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 3 + calibration_index: 7 coordinates: [longitude, latitude] calibration: reflectance: @@ -192,6 +204,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 4 + calibration_index: 8 coordinates: [longitude, latitude] calibration: reflectance: @@ -208,6 +221,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 5 + calibration_index: 9 coordinates: [longitude, latitude] calibration: reflectance: @@ -224,6 +238,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 6 + calibration_index: 10 coordinates: [longitude, latitude] calibration: reflectance: @@ -240,6 +255,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 7 + calibration_index: 11 coordinates: [longitude, latitude] calibration: reflectance: @@ -256,6 +272,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 8 + calibration_index: 12 coordinates: [longitude, latitude] calibration: reflectance: @@ -272,6 +289,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 9 + calibration_index: 13 coordinates: [longitude, latitude] calibration: reflectance: @@ -288,6 +306,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 10 + calibration_index: 14 coordinates: [longitude, latitude] calibration: reflectance: @@ -304,6 +323,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 11 + calibration_index: 15 coordinates: [longitude, latitude] calibration: reflectance: @@ -320,6 +340,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 12 + calibration_index: 16 coordinates: [longitude, latitude] calibration: reflectance: @@ -336,6 +357,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 13 + calibration_index: 17 coordinates: [longitude, latitude] calibration: reflectance: @@ -352,6 +374,7 @@ datasets: file_type: fy3a_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 14 + calibration_index: 18 coordinates: [longitude, latitude] calibration: reflectance: diff --git a/satpy/etc/readers/fy3b_mersi1_l1b.yaml b/satpy/etc/readers/fy3b_mersi1_l1b.yaml index 464c079868..02f7e14883 100644 --- a/satpy/etc/readers/fy3b_mersi1_l1b.yaml +++ b/satpy/etc/readers/fy3b_mersi1_l1b.yaml @@ -36,9 +36,11 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_250_Aggr.1KM_RefSB band_index: 0 + calibration_index: 0 250: file_type: fy3b_mersi1_l1b_250 file_key: EV_250_RefSB_b1 + calibration_index: 0 coordinates: [longitude, latitude] calibration: reflectance: @@ -56,9 +58,11 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_250_Aggr.1KM_RefSB band_index: 1 + calibration_index: 1 250: file_type: fy3b_mersi1_l1b_250 file_key: EV_250_RefSB_b2 + calibration_index: 1 coordinates: [longitude, latitude] calibration: reflectance: @@ -76,9 +80,11 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_250_Aggr.1KM_RefSB band_index: 2 + calibration_index: 2 250: file_type: fy3b_mersi1_l1b_250 file_key: EV_250_RefSB_b3 + calibration_index: 2 coordinates: [longitude, latitude] calibration: reflectance: @@ -96,9 +102,11 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_250_Aggr.1KM_RefSB band_index: 3 + calibration_index: 3 250: file_type: fy3b_mersi1_l1b_250 file_key: EV_250_RefSB_b4 + calibration_index: 3 coordinates: [longitude, latitude] calibration: reflectance: @@ -134,6 +142,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 0 + calibration_index: 4 coordinates: [longitude, latitude] calibration: reflectance: @@ -150,6 +159,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 1 + calibration_index: 5 coordinates: [longitude, latitude] calibration: reflectance: @@ -166,6 +176,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 2 + calibration_index: 6 coordinates: [longitude, latitude] calibration: reflectance: @@ -182,6 +193,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 3 + calibration_index: 7 coordinates: [longitude, latitude] calibration: reflectance: @@ -198,6 +210,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 4 + calibration_index: 8 coordinates: [longitude, latitude] calibration: reflectance: @@ -214,6 +227,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 5 + calibration_index: 9 coordinates: [longitude, latitude] calibration: reflectance: @@ -230,6 +244,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 6 + calibration_index: 10 coordinates: [longitude, latitude] calibration: reflectance: @@ -246,6 +261,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 7 + calibration_index: 11 coordinates: [longitude, latitude] calibration: reflectance: @@ -262,6 +278,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 8 + calibration_index: 12 coordinates: [longitude, latitude] calibration: reflectance: @@ -278,6 +295,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 9 + calibration_index: 13 coordinates: [longitude, latitude] calibration: reflectance: @@ -294,6 +312,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 10 + calibration_index: 14 coordinates: [longitude, latitude] calibration: reflectance: @@ -310,6 +329,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 11 + calibration_index: 15 coordinates: [longitude, latitude] calibration: reflectance: @@ -326,6 +346,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 12 + calibration_index: 16 coordinates: [longitude, latitude] calibration: reflectance: @@ -342,6 +363,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 13 + calibration_index: 17 coordinates: [longitude, latitude] calibration: reflectance: @@ -358,6 +380,7 @@ datasets: file_type: fy3b_mersi1_l1b_1000 file_key: EV_1KM_RefSB band_index: 14 + calibration_index: 18 coordinates: [longitude, latitude] calibration: reflectance: @@ -397,7 +420,7 @@ datasets: standard_name: solar_zenith_angle resolution: 1000 coordinates: [longitude, latitude] - file_type: fy3b_mersi1_l1b_1000 + file_type: fy3b_mersi1_l1b_geo file_key: SolarZenith solar_azimuth_angle: @@ -406,7 +429,7 @@ datasets: standard_name: solar_azimuth_angle resolution: 1000 coordinates: [longitude, latitude] - file_type: fy3b_mersi1_l1b_1000 + file_type: fy3b_mersi1_l1b_geo file_key: SolarAzimuth satellite_zenith_angle: @@ -415,7 +438,7 @@ datasets: standard_name: sensor_zenith_angle resolution: 1000 coordinates: [longitude, latitude] - file_type: fy3b_mersi1_l1b_1000 + file_type: fy3b_mersi1_l1b_geo file_key: SensorZenith satellite_azimuth_angle: @@ -424,5 +447,5 @@ datasets: standard_name: sensor_azimuth_angle resolution: 1000 coordinates: [longitude, latitude] - file_type: fy3b_mersi1_l1b_1000 + file_type: fy3b_mersi1_l1b_geo file_key: SensorAzimuth diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 263d3ab992..90b47a58d6 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -20,8 +20,8 @@ The files for this reader are HDF5 and come in four varieties; band data and geolocation data, both at 250m and 1000m resolution. -This reader was tested on FY-3D MERSI-2 data, but should work on future -platforms as well assuming no file format changes. +This reader was tested on FY-3A/B/C MERSI-1, FY-3D MERSI-2, FY-3E MERSI-LL and FY-3G MERSI-RM data, +but should work on future platforms as well assuming no file format changes. """ from datetime import datetime @@ -100,7 +100,7 @@ def _get_coefficients(self, cal_key, cal_index): coeffs = coeffs * slope + intercept return coeffs - def _get_coefficients_mersi1(self, band_index): + def _get_coefficients_mersi1(self, cal_index): """Get VIS calibration coeffs from attributes. Only for MERSI-1 on FY-3A/B.""" try: # This is found in the actual file. @@ -109,8 +109,7 @@ def _get_coefficients_mersi1(self, band_index): # This is in the official manual. coeffs = self["/attr/VIS_Cal_Coeff"] coeffs = coeffs.reshape(19, 3) - if band_index is not None: - coeffs = coeffs[band_index] + coeffs = coeffs[cal_index].tolist() return coeffs def _get_dn_corrections(self, data, band_index, dataset_id, attrs): @@ -146,10 +145,8 @@ def get_dataset(self, dataset_id, ds_info): if dataset_id.get("calibration") == "reflectance": # Only FY-3A/B stores VIS calibration coefficients in attributes - coeffs = self._get_coefficients_mersi1(band_index) if self.platform_name in ["FY-3A", "FY-3B"] else \ - self._get_coefficients(ds_info["calibration_key"], - ds_info["calibration_index"]) - + coeffs = self._get_coefficients_mersi1(ds_info["calibration_index"]) if self.platform_name in ["FY-3A", + "FY-3B"] else self._get_coefficients(ds_info["calibration_key"], ds_info["calibration_index"]) data = coeffs[0] + coeffs[1] * data + coeffs[2] * data ** 2 data = data * self.get_refl_mult() diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 2bba910a2c..1a18af39fe 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -43,9 +43,12 @@ def _get_calibration(num_scans, ftype): return calibration -def _get_250m_data(num_scans, rows_per_scan, num_cols): +def _get_250m_data(num_scans, rows_per_scan, num_cols, old_fy3ab_form=False): # Set some default attributes - def_attrs = {"FillValue": 65535, + fill_value_name = "_FillValue" if old_fy3ab_form else "FillValue" + key_prefix = "" if old_fy3ab_form else "Data/" + + def_attrs = {fill_value_name: 65535, "valid_range": [0, 4095], "Slope": np.array([1.] * 1), "Intercept": np.array([0.] * 1) } @@ -53,68 +56,36 @@ def _get_250m_data(num_scans, rows_per_scan, num_cols): radunits_attrs = {**def_attrs, **{"units": "mW/ (m2 cm-1 sr)"}} data = { - "Data/EV_250_RefSB_b1": + f"{key_prefix}EV_250_RefSB_b1": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=nounits_attrs, dims=("_rows", "_cols")), - "Data/EV_250_RefSB_b2": + f"{key_prefix}EV_250_RefSB_b2": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=nounits_attrs, dims=("_rows", "_cols")), - "Data/EV_250_RefSB_b3": + f"{key_prefix}EV_250_RefSB_b3": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=nounits_attrs, dims=("_rows", "_cols")), - "Data/EV_250_RefSB_b4": + f"{key_prefix}EV_250_RefSB_b4": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=nounits_attrs, dims=("_rows", "_cols")), - "Data/EV_250_Emissive_b24": + f"{key_prefix}EV_250_Emissive_b24": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=radunits_attrs, dims=("_rows", "_cols")), - "Data/EV_250_Emissive_b25": + f"{key_prefix}EV_250_Emissive_b25": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs=radunits_attrs, dims=("_rows", "_cols")), - } - return data - -def _get_mersi1_250m_data(num_scans, rows_per_scan, num_cols, key_prefix): - # Set some default attributes - def_attrs = {"FillValue": 65535, - "valid_range": [0, 4095], - "Slope": np.array([1.] * 1), "Intercept": np.array([0.] * 1) - } - nounits_attrs = {**def_attrs, **{"units": "NO"}} - - data = { - f"{key_prefix}EV_250_RefSB_b1": - xr.DataArray( - da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), - attrs=nounits_attrs, - dims=("_rows", "_cols")), - f"{key_prefix}EV_250_RefSB_b2": - xr.DataArray( - da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), - attrs=nounits_attrs, - dims=("_rows", "_cols")), - f"{key_prefix}EV_250_RefSB_b3": - xr.DataArray( - da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), - attrs=nounits_attrs, - dims=("_rows", "_cols")), - f"{key_prefix}EV_250_RefSB_b4": - xr.DataArray( - da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), - attrs=nounits_attrs, - dims=("_rows", "_cols")), f"{key_prefix}EV_250_Emissive": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), @@ -155,9 +126,13 @@ def _get_500m_data(num_scans, rows_per_scan, num_cols): return data -def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix, radunits): +def _get_1km_data(num_scans, rows_per_scan, num_cols, old_fy3ab_form=False, mersi1=False): + fill_value_name = "_FillValue" if old_fy3ab_form else "FillValue" + key_prefix = "" if old_fy3ab_form else "Data/" + radunits = "NO" if mersi1 else "mW/ (m2 cm-1 sr)" + data = { - f"{key_prefix}EV_1KM_LL": + "Data/EV_1KM_LL": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), @@ -175,13 +150,13 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix, radunits): dtype=np.uint16), attrs={ "Slope": np.array([1.] * 15), "Intercept": np.array([0.] * 15), - "FillValue": 65535, + fill_value_name: 65535, "units": "NO", "valid_range": [0, 4095], "long_name": b"1km Earth View Science Data", }, dims=("_ref_bands", "_rows", "_cols")), - f"{key_prefix}EV_1KM_Emissive": + "Data/EV_1KM_Emissive": xr.DataArray( da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), @@ -200,7 +175,7 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix, radunits): dtype=np.uint16), attrs={ "Slope": np.array([1.] * 4), "Intercept": np.array([0.] * 4), - "FillValue": 65535, + fill_value_name: 65535, "units": "NO", "valid_range": [0, 4095], "long_name": b"250m Reflective Bands Earth View " @@ -209,17 +184,29 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix, radunits): dims=("_ref250_bands", "_rows", "_cols")), f"{key_prefix}EV_250_Aggr.1KM_Emissive": xr.DataArray( - da.ones((2, num_scans * rows_per_scan, num_cols), chunks=1024, + da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs={ - "Slope": np.array([1.] * 2), "Intercept": np.array([0.] * 2), - "FillValue": 65535, + "Slope": np.array([1.]), "Intercept": np.array([0.]), + fill_value_name: 65535, "units": radunits, "valid_range": [0, 4095], "long_name": b"250m Emissive Bands Earth View " b"Science Data Aggregated to 1 km" }, - dims=("_ir250_bands", "_rows", "_cols")), + dims=("_rows", "_cols")) if mersi1 else \ + xr.DataArray( + da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, + dtype=np.uint16), + attrs={ + "Slope": np.array([1.] * 2), "Intercept": np.array([0.] * 2), + "FillValue": 65535, + "units": "mW/ (m2 cm-1 sr)", + "valid_range": [0, 4095], + "long_name": b"250m Emissive Bands Earth View " + b"Science Data Aggregated to 1 km" + }, + dims=("_ir250_bands", "_rows", "_cols")) } return data @@ -304,12 +291,10 @@ def get_test_content(self, filename, filename_info, filetype_info): "/attr/Observing Ending Time": "18:38:36.728", } fy3a_attrs = { - "/attr/VIR_Cal_Coeff": "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 " - "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0", + "/attr/VIR_Cal_Coeff": np.array([0.0, 1.0, 0.0] * 19), } fy3b_attrs = { - "/attr/VIS_Cal_Coeff": "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 " - "0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0", + "/attr/VIS_Cal_Coeff": np.array([0.0, 1.0, 0.0] * 19), } global_attrs, ftype = self._set_sensor_attrs(global_attrs) @@ -318,7 +303,11 @@ def get_test_content(self, filename, filename_info, filetype_info): test_content = {} test_content.update(global_attrs) - test_content.update(data) + if "fy3a_mersi1" in self.filetype_info["file_type"]: + test_content.update(data[0]) + test_content.update(data[1]) + else: + test_content.update(data) if "fy3a_mersi1" in self.filetype_info["file_type"]: test_content.update(fy3a_attrs) elif "fy3b_mersi1" in self.filetype_info["file_type"]: @@ -355,9 +344,13 @@ def _set_sensor_attrs(self, global_attrs): return global_attrs, ftype def _get_data_file_content(self): - if "_geo" in self.filetype_info["file_type"]: - return self._add_geo_data_file_content() - return self._add_band_data_file_content() + if "fy3a_mersi1" in self.filetype_info["file_type"]: + return self._add_band_data_file_content(), self._add_geo_data_file_content() + else: + if "_geo" in self.filetype_info["file_type"]: + return self._add_geo_data_file_content() + else: + return self._add_band_data_file_content() def _add_geo_data_file_content(self): num_scans = self.num_scans @@ -370,23 +363,18 @@ def _add_band_data_file_content(self): num_cols = self._num_cols_for_file_type num_scans = self.num_scans rows_per_scan = self._rows_per_scan - is_fy3ab_mersi1 = self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")) is_mersi1 = self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1", "fy3c_mersi1")) + is_fy3ab_mersi1 = self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")) is_mersi2 = self.filetype_info["file_type"].startswith("mersi2_") is_mersill = self.filetype_info["file_type"].startswith("mersi_ll") is_1km = "_1000" in self.filetype_info["file_type"] is_250m = "_250" in self.filetype_info["file_type"] - key_prefix = "" if is_fy3ab_mersi1 else "Data/" - radunits = "NO" if is_mersi1 else "mW/ (m2 cm-1 sr)" - if is_1km: - return _get_1km_data(num_scans, rows_per_scan, num_cols, key_prefix, radunits) + return _get_1km_data(num_scans, rows_per_scan, num_cols, old_fy3ab_form=is_fy3ab_mersi1, mersi1=is_mersi1) elif is_250m: - if is_mersi1: - return _get_mersi1_250m_data(num_scans, rows_per_scan, num_cols, key_prefix) - elif is_mersi2: - return _get_250m_data(num_scans, rows_per_scan, num_cols) + if is_mersi1 or is_mersi2: + return _get_250m_data(num_scans, rows_per_scan, num_cols, old_fy3ab_form=is_fy3ab_mersi1) elif is_mersill: return _get_250m_ll_data(num_scans, rows_per_scan, num_cols) else: @@ -422,24 +410,16 @@ def _geo_prefix_for_file_type(self): return "" -def _test_helper(res): +def _test_helper(res, band_list, exp_cal, exp_unit, exp_shape): """Remove test code duplication.""" - assert (2 * 40, 2048 * 2) == res["1"].shape - assert "reflectance" == res["1"].attrs["calibration"] - assert "%" == res["1"].attrs["units"] - assert (2 * 40, 2048 * 2) == res["2"].shape - assert "reflectance" == res["2"].attrs["calibration"] - assert "%" == res["2"].attrs["units"] - assert (2 * 40, 2048 * 2) == res["3"].shape - assert "reflectance" == res["3"].attrs["calibration"] - assert "%" == res["3"].attrs["units"] - assert (2 * 40, 2048 * 2) == res["4"].shape - assert "reflectance" == res["4"].attrs["calibration"] - assert "%" == res["4"].attrs["units"] + for band in band_list: + assert res[band].attrs["calibration"] == exp_cal + assert res[band].attrs["units"] == exp_unit + assert res[band].shape == exp_shape class MERSIL1BTester: - """Test MERSI2 L1B Reader.""" + """Test MERSI1/2/LL/RM L1B Reader.""" def setup_method(self): """Wrap HDF5 file handler with our own fake handler.""" @@ -456,13 +436,13 @@ def teardown_method(self): self.p.stop() -class TestFY3AMERSI1L1B(MERSIL1BTester): - """Test the FY3A MERSI1 L1B reader.""" +class MERSI1L1BTester(MERSIL1BTester): + """Test MERSI1 L1B Reader.""" - yaml_file = "fy3a_mersi1_l1b.yaml" - filenames_1000m = ["FY3A_MERSI_GBAL_L1_20090601_1200_1000M_MS.hdf"] - filenames_250m = ["FY3A_MERSI_GBAL_L1_20090601_1200_0250M_MS.hdf"] - filenames_all = filenames_1000m + filenames_250m + yaml_file = None + filenames_1000m = None + filenames_250m = None + filenames_all = None def test_all_resolutions(self): """Test loading data when all resolutions are available.""" @@ -472,13 +452,155 @@ def test_all_resolutions(self): filenames = self.filenames_all reader = load_reader(self.reader_configs) files = reader.select_files_from_pathnames(filenames) - assert 2 == len(files) + assert len(files) == len(filenames) + reader.create_filehandlers(files) + # Make sure we have some files + assert reader.file_handlers + + # Verify that we have multiple resolutions for: + # - Bands 1-4 (visible) + # - Bands 5 (IR) + available_datasets = reader.available_dataset_ids + for band_name in ("1", "2", "3", "4", "5"): + num_results = 2 + ds_id = make_dataid(name=band_name, resolution=250) + res = get_key(ds_id, available_datasets, + num_results=num_results, best=False) + assert num_results == len(res) + ds_id = make_dataid(name=band_name, resolution=1000) + res = get_key(ds_id, available_datasets, + num_results=num_results, best=False) + assert num_results == len(res) + + res = reader.load(["1", "2", "3", "4", "5", "6", "7", "8"]) + assert len(res) == 8 + _test_helper(res, ["1", "2", "3", "4"], "reflectance", "%", (2 * 40, 2048 * 2)) + assert res["5"].shape == (2 * 40, 2048 * 2) + assert res["5"].attrs["calibration"] == "brightness_temperature" + assert res["5"].attrs["units"] == "K" + assert res["6"].shape == (2 * 10, 2048) + assert res["6"].attrs["calibration"] == "reflectance" + assert res["6"].attrs["units"] == "%" + + def test_counts_calib(self): + """Test loading data at counts calibration.""" + from satpy.readers import load_reader + from satpy.tests.utils import make_dataid + filenames = self.filenames_all + reader = load_reader(self.reader_configs) + files = reader.select_files_from_pathnames(filenames) + assert len(files) == len(filenames) + reader.create_filehandlers(files) + # Make sure we have some files + assert reader.file_handlers + + ds_ids = [] + for band_name in ["1", "2", "3", "4", "5", "6", "19", "20"]: + ds_ids.append(make_dataid(name=band_name, calibration="counts")) + ds_ids.append(make_dataid(name="satellite_zenith_angle")) + res = reader.load(ds_ids) + assert len(res) == 9 + _test_helper(res, ["1", "2", "3", "4", "5"], "counts", "1", (2 * 40, 2048 * 2)) + _test_helper(res, ["6", "19", "20"], "counts", "1", (2 * 10, 2048)) + + def test_1km_resolutions(self): + """Test loading data when only 1km resolutions are available.""" + from satpy.dataset.data_dict import get_key + from satpy.readers import load_reader + from satpy.tests.utils import make_dataid + filenames = self.filenames_1000m + reader = load_reader(self.reader_configs) + files = reader.select_files_from_pathnames(filenames) + assert len(files) == len(filenames) + reader.create_filehandlers(files) + # Make sure we have some files + assert reader.file_handlers + + # Verify that we have multiple resolutions for: + # - Bands 1-4 (visible) + # - Bands 5 (IR) + available_datasets = reader.available_dataset_ids + for band_name in ("1", "2", "3", "4", "5"): + num_results = 2 + ds_id = make_dataid(name=band_name, resolution=250) + with pytest.raises(KeyError): + get_key(ds_id, available_datasets, num_results=num_results, best=False) + ds_id = make_dataid(name=band_name, resolution=1000) + res = get_key(ds_id, available_datasets, + num_results=num_results, best=False) + assert num_results == len(res) + + res = reader.load(["1", "2", "3", "4", "5", "6", "7", "8"]) + assert len(res) == 8 + _test_helper(res, ["1", "2", "3", "4", "6", "7", "8"], "reflectance", "%", (2 * 10, 2048)) + assert res["5"].shape == (2 * 10, 2048) + assert res["5"].attrs["calibration"] == "brightness_temperature" + assert res["5"].attrs["units"] == "K" + + def test_250_resolutions(self): + """Test loading data when only 250m resolutions are available.""" + from satpy.dataset.data_dict import get_key + from satpy.readers import load_reader + from satpy.tests.utils import make_dataid + filenames = self.filenames_250m + reader = load_reader(self.reader_configs) + files = reader.select_files_from_pathnames(filenames) + assert len(files) == len(filenames) reader.create_filehandlers(files) # Make sure we have some files assert reader.file_handlers + # Verify that we have multiple resolutions for: + # - Bands 1-4 (visible) + # - Bands 5 (IR) + available_datasets = reader.available_dataset_ids + for band_name in ("1", "2", "3", "4", "5"): + num_results = 2 + ds_id = make_dataid(name=band_name, resolution=250) + res = get_key(ds_id, available_datasets, + num_results=num_results, best=False) + assert num_results == len(res) + ds_id = make_dataid(name=band_name, resolution=1000) + with pytest.raises(KeyError): + get_key(ds_id, available_datasets, num_results=num_results, best=False) + + res = reader.load(["1", "2", "3", "4", "5", "6", "7"]) + assert len(res) == 5 + with pytest.raises(KeyError): + res.__getitem__("6") + with pytest.raises(KeyError): + res.__getitem__("7") + _test_helper(res, ["1", "2", "3", "4"], "reflectance", "%", (2 * 40, 2048 * 2)) + assert res["5"].shape == (2 * 40, 2048 * 2) + assert res["5"].attrs["calibration"] == "brightness_temperature" + assert res["5"].attrs["units"] == "K" + + +class TestFY3AMERSI1L1B(MERSI1L1BTester): + """Test the FY3A MERSI1 L1B reader.""" + + yaml_file = "fy3a_mersi1_l1b.yaml" + filenames_1000m = ["FY3A_MERSI_GBAL_L1_20090601_1200_1000M_MS.hdf"] + filenames_250m = ["FY3A_MERSI_GBAL_L1_20090601_1200_0250M_MS.hdf"] + filenames_all = filenames_1000m + filenames_250m + +class TestFY3BMERSI1L1B(MERSI1L1BTester): + """Test the FY3A MERSI1 L1B reader.""" + yaml_file = "fy3b_mersi1_l1b.yaml" + filenames_1000m = ["FY3B_MERSI_GBAL_L1_20110824_1850_1000M_MS.hdf"] + filenames_250m = ["FY3B_MERSI_GBAL_L1_20110824_1850_0250M_MS.hdf", "FY3B_MERSI_GBAL_L1_20110824_1850_GEOXX_MS.hdf"] + filenames_all = filenames_1000m + filenames_250m + + +class TestFY3CMERSI1L1B(MERSI1L1BTester): + """Test the FY3A MERSI1 L1B reader.""" + + yaml_file = "fy3c_mersi1_l1b.yaml" + filenames_1000m = ["FY3C_MERSI_GBAL_L1_20131002_1835_1000M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEO1K_MS.hdf"] + filenames_250m = ["FY3C_MERSI_GBAL_L1_20131002_1835_0250M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEOQK_MS.hdf"] + filenames_all = filenames_1000m + filenames_250m @@ -524,18 +646,14 @@ def test_all_resolutions(self): res = reader.load(["1", "2", "3", "4", "5", "20", "24", "25"]) assert len(res) == 8 + _test_helper(res, ["1", "2", "3", "4"], "reflectance", "%", (2 * 40, 2048 * 2)) + _test_helper(res, ["24", "25"], "brightness_temperature", "K", (2 * 40, 2048 * 2)) assert res["5"].shape == (2 * 10, 2048) assert res["5"].attrs["calibration"] == "reflectance" assert res["5"].attrs["units"] == "%" assert res["20"].shape == (2 * 10, 2048) assert res["20"].attrs["calibration"] == "brightness_temperature" assert res["20"].attrs["units"] == "K" - assert res["24"].shape == (2 * 40, 2048 * 2) - assert res["24"].attrs["calibration"] == "brightness_temperature" - assert res["24"].attrs["units"] == "K" - assert res["25"].shape == (2 * 40, 2048 * 2) - assert res["25"].attrs["calibration"] == "brightness_temperature" - assert res["25"].attrs["units"] == "K" def test_counts_calib(self): """Test loading data at counts calibration.""" @@ -555,38 +673,8 @@ def test_counts_calib(self): ds_ids.append(make_dataid(name="satellite_zenith_angle")) res = reader.load(ds_ids) assert len(res) == 9 - assert res["1"].shape == (2 * 40, 2048 * 2) - assert res["1"].attrs["calibration"] == "counts" - assert res["1"].dtype == np.uint16 - assert res["1"].attrs["units"] == "1" - assert res["2"].shape == (2 * 40, 2048 * 2) - assert res["2"].attrs["calibration"] == "counts" - assert res["2"].dtype == np.uint16 - assert res["2"].attrs["units"] == "1" - assert res["3"].shape == (2 * 40, 2048 * 2) - assert res["3"].attrs["calibration"] == "counts" - assert res["3"].dtype == np.uint16 - assert res["3"].attrs["units"] == "1" - assert res["4"].shape == (2 * 40, 2048 * 2) - assert res["4"].attrs["calibration"] == "counts" - assert res["4"].dtype == np.uint16 - assert res["4"].attrs["units"] == "1" - assert res["5"].shape == (2 * 10, 2048) - assert res["5"].attrs["calibration"] == "counts" - assert res["5"].dtype == np.uint16 - assert res["5"].attrs["units"] == "1" - assert res["20"].shape == (2 * 10, 2048) - assert res["20"].attrs["calibration"] == "counts" - assert res["20"].dtype == np.uint16 - assert res["20"].attrs["units"] == "1" - assert res["24"].shape == (2 * 40, 2048 * 2) - assert res["24"].attrs["calibration"] == "counts" - assert res["24"].dtype == np.uint16 - assert res["24"].attrs["units"] == "1" - assert res["25"].shape == (2 * 40, 2048 * 2) - assert res["25"].attrs["calibration"] == "counts" - assert res["25"].dtype == np.uint16 - assert res["25"].attrs["units"] == "1" + _test_helper(res, ["1", "2", "3", "4", "24", "25"], "counts", "1", (2 * 40, 2048 * 2)) + _test_helper(res, ["5", "20"], "counts", "1", (2 * 10, 2048)) def test_rad_calib(self): """Test loading data at radiance calibration.""" @@ -605,18 +693,7 @@ def test_rad_calib(self): ds_ids.append(make_dataid(name=band_name, calibration="radiance")) res = reader.load(ds_ids) assert len(res) == 5 - assert res["1"].shape == (2 * 40, 2048 * 2) - assert res["1"].attrs["calibration"] == "radiance" - assert res["1"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["2"].shape == (2 * 40, 2048 * 2) - assert res["2"].attrs["calibration"] == "radiance" - assert res["2"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["3"].shape == (2 * 40, 2048 * 2) - assert res["3"].attrs["calibration"] == "radiance" - assert res["3"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["4"].shape == (2 * 40, 2048 * 2) - assert res["4"].attrs["calibration"] == "radiance" - assert res["4"].attrs["units"] == "mW/ (m2 cm-1 sr)" + _test_helper(res, ["1", "2", "3", "4"], "radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2)) assert res["5"].shape == (2 * 10, 2048) assert res["5"].attrs["calibration"] == "radiance" assert res["5"].attrs["units"] == "mW/ (m2 cm-1 sr)" @@ -654,30 +731,14 @@ def test_1km_resolutions(self): res = reader.load(["1", "2", "3", "4", "5", "20", "24", "25"]) assert len(res) == 8 - assert res["1"].shape == (2 * 10, 2048) - assert res["1"].attrs["calibration"] == "reflectance" - assert res["1"].attrs["units"] == "%" - assert res["2"].shape == (2 * 10, 2048) - assert res["2"].attrs["calibration"] == "reflectance" - assert res["2"].attrs["units"] == "%" - assert res["3"].shape == (2 * 10, 2048) - assert res["3"].attrs["calibration"] == "reflectance" - assert res["3"].attrs["units"] == "%" - assert res["4"].shape == (2 * 10, 2048) - assert res["4"].attrs["calibration"] == "reflectance" - assert res["4"].attrs["units"] == "%" + _test_helper(res, ["1", "2", "3", "4"], "reflectance", "%", (2 * 10, 2048)) + _test_helper(res, ["24", "25"], "brightness_temperature", "K", (2 * 10, 2048)) assert res["5"].shape == (2 * 10, 2048) assert res["5"].attrs["calibration"] == "reflectance" assert res["5"].attrs["units"] == "%" assert res["20"].shape == (2 * 10, 2048) assert res["20"].attrs["calibration"] == "brightness_temperature" assert res["20"].attrs["units"] == "K" - assert res["24"].shape == (2 * 10, 2048) - assert res["24"].attrs["calibration"] == "brightness_temperature" - assert res["24"].attrs["units"] == "K" - assert res["25"].shape == (2 * 10, 2048) - assert res["25"].attrs["calibration"] == "brightness_temperature" - assert res["25"].attrs["units"] == "K" def test_250_resolutions(self): """Test loading data when only 250m resolutions are available.""" @@ -716,7 +777,7 @@ def test_250_resolutions(self): res.__getitem__("5") with pytest.raises(KeyError): res.__getitem__("20") - _test_helper(res) + # _test_helper(res) assert res["24"].shape == (2 * 40, 2048 * 2) assert res["24"].attrs["calibration"] == "brightness_temperature" assert res["24"].attrs["units"] == "K" @@ -790,21 +851,8 @@ def test_rad_calib(self): ds_ids.append(make_dataid(name=band_name, calibration="radiance")) res = reader.load(ds_ids) assert len(res) == 5 - assert res["1"].shape == (2 * 10, 2048) - assert res["1"].attrs["calibration"] == "radiance" - assert res["1"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["3"].shape == (2 * 10, 2048) - assert res["3"].attrs["calibration"] == "radiance" - assert res["3"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["4"].shape == (2 * 10, 2048) - assert res["4"].attrs["calibration"] == "radiance" - assert res["4"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["6"].shape == (2 * 40, 2048 * 2) - assert res["6"].attrs["calibration"] == "radiance" - assert res["6"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["7"].shape == (2 * 40, 2048 * 2) - assert res["7"].attrs["calibration"] == "radiance" - assert res["7"].attrs["units"] == "mW/ (m2 cm-1 sr)" + _test_helper(res, ["1", "3", "4"], "radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048)) + _test_helper(res, ["6", "7"], "radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2)) def test_1km_resolutions(self): """Test loading data when only 1km resolutions are available.""" @@ -843,23 +891,9 @@ def test_1km_resolutions(self): res = reader.load(["1", "2", "3", "5", "6", "7"]) assert len(res) == 6 assert res["1"].shape == (2 * 10, 2048) - assert "radiance" == res["1"].attrs["calibration"] + assert res["1"].attrs["calibration"] == "radiance" assert res["1"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["2"].shape == (2 * 10, 2048) - assert "brightness_temperature" == res["2"].attrs["calibration"] - assert res["2"].attrs["units"] == "K" - assert res["3"].shape == (2 * 10, 2048) - assert "brightness_temperature" == res["3"].attrs["calibration"] - assert res["3"].attrs["units"] == "K" - assert res["5"].shape == (2 * 10, 2048) - assert "brightness_temperature" == res["5"].attrs["calibration"] - assert res["5"].attrs["units"] == "K" - assert res["6"].shape == (2 * 10, 2048) - assert "brightness_temperature" == res["6"].attrs["calibration"] - assert res["6"].attrs["units"] == "K" - assert res["7"].shape == (2 * 10, 2048) - assert "brightness_temperature" == res["7"].attrs["calibration"] - assert res["7"].attrs["units"] == "K" + _test_helper(res, ["2", "3", "5", "6", "7"], "brightness_temperature", "K", (2 * 10, 2048)) def test_250_resolutions(self): """Test loading data when only 250m resolutions are available.""" From 75e9f49950fca12b425df9f27c71d235d9dc750e Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 23:13:11 +0800 Subject: [PATCH 401/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 1a18af39fe..08d3ec37db 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -194,7 +194,7 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols, old_fy3ab_form=False, mers "long_name": b"250m Emissive Bands Earth View " b"Science Data Aggregated to 1 km" }, - dims=("_rows", "_cols")) if mersi1 else \ + dims=("_rows", "_cols")) if mersi1 else xr.DataArray( da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), From 9829d775ce7f852fcd0480512bf2cf3af37ba53d Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 23:14:49 +0800 Subject: [PATCH 402/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 08d3ec37db..1197735591 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -439,10 +439,10 @@ def teardown_method(self): class MERSI1L1BTester(MERSIL1BTester): """Test MERSI1 L1B Reader.""" - yaml_file = None - filenames_1000m = None - filenames_250m = None - filenames_all = None + yaml_file = "" + filenames_1000m = [] + filenames_250m = [] + filenames_all = [] def test_all_resolutions(self): """Test loading data when all resolutions are available.""" From d81860ed1fa3a4991061cb4c55188504e291a65b Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 23:19:58 +0800 Subject: [PATCH 403/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 1197735591..6abb47168f 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -440,9 +440,9 @@ class MERSI1L1BTester(MERSIL1BTester): """Test MERSI1 L1B Reader.""" yaml_file = "" - filenames_1000m = [] - filenames_250m = [] - filenames_all = [] + filenames_1000m: list= [] + filenames_250m: list = [] + filenames_all: list = [] def test_all_resolutions(self): """Test loading data when all resolutions are available.""" From d11d600642114e1cd4e5bf2f89cd417299ca8956 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 23:30:57 +0800 Subject: [PATCH 404/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 90b47a58d6..3c55d6ca45 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -117,13 +117,12 @@ def _get_dn_corrections(self, data, band_index, dataset_id, attrs): slope = attrs.pop("Slope", None) intercept = attrs.pop("Intercept", None) if slope is not None and dataset_id.get("calibration") != "counts": - if band_index is not None and slope.size > 1: - slope = slope[band_index] - intercept = intercept[band_index] + new_slope = slope[band_index] if (band_index is not None and slope.size > 1) else slope + new_intercept = intercept[band_index] if (band_index is not None and slope.size > 1) else intercept # There's a bug in the slope for MERSI-1 11.25(5) - if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" and slope in [100, 1]: - slope = 0.01 - data = data * slope + intercept + new_slope = 0.01 if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" and new_slope in [100, 1] \ + else new_slope + data = data * new_slope + new_intercept return data def get_dataset(self, dataset_id, ds_info): From 45f1d1f0d07442e1eeab12ebf4462ed6fa3d1bf0 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 29 Apr 2024 23:34:24 +0800 Subject: [PATCH 405/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 3c55d6ca45..0dc4644988 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -185,13 +185,11 @@ def _mask_data(self, data, dataset_id, attrs): if valid_range is not None: # Due to a bug in the valid_range upper limit in the 10.8(24) and 12.0(25) # in the HDF data, this is hardcoded here. - if self.sensor_name == "mersi-2": - if dataset_id["name"] in ["24", "25"] and valid_range[1] == 4095: - valid_range[1] = 25000 + valid_range[1] = 25000 if self.sensor_name == "mersi-2" and dataset_id["name"] in ["24", "25"] and \ + valid_range[1] == 4095 else valid_range[1] # Similar bug also found in MERSI-1 - elif self.sensor_name == "mersi-1": - if dataset_id["name"] == "5" and valid_range[1] == 4095: - valid_range[1] = 25000 + valid_range[1] = 25000 if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" and \ + valid_range[1] == 4095 else valid_range[1] # typically bad_values == 65535, saturated == 65534 # dead detector == 65533 data = data.where((data >= valid_range[0]) & From b62a410ac67adbc50ec33e796be17603d15b1612 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 00:07:57 +0800 Subject: [PATCH 406/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 0dc4644988..136068098e 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -116,14 +116,17 @@ def _get_dn_corrections(self, data, band_index, dataset_id, attrs): """Use slope and intercept to get DN corrections.""" slope = attrs.pop("Slope", None) intercept = attrs.pop("Intercept", None) - if slope is not None and dataset_id.get("calibration") != "counts": - new_slope = slope[band_index] if (band_index is not None and slope.size > 1) else slope - new_intercept = intercept[band_index] if (band_index is not None and slope.size > 1) else intercept + try: + new_slope = slope[band_index] + new_intercept = intercept[band_index] # There's a bug in the slope for MERSI-1 11.25(5) new_slope = 0.01 if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" and new_slope in [100, 1] \ else new_slope data = data * new_slope + new_intercept - return data + return data + + except TypeError: + return data def get_dataset(self, dataset_id, ds_info): """Load data variable and metadata and calibrate if needed.""" From 64a4a86ce6c8cb4b7a164fb06bcb5f2484554155 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 00:11:14 +0800 Subject: [PATCH 407/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 136068098e..91e143f7e9 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -185,19 +185,21 @@ def _mask_data(self, data, dataset_id, attrs): new_fill = data.dtype.type(fill_value) else: new_fill = np.nan - if valid_range is not None: + try: # Due to a bug in the valid_range upper limit in the 10.8(24) and 12.0(25) # in the HDF data, this is hardcoded here. valid_range[1] = 25000 if self.sensor_name == "mersi-2" and dataset_id["name"] in ["24", "25"] and \ - valid_range[1] == 4095 else valid_range[1] + valid_range[1] == 4095 else valid_range[1] # Similar bug also found in MERSI-1 valid_range[1] = 25000 if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" and \ - valid_range[1] == 4095 else valid_range[1] + valid_range[1] == 4095 else valid_range[1] # typically bad_values == 65535, saturated == 65534 # dead detector == 65533 data = data.where((data >= valid_range[0]) & (data <= valid_range[1]), new_fill) - return data + return data + except TypeError: + return data def _get_bt_dataset(self, data, calibration_index, wave_number): """Get the dataset as brightness temperature. From a2d4c88b118b30d3294c81fd789ef6dbe1833d1f Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 15:43:10 +0800 Subject: [PATCH 408/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 167 +++++++++------------ 1 file changed, 73 insertions(+), 94 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 6abb47168f..4238a92214 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -43,10 +43,12 @@ def _get_calibration(num_scans, ftype): return calibration -def _get_250m_data(num_scans, rows_per_scan, num_cols, old_fy3ab_form=False): +def _get_250m_data(num_scans, rows_per_scan, num_cols, filetype_info): # Set some default attributes - fill_value_name = "_FillValue" if old_fy3ab_form else "FillValue" - key_prefix = "" if old_fy3ab_form else "Data/" + is_fy3ab_mersi1 = filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")) + + fill_value_name = "_FillValue" if is_fy3ab_mersi1 else "FillValue" + key_prefix = "" if is_fy3ab_mersi1 else "Data/" def_attrs = {fill_value_name: 65535, "valid_range": [0, 4095], @@ -126,88 +128,62 @@ def _get_500m_data(num_scans, rows_per_scan, num_cols): return data -def _get_1km_data(num_scans, rows_per_scan, num_cols, old_fy3ab_form=False, mersi1=False): - fill_value_name = "_FillValue" if old_fy3ab_form else "FillValue" - key_prefix = "" if old_fy3ab_form else "Data/" - radunits = "NO" if mersi1 else "mW/ (m2 cm-1 sr)" +def _get_1km_data(num_scans, rows_per_scan, num_cols, filetype_info): + is_mersi1 = filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1", "fy3c_mersi1")) + is_fy3ab_mersi1 = filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")) - data = { - "Data/EV_1KM_LL": - xr.DataArray( - da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, - dtype=np.uint16), - attrs={ - "Slope": np.array([1.]), "Intercept": np.array([0.]), - "FillValue": 65535, - "units": "NO", - "valid_range": [0, 4095], - "long_name": b"1km Earth View Science Data", - }, + fill_value_name = "_FillValue" if is_fy3ab_mersi1 else "FillValue" + key_prefix = "" if is_fy3ab_mersi1 else "Data/" + radunits = "NO" if is_mersi1 else "mW/ (m2 cm-1 sr)" + + data = {"Data/EV_1KM_LL": + xr.DataArray(da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs={"Slope": np.array([1.]), "Intercept": np.array([0.]), + "FillValue": 65535, + "units": "NO", + "valid_range": [0, 4095], + "long_name": b"1km Earth View Science Data"}, dims=("_rows", "_cols")), - f"{key_prefix}EV_1KM_RefSB": - xr.DataArray( - da.ones((15, num_scans * rows_per_scan, num_cols), chunks=1024, - dtype=np.uint16), - attrs={ - "Slope": np.array([1.] * 15), "Intercept": np.array([0.] * 15), - fill_value_name: 65535, - "units": "NO", - "valid_range": [0, 4095], - "long_name": b"1km Earth View Science Data", - }, + f"{key_prefix}EV_1KM_RefSB": + xr.DataArray(da.ones((15, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs={"Slope": np.array([1.] * 15), "Intercept": np.array([0.] * 15), + fill_value_name: 65535, + "units": "NO", + "valid_range": [0, 4095], + "long_name": b"1km Earth View Science Data"}, dims=("_ref_bands", "_rows", "_cols")), "Data/EV_1KM_Emissive": - xr.DataArray( - da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, - dtype=np.uint16), - attrs={ - "Slope": np.array([1.] * 4), "Intercept": np.array([0.] * 4), - "FillValue": 65535, - "units": "mW/ (m2 cm-1 sr)", - "valid_range": [0, 25000], - "long_name": b"1km Emissive Bands Earth View " - b"Science Data", - }, + xr.DataArray(da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs={"Slope": np.array([1.] * 4), "Intercept": np.array([0.] * 4), + "FillValue": 65535, + "units": "mW/ (m2 cm-1 sr)", + "valid_range": [0, 25000], + "long_name": b"1km Emissive Bands Earth View Science Data"}, dims=("_ir_bands", "_rows", "_cols")), f"{key_prefix}EV_250_Aggr.1KM_RefSB": - xr.DataArray( - da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, - dtype=np.uint16), - attrs={ - "Slope": np.array([1.] * 4), "Intercept": np.array([0.] * 4), - fill_value_name: 65535, - "units": "NO", - "valid_range": [0, 4095], - "long_name": b"250m Reflective Bands Earth View " - b"Science Data Aggregated to 1 km" - }, + xr.DataArray(da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs={"Slope": np.array([1.] * 4), "Intercept": np.array([0.] * 4), + fill_value_name: 65535, + "units": "NO", + "valid_range": [0, 4095], + "long_name": b"250m Reflective Bands Earth View Science Data Aggregated to 1 km"}, dims=("_ref250_bands", "_rows", "_cols")), f"{key_prefix}EV_250_Aggr.1KM_Emissive": - xr.DataArray( - da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, - dtype=np.uint16), - attrs={ - "Slope": np.array([1.]), "Intercept": np.array([0.]), - fill_value_name: 65535, - "units": radunits, - "valid_range": [0, 4095], - "long_name": b"250m Emissive Bands Earth View " - b"Science Data Aggregated to 1 km" - }, - dims=("_rows", "_cols")) if mersi1 else - xr.DataArray( - da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, - dtype=np.uint16), - attrs={ - "Slope": np.array([1.] * 2), "Intercept": np.array([0.] * 2), - "FillValue": 65535, - "units": "mW/ (m2 cm-1 sr)", - "valid_range": [0, 4095], - "long_name": b"250m Emissive Bands Earth View " - b"Science Data Aggregated to 1 km" - }, + xr.DataArray(da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs={"Slope": np.array([1.]), "Intercept": np.array([0.]), + fill_value_name: 65535, + "units": radunits, + "valid_range": [0, 4095], + "long_name": b"250m Emissive Bands Earth View Science Data Aggregated to 1 km"}, + dims=("_rows", "_cols")) if is_mersi1 else + xr.DataArray(da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + attrs={"Slope": np.array([1.] * 2), "Intercept": np.array([0.] * 2), + "FillValue": 65535, + "units": "mW/ (m2 cm-1 sr)", + "valid_range": [0, 4095], + "long_name": b"250m Emissive Bands Earth View Science Data Aggregated to 1 km"}, dims=("_ir250_bands", "_rows", "_cols")) - } + } return data @@ -371,10 +347,10 @@ def _add_band_data_file_content(self): is_250m = "_250" in self.filetype_info["file_type"] if is_1km: - return _get_1km_data(num_scans, rows_per_scan, num_cols, old_fy3ab_form=is_fy3ab_mersi1, mersi1=is_mersi1) + return _get_1km_data(num_scans, rows_per_scan, num_cols, self.filetype_info) elif is_250m: if is_mersi1 or is_mersi2: - return _get_250m_data(num_scans, rows_per_scan, num_cols, old_fy3ab_form=is_fy3ab_mersi1) + return _get_250m_data(num_scans, rows_per_scan, num_cols, self.filetype_info) elif is_mersill: return _get_250m_ll_data(num_scans, rows_per_scan, num_cols) else: @@ -410,8 +386,11 @@ def _geo_prefix_for_file_type(self): return "" -def _test_helper(res, band_list, exp_cal, exp_unit, exp_shape): +def _test_helper(res, band_list, exp_result): """Remove test code duplication.""" + exp_cal = exp_result[0] + exp_unit = exp_result[1] + exp_shape = exp_result[2] for band in band_list: assert res[band].attrs["calibration"] == exp_cal assert res[band].attrs["units"] == exp_unit @@ -474,7 +453,7 @@ def test_all_resolutions(self): res = reader.load(["1", "2", "3", "4", "5", "6", "7", "8"]) assert len(res) == 8 - _test_helper(res, ["1", "2", "3", "4"], "reflectance", "%", (2 * 40, 2048 * 2)) + _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) assert res["5"].shape == (2 * 40, 2048 * 2) assert res["5"].attrs["calibration"] == "brightness_temperature" assert res["5"].attrs["units"] == "K" @@ -500,8 +479,8 @@ def test_counts_calib(self): ds_ids.append(make_dataid(name="satellite_zenith_angle")) res = reader.load(ds_ids) assert len(res) == 9 - _test_helper(res, ["1", "2", "3", "4", "5"], "counts", "1", (2 * 40, 2048 * 2)) - _test_helper(res, ["6", "19", "20"], "counts", "1", (2 * 10, 2048)) + _test_helper(res, ["1", "2", "3", "4", "5"], ("counts", "1", (2 * 40, 2048 * 2))) + _test_helper(res, ["6", "19", "20"], ("counts", "1", (2 * 10, 2048))) def test_1km_resolutions(self): """Test loading data when only 1km resolutions are available.""" @@ -532,7 +511,7 @@ def test_1km_resolutions(self): res = reader.load(["1", "2", "3", "4", "5", "6", "7", "8"]) assert len(res) == 8 - _test_helper(res, ["1", "2", "3", "4", "6", "7", "8"], "reflectance", "%", (2 * 10, 2048)) + _test_helper(res, ["1", "2", "3", "4", "6", "7", "8"], ("reflectance", "%", (2 * 10, 2048))) assert res["5"].shape == (2 * 10, 2048) assert res["5"].attrs["calibration"] == "brightness_temperature" assert res["5"].attrs["units"] == "K" @@ -570,7 +549,7 @@ def test_250_resolutions(self): res.__getitem__("6") with pytest.raises(KeyError): res.__getitem__("7") - _test_helper(res, ["1", "2", "3", "4"], "reflectance", "%", (2 * 40, 2048 * 2)) + _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) assert res["5"].shape == (2 * 40, 2048 * 2) assert res["5"].attrs["calibration"] == "brightness_temperature" assert res["5"].attrs["units"] == "K" @@ -646,8 +625,8 @@ def test_all_resolutions(self): res = reader.load(["1", "2", "3", "4", "5", "20", "24", "25"]) assert len(res) == 8 - _test_helper(res, ["1", "2", "3", "4"], "reflectance", "%", (2 * 40, 2048 * 2)) - _test_helper(res, ["24", "25"], "brightness_temperature", "K", (2 * 40, 2048 * 2)) + _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) + _test_helper(res, ["24", "25"], ("brightness_temperature", "K", (2 * 40, 2048 * 2))) assert res["5"].shape == (2 * 10, 2048) assert res["5"].attrs["calibration"] == "reflectance" assert res["5"].attrs["units"] == "%" @@ -673,8 +652,8 @@ def test_counts_calib(self): ds_ids.append(make_dataid(name="satellite_zenith_angle")) res = reader.load(ds_ids) assert len(res) == 9 - _test_helper(res, ["1", "2", "3", "4", "24", "25"], "counts", "1", (2 * 40, 2048 * 2)) - _test_helper(res, ["5", "20"], "counts", "1", (2 * 10, 2048)) + _test_helper(res, ["1", "2", "3", "4", "24", "25"], ("counts", "1", (2 * 40, 2048 * 2))) + _test_helper(res, ["5", "20"], ("counts", "1", (2 * 10, 2048))) def test_rad_calib(self): """Test loading data at radiance calibration.""" @@ -693,7 +672,7 @@ def test_rad_calib(self): ds_ids.append(make_dataid(name=band_name, calibration="radiance")) res = reader.load(ds_ids) assert len(res) == 5 - _test_helper(res, ["1", "2", "3", "4"], "radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2)) + _test_helper(res, ["1", "2", "3", "4"], ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) assert res["5"].shape == (2 * 10, 2048) assert res["5"].attrs["calibration"] == "radiance" assert res["5"].attrs["units"] == "mW/ (m2 cm-1 sr)" @@ -731,8 +710,8 @@ def test_1km_resolutions(self): res = reader.load(["1", "2", "3", "4", "5", "20", "24", "25"]) assert len(res) == 8 - _test_helper(res, ["1", "2", "3", "4"], "reflectance", "%", (2 * 10, 2048)) - _test_helper(res, ["24", "25"], "brightness_temperature", "K", (2 * 10, 2048)) + _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 10, 2048))) + _test_helper(res, ["24", "25"], ("brightness_temperature", "K", (2 * 10, 2048))) assert res["5"].shape == (2 * 10, 2048) assert res["5"].attrs["calibration"] == "reflectance" assert res["5"].attrs["units"] == "%" @@ -851,8 +830,8 @@ def test_rad_calib(self): ds_ids.append(make_dataid(name=band_name, calibration="radiance")) res = reader.load(ds_ids) assert len(res) == 5 - _test_helper(res, ["1", "3", "4"], "radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048)) - _test_helper(res, ["6", "7"], "radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2)) + _test_helper(res, ["1", "3", "4"], ("radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048))) + _test_helper(res, ["6", "7"], ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) def test_1km_resolutions(self): """Test loading data when only 1km resolutions are available.""" @@ -893,7 +872,7 @@ def test_1km_resolutions(self): assert res["1"].shape == (2 * 10, 2048) assert res["1"].attrs["calibration"] == "radiance" assert res["1"].attrs["units"] == "mW/ (m2 cm-1 sr)" - _test_helper(res, ["2", "3", "5", "6", "7"], "brightness_temperature", "K", (2 * 10, 2048)) + _test_helper(res, ["2", "3", "5", "6", "7"], ("brightness_temperature", "K", (2 * 10, 2048))) def test_250_resolutions(self): """Test loading data when only 250m resolutions are available.""" From 9d699cd4c56a62185888266de9b51446baf68330 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 15:44:20 +0800 Subject: [PATCH 409/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 1 - 1 file changed, 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 4238a92214..d07ca1b078 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -340,7 +340,6 @@ def _add_band_data_file_content(self): num_scans = self.num_scans rows_per_scan = self._rows_per_scan is_mersi1 = self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1", "fy3c_mersi1")) - is_fy3ab_mersi1 = self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")) is_mersi2 = self.filetype_info["file_type"].startswith("mersi2_") is_mersill = self.filetype_info["file_type"].startswith("mersi_ll") is_1km = "_1000" in self.filetype_info["file_type"] From 26d3b1621fc711ec8630e480b52c5ba9c2766137 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 16:00:57 +0800 Subject: [PATCH 410/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index d07ca1b078..188eefd65c 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -473,13 +473,13 @@ def test_counts_calib(self): assert reader.file_handlers ds_ids = [] - for band_name in ["1", "2", "3", "4", "5", "6", "19", "20"]: + for band_name in ["1", "5", "16", "19", "20"]: ds_ids.append(make_dataid(name=band_name, calibration="counts")) ds_ids.append(make_dataid(name="satellite_zenith_angle")) res = reader.load(ds_ids) - assert len(res) == 9 - _test_helper(res, ["1", "2", "3", "4", "5"], ("counts", "1", (2 * 40, 2048 * 2))) - _test_helper(res, ["6", "19", "20"], ("counts", "1", (2 * 10, 2048))) + assert len(res) == 6 + _test_helper(res, ["1", "5"], ("counts", "1", (2 * 40, 2048 * 2))) + _test_helper(res, ["16", "19", "20"], ("counts", "1", (2 * 10, 2048))) def test_1km_resolutions(self): """Test loading data when only 1km resolutions are available.""" @@ -498,7 +498,7 @@ def test_1km_resolutions(self): # - Bands 1-4 (visible) # - Bands 5 (IR) available_datasets = reader.available_dataset_ids - for band_name in ("1", "2", "3", "4", "5"): + for band_name in ("3", "5", "9", "14", "17"): num_results = 2 ds_id = make_dataid(name=band_name, resolution=250) with pytest.raises(KeyError): @@ -508,9 +508,9 @@ def test_1km_resolutions(self): num_results=num_results, best=False) assert num_results == len(res) - res = reader.load(["1", "2", "3", "4", "5", "6", "7", "8"]) - assert len(res) == 8 - _test_helper(res, ["1", "2", "3", "4", "6", "7", "8"], ("reflectance", "%", (2 * 10, 2048))) + res = reader.load(["2", "4", "5", "12", "15", "18"]) + assert len(res) == 6 + _test_helper(res, ["2", "4", "12", "15", "18"], ("reflectance", "%", (2 * 10, 2048))) assert res["5"].shape == (2 * 10, 2048) assert res["5"].attrs["calibration"] == "brightness_temperature" assert res["5"].attrs["units"] == "K" @@ -532,7 +532,7 @@ def test_250_resolutions(self): # - Bands 1-4 (visible) # - Bands 5 (IR) available_datasets = reader.available_dataset_ids - for band_name in ("1", "2", "3", "4", "5"): + for band_name in ("2", "3", "4", "5"): num_results = 2 ds_id = make_dataid(name=band_name, resolution=250) res = get_key(ds_id, available_datasets, @@ -542,13 +542,13 @@ def test_250_resolutions(self): with pytest.raises(KeyError): get_key(ds_id, available_datasets, num_results=num_results, best=False) - res = reader.load(["1", "2", "3", "4", "5", "6", "7"]) - assert len(res) == 5 + res = reader.load(["1", "2", "4", "5", "11", "13", "15"]) + assert len(res) == 4 with pytest.raises(KeyError): res.__getitem__("6") with pytest.raises(KeyError): res.__getitem__("7") - _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) + _test_helper(res, ["1", "2", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) assert res["5"].shape == (2 * 40, 2048 * 2) assert res["5"].attrs["calibration"] == "brightness_temperature" assert res["5"].attrs["units"] == "K" @@ -755,7 +755,7 @@ def test_250_resolutions(self): res.__getitem__("5") with pytest.raises(KeyError): res.__getitem__("20") - # _test_helper(res) + _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) assert res["24"].shape == (2 * 40, 2048 * 2) assert res["24"].attrs["calibration"] == "brightness_temperature" assert res["24"].attrs["units"] == "K" From 9495d5d1d9430ad53ecdc3cd8d12ba01d52683dc Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 16:03:28 +0800 Subject: [PATCH 411/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 188eefd65c..0b89f9bb82 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -350,10 +350,8 @@ def _add_band_data_file_content(self): elif is_250m: if is_mersi1 or is_mersi2: return _get_250m_data(num_scans, rows_per_scan, num_cols, self.filetype_info) - elif is_mersill: - return _get_250m_ll_data(num_scans, rows_per_scan, num_cols) else: - return + return _get_250m_ll_data(num_scans, rows_per_scan, num_cols) else: return _get_500m_data(num_scans, rows_per_scan, num_cols) From f6f2105090fd6e5265202ebbde6569ad00301a0f Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 16:05:42 +0800 Subject: [PATCH 412/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 0b89f9bb82..4062bd0e20 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -339,8 +339,6 @@ def _add_band_data_file_content(self): num_cols = self._num_cols_for_file_type num_scans = self.num_scans rows_per_scan = self._rows_per_scan - is_mersi1 = self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1", "fy3c_mersi1")) - is_mersi2 = self.filetype_info["file_type"].startswith("mersi2_") is_mersill = self.filetype_info["file_type"].startswith("mersi_ll") is_1km = "_1000" in self.filetype_info["file_type"] is_250m = "_250" in self.filetype_info["file_type"] @@ -348,10 +346,10 @@ def _add_band_data_file_content(self): if is_1km: return _get_1km_data(num_scans, rows_per_scan, num_cols, self.filetype_info) elif is_250m: - if is_mersi1 or is_mersi2: - return _get_250m_data(num_scans, rows_per_scan, num_cols, self.filetype_info) - else: + if is_mersill: return _get_250m_ll_data(num_scans, rows_per_scan, num_cols) + else: + return _get_250m_data(num_scans, rows_per_scan, num_cols, self.filetype_info) else: return _get_500m_data(num_scans, rows_per_scan, num_cols) From bfe22db57508ef6478ab3fcb9bf4dd6caf8148db Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 20:01:10 +0800 Subject: [PATCH 413/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 221 +++++++++------------ 1 file changed, 93 insertions(+), 128 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 4062bd0e20..e8c7d50d4e 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -392,6 +392,17 @@ def _test_helper(res, band_list, exp_result): assert res[band].shape == exp_shape +def _test_find_files_and_readers(reader_config, filenames): + from satpy.readers import load_reader + reader = load_reader(reader_config) + files = reader.select_files_from_pathnames(filenames) + # Make sure we have some files + reader.create_filehandlers(files) + assert len(files) == len(filenames) + assert reader.file_handlers + return files, reader + + class MERSIL1BTester: """Test MERSI1/2/LL/RM L1B Reader.""" @@ -419,54 +430,80 @@ class MERSI1L1BTester(MERSIL1BTester): filenames_all: list = [] def test_all_resolutions(self): - """Test loading data when all resolutions are available.""" + """Test loading data when all resolutions or specific one are available.""" from satpy.dataset.data_dict import get_key - from satpy.readers import load_reader from satpy.tests.utils import make_dataid - filenames = self.filenames_all - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert len(files) == len(filenames) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - # Verify that we have multiple resolutions for: - # - Bands 1-4 (visible) - # - Bands 5 (IR) - available_datasets = reader.available_dataset_ids - for band_name in ("1", "2", "3", "4", "5"): - num_results = 2 - ds_id = make_dataid(name=band_name, resolution=250) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - ds_id = make_dataid(name=band_name, resolution=1000) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) + from satpy.readers import load_reader - res = reader.load(["1", "2", "3", "4", "5", "6", "7", "8"]) - assert len(res) == 8 - _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) - assert res["5"].shape == (2 * 40, 2048 * 2) - assert res["5"].attrs["calibration"] == "brightness_temperature" - assert res["5"].attrs["units"] == "K" - assert res["6"].shape == (2 * 10, 2048) - assert res["6"].attrs["calibration"] == "reflectance" - assert res["6"].attrs["units"] == "%" + resolution_list = ["all", "250", "1000"] + file_list = [self.filenames_all, self.filenames_250m, self.filenames_1000m] + vis_250_bands = ["1", "2", "3", "4"] + ir_250_bands = ["5"] + vis_1000_bands = ["6", "7", "8", "11", "15", "19", "20"] + ir_1000_bands = [] + bands_1000 = vis_1000_bands + ir_1000_bands + bands_250 = vis_250_bands + ir_250_bands + + for resolution in resolution_list: + filenames = file_list[resolution_list.index(resolution)] + reader = load_reader(self.reader_configs) + files = reader.select_files_from_pathnames(filenames) + assert len(files) == len(filenames) + reader.create_filehandlers(files) + # Make sure we have some files + assert reader.file_handlers + + # Verify that we have multiple resolutions for: + # - Bands 1-4 (visible) + # - Bands 5 (IR) + available_datasets = reader.available_dataset_ids + for band_name in bands_250: + num_results = 2 # ("reflectance"/"brightness temperature" and "coutns") + + ds_id = make_dataid(name=band_name, resolution=250) + if resolution == "1000": + with pytest.raises(KeyError): + get_key(ds_id, available_datasets, num_results=num_results, best=False) + else: + res = get_key(ds_id, available_datasets, num_results=num_results, best=False) + assert num_results == len(res) + + ds_id = make_dataid(name=band_name, resolution=1000) + if resolution == "250": + with pytest.raises(KeyError): + get_key(ds_id, available_datasets, num_results=num_results, best=False) + else: + res = get_key(ds_id, available_datasets, num_results=num_results, best=False) + assert num_results == len(res) + + res = reader.load(bands_1000 + bands_250) + if resolution != "250": + assert len(res) == len(bands_1000 + bands_250) + else: + assert len(res) == len(bands_250) + for band in bands_1000: + with pytest.raises(KeyError): + res.__getitem__(band) + + if resolution in ["all", "250"]: + _test_helper(res, vis_250_bands, ("reflectance", "%", (2 * 40, 2048 * 2))) + _test_helper(res, ir_250_bands, ("brightness_temperature", "K", (2 * 40, 2048 * 2))) + + if resolution == "all": + _test_helper(res, vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) + _test_helper(res, ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) + else: + _test_helper(res, vis_250_bands, ("reflectance", "%", (2 * 10, 2048))) + _test_helper(res, vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) + _test_helper(res, ir_250_bands, ("brightness_temperature", "K", (2 * 10, 2048))) + _test_helper(res, ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) def test_counts_calib(self): """Test loading data at counts calibration.""" - from satpy.readers import load_reader + from satpy.dataset.data_dict import get_key from satpy.tests.utils import make_dataid filenames = self.filenames_all - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert len(files) == len(filenames) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers + files, reader = _test_find_files_and_readers(self.reader_configs, filenames) ds_ids = [] for band_name in ["1", "5", "16", "19", "20"]: @@ -477,78 +514,6 @@ def test_counts_calib(self): _test_helper(res, ["1", "5"], ("counts", "1", (2 * 40, 2048 * 2))) _test_helper(res, ["16", "19", "20"], ("counts", "1", (2 * 10, 2048))) - def test_1km_resolutions(self): - """Test loading data when only 1km resolutions are available.""" - from satpy.dataset.data_dict import get_key - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_1000m - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert len(files) == len(filenames) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - # Verify that we have multiple resolutions for: - # - Bands 1-4 (visible) - # - Bands 5 (IR) - available_datasets = reader.available_dataset_ids - for band_name in ("3", "5", "9", "14", "17"): - num_results = 2 - ds_id = make_dataid(name=band_name, resolution=250) - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=num_results, best=False) - ds_id = make_dataid(name=band_name, resolution=1000) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - - res = reader.load(["2", "4", "5", "12", "15", "18"]) - assert len(res) == 6 - _test_helper(res, ["2", "4", "12", "15", "18"], ("reflectance", "%", (2 * 10, 2048))) - assert res["5"].shape == (2 * 10, 2048) - assert res["5"].attrs["calibration"] == "brightness_temperature" - assert res["5"].attrs["units"] == "K" - - def test_250_resolutions(self): - """Test loading data when only 250m resolutions are available.""" - from satpy.dataset.data_dict import get_key - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_250m - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert len(files) == len(filenames) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - # Verify that we have multiple resolutions for: - # - Bands 1-4 (visible) - # - Bands 5 (IR) - available_datasets = reader.available_dataset_ids - for band_name in ("2", "3", "4", "5"): - num_results = 2 - ds_id = make_dataid(name=band_name, resolution=250) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - ds_id = make_dataid(name=band_name, resolution=1000) - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=num_results, best=False) - - res = reader.load(["1", "2", "4", "5", "11", "13", "15"]) - assert len(res) == 4 - with pytest.raises(KeyError): - res.__getitem__("6") - with pytest.raises(KeyError): - res.__getitem__("7") - _test_helper(res, ["1", "2", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) - assert res["5"].shape == (2 * 40, 2048 * 2) - assert res["5"].attrs["calibration"] == "brightness_temperature" - assert res["5"].attrs["units"] == "K" - class TestFY3AMERSI1L1B(MERSI1L1BTester): """Test the FY3A MERSI1 L1B reader.""" @@ -559,22 +524,22 @@ class TestFY3AMERSI1L1B(MERSI1L1BTester): filenames_all = filenames_1000m + filenames_250m -class TestFY3BMERSI1L1B(MERSI1L1BTester): - """Test the FY3A MERSI1 L1B reader.""" - - yaml_file = "fy3b_mersi1_l1b.yaml" - filenames_1000m = ["FY3B_MERSI_GBAL_L1_20110824_1850_1000M_MS.hdf"] - filenames_250m = ["FY3B_MERSI_GBAL_L1_20110824_1850_0250M_MS.hdf", "FY3B_MERSI_GBAL_L1_20110824_1850_GEOXX_MS.hdf"] - filenames_all = filenames_1000m + filenames_250m - - -class TestFY3CMERSI1L1B(MERSI1L1BTester): - """Test the FY3A MERSI1 L1B reader.""" - - yaml_file = "fy3c_mersi1_l1b.yaml" - filenames_1000m = ["FY3C_MERSI_GBAL_L1_20131002_1835_1000M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEO1K_MS.hdf"] - filenames_250m = ["FY3C_MERSI_GBAL_L1_20131002_1835_0250M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEOQK_MS.hdf"] - filenames_all = filenames_1000m + filenames_250m +# class TestFY3BMERSI1L1B(MERSI1L1BTester): +# """Test the FY3A MERSI1 L1B reader.""" +# +# yaml_file = "fy3b_mersi1_l1b.yaml" +# filenames_1000m = ["FY3B_MERSI_GBAL_L1_20110824_1850_1000M_MS.hdf"] +# filenames_250m = ["FY3B_MERSI_GBAL_L1_20110824_1850_0250M_MS.hdf", "FY3B_MERSI_GBAL_L1_20110824_1850_GEOXX_MS.hdf"] +# filenames_all = filenames_1000m + filenames_250m +# +# +# class TestFY3CMERSI1L1B(MERSI1L1BTester): +# """Test the FY3A MERSI1 L1B reader.""" +# +# yaml_file = "fy3c_mersi1_l1b.yaml" +# filenames_1000m = ["FY3C_MERSI_GBAL_L1_20131002_1835_1000M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEO1K_MS.hdf"] +# filenames_250m = ["FY3C_MERSI_GBAL_L1_20131002_1835_0250M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEOQK_MS.hdf"] +# filenames_all = filenames_1000m + filenames_250m From 9ff7419450ad42c21d8b071fda2b47daaca7a0ca Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 20:23:15 +0800 Subject: [PATCH 414/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 38 ++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index e8c7d50d4e..976dee5fef 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -403,6 +403,26 @@ def _test_find_files_and_readers(reader_config, filenames): return files, reader +def _test_multi_resolutions(available_datasets, band_name, test_resolution, cal_results_number): + from satpy.dataset.data_dict import get_key + from satpy.tests.utils import make_dataid + ds_id = make_dataid(name=band_name, resolution=250) + if test_resolution == "1000": + with pytest.raises(KeyError): + get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) + else: + res = get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) + assert len(res) == cal_results_number + + ds_id = make_dataid(name=band_name, resolution=1000) + if test_resolution == "250": + with pytest.raises(KeyError): + get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) + else: + res = get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) + assert len(res) == cal_results_number + + class MERSIL1BTester: """Test MERSI1/2/LL/RM L1B Reader.""" @@ -459,22 +479,7 @@ def test_all_resolutions(self): available_datasets = reader.available_dataset_ids for band_name in bands_250: num_results = 2 # ("reflectance"/"brightness temperature" and "coutns") - - ds_id = make_dataid(name=band_name, resolution=250) - if resolution == "1000": - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=num_results, best=False) - else: - res = get_key(ds_id, available_datasets, num_results=num_results, best=False) - assert num_results == len(res) - - ds_id = make_dataid(name=band_name, resolution=1000) - if resolution == "250": - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=num_results, best=False) - else: - res = get_key(ds_id, available_datasets, num_results=num_results, best=False) - assert num_results == len(res) + _test_multi_resolutions(available_datasets, band_name, resolution, num_results) res = reader.load(bands_1000 + bands_250) if resolution != "250": @@ -500,7 +505,6 @@ def test_all_resolutions(self): def test_counts_calib(self): """Test loading data at counts calibration.""" - from satpy.dataset.data_dict import get_key from satpy.tests.utils import make_dataid filenames = self.filenames_all files, reader = _test_find_files_and_readers(self.reader_configs, filenames) From 9600428d6fdd2dd9bd298d09983902d5d9a85d2a Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 21:19:30 +0800 Subject: [PATCH 415/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 113 ++++++++++----------- 1 file changed, 53 insertions(+), 60 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 976dee5fef..5956fe9a63 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -400,27 +400,28 @@ def _test_find_files_and_readers(reader_config, filenames): reader.create_filehandlers(files) assert len(files) == len(filenames) assert reader.file_handlers - return files, reader + return reader -def _test_multi_resolutions(available_datasets, band_name, test_resolution, cal_results_number): - from satpy.dataset.data_dict import get_key - from satpy.tests.utils import make_dataid - ds_id = make_dataid(name=band_name, resolution=250) - if test_resolution == "1000": - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) - else: - res = get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) - assert len(res) == cal_results_number +def _test_multi_resolutions(available_datasets, band_list, test_resolution, cal_results_number): + for band_name in band_list: + from satpy.dataset.data_dict import get_key + from satpy.tests.utils import make_dataid + ds_id = make_dataid(name=band_name, resolution=250) + if test_resolution == "1000": + with pytest.raises(KeyError): + get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) + else: + res = get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) + assert len(res) == cal_results_number - ds_id = make_dataid(name=band_name, resolution=1000) - if test_resolution == "250": - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) - else: - res = get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) - assert len(res) == cal_results_number + ds_id = make_dataid(name=band_name, resolution=1000) + if test_resolution == "250": + with pytest.raises(KeyError): + get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) + else: + res = get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) + assert len(res) == cal_results_number class MERSIL1BTester: @@ -448,38 +449,30 @@ class MERSI1L1BTester(MERSIL1BTester): filenames_1000m: list= [] filenames_250m: list = [] filenames_all: list = [] + vis_250_bands = ["1", "2", "3", "4"] + ir_250_bands = ["5"] + vis_1000_bands = ["6", "7", "8", "11", "15", "19", "20"] + ir_1000_bands = [] def test_all_resolutions(self): """Test loading data when all resolutions or specific one are available.""" - from satpy.dataset.data_dict import get_key - from satpy.tests.utils import make_dataid from satpy.readers import load_reader resolution_list = ["all", "250", "1000"] file_list = [self.filenames_all, self.filenames_250m, self.filenames_1000m] - vis_250_bands = ["1", "2", "3", "4"] - ir_250_bands = ["5"] - vis_1000_bands = ["6", "7", "8", "11", "15", "19", "20"] - ir_1000_bands = [] - bands_1000 = vis_1000_bands + ir_1000_bands - bands_250 = vis_250_bands + ir_250_bands + bands_1000 = self.vis_1000_bands + self.ir_1000_bands + bands_250 = self.vis_250_bands + self.ir_250_bands for resolution in resolution_list: filenames = file_list[resolution_list.index(resolution)] - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert len(files) == len(filenames) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers + reader = _test_find_files_and_readers(self.reader_configs, filenames) # Verify that we have multiple resolutions for: # - Bands 1-4 (visible) # - Bands 5 (IR) available_datasets = reader.available_dataset_ids - for band_name in bands_250: - num_results = 2 # ("reflectance"/"brightness temperature" and "coutns") - _test_multi_resolutions(available_datasets, band_name, resolution, num_results) + num_results = 2 # ("reflectance"/"brightness temperature" and "coutns") + _test_multi_resolutions(available_datasets, bands_250, resolution, num_results) res = reader.load(bands_1000 + bands_250) if resolution != "250": @@ -491,23 +484,23 @@ def test_all_resolutions(self): res.__getitem__(band) if resolution in ["all", "250"]: - _test_helper(res, vis_250_bands, ("reflectance", "%", (2 * 40, 2048 * 2))) - _test_helper(res, ir_250_bands, ("brightness_temperature", "K", (2 * 40, 2048 * 2))) + _test_helper(res, self.vis_250_bands, ("reflectance", "%", (2 * 40, 2048 * 2))) + _test_helper(res, self.ir_250_bands, ("brightness_temperature", "K", (2 * 40, 2048 * 2))) if resolution == "all": - _test_helper(res, vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) - _test_helper(res, ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) + _test_helper(res, self.vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) + _test_helper(res, self.ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) else: - _test_helper(res, vis_250_bands, ("reflectance", "%", (2 * 10, 2048))) - _test_helper(res, vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) - _test_helper(res, ir_250_bands, ("brightness_temperature", "K", (2 * 10, 2048))) - _test_helper(res, ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) + _test_helper(res, self.vis_250_bands, ("reflectance", "%", (2 * 10, 2048))) + _test_helper(res, self.vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) + _test_helper(res, self.ir_250_bands, ("brightness_temperature", "K", (2 * 10, 2048))) + _test_helper(res, self.ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) def test_counts_calib(self): """Test loading data at counts calibration.""" from satpy.tests.utils import make_dataid filenames = self.filenames_all - files, reader = _test_find_files_and_readers(self.reader_configs, filenames) + reader = _test_find_files_and_readers(self.reader_configs, filenames) ds_ids = [] for band_name in ["1", "5", "16", "19", "20"]: @@ -528,22 +521,22 @@ class TestFY3AMERSI1L1B(MERSI1L1BTester): filenames_all = filenames_1000m + filenames_250m -# class TestFY3BMERSI1L1B(MERSI1L1BTester): -# """Test the FY3A MERSI1 L1B reader.""" -# -# yaml_file = "fy3b_mersi1_l1b.yaml" -# filenames_1000m = ["FY3B_MERSI_GBAL_L1_20110824_1850_1000M_MS.hdf"] -# filenames_250m = ["FY3B_MERSI_GBAL_L1_20110824_1850_0250M_MS.hdf", "FY3B_MERSI_GBAL_L1_20110824_1850_GEOXX_MS.hdf"] -# filenames_all = filenames_1000m + filenames_250m -# -# -# class TestFY3CMERSI1L1B(MERSI1L1BTester): -# """Test the FY3A MERSI1 L1B reader.""" -# -# yaml_file = "fy3c_mersi1_l1b.yaml" -# filenames_1000m = ["FY3C_MERSI_GBAL_L1_20131002_1835_1000M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEO1K_MS.hdf"] -# filenames_250m = ["FY3C_MERSI_GBAL_L1_20131002_1835_0250M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEOQK_MS.hdf"] -# filenames_all = filenames_1000m + filenames_250m +class TestFY3BMERSI1L1B(MERSI1L1BTester): + """Test the FY3A MERSI1 L1B reader.""" + + yaml_file = "fy3b_mersi1_l1b.yaml" + filenames_1000m = ["FY3B_MERSI_GBAL_L1_20110824_1850_1000M_MS.hdf"] + filenames_250m = ["FY3B_MERSI_GBAL_L1_20110824_1850_0250M_MS.hdf", "FY3B_MERSI_GBAL_L1_20110824_1850_GEOXX_MS.hdf"] + filenames_all = filenames_1000m + filenames_250m + + +class TestFY3CMERSI1L1B(MERSI1L1BTester): + """Test the FY3A MERSI1 L1B reader.""" + + yaml_file = "fy3c_mersi1_l1b.yaml" + filenames_1000m = ["FY3C_MERSI_GBAL_L1_20131002_1835_1000M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEO1K_MS.hdf"] + filenames_250m = ["FY3C_MERSI_GBAL_L1_20131002_1835_0250M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEOQK_MS.hdf"] + filenames_all = filenames_1000m + filenames_250m From 96c8672af0e468806f271d36e6c094c910a62675 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 21:27:02 +0800 Subject: [PATCH 416/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 50 +++++++++++++++------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 5956fe9a63..6c9bb8d7af 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -445,14 +445,16 @@ def teardown_method(self): class MERSI1L1BTester(MERSIL1BTester): """Test MERSI1 L1B Reader.""" - yaml_file = "" + yaml_file: str = "" filenames_1000m: list= [] filenames_250m: list = [] filenames_all: list = [] - vis_250_bands = ["1", "2", "3", "4"] - ir_250_bands = ["5"] - vis_1000_bands = ["6", "7", "8", "11", "15", "19", "20"] - ir_1000_bands = [] + vis_250_bands: list = [] + ir_250_bands: list = [] + vis_1000_bands: list = [] + ir_1000_bands: list = [] + bands_1000: list = [] + bands_250: list = [] def test_all_resolutions(self): """Test loading data when all resolutions or specific one are available.""" @@ -460,8 +462,6 @@ def test_all_resolutions(self): resolution_list = ["all", "250", "1000"] file_list = [self.filenames_all, self.filenames_250m, self.filenames_1000m] - bands_1000 = self.vis_1000_bands + self.ir_1000_bands - bands_250 = self.vis_250_bands + self.ir_250_bands for resolution in resolution_list: filenames = file_list[resolution_list.index(resolution)] @@ -472,14 +472,14 @@ def test_all_resolutions(self): # - Bands 5 (IR) available_datasets = reader.available_dataset_ids num_results = 2 # ("reflectance"/"brightness temperature" and "coutns") - _test_multi_resolutions(available_datasets, bands_250, resolution, num_results) + _test_multi_resolutions(available_datasets, self.bands_250, resolution, num_results) - res = reader.load(bands_1000 + bands_250) + res = reader.load(self.bands_1000 + self.bands_250) if resolution != "250": - assert len(res) == len(bands_1000 + bands_250) + assert len(res) == len(self.bands_1000 + self.bands_250) else: - assert len(res) == len(bands_250) - for band in bands_1000: + assert len(res) == len(self.bands_250) + for band in self.bands_1000: with pytest.raises(KeyError): res.__getitem__(band) @@ -503,13 +503,13 @@ def test_counts_calib(self): reader = _test_find_files_and_readers(self.reader_configs, filenames) ds_ids = [] - for band_name in ["1", "5", "16", "19", "20"]: + for band_name in self.bands_1000 + self.bands_250: ds_ids.append(make_dataid(name=band_name, calibration="counts")) ds_ids.append(make_dataid(name="satellite_zenith_angle")) res = reader.load(ds_ids) - assert len(res) == 6 - _test_helper(res, ["1", "5"], ("counts", "1", (2 * 40, 2048 * 2))) - _test_helper(res, ["16", "19", "20"], ("counts", "1", (2 * 10, 2048))) + assert len(res) == len(self.bands_1000) + len(self.bands_250) + 1 + _test_helper(res, self.bands_250, ("counts", "1", (2 * 40, 2048 * 2))) + _test_helper(res, self.bands_1000, ("counts", "1", (2 * 10, 2048))) class TestFY3AMERSI1L1B(MERSI1L1BTester): @@ -519,6 +519,12 @@ class TestFY3AMERSI1L1B(MERSI1L1BTester): filenames_1000m = ["FY3A_MERSI_GBAL_L1_20090601_1200_1000M_MS.hdf"] filenames_250m = ["FY3A_MERSI_GBAL_L1_20090601_1200_0250M_MS.hdf"] filenames_all = filenames_1000m + filenames_250m + vis_250_bands = ["1", "2", "3", "4"] + ir_250_bands = ["5"] + vis_1000_bandst = ["6", "7", "8", "11", "15", "19", "20"] + ir_1000_bands = [] + bands_1000 = vis_1000_bandst + ir_1000_bands + bands_250 = vis_250_bands + ir_250_bands class TestFY3BMERSI1L1B(MERSI1L1BTester): @@ -528,6 +534,12 @@ class TestFY3BMERSI1L1B(MERSI1L1BTester): filenames_1000m = ["FY3B_MERSI_GBAL_L1_20110824_1850_1000M_MS.hdf"] filenames_250m = ["FY3B_MERSI_GBAL_L1_20110824_1850_0250M_MS.hdf", "FY3B_MERSI_GBAL_L1_20110824_1850_GEOXX_MS.hdf"] filenames_all = filenames_1000m + filenames_250m + vis_250_bands = ["1", "2", "3", "4"] + ir_250_bands = ["5"] + vis_1000_bandst = ["6", "7", "8", "11", "15", "19", "20"] + ir_1000_bands = [] + bands_1000 = vis_1000_bandst + ir_1000_bands + bands_250 = vis_250_bands + ir_250_bands class TestFY3CMERSI1L1B(MERSI1L1BTester): @@ -537,6 +549,12 @@ class TestFY3CMERSI1L1B(MERSI1L1BTester): filenames_1000m = ["FY3C_MERSI_GBAL_L1_20131002_1835_1000M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEO1K_MS.hdf"] filenames_250m = ["FY3C_MERSI_GBAL_L1_20131002_1835_0250M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEOQK_MS.hdf"] filenames_all = filenames_1000m + filenames_250m + vis_250_bands = ["1", "2", "3", "4"] + ir_250_bands = ["5"] + vis_1000_bandst = ["6", "7", "8", "11", "15", "19", "20"] + ir_1000_bands = [] + bands_1000 = vis_1000_bandst + ir_1000_bands + bands_250 = vis_250_bands + ir_250_bands From 62ef70ddc11596853c8ff08c9802fd5067f1eb7a Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 30 Apr 2024 23:55:47 +0800 Subject: [PATCH 417/481] calibration and tests --- satpy/etc/readers/fy3a_mersi1_l1b.yaml | 3 + satpy/etc/readers/fy3b_mersi1_l1b.yaml | 3 + satpy/etc/readers/fy3c_mersi1_l1b.yaml | 3 + satpy/etc/readers/mersi2_l1b.yaml | 20 +- satpy/etc/readers/mersi_ll_l1b.yaml | 29 +- satpy/readers/mersi_l1b.py | 3 + satpy/tests/reader_tests/test_mersi_l1b.py | 391 +++------------------ 7 files changed, 113 insertions(+), 339 deletions(-) diff --git a/satpy/etc/readers/fy3a_mersi1_l1b.yaml b/satpy/etc/readers/fy3a_mersi1_l1b.yaml index 0f16f46454..7ce31300bb 100644 --- a/satpy/etc/readers/fy3a_mersi1_l1b.yaml +++ b/satpy/etc/readers/fy3a_mersi1_l1b.yaml @@ -125,6 +125,9 @@ datasets: brightness_temperature: units: "K" standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts diff --git a/satpy/etc/readers/fy3b_mersi1_l1b.yaml b/satpy/etc/readers/fy3b_mersi1_l1b.yaml index 02f7e14883..65ce53cd73 100644 --- a/satpy/etc/readers/fy3b_mersi1_l1b.yaml +++ b/satpy/etc/readers/fy3b_mersi1_l1b.yaml @@ -131,6 +131,9 @@ datasets: brightness_temperature: units: "K" standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts diff --git a/satpy/etc/readers/fy3c_mersi1_l1b.yaml b/satpy/etc/readers/fy3c_mersi1_l1b.yaml index 31c52d5ee5..e797b52405 100644 --- a/satpy/etc/readers/fy3c_mersi1_l1b.yaml +++ b/satpy/etc/readers/fy3c_mersi1_l1b.yaml @@ -145,6 +145,9 @@ datasets: brightness_temperature: units: "K" standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts diff --git a/satpy/etc/readers/mersi2_l1b.yaml b/satpy/etc/readers/mersi2_l1b.yaml index 78bd861169..3e0ecb390c 100644 --- a/satpy/etc/readers/mersi2_l1b.yaml +++ b/satpy/etc/readers/mersi2_l1b.yaml @@ -468,8 +468,6 @@ datasets: counts: units: "1" standard_name: counts - - # Not sure how to get radiance for BT channels '20': name: '20' wavelength: [3.710, 3.800, 3.890] @@ -484,6 +482,9 @@ datasets: brightness_temperature: units: "K" standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts @@ -501,6 +502,9 @@ datasets: brightness_temperature: units: "K" standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts @@ -518,6 +522,9 @@ datasets: brightness_temperature: units: "K" standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts @@ -535,6 +542,9 @@ datasets: brightness_temperature: units: "K" standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts @@ -558,6 +568,9 @@ datasets: brightness_temperature: units: "K" standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts @@ -581,6 +594,9 @@ datasets: brightness_temperature: units: "K" standard_name: toa_brightness_temperature + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts diff --git a/satpy/etc/readers/mersi_ll_l1b.yaml b/satpy/etc/readers/mersi_ll_l1b.yaml index 652708d733..25da42b473 100644 --- a/satpy/etc/readers/mersi_ll_l1b.yaml +++ b/satpy/etc/readers/mersi_ll_l1b.yaml @@ -53,11 +53,16 @@ datasets: 1000: file_type: mersi_ll_l1b_1000 file_key: Data/EV_1KM_LL + calibration_key: Calibration/LL_Cal_Coeff + calibration_index: 0 coordinates: [longitude, latitude] calibration: - radiance: - units: 'mW/ (m2 cm-1 sr)' - standard_name: toa_outgoing_radiance_per_unit_wavelength + reflectance: + units: "%" + standard_name: toa_bidirectional_reflectance + counts: + units: "1" + standard_name: counts '2': name: '2' wavelength: [3.710, 3.800, 3.890] @@ -76,6 +81,9 @@ datasets: radiance: units: 'mW/ (m2 cm-1 sr)' standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts '3': name: '3' wavelength: [3.9725, 4.050, 4.1275] @@ -94,6 +102,9 @@ datasets: radiance: units: 'mW/ (m2 cm-1 sr)' standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts '4': name: '4' wavelength: [6.950, 7.20, 7.450] @@ -112,6 +123,9 @@ datasets: radiance: units: 'mW/ (m2 cm-1 sr)' standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts '5': name: '5' wavelength: [8.400, 8.550, 8.700] @@ -130,6 +144,9 @@ datasets: radiance: units: 'mW/ (m2 cm-1 sr)' standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts '6': name: '6' wavelength: [10.300, 10.800, 11.300] @@ -153,6 +170,9 @@ datasets: radiance: units: 'mW/ (m2 cm-1 sr)' standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts '7': name: '7' wavelength: [11.500, 12.000, 12.500] @@ -176,6 +196,9 @@ datasets: radiance: units: 'mW/ (m2 cm-1 sr)' standard_name: toa_outgoing_radiance_per_unit_wavelength + counts: + units: "1" + standard_name: counts longitude: name: longitude diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 91e143f7e9..5d5b4911bf 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -152,6 +152,9 @@ def get_dataset(self, dataset_id, ds_info): data = coeffs[0] + coeffs[1] * data + coeffs[2] * data ** 2 data = data * self.get_refl_mult() + elif dataset_id.get("calibration") == "radiance": + data = data + elif dataset_id.get("calibration") == "brightness_temperature": # Converts um^-1 (wavenumbers) and (mW/m^2)/(str/cm^-1) (radiance data) # to SI units m^-1, mW*m^-3*str^-1. diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 6c9bb8d7af..ef89d993e2 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -176,7 +176,7 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols, filetype_info): "valid_range": [0, 4095], "long_name": b"250m Emissive Bands Earth View Science Data Aggregated to 1 km"}, dims=("_rows", "_cols")) if is_mersi1 else - xr.DataArray(da.ones((4, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), + xr.DataArray(da.ones((2, num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), attrs={"Slope": np.array([1.] * 2), "Intercept": np.array([0.] * 2), "FillValue": 65535, "units": "mW/ (m2 cm-1 sr)", @@ -312,7 +312,7 @@ def _set_sensor_attrs(self, global_attrs): elif "mersi_ll" in self.filetype_info["file_type"]: global_attrs["/attr/Satellite Name"] = "FY-3E" global_attrs["/attr/Sensor Identification Code"] = "MERSI LL" - ftype = "VIS" + ftype = "LL" elif "mersi_rm" in self.filetype_info["file_type"]: global_attrs["/attr/Satellite Name"] = "FY-3G" global_attrs["/attr/Sensor Identification Code"] = "MERSI RM" @@ -412,6 +412,7 @@ def _test_multi_resolutions(available_datasets, band_list, test_resolution, cal_ with pytest.raises(KeyError): get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) else: + res = get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) assert len(res) == cal_results_number @@ -420,6 +421,7 @@ def _test_multi_resolutions(available_datasets, band_list, test_resolution, cal_ with pytest.raises(KeyError): get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) else: + res = get_key(ds_id, available_datasets, num_results=cal_results_number, best=False) assert len(res) == cal_results_number @@ -442,8 +444,8 @@ def teardown_method(self): self.p.stop() -class MERSI1L1BTester(MERSIL1BTester): - """Test MERSI1 L1B Reader.""" +class MERSI12llL1BTester(MERSIL1BTester): + """Test MERSI1/2/LL L1B Reader.""" yaml_file: str = "" filenames_1000m: list= [] @@ -458,8 +460,6 @@ class MERSI1L1BTester(MERSIL1BTester): def test_all_resolutions(self): """Test loading data when all resolutions or specific one are available.""" - from satpy.readers import load_reader - resolution_list = ["all", "250", "1000"] file_list = [self.filenames_all, self.filenames_250m, self.filenames_1000m] @@ -471,8 +471,10 @@ def test_all_resolutions(self): # - Bands 1-4 (visible) # - Bands 5 (IR) available_datasets = reader.available_dataset_ids - num_results = 2 # ("reflectance"/"brightness temperature" and "coutns") - _test_multi_resolutions(available_datasets, self.bands_250, resolution, num_results) + vis_num_results = 3 if "mersi2" in self.yaml_file else 2 # Only MERSI-2 VIS has radiance calibration + ir_num_results = 3 + _test_multi_resolutions(available_datasets, self.vis_250_bands, resolution, vis_num_results) + _test_multi_resolutions(available_datasets, self.ir_250_bands, resolution, ir_num_results) res = reader.load(self.bands_1000 + self.bands_250) if resolution != "250": @@ -511,8 +513,29 @@ def test_counts_calib(self): _test_helper(res, self.bands_250, ("counts", "1", (2 * 40, 2048 * 2))) _test_helper(res, self.bands_1000, ("counts", "1", (2 * 10, 2048))) + def test_rad_calib(self): + """Test loading data at radiance calibration. For MERSI-2 VIS/IR and MERSI-1/LL IR""" + from satpy.tests.utils import make_dataid + filenames = self.filenames_all + reader = _test_find_files_and_readers(self.reader_configs, filenames) + + ds_ids = [] + test_bands = self.bands_1000 + self.bands_250 if "mersi2" in self.yaml_file else \ + self.ir_250_bands + self.ir_1000_bands + + for band_name in test_bands: + ds_ids.append(make_dataid(name=band_name, calibration="radiance")) + res = reader.load(ds_ids) + assert len(res) == len(test_bands) + if "mersi2" in self.yaml_file: + _test_helper(res, self.bands_250, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) + _test_helper(res, self.bands_1000, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048))) + else: + _test_helper(res, self.ir_250_bands, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) + _test_helper(res, self.ir_1000_bands, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048))) -class TestFY3AMERSI1L1B(MERSI1L1BTester): + +class TestFY3AMERSI1L1B(MERSI12llL1BTester): """Test the FY3A MERSI1 L1B reader.""" yaml_file = "fy3a_mersi1_l1b.yaml" @@ -521,14 +544,14 @@ class TestFY3AMERSI1L1B(MERSI1L1BTester): filenames_all = filenames_1000m + filenames_250m vis_250_bands = ["1", "2", "3", "4"] ir_250_bands = ["5"] - vis_1000_bandst = ["6", "7", "8", "11", "15", "19", "20"] + vis_1000_bands = ["6", "7", "8", "11", "15", "19", "20"] ir_1000_bands = [] - bands_1000 = vis_1000_bandst + ir_1000_bands + bands_1000 = vis_1000_bands + ir_1000_bands bands_250 = vis_250_bands + ir_250_bands -class TestFY3BMERSI1L1B(MERSI1L1BTester): - """Test the FY3A MERSI1 L1B reader.""" +class TestFY3BMERSI1L1B(MERSI12llL1BTester): + """Test the FY3B MERSI1 L1B reader.""" yaml_file = "fy3b_mersi1_l1b.yaml" filenames_1000m = ["FY3B_MERSI_GBAL_L1_20110824_1850_1000M_MS.hdf"] @@ -536,14 +559,14 @@ class TestFY3BMERSI1L1B(MERSI1L1BTester): filenames_all = filenames_1000m + filenames_250m vis_250_bands = ["1", "2", "3", "4"] ir_250_bands = ["5"] - vis_1000_bandst = ["6", "7", "8", "11", "15", "19", "20"] + vis_1000_bands = ["6", "7", "8", "11", "15", "19", "20"] ir_1000_bands = [] - bands_1000 = vis_1000_bandst + ir_1000_bands + bands_1000 = vis_1000_bands + ir_1000_bands bands_250 = vis_250_bands + ir_250_bands -class TestFY3CMERSI1L1B(MERSI1L1BTester): - """Test the FY3A MERSI1 L1B reader.""" +class TestFY3CMERSI1L1B(MERSI12llL1BTester): + """Test the FY3C MERSI1 L1B reader.""" yaml_file = "fy3c_mersi1_l1b.yaml" filenames_1000m = ["FY3C_MERSI_GBAL_L1_20131002_1835_1000M_MS.hdf", "FY3C_MERSI_GBAL_L1_20131002_1835_GEO1K_MS.hdf"] @@ -551,340 +574,40 @@ class TestFY3CMERSI1L1B(MERSI1L1BTester): filenames_all = filenames_1000m + filenames_250m vis_250_bands = ["1", "2", "3", "4"] ir_250_bands = ["5"] - vis_1000_bandst = ["6", "7", "8", "11", "15", "19", "20"] + vis_1000_bands = ["6", "7", "8", "11", "15", "19", "20"] ir_1000_bands = [] - bands_1000 = vis_1000_bandst + ir_1000_bands + bands_1000 = vis_1000_bands + ir_1000_bands bands_250 = vis_250_bands + ir_250_bands - -class TestMERSI2L1B(MERSIL1BTester): +class TestFYDCMERSI2L1B(MERSI12llL1BTester): """Test the FY3D MERSI2 L1B reader.""" yaml_file = "mersi2_l1b.yaml" filenames_1000m = ["tf2019071182739.FY3D-X_MERSI_1000M_L1B.HDF", "tf2019071182739.FY3D-X_MERSI_GEO1K_L1B.HDF"] filenames_250m = ["tf2019071182739.FY3D-X_MERSI_0250M_L1B.HDF", "tf2019071182739.FY3D-X_MERSI_GEOQK_L1B.HDF"] filenames_all = filenames_1000m + filenames_250m + vis_250_bands = ["1", "2", "3", "4"] + ir_250_bands = ["24", "25"] + vis_1000_bands = ["5", "8", "9", "11", "15", "17", "19"] + ir_1000_bands = ["20", "21", "23"] + bands_1000 = vis_1000_bands + ir_1000_bands + bands_250 = vis_250_bands + ir_250_bands - def test_all_resolutions(self): - """Test loading data when all resolutions are available.""" - from satpy.dataset.data_dict import get_key - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_all - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert 4 == len(files) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - # Verify that we have multiple resolutions for: - # - Bands 1-4 (visible) - # - Bands 24-25 (IR) - available_datasets = reader.available_dataset_ids - for band_name in ("1", "2", "3", "4", "24", "25"): - if band_name in ("24", "25"): - # don't know how to get radiance for IR bands - num_results = 2 - else: - num_results = 3 - ds_id = make_dataid(name=band_name, resolution=250) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - ds_id = make_dataid(name=band_name, resolution=1000) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - - res = reader.load(["1", "2", "3", "4", "5", "20", "24", "25"]) - assert len(res) == 8 - _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) - _test_helper(res, ["24", "25"], ("brightness_temperature", "K", (2 * 40, 2048 * 2))) - assert res["5"].shape == (2 * 10, 2048) - assert res["5"].attrs["calibration"] == "reflectance" - assert res["5"].attrs["units"] == "%" - assert res["20"].shape == (2 * 10, 2048) - assert res["20"].attrs["calibration"] == "brightness_temperature" - assert res["20"].attrs["units"] == "K" - - def test_counts_calib(self): - """Test loading data at counts calibration.""" - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_all - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert 4 == len(files) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - ds_ids = [] - for band_name in ["1", "2", "3", "4", "5", "20", "24", "25"]: - ds_ids.append(make_dataid(name=band_name, calibration="counts")) - ds_ids.append(make_dataid(name="satellite_zenith_angle")) - res = reader.load(ds_ids) - assert len(res) == 9 - _test_helper(res, ["1", "2", "3", "4", "24", "25"], ("counts", "1", (2 * 40, 2048 * 2))) - _test_helper(res, ["5", "20"], ("counts", "1", (2 * 10, 2048))) - - def test_rad_calib(self): - """Test loading data at radiance calibration.""" - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_all - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert 4 == len(files) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - ds_ids = [] - for band_name in ["1", "2", "3", "4", "5"]: - ds_ids.append(make_dataid(name=band_name, calibration="radiance")) - res = reader.load(ds_ids) - assert len(res) == 5 - _test_helper(res, ["1", "2", "3", "4"], ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) - assert res["5"].shape == (2 * 10, 2048) - assert res["5"].attrs["calibration"] == "radiance" - assert res["5"].attrs["units"] == "mW/ (m2 cm-1 sr)" - def test_1km_resolutions(self): - """Test loading data when only 1km resolutions are available.""" - from satpy.dataset.data_dict import get_key - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_1000m - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert 2 == len(files) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - # Verify that we have multiple resolutions for: - # - Bands 1-4 (visible) - # - Bands 24-25 (IR) - available_datasets = reader.available_dataset_ids - for band_name in ("1", "2", "3", "4", "24", "25"): - if band_name in ("24", "25"): - # don't know how to get radiance for IR bands - num_results = 2 - else: - num_results = 3 - ds_id = make_dataid(name=band_name, resolution=250) - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=num_results, best=False) - ds_id = make_dataid(name=band_name, resolution=1000) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - - res = reader.load(["1", "2", "3", "4", "5", "20", "24", "25"]) - assert len(res) == 8 - _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 10, 2048))) - _test_helper(res, ["24", "25"], ("brightness_temperature", "K", (2 * 10, 2048))) - assert res["5"].shape == (2 * 10, 2048) - assert res["5"].attrs["calibration"] == "reflectance" - assert res["5"].attrs["units"] == "%" - assert res["20"].shape == (2 * 10, 2048) - assert res["20"].attrs["calibration"] == "brightness_temperature" - assert res["20"].attrs["units"] == "K" - - def test_250_resolutions(self): - """Test loading data when only 250m resolutions are available.""" - from satpy.dataset.data_dict import get_key - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_250m - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert 2 == len(files) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - # Verify that we have multiple resolutions for: - # - Bands 1-4 (visible) - # - Bands 24-25 (IR) - available_datasets = reader.available_dataset_ids - for band_name in ("1", "2", "3", "4", "24", "25"): - if band_name in ("24", "25"): - # don't know how to get radiance for IR bands - num_results = 2 - else: - num_results = 3 - ds_id = make_dataid(name=band_name, resolution=250) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - ds_id = make_dataid(name=band_name, resolution=1000) - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=num_results, best=False) - - res = reader.load(["1", "2", "3", "4", "5", "20", "24", "25"]) - assert len(res) == 6 - with pytest.raises(KeyError): - res.__getitem__("5") - with pytest.raises(KeyError): - res.__getitem__("20") - _test_helper(res, ["1", "2", "3", "4"], ("reflectance", "%", (2 * 40, 2048 * 2))) - assert res["24"].shape == (2 * 40, 2048 * 2) - assert res["24"].attrs["calibration"] == "brightness_temperature" - assert res["24"].attrs["units"] == "K" - assert res["25"].shape == (2 * 40, 2048 * 2) - assert res["25"].attrs["calibration"] == "brightness_temperature" - assert res["25"].attrs["units"] == "K" - - -class TestMERSILLL1B(MERSIL1BTester): - """Test the FY3E MERSI-LL L1B reader.""" +class TestFY3EMERSIllL1B(MERSI12llL1BTester): + """Test the FY3D MERSI2 L1B reader.""" yaml_file = "mersi_ll_l1b.yaml" filenames_1000m = ["FY3E_MERSI_GRAN_L1_20230410_1910_1000M_V0.HDF", "FY3E_MERSI_GRAN_L1_20230410_1910_GEO1K_V0.HDF"] filenames_250m = ["FY3E_MERSI_GRAN_L1_20230410_1910_0250M_V0.HDF", "FY3E_MERSI_GRAN_L1_20230410_1910_GEOQK_V0.HDF"] filenames_all = filenames_1000m + filenames_250m - - def test_all_resolutions(self): - """Test loading data when all resolutions are available.""" - from satpy.dataset.data_dict import get_key - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_all - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert 4 == len(files) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - # Verify that we have multiple resolutions for: - # - Bands 1-4 (visible) - # - Bands 24-25 (IR) - available_datasets = reader.available_dataset_ids - for band_name in ("6", "7"): - num_results = 2 - ds_id = make_dataid(name=band_name, resolution=250) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - ds_id = make_dataid(name=band_name, resolution=1000) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - - res = reader.load(["1", "2", "4", "7"]) - assert len(res) == 4 - assert res["4"].shape == (2 * 10, 2048) - assert res["1"].attrs["calibration"] == "radiance" - assert res["1"].attrs["units"] == "mW/ (m2 cm-1 sr)" - assert res["2"].shape == (2 * 10, 2048) - assert res["2"].attrs["calibration"] == "brightness_temperature" - assert res["2"].attrs["units"] == "K" - assert res["7"].shape == (2 * 40, 2048 * 2) - assert res["7"].attrs["calibration"] == "brightness_temperature" - assert res["7"].attrs["units"] == "K" - - def test_rad_calib(self): - """Test loading data at radiance calibration.""" - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_all - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert 4 == len(files) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - ds_ids = [] - for band_name in ["1", "3", "4", "6", "7"]: - ds_ids.append(make_dataid(name=band_name, calibration="radiance")) - res = reader.load(ds_ids) - assert len(res) == 5 - _test_helper(res, ["1", "3", "4"], ("radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048))) - _test_helper(res, ["6", "7"], ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) - - def test_1km_resolutions(self): - """Test loading data when only 1km resolutions are available.""" - from satpy.dataset.data_dict import get_key - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_1000m - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert 2 == len(files) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - # Verify that we have multiple resolutions for: - # - Band 6-7 (IR) - # - Bands 24-25 (IR) - available_datasets = reader.available_dataset_ids - for band_name in ("1", "2", "3", "4", "6", "7"): - if band_name == "1": - # don't know how to get anything apart from radiance for LL band - num_results = 1 - else: - num_results = 2 - ds_id = make_dataid(name=band_name, resolution=250) - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=num_results, best=False) - ds_id = make_dataid(name=band_name, resolution=1000) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - if band_name == "1": - assert num_results == len([res]) - else: - assert num_results == len(res) - - res = reader.load(["1", "2", "3", "5", "6", "7"]) - assert len(res) == 6 - assert res["1"].shape == (2 * 10, 2048) - assert res["1"].attrs["calibration"] == "radiance" - assert res["1"].attrs["units"] == "mW/ (m2 cm-1 sr)" - _test_helper(res, ["2", "3", "5", "6", "7"], ("brightness_temperature", "K", (2 * 10, 2048))) - - def test_250_resolutions(self): - """Test loading data when only 250m resolutions are available.""" - from satpy.dataset.data_dict import get_key - from satpy.readers import load_reader - from satpy.tests.utils import make_dataid - filenames = self.filenames_250m - reader = load_reader(self.reader_configs) - files = reader.select_files_from_pathnames(filenames) - assert 2 == len(files) - reader.create_filehandlers(files) - # Make sure we have some files - assert reader.file_handlers - - # Verify that we have multiple resolutions for: - # - Bands 6-7 - available_datasets = reader.available_dataset_ids - for band_name in ("6", "7"): - num_results = 2 - ds_id = make_dataid(name=band_name, resolution=250) - res = get_key(ds_id, available_datasets, - num_results=num_results, best=False) - assert num_results == len(res) - ds_id = make_dataid(name=band_name, resolution=1000) - with pytest.raises(KeyError): - get_key(ds_id, available_datasets, num_results=num_results, best=False) - - res = reader.load(["1", "6", "7"]) - assert 2 == len(res) - with pytest.raises(KeyError): - res.__getitem__("1") - assert (2 * 40, 2048 * 2) == res["6"].shape - assert "brightness_temperature" == res["6"].attrs["calibration"] - assert "K" == res["6"].attrs["units"] - assert (2 * 40, 2048 * 2) == res["7"].shape - assert "brightness_temperature" == res["7"].attrs["calibration"] - assert "K" == res["7"].attrs["units"] + vis_250_bands = [] + ir_250_bands = ["6", "7"] + vis_1000_bands = ["1"] + ir_1000_bands = ["2", "3", "5"] + bands_1000 = vis_1000_bands + ir_1000_bands + bands_250 = vis_250_bands + ir_250_bands class TestMERSIRML1B(MERSIL1BTester): From 4ed4cf0cd8d5d1fd899046694c8a89c8b27bb757 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 1 May 2024 16:13:29 +0800 Subject: [PATCH 418/481] radiance calibraton --- satpy/etc/readers/mersi_ll_l1b.yaml | 6 +- satpy/readers/mersi_l1b.py | 80 +++++++++++++++++----- satpy/tests/reader_tests/test_mersi_l1b.py | 42 +++++++++--- 3 files changed, 99 insertions(+), 29 deletions(-) diff --git a/satpy/etc/readers/mersi_ll_l1b.yaml b/satpy/etc/readers/mersi_ll_l1b.yaml index 25da42b473..c9c21fa539 100644 --- a/satpy/etc/readers/mersi_ll_l1b.yaml +++ b/satpy/etc/readers/mersi_ll_l1b.yaml @@ -53,13 +53,15 @@ datasets: 1000: file_type: mersi_ll_l1b_1000 file_key: Data/EV_1KM_LL - calibration_key: Calibration/LL_Cal_Coeff - calibration_index: 0 + calibration_key: Calibration/Solar_Irradiance_LL coordinates: [longitude, latitude] calibration: reflectance: units: "%" standard_name: toa_bidirectional_reflectance + radiance: + units: 'mW/ (m2 cm-1 sr)' + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 5d5b4911bf..22614ac8b1 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -91,7 +91,8 @@ def _get_single_slope_intercept(self, slope, intercept, cal_index): def _get_coefficients(self, cal_key, cal_index): """Get VIS calibration coeffs from calibration datasets.""" - coeffs = self[cal_key][cal_index] + # Only one VIS band for MERSI-LL + coeffs = self[cal_key][cal_index] if self.sensor_name != "mersi-ll" else self[cal_key] slope = coeffs.attrs.pop("Slope", None) intercept = coeffs.attrs.pop("Intercept", None) if slope is not None: @@ -116,17 +117,12 @@ def _get_dn_corrections(self, data, band_index, dataset_id, attrs): """Use slope and intercept to get DN corrections.""" slope = attrs.pop("Slope", None) intercept = attrs.pop("Intercept", None) - try: - new_slope = slope[band_index] - new_intercept = intercept[band_index] - # There's a bug in the slope for MERSI-1 11.25(5) - new_slope = 0.01 if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" and new_slope in [100, 1] \ - else new_slope - data = data * new_slope + new_intercept - return data - - except TypeError: - return data + if slope is not None and dataset_id.get("calibration") != "counts": + if band_index is not None and slope.size > 1: + slope = slope[band_index] + intercept = intercept[band_index] + data = data * slope + intercept + return data def get_dataset(self, dataset_id, ds_info): """Load data variable and metadata and calibrate if needed.""" @@ -146,14 +142,10 @@ def get_dataset(self, dataset_id, ds_info): data = self._get_dn_corrections(data, band_index, dataset_id, attrs) if dataset_id.get("calibration") == "reflectance": - # Only FY-3A/B stores VIS calibration coefficients in attributes - coeffs = self._get_coefficients_mersi1(ds_info["calibration_index"]) if self.platform_name in ["FY-3A", - "FY-3B"] else self._get_coefficients(ds_info["calibration_key"], ds_info["calibration_index"]) - data = coeffs[0] + coeffs[1] * data + coeffs[2] * data ** 2 - data = data * self.get_refl_mult() + data = self._get_ref_dataset(data, ds_info) elif dataset_id.get("calibration") == "radiance": - data = data + data = self._get_rad_dataset(data, ds_info, dataset_id) elif dataset_id.get("calibration") == "brightness_temperature": # Converts um^-1 (wavenumbers) and (mW/m^2)/(str/cm^-1) (radiance data) @@ -201,9 +193,61 @@ def _mask_data(self, data, dataset_id, attrs): data = data.where((data >= valid_range[0]) & (data <= valid_range[1]), new_fill) return data + # valid_range could be None except TypeError: return data + def _get_ref_dataset(self, data, ds_info): + """Get the dataset as reflectance. + + For MERSI-1/2/RM, coefficients will be as:: + + Reflectance = coeffs_1 + coeffs_2 * DN + coeffs_3 * DN ** 2 + + For MERSI-LL, the DN value is in radiance and the reflectance could be calculated by:: + + Reflectance = Rad * pi / E0 * 100 + + Here E0 represents the solar irradiance of the specific band and is the coefficient. + + """ + # Only FY-3A/B stores VIS calibration coefficients in attributes + coeffs = self._get_coefficients_mersi1(ds_info["calibration_index"]) if self.platform_name in ["FY-3A", + "FY-3B"] else self._get_coefficients(ds_info["calibration_key"], ds_info.get("calibration_index", None)) + data = coeffs[0] + coeffs[1] * data + coeffs[2] * data ** 2 if self.sensor_name != "mersi-ll" else \ + data * np.pi / coeffs[0] * 100 + + data = data * self.get_refl_mult() + return data + + def _get_rad_dataset(self, data, ds_info, datset_id): + """Get the dataset as radiance. + + For MERSI-2/RM VIS bands, this could be calculated by:: + + Rad = Reflectance / 100 * E0 / pi + + For MERSI-2, E0 is in the attribute "Solar_Irradiance". + For MERSI-RM, E0 is in the calibration dataset "Solar_Irradiance". + However we can't find the way to retrieve this value from MERSI-1. + + For MERSI-LL VIS band, it has already been stored in DN values. + After applying slope and intercept, we just get it. And Same way for IR bands, no matter which sensor it is. + + """ + mersi_2_vis = [str(i) for i in range(1, 20)] + mersi_rm_vis = [str(i) for i in range(1, 6)] + + if self.sensor_name == "mersi-2" and datset_id["name"] in mersi_2_vis: + E0 = self["/attr/Solar_Irradiance"] + rad = self._get_ref_dataset(data, ds_info) / 100 * E0[mersi_2_vis.index(datset_id["name"])] / np.pi + elif self.sensor_name == "mersi-rm" and datset_id["name"] in mersi_rm_vis: + E0 = self._get_coefficients("Calibration/Solar_Irradiance", mersi_rm_vis.index(datset_id["name"])) + rad = self._get_ref_dataset(data, ds_info) / 100 * E0 / np.pi + else: + rad = data + return rad + def _get_bt_dataset(self, data, calibration_index, wave_number): """Get the dataset as brightness temperature. diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index ef89d993e2..3403adb205 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -34,6 +34,16 @@ def _get_calibration(num_scans, ftype): da.ones((19, 3), chunks=1024), attrs={"Slope": np.array([1.] * 19), "Intercept": np.array([0.] * 19)}, dims=("_bands", "_coeffs")), + "Calibration/Solar_Irradiance": + xr.DataArray( + da.ones((19, ), chunks=1024), + attrs={"Slope": np.array([1.] * 19), "Intercept": np.array([0.] * 19)}, + dims=("_bands")), + "Calibration/Solar_Irradiance_LL": + xr.DataArray( + da.ones((1, ), chunks=1024), + attrs={"Slope": np.array([1.]), "Intercept": np.array([0.])}, + dims=("_bands")), "Calibration/IR_Cal_Coeff": xr.DataArray( da.ones((6, 4, num_scans), chunks=1024), @@ -272,6 +282,9 @@ def get_test_content(self, filename, filename_info, filetype_info): fy3b_attrs = { "/attr/VIS_Cal_Coeff": np.array([0.0, 1.0, 0.0] * 19), } + fy3d_attrs = { + "/attr/Solar_Irradiance": np.array([1.0] * 19), + } global_attrs, ftype = self._set_sensor_attrs(global_attrs) self._add_tbb_coefficients(global_attrs) @@ -288,6 +301,8 @@ def get_test_content(self, filename, filename_info, filetype_info): test_content.update(fy3a_attrs) elif "fy3b_mersi1" in self.filetype_info["file_type"]: test_content.update(fy3b_attrs) + elif "mersi2" in self.filetype_info["file_type"]: + test_content.update(fy3d_attrs) if not self.filetype_info["file_type"].startswith(("fy3a_mersi1", "fy3b_mersi1")): test_content.update(_get_calibration(self.num_scans, ftype)) return test_content @@ -393,6 +408,7 @@ def _test_helper(res, band_list, exp_result): def _test_find_files_and_readers(reader_config, filenames): + """Test file and reader search.""" from satpy.readers import load_reader reader = load_reader(reader_config) files = reader.select_files_from_pathnames(filenames) @@ -404,6 +420,7 @@ def _test_find_files_and_readers(reader_config, filenames): def _test_multi_resolutions(available_datasets, band_list, test_resolution, cal_results_number): + """Test some bands have multiple resolutions.""" for band_name in band_list: from satpy.dataset.data_dict import get_key from satpy.tests.utils import make_dataid @@ -468,10 +485,17 @@ def test_all_resolutions(self): reader = _test_find_files_and_readers(self.reader_configs, filenames) # Verify that we have multiple resolutions for: + # ---------MERSI-1--------- # - Bands 1-4 (visible) # - Bands 5 (IR) + # ---------MERSI-2--------- + # - Bands 1-4 (visible) + # - Bands 24-25 (IR) + # ---------MERSI-LL--------- + # - Bands 6-7 (IR) available_datasets = reader.available_dataset_ids - vis_num_results = 3 if "mersi2" in self.yaml_file else 2 # Only MERSI-2 VIS has radiance calibration + # Only MERSI-2/LL VIS has radiance calibration + vis_num_results = 3 if self.yaml_file in ["mersi2_l1b.yaml", "mersi_ll_l1b.yaml"] else 2 ir_num_results = 3 _test_multi_resolutions(available_datasets, self.vis_250_bands, resolution, vis_num_results) _test_multi_resolutions(available_datasets, self.ir_250_bands, resolution, ir_num_results) @@ -514,20 +538,20 @@ def test_counts_calib(self): _test_helper(res, self.bands_1000, ("counts", "1", (2 * 10, 2048))) def test_rad_calib(self): - """Test loading data at radiance calibration. For MERSI-2 VIS/IR and MERSI-1/LL IR""" + """Test loading data at radiance calibration. For MERSI-2/LL VIS/IR and MERSI-1 IR.""" from satpy.tests.utils import make_dataid filenames = self.filenames_all reader = _test_find_files_and_readers(self.reader_configs, filenames) ds_ids = [] - test_bands = self.bands_1000 + self.bands_250 if "mersi2" in self.yaml_file else \ - self.ir_250_bands + self.ir_1000_bands + test_bands = self.bands_1000 + self.bands_250 if self.yaml_file in ["mersi2_l1b.yaml", "mersi_ll_l1b.yaml"] \ + else self.ir_250_bands + self.ir_1000_bands for band_name in test_bands: ds_ids.append(make_dataid(name=band_name, calibration="radiance")) res = reader.load(ds_ids) assert len(res) == len(test_bands) - if "mersi2" in self.yaml_file: + if self.yaml_file in ["mersi2_l1b.yaml", "mersi_ll_l1b.yaml"]: _test_helper(res, self.bands_250, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) _test_helper(res, self.bands_1000, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048))) else: @@ -580,7 +604,7 @@ class TestFY3CMERSI1L1B(MERSI12llL1BTester): bands_250 = vis_250_bands + ir_250_bands -class TestFYDCMERSI2L1B(MERSI12llL1BTester): +class TestFY3DMERSI2L1B(MERSI12llL1BTester): """Test the FY3D MERSI2 L1B reader.""" yaml_file = "mersi2_l1b.yaml" @@ -660,6 +684,6 @@ def test_rad_calib(self): res = reader.load(ds_ids) assert len(res) == 5 for band_name in band_names: - assert res[band_name].shape == (20, 4096) - assert res[band_name].attrs["calibration"] == "radiance" - assert res[band_name].attrs["units"] == "mW/ (m2 cm-1 sr)" + assert res[band_name].shape == (20, 4096) + assert res[band_name].attrs["calibration"] == "radiance" + assert res[band_name].attrs["units"] == "mW/ (m2 cm-1 sr)" From 60e77320342f2d5d848bca55fe46590abaef631e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 08:17:23 +0000 Subject: [PATCH 419/481] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- satpy/etc/readers/mersi_ll_l1b.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/readers/mersi_ll_l1b.yaml b/satpy/etc/readers/mersi_ll_l1b.yaml index c9c21fa539..47b6d432b0 100644 --- a/satpy/etc/readers/mersi_ll_l1b.yaml +++ b/satpy/etc/readers/mersi_ll_l1b.yaml @@ -61,7 +61,7 @@ datasets: standard_name: toa_bidirectional_reflectance radiance: units: 'mW/ (m2 cm-1 sr)' - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: toa_outgoing_radiance_per_unit_wavelength counts: units: "1" standard_name: counts From b922967b54ccc28dfc34cbd911e20fefa896c262 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 1 May 2024 16:34:27 +0800 Subject: [PATCH 420/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 3403adb205..07299060fa 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -66,6 +66,8 @@ def _get_250m_data(num_scans, rows_per_scan, num_cols, filetype_info): } nounits_attrs = {**def_attrs, **{"units": "NO"}} radunits_attrs = {**def_attrs, **{"units": "mW/ (m2 cm-1 sr)"}} + valid_range_none_attrs = radunits_attrs.copy() + valid_range_none_attrs["valid_range"] = None data = { f"{key_prefix}EV_250_RefSB_b1": @@ -91,7 +93,7 @@ def _get_250m_data(num_scans, rows_per_scan, num_cols, filetype_info): f"{key_prefix}EV_250_Emissive_b24": xr.DataArray( da.ones((num_scans * rows_per_scan, num_cols), chunks=1024, dtype=np.uint16), - attrs=radunits_attrs, + attrs=valid_range_none_attrs, dims=("_rows", "_cols")), f"{key_prefix}EV_250_Emissive_b25": xr.DataArray( From 2eef43a9e86d53b79d75fde2379a878df66e970e Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 1 May 2024 17:08:16 +0800 Subject: [PATCH 421/481] fy3b geo --- satpy/etc/readers/fy3b_mersi1_l1b.yaml | 8 ++++---- satpy/tests/reader_tests/test_mersi_l1b.py | 11 ++++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/satpy/etc/readers/fy3b_mersi1_l1b.yaml b/satpy/etc/readers/fy3b_mersi1_l1b.yaml index 65ce53cd73..5d2dc48f56 100644 --- a/satpy/etc/readers/fy3b_mersi1_l1b.yaml +++ b/satpy/etc/readers/fy3b_mersi1_l1b.yaml @@ -423,7 +423,7 @@ datasets: standard_name: solar_zenith_angle resolution: 1000 coordinates: [longitude, latitude] - file_type: fy3b_mersi1_l1b_geo + file_type: fy3b_mersi1_l1b_1000 file_key: SolarZenith solar_azimuth_angle: @@ -432,7 +432,7 @@ datasets: standard_name: solar_azimuth_angle resolution: 1000 coordinates: [longitude, latitude] - file_type: fy3b_mersi1_l1b_geo + file_type: fy3b_mersi1_l1b_1000 file_key: SolarAzimuth satellite_zenith_angle: @@ -441,7 +441,7 @@ datasets: standard_name: sensor_zenith_angle resolution: 1000 coordinates: [longitude, latitude] - file_type: fy3b_mersi1_l1b_geo + file_type: fy3b_mersi1_l1b_1000 file_key: SensorZenith satellite_azimuth_angle: @@ -450,5 +450,5 @@ datasets: standard_name: sensor_azimuth_angle resolution: 1000 coordinates: [longitude, latitude] - file_type: fy3b_mersi1_l1b_geo + file_type: fy3b_mersi1_l1b_1000 file_key: SensorAzimuth diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index 07299060fa..ffe4562bd5 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -194,7 +194,16 @@ def _get_1km_data(num_scans, rows_per_scan, num_cols, filetype_info): "units": "mW/ (m2 cm-1 sr)", "valid_range": [0, 4095], "long_name": b"250m Emissive Bands Earth View Science Data Aggregated to 1 km"}, - dims=("_ir250_bands", "_rows", "_cols")) + dims=("_ir250_bands", "_rows", "_cols")), + f"{key_prefix}SensorZenith": + xr.DataArray( + da.ones((num_scans * rows_per_scan, num_cols), chunks=1024), + attrs={ + "Slope": np.array([.01] * 1), "Intercept": np.array([0.] * 1), + "units": "degree", + "valid_range": [0, 28000], + }, + dims=("_rows", "_cols")), } return data From 48dda53422b5f7bb0defd1c7ede9e04a115ca2ed Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 1 May 2024 17:30:18 +0800 Subject: [PATCH 422/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 22614ac8b1..9959d9272e 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -121,6 +121,8 @@ def _get_dn_corrections(self, data, band_index, dataset_id, attrs): if band_index is not None and slope.size > 1: slope = slope[band_index] intercept = intercept[band_index] + # There's a bug in slope for MERSI-1 IR band + slope = 0.01 if self.sensor_name == "mersi-1" and dataset_id["name"] == "5" else slope data = data * slope + intercept return data From 768a5f54805fc443b036e784de0383e4ec8bd94c Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 1 May 2024 23:00:20 +0800 Subject: [PATCH 423/481] ir cal --- satpy/etc/composites/mersi-1.yaml | 19 +++++++++++++++---- satpy/readers/mersi_l1b.py | 9 +++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/satpy/etc/composites/mersi-1.yaml b/satpy/etc/composites/mersi-1.yaml index ee92ee9ed4..8239f73bee 100644 --- a/satpy/etc/composites/mersi-1.yaml +++ b/satpy/etc/composites/mersi-1.yaml @@ -14,10 +14,10 @@ modifiers: - name: solar_azimuth_angle - name: solar_zenith_angle - # sunz_corrected: - # modifier: !!python/name:satpy.modifiers.SunZenithCorrector - # prerequisites: - # - solar_zenith_angle + sunz_corrected: + modifier: !!python/name:satpy.modifiers.SunZenithCorrector + prerequisites: + - name: solar_zenith_angle nir_reflectance: modifier: !!python/name:satpy.modifiers.NIRReflectance @@ -34,6 +34,17 @@ composites: - name: '5' standard_name: colorized_ir_clouds + true_color: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: '3' + modifiers: [sunz_corrected, rayleigh_corrected] + - name: '2' + modifiers: [sunz_corrected, rayleigh_corrected] + - name: '1' + modifiers: [sunz_corrected, rayleigh_corrected] + standard_name: true_color + true_color_uncorr: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 9959d9272e..1a2353fbf2 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -279,7 +279,11 @@ def _get_bt_dataset(self, data, calibration_index, wave_number): data = data.where(data != 0) # additional corrections from the file - if self.sensor_name == "mersi-2": + if self.sensor_name == "mersi-1": + # https://img.nsmc.org.cn/PORTAL/NSMC/DATASERVICE/SRF/FY3C/FY3C_MERSI_SRF.rar + corr_coeff_a = 1.0047 + corr_coeff_b = -0.8549 + elif self.sensor_name == "mersi-2": corr_coeff_a = float(self["/attr/TBB_Trans_Coefficient_A"][calibration_index]) corr_coeff_b = float(self["/attr/TBB_Trans_Coefficient_B"][calibration_index]) elif self.sensor_name == "mersi-ll": @@ -295,7 +299,8 @@ def _get_bt_dataset(self, data, calibration_index, wave_number): corr_coeff_a = 0 if corr_coeff_a != 0: - data = (data - corr_coeff_b) / corr_coeff_a + data = (data - corr_coeff_b) / corr_coeff_a if self.sensor_name != "mersi-1" else \ + data * corr_coeff_a + corr_coeff_b # some bands have 0 counts for the first N columns and # seem to be invalid data points data = data.where(data != 0) From e2537efdf1bc1fce3deabc39b1309d801c7e75a3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 15:02:23 +0000 Subject: [PATCH 424/481] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- satpy/etc/composites/mersi-1.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/composites/mersi-1.yaml b/satpy/etc/composites/mersi-1.yaml index 8239f73bee..1d7a2df79d 100644 --- a/satpy/etc/composites/mersi-1.yaml +++ b/satpy/etc/composites/mersi-1.yaml @@ -43,7 +43,7 @@ composites: modifiers: [sunz_corrected, rayleigh_corrected] - name: '1' modifiers: [sunz_corrected, rayleigh_corrected] - standard_name: true_color + standard_name: true_color true_color_uncorr: compositor: !!python/name:satpy.composites.GenericCompositor From e40917708edea99ce86fb52a971d951a07f3a475 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Sat, 4 May 2024 22:05:28 -0500 Subject: [PATCH 425/481] Add another safe directory to git config --- .github/workflows/ci.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c472709bc8..50880f0e95 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -34,6 +34,8 @@ jobs: steps: - name: Checkout source uses: actions/checkout@v4 + run: | + git config --global --add safe.directory /github/workspace - name: Setup Conda Environment uses: conda-incubator/setup-miniconda@v3 From f6ffd64432f2451aed0bc9814541c326b8779159 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Sat, 4 May 2024 22:12:26 -0500 Subject: [PATCH 426/481] Try again --- .github/workflows/ci.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 50880f0e95..4b13c6a27b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -34,8 +34,6 @@ jobs: steps: - name: Checkout source uses: actions/checkout@v4 - run: | - git config --global --add safe.directory /github/workspace - name: Setup Conda Environment uses: conda-incubator/setup-miniconda@v3 @@ -103,6 +101,7 @@ jobs: - name: Install satpy shell: bash -l {0} run: | + git config --global --add safe.directory /github/workspace python -m pip install --no-deps -e . - name: Run unit tests From ebb77aa4cd87d9c0809badac14bf0f8ff1133e09 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Sat, 4 May 2024 22:27:55 -0500 Subject: [PATCH 427/481] Add git safe directory locally only --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4b13c6a27b..244371f9dc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -102,6 +102,7 @@ jobs: shell: bash -l {0} run: | git config --global --add safe.directory /github/workspace + git config --local --add safe.directory /github/workspace python -m pip install --no-deps -e . - name: Run unit tests From cdf8fbbf1e6ce0b185350f602fadd89871b69745 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Sun, 5 May 2024 21:20:17 -0500 Subject: [PATCH 428/481] Debug coveralls action --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 244371f9dc..1193579c59 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -123,6 +123,7 @@ jobs: with: flag-name: run-${{ matrix.test_number }} parallel: true + debug: true if: runner.os == 'Linux' - name: Run behaviour tests From 597e9ad5f39519bc8d81979dab4717f99a4f1479 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Tue, 7 May 2024 08:56:07 -0500 Subject: [PATCH 429/481] Use djhoese debug coveralls action --- .github/workflows/ci.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1193579c59..6098e4d7a2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -119,7 +119,8 @@ jobs: env_vars: OS,PYTHON_VERSION,UNSTABLE - name: Coveralls Parallel - uses: AndreMiras/coveralls-python-action@develop +# uses: AndreMiras/coveralls-python-action@develop + uses: djhoese/coveralls-python-action@git-safe-dir with: flag-name: run-${{ matrix.test_number }} parallel: true @@ -145,6 +146,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Coveralls Finished - uses: AndreMiras/coveralls-python-action@develop +# uses: AndreMiras/coveralls-python-action@develop + uses: djhoese/coveralls-python-action@git-safe-dir with: parallel-finished: true From 3bf7beefa4f96a146dc1bfd4a3cfe7668360d783 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Tue, 7 May 2024 12:00:22 -0500 Subject: [PATCH 430/481] Add missing coverage config to pyproject.toml --- .github/workflows/ci.yaml | 9 ++------- pyproject.toml | 4 ++++ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6098e4d7a2..c472709bc8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -101,8 +101,6 @@ jobs: - name: Install satpy shell: bash -l {0} run: | - git config --global --add safe.directory /github/workspace - git config --local --add safe.directory /github/workspace python -m pip install --no-deps -e . - name: Run unit tests @@ -119,12 +117,10 @@ jobs: env_vars: OS,PYTHON_VERSION,UNSTABLE - name: Coveralls Parallel -# uses: AndreMiras/coveralls-python-action@develop - uses: djhoese/coveralls-python-action@git-safe-dir + uses: AndreMiras/coveralls-python-action@develop with: flag-name: run-${{ matrix.test_number }} parallel: true - debug: true if: runner.os == 'Linux' - name: Run behaviour tests @@ -146,7 +142,6 @@ jobs: runs-on: ubuntu-latest steps: - name: Coveralls Finished -# uses: AndreMiras/coveralls-python-action@develop - uses: djhoese/coveralls-python-action@git-safe-dir + uses: AndreMiras/coveralls-python-action@develop with: parallel-finished: true diff --git a/pyproject.toml b/pyproject.toml index 35ba5e8dc2..ea3c094615 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -145,3 +145,7 @@ convention = "google" [tool.ruff.lint.mccabe] # Unlike Flake8, default to a complexity level of 10. max-complexity = 10 + +[tool.coverage.run] +relative_files = true +omit = ["satpy/version.py"] From 06e3139a056dafe8e597f55eaef1a22bf46c87ae Mon Sep 17 00:00:00 2001 From: David Hoese Date: Tue, 7 May 2024 12:29:22 -0500 Subject: [PATCH 431/481] Use djhoese debug coveralls action again --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c472709bc8..d8a1e63231 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -117,7 +117,7 @@ jobs: env_vars: OS,PYTHON_VERSION,UNSTABLE - name: Coveralls Parallel - uses: AndreMiras/coveralls-python-action@develop + uses: djhoese/coveralls-python-action@git-safe-dir with: flag-name: run-${{ matrix.test_number }} parallel: true @@ -142,6 +142,6 @@ jobs: runs-on: ubuntu-latest steps: - name: Coveralls Finished - uses: AndreMiras/coveralls-python-action@develop + uses: djhoese/coveralls-python-action@git-safe-dir with: parallel-finished: true From f90edd54630d38ca90ecc01bb1b445f06378d7b4 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Tue, 7 May 2024 12:39:16 -0500 Subject: [PATCH 432/481] Add debug to coveralls action --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d8a1e63231..bc13fd9a4f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -121,6 +121,7 @@ jobs: with: flag-name: run-${{ matrix.test_number }} parallel: true + debug: true if: runner.os == 'Linux' - name: Run behaviour tests From 7936297170ea8368635d5a3017cd57a6b8f76e01 Mon Sep 17 00:00:00 2001 From: clement laplace Date: Wed, 8 May 2024 08:39:15 +0000 Subject: [PATCH 433/481] typo: change the place of recquired_netcdf_variables into the fci_l1c_nc.yaml file, erase _ that is in front for some constant --- satpy/etc/readers/fci_l1c_nc.yaml | 57 ++++++++++----------- satpy/tests/reader_tests/test_fci_l1c_nc.py | 54 +++++++++---------- 2 files changed, 55 insertions(+), 56 deletions(-) diff --git a/satpy/etc/readers/fci_l1c_nc.yaml b/satpy/etc/readers/fci_l1c_nc.yaml index 8f39097479..51a023cc56 100644 --- a/satpy/etc/readers/fci_l1c_nc.yaml +++ b/satpy/etc/readers/fci_l1c_nc.yaml @@ -13,34 +13,6 @@ reader: # Source: MTG FCI L1 Product User Guide [FCIL1PUG] # https://www.eumetsat.int/media/45923 -required_netcdf_variables: &required-variables - - attr/platform - - data/{channel_name}/measured/start_position_row - - data/{channel_name}/measured/end_position_row - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a - - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 - - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 - - data/{channel_name}/measured/radiance_unit_conversion_coefficient - - data/{channel_name}/measured/channel_effective_solar_irradiance - - data/{channel_name}/measured/effective_radiance - - data/{channel_name}/measured/x - - data/{channel_name}/measured/y - - data/{channel_name}/measured/pixel_quality - - data/{channel_name}/measured/index_map - - data/mtg_geos_projection - - data/swath_direction - - data/swath_number - - index - - state/celestial/earth_sun_distance - - state/celestial/subsolar_latitude - - state/celestial/subsolar_longitude - - state/celestial/sun_satellite_distance - - state/platform/platform_altitude - - state/platform/subsatellite_latitude - - state/platform/subsatellite_longitude - - time file_types: fci_l1c_fdhsi: @@ -50,7 +22,34 @@ file_types: "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-FDHSI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc", ] expected_segments: 40 - required_netcdf_variables: *required-variables + required_netcdf_variables: &required-variables + - attr/platform + - data/{channel_name}/measured/start_position_row + - data/{channel_name}/measured/end_position_row + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_wavenumber + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_a + - data/{channel_name}/measured/radiance_to_bt_conversion_coefficient_b + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c1 + - data/{channel_name}/measured/radiance_to_bt_conversion_constant_c2 + - data/{channel_name}/measured/radiance_unit_conversion_coefficient + - data/{channel_name}/measured/channel_effective_solar_irradiance + - data/{channel_name}/measured/effective_radiance + - data/{channel_name}/measured/x + - data/{channel_name}/measured/y + - data/{channel_name}/measured/pixel_quality + - data/{channel_name}/measured/index_map + - data/mtg_geos_projection + - data/swath_direction + - data/swath_number + - index + - state/celestial/earth_sun_distance + - state/celestial/subsolar_latitude + - state/celestial/subsolar_longitude + - state/celestial/sun_satellite_distance + - state/platform/platform_altitude + - state/platform/subsatellite_latitude + - state/platform/subsatellite_longitude + - time variable_name_replacements: channel_name: - vis_04 diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index 56130190af..98777d0e51 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -107,12 +107,12 @@ } } -_CHANS_FDHSI = {"solar": LIST_CHANNEL_SOLAR, +CHANS_FHDSI = {"solar": LIST_CHANNEL_SOLAR, "solar_grid_type": ["1km"] * 8, "terran": LIST_CHANNEL_TERRAN, "terran_grid_type": ["2km"] * 8} -_CHANS_HRFI = {"solar": ["vis_06", "nir_22"], +CHANS_HRFI = {"solar": ["vis_06", "nir_22"], "solar_grid_type": ["500m"] * 2, "terran": ["ir_38", "ir_105"], "terran_grid_type": ["1km"] * 2} @@ -148,7 +148,7 @@ }, }, } -_test_filenames = {"fdhsi": [ +TEST_FILENAMES = {"fdhsi": [ "W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--" "CHK-BODY--L2P-NC4E_C_EUMT_20170410114434_GTT_DEV_" "20170410113925_20170410113934_N__C_0070_0067.nc" @@ -168,24 +168,24 @@ def resolutions(channel): return LIST_RESOLUTION def fill_chans_af(): - """Fill the dict _CHANS_AF and the list _test_filenames with the right channel and resolution.""" - _CHANS_AF = {} + """Fill the dict CHANS_AF and the list TEST_FILENAMES with the right channel and resolution.""" + CHANS_AF = {} for channel in LIST_TOTAL_CHANNEL: list_resol = resolutions(channel) for resol in list_resol: chann_upp = channel.replace("_","").upper() - _test_filenames[f"af_{channel}_{resol}"] = [f"W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD" + TEST_FILENAMES[f"af_{channel}_{resol}"] = [f"W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1-FCI-1C-RRAD" f"-{resol.upper()}-AF-{chann_upp}-x-x---NC4E_C_EUMT_20240125144655_DT_OPE" f"_20240109080007_20240109080924_N_JLS_T_0049_0000.nc"] if channel.split("_")[0] in ["vis","nir"]: - _CHANS_AF[f"{channel}_{resol}"] = {"solar":[channel], + CHANS_AF[f"{channel}_{resol}"] = {"solar":[channel], "solar_grid_type": [resol]} elif channel.split("_")[0] in ["ir","wv"]: - _CHANS_AF[f"{channel}_{resol}"] = {"terran":[channel], + CHANS_AF[f"{channel}_{resol}"] = {"terran":[channel], "terran_grid_type": [resol]} - return _CHANS_AF,_test_filenames + return CHANS_AF,TEST_FILENAMES -_CHANS_AF,_test_filenames = fill_chans_af() +CHANS_AF,TEST_FILENAMES = fill_chans_af() # ---------------------------------------------------- # Filehandlers preparation --------------------------- # ---------------------------------------------------- @@ -553,8 +553,8 @@ def FakeFCIFileHandlerFDHSI_fixture(): with mocked_basefilehandler(FakeFCIFileHandlerFDHSI): param_dict = { "filetype": "fci_l1c_fdhsi", - "channels": _CHANS_FDHSI, - "filenames": _test_filenames["fdhsi"] + "channels": CHANS_FHDSI, + "filenames": TEST_FILENAMES["fdhsi"] } yield param_dict @@ -565,8 +565,8 @@ def FakeFCIFileHandlerHRFI_fixture(): with mocked_basefilehandler(FakeFCIFileHandlerHRFI): param_dict = { "filetype": "fci_l1c_hrfi", - "channels": _CHANS_HRFI, - "filenames": _test_filenames["hrfi"] + "channels": CHANS_HRFI, + "filenames": TEST_FILENAMES["hrfi"] } yield param_dict @@ -579,8 +579,8 @@ def FakeFCIFileHandlerAF_fixture(channel,resolution): with mocked_basefilehandler(FakeFCIFileHandlerAF): param_dict = { "filetype": "fci_l1c_af", - "channels": _CHANS_AF[f"{channel}_{resolution}"], - "filenames": _test_filenames[f"af_{channel}_{resolution}"], + "channels": CHANS_AF[f"{channel}_{resolution}"], + "filenames": TEST_FILENAMES[f"af_{channel}_{resolution}"], } yield param_dict @@ -592,10 +592,10 @@ def FakeFCIFileHandlerAF_fixture(channel,resolution): class TestFCIL1cNCReader: """Test FCI L1c NetCDF reader with nominal data.""" - fh_param_for_filetype = {"hrfi": {"channels": _CHANS_HRFI, - "filenames": _test_filenames["hrfi"]}, - "fdhsi": {"channels": _CHANS_FDHSI, - "filenames": _test_filenames["fdhsi"]}} + fh_param_for_filetype = {"hrfi": {"channels": CHANS_HRFI, + "filenames": TEST_FILENAMES["hrfi"]}, + "fdhsi": {"channels": CHANS_FHDSI, + "filenames": TEST_FILENAMES["fdhsi"]}} def _get_type_ter_AF(self,channel): """Get the type_ter.""" @@ -632,7 +632,7 @@ def _get_res_AF(self,channel,fh_param,calibration,reader_configs): for name in fh_param["channels"][type_ter]], pad_data=False) return res - @pytest.mark.parametrize("filenames", [_test_filenames[filename] for filename in _test_filenames.keys()]) + @pytest.mark.parametrize("filenames", [TEST_FILENAMES[filename] for filename in TEST_FILENAMES.keys()]) def test_file_pattern(self, reader_configs, filenames): """Test file pattern matching.""" from satpy.readers import load_reader @@ -641,8 +641,8 @@ def test_file_pattern(self, reader_configs, filenames): files = reader.select_files_from_pathnames(filenames) assert len(files) == 1 - @pytest.mark.parametrize("filenames", [_test_filenames["fdhsi"][0].replace("BODY", "TRAIL"), - _test_filenames["hrfi"][0].replace("BODY", "TRAIL")]) + @pytest.mark.parametrize("filenames", [TEST_FILENAMES["fdhsi"][0].replace("BODY", "TRAIL"), + TEST_FILENAMES["hrfi"][0].replace("BODY", "TRAIL")]) def test_file_pattern_for_TRAIL_file(self, reader_configs, filenames): """Test file pattern matching for TRAIL files, which should not be picked up.""" from satpy.readers import load_reader @@ -880,7 +880,7 @@ class TestFCIL1cNCReaderBadData: def test_handling_bad_data_ir(self, reader_configs, caplog): """Test handling of bad IR data.""" with mocked_basefilehandler(FakeFCIFileHandlerWithBadData): - reader = _get_reader_with_filehandlers(_test_filenames["fdhsi"], reader_configs) + reader = _get_reader_with_filehandlers(TEST_FILENAMES["fdhsi"], reader_configs) with caplog.at_level(logging.ERROR): reader.load([make_dataid( name="ir_105", @@ -890,7 +890,7 @@ def test_handling_bad_data_ir(self, reader_configs, caplog): def test_handling_bad_data_vis(self, reader_configs, caplog): """Test handling of bad VIS data.""" with mocked_basefilehandler(FakeFCIFileHandlerWithBadData): - reader = _get_reader_with_filehandlers(_test_filenames["fdhsi"], reader_configs) + reader = _get_reader_with_filehandlers(TEST_FILENAMES["fdhsi"], reader_configs) with caplog.at_level(logging.ERROR): reader.load([make_dataid( name="vis_06", @@ -904,7 +904,7 @@ class TestFCIL1cNCReaderBadDataFromIDPF: def test_handling_bad_earthsun_distance(self, reader_configs): """Test handling of bad earth-sun distance data.""" with mocked_basefilehandler(FakeFCIFileHandlerWithBadIDPFData): - reader = _get_reader_with_filehandlers(_test_filenames["fdhsi"], reader_configs) + reader = _get_reader_with_filehandlers(TEST_FILENAMES["fdhsi"], reader_configs) res = reader.load([make_dataid(name=["vis_06"], calibration="reflectance")], pad_data=False) numpy.testing.assert_array_almost_equal(res["vis_06"], 100 * 15 * 1 * np.pi / 50) @@ -912,7 +912,7 @@ def test_handling_bad_earthsun_distance(self, reader_configs): def test_bad_xy_coords(self, reader_configs): """Test that the geolocation computation is correct.""" with mocked_basefilehandler(FakeFCIFileHandlerWithBadIDPFData): - reader = _get_reader_with_filehandlers(_test_filenames["fdhsi"], reader_configs) + reader = _get_reader_with_filehandlers(TEST_FILENAMES["fdhsi"], reader_configs) res = reader.load(["vis_06"], pad_data=False) area_def = res["vis_06"].attrs["area"] From 1d8a0ff0d568a556207821c003f947909b72c984 Mon Sep 17 00:00:00 2001 From: clement laplace Date: Wed, 8 May 2024 12:21:08 +0000 Subject: [PATCH 434/481] feat: Add file patterns into the fci_l1c_nc.yaml file to handle the future change in the file name for AF data --- satpy/etc/readers/fci_l1c_nc.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/satpy/etc/readers/fci_l1c_nc.yaml b/satpy/etc/readers/fci_l1c_nc.yaml index 51a023cc56..897e3750c3 100644 --- a/satpy/etc/readers/fci_l1c_nc.yaml +++ b/satpy/etc/readers/fci_l1c_nc.yaml @@ -82,12 +82,16 @@ file_types: - nir_22_hr - ir_38_hr - ir_105_hr + # Note: In The current file the 'MTI1-FCI-1C' which is a part of the file will be replaced by MTI1+FCI-1C, patterns have been added + # to maanage this issue fci_l1c_af_vis_06: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-1KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -99,6 +103,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -110,6 +115,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -121,6 +127,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -132,6 +139,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -143,6 +151,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -154,6 +163,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -165,6 +175,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -176,6 +187,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -187,6 +199,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -198,6 +211,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -209,6 +223,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -220,6 +235,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -231,6 +247,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -242,6 +259,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables @@ -253,6 +271,7 @@ file_types: file_patterns: [ "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", + "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", ] expected_segments: 1 required_netcdf_variables: *required-variables From 2a54930b70e355539eaf73f30c40e58faf6d0312 Mon Sep 17 00:00:00 2001 From: clement laplace Date: Wed, 8 May 2024 12:32:13 +0000 Subject: [PATCH 435/481] feat: Add comment into the fci_l1c_nc.yaml file --- satpy/etc/readers/fci_l1c_nc.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/readers/fci_l1c_nc.yaml b/satpy/etc/readers/fci_l1c_nc.yaml index 897e3750c3..dee588aff9 100644 --- a/satpy/etc/readers/fci_l1c_nc.yaml +++ b/satpy/etc/readers/fci_l1c_nc.yaml @@ -83,7 +83,7 @@ file_types: - ir_38_hr - ir_105_hr # Note: In The current file the 'MTI1-FCI-1C' which is a part of the file will be replaced by MTI1+FCI-1C, patterns have been added - # to maanage this issue + # to maanage this fci_l1c_af_vis_06: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: From be6fd983f6ea6c08d81d20c661cd4b8faaefc121 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Thu, 9 May 2024 09:34:56 -0500 Subject: [PATCH 436/481] Switch back to upstream coveralls action --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bc13fd9a4f..1f14aa2421 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -117,7 +117,7 @@ jobs: env_vars: OS,PYTHON_VERSION,UNSTABLE - name: Coveralls Parallel - uses: djhoese/coveralls-python-action@git-safe-dir + uses: AndreaMiras/coveralls-python-action@develop with: flag-name: run-${{ matrix.test_number }} parallel: true @@ -143,6 +143,6 @@ jobs: runs-on: ubuntu-latest steps: - name: Coveralls Finished - uses: djhoese/coveralls-python-action@git-safe-dir + uses: AndreMiras/coveralls-python-action@develop with: parallel-finished: true From 8b653213f2d7085ca7b94842ec4eb03a34c3247d Mon Sep 17 00:00:00 2001 From: David Hoese Date: Thu, 9 May 2024 09:38:25 -0500 Subject: [PATCH 437/481] Fix typo in coveralls action name --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1f14aa2421..15695cddd0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -117,7 +117,7 @@ jobs: env_vars: OS,PYTHON_VERSION,UNSTABLE - name: Coveralls Parallel - uses: AndreaMiras/coveralls-python-action@develop + uses: AndreMiras/coveralls-python-action@develop with: flag-name: run-${{ matrix.test_number }} parallel: true From 174261655ce8a5036d8814610fe5ac5f2284c76c Mon Sep 17 00:00:00 2001 From: David Hoese Date: Thu, 9 May 2024 09:50:19 -0500 Subject: [PATCH 438/481] Remove coveralls debug from CI --- .github/workflows/ci.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 15695cddd0..c472709bc8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -121,7 +121,6 @@ jobs: with: flag-name: run-${{ matrix.test_number }} parallel: true - debug: true if: runner.os == 'Linux' - name: Run behaviour tests From f71d65e8570f23d30ff68c689a150d39a21ed5b8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 21:33:47 +0000 Subject: [PATCH 439/481] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.3.5 → v0.4.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.3.5...v0.4.3) - [github.com/pre-commit/pre-commit-hooks: v4.5.0 → v4.6.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.5.0...v4.6.0) - [github.com/pre-commit/mirrors-mypy: v1.9.0 → v1.10.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.9.0...v1.10.0) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index eadd0f2c55..53db32e42a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,11 +3,11 @@ fail_fast: false repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: 'v0.3.5' + rev: 'v0.4.3' hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v4.6.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -19,7 +19,7 @@ repos: - id: bandit args: [--ini, .bandit] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.9.0' # Use the sha / tag you want to point at + rev: 'v1.10.0' # Use the sha / tag you want to point at hooks: - id: mypy additional_dependencies: From 32df7500f056436c0ff765c5be98c80efc4ea35f Mon Sep 17 00:00:00 2001 From: isotr0py <2037008807@qq.com> Date: Sat, 11 May 2024 13:13:42 +0800 Subject: [PATCH 440/481] Add netcdf4 to goci2 optional dependency --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index ea3c094615..33086ffe85 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,6 +40,7 @@ avhrr_l1b_eps = ["defusedxml"] avhrr_l1b_gaclac = ["pygac >= 1.3.0"] modis_l1b = ["pyhdf", "python-geotiepoints >= 1.1.7"] geocat = ["pyhdf"] +goci2 = ["netCDF4 >= 1.1.8"] acspo = ["netCDF4 >= 1.1.8"] clavrx = ["netCDF4 >= 1.1.8"] viirs_l1b = ["netCDF4 >= 1.1.8"] From e9aa4ad18d730aeaec76975183ea09d9d816dd68 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 13 May 2024 12:14:05 +0800 Subject: [PATCH 441/481] Update mersi_l1b.py --- satpy/readers/mersi_l1b.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/satpy/readers/mersi_l1b.py b/satpy/readers/mersi_l1b.py index 1a2353fbf2..84e1fb43cf 100644 --- a/satpy/readers/mersi_l1b.py +++ b/satpy/readers/mersi_l1b.py @@ -131,10 +131,9 @@ def get_dataset(self, dataset_id, ds_info): file_key = ds_info.get("file_key", dataset_id["name"]) band_index = ds_info.get("band_index") data = self[file_key] - if band_index is not None: - data = data[band_index] - if data.ndim >= 2: - data = data.rename({data.dims[-2]: "y", data.dims[-1]: "x"}) + data = data[band_index] if band_index is not None else data + data = data.rename({data.dims[-2]: "y", data.dims[-1]: "x"}) if data.ndim >= 2 else data + attrs = data.attrs.copy() # avoid contaminating other band loading attrs.update(ds_info) if "rows_per_scan" in self.filetype_info: @@ -267,12 +266,10 @@ def _get_bt_dataset(self, data, calibration_index, wave_number): """ # pass the dask array bt_data = rad2temp(wave_number, data.data * 1e-5) # brightness temperature - if isinstance(bt_data, np.ndarray): - # old versions of pyspectral produce numpy arrays - data.data = da.from_array(bt_data, chunks=data.data.chunks) - else: - # new versions of pyspectral can do dask arrays - data.data = bt_data + + # old versions of pyspectral produce numpy arrays + # new versions of pyspectral can do dask arrays + data.data = da.from_array(bt_data, chunks=data.data.chunks) if isinstance(bt_data, np.ndarray) else bt_data # Some BT bands seem to have 0 in the first 10 columns # and it is an invalid measurement, so let's mask From f176ec3887bd64e395fcf0c243dd4992ddac2b41 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 13 May 2024 08:51:54 +0200 Subject: [PATCH 442/481] Add numpy rules to ruff --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ea3c094615..01abbbd1ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -132,7 +132,7 @@ line-length = 120 [tool.ruff.lint] # See https://docs.astral.sh/ruff/rules/ # In the future, add "B", "S", "N" -select = ["A", "D", "E", "W", "F", "I", "PT", "TID", "C90", "Q", "T10", "T20"] +select = ["A", "D", "E", "W", "F", "I", "PT", "TID", "C90", "Q", "T10", "T20", "NPY"] [tool.ruff.lint.per-file-ignores] "satpy/tests/*" = ["S101"] # assert allowed in tests From 809107edff658d18141c2e7378f29d6521fa1e3a Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 15 May 2024 12:02:12 +0800 Subject: [PATCH 443/481] reverse --- satpy/etc/readers/msi_safe.yaml | 57 +- satpy/readers/msi_safe.py | 66 +- satpy/tests/reader_tests/test_msi_safe.py | 848 +++------------------- 3 files changed, 168 insertions(+), 803 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index cc39c26a74..20b324a036 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -1,8 +1,8 @@ reader: name: msi_safe - short_name: MSI SAFE L1C - long_name: Sentinel-2 A and B MSI L1C data in SAFE format - description: SAFE Reader for MSI L1C data (Sentinel-2) + short_name: MSI SAFE + long_name: Sentinel-2 A and B MSI data in SAFE format, supporting L1C format only. + description: SAFE Reader for MSI data (Sentinel-2) status: Nominal supports_fsspec: false sensors: [msi] @@ -10,18 +10,20 @@ reader: reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader file_types: - l1c_safe_granule: + safe_granule_l1c: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] - requires: [l1c_safe_metadata, l1c_safe_tile_metadata] - l1c_safe_tile_metadata: + file_patterns: ['{fmission_id:3s}_MSI{proclevel:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] + requires: [safe_metadata, safe_tile_metadata] + safe_tile_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] - l1c_safe_metadata: + file_patterns: ['{fmission_id:3s}_MSI{proclevel:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + safe_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML - file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] + file_patterns: ['{fmission_id:3s}_MSI{proclevel:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] + datasets: + B01: name: B01 sensor: msi @@ -37,7 +39,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B02: name: B02 @@ -54,7 +56,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B03: name: B03 @@ -71,7 +73,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B04: name: B04 @@ -88,7 +90,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B05: name: B05 @@ -105,7 +107,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B06: name: B06 @@ -122,7 +124,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B07: name: B07 @@ -139,7 +141,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B08: name: B08 @@ -156,7 +158,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B8A: name: B8A @@ -173,7 +175,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B09: name: B09 @@ -190,7 +192,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B10: name: B10 @@ -207,7 +209,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B11: name: B11 @@ -224,7 +226,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c B12: name: B12 @@ -241,30 +243,31 @@ datasets: counts: standard_name: counts units: "1" - file_type: l1c_safe_granule + file_type: safe_granule_l1c + solar_zenith_angle: name: solar_zenith_angle resolution: [10, 20, 60] - file_type: l1c_safe_tile_metadata + file_type: safe_tile_metadata xml_tag: Sun_Angles_Grid/Zenith solar_azimuth_angle: name: solar_azimuth_angle resolution: [10, 20, 60] - file_type: l1c_safe_tile_metadata + file_type: safe_tile_metadata xml_tag: Sun_Angles_Grid/Azimuth satellite_azimuth_angle: name: satellite_azimuth_angle resolution: [10, 20, 60] - file_type: l1c_safe_tile_metadata + file_type: safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids xml_item: Azimuth satellite_zenith_angle: name: satellite_zenith_angle resolution: [10, 20, 60] - file_type: l1c_safe_tile_metadata + file_type: safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids xml_item: Zenith diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index d0aa94538c..5ec5ff3ea0 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -28,16 +28,14 @@ reader_kwargs={'mask_saturated': False}) scene.load(['B01']) -L1C/L2A format description for the files read here: +L1C format description for the files read here: - https://sentinels.copernicus.eu/documents/247904/685211/S2-PDGS-TAS-DI-PSD-V14.9.pdf/3d3b6c9c-4334-dcc4-3aa7-f7c0deffbaf7?t=1643013091529 - -Please note: for L2A datasets, the band name has been fixed with a "_L2A" suffix. Do not change it in the YAML file or -the reader can't recogonize it and nothing will be loaded. + https://sentinels.copernicus.eu/documents/247904/0/Sentinel-2-product-specifications-document-V14-9.pdf/ """ import logging +from datetime import datetime import dask.array as da import defusedxml.ElementTree as ET @@ -66,28 +64,21 @@ def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_s super(SAFEMSIL1C, self).__init__(filename, filename_info, filetype_info) del mask_saturated - self._start_time = filename_info["observation_time"] - self._end_time = filename_info["observation_time"] self._channel = filename_info["band_name"] - self.process_level = filename_info["process_level"] self._tile_mda = tile_mda self._mda = mda self.platform_name = PLATFORMS[filename_info["fmission_id"]] + self._start_time = self._tile_mda.start_time() + self._end_time = filename_info["observation_time"] + def get_dataset(self, key, info): """Load a dataset.""" - if self.process_level == "L1C": - if self._channel != key["name"]: - return - else: - if self._channel + "_L2A" != key["name"]: - return + if self._channel != key["name"]: + return logger.debug("Reading %s.", key["name"]) - proj = self._read_from_file(key) - if proj is None: - return proj.attrs = info.copy() proj.attrs["units"] = "%" proj.attrs["platform_name"] = self.platform_name @@ -102,8 +93,6 @@ def _read_from_file(self, key): return self._mda.calibrate_to_radiances(proj, self._channel) if key["calibration"] == "counts": return self._mda._sanitize_data(proj) - if key["calibration"] in ["aerosol_thickness", "water_vapor"]: - return self._mda.calibrate_to_atmospheric(proj, self._channel) @property def start_time(self): @@ -117,13 +106,8 @@ def end_time(self): def get_area_def(self, dsid): """Get the area def.""" - if self.process_level == "L1C": - if self._channel != dsid["name"]: - return - else: - if self._channel + "_L2A" != dsid["name"]: - return - + if self._channel != dsid["name"]: + return return self._tile_mda.get_area_def(dsid) @@ -137,7 +121,6 @@ def __init__(self, filename, filename_info, filetype_info, mask_saturated=True): self._end_time = filename_info["observation_time"] self.root = ET.parse(self.filename) self.tile = filename_info["dtile_number"] - self.process_level = filename_info["process_level"] self.platform_name = PLATFORMS[filename_info["fmission_id"]] self.mask_saturated = mask_saturated import bottleneck # noqa @@ -159,23 +142,10 @@ class SAFEMSIMDXML(SAFEMSIXMLMetadata): def calibrate_to_reflectances(self, data, band_name): """Calibrate *data* using the radiometric information for the metadata.""" - quantification = int(self.root.find(".//QUANTIFICATION_VALUE").text) if self.process_level == "L1C" else \ - int(self.root.find(".//BOA_QUANTIFICATION_VALUE").text) + quantification = int(self.root.find(".//QUANTIFICATION_VALUE").text) data = self._sanitize_data(data) return (data + self.band_offset(band_name)) / quantification * 100 - def calibrate_to_atmospheric(self, data, band_name): - """Calibrate L2A AOT/WVP product.""" - atmospheric_bands = ["AOT", "WVP"] - if self.process_level == "L1C": - return - elif self.process_level == "L2A" and band_name not in atmospheric_bands: - return - - quantification = float(self.root.find(f".//{band_name}_QUANTIFICATION_VALUE").text) - data = self._sanitize_data(data) - return data / quantification - def _sanitize_data(self, data): data = data.where(data != self.no_data) if self.mask_saturated: @@ -204,8 +174,7 @@ def band_indices(self): @cached_property def band_offsets(self): """Get the band offsets from the metadata.""" - offsets = self.root.find(".//Radiometric_Offset_List") if self.process_level == "L1C" else \ - self.root.find(".//BOA_ADD_OFFSET_VALUES_LIST") + offsets = self.root.find(".//Radiometric_Offset_List") if offsets is not None: band_offsets = {int(off.attrib["band_id"]): float(off.text) for off in offsets} else: @@ -302,6 +271,11 @@ def _shape(self, resolution): cols = int(self.geocoding.find('Size[@resolution="' + str(resolution) + '"]/NCOLS').text) return cols, rows + def start_time(self): + """Get the observation time from the tile metadata.""" + timestr = self.root.find(".//SENSING_TIME").text + return datetime.strptime(timestr, "%Y-%m-%dT%H:%M:%S.%fZ") + @staticmethod def _do_interp(minterp, xcoord, ycoord): interp_points2 = np.vstack((ycoord.ravel(), xcoord.ravel())) @@ -328,11 +302,9 @@ def interpolate_angles(self, angles, resolution): def _get_coarse_dataset(self, key, info): """Get the coarse dataset refered to by `key` from the XML data.""" angles = self.root.find(".//Tile_Angles") - if key["name"] in ["solar_zenith_angle", "solar_azimuth_angle", - "solar_zenith_angle_l2a", "solar_azimuth_angle_l2a"]: + if key["name"] in ["solar_zenith_angle", "solar_azimuth_angle"]: angles = self._get_solar_angles(angles, info) - elif key["name"] in ["satellite_zenith_angle", "satellite_azimuth_angle", - "satellite_zenith_angle_l2a", "satellite_azimuth_angle_l2a"]: + elif key["name"] in ["satellite_zenith_angle", "satellite_azimuth_angle"]: angles = self._get_satellite_angles(angles, info) else: angles = None diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 59c3564fd4..b919278bf5 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -17,6 +17,7 @@ # satpy. If not, see . """Module for testing the satpy.readers.msi_safe module.""" import unittest.mock as mock +from datetime import datetime from io import BytesIO, StringIO import numpy as np @@ -25,7 +26,11 @@ from satpy.tests.utils import make_dataid -mtd_l1c_tile_xml = b""" +# Datetimes used for checking start time is correctly set. +fname_dt = datetime(2020, 10, 1, 18, 35, 41) +tilemd_dt = datetime(2020, 10, 1, 16, 34, 23, 153611) + +mtd_tile_xml = b""" @@ -575,6 +580,7 @@ """ # noqa + mtd_l1c_old_xml = """ @@ -860,597 +866,27 @@ """ # noqa -mtd_l2a_xml = """ - - - - 2024-04-11T03:05:21.024Z - 2024-04-11T03:05:21.024Z - S2A_MSIL2A_20240411T030521_N0510_R075_T50TMK_20240411T080950.SAFE - Level-2A - S2MSI2A - 05.10 - https://doi.org/10.5270/S2_-znk9xsj - 2024-04-11T08:09:50.000000Z - Not applicable - Not applicable - - Sentinel-2A - INS-NOBS - 2024-04-11T03:05:21.024Z - 75 - DESCENDING - - -SAFE_COMPACT - - - - - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B02_10m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B03_10m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B04_10m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B08_10m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_TCI_10m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_AOT_10m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_WVP_10m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B01_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B02_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B03_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B04_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B05_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B06_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B07_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B8A_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B11_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B12_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_TCI_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_AOT_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_WVP_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_SCL_20m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B01_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B02_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B03_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B04_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B05_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B06_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B07_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B8A_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B09_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B11_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B12_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_TCI_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_AOT_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_WVP_60m - GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_SCL_60m - - - - - - - NODATA - 0 - - - SATURATED - 65535 - - - 3 - 2 - 1 - - - 10000 - 1000.0 - 1000.0 - - - -1000 - -1000 - -1000 - -1000 - -1000 - -1000 - -1000 - -1000 - -1000 - -1000 - -1000 - -1000 - -1000 - - - 0.998279632507911 - - 1884.69 - 1959.66 - 1823.24 - 1512.06 - 1424.64 - 1287.61 - 1162.08 - 1041.63 - 955.32 - 812.92 - 367.15 - 245.59 - 85.25 - - - - - 60 - - 412 - 456 - 442.7 - - - 1 - 0.001775742 0.004073061 0.003626143 0.003515199 0.005729163 0.003780292 0.002636732 0.001262113 0.001987583 0.001368913 0.001250444 0.000463454 0.000814293 0.001376431 0.001485086 0.001823735 0.001626817 0.004392062 0.029008099 0.11874593 0.32387506 0.57281921 0.71472749 0.76196778 0.78929702 0.80862387 0.81089382 0.82419876 0.85415811 0.87079088 0.88731097 0.92619924 0.98228149 1 0.9752382 0.93596338 0.88997148 0.85021048 0.82569453 0.78390239 0.61417422 0.33007109 0.12410831 0.04365694 0.014749595 - - - - 10 - - 456 - 533 - 492.7 - - - 1 - 0.04255531 0.0722983 0.15374322 0.32799225 0.55336788 0.71011166 0.75285179 0.75232691 0.75668081 0.76326948 0.76239425 0.7852515 0.81546669 0.86179176 0.89282599 0.9195221 0.91900649 0.91315754 0.90035366 0.88989693 0.8823246 0.87606118 0.88429987 0.90695544 0.93232085 0.93947252 0.94383543 0.92204086 0.8860231 0.84743609 0.81251687 0.7823971 0.7731087 0.77209054 0.78742652 0.81217177 0.84605052 0.88767996 0.92793997 0.95069235 0.96573311 0.96938253 0.96570294 0.95832003 0.95405064 0.95178268 0.95699722 0.96556515 0.9770514 0.97709574 0.97436606 0.95903183 0.93506318 0.90190134 0.87165792 0.84402444 0.82280852 0.81536043 0.82057639 0.8395149 0.86992171 0.91526205 0.96067028 0.99163699 1 0.98356097 0.91130763 0.74018256 0.50395858 0.3050155 0.18004605 0.10738342 0.06593592 0.04207746 0.02662129 0.0143396 0.00265779 0.00081822 - - - - 10 - - 538 - 583 - 559.8 - - - 1 - 0.01448181 0.03422251 0.07346335 0.15444843 0.31661425 0.55322279 0.74859406 0.84890306 0.89772216 0.9215368 0.92572845 0.91122688 0.88818924 0.86523756 0.84718187 0.8387572 0.84459081 0.86219653 0.88838714 0.92443236 0.96017974 0.98685516 1 0.9986008 0.98076472 0.94522089 0.8981778 0.85580323 0.81841734 0.78862048 0.76460653 0.74963745 0.75055111 0.76137888 0.78244479 0.79890086 0.81016957 0.81408886 0.77358596 0.62881065 0.40397555 0.21542098 0.10715281 0.04792877 0.01848693 0.00108588 - - - - 10 - - 646 - 684 - 664.6 - - - 1 - 0.00141521 0.02590238 0.11651178 0.39088616 0.74959342 0.94485805 0.98011173 0.99406309 1 0.99545475 0.99052772 0.97733476 0.94055988 0.87894956 0.81629384 0.77345952 0.75448766 0.75991531 0.7826343 0.8101689 0.83612975 0.86125424 0.88609106 0.91138767 0.93405146 0.95042063 0.9592573 0.96039555 0.95913395 0.95809013 0.95527459 0.94376465 0.89490799 0.74426308 0.476777 0.22960399 0.08009118 0.02617076 0.00415242 - - - - 20 - - 695 - 714 - 704.1 - - - 1 - 0.02835786 0.12369337 0.39378774 0.76113071 0.97108502 0.99889523 1 0.99412258 0.98321789 0.96704093 0.94847389 0.92714833 0.90372458 0.88614713 0.86723745 0.79075319 0.58840332 0.26334833 0.05675422 0.00618833 - - - - 20 - - 731 - 749 - 740.5 - - - 1 - 0.00171088 0.05467153 0.25806676 0.64722098 0.89218999 0.90232877 0.91508768 0.94115846 0.96299993 0.97510481 0.9770217 0.98736251 1 0.98880277 0.97179916 0.90126739 0.60672391 0.20520227 0.0267569 - - - - 20 - - 769 - 797 - 782.8 - - - 1 - 0.00045899 0.0117201 0.05219715 0.16561733 0.36903355 0.63685453 0.86119638 0.97002897 0.99119602 0.99897921 1 0.97725155 0.92572385 0.86605804 0.81969611 0.79407674 0.79111029 0.80431552 0.81902721 0.82571292 0.82011829 0.79222195 0.72054559 0.58767794 0.41430355 0.23088817 0.09850282 0.02736551 0.00516235 - - - - 10 - - 760 - 907 - 832.8 - - - 1 - 0.00067259 0.00388856 0 0 0 0 0 0 0 0 0 0 0 0.00028956 0.00702964 0.01752391 0.03231111 0.05328661 0.08299885 0.12748502 0.19591065 0.30246323 0.43553954 0.57141637 0.69766701 0.80303852 0.89115744 0.95284584 0.98894161 1 0.98840653 0.96389216 0.94207967 0.93694643 0.94227343 0.95395718 0.96828896 0.97966549 0.9854444 0.98592681 0.98391181 0.97793903 0.97722771 0.97810609 0.98144486 0.98764558 0.98857708 0.9862422 0.98070921 0.97078624 0.95721089 0.93865821 0.91672388 0.89620759 0.872888 0.85160331 0.8246394 0.80078117 0.7823386 0.76360274 0.74962771 0.7387221 0.73079407 0.72271237 0.72507708 0.72563856 0.72304217 0.72229211 0.71616364 0.71159446 0.70826954 0.70157205 0.69924532 0.70093762 0.70692733 0.71824001 0.73124634 0.7484061 0.76818541 0.78394807 0.7968381 0.80260206 0.8045194 0.80240918 0.79699072 0.78920304 0.77691621 0.76518406 0.75119717 0.73700357 0.72262399 0.70412578 0.68410805 0.66474528 0.64736891 0.63005125 0.61564222 0.60249557 0.58988992 0.57993399 0.57136506 0.56094242 0.55235105 0.54568236 0.53958052 0.53510215 0.53093675 0.53016508 0.52984662 0.53036682 0.53211463 0.53271918 0.53246806 0.53331158 0.5319278 0.53051055 0.52951499 0.52996848 0.53253373 0.53705085 0.54235344 0.54912497 0.55523055 0.56011135 0.55767999 0.54821984 0.53144613 0.50763528 0.47811224 0.45092793 0.42798466 0.41051405 0.40039139 0.40087302 0.40829375 0.42086556 0.43007022 0.42456692 0.39136817 0.33009008 0.25720509 0.18189031 0.11650668 0.07031579 0.04275381 0.02593154 0.01574394 0.00394326 - - - - 20 - - 837 - 881 - 864.7 - - - 1 - 0.00030097 0 0 0 0 0 0 0 0 0 0.00157217 0.00249886 0.01332037 0.02614866 0.05260479 0.10779709 0.22160755 0.39721628 0.60986885 0.81658883 0.9322445 0.97210033 0.97545482 0.97538048 0.97328205 0.97607828 0.98034955 0.98690928 0.99087465 0.99741818 0.99984673 0.99939141 0.99587928 0.99541228 1 0.99640762 0.92359433 0.74137684 0.48965971 0.25020643 0.11221246 0.04755984 0.02297815 0.01061438 0.00108149 - - - - 60 - - 932 - 958 - 945.1 - - - 1 - 0.01662953 0.06111857 0.17407094 0.38946454 0.6645915 0.87454114 0.93695988 0.96751014 0.9893391 0.9951269 1 0.97845762 0.98069118 0.9922335 0.98798379 0.99428313 0.98348041 0.97820013 0.95023367 0.95299604 0.92240308 0.85573828 0.70970227 0.46429542 0.21538427 0.06534121 0.01625596 - - - - 60 - - 1337 - 1412 - 1373.5 - - - 1 - 0.00024052 5.404e-05 3.052e-05 2.872e-05 7.632e-05 0.00010949 8.804e-05 0.00012356 0.00017424 0.0003317 0.00036891 0.0004467 0.00065919 0.0010913 0.00196903 0.00373668 0.00801754 0.01884719 0.04466732 0.10165546 0.20111776 0.34284841 0.50710992 0.6632068 0.78377143 0.86153862 0.91000261 0.94193255 0.96182259 0.97365119 0.98169786 0.98795826 0.99283342 0.99649788 0.99906011 1 0.99907734 0.99601604 0.9909083 0.98479854 0.97802142 0.97030114 0.96080954 0.94849765 0.93314108 0.91482336 0.8937997 0.86825426 0.83023193 0.76384193 0.65440009 0.50671604 0.35014737 0.21799972 0.12643091 0.06768988 0.0322709 0.013544 0.00544557 0.00237642 0.00111267 0.00053796 0.0003457 0.00017488 0.00021619 0.00019479 0.00010421 5.919e-05 5.109e-05 6.115e-05 5.527e-05 3.856e-05 3.147e-05 0.00012289 0.0001089 2.502e-05 - - - - 20 - - 1539 - 1682 - 1613.7 - - - 1 - 6.79e-06 6.66e-06 8e-06 2.734e-05 3.685e-05 8.851e-05 0.00014522 0.00024812 0.00047627 0.00056335 0.00065326 0.00089835 0.00114664 0.00165604 0.00241611 0.00350246 0.00524274 0.0081538 0.01237062 0.0186097 0.02721853 0.03879155 0.05379167 0.07353187 0.09932758 0.1334178 0.18029249 0.24484994 0.32834511 0.42749961 0.53576798 0.64570396 0.74245998 0.81447017 0.85866596 0.87924777 0.88665266 0.888727 0.89105732 0.89725046 0.90632982 0.91627527 0.9263751 0.93515828 0.94226446 0.94739906 0.95131987 0.95416808 0.95635128 0.95813297 0.96062738 0.96344083 0.96577764 0.96818134 0.97104025 0.97343195 0.97597444 0.97865413 0.97994672 0.98064126 0.98094979 0.98143338 0.98123856 0.98068083 0.98033995 0.98101894 0.98268503 0.98507875 0.98777658 0.9903608 0.99202087 0.9933069 0.99256744 0.99044883 0.98717314 0.98353656 0.9800432 0.97617287 0.97253451 0.96977033 0.96762556 0.9662626 0.96572411 0.96592079 0.96729798 0.96975438 0.97337748 0.97862858 0.98345358 0.98765317 0.9919238 0.99554959 0.99767411 0.99866451 0.99941783 0.99930984 0.99885298 0.99913515 0.99973164 0.99973592 1 0.9998438 0.9967639 0.99175576 0.9859206 0.97887302 0.97029262 0.96135891 0.95379752 0.94709017 0.94228614 0.93919512 0.93616637 0.92889205 0.9129921 0.88158383 0.82602164 0.74412949 0.64281662 0.53483955 0.42772166 0.32439525 0.23488131 0.16445229 0.11056237 0.07271886 0.04634859 0.02949618 0.01941871 0.0133487 0.00934594 0.00654231 0.00487921 0.00341903 0.00249864 0.00196431 0.00142754 0.00105878 0.00049978 0.00022833 0.00015999 3.415e-05 4.517e-05 1.313e-05 - - - - 20 - - 2078 - 2320 - 2202.4 - - - 1 - 0.00063835 0.00102286 0.00288712 0.00399879 0.00658916 0.00765458 0.00799918 0.00853524 0.00929493 0.00999614 0.01096645 0.01208363 0.01335837 0.01501119 0.01711931 0.01977307 0.02332743 0.02765779 0.03320435 0.04020464 0.04886709 0.0596238 0.07315348 0.09050885 0.11143964 0.13686671 0.16776886 0.20341457 0.24281992 0.28484195 0.32711894 0.36834301 0.40794043 0.4447145 0.47647207 0.50303896 0.52524762 0.54328057 0.55717994 0.5685619 0.57895708 0.58860881 0.59881758 0.60990899 0.62128986 0.63421311 0.64847648 0.66363778 0.67997936 0.69609688 0.71189957 0.7269499 0.74124079 0.75734734 0.77201504 0.78552587 0.79818641 0.80962939 0.81965718 0.82855741 0.83668178 0.84440292 0.85106862 0.85321701 0.85471321 0.8561428 0.85778963 0.8594989 0.86142876 0.86322831 0.86511218 0.8672932 0.86967076 0.87427502 0.87856212 0.88241466 0.88590611 0.8894516 0.89320419 0.8966738 0.89987484 0.90257636 0.90481219 0.90550545 0.90564491 0.90548208 0.90513822 0.90476379 0.90406427 0.90332978 0.90274309 0.90235795 0.90196488 0.90340528 0.90429478 0.90529761 0.90642862 0.90807348 0.91010493 0.91293181 0.91556686 0.91842631 0.92128288 0.92431702 0.92719913 0.92972159 0.93190455 0.93412538 0.93588954 0.93707083 0.93762594 0.93828534 0.93763643 0.94042634 0.94250397 0.94324531 0.94301861 0.94210283 0.94061808 0.93841726 0.93665003 0.93524569 0.93301102 0.92686708 0.92104485 0.91547175 0.91100989 0.90828339 0.9072733 0.90817907 0.91115631 0.91617845 0.92284525 0.92059829 0.91947472 0.91947973 0.92126575 0.92451632 0.92772589 0.93196884 0.93676408 0.94147739 0.94679545 0.95119533 0.95443018 0.95704142 0.95972628 0.9625372 0.96485326 0.96603599 0.96664138 0.96630455 0.96545713 0.96484036 0.96365512 0.96169531 0.95944859 0.95732078 0.95513625 0.95355574 0.95273072 0.95217795 0.95172542 0.9521403 0.95263595 0.95405248 0.95707559 0.96063594 0.96421772 0.96830187 0.97268597 0.97741944 0.98289489 0.9871429 0.99073348 0.99398244 0.99678431 0.99875181 1 0.9999284 0.9991523 0.99712951 0.99388228 0.98968273 0.98373274 0.97621057 0.96780985 0.95833495 0.94842856 0.93818752 0.9277078 0.91702104 0.90597951 0.89384371 0.88165575 0.86861704 0.85460324 0.84058628 0.82598123 0.80948042 0.79182917 0.7724052 0.74907137 0.72031195 0.68815487 0.65125598 0.6100244 0.56600904 0.52095058 0.47464344 0.42924778 0.38584718 0.34208462 0.30067509 0.26317221 0.22770037 0.19571781 0.16808736 0.14467686 0.12482737 0.10823403 0.09439655 0.08235799 0.07149445 0.0626855 0.05498009 0.04818852 0.04285814 0.03859244 0.03494044 0.03199172 0.02958044 0.02741084 0.02556884 0.02395058 0.02166741 0.0191457 0.01632139 0.0109837 0.00736032 0.00649061 0.00469736 0.00205874 - - - - 4.10137842 - 3.75605469 - 4.18741753 - 4.52205376 - 5.20680393 - 4.8729478 - 4.5356737 - 6.16247757 - 5.13772343 - 8.53898524 - 55.10485389 - 35.30373192 - 106.24732599 - - - SC_NODATA - 0 - - - SC_SATURATED_DEFECTIVE - 1 - - - SC_DARK_FEATURE_SHADOW - 2 - - - SC_CLOUD_SHADOW - 3 - - - SC_VEGETATION - 4 - - - SC_NOT_VEGETATED - 5 - - - SC_WATER - 6 - - - SC_UNCLASSIFIED - 7 - - - SC_CLOUD_MEDIUM_PROBA - 8 - - - SC_CLOUD_HIGH_PROBA - 9 - - - SC_THIN_CIRRUS - 10 - - - SC_SNOW_ICE - 11 - - - - - - - - - 40.64479480422486 115.81682739339685 40.65079881136531 117.1154430676197 39.66155122739065 117.11377991452629 39.655752572676114 115.83386830444628 40.64479480422486 115.81682739339685 - - - POINT - 1 - - - EPSG - GEOGRAPHIC - - - - - S2A_OPER_GIP_INVLOC_MPC__20171206T000000_V20150703T000000_21000101T000000_B00 - S2A_OPER_GIP_LREXTR_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_ATMIMA_MPC__20150605T094744_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_ATMSAD_MPC__20160729T000005_V20150703T000000_21000101T000000_B00 - S2A_OPER_GIP_BLINDP_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_CLOINV_MPC__20210609T000005_V20210823T030000_21000101T000000_B00 - S2A_OPER_GIP_CLOPAR_MPC__20220120T000001_V20220125T022000_21000101T000000_B00 - S2A_OPER_GIP_CONVER_MPC__20150710T131444_V20150627T000000_21000101T000000_B00 - S2A_OPER_GIP_DATATI_MPC__20151117T131048_V20150703T000000_21000101T000000_B00 - S2A_OPER_GIP_DECOMP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 - S2__OPER_GIP_EARMOD_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_ECMWFP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 - S2A_OPER_GIP_G2PARA_MPC__20231208T000027_V20231213T070000_21000101T000000_B00 - S2A_OPER_GIP_G2PARE_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_GEOPAR_MPC__20150605T094741_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_INTDET_MPC__20220120T000010_V20220125T022000_21000101T000000_B00 - S2A_OPER_GIP_JP2KPA_MPC__20220120T000006_V20220125T022000_21000101T000000_B00 - S2A_OPER_GIP_MASPAR_MPC__20220120T000009_V20220125T022000_21000101T000000_B00 - S2A_OPER_GIP_OLQCPA_MPC__20220715T000042_V20220830T002500_21000101T000000_B00 - S2A_OPER_GIP_PRDLOC_MPC__20180301T130000_V20180305T005000_21000101T000000_B00 - S2A_OPER_GIP_PROBAS_MPC__20240305T000510_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_R2ABCA_MPC__20240315T121000_V20240319T003000_21000101T000000_B00 - S2A_OPER_GIP_R2BINN_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_R2CRCO_MPC__20151023T224715_V20150622T224715_21000101T000000_B00 - S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 - S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 - S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 - S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 - S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 - S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 - S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 - S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 - S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 - S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 - S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 - S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A - S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B09 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B10 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B12 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B11 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 - S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A - S2A_OPER_GIP_R2DENT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 - S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 - S2A_OPER_GIP_R2DEPI_MPC__20230424T160000_V20230426T000000_21000101T000000_B00 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B12 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B03 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B07 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B09 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B10 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B01 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B05 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B8A - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B06 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B04 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B11 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B02 - S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B08 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B10 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B05 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B04 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B06 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B08 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B03 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B01 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B12 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B11 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B02 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B07 - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B8A - S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B09 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 - S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 - S2A_OPER_GIP_R2NOMO_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_R2PARA_MPC__20221206T000009_V20221206T073000_21000101T000000_B00 - S2A_OPER_GIP_R2SWIR_MPC__20180406T000021_V20180604T100000_21000101T000000_B00 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 - S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 - S2A_OPER_GIP_RESPAR_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_SPAMOD_MPC__20231122T110026_V20231123T010000_21000101T000000_B00 - S2A_OPER_GIP_TILPAR_MPC__20151209T095117_V20150622T000000_21000101T000000_B00 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B8A - S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B03 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B08 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131048_V20150703T000000_21000101T000000_B01 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B11 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B10 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B06 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B04 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B02 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B05 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131051_V20150703T000000_21000101T000000_B12 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B09 - S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B07 - S2__OPER_GIP_L2ACSC_MPC__20220121T000003_V20220125T022000_21000101T000000_B00 - S2__OPER_GIP_L2ACAC_MPC__20220121T000004_V20220125T022000_21000101T000000_B00 - S2__OPER_GIP_PROBA2_MPC__20231208T000510_V20231213T070000_21000101T000000_B00 - - - CopernicusDEM30 - S2__OPER_AUX_UT1UTC_PDMC_20240404T000000_V20240405T000000_20250404T000000 - - S2__OPER_AUX_ECMWFD_ADG__20240410T120000_V20240410T210000_20240412T150000 - - None - - GlobalSnowMap.tiff - ESACCI-LC-L4-WB-Map-150m-P13Y-2000-v4.0.tif - ESACCI-LC-L4-LCCS-Map-300m-P1Y-2015-v2.0.7.tif - ESACCI-LC-L4-Snow-Cond-500m-MONTHLY-2000-2012-v2.4 - - - 3.500058 - - 0.0 - 0 - - - - PASSED - PASSED - PASSED - PASSED - PASSED - PASSED - - - - - 3.354197 - 0.0 - 0.0 - 8.675177 - 0.268831 - 2.81222 - 83.179593 - 0.992827 - 0.571295 - 0.275278 - 0.038401 - 3.18638 - 0.0 - 0.0 - 0.0 - 0.0 - CAMS - 0.392921 - 1.224094 - AUX_ECMWFT - 357.927923 - - - -""" # noqa - -PROCESS_LEVELS = ["L1C", "oldL1C", "L2A"] -MTD_XMLS = [mtd_l1c_xml, mtd_l1c_old_xml, mtd_l2a_xml] -TILE_XMLS = [mtd_l1c_tile_xml, mtd_l1c_tile_xml, mtd_l1c_tile_xml] - -def xml_builder(process_level, mask_saturated=True, band_name=None): - """Build fake SAFE MTD/Tile XML.""" - from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML - filename_info = dict(observation_time=None, dtile_number=None, band_name=band_name, fmission_id="S2A", - process_level=process_level.replace("old", "")) - xml_fh = SAFEMSIMDXML(StringIO(MTD_XMLS[PROCESS_LEVELS.index(process_level)]), - filename_info, mock.MagicMock(), mask_saturated=mask_saturated) - xml_tile_fh = SAFEMSITileMDXML(BytesIO(TILE_XMLS[PROCESS_LEVELS.index(process_level)]), - filename_info, mock.MagicMock()) - return xml_fh, xml_tile_fh - -def jp2_builder(process_level, band_name, mask_saturated=True): - """Build fake SAFE jp2 image file.""" - from satpy.readers.msi_safe import SAFEMSIL1C - filename_info = dict(observation_time=None, dtile_number=None, band_name=band_name, fmission_id="S2A", - process_level=process_level.replace("old", "")) - xml_fh, tile_xml_fh = xml_builder(process_level, mask_saturated, band_name) - jp2_fh = SAFEMSIL1C("somefile", filename_info, mock.MagicMock(), xml_fh, tile_xml_fh) - return jp2_fh +class TestMTDXML: + """Test the SAFE MTD XML file handler.""" -class TestTileXML: - """Test the SAFE TILE XML file handler. + def setup_method(self): + """Set up the test case.""" + from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML + filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A") + self.xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_tile_xml), filename_info, mock.MagicMock()) + self.old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), filename_info, mock.MagicMock()) + self.xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=True) - Since L1C/L2A share almost the same Tile XML structure, we only use L1C Tile here. + def test_start_time(self): + """Ensure start time is read correctly from XML.""" + assert self.xml_tile_fh.start_time() == tilemd_dt - """ + def test_satellite_zenith_array(self): + """Test reading the satellite zenith array.""" + info = dict(xml_tag="Viewing_Incidence_Angles_Grids", xml_item="Zenith") - @pytest.mark.parametrize(("process_level","angle_name", "angle_tag", "expected"), - [ - ("L1C", "satellite_zenith_angle", ("Viewing_Incidence_Angles_Grids", "Zenith"), - [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, + expected_data = np.array([[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], @@ -1469,123 +905,82 @@ class TestTileXML: [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), - ("L2A", "solar_zenith_angle_l2a", ("Sun_Angles_Grid", "Zenith"), - [[39.8824, 39.83721367, 39.79230847, 39.74758442, 39.7030415, - 39.65867687, 39.61455566, 39.57061558, 39.52685664, 39.48331372], - [39.78150175, 39.73629896, 39.69128852, 39.64643679, 39.6018404, - 39.5574369, 39.51323286, 39.46920212, 39.4253673, 39.38179377], - [39.6806035, 39.63532838, 39.5902497, 39.54538507, 39.5007087, - 39.45621756, 39.41195347, 39.36779169, 39.3239121, 39.28027381], - [39.57980525, 39.53445664, 39.48931088, 39.44434154, 39.39957879, - 39.35503587, 39.31067408, 39.26649344, 39.22249393, 39.17876143], - [39.479007, 39.43355483, 39.38829092, 39.34328573, 39.29846167, - 39.25381983, 39.2093947, 39.16513007, 39.12109926, 39.07726878], - [39.37820875, 39.33268069, 39.28735495, 39.24224914, 39.19736058, - 39.15267709, 39.1081719, 39.06385068, 39.01973446, 38.97584982], - [39.2774105, 39.23184303, 39.18646737, 39.14130809, 39.09632176, - 39.05153988, 39.00696049, 38.9625713, 38.91842056, 38.87444401], - [39.17671225, 39.13104478, 39.08559031, 39.04034757, 38.99528294, - 38.95039991, 38.9057971, 38.86130793, 38.81705183, 38.77303821], - [39.076014, 39.03026112, 38.98477906, 38.93940875, 38.89425338, - 38.84936063, 38.80464763, 38.76011645, 38.7157479, 38.67164839], - [38.97531575, 38.92950771, 38.88389967, 38.83852091, 38.7933053, - 38.74831897, 38.7034912, 38.65891427, 38.61446851, 38.57030388]]), - ("L1C", "moon_zenith_angle", ("Sun_Angles_Grid", "Zenith"), None) - ]) - def test_angles(self, process_level, angle_name, angle_tag, expected): - """Test reading angles array.""" - info = dict(xml_tag=angle_tag[0], xml_item=angle_tag[1]) if "satellite" in angle_name else \ - dict(xml_tag=angle_tag[0] + "/" + angle_tag[1]) - xml_tile_fh = xml_builder(process_level)[1] - - res = xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) - if res is not None: - res = res[::200, ::200] - - if res is not None: - np.testing.assert_allclose(res, expected) - else: - assert res is expected - - def test_navigation(self): + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]) + res = self.xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle", + resolution=60), + info)[::200, ::200] + np.testing.assert_allclose(res, expected_data) + + def test_old_xml_calibration(self): + """Test the calibration of older data formats (no offset).""" + fake_data = xr.DataArray([[[0, 1, 2, 3], + [4, 1000, 65534, 65535]]], + dims=["band", "x", "y"]) + result = self.old_xml_fh.calibrate_to_reflectances(fake_data, "B01") + np.testing.assert_allclose(result, [[[np.nan, 0.01, 0.02, 0.03], + [0.04, 10, 655.34, np.inf]]]) + + def test_xml_calibration(self): + """Test the calibration with radiometric offset.""" + fake_data = xr.DataArray([[[0, 1, 2, 3], + [4, 1000, 65534, 65535]]], + dims=["band", "x", "y"]) + result = self.xml_fh.calibrate_to_reflectances(fake_data, "B01") + np.testing.assert_allclose(result, [[[np.nan, 0.01 - 10, 0.02 - 10, 0.03 - 10], + [0.04 - 10, 0, 655.34 - 10, np.inf]]]) + + def test_xml_calibration_to_counts(self): + """Test the calibration to counts.""" + fake_data = xr.DataArray([[[0, 1, 2, 3], + [4, 1000, 65534, 65535]]], + dims=["band", "x", "y"]) + result = self.xml_fh._sanitize_data(fake_data) + np.testing.assert_allclose(result, [[[np.nan, 1, 2, 3], + [4, 1000, 65534, np.inf]]]) + + def test_xml_calibration_unmasked_saturated(self): + """Test the calibration with radiometric offset but unmasked saturated pixels.""" + from satpy.readers.msi_safe import SAFEMSIMDXML + filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A") + self.xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=False) + + fake_data = xr.DataArray([[[0, 1, 2, 3], + [4, 1000, 65534, 65535]]], + dims=["band", "x", "y"]) + result = self.xml_fh.calibrate_to_reflectances(fake_data, "B01") + np.testing.assert_allclose(result, [[[np.nan, 0.01 - 10, 0.02 - 10, 0.03 - 10], + [0.04 - 10, 0, 655.34 - 10, 655.35 - 10]]]) + + def test_xml_calibration_with_different_offset(self): + """Test the calibration with a different offset.""" + fake_data = xr.DataArray([[[0, 1, 2, 3], + [4, 1000, 65534, 65535]]], + dims=["band", "x", "y"]) + result = self.xml_fh.calibrate_to_reflectances(fake_data, "B10") + np.testing.assert_allclose(result, [[[np.nan, 0.01 - 20, 0.02 - 20, 0.03 - 20], + [0.04 - 20, -10, 655.34 - 20, np.inf]]]) + + def test_xml_calibration_to_radiance(self): + """Test the calibration with a different offset.""" + fake_data = xr.DataArray([[[0, 1, 2, 3], + [4, 1000, 65534, 65535]]], + dims=["band", "x", "y"]) + result = self.xml_fh.calibrate_to_radiances(fake_data, "B01") + expected = np.array([[[np.nan, -251.584265, -251.332429, -251.080593], + [-250.828757, 0., 16251.99095, np.inf]]]) + np.testing.assert_allclose(result, expected) + + def test_xml_navigation(self): """Test the navigation.""" from pyproj import CRS crs = CRS("EPSG:32616") dsid = make_dataid(name="B01", resolution=60) - xml_tile_fh = xml_builder("L1C")[1] - result = xml_tile_fh.get_area_def(dsid) - area_extent = (499980.0, 3590220.0, 609780.0, 3700020.0) - assert result.crs == crs - np.testing.assert_allclose(result.area_extent, area_extent) - + result = self.xml_tile_fh.get_area_def(dsid) -class TestMTDXML: - """Test the SAFE MTD XML file handler.""" - - def setup_method(self): - """Set up the test case.""" - self.fake_data = xr.DataArray([[[0, 1, 2, 3], [4, 1000, 65534, 65535]]], dims=["band", "x", "y"]) - - @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), - [ - ("L1C", True, "B01", ([[[np.nan, -9.99, -9.98, -9.97], - [-9.96, 0, 645.34, np.inf]]], - [[[np.nan, -251.584265, -251.332429, -251.080593], - [-250.828757, 0., 16251.99095, np.inf]]], - [[[np.nan, 1, 2, 3], - [4, 1000, 65534, np.inf]]])), - ("L1C", False, "B10", ([[[np.nan, -19.99, -19.98, -19.97], - [-19.96, -10, 635.34, 635.35]]], - [[[np.nan, -35.465976, -35.448234, -35.430493], - [-35.412751, -17.741859, 1127.211275, 1127.229017]]], - [[[np.nan, 1, 2, 3], - [4, 1000, 65534, 65535]]])), - ("oldL1C", True, "B01", ([[[np.nan, 0.01, 0.02, 0.03], - [0.04, 10, 655.34, np.inf]]], - [[[np.nan, 0.251836101, 0.503672202, 0.755508303], - [1.00734440, 251.836101, 16503.8271, np.inf]]], - [[[np.nan, 1, 2, 3], - [4, 1000, 65534, np.inf]]])), - ("L2A", False, "B03", ([[[np.nan, -9.99, -9.98, -9.97], - [-9.96, 0, 645.34, 645.35]]], - [[[np.nan, -238.571863, -238.333052, -238.094241], - [-237.855431, 0, 15411.407995, 15411.646806]]], - [[[np.nan, 1, 2, 3], - [4, 1000, 65534, 65535]]])), - ]) - def test_xml_calibration(self, process_level, mask_saturated, band_name, expected): - """Test the calibration to reflectance/radiance/counts.""" - xml_fh = xml_builder(process_level, mask_saturated)[0] - - res1 = xml_fh.calibrate_to_reflectances(self.fake_data, band_name) - res2 = xml_fh.calibrate_to_radiances(self.fake_data, band_name) - res3 = xml_fh._sanitize_data(self.fake_data) - - results = (res1, res2, res3) - np.testing.assert_allclose(results, expected) - - @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), - [ - ("L1C", True, "B01", None), - ("L2A", False, "AOT", [[[np.nan, 0.001, 0.002, 0.003], - [0.004, 1., 65.534, 65.535]]]), - ("L2A", True, "WVP", [[[np.nan, 0.001, 0.002, 0.003], - [0.004, 1., 65.534, np.inf]]]), - ("L2A", False, "CLOUD", None), - ("L2A", False, "B10", None), - ]) - def test_xml_calibration_to_atmospheric(self, process_level, mask_saturated, band_name, expected): - """Test the calibration to L2A atmospheric products.""" - xml_fh = xml_builder(process_level, mask_saturated)[0] - - result =xml_fh.calibrate_to_atmospheric(self.fake_data, band_name) - - if result is not None: - np.testing.assert_allclose(result, expected) - else: - assert result is expected + area_extents = (499980.0, 3590220.0, 609780.0, 3700020.0) + assert result.crs == crs + np.testing.assert_allclose(result.area_extent, area_extents) class TestSAFEMSIL1C: @@ -1593,41 +988,36 @@ class TestSAFEMSIL1C: def setup_method(self): """Set up the test.""" + from satpy.readers.msi_safe import SAFEMSITileMDXML + self.filename_info = dict(observation_time=fname_dt, fmission_id="S2A", band_name="B01", dtile_number=None) self.fake_data = xr.Dataset({"band_data": xr.DataArray([[[0, 1], [65534, 65535]]], dims=["band", "x", "y"])}) - - - @pytest.mark.parametrize(("mask_saturated", "dataset_name", "calibration", "expected"), - [ - (False, "B01_L2A", "reflectance", [[np.nan, -9.99], [645.34, 645.35]]), - (True, "B02_L2A", "radiance", [[np.nan, -265.970568], [17181.325973, np.inf]]), - (True, "B03_L2A", "counts", [[np.nan, 1], [65534, np.inf]]), - (False, "AOT_L2A", "aerosol_thickness", [[np.nan, 0.001], [65.534, 65.535]]), - (True, "WVP_L2A", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), - (True, "SNOW_L2A", "water_vapor", None), - ]) - def test_calibration_and_masking(self, mask_saturated, dataset_name, calibration, expected): + self.tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_tile_xml), + self.filename_info, mock.MagicMock()) + self.tile_mda.start_time.return_value = tilemd_dt + + @pytest.mark.parametrize(("mask_saturated", "calibration", "expected"), + [(True, "reflectance", [[np.nan, 0.01 - 10], [645.34, np.inf]]), + (False, "reflectance", [[np.nan, 0.01 - 10], [645.34, 645.35]]), + (True, "radiance", [[np.nan, -251.58426503], [16251.99095011, np.inf]]), + (False, "counts", [[np.nan, 1], [65534, 65535]])]) + def test_calibration_and_masking(self, mask_saturated, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" - jp2_fh = jp2_builder("L2A", dataset_name.replace("_L2A", ""), mask_saturated) + from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML + + mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.filename_info, mock.MagicMock(), + mask_saturated=mask_saturated) + self.jp2_fh = SAFEMSIL1C("somefile", self.filename_info, mock.MagicMock(), mda, self.tile_mda) with mock.patch("xarray.open_dataset", return_value=self.fake_data): - res = jp2_fh.get_dataset(make_dataid(name=dataset_name, calibration=calibration), info=dict()) - if res is not None: - np.testing.assert_allclose(res, expected) - else: - assert res is expected + res = self.jp2_fh.get_dataset(make_dataid(name="B01", calibration=calibration), info=dict()) + np.testing.assert_allclose(res, expected) - @pytest.mark.parametrize(("process_level", "band_name", "dataset_name"), - [ - ("L1C", "B01", "B03"), - ("L2A", "B02", "B03_L2A"), - ]) - def test_filename_dsname_mismatch(self, process_level, band_name, dataset_name): - """Test when dataset name and file band name mismatch, the data and its area definition should both be None.""" - jp2_fh = jp2_builder(process_level, band_name) - with mock.patch("xarray.open_dataset", return_value=self.fake_data): - res1 = jp2_fh.get_dataset(make_dataid(name=dataset_name), info=dict()) - res2 = jp2_fh.get_area_def(make_dataid(name=dataset_name)) + def test_start_time(self): + """Test that the correct start time is returned.""" + from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML - assert res1 is None - assert res2 is None + mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.filename_info, mock.MagicMock()) + self.jp2_fh = SAFEMSIL1C("somefile", self.filename_info, mock.MagicMock(), + mda, self.tile_mda) + assert tilemd_dt == self.jp2_fh.start_time From a026d8287968f637f57257e3e7c168359340a62c Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 15 May 2024 15:04:38 +0800 Subject: [PATCH 444/481] re-add --- satpy/etc/readers/msi_safe.yaml | 57 +- satpy/readers/msi_safe.py | 56 +- satpy/tests/reader_tests/test_msi_safe.py | 889 ++++++++++++++++++---- 3 files changed, 831 insertions(+), 171 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index 20b324a036..cc39c26a74 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -1,8 +1,8 @@ reader: name: msi_safe - short_name: MSI SAFE - long_name: Sentinel-2 A and B MSI data in SAFE format, supporting L1C format only. - description: SAFE Reader for MSI data (Sentinel-2) + short_name: MSI SAFE L1C + long_name: Sentinel-2 A and B MSI L1C data in SAFE format + description: SAFE Reader for MSI L1C data (Sentinel-2) status: Nominal supports_fsspec: false sensors: [msi] @@ -10,20 +10,18 @@ reader: reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader file_types: - safe_granule_l1c: + l1c_safe_granule: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C - file_patterns: ['{fmission_id:3s}_MSI{proclevel:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] - requires: [safe_metadata, safe_tile_metadata] - safe_tile_metadata: + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] + requires: [l1c_safe_metadata, l1c_safe_tile_metadata] + l1c_safe_tile_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML - file_patterns: ['{fmission_id:3s}_MSI{proclevel:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] - safe_metadata: + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + l1c_safe_metadata: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML - file_patterns: ['{fmission_id:3s}_MSI{proclevel:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] - + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] datasets: - B01: name: B01 sensor: msi @@ -39,7 +37,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B02: name: B02 @@ -56,7 +54,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B03: name: B03 @@ -73,7 +71,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B04: name: B04 @@ -90,7 +88,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B05: name: B05 @@ -107,7 +105,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B06: name: B06 @@ -124,7 +122,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B07: name: B07 @@ -141,7 +139,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B08: name: B08 @@ -158,7 +156,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B8A: name: B8A @@ -175,7 +173,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B09: name: B09 @@ -192,7 +190,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B10: name: B10 @@ -209,7 +207,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B11: name: B11 @@ -226,7 +224,7 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c + file_type: l1c_safe_granule B12: name: B12 @@ -243,31 +241,30 @@ datasets: counts: standard_name: counts units: "1" - file_type: safe_granule_l1c - + file_type: l1c_safe_granule solar_zenith_angle: name: solar_zenith_angle resolution: [10, 20, 60] - file_type: safe_tile_metadata + file_type: l1c_safe_tile_metadata xml_tag: Sun_Angles_Grid/Zenith solar_azimuth_angle: name: solar_azimuth_angle resolution: [10, 20, 60] - file_type: safe_tile_metadata + file_type: l1c_safe_tile_metadata xml_tag: Sun_Angles_Grid/Azimuth satellite_azimuth_angle: name: satellite_azimuth_angle resolution: [10, 20, 60] - file_type: safe_tile_metadata + file_type: l1c_safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids xml_item: Azimuth satellite_zenith_angle: name: satellite_zenith_angle resolution: [10, 20, 60] - file_type: safe_tile_metadata + file_type: l1c_safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids xml_item: Zenith diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index 5ec5ff3ea0..d36350f7ab 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -28,9 +28,12 @@ reader_kwargs={'mask_saturated': False}) scene.load(['B01']) -L1C format description for the files read here: +L1C/L2A format description for the files read here: - https://sentinels.copernicus.eu/documents/247904/0/Sentinel-2-product-specifications-document-V14-9.pdf/ + https://sentinels.copernicus.eu/documents/247904/685211/S2-PDGS-TAS-DI-PSD-V14.9.pdf/3d3b6c9c-4334-dcc4-3aa7-f7c0deffbaf7?t=1643013091529 + +Please note: for L2A datasets, the band name has been fixed with a "_L2A" suffix. Do not change it in the YAML file or +the reader can't recogonize it and nothing will be loaded. """ @@ -65,20 +68,27 @@ def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_s filetype_info) del mask_saturated self._channel = filename_info["band_name"] + self.process_level = filename_info["process_level"] self._tile_mda = tile_mda self._mda = mda self.platform_name = PLATFORMS[filename_info["fmission_id"]] - self._start_time = self._tile_mda.start_time() self._end_time = filename_info["observation_time"] def get_dataset(self, key, info): """Load a dataset.""" - if self._channel != key["name"]: - return + if self.process_level == "L1C": + if self._channel != key["name"]: + return + else: + if self._channel + "_L2A" != key["name"]: + return logger.debug("Reading %s.", key["name"]) + proj = self._read_from_file(key) + if proj is None: + return proj.attrs = info.copy() proj.attrs["units"] = "%" proj.attrs["platform_name"] = self.platform_name @@ -93,6 +103,8 @@ def _read_from_file(self, key): return self._mda.calibrate_to_radiances(proj, self._channel) if key["calibration"] == "counts": return self._mda._sanitize_data(proj) + if key["calibration"] in ["aerosol_thickness", "water_vapor"]: + return self._mda.calibrate_to_atmospheric(proj, self._channel) @property def start_time(self): @@ -106,8 +118,13 @@ def end_time(self): def get_area_def(self, dsid): """Get the area def.""" - if self._channel != dsid["name"]: - return + if self.process_level == "L1C": + if self._channel != dsid["name"]: + return + else: + if self._channel + "_L2A" != dsid["name"]: + return + return self._tile_mda.get_area_def(dsid) @@ -121,6 +138,7 @@ def __init__(self, filename, filename_info, filetype_info, mask_saturated=True): self._end_time = filename_info["observation_time"] self.root = ET.parse(self.filename) self.tile = filename_info["dtile_number"] + self.process_level = filename_info["process_level"] self.platform_name = PLATFORMS[filename_info["fmission_id"]] self.mask_saturated = mask_saturated import bottleneck # noqa @@ -142,10 +160,23 @@ class SAFEMSIMDXML(SAFEMSIXMLMetadata): def calibrate_to_reflectances(self, data, band_name): """Calibrate *data* using the radiometric information for the metadata.""" - quantification = int(self.root.find(".//QUANTIFICATION_VALUE").text) + quantification = int(self.root.find(".//QUANTIFICATION_VALUE").text) if self.process_level == "L1C" else \ + int(self.root.find(".//BOA_QUANTIFICATION_VALUE").text) data = self._sanitize_data(data) return (data + self.band_offset(band_name)) / quantification * 100 + def calibrate_to_atmospheric(self, data, band_name): + """Calibrate L2A AOT/WVP product.""" + atmospheric_bands = ["AOT", "WVP"] + if self.process_level == "L1C": + return + elif self.process_level == "L2A" and band_name not in atmospheric_bands: + return + + quantification = float(self.root.find(f".//{band_name}_QUANTIFICATION_VALUE").text) + data = self._sanitize_data(data) + return data / quantification + def _sanitize_data(self, data): data = data.where(data != self.no_data) if self.mask_saturated: @@ -174,7 +205,8 @@ def band_indices(self): @cached_property def band_offsets(self): """Get the band offsets from the metadata.""" - offsets = self.root.find(".//Radiometric_Offset_List") + offsets = self.root.find(".//Radiometric_Offset_List") if self.process_level == "L1C" else \ + self.root.find(".//BOA_ADD_OFFSET_VALUES_LIST") if offsets is not None: band_offsets = {int(off.attrib["band_id"]): float(off.text) for off in offsets} else: @@ -302,9 +334,11 @@ def interpolate_angles(self, angles, resolution): def _get_coarse_dataset(self, key, info): """Get the coarse dataset refered to by `key` from the XML data.""" angles = self.root.find(".//Tile_Angles") - if key["name"] in ["solar_zenith_angle", "solar_azimuth_angle"]: + if key["name"] in ["solar_zenith_angle", "solar_azimuth_angle", + "solar_zenith_angle_l2a", "solar_azimuth_angle_l2a"]: angles = self._get_solar_angles(angles, info) - elif key["name"] in ["satellite_zenith_angle", "satellite_azimuth_angle"]: + elif key["name"] in ["satellite_zenith_angle", "satellite_azimuth_angle", + "satellite_zenith_angle_l2a", "satellite_azimuth_angle_l2a"]: angles = self._get_satellite_angles(angles, info) else: angles = None diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index b919278bf5..d2de3e1a54 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -30,7 +30,7 @@ fname_dt = datetime(2020, 10, 1, 18, 35, 41) tilemd_dt = datetime(2020, 10, 1, 16, 34, 23, 153611) -mtd_tile_xml = b""" +mtd_l1c_tile_xml = b""" @@ -580,7 +580,6 @@ """ # noqa - mtd_l1c_old_xml = """ @@ -866,121 +865,742 @@ """ # noqa +mtd_l2a_xml = """ + + + + 2024-04-11T03:05:21.024Z + 2024-04-11T03:05:21.024Z + S2A_MSIL2A_20240411T030521_N0510_R075_T50TMK_20240411T080950.SAFE + Level-2A + S2MSI2A + 05.10 + https://doi.org/10.5270/S2_-znk9xsj + 2024-04-11T08:09:50.000000Z + Not applicable + Not applicable + + Sentinel-2A + INS-NOBS + 2024-04-11T03:05:21.024Z + 75 + DESCENDING + + +SAFE_COMPACT + + + + + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B02_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B03_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B04_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_B08_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_TCI_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_AOT_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R10m/T50TMK_20240411T030521_WVP_10m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B01_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B02_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B03_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B04_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B05_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B06_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B07_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B8A_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B11_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_B12_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_TCI_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_AOT_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_WVP_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R20m/T50TMK_20240411T030521_SCL_20m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B01_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B02_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B03_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B04_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B05_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B06_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B07_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B8A_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B09_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B11_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_B12_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_TCI_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_AOT_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_WVP_60m + GRANULE/L2A_T50TMK_A045975_20240411T030632/IMG_DATA/R60m/T50TMK_20240411T030521_SCL_60m + + + + + + + NODATA + 0 + + + SATURATED + 65535 + + + 3 + 2 + 1 + + + 10000 + 1000.0 + 1000.0 + + + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + -1000 + + + 0.998279632507911 + + 1884.69 + 1959.66 + 1823.24 + 1512.06 + 1424.64 + 1287.61 + 1162.08 + 1041.63 + 955.32 + 812.92 + 367.15 + 245.59 + 85.25 + + + + + 60 + + 412 + 456 + 442.7 + + + 1 + 0.001775742 0.004073061 0.003626143 0.003515199 0.005729163 0.003780292 0.002636732 0.001262113 0.001987583 0.001368913 0.001250444 0.000463454 0.000814293 0.001376431 0.001485086 0.001823735 0.001626817 0.004392062 0.029008099 0.11874593 0.32387506 0.57281921 0.71472749 0.76196778 0.78929702 0.80862387 0.81089382 0.82419876 0.85415811 0.87079088 0.88731097 0.92619924 0.98228149 1 0.9752382 0.93596338 0.88997148 0.85021048 0.82569453 0.78390239 0.61417422 0.33007109 0.12410831 0.04365694 0.014749595 + + + + 10 + + 456 + 533 + 492.7 + + + 1 + 0.04255531 0.0722983 0.15374322 0.32799225 0.55336788 0.71011166 0.75285179 0.75232691 0.75668081 0.76326948 0.76239425 0.7852515 0.81546669 0.86179176 0.89282599 0.9195221 0.91900649 0.91315754 0.90035366 0.88989693 0.8823246 0.87606118 0.88429987 0.90695544 0.93232085 0.93947252 0.94383543 0.92204086 0.8860231 0.84743609 0.81251687 0.7823971 0.7731087 0.77209054 0.78742652 0.81217177 0.84605052 0.88767996 0.92793997 0.95069235 0.96573311 0.96938253 0.96570294 0.95832003 0.95405064 0.95178268 0.95699722 0.96556515 0.9770514 0.97709574 0.97436606 0.95903183 0.93506318 0.90190134 0.87165792 0.84402444 0.82280852 0.81536043 0.82057639 0.8395149 0.86992171 0.91526205 0.96067028 0.99163699 1 0.98356097 0.91130763 0.74018256 0.50395858 0.3050155 0.18004605 0.10738342 0.06593592 0.04207746 0.02662129 0.0143396 0.00265779 0.00081822 + + + + 10 + + 538 + 583 + 559.8 + + + 1 + 0.01448181 0.03422251 0.07346335 0.15444843 0.31661425 0.55322279 0.74859406 0.84890306 0.89772216 0.9215368 0.92572845 0.91122688 0.88818924 0.86523756 0.84718187 0.8387572 0.84459081 0.86219653 0.88838714 0.92443236 0.96017974 0.98685516 1 0.9986008 0.98076472 0.94522089 0.8981778 0.85580323 0.81841734 0.78862048 0.76460653 0.74963745 0.75055111 0.76137888 0.78244479 0.79890086 0.81016957 0.81408886 0.77358596 0.62881065 0.40397555 0.21542098 0.10715281 0.04792877 0.01848693 0.00108588 + + + + 10 + + 646 + 684 + 664.6 + + + 1 + 0.00141521 0.02590238 0.11651178 0.39088616 0.74959342 0.94485805 0.98011173 0.99406309 1 0.99545475 0.99052772 0.97733476 0.94055988 0.87894956 0.81629384 0.77345952 0.75448766 0.75991531 0.7826343 0.8101689 0.83612975 0.86125424 0.88609106 0.91138767 0.93405146 0.95042063 0.9592573 0.96039555 0.95913395 0.95809013 0.95527459 0.94376465 0.89490799 0.74426308 0.476777 0.22960399 0.08009118 0.02617076 0.00415242 + + + + 20 + + 695 + 714 + 704.1 + + + 1 + 0.02835786 0.12369337 0.39378774 0.76113071 0.97108502 0.99889523 1 0.99412258 0.98321789 0.96704093 0.94847389 0.92714833 0.90372458 0.88614713 0.86723745 0.79075319 0.58840332 0.26334833 0.05675422 0.00618833 + + + + 20 + + 731 + 749 + 740.5 + + + 1 + 0.00171088 0.05467153 0.25806676 0.64722098 0.89218999 0.90232877 0.91508768 0.94115846 0.96299993 0.97510481 0.9770217 0.98736251 1 0.98880277 0.97179916 0.90126739 0.60672391 0.20520227 0.0267569 + + + + 20 + + 769 + 797 + 782.8 + + + 1 + 0.00045899 0.0117201 0.05219715 0.16561733 0.36903355 0.63685453 0.86119638 0.97002897 0.99119602 0.99897921 1 0.97725155 0.92572385 0.86605804 0.81969611 0.79407674 0.79111029 0.80431552 0.81902721 0.82571292 0.82011829 0.79222195 0.72054559 0.58767794 0.41430355 0.23088817 0.09850282 0.02736551 0.00516235 + + + + 10 + + 760 + 907 + 832.8 + + + 1 + 0.00067259 0.00388856 0 0 0 0 0 0 0 0 0 0 0 0.00028956 0.00702964 0.01752391 0.03231111 0.05328661 0.08299885 0.12748502 0.19591065 0.30246323 0.43553954 0.57141637 0.69766701 0.80303852 0.89115744 0.95284584 0.98894161 1 0.98840653 0.96389216 0.94207967 0.93694643 0.94227343 0.95395718 0.96828896 0.97966549 0.9854444 0.98592681 0.98391181 0.97793903 0.97722771 0.97810609 0.98144486 0.98764558 0.98857708 0.9862422 0.98070921 0.97078624 0.95721089 0.93865821 0.91672388 0.89620759 0.872888 0.85160331 0.8246394 0.80078117 0.7823386 0.76360274 0.74962771 0.7387221 0.73079407 0.72271237 0.72507708 0.72563856 0.72304217 0.72229211 0.71616364 0.71159446 0.70826954 0.70157205 0.69924532 0.70093762 0.70692733 0.71824001 0.73124634 0.7484061 0.76818541 0.78394807 0.7968381 0.80260206 0.8045194 0.80240918 0.79699072 0.78920304 0.77691621 0.76518406 0.75119717 0.73700357 0.72262399 0.70412578 0.68410805 0.66474528 0.64736891 0.63005125 0.61564222 0.60249557 0.58988992 0.57993399 0.57136506 0.56094242 0.55235105 0.54568236 0.53958052 0.53510215 0.53093675 0.53016508 0.52984662 0.53036682 0.53211463 0.53271918 0.53246806 0.53331158 0.5319278 0.53051055 0.52951499 0.52996848 0.53253373 0.53705085 0.54235344 0.54912497 0.55523055 0.56011135 0.55767999 0.54821984 0.53144613 0.50763528 0.47811224 0.45092793 0.42798466 0.41051405 0.40039139 0.40087302 0.40829375 0.42086556 0.43007022 0.42456692 0.39136817 0.33009008 0.25720509 0.18189031 0.11650668 0.07031579 0.04275381 0.02593154 0.01574394 0.00394326 + + + + 20 + + 837 + 881 + 864.7 + + + 1 + 0.00030097 0 0 0 0 0 0 0 0 0 0.00157217 0.00249886 0.01332037 0.02614866 0.05260479 0.10779709 0.22160755 0.39721628 0.60986885 0.81658883 0.9322445 0.97210033 0.97545482 0.97538048 0.97328205 0.97607828 0.98034955 0.98690928 0.99087465 0.99741818 0.99984673 0.99939141 0.99587928 0.99541228 1 0.99640762 0.92359433 0.74137684 0.48965971 0.25020643 0.11221246 0.04755984 0.02297815 0.01061438 0.00108149 + + + + 60 + + 932 + 958 + 945.1 + + + 1 + 0.01662953 0.06111857 0.17407094 0.38946454 0.6645915 0.87454114 0.93695988 0.96751014 0.9893391 0.9951269 1 0.97845762 0.98069118 0.9922335 0.98798379 0.99428313 0.98348041 0.97820013 0.95023367 0.95299604 0.92240308 0.85573828 0.70970227 0.46429542 0.21538427 0.06534121 0.01625596 + + + + 60 + + 1337 + 1412 + 1373.5 + + + 1 + 0.00024052 5.404e-05 3.052e-05 2.872e-05 7.632e-05 0.00010949 8.804e-05 0.00012356 0.00017424 0.0003317 0.00036891 0.0004467 0.00065919 0.0010913 0.00196903 0.00373668 0.00801754 0.01884719 0.04466732 0.10165546 0.20111776 0.34284841 0.50710992 0.6632068 0.78377143 0.86153862 0.91000261 0.94193255 0.96182259 0.97365119 0.98169786 0.98795826 0.99283342 0.99649788 0.99906011 1 0.99907734 0.99601604 0.9909083 0.98479854 0.97802142 0.97030114 0.96080954 0.94849765 0.93314108 0.91482336 0.8937997 0.86825426 0.83023193 0.76384193 0.65440009 0.50671604 0.35014737 0.21799972 0.12643091 0.06768988 0.0322709 0.013544 0.00544557 0.00237642 0.00111267 0.00053796 0.0003457 0.00017488 0.00021619 0.00019479 0.00010421 5.919e-05 5.109e-05 6.115e-05 5.527e-05 3.856e-05 3.147e-05 0.00012289 0.0001089 2.502e-05 + + + + 20 + + 1539 + 1682 + 1613.7 + + + 1 + 6.79e-06 6.66e-06 8e-06 2.734e-05 3.685e-05 8.851e-05 0.00014522 0.00024812 0.00047627 0.00056335 0.00065326 0.00089835 0.00114664 0.00165604 0.00241611 0.00350246 0.00524274 0.0081538 0.01237062 0.0186097 0.02721853 0.03879155 0.05379167 0.07353187 0.09932758 0.1334178 0.18029249 0.24484994 0.32834511 0.42749961 0.53576798 0.64570396 0.74245998 0.81447017 0.85866596 0.87924777 0.88665266 0.888727 0.89105732 0.89725046 0.90632982 0.91627527 0.9263751 0.93515828 0.94226446 0.94739906 0.95131987 0.95416808 0.95635128 0.95813297 0.96062738 0.96344083 0.96577764 0.96818134 0.97104025 0.97343195 0.97597444 0.97865413 0.97994672 0.98064126 0.98094979 0.98143338 0.98123856 0.98068083 0.98033995 0.98101894 0.98268503 0.98507875 0.98777658 0.9903608 0.99202087 0.9933069 0.99256744 0.99044883 0.98717314 0.98353656 0.9800432 0.97617287 0.97253451 0.96977033 0.96762556 0.9662626 0.96572411 0.96592079 0.96729798 0.96975438 0.97337748 0.97862858 0.98345358 0.98765317 0.9919238 0.99554959 0.99767411 0.99866451 0.99941783 0.99930984 0.99885298 0.99913515 0.99973164 0.99973592 1 0.9998438 0.9967639 0.99175576 0.9859206 0.97887302 0.97029262 0.96135891 0.95379752 0.94709017 0.94228614 0.93919512 0.93616637 0.92889205 0.9129921 0.88158383 0.82602164 0.74412949 0.64281662 0.53483955 0.42772166 0.32439525 0.23488131 0.16445229 0.11056237 0.07271886 0.04634859 0.02949618 0.01941871 0.0133487 0.00934594 0.00654231 0.00487921 0.00341903 0.00249864 0.00196431 0.00142754 0.00105878 0.00049978 0.00022833 0.00015999 3.415e-05 4.517e-05 1.313e-05 + + + + 20 + + 2078 + 2320 + 2202.4 + + + 1 + 0.00063835 0.00102286 0.00288712 0.00399879 0.00658916 0.00765458 0.00799918 0.00853524 0.00929493 0.00999614 0.01096645 0.01208363 0.01335837 0.01501119 0.01711931 0.01977307 0.02332743 0.02765779 0.03320435 0.04020464 0.04886709 0.0596238 0.07315348 0.09050885 0.11143964 0.13686671 0.16776886 0.20341457 0.24281992 0.28484195 0.32711894 0.36834301 0.40794043 0.4447145 0.47647207 0.50303896 0.52524762 0.54328057 0.55717994 0.5685619 0.57895708 0.58860881 0.59881758 0.60990899 0.62128986 0.63421311 0.64847648 0.66363778 0.67997936 0.69609688 0.71189957 0.7269499 0.74124079 0.75734734 0.77201504 0.78552587 0.79818641 0.80962939 0.81965718 0.82855741 0.83668178 0.84440292 0.85106862 0.85321701 0.85471321 0.8561428 0.85778963 0.8594989 0.86142876 0.86322831 0.86511218 0.8672932 0.86967076 0.87427502 0.87856212 0.88241466 0.88590611 0.8894516 0.89320419 0.8966738 0.89987484 0.90257636 0.90481219 0.90550545 0.90564491 0.90548208 0.90513822 0.90476379 0.90406427 0.90332978 0.90274309 0.90235795 0.90196488 0.90340528 0.90429478 0.90529761 0.90642862 0.90807348 0.91010493 0.91293181 0.91556686 0.91842631 0.92128288 0.92431702 0.92719913 0.92972159 0.93190455 0.93412538 0.93588954 0.93707083 0.93762594 0.93828534 0.93763643 0.94042634 0.94250397 0.94324531 0.94301861 0.94210283 0.94061808 0.93841726 0.93665003 0.93524569 0.93301102 0.92686708 0.92104485 0.91547175 0.91100989 0.90828339 0.9072733 0.90817907 0.91115631 0.91617845 0.92284525 0.92059829 0.91947472 0.91947973 0.92126575 0.92451632 0.92772589 0.93196884 0.93676408 0.94147739 0.94679545 0.95119533 0.95443018 0.95704142 0.95972628 0.9625372 0.96485326 0.96603599 0.96664138 0.96630455 0.96545713 0.96484036 0.96365512 0.96169531 0.95944859 0.95732078 0.95513625 0.95355574 0.95273072 0.95217795 0.95172542 0.9521403 0.95263595 0.95405248 0.95707559 0.96063594 0.96421772 0.96830187 0.97268597 0.97741944 0.98289489 0.9871429 0.99073348 0.99398244 0.99678431 0.99875181 1 0.9999284 0.9991523 0.99712951 0.99388228 0.98968273 0.98373274 0.97621057 0.96780985 0.95833495 0.94842856 0.93818752 0.9277078 0.91702104 0.90597951 0.89384371 0.88165575 0.86861704 0.85460324 0.84058628 0.82598123 0.80948042 0.79182917 0.7724052 0.74907137 0.72031195 0.68815487 0.65125598 0.6100244 0.56600904 0.52095058 0.47464344 0.42924778 0.38584718 0.34208462 0.30067509 0.26317221 0.22770037 0.19571781 0.16808736 0.14467686 0.12482737 0.10823403 0.09439655 0.08235799 0.07149445 0.0626855 0.05498009 0.04818852 0.04285814 0.03859244 0.03494044 0.03199172 0.02958044 0.02741084 0.02556884 0.02395058 0.02166741 0.0191457 0.01632139 0.0109837 0.00736032 0.00649061 0.00469736 0.00205874 + + + + 4.10137842 + 3.75605469 + 4.18741753 + 4.52205376 + 5.20680393 + 4.8729478 + 4.5356737 + 6.16247757 + 5.13772343 + 8.53898524 + 55.10485389 + 35.30373192 + 106.24732599 + + + SC_NODATA + 0 + + + SC_SATURATED_DEFECTIVE + 1 + + + SC_DARK_FEATURE_SHADOW + 2 + + + SC_CLOUD_SHADOW + 3 + + + SC_VEGETATION + 4 + + + SC_NOT_VEGETATED + 5 + + + SC_WATER + 6 + + + SC_UNCLASSIFIED + 7 + + + SC_CLOUD_MEDIUM_PROBA + 8 + + + SC_CLOUD_HIGH_PROBA + 9 + + + SC_THIN_CIRRUS + 10 + + + SC_SNOW_ICE + 11 + + + + + + + + + 40.64479480422486 115.81682739339685 40.65079881136531 117.1154430676197 39.66155122739065 117.11377991452629 39.655752572676114 115.83386830444628 40.64479480422486 115.81682739339685 + + + POINT + 1 + + + EPSG + GEOGRAPHIC + + + + + S2A_OPER_GIP_INVLOC_MPC__20171206T000000_V20150703T000000_21000101T000000_B00 + S2A_OPER_GIP_LREXTR_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_ATMIMA_MPC__20150605T094744_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_ATMSAD_MPC__20160729T000005_V20150703T000000_21000101T000000_B00 + S2A_OPER_GIP_BLINDP_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_CLOINV_MPC__20210609T000005_V20210823T030000_21000101T000000_B00 + S2A_OPER_GIP_CLOPAR_MPC__20220120T000001_V20220125T022000_21000101T000000_B00 + S2A_OPER_GIP_CONVER_MPC__20150710T131444_V20150627T000000_21000101T000000_B00 + S2A_OPER_GIP_DATATI_MPC__20151117T131048_V20150703T000000_21000101T000000_B00 + S2A_OPER_GIP_DECOMP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 + S2__OPER_GIP_EARMOD_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_ECMWFP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 + S2A_OPER_GIP_G2PARA_MPC__20231208T000027_V20231213T070000_21000101T000000_B00 + S2A_OPER_GIP_G2PARE_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_GEOPAR_MPC__20150605T094741_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_INTDET_MPC__20220120T000010_V20220125T022000_21000101T000000_B00 + S2A_OPER_GIP_JP2KPA_MPC__20220120T000006_V20220125T022000_21000101T000000_B00 + S2A_OPER_GIP_MASPAR_MPC__20220120T000009_V20220125T022000_21000101T000000_B00 + S2A_OPER_GIP_OLQCPA_MPC__20220715T000042_V20220830T002500_21000101T000000_B00 + S2A_OPER_GIP_PRDLOC_MPC__20180301T130000_V20180305T005000_21000101T000000_B00 + S2A_OPER_GIP_PROBAS_MPC__20240305T000510_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_R2ABCA_MPC__20240315T121000_V20240319T003000_21000101T000000_B00 + S2A_OPER_GIP_R2BINN_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_R2CRCO_MPC__20151023T224715_V20150622T224715_21000101T000000_B00 + S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2DENT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2DEPI_MPC__20230424T160000_V20230426T000000_21000101T000000_B00 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B12 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B03 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B07 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B09 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B10 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B01 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B05 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B8A + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B06 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B04 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B11 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B02 + S2A_OPER_GIP_R2EOB2_MPC__20190412T145327_V20190429T000000_21000101T000000_B08 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B10 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B05 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B04 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B06 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B08 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B03 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B01 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B12 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B11 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B02 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B07 + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B8A + S2A_OPER_GIP_R2EQOG_MPC__20240315T121000_V20240319T003000_21000101T000000_B09 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2NOMO_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_R2PARA_MPC__20221206T000009_V20221206T073000_21000101T000000_B00 + S2A_OPER_GIP_R2SWIR_MPC__20180406T000021_V20180604T100000_21000101T000000_B00 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 + S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 + S2A_OPER_GIP_RESPAR_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_SPAMOD_MPC__20231122T110026_V20231123T010000_21000101T000000_B00 + S2A_OPER_GIP_TILPAR_MPC__20151209T095117_V20150622T000000_21000101T000000_B00 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B8A + S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B03 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B08 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131048_V20150703T000000_21000101T000000_B01 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B11 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B10 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B06 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B04 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B02 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B05 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131051_V20150703T000000_21000101T000000_B12 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B09 + S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B07 + S2__OPER_GIP_L2ACSC_MPC__20220121T000003_V20220125T022000_21000101T000000_B00 + S2__OPER_GIP_L2ACAC_MPC__20220121T000004_V20220125T022000_21000101T000000_B00 + S2__OPER_GIP_PROBA2_MPC__20231208T000510_V20231213T070000_21000101T000000_B00 + + + CopernicusDEM30 + S2__OPER_AUX_UT1UTC_PDMC_20240404T000000_V20240405T000000_20250404T000000 + + S2__OPER_AUX_ECMWFD_ADG__20240410T120000_V20240410T210000_20240412T150000 + + None + + GlobalSnowMap.tiff + ESACCI-LC-L4-WB-Map-150m-P13Y-2000-v4.0.tif + ESACCI-LC-L4-LCCS-Map-300m-P1Y-2015-v2.0.7.tif + ESACCI-LC-L4-Snow-Cond-500m-MONTHLY-2000-2012-v2.4 + + + 3.500058 + + 0.0 + 0 + + + + PASSED + PASSED + PASSED + PASSED + PASSED + PASSED + + + + + 3.354197 + 0.0 + 0.0 + 8.675177 + 0.268831 + 2.81222 + 83.179593 + 0.992827 + 0.571295 + 0.275278 + 0.038401 + 3.18638 + 0.0 + 0.0 + 0.0 + 0.0 + CAMS + 0.392921 + 1.224094 + AUX_ECMWFT + 357.927923 + + + +""" # noqa + +PROCESS_LEVELS = ["L1C", "oldL1C", "L2A"] +MTD_XMLS = [mtd_l1c_xml, mtd_l1c_old_xml, mtd_l2a_xml] +TILE_XMLS = [mtd_l1c_tile_xml, mtd_l1c_tile_xml, mtd_l1c_tile_xml] -class TestMTDXML: - """Test the SAFE MTD XML file handler.""" - def setup_method(self): - """Set up the test case.""" - from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML - filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A") - self.xml_tile_fh = SAFEMSITileMDXML(BytesIO(mtd_tile_xml), filename_info, mock.MagicMock()) - self.old_xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_old_xml), filename_info, mock.MagicMock()) - self.xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=True) +def xml_builder(process_level, mask_saturated=True, band_name=None): + """Build fake SAFE MTD/Tile XML.""" + from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML + filename_info = dict(observation_time=fname_dt, dtile_number=None, band_name=band_name, fmission_id="S2A", + process_level=process_level.replace("old", "")) + xml_fh = SAFEMSIMDXML(StringIO(MTD_XMLS[PROCESS_LEVELS.index(process_level)]), + filename_info, mock.MagicMock(), mask_saturated=mask_saturated) + xml_tile_fh = SAFEMSITileMDXML(BytesIO(TILE_XMLS[PROCESS_LEVELS.index(process_level)]), + filename_info, mock.MagicMock()) + return xml_fh, xml_tile_fh + + +def jp2_builder(process_level, band_name, mask_saturated=True): + """Build fake SAFE jp2 image file.""" + from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSITileMDXML + filename_info = dict(observation_time=fname_dt, dtile_number=None, band_name=band_name, fmission_id="S2A", + process_level=process_level.replace("old", "")) + xml_fh = xml_builder(process_level, mask_saturated, band_name)[0] + tile_xml_fh = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(TILE_XMLS[PROCESS_LEVELS.index(process_level)]), + filename_info, mock.MagicMock()) + tile_xml_fh.start_time.return_value = tilemd_dt + jp2_fh = SAFEMSIL1C("somefile", filename_info, mock.MagicMock(), xml_fh, tile_xml_fh) + return jp2_fh + + +class TestTileXML: + """Test the SAFE TILE XML file handler. + + Since L1C/L2A share almost the same Tile XML structure, we only use L1C Tile here. + + """ + + @pytest.mark.parametrize(("process_level", "angle_name", "angle_tag", "expected"), + [ + ("L1C", "satellite_zenith_angle", ("Viewing_Incidence_Angles_Grids", "Zenith"), + [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, + 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], + [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, + 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], + [11.6823579, 10.7763071, 9.86302106, 8.93879112, 8.04005637, + 7.15028077, 6.21461062, 5.25780953, 4.39876601, 3.68620793], + [11.06724679, 10.35723901, 9.63958896, 8.73072512, 7.83680864, + 6.94792574, 5.9889201, 5.05445872, 4.26089708, 3.50984272], + [6.28411038, 6.28411038, 6.28411038, 6.28411038, 6.28411038, + 5.99769643, 5.62586167, 4.85165966, 4.13238314, 3.33781401], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), + ("L2A", "solar_zenith_angle_l2a", ("Sun_Angles_Grid", "Zenith"), + [[39.8824, 39.83721367, 39.79230847, 39.74758442, 39.7030415, + 39.65867687, 39.61455566, 39.57061558, 39.52685664, 39.48331372], + [39.78150175, 39.73629896, 39.69128852, 39.64643679, 39.6018404, + 39.5574369, 39.51323286, 39.46920212, 39.4253673, 39.38179377], + [39.6806035, 39.63532838, 39.5902497, 39.54538507, 39.5007087, + 39.45621756, 39.41195347, 39.36779169, 39.3239121, 39.28027381], + [39.57980525, 39.53445664, 39.48931088, 39.44434154, 39.39957879, + 39.35503587, 39.31067408, 39.26649344, 39.22249393, 39.17876143], + [39.479007, 39.43355483, 39.38829092, 39.34328573, 39.29846167, + 39.25381983, 39.2093947, 39.16513007, 39.12109926, 39.07726878], + [39.37820875, 39.33268069, 39.28735495, 39.24224914, 39.19736058, + 39.15267709, 39.1081719, 39.06385068, 39.01973446, 38.97584982], + [39.2774105, 39.23184303, 39.18646737, 39.14130809, 39.09632176, + 39.05153988, 39.00696049, 38.9625713, 38.91842056, 38.87444401], + [39.17671225, 39.13104478, 39.08559031, 39.04034757, 38.99528294, + 38.95039991, 38.9057971, 38.86130793, 38.81705183, 38.77303821], + [39.076014, 39.03026112, 38.98477906, 38.93940875, 38.89425338, + 38.84936063, 38.80464763, 38.76011645, 38.7157479, 38.67164839], + [38.97531575, 38.92950771, 38.88389967, 38.83852091, 38.7933053, + 38.74831897, 38.7034912, 38.65891427, 38.61446851, 38.57030388]]), + ("L1C", "moon_zenith_angle", ("Sun_Angles_Grid", "Zenith"), None) + ]) + def test_angles(self, process_level, angle_name, angle_tag, expected): + """Test reading angles array.""" + info = dict(xml_tag=angle_tag[0], xml_item=angle_tag[1]) if "satellite" in angle_name else \ + dict(xml_tag=angle_tag[0] + "/" + angle_tag[1]) + xml_tile_fh = xml_builder(process_level)[1] + + res = xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) + if res is not None: + res = res[::200, ::200] + + if res is not None: + np.testing.assert_allclose(res, expected) + else: + assert res is expected def test_start_time(self): """Ensure start time is read correctly from XML.""" - assert self.xml_tile_fh.start_time() == tilemd_dt - - def test_satellite_zenith_array(self): - """Test reading the satellite zenith array.""" - info = dict(xml_tag="Viewing_Incidence_Angles_Grids", xml_item="Zenith") - - expected_data = np.array([[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, - 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], - [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, - 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], - [11.6823579, 10.7763071, 9.86302106, 8.93879112, 8.04005637, - 7.15028077, 6.21461062, 5.25780953, 4.39876601, 3.68620793], - [11.06724679, 10.35723901, 9.63958896, 8.73072512, 7.83680864, - 6.94792574, 5.9889201, 5.05445872, 4.26089708, 3.50984272], - [6.28411038, 6.28411038, 6.28411038, 6.28411038, 6.28411038, - 5.99769643, 5.62586167, 4.85165966, 4.13238314, 3.33781401], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], - [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, - 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]) - res = self.xml_tile_fh.get_dataset(make_dataid(name="satellite_zenith_angle", - resolution=60), - info)[::200, ::200] - np.testing.assert_allclose(res, expected_data) - - def test_old_xml_calibration(self): - """Test the calibration of older data formats (no offset).""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.old_xml_fh.calibrate_to_reflectances(fake_data, "B01") - np.testing.assert_allclose(result, [[[np.nan, 0.01, 0.02, 0.03], - [0.04, 10, 655.34, np.inf]]]) - - def test_xml_calibration(self): - """Test the calibration with radiometric offset.""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.xml_fh.calibrate_to_reflectances(fake_data, "B01") - np.testing.assert_allclose(result, [[[np.nan, 0.01 - 10, 0.02 - 10, 0.03 - 10], - [0.04 - 10, 0, 655.34 - 10, np.inf]]]) - - def test_xml_calibration_to_counts(self): - """Test the calibration to counts.""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.xml_fh._sanitize_data(fake_data) - np.testing.assert_allclose(result, [[[np.nan, 1, 2, 3], - [4, 1000, 65534, np.inf]]]) - - def test_xml_calibration_unmasked_saturated(self): - """Test the calibration with radiometric offset but unmasked saturated pixels.""" - from satpy.readers.msi_safe import SAFEMSIMDXML - filename_info = dict(observation_time=None, dtile_number=None, fmission_id="S2A") - self.xml_fh = SAFEMSIMDXML(StringIO(mtd_l1c_xml), filename_info, mock.MagicMock(), mask_saturated=False) - - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.xml_fh.calibrate_to_reflectances(fake_data, "B01") - np.testing.assert_allclose(result, [[[np.nan, 0.01 - 10, 0.02 - 10, 0.03 - 10], - [0.04 - 10, 0, 655.34 - 10, 655.35 - 10]]]) - - def test_xml_calibration_with_different_offset(self): - """Test the calibration with a different offset.""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.xml_fh.calibrate_to_reflectances(fake_data, "B10") - np.testing.assert_allclose(result, [[[np.nan, 0.01 - 20, 0.02 - 20, 0.03 - 20], - [0.04 - 20, -10, 655.34 - 20, np.inf]]]) - - def test_xml_calibration_to_radiance(self): - """Test the calibration with a different offset.""" - fake_data = xr.DataArray([[[0, 1, 2, 3], - [4, 1000, 65534, 65535]]], - dims=["band", "x", "y"]) - result = self.xml_fh.calibrate_to_radiances(fake_data, "B01") - expected = np.array([[[np.nan, -251.584265, -251.332429, -251.080593], - [-250.828757, 0., 16251.99095, np.inf]]]) - np.testing.assert_allclose(result, expected) - - def test_xml_navigation(self): + xml_tile_fh = xml_builder("L1C")[1] + assert xml_tile_fh.start_time() == tilemd_dt + + def test_navigation(self): """Test the navigation.""" from pyproj import CRS crs = CRS("EPSG:32616") dsid = make_dataid(name="B01", resolution=60) - result = self.xml_tile_fh.get_area_def(dsid) - - area_extents = (499980.0, 3590220.0, 609780.0, 3700020.0) + xml_tile_fh = xml_builder("L1C")[1] + result = xml_tile_fh.get_area_def(dsid) + area_extent = (499980.0, 3590220.0, 609780.0, 3700020.0) assert result.crs == crs - np.testing.assert_allclose(result.area_extent, area_extents) + np.testing.assert_allclose(result.area_extent, area_extent) + + +class TestMTDXML: + """Test the SAFE MTD XML file handler.""" + + def setup_method(self): + """Set up the test case.""" + self.fake_data = xr.DataArray([[[0, 1, 2, 3], [4, 1000, 65534, 65535]]], dims=["band", "x", "y"]) + + @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), + [ + ("L1C", True, "B01", ([[[np.nan, -9.99, -9.98, -9.97], + [-9.96, 0, 645.34, np.inf]]], + [[[np.nan, -251.584265, -251.332429, -251.080593], + [-250.828757, 0., 16251.99095, np.inf]]], + [[[np.nan, 1, 2, 3], + [4, 1000, 65534, np.inf]]])), + ("L1C", False, "B10", ([[[np.nan, -19.99, -19.98, -19.97], + [-19.96, -10, 635.34, 635.35]]], + [[[np.nan, -35.465976, -35.448234, -35.430493], + [-35.412751, -17.741859, 1127.211275, 1127.229017]]], + [[[np.nan, 1, 2, 3], + [4, 1000, 65534, 65535]]])), + ("oldL1C", True, "B01", ([[[np.nan, 0.01, 0.02, 0.03], + [0.04, 10, 655.34, np.inf]]], + [[[np.nan, 0.251836101, 0.503672202, 0.755508303], + [1.00734440, 251.836101, 16503.8271, np.inf]]], + [[[np.nan, 1, 2, 3], + [4, 1000, 65534, np.inf]]])), + ("L2A", False, "B03", ([[[np.nan, -9.99, -9.98, -9.97], + [-9.96, 0, 645.34, 645.35]]], + [[[np.nan, -238.571863, -238.333052, -238.094241], + [-237.855431, 0, 15411.407995, 15411.646806]]], + [[[np.nan, 1, 2, 3], + [4, 1000, 65534, 65535]]])), + ]) + def test_xml_calibration(self, process_level, mask_saturated, band_name, expected): + """Test the calibration to reflectance/radiance/counts.""" + xml_fh = xml_builder(process_level, mask_saturated)[0] + + res1 = xml_fh.calibrate_to_reflectances(self.fake_data, band_name) + res2 = xml_fh.calibrate_to_radiances(self.fake_data, band_name) + res3 = xml_fh._sanitize_data(self.fake_data) + + results = (res1, res2, res3) + np.testing.assert_allclose(results, expected) + + @pytest.mark.parametrize(("process_level", "mask_saturated", "band_name", "expected"), + [ + ("L1C", True, "B01", None), + ("L2A", False, "AOT", [[[np.nan, 0.001, 0.002, 0.003], + [0.004, 1., 65.534, 65.535]]]), + ("L2A", True, "WVP", [[[np.nan, 0.001, 0.002, 0.003], + [0.004, 1., 65.534, np.inf]]]), + ("L2A", False, "CLOUD", None), + ("L2A", False, "B10", None), + ]) + def test_xml_calibration_to_atmospheric(self, process_level, mask_saturated, band_name, expected): + """Test the calibration to L2A atmospheric products.""" + xml_fh = xml_builder(process_level, mask_saturated)[0] + + result = xml_fh.calibrate_to_atmospheric(self.fake_data, band_name) + + if result is not None: + np.testing.assert_allclose(result, expected) + else: + assert result is expected class TestSAFEMSIL1C: @@ -988,36 +1608,45 @@ class TestSAFEMSIL1C: def setup_method(self): """Set up the test.""" - from satpy.readers.msi_safe import SAFEMSITileMDXML - self.filename_info = dict(observation_time=fname_dt, fmission_id="S2A", band_name="B01", dtile_number=None) self.fake_data = xr.Dataset({"band_data": xr.DataArray([[[0, 1], [65534, 65535]]], dims=["band", "x", "y"])}) - self.tile_mda = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(mtd_tile_xml), - self.filename_info, mock.MagicMock()) - self.tile_mda.start_time.return_value = tilemd_dt - - @pytest.mark.parametrize(("mask_saturated", "calibration", "expected"), - [(True, "reflectance", [[np.nan, 0.01 - 10], [645.34, np.inf]]), - (False, "reflectance", [[np.nan, 0.01 - 10], [645.34, 645.35]]), - (True, "radiance", [[np.nan, -251.58426503], [16251.99095011, np.inf]]), - (False, "counts", [[np.nan, 1], [65534, 65535]])]) - def test_calibration_and_masking(self, mask_saturated, calibration, expected): + + @pytest.mark.parametrize(("mask_saturated", "dataset_name", "calibration", "expected"), + [ + (False, "B01_L2A", "reflectance", [[np.nan, -9.99], [645.34, 645.35]]), + (True, "B02_L2A", "radiance", [[np.nan, -265.970568], [17181.325973, np.inf]]), + (True, "B03_L2A", "counts", [[np.nan, 1], [65534, np.inf]]), + (False, "AOT_L2A", "aerosol_thickness", [[np.nan, 0.001], [65.534, 65.535]]), + (True, "WVP_L2A", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), + (True, "SNOW_L2A", "water_vapor", None), + ]) + def test_calibration_and_masking(self, mask_saturated, dataset_name, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" - from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML + jp2_fh = jp2_builder("L2A", dataset_name.replace("_L2A", ""), mask_saturated) - mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.filename_info, mock.MagicMock(), - mask_saturated=mask_saturated) - self.jp2_fh = SAFEMSIL1C("somefile", self.filename_info, mock.MagicMock(), mda, self.tile_mda) + with mock.patch("xarray.open_dataset", return_value=self.fake_data): + res = jp2_fh.get_dataset(make_dataid(name=dataset_name, calibration=calibration), info=dict()) + if res is not None: + np.testing.assert_allclose(res, expected) + else: + assert res is expected + + @pytest.mark.parametrize(("process_level", "band_name", "dataset_name"), + [ + ("L1C", "B01", "B03"), + ("L2A", "B02", "B03_L2A"), + ]) + def test_filename_dsname_mismatch(self, process_level, band_name, dataset_name): + """Test when dataset name and file band name mismatch, the data and its area definition should both be None.""" + jp2_fh = jp2_builder(process_level, band_name) with mock.patch("xarray.open_dataset", return_value=self.fake_data): - res = self.jp2_fh.get_dataset(make_dataid(name="B01", calibration=calibration), info=dict()) - np.testing.assert_allclose(res, expected) + res1 = jp2_fh.get_dataset(make_dataid(name=dataset_name), info=dict()) + res2 = jp2_fh.get_area_def(make_dataid(name=dataset_name)) + assert res1 is None + assert res2 is None def test_start_time(self): """Test that the correct start time is returned.""" - from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSIMDXML - - mda = SAFEMSIMDXML(StringIO(mtd_l1c_xml), self.filename_info, mock.MagicMock()) - self.jp2_fh = SAFEMSIL1C("somefile", self.filename_info, mock.MagicMock(), - mda, self.tile_mda) - assert tilemd_dt == self.jp2_fh.start_time + jp2_fh = jp2_builder("L1C", "B01") + assert tilemd_dt == jp2_fh.start_time From 14231e3a7ce827001603248a0567f3cfaef02ff5 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 15 May 2024 15:11:17 +0800 Subject: [PATCH 445/481] try --- satpy/etc/readers/msi_safe.yaml | 41 ++++--- satpy/readers/msi_safe.py | 5 +- satpy/tests/reader_tests/test_msi_safe.py | 125 +++++++++++++++++++++- 3 files changed, 151 insertions(+), 20 deletions(-) diff --git a/satpy/etc/readers/msi_safe.yaml b/satpy/etc/readers/msi_safe.yaml index a7edb27d62..cc39c26a74 100644 --- a/satpy/etc/readers/msi_safe.yaml +++ b/satpy/etc/readers/msi_safe.yaml @@ -1,6 +1,8 @@ reader: name: msi_safe - + short_name: MSI SAFE L1C + long_name: Sentinel-2 A and B MSI L1C data in SAFE format + description: SAFE Reader for MSI L1C data (Sentinel-2) status: Nominal supports_fsspec: false sensors: [msi] @@ -8,7 +10,16 @@ reader: reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader file_types: - + l1c_safe_granule: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/IMG_DATA/T{tile_number:5s}_{file_discriminator:%Y%m%dT%H%M%S}_{band_name:3s}.jp2'] + requires: [l1c_safe_metadata, l1c_safe_tile_metadata] + l1c_safe_tile_metadata: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSITileMDXML + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/GRANULE/L1C_T{gtile_number:5s}_A{absolute_orbit_number:6d}_{gfile_discriminator:%Y%m%dT%H%M%S}/MTD_TL.xml'] + l1c_safe_metadata: + file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIMDXML + file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL1C.xml'] datasets: B01: @@ -26,7 +37,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B02: name: B02 @@ -43,7 +54,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B03: name: B03 @@ -60,7 +71,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B04: name: B04 @@ -77,7 +88,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B05: name: B05 @@ -94,7 +105,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B06: name: B06 @@ -111,7 +122,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B07: name: B07 @@ -128,7 +139,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B08: name: B08 @@ -145,7 +156,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B8A: name: B8A @@ -162,7 +173,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B09: name: B09 @@ -179,7 +190,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B10: name: B10 @@ -196,7 +207,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B11: name: B11 @@ -213,7 +224,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule B12: name: B12 @@ -230,7 +241,7 @@ datasets: counts: standard_name: counts units: "1" - + file_type: l1c_safe_granule solar_zenith_angle: name: solar_zenith_angle diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index 5fb7b70928..d36350f7ab 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -28,7 +28,7 @@ reader_kwargs={'mask_saturated': False}) scene.load(['B01']) - +L1C/L2A format description for the files read here: https://sentinels.copernicus.eu/documents/247904/685211/S2-PDGS-TAS-DI-PSD-V14.9.pdf/3d3b6c9c-4334-dcc4-3aa7-f7c0deffbaf7?t=1643013091529 @@ -75,9 +75,6 @@ def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_s self._start_time = self._tile_mda.start_time() self._end_time = filename_info["observation_time"] - self._start_time = self._tile_mda.start_time() - self._end_time = filename_info["observation_time"] - def get_dataset(self, key, info): """Load a dataset.""" if self.process_level == "L1C": diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 6af7555265..d2de3e1a54 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -30,7 +30,7 @@ fname_dt = datetime(2020, 10, 1, 18, 35, 41) tilemd_dt = datetime(2020, 10, 1, 16, 34, 23, 153611) - +mtd_l1c_tile_xml = b""" @@ -1420,7 +1420,110 @@ """ # noqa +PROCESS_LEVELS = ["L1C", "oldL1C", "L2A"] +MTD_XMLS = [mtd_l1c_xml, mtd_l1c_old_xml, mtd_l2a_xml] +TILE_XMLS = [mtd_l1c_tile_xml, mtd_l1c_tile_xml, mtd_l1c_tile_xml] + + +def xml_builder(process_level, mask_saturated=True, band_name=None): + """Build fake SAFE MTD/Tile XML.""" + from satpy.readers.msi_safe import SAFEMSIMDXML, SAFEMSITileMDXML + filename_info = dict(observation_time=fname_dt, dtile_number=None, band_name=band_name, fmission_id="S2A", + process_level=process_level.replace("old", "")) + xml_fh = SAFEMSIMDXML(StringIO(MTD_XMLS[PROCESS_LEVELS.index(process_level)]), + filename_info, mock.MagicMock(), mask_saturated=mask_saturated) + xml_tile_fh = SAFEMSITileMDXML(BytesIO(TILE_XMLS[PROCESS_LEVELS.index(process_level)]), + filename_info, mock.MagicMock()) + return xml_fh, xml_tile_fh + + +def jp2_builder(process_level, band_name, mask_saturated=True): + """Build fake SAFE jp2 image file.""" + from satpy.readers.msi_safe import SAFEMSIL1C, SAFEMSITileMDXML + filename_info = dict(observation_time=fname_dt, dtile_number=None, band_name=band_name, fmission_id="S2A", + process_level=process_level.replace("old", "")) + xml_fh = xml_builder(process_level, mask_saturated, band_name)[0] + tile_xml_fh = mock.create_autospec(SAFEMSITileMDXML)(BytesIO(TILE_XMLS[PROCESS_LEVELS.index(process_level)]), + filename_info, mock.MagicMock()) + tile_xml_fh.start_time.return_value = tilemd_dt + jp2_fh = SAFEMSIL1C("somefile", filename_info, mock.MagicMock(), xml_fh, tile_xml_fh) + return jp2_fh + + +class TestTileXML: + """Test the SAFE TILE XML file handler. + + Since L1C/L2A share almost the same Tile XML structure, we only use L1C Tile here. + + """ + + @pytest.mark.parametrize(("process_level", "angle_name", "angle_tag", "expected"), + [ + ("L1C", "satellite_zenith_angle", ("Viewing_Incidence_Angles_Grids", "Zenith"), + [[11.7128, 11.18397802, 10.27667671, 9.35384969, 8.42850504, + 7.55445611, 6.65475545, 5.66517232, 4.75893757, 4.04976844], + [11.88606009, 10.9799713, 10.07083278, 9.14571825, 8.22607131, + 7.35181457, 6.44647222, 5.46144173, 4.56625547, 3.86638233], + [11.6823579, 10.7763071, 9.86302106, 8.93879112, 8.04005637, + 7.15028077, 6.21461062, 5.25780953, 4.39876601, 3.68620793], + [11.06724679, 10.35723901, 9.63958896, 8.73072512, 7.83680864, + 6.94792574, 5.9889201, 5.05445872, 4.26089708, 3.50984272], + [6.28411038, 6.28411038, 6.28411038, 6.28411038, 6.28411038, + 5.99769643, 5.62586167, 4.85165966, 4.13238314, 3.33781401], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], + [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, + 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), + ("L2A", "solar_zenith_angle_l2a", ("Sun_Angles_Grid", "Zenith"), + [[39.8824, 39.83721367, 39.79230847, 39.74758442, 39.7030415, + 39.65867687, 39.61455566, 39.57061558, 39.52685664, 39.48331372], + [39.78150175, 39.73629896, 39.69128852, 39.64643679, 39.6018404, + 39.5574369, 39.51323286, 39.46920212, 39.4253673, 39.38179377], + [39.6806035, 39.63532838, 39.5902497, 39.54538507, 39.5007087, + 39.45621756, 39.41195347, 39.36779169, 39.3239121, 39.28027381], + [39.57980525, 39.53445664, 39.48931088, 39.44434154, 39.39957879, + 39.35503587, 39.31067408, 39.26649344, 39.22249393, 39.17876143], + [39.479007, 39.43355483, 39.38829092, 39.34328573, 39.29846167, + 39.25381983, 39.2093947, 39.16513007, 39.12109926, 39.07726878], + [39.37820875, 39.33268069, 39.28735495, 39.24224914, 39.19736058, + 39.15267709, 39.1081719, 39.06385068, 39.01973446, 38.97584982], + [39.2774105, 39.23184303, 39.18646737, 39.14130809, 39.09632176, + 39.05153988, 39.00696049, 38.9625713, 38.91842056, 38.87444401], + [39.17671225, 39.13104478, 39.08559031, 39.04034757, 38.99528294, + 38.95039991, 38.9057971, 38.86130793, 38.81705183, 38.77303821], + [39.076014, 39.03026112, 38.98477906, 38.93940875, 38.89425338, + 38.84936063, 38.80464763, 38.76011645, 38.7157479, 38.67164839], + [38.97531575, 38.92950771, 38.88389967, 38.83852091, 38.7933053, + 38.74831897, 38.7034912, 38.65891427, 38.61446851, 38.57030388]]), + ("L1C", "moon_zenith_angle", ("Sun_Angles_Grid", "Zenith"), None) + ]) + def test_angles(self, process_level, angle_name, angle_tag, expected): + """Test reading angles array.""" + info = dict(xml_tag=angle_tag[0], xml_item=angle_tag[1]) if "satellite" in angle_name else \ + dict(xml_tag=angle_tag[0] + "/" + angle_tag[1]) + xml_tile_fh = xml_builder(process_level)[1] + + res = xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) + if res is not None: + res = res[::200, ::200] + + if res is not None: + np.testing.assert_allclose(res, expected) + else: + assert res is expected + def test_start_time(self): + """Ensure start time is read correctly from XML.""" + xml_tile_fh = xml_builder("L1C")[1] + assert xml_tile_fh.start_time() == tilemd_dt + + def test_navigation(self): """Test the navigation.""" from pyproj import CRS crs = CRS("EPSG:32616") @@ -1505,7 +1608,18 @@ class TestSAFEMSIL1C: def setup_method(self): """Set up the test.""" + self.fake_data = xr.Dataset({"band_data": xr.DataArray([[[0, 1], [65534, 65535]]], dims=["band", "x", "y"])}) + @pytest.mark.parametrize(("mask_saturated", "dataset_name", "calibration", "expected"), + [ + (False, "B01_L2A", "reflectance", [[np.nan, -9.99], [645.34, 645.35]]), + (True, "B02_L2A", "radiance", [[np.nan, -265.970568], [17181.325973, np.inf]]), + (True, "B03_L2A", "counts", [[np.nan, 1], [65534, np.inf]]), + (False, "AOT_L2A", "aerosol_thickness", [[np.nan, 0.001], [65.534, 65.535]]), + (True, "WVP_L2A", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), + (True, "SNOW_L2A", "water_vapor", None), + ]) + def test_calibration_and_masking(self, mask_saturated, dataset_name, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" jp2_fh = jp2_builder("L2A", dataset_name.replace("_L2A", ""), mask_saturated) @@ -1526,4 +1640,13 @@ def test_filename_dsname_mismatch(self, process_level, band_name, dataset_name): jp2_fh = jp2_builder(process_level, band_name) with mock.patch("xarray.open_dataset", return_value=self.fake_data): + res1 = jp2_fh.get_dataset(make_dataid(name=dataset_name), info=dict()) + res2 = jp2_fh.get_area_def(make_dataid(name=dataset_name)) + + assert res1 is None + assert res2 is None + def test_start_time(self): + """Test that the correct start time is returned.""" + jp2_fh = jp2_builder("L1C", "B01") + assert tilemd_dt == jp2_fh.start_time From f33c3e4c817c16ecc8fbb4211a93900d0de7285a Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Wed, 15 May 2024 14:01:19 +0200 Subject: [PATCH 446/481] Update np.random usages --- satpy/tests/reader_tests/_li_test_utils.py | 29 ++++++++++--------- satpy/tests/reader_tests/test_epic_l1b_h5.py | 17 ++++++----- .../tests/reader_tests/test_generic_image.py | 4 +-- satpy/tests/reader_tests/test_goci2_l2_nc.py | 9 +++--- satpy/tests/reader_tests/test_hrit_base.py | 7 +++-- .../reader_tests/test_insat3d_img_l1b_h5.py | 8 ++--- satpy/tests/reader_tests/test_mirs.py | 13 +++++---- satpy/tests/reader_tests/test_nwcsaf_msg.py | 21 +++++++------- satpy/tests/reader_tests/test_nwcsaf_nc.py | 9 +++--- .../reader_tests/test_seviri_l1b_hrit.py | 14 ++++----- .../tests/reader_tests/test_seviri_l2_bufr.py | 8 ++--- satpy/tests/reader_tests/test_sgli_l1b.py | 5 ++-- .../tests/reader_tests/test_viirs_compact.py | 21 +++++++------- satpy/tests/reader_tests/test_viirs_edr.py | 8 +++-- satpy/tests/test_composites.py | 6 ++-- satpy/tests/test_modifiers.py | 24 ++++++++------- satpy/tests/utils.py | 2 ++ 17 files changed, 110 insertions(+), 95 deletions(-) diff --git a/satpy/tests/reader_tests/_li_test_utils.py b/satpy/tests/reader_tests/_li_test_utils.py index 32107006fc..b656decb89 100644 --- a/satpy/tests/reader_tests/_li_test_utils.py +++ b/satpy/tests/reader_tests/_li_test_utils.py @@ -20,6 +20,7 @@ import xarray as xr from satpy.tests.reader_tests.test_netcdf_utils import FakeNetCDF4FileHandler +from satpy.tests.utils import RANDOM_GEN # mapping of netcdf type code to numpy data type: TYPE_MAP = { @@ -44,7 +45,7 @@ def l2_le_schema(settings=None): nfilters = settings.get("num_filters", 2) def rand_u16(num): - return np.random.randint(low=0, high=np.iinfo(np.uint16).max - 1, size=num, dtype=np.uint16) + return RANDOM_GEN.integers(low=0, high=np.iinfo(np.uint16).max - 1, size=num, dtype=np.uint16) return { "providers": settings.get("providers", {}), @@ -100,7 +101,7 @@ def rand_u16(num): "scale_factor": 0.004, "add_offset": 0.0, "long_name": "L2 filter results", - "default_data": lambda: np.random.randint(low=0, high=255, size=(nobs, nfilters), dtype=np.uint8) + "default_data": lambda: RANDOM_GEN.integers(low=0, high=255, size=(nobs, nfilters), dtype=np.uint8) }, "epoch_time": { "format": "f8", @@ -212,13 +213,13 @@ def l2_lef_schema(settings=None): "long_name": "Radiance of Flash", "standard_name": "radiance", "units": "mW.m-2.sr-1", - "default_data": lambda: np.clip(np.round(np.random.normal(500, 100, nobs)), 1, 2 ** 16 - 1) + "default_data": lambda: np.clip(np.round(RANDOM_GEN.normal(500, 100, nobs)), 1, 2 ** 16 - 1) }, "event_filter_qa": { "format": "u1", "shape": ("events",), "long_name": "L2 event pre-filtering quality assurance value", - "default_data": lambda: np.random.randint(1, 2 ** 8 - 1, nobs) + "default_data": lambda: RANDOM_GEN.integers(1, 2 ** 8 - 1, nobs) }, "epoch_time": { "format": "f8", @@ -232,21 +233,21 @@ def l2_lef_schema(settings=None): "shape": ("events",), "long_name": "Time offset from epoch time", "units": "seconds", - "default_data": lambda: np.random.uniform(1, 2 ** 31 - 1, nobs) + "default_data": lambda: RANDOM_GEN.uniform(1, 2 ** 31 - 1, nobs) }, "detector_row": { "format": "u2", "shape": ("events",), "long_name": "Detector row position of event pixel", "units": "1", - "default_data": lambda: np.random.randint(1, 1000, nobs) + "default_data": lambda: RANDOM_GEN.integers(1, 1000, nobs) }, "detector_column": { "format": "u2", "shape": ("events",), "long_name": "Detector column position of event pixel", "units": "1", - "default_data": lambda: np.random.randint(1, 1000, nobs) + "default_data": lambda: RANDOM_GEN.integers(1, 1000, nobs) }, } } @@ -328,7 +329,7 @@ def l2_lfl_schema(settings=None): "long_name": "Radiance of Flash", "standard_name": "radiance", "units": "mW.m-2.sr-1", - "default_data": lambda: np.round(np.random.normal(500, 100, nobs)) + "default_data": lambda: np.round(RANDOM_GEN.normal(500, 100, nobs)) }, "flash_duration": { "format": "u2", @@ -343,7 +344,7 @@ def l2_lfl_schema(settings=None): "shape": ("flashes",), "long_name": "L2 filtered flash confidence", "standard_name": "flash_filter_confidence", - "default_data": lambda: np.clip(np.round(np.random.normal(20, 10, nobs)), 1, 2 ** 7 - 1) + "default_data": lambda: np.clip(np.round(RANDOM_GEN.normal(20, 10, nobs)), 1, 2 ** 7 - 1) }, "flash_footprint": { "format": "u2", @@ -351,7 +352,7 @@ def l2_lfl_schema(settings=None): "long_name": "Flash footprint size", "standard_name": "flash_footprint", "units": "L1 grid pixels", - "default_data": lambda: np.maximum(1, np.round(np.random.normal(5, 3, nobs))) + "default_data": lambda: np.maximum(1, np.round(RANDOM_GEN.normal(5, 3, nobs))) }, "flash_id": { "format": "u4", @@ -367,7 +368,7 @@ def l2_lfl_schema(settings=None): "units": "seconds since 2000-01-01 00:00:00.0", "standard_name": "time", "precision": "1 millisecond", - "default_data": lambda: np.random.uniform(stime, etime, nobs) + "default_data": lambda: RANDOM_GEN.uniform(stime, etime, nobs) }, "l1b_geolocation_warning": { "format": "i1", @@ -437,7 +438,7 @@ def l2_af_schema(settings=None): "flash_accumulation": { "format": "u2", "shape": ("pixels",), - "default_data": lambda: np.clip(np.round(np.random.normal(1, 2, nobs)), 1, 2 ** 16 - 1) + "default_data": lambda: np.clip(np.round(RANDOM_GEN.normal(1, 2, nobs)), 1, 2 ** 16 - 1) }, "mtg_geos_projection": mtg_geos_projection(), "x": fci_grid_definition("X", nobs), @@ -495,7 +496,7 @@ def l2_afr_schema(settings=None): "long_name": "Area averaged flash radiance accumulation", "grid_mapping": "mtg_geos_projection", "coordinate": "sparse: x y", - "default_data": lambda: np.random.randint(low=1, high=6548, size=(120), dtype=np.int16) + "default_data": lambda: RANDOM_GEN.integers(low=1, high=6548, size=(120), dtype=np.int16) }, "accumulation_start_times": { "format": "f4", @@ -538,7 +539,7 @@ def fci_grid_definition(axis, nobs): "standard_name": standard_name, "units": "radian", "valid_range": np.asarray([1, 5568]), - "default_data": lambda: np.clip(np.round(np.random.normal(2000, 500, nobs)), 1, 2 ** 16 - 1) + "default_data": lambda: np.clip(np.round(RANDOM_GEN.normal(2000, 500, nobs)), 1, 2 ** 16 - 1) } diff --git a/satpy/tests/reader_tests/test_epic_l1b_h5.py b/satpy/tests/reader_tests/test_epic_l1b_h5.py index 472cda7f2d..1ff4c76c07 100644 --- a/satpy/tests/reader_tests/test_epic_l1b_h5.py +++ b/satpy/tests/reader_tests/test_epic_l1b_h5.py @@ -25,14 +25,15 @@ import pytest from satpy.readers.epic_l1b_h5 import CALIB_COEFS - -b317_data = np.random.uniform(low=0, high=5200, size=(100, 100)) -b688_data = np.random.uniform(low=0, high=5200, size=(100, 100)) -sza_data = np.random.uniform(low=0, high=100, size=(100, 100)) -vaa_data = np.random.uniform(low=-180, high=180, size=(100, 100)) -lon_data = np.random.uniform(low=-90, high=90, size=(100, 100)) -lat_data = np.random.uniform(low=-180, high=180, size=(100, 100)) -mas_data = np.random.choice([0, 1], size=(100, 100)) +from satpy.tests.utils import RANDOM_GEN + +b317_data = RANDOM_GEN.uniform(low=0, high=5200, size=(100, 100)) +b688_data = RANDOM_GEN.uniform(low=0, high=5200, size=(100, 100)) +sza_data = RANDOM_GEN.uniform(low=0, high=100, size=(100, 100)) +vaa_data = RANDOM_GEN.uniform(low=-180, high=180, size=(100, 100)) +lon_data = RANDOM_GEN.uniform(low=-90, high=90, size=(100, 100)) +lat_data = RANDOM_GEN.uniform(low=-180, high=180, size=(100, 100)) +mas_data = RANDOM_GEN.choice([0, 1], size=(100, 100)) @pytest.fixture() diff --git a/satpy/tests/reader_tests/test_generic_image.py b/satpy/tests/reader_tests/test_generic_image.py index cd347ce07e..f7a27097a8 100644 --- a/satpy/tests/reader_tests/test_generic_image.py +++ b/satpy/tests/reader_tests/test_generic_image.py @@ -24,7 +24,7 @@ import pytest import xarray as xr -from satpy.tests.utils import make_dataid +from satpy.tests.utils import RANDOM_GEN, make_dataid class TestGenericImage(unittest.TestCase): @@ -62,7 +62,7 @@ def setUp(self): a__[:10, :10] = 0 a__ = da.from_array(a__, chunks=(50, 50)) - r_nan__ = np.random.uniform(0., 1., size=(self.y_size, self.x_size)) + r_nan__ = RANDOM_GEN.uniform(0., 1., size=(self.y_size, self.x_size)) r_nan__[:10, :10] = np.nan r_nan__ = da.from_array(r_nan__, chunks=(50, 50)) diff --git a/satpy/tests/reader_tests/test_goci2_l2_nc.py b/satpy/tests/reader_tests/test_goci2_l2_nc.py index 865ac3184e..da54e11848 100644 --- a/satpy/tests/reader_tests/test_goci2_l2_nc.py +++ b/satpy/tests/reader_tests/test_goci2_l2_nc.py @@ -24,6 +24,7 @@ from pytest_lazyfixture import lazy_fixture from satpy import Scene +from satpy.tests.utils import RANDOM_GEN # NOTE: # The following fixtures are not defined in this file, but are used and injected by Pytest: @@ -78,7 +79,7 @@ def _create_bad_lon_lat(): @pytest.fixture(scope="session") def ac_file(tmp_path_factory): """Create a fake atmospheric correction product.""" - data = np.random.random((10, 10)) + data = RANDOM_GEN.random((10, 10)) RhoC = xr.Dataset( {"RhoC_555": (["number_of_lines", "pixels_per_line"], data)}, coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, @@ -102,7 +103,7 @@ def ac_file(tmp_path_factory): @pytest.fixture(scope="module") def iop_file(tmp_path_factory): """Create a fake IOP product.""" - data = np.random.random((10, 10)) + data = RANDOM_GEN.random((10, 10)) a = xr.Dataset( {"a_total_555": (["number_of_lines", "pixels_per_line"], data)}, coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, @@ -124,7 +125,7 @@ def iop_file(tmp_path_factory): @pytest.fixture(scope="module") def generic_file(tmp_path_factory): """Create a fake ouput product like Chl, Zsd etc.""" - data = np.random.random((10, 10)) + data = RANDOM_GEN.random((10, 10)) geophysical_data = xr.Dataset( {"Chl": (["number_of_lines", "pixels_per_line"], data)}, coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, @@ -141,7 +142,7 @@ def generic_file(tmp_path_factory): @pytest.fixture(scope="module") def generic_bad_file(tmp_path_factory): """Create a PP product with lon/lat base name missing.""" - data = np.random.random((10, 10)) + data = RANDOM_GEN.random((10, 10)) geophysical_data = xr.Dataset( {"PP": (["number_of_lines", "pixels_per_line"], data)}, coords={"number_of_lines": np.arange(10), "pixels_per_line": np.arange(10)}, diff --git a/satpy/tests/reader_tests/test_hrit_base.py b/satpy/tests/reader_tests/test_hrit_base.py index 12317f11f1..eb4a073e02 100644 --- a/satpy/tests/reader_tests/test_hrit_base.py +++ b/satpy/tests/reader_tests/test_hrit_base.py @@ -30,6 +30,7 @@ from satpy.readers import FSFile from satpy.readers.hrit_base import HRITFileHandler, decompress, get_xritdecompress_cmd, get_xritdecompress_outfile +from satpy.tests.utils import RANDOM_GEN # NOTE: # The following fixtures are not defined in this file, but are used and injected by Pytest: @@ -145,9 +146,9 @@ def create_stub_hrit(filename, open_fun=open, meta=mda): lines = meta["number_of_lines"] cols = meta["number_of_columns"] total_bits = lines * cols * nbits - arr = np.random.randint(0, 256, - size=int(total_bits / 8), - dtype=np.uint8) + arr = RANDOM_GEN.integers(0, 256, + size=int(total_bits / 8), + dtype=np.uint8) with open_fun(filename, mode="wb") as fd: fd.write(b" " * meta["total_header_length"]) bytes_data = arr.tobytes() diff --git a/satpy/tests/reader_tests/test_insat3d_img_l1b_h5.py b/satpy/tests/reader_tests/test_insat3d_img_l1b_h5.py index 9fa7af224d..262e832f6a 100644 --- a/satpy/tests/reader_tests/test_insat3d_img_l1b_h5.py +++ b/satpy/tests/reader_tests/test_insat3d_img_l1b_h5.py @@ -16,7 +16,7 @@ open_dataset, open_datatree, ) -from satpy.tests.utils import make_dataid +from satpy.tests.utils import RANDOM_GEN, make_dataid # NOTE: # The following fixtures are not defined in this file, but are used and injected by Pytest: @@ -30,10 +30,10 @@ alb_units = "%" temp_units = "K" chunks_1km = (1, 46, 1126) -values_1km = np.random.randint(0, 1000, shape_1km, dtype=np.uint16) +values_1km = RANDOM_GEN.integers(0, 1000, shape_1km, dtype=np.uint16) values_1km[0, 0, 0] = 0 -values_4km = np.random.randint(0, 1000, shape_4km, dtype=np.uint16) -values_8km = np.random.randint(0, 1000, shape_8km, dtype=np.uint16) +values_4km = RANDOM_GEN.integers(0, 1000, shape_4km, dtype=np.uint16) +values_8km = RANDOM_GEN.integers(0, 1000, shape_8km, dtype=np.uint16) values_by_resolution = {1000: values_1km, 4000: values_4km, diff --git a/satpy/tests/reader_tests/test_mirs.py b/satpy/tests/reader_tests/test_mirs.py index b857147e47..3aeaacb2b0 100644 --- a/satpy/tests/reader_tests/test_mirs.py +++ b/satpy/tests/reader_tests/test_mirs.py @@ -31,6 +31,7 @@ from satpy.dataset import DataID from satpy.readers import load_reader from satpy.readers.yaml_reader import FileYAMLReader +from satpy.tests.utils import RANDOM_GEN METOP_FILE = "IMG_SX.M2.D17037.S1601.E1607.B0000001.WE.HR.ORB.nc" NPP_MIRS_L2_SWATH = "NPR-MIRS-IMG_v11r6_npp_s201702061601000_e201702061607000_c202012201658410.nc" @@ -77,7 +78,7 @@ def fake_coeff_from_fn(fn): """Create Fake Coefficients.""" - ameans = np.random.uniform(261, 267, N_CHANNEL) + ameans = RANDOM_GEN.uniform(261, 267, N_CHANNEL) locations = [ [1, 2], [1, 2], @@ -117,7 +118,7 @@ def fake_coeff_from_fn(fn): str_coeff = " ".join([str(x) for x in random_coeff]) random_means = np.zeros(all_nchx[nx]) str_means = " ".join([str(x) for x in random_means]) - error_val = np.random.uniform(0, 4) + error_val = RANDOM_GEN.uniform(0, 4) coeffs_line = " {:>2} {:>2} {} {} {}\n".format(idx, fov, str_coeff, str_means, @@ -138,7 +139,7 @@ def _get_datasets_with_attributes(**kwargs): "_FillValue": -999, "valid_range": [0, 50000]}, dims=("Scanline", "Field_of_view", "Channel")) - rr = xr.DataArray(np.random.randint(100, 500, size=(N_SCANLINE, N_FOV), dtype=np.int16), + rr = xr.DataArray(RANDOM_GEN.integers(100, 500, size=(N_SCANLINE, N_FOV), dtype=np.int16), attrs={"long_name": "Rain Rate (mm/hr)", "units": "mm/hr", "coordinates": "Longitude Latitude", @@ -146,7 +147,7 @@ def _get_datasets_with_attributes(**kwargs): "_FillValue": -999, "valid_range": [0, 1000]}, dims=("Scanline", "Field_of_view")) - sfc_type = xr.DataArray(np.random.randint(0, 4, size=(N_SCANLINE, N_FOV), dtype=np.int16), + sfc_type = xr.DataArray(RANDOM_GEN.integers(0, 4, size=(N_SCANLINE, N_FOV), dtype=np.int16), attrs={"description": "type of surface:0-ocean," + "1-sea ice,2-land,3-snow", "units": "1", @@ -187,12 +188,12 @@ def _get_datasets_with_less_attributes(): attrs={"long_name": "Channel Temperature (K)", "scale_factor": 0.01}, dims=("Scanline", "Field_of_view", "Channel")) - rr = xr.DataArray(np.random.randint(100, 500, size=(N_SCANLINE, N_FOV), dtype=np.int16), + rr = xr.DataArray(RANDOM_GEN.integers(100, 500, size=(N_SCANLINE, N_FOV), dtype=np.int16), attrs={"long_name": "Rain Rate (mm/hr)", "scale_factor": 0.1}, dims=("Scanline", "Field_of_view")) - sfc_type = xr.DataArray(np.random.randint(0, 4, size=(N_SCANLINE, N_FOV), dtype=np.int16), + sfc_type = xr.DataArray(RANDOM_GEN.integers(0, 4, size=(N_SCANLINE, N_FOV), dtype=np.int16), attrs={"description": "type of surface:0-ocean," + "1-sea ice,2-land,3-snow"}, dims=("Scanline", "Field_of_view")) diff --git a/satpy/tests/reader_tests/test_nwcsaf_msg.py b/satpy/tests/reader_tests/test_nwcsaf_msg.py index 1c8e0fb793..1a9b2ca3bf 100644 --- a/satpy/tests/reader_tests/test_nwcsaf_msg.py +++ b/satpy/tests/reader_tests/test_nwcsaf_msg.py @@ -26,12 +26,13 @@ import pytest from satpy.tests.reader_tests.utils import fill_h5 +from satpy.tests.utils import RANDOM_GEN -CTYPE_TEST_ARRAY = (np.random.rand(1856, 3712) * 255).astype(np.uint8) +CTYPE_TEST_ARRAY = (RANDOM_GEN.random((1856, 3712)) * 255).astype(np.uint8) CTYPE_TEST_FRAME = (np.arange(100).reshape(10, 10) / 100. * 20).astype(np.uint8) CTYPE_TEST_ARRAY[1000:1010, 1000:1010] = CTYPE_TEST_FRAME -CTTH_HEIGHT_TEST_ARRAY = (np.random.rand(1856, 3712) * 255).astype(np.uint8) +CTTH_HEIGHT_TEST_ARRAY = (RANDOM_GEN.random((1856, 3712)) * 255).astype(np.uint8) _CTTH_HEIGHT_TEST_FRAME = (np.arange(100).reshape(10, 10) / 100. * 80).astype(np.uint8) CTTH_HEIGHT_TEST_ARRAY[1000:1010, 1000:1010] = _CTTH_HEIGHT_TEST_FRAME @@ -39,7 +40,7 @@ CTTH_HEIGHT_TEST_FRAME_RES[0, 0:10] = np.nan CTTH_HEIGHT_TEST_FRAME_RES[1, 0:3] = np.nan -CTTH_PRESSURE_TEST_ARRAY = (np.random.rand(1856, 3712) * 255).astype(np.uint8) +CTTH_PRESSURE_TEST_ARRAY = (RANDOM_GEN.random((1856, 3712)) * 255).astype(np.uint8) _CTTH_PRESSURE_TEST_FRAME = (np.arange(100).reshape(10, 10) / 100. * 54).astype(np.uint8) CTTH_PRESSURE_TEST_ARRAY[1000:1010, 1000:1010] = _CTTH_PRESSURE_TEST_FRAME @@ -47,7 +48,7 @@ CTTH_PRESSURE_TEST_FRAME_RES[0, 0:10] = np.nan CTTH_PRESSURE_TEST_FRAME_RES[1, 0:9] = np.nan -CTTH_TEMPERATURE_TEST_ARRAY = (np.random.rand(1856, 3712) * 255).astype(np.uint8) +CTTH_TEMPERATURE_TEST_ARRAY = (RANDOM_GEN.random((1856, 3712)) * 255).astype(np.uint8) _CTTH_TEMPERATURE_TEST_FRAME = (np.arange(100).reshape(10, 10) / 100. * 140).astype(np.uint8) _CTTH_TEMPERATURE_TEST_FRAME[8, 5] = 255 CTTH_TEMPERATURE_TEST_ARRAY[1000:1010, 1000:1010] = _CTTH_TEMPERATURE_TEST_FRAME @@ -130,7 +131,7 @@ "PRODUCT": b"CT__", "SCALING_FACTOR": 1.0, }, - "value": (np.random.rand(1856, 3712) * 255).astype(np.uint8), + "value": (RANDOM_GEN.random((1856, 3712)) * 255).astype(np.uint8), }, "CT_QUALITY": { "attrs": { @@ -145,7 +146,7 @@ "PRODUCT": b"CT__", "SCALING_FACTOR": 1.0, }, - "value": (np.random.rand(1856, 3712) * 65535).astype(np.uint16), + "value": (RANDOM_GEN.random((1856, 3712)) * 65535).astype(np.uint16), }, "attrs": { "CFAC": 13642337, @@ -255,7 +256,7 @@ "PAL_COLORMODEL": b"RGB", "PAL_TYPE": b"DIRECTINDEX", }, - "value": (np.random.rand(128, 3) * 255).astype(np.uint8), + "value": (RANDOM_GEN.random((128, 3)) * 255).astype(np.uint8), }, "03-PALETTE": { "attrs": { @@ -263,7 +264,7 @@ "PAL_COLORMODEL": b"RGB", "PAL_TYPE": b"DIRECTINDEX", }, - "value": (np.random.rand(256, 3) * 255).astype(np.uint8), + "value": (RANDOM_GEN.random((256, 3)) * 255).astype(np.uint8), }, "04-PALETTE": { "attrs": { @@ -323,7 +324,7 @@ "PRODUCT": b"CTTH", "SCALING_FACTOR": 5.0, }, - "value": (np.random.rand(1856, 3712) * 255).astype(np.uint8), + "value": (RANDOM_GEN.random((1856, 3712)) * 255).astype(np.uint8), }, "CTTH_HEIGHT": { "attrs": { @@ -370,7 +371,7 @@ "PRODUCT": b"CTTH", "SCALING_FACTOR": 1.0, }, - "value": (np.random.rand(1856, 3712) * 65535).astype(np.uint16), + "value": (RANDOM_GEN.random((1856, 3712)) * 65535).astype(np.uint16), }, "CTTH_TEMPER": { "attrs": { diff --git a/satpy/tests/reader_tests/test_nwcsaf_nc.py b/satpy/tests/reader_tests/test_nwcsaf_nc.py index 4f6755f390..6a509f023f 100644 --- a/satpy/tests/reader_tests/test_nwcsaf_nc.py +++ b/satpy/tests/reader_tests/test_nwcsaf_nc.py @@ -22,6 +22,7 @@ import xarray as xr from satpy.readers.nwcsaf_nc import NcNWCSAF, read_nwcsaf_time +from satpy.tests.utils import RANDOM_GEN PROJ_KM = {"gdal_projection": "+proj=geos +a=6378.137000 +b=6356.752300 +lon_0=0.000000 +h=35785.863000", "gdal_xgeo_up_left": -5569500.0, @@ -83,9 +84,9 @@ COT_SCALE = 0.01 COT_OFFSET = 0.0 -CRE_ARRAY = np.random.randint(0, 65535, size=(928, 1530), dtype=np.uint16) -COT_ARRAY = np.random.randint(0, 65535, size=(928, 1530), dtype=np.uint16) -PAL_ARRAY = np.random.randint(0, 255, size=(250, 3), dtype=np.uint8) +CRE_ARRAY = RANDOM_GEN.integers(0, 65535, size=(928, 1530), dtype=np.uint16) +COT_ARRAY = RANDOM_GEN.integers(0, 65535, size=(928, 1530), dtype=np.uint16) +PAL_ARRAY = RANDOM_GEN.integers(0, 255, size=(250, 3), dtype=np.uint8) @pytest.fixture(scope="session") @@ -104,7 +105,7 @@ def create_nwcsaf_geo_ct_file(directory, attrs=global_attrs_geo): var = nc_file.create_variable(var_name, ("ny", "nx"), np.uint16, chunks=(256, 256)) - var[:] = np.random.randint(0, 255, size=(928, 1530), dtype=np.uint8) + var[:] = RANDOM_GEN.integers(0, 255, size=(928, 1530), dtype=np.uint8) return filename diff --git a/satpy/tests/reader_tests/test_seviri_l1b_hrit.py b/satpy/tests/reader_tests/test_seviri_l1b_hrit.py index 3fe00edc80..80a14e21f4 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_hrit.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_hrit.py @@ -31,7 +31,7 @@ from satpy.readers.seviri_l1b_hrit import HRITMSGEpilogueFileHandler, HRITMSGFileHandler, HRITMSGPrologueFileHandler from satpy.tests.reader_tests.test_seviri_base import ORBIT_POLYNOMIALS_INVALID from satpy.tests.reader_tests.test_seviri_l1b_calibration import TestFileHandlerCalibrationBase -from satpy.tests.utils import assert_attrs_equal, make_dataid +from satpy.tests.utils import RANDOM_GEN, assert_attrs_equal, make_dataid class TestHRITMSGBase(unittest.TestCase): @@ -64,9 +64,9 @@ def setUp(self): def test_read_hrv_band(self, memmap): """Test reading the hrv band.""" nbits = self.reader.mda["number_of_bits_per_pixel"] - memmap.return_value = np.random.randint(0, 256, - size=int((464 * 5568 * nbits) / 8), - dtype=np.uint8) + memmap.return_value = RANDOM_GEN.integers(0, 256, + size=int((464 * 5568 * nbits) / 8), + dtype=np.uint8) res = self.reader.read_band("HRV", None) assert res.shape == (464, 5568) @@ -181,9 +181,9 @@ def test_get_area_def(self): def test_read_band(self, memmap): """Test reading a band.""" nbits = self.reader.mda["number_of_bits_per_pixel"] - memmap.return_value = np.random.randint(0, 256, - size=int((464 * 3712 * nbits) / 8), - dtype=np.uint8) + memmap.return_value = RANDOM_GEN.integers(0, 256, + size=int((464 * 3712 * nbits) / 8), + dtype=np.uint8) res = self.reader.read_band("VIS006", None) assert res.shape == (464, 3712) diff --git a/satpy/tests/reader_tests/test_seviri_l2_bufr.py b/satpy/tests/reader_tests/test_seviri_l2_bufr.py index ec3fdf7b56..09e3fa93d5 100644 --- a/satpy/tests/reader_tests/test_seviri_l2_bufr.py +++ b/satpy/tests/reader_tests/test_seviri_l2_bufr.py @@ -27,7 +27,7 @@ import pytest from pyresample import geometry -from satpy.tests.utils import make_dataid +from satpy.tests.utils import RANDOM_GEN, make_dataid FILETYPE_INFO = {"file_type": "seviri_l2_bufr_asr"} @@ -109,9 +109,9 @@ ] # Test data -DATA = np.random.uniform(low=250, high=350, size=(128,)) -LAT = np.random.uniform(low=-80, high=80, size=(128,)) -LON = np.random.uniform(low=-38.5, high=121.5, size=(128,)) +DATA = RANDOM_GEN.uniform(low=250, high=350, size=(128,)) +LAT = RANDOM_GEN.uniform(low=-80, high=80, size=(128,)) +LON = RANDOM_GEN.uniform(low=-38.5, high=121.5, size=(128,)) class SeviriL2BufrData: diff --git a/satpy/tests/reader_tests/test_sgli_l1b.py b/satpy/tests/reader_tests/test_sgli_l1b.py index 7f5fffa70c..7c2551a211 100644 --- a/satpy/tests/reader_tests/test_sgli_l1b.py +++ b/satpy/tests/reader_tests/test_sgli_l1b.py @@ -8,14 +8,15 @@ import pytest from satpy.readers.sgli_l1b import HDF5SGLI +from satpy.tests.utils import RANDOM_GEN START_TIME = datetime.now() END_TIME = START_TIME + timedelta(minutes=5) FULL_KM_ARRAY = np.arange(1955 * 1250, dtype=np.uint16).reshape((1955, 1250)) MASK = 16383 LON_LAT_ARRAY = np.arange(197 * 126, dtype=np.float32).reshape((197, 126)) -AZI_ARRAY = np.random.randint(-180 * 100, 180 * 100, size=(197, 126), dtype=np.int16) -ZEN_ARRAY = np.random.randint(0, 180 * 100, size=(197, 126), dtype=np.int16) +AZI_ARRAY = RANDOM_GEN.integers(-180 * 100, 180 * 100, size=(197, 126), dtype=np.int16) +ZEN_ARRAY = RANDOM_GEN.integers(0, 180 * 100, size=(197, 126), dtype=np.int16) @pytest.fixture(scope="module") diff --git a/satpy/tests/reader_tests/test_viirs_compact.py b/satpy/tests/reader_tests/test_viirs_compact.py index ba8fa6f312..f27d9d6f32 100644 --- a/satpy/tests/reader_tests/test_viirs_compact.py +++ b/satpy/tests/reader_tests/test_viirs_compact.py @@ -24,6 +24,7 @@ import pytest from satpy.tests.reader_tests.utils import fill_h5 +from satpy.tests.utils import RANDOM_GEN # NOTE: # The following fixtures are not defined in this file, but are used and injected by Pytest: @@ -647,13 +648,13 @@ def fake_dnb(): dtype=np.float32, ) }, - "Latitude": {"value": np.random.rand(96, 332).astype(np.float32)}, - "Longitude": {"value": np.random.rand(96, 332).astype(np.float32)}, + "Latitude": {"value": RANDOM_GEN.random((96, 332)).astype(np.float32)}, + "Longitude": {"value": RANDOM_GEN.random((96, 332)).astype(np.float32)}, "LunarAzimuthAngle": { - "value": np.random.rand(96, 332).astype(np.float32) + "value": RANDOM_GEN.random((96, 332)).astype(np.float32) }, "LunarZenithAngle": { - "value": np.random.rand(96, 332).astype(np.float32) + "value": RANDOM_GEN.random((96, 332)).astype(np.float32) }, "MidTime": { "value": np.array( @@ -1170,16 +1171,16 @@ def fake_dnb(): ) }, "SatelliteAzimuthAngle": { - "value": np.random.rand(96, 332).astype(np.float32) + "value": RANDOM_GEN.random((96, 332)).astype(np.float32) }, "SatelliteZenithAngle": { - "value": np.random.rand(96, 332).astype(np.float32) + "value": RANDOM_GEN.random((96, 332)).astype(np.float32) }, "SolarAzimuthAngle": { - "value": np.random.rand(96, 332).astype(np.float32) + "value": RANDOM_GEN.random((96, 332)).astype(np.float32) }, "SolarZenithAngle": { - "value": np.random.rand(96, 332).astype(np.float32) + "value": RANDOM_GEN.random((96, 332)).astype(np.float32) }, "StartTime": { "value": np.array( @@ -1484,7 +1485,7 @@ def fake_dnb(): }, "PadByte1": {"value": np.array([0, 0, 0], dtype=np.uint8)}, "QF1_VIIRSDNBSDR": { - "value": (np.random.rand(768, 4064) * 255).astype(np.uint8) + "value": (RANDOM_GEN.random((768, 4064)) * 255).astype(np.uint8) }, "QF2_SCAN_SDR": { "value": np.array( @@ -1596,7 +1597,7 @@ def fake_dnb(): dtype=np.uint8, ) }, - "Radiance": {"value": np.random.rand(768, 4064).astype(np.float32)}, + "Radiance": {"value": RANDOM_GEN.random((768, 4064)).astype(np.float32)}, "attrs": { "OriginalFilename": np.array( [ diff --git a/satpy/tests/reader_tests/test_viirs_edr.py b/satpy/tests/reader_tests/test_viirs_edr.py index d764891760..6beb3c0cab 100644 --- a/satpy/tests/reader_tests/test_viirs_edr.py +++ b/satpy/tests/reader_tests/test_viirs_edr.py @@ -36,6 +36,8 @@ from pytest import TempPathFactory # noqa: PT013 from pytest_lazyfixture import lazy_fixture +from satpy.tests.utils import RANDOM_GEN + I_COLS = 6400 I_ROWS = 32 # one scan M_COLS = 3200 @@ -135,8 +137,8 @@ def _create_surf_refl_variables() -> dict[str, xr.DataArray]: sr_attrs = {"units": "unitless", "_FillValue": -9999, "scale_factor": np.float32(0.0001), "add_offset": np.float32(0.0)} - i_data = np.random.random_sample((I_ROWS, I_COLS)).astype(np.float32) - m_data = np.random.random_sample((M_ROWS, M_COLS)).astype(np.float32) + i_data = RANDOM_GEN.random((I_ROWS, I_COLS)).astype(np.float32) + m_data = RANDOM_GEN.random((M_ROWS, M_COLS)).astype(np.float32) lon_i_data = (i_data * 360) - 180.0 lon_m_data = (m_data * 360) - 180.0 lat_i_data = (i_data * 180) - 90.0 @@ -261,7 +263,7 @@ def _create_continuous_variables(var_names: Iterable[str]) -> dict[str, xr.DataA cont_attrs = {"units": "Kelvin", "_FillValue": -9999, "scale_factor": np.float32(0.0001), "add_offset": np.float32(0.0)} - m_data = np.random.random_sample((M_ROWS, M_COLS)).astype(np.float32) + m_data = RANDOM_GEN.random((M_ROWS, M_COLS)).astype(np.float32) data_arrs = { "Longitude": xr.DataArray(m_data, dims=dims, attrs=lon_attrs), "Latitude": xr.DataArray(m_data, dims=dims, attrs=lat_attrs), diff --git a/satpy/tests/test_composites.py b/satpy/tests/test_composites.py index c075755d17..780293b1e0 100644 --- a/satpy/tests/test_composites.py +++ b/satpy/tests/test_composites.py @@ -30,7 +30,7 @@ from pyresample import AreaDefinition import satpy -from satpy.tests.utils import CustomScheduler +from satpy.tests.utils import RANDOM_GEN, CustomScheduler # NOTE: # The following fixtures are not defined in this file, but are used and injected by Pytest: @@ -701,10 +701,10 @@ def test_compositor(self, e2d, input_shape, bands): """Test luminance sharpening compositor.""" from satpy.composites import SandwichCompositor - rgb_arr = da.from_array(np.random.random(input_shape), chunks=2) + rgb_arr = da.from_array(RANDOM_GEN.random(input_shape), chunks=2) rgb = xr.DataArray(rgb_arr, dims=["bands", "y", "x"], coords={"bands": bands}) - lum_arr = da.from_array(100 * np.random.random((2, 2)), chunks=2) + lum_arr = da.from_array(100 * RANDOM_GEN.random((2, 2)), chunks=2) lum = xr.DataArray(lum_arr, dims=["y", "x"]) # Make enhance2dataset return unmodified dataset diff --git a/satpy/tests/test_modifiers.py b/satpy/tests/test_modifiers.py index 0c8eb51b3f..148ea6692f 100644 --- a/satpy/tests/test_modifiers.py +++ b/satpy/tests/test_modifiers.py @@ -27,6 +27,8 @@ from pyresample.geometry import AreaDefinition, StackedAreaDefinition from pytest_lazyfixture import lazy_fixture +from satpy.tests.utils import RANDOM_GEN + def _sunz_area_def(): """Get fake area for testing sunz generation.""" @@ -213,23 +215,23 @@ def setUp(self): "area": area, "start_time": self.start_time} - nir_arr = np.random.random((2, 2)) + nir_arr = RANDOM_GEN.random((2, 2)) self.nir = xr.DataArray(da.from_array(nir_arr), dims=["y", "x"]) self.nir.attrs.update(self.metadata) - ir_arr = 100 * np.random.random((2, 2)) + ir_arr = 100 * RANDOM_GEN.random((2, 2)) self.ir_ = xr.DataArray(da.from_array(ir_arr), dims=["y", "x"]) self.ir_.attrs["area"] = area - self.sunz_arr = 100 * np.random.random((2, 2)) + self.sunz_arr = 100 * RANDOM_GEN.random((2, 2)) self.sunz = xr.DataArray(da.from_array(self.sunz_arr), dims=["y", "x"]) self.sunz.attrs["standard_name"] = "solar_zenith_angle" self.sunz.attrs["area"] = area self.da_sunz = da.from_array(self.sunz_arr) - refl_arr = np.random.random((2, 2)) + refl_arr = RANDOM_GEN.random((2, 2)) self.refl = da.from_array(refl_arr) - self.refl_with_co2 = da.from_array(np.random.random((2, 2))) + self.refl_with_co2 = da.from_array(RANDOM_GEN.random((2, 2))) self.refl_from_tbs = mock.MagicMock() self.refl_from_tbs.side_effect = self.fake_refl_from_tbs @@ -292,7 +294,7 @@ def test_no_sunz_with_co2(self, calculator, apply_modifier_info, sza): comp = NIRReflectance(name="test") info = {"modifiers": None} - co2_arr = np.random.random((2, 2)) + co2_arr = RANDOM_GEN.random((2, 2)) co2 = xr.DataArray(da.from_array(co2_arr), dims=["y", "x"]) co2.attrs["wavelength"] = [12.0, 13.0, 14.0] co2.attrs["units"] = "K" @@ -378,14 +380,14 @@ def test_compositor(self, calculator, apply_modifier_info, sza): """Test the NIR emissive part from reflectance compositor.""" from satpy.modifiers.spectral import NIRReflectance - refl_arr = np.random.random((2, 2)) + refl_arr = RANDOM_GEN.random((2, 2)) refl = da.from_array(refl_arr) refl_from_tbs = mock.MagicMock() refl_from_tbs.return_value = refl calculator.return_value = mock.MagicMock(reflectance_from_tbs=refl_from_tbs) - emissive_arr = np.random.random((2, 2)) + emissive_arr = RANDOM_GEN.random((2, 2)) emissive = da.from_array(emissive_arr) emissive_part = mock.MagicMock() emissive_part.return_value = emissive @@ -405,17 +407,17 @@ def test_compositor(self, calculator, apply_modifier_info, sza): get_lonlats.return_value = (lons, lats) area = mock.MagicMock(get_lonlats=get_lonlats) - nir_arr = np.random.random((2, 2)) + nir_arr = RANDOM_GEN.random((2, 2)) nir = xr.DataArray(da.from_array(nir_arr), dims=["y", "x"]) nir.attrs["platform_name"] = platform nir.attrs["sensor"] = sensor nir.attrs["name"] = chan_name nir.attrs["area"] = area - ir_arr = np.random.random((2, 2)) + ir_arr = RANDOM_GEN.random((2, 2)) ir_ = xr.DataArray(da.from_array(ir_arr), dims=["y", "x"]) ir_.attrs["area"] = area - sunz_arr = 100 * np.random.random((2, 2)) + sunz_arr = 100 * RANDOM_GEN.random((2, 2)) sunz = xr.DataArray(da.from_array(sunz_arr), dims=["y", "x"]) sunz.attrs["standard_name"] = "solar_zenith_angle" sunz.attrs["area"] = area diff --git a/satpy/tests/utils.py b/satpy/tests/utils.py index a6ebf8753e..13e771418c 100644 --- a/satpy/tests/utils.py +++ b/satpy/tests/utils.py @@ -37,6 +37,8 @@ FAKE_FILEHANDLER_START = datetime(2020, 1, 1, 0, 0, 0) FAKE_FILEHANDLER_END = datetime(2020, 1, 1, 1, 0, 0) +RANDOM_GEN = np.random.default_rng() + def make_dataid(**items): """Make a DataID with default keys.""" From 567df9da4651716be9c3e9f9a40e9a652c2b85b4 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Fri, 17 May 2024 08:42:24 +0200 Subject: [PATCH 447/481] Replace pytest-lazyfixture with pytest-lazy-fixtures --- continuous_integration/environment.yaml | 2 +- pyproject.toml | 8 ++++---- satpy/tests/reader_tests/modis_tests/test_modis_l1b.py | 2 +- satpy/tests/reader_tests/modis_tests/test_modis_l2.py | 2 +- satpy/tests/reader_tests/modis_tests/test_modis_l3.py | 2 +- satpy/tests/reader_tests/test_abi_l1b.py | 2 +- satpy/tests/reader_tests/test_fci_l1c_nc.py | 2 +- satpy/tests/reader_tests/test_goci2_l2_nc.py | 2 +- satpy/tests/reader_tests/test_seadas_l2.py | 2 +- satpy/tests/reader_tests/test_viirs_edr.py | 2 +- satpy/tests/test_modifiers.py | 2 +- satpy/tests/test_readers.py | 2 +- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/continuous_integration/environment.yaml b/continuous_integration/environment.yaml index 4fc7a508f2..2000efd37f 100644 --- a/continuous_integration/environment.yaml +++ b/continuous_integration/environment.yaml @@ -45,7 +45,6 @@ dependencies: - eccodes>=2.20 - pytest<8.0.0 - pytest-cov - - pytest-lazy-fixture - fsspec - botocore>=1.33 - s3fs @@ -59,6 +58,7 @@ dependencies: - ephem - bokeh - pip: + - pytest-lazy-fixtures - trollsift - trollimage>=1.23 - pyspectral diff --git a/pyproject.toml b/pyproject.toml index 01abbbd1ac..2fa0f27d94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,10 +83,10 @@ hvplot = ["hvplot", "geoviews", "cartopy", "holoviews"] overlays = ["pycoast", "pydecorate"] satpos_from_tle = ["skyfield", "astropy"] tests = ["behave", "h5py", "netCDF4", "pyhdf", "imageio", - "rasterio", "geoviews", "trollimage", "fsspec", "bottleneck", - "rioxarray", "pytest", "pytest-lazy-fixture", "defusedxml", - "s3fs", "eccodes", "h5netcdf", "xarray-datatree", - "skyfield", "ephem", "pint-xarray", "astropy", "dask-image", "python-geotiepoints", "numba"] + "rasterio", "geoviews", "trollimage", "fsspec", "bottleneck", + "rioxarray", "pytest", "pytest-lazy-fixtures", "defusedxml", + "s3fs", "eccodes", "h5netcdf", "xarray-datatree", + "skyfield", "ephem", "pint-xarray", "astropy", "dask-image", "python-geotiepoints", "numba"] [project.scripts] satpy_retrieve_all_aux_data = "satpy.aux_download:retrieve_all_cmd" diff --git a/satpy/tests/reader_tests/modis_tests/test_modis_l1b.py b/satpy/tests/reader_tests/modis_tests/test_modis_l1b.py index d4998a67f9..47f5f92c8e 100644 --- a/satpy/tests/reader_tests/modis_tests/test_modis_l1b.py +++ b/satpy/tests/reader_tests/modis_tests/test_modis_l1b.py @@ -22,7 +22,7 @@ import dask import numpy as np import pytest -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy import Scene, available_readers from satpy.tests.utils import CustomScheduler, make_dataid diff --git a/satpy/tests/reader_tests/modis_tests/test_modis_l2.py b/satpy/tests/reader_tests/modis_tests/test_modis_l2.py index 8876decb59..a30bfc392d 100644 --- a/satpy/tests/reader_tests/modis_tests/test_modis_l2.py +++ b/satpy/tests/reader_tests/modis_tests/test_modis_l2.py @@ -23,7 +23,7 @@ import dask.array as da import numpy as np import pytest -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy import Scene, available_readers from satpy.tests.utils import CustomScheduler, make_dataid diff --git a/satpy/tests/reader_tests/modis_tests/test_modis_l3.py b/satpy/tests/reader_tests/modis_tests/test_modis_l3.py index de8ff682a1..ca6c5e353a 100644 --- a/satpy/tests/reader_tests/modis_tests/test_modis_l3.py +++ b/satpy/tests/reader_tests/modis_tests/test_modis_l3.py @@ -23,7 +23,7 @@ import numpy as np import pytest from pyresample import geometry -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy import Scene, available_readers diff --git a/satpy/tests/reader_tests/test_abi_l1b.py b/satpy/tests/reader_tests/test_abi_l1b.py index 969c497410..37fd1d74c9 100644 --- a/satpy/tests/reader_tests/test_abi_l1b.py +++ b/satpy/tests/reader_tests/test_abi_l1b.py @@ -29,7 +29,7 @@ import numpy.typing as npt import pytest import xarray as xr -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy import DataQuery from satpy.readers.abi_l1b import NC_ABI_L1B diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index 792de90462..4bdf71e6b3 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -28,7 +28,7 @@ import pytest import xarray as xr from netCDF4 import default_fillvals -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy.readers.fci_l1c_nc import FCIL1cNCFileHandler from satpy.tests.reader_tests.test_netcdf_utils import FakeNetCDF4FileHandler diff --git a/satpy/tests/reader_tests/test_goci2_l2_nc.py b/satpy/tests/reader_tests/test_goci2_l2_nc.py index da54e11848..59bddefc88 100644 --- a/satpy/tests/reader_tests/test_goci2_l2_nc.py +++ b/satpy/tests/reader_tests/test_goci2_l2_nc.py @@ -21,7 +21,7 @@ import numpy as np import pytest import xarray as xr -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy import Scene from satpy.tests.utils import RANDOM_GEN diff --git a/satpy/tests/reader_tests/test_seadas_l2.py b/satpy/tests/reader_tests/test_seadas_l2.py index d3037e6b55..8343abbef2 100644 --- a/satpy/tests/reader_tests/test_seadas_l2.py +++ b/satpy/tests/reader_tests/test_seadas_l2.py @@ -20,7 +20,7 @@ import numpy as np import pytest from pyresample.geometry import SwathDefinition -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy import Scene, available_readers diff --git a/satpy/tests/reader_tests/test_viirs_edr.py b/satpy/tests/reader_tests/test_viirs_edr.py index 6beb3c0cab..74bd4a9ae4 100644 --- a/satpy/tests/reader_tests/test_viirs_edr.py +++ b/satpy/tests/reader_tests/test_viirs_edr.py @@ -34,7 +34,7 @@ import xarray as xr from pyresample import SwathDefinition from pytest import TempPathFactory # noqa: PT013 -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy.tests.utils import RANDOM_GEN diff --git a/satpy/tests/test_modifiers.py b/satpy/tests/test_modifiers.py index 148ea6692f..e8a0b4e539 100644 --- a/satpy/tests/test_modifiers.py +++ b/satpy/tests/test_modifiers.py @@ -25,7 +25,7 @@ import pytest import xarray as xr from pyresample.geometry import AreaDefinition, StackedAreaDefinition -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy.tests.utils import RANDOM_GEN diff --git a/satpy/tests/test_readers.py b/satpy/tests/test_readers.py index 4b477c6bdf..5e05f595b1 100644 --- a/satpy/tests/test_readers.py +++ b/satpy/tests/test_readers.py @@ -30,7 +30,7 @@ import numpy as np import pytest import xarray as xr -from pytest_lazyfixture import lazy_fixture +from pytest_lazy_fixtures import lf as lazy_fixture from satpy.dataset.data_dict import get_key from satpy.dataset.dataid import DataID, ModifierTuple, WavelengthRange From 3b9c04e85ff02d9ef1c15a502d76d89b696102f8 Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Mon, 20 May 2024 08:40:02 +0200 Subject: [PATCH 448/481] FIx rtd environment --- doc/rtd_environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/rtd_environment.yml b/doc/rtd_environment.yml index 1e40cbb73a..5058959236 100644 --- a/doc/rtd_environment.yml +++ b/doc/rtd_environment.yml @@ -18,7 +18,6 @@ dependencies: - pooch - pyresample - pytest - - pytest-lazy-fixture - python-eccodes - python-geotiepoints - rasterio @@ -34,4 +33,5 @@ dependencies: - xarray-datatree - pip: - graphviz + - pytest-lazy-fixtures - .. # relative path to the satpy project From 370467917a2fc373721614b56ebb463433d84a51 Mon Sep 17 00:00:00 2001 From: andream Date: Tue, 21 May 2024 18:00:58 +0200 Subject: [PATCH 449/481] add *= -1 in test --- satpy/tests/reader_tests/test_li_l2_nc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/satpy/tests/reader_tests/test_li_l2_nc.py b/satpy/tests/reader_tests/test_li_l2_nc.py index 5e9d0ff563..c5e02f93d0 100644 --- a/satpy/tests/reader_tests/test_li_l2_nc.py +++ b/satpy/tests/reader_tests/test_li_l2_nc.py @@ -627,6 +627,7 @@ def test_coords_generation(self, filetype_infos): projection = Proj(proj_dict) azimuth_vals = azimuth.values * point_height elevation_vals = elevation.values * point_height + azimuth_vals *= -1 lon_ref, lat_ref = projection(azimuth_vals, elevation_vals, inverse=True) # Convert to float32: lon_ref = lon_ref.astype(np.float32) From dd478273ab63abc56dc6d397c32183df94d27f5f Mon Sep 17 00:00:00 2001 From: andream Date: Tue, 21 May 2024 18:01:35 +0200 Subject: [PATCH 450/481] add *= -1 in reader code --- satpy/readers/li_base_nc.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/satpy/readers/li_base_nc.py b/satpy/readers/li_base_nc.py index eba9548985..cefbcc7e55 100644 --- a/satpy/readers/li_base_nc.py +++ b/satpy/readers/li_base_nc.py @@ -371,6 +371,9 @@ def inverse_projection(self, azimuth, elevation, proj_dict): azimuth = azimuth.values * point_height elevation = elevation.values * point_height + # In the MTG world, azimuth is defined as positive towards west, while proj expects it positive towards east + azimuth *= -1 + lon, lat = projection(azimuth, elevation, inverse=True) return np.stack([lon.astype(azimuth.dtype), lat.astype(elevation.dtype)]) From 766c4ece53fb8d7e4cb19ae5c00e2d7c023ad0bf Mon Sep 17 00:00:00 2001 From: andream Date: Tue, 21 May 2024 19:51:37 +0200 Subject: [PATCH 451/481] add a test to check 1-d and 2-d consistency --- satpy/tests/reader_tests/_li_test_utils.py | 16 ++++++---- satpy/tests/reader_tests/test_li_l2_nc.py | 34 ++++++++++++++++++---- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/satpy/tests/reader_tests/_li_test_utils.py b/satpy/tests/reader_tests/_li_test_utils.py index 32107006fc..051743b238 100644 --- a/satpy/tests/reader_tests/_li_test_utils.py +++ b/satpy/tests/reader_tests/_li_test_utils.py @@ -521,9 +521,13 @@ def accumulation_dimensions(nacc, nobs): def fci_grid_definition(axis, nobs): """FCI grid definition on X or Y axis.""" + scale_factor = 5.58871526031607e-5 + add_offset = -0.15561777642350116 if axis == "X": long_name = "azimuth angle encoded as column" standard_name = "projection_x_coordinate" + scale_factor *= -1 + add_offset *= -1 else: long_name = "zenith angle encoded as row" standard_name = "projection_y_coordinate" @@ -531,10 +535,10 @@ def fci_grid_definition(axis, nobs): return { "format": "i2", "shape": ("pixels",), - "add_offset": -0.155619516, + "add_offset": add_offset, "axis": axis, "long_name": long_name, - "scale_factor": 5.58878e-5, + "scale_factor": scale_factor, "standard_name": standard_name, "units": "radian", "valid_range": np.asarray([1, 5568]), @@ -548,12 +552,12 @@ def mtg_geos_projection(): "format": "i4", "shape": ("accumulations",), "grid_mapping_name": "geostationary", - "inverse_flattening": 298.2572221, + "inverse_flattening": 298.257223563, "latitude_of_projection_origin": 0, "longitude_of_projection_origin": 0, - "perspective_point_height": 42164000, - "semi_major_axis": 6378169, - "semi_minor_axis": 6356583.8, + "perspective_point_height": 3.57864e7, + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.31424518, "sweep_angle_axis": "y", "long_name": "MTG geostationary projection", "default_data": lambda: -2147483647 diff --git a/satpy/tests/reader_tests/test_li_l2_nc.py b/satpy/tests/reader_tests/test_li_l2_nc.py index c5e02f93d0..bba36a2155 100644 --- a/satpy/tests/reader_tests/test_li_l2_nc.py +++ b/satpy/tests/reader_tests/test_li_l2_nc.py @@ -592,7 +592,6 @@ def test_generate_coords_called_once(Self, filetype_infos): def test_coords_generation(self, filetype_infos): """Compare daskified coords generation results with non-daskified.""" - # Prepare dummy (but somewhat realistic) arrays of azimuth/elevation values. products = ["li_l2_af_nc", "li_l2_afr_nc", "li_l2_afa_nc"] @@ -601,11 +600,10 @@ def test_coords_generation(self, filetype_infos): handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, prod)) # Get azimuth/elevation arrays from handler - azimuth = handler.get_measured_variable(handler.swath_coordinates["azimuth"]) - azimuth = handler.apply_use_rescaling(azimuth) - - elevation = handler.get_measured_variable(handler.swath_coordinates["elevation"]) - elevation = handler.apply_use_rescaling(elevation) + x = handler.get_measured_variable(handler.swath_coordinates["azimuth"]) + azimuth = handler.apply_use_rescaling(x) + y = handler.get_measured_variable(handler.swath_coordinates["elevation"]) + elevation = handler.apply_use_rescaling(y) # Initialize proj_dict proj_var = handler.swath_coordinates["projection"] @@ -641,6 +639,30 @@ def test_coords_generation(self, filetype_infos): np.testing.assert_equal(lon, lon_ref) np.testing.assert_equal(lat, lat_ref) + + def test_coords_and_grid_consistency(self, filetype_infos): + """Compare computed latlon coords for 1-d version with latlon from areadef as for the gridded version.""" + handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_af_nc"), + with_area_definition=True) + + # Get azimuth/elevation arrays from handler + x = handler.get_measured_variable(handler.swath_coordinates["azimuth"]) + y = handler.get_measured_variable(handler.swath_coordinates["elevation"]) + + handler.generate_coords_from_scan_angles() + lon = handler.internal_variables["longitude"].values + lat = handler.internal_variables["latitude"].values + + dsid = make_dataid(name="flash_accumulation") + area_def = handler.get_area_def(dsid) + rows = (LI_GRID_SHAPE[0] - y.astype(int)) + cols = x.astype(int) - 1 + lon_areadef, lat_areadef = area_def.get_lonlat_from_array_coordinates(cols, rows) + + np.testing.assert_allclose(lon, lon_areadef, rtol=1e-3) + np.testing.assert_allclose(lat, lat_areadef, rtol=1e-3) + + def test_get_area_def_acc_products(self, filetype_infos): """Test retrieval of area def for accumulated products.""" handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_af_nc"), From 3c0d46fc6e01a23feb06819ce9245294f5d1c894 Mon Sep 17 00:00:00 2001 From: andream Date: Wed, 22 May 2024 10:20:02 +0200 Subject: [PATCH 452/481] rearrange and add comments to test --- satpy/tests/reader_tests/test_li_l2_nc.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/satpy/tests/reader_tests/test_li_l2_nc.py b/satpy/tests/reader_tests/test_li_l2_nc.py index bba36a2155..76b9e74e04 100644 --- a/satpy/tests/reader_tests/test_li_l2_nc.py +++ b/satpy/tests/reader_tests/test_li_l2_nc.py @@ -639,30 +639,30 @@ def test_coords_generation(self, filetype_infos): np.testing.assert_equal(lon, lon_ref) np.testing.assert_equal(lat, lat_ref) - def test_coords_and_grid_consistency(self, filetype_infos): """Compare computed latlon coords for 1-d version with latlon from areadef as for the gridded version.""" handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_af_nc"), - with_area_definition=True) + with_area_definition=True) - # Get azimuth/elevation arrays from handler + # Get cols/rows arrays from handler x = handler.get_measured_variable(handler.swath_coordinates["azimuth"]) y = handler.get_measured_variable(handler.swath_coordinates["elevation"]) + cols = x.astype(int) - 1 + rows = (LI_GRID_SHAPE[0] - y.astype(int)) + # compute lonlat from 1-d coords generation handler.generate_coords_from_scan_angles() lon = handler.internal_variables["longitude"].values lat = handler.internal_variables["latitude"].values + # compute lonlat from 2-d areadef dsid = make_dataid(name="flash_accumulation") area_def = handler.get_area_def(dsid) - rows = (LI_GRID_SHAPE[0] - y.astype(int)) - cols = x.astype(int) - 1 lon_areadef, lat_areadef = area_def.get_lonlat_from_array_coordinates(cols, rows) np.testing.assert_allclose(lon, lon_areadef, rtol=1e-3) np.testing.assert_allclose(lat, lat_areadef, rtol=1e-3) - def test_get_area_def_acc_products(self, filetype_infos): """Test retrieval of area def for accumulated products.""" handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, "li_l2_af_nc"), From 2799a3225e784cddd48f2f2ed989be4fec965ded Mon Sep 17 00:00:00 2001 From: andream Date: Wed, 22 May 2024 11:56:18 +0200 Subject: [PATCH 453/481] restore coordinates variable naming in coords test --- satpy/tests/reader_tests/test_li_l2_nc.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/satpy/tests/reader_tests/test_li_l2_nc.py b/satpy/tests/reader_tests/test_li_l2_nc.py index 76b9e74e04..24280539a1 100644 --- a/satpy/tests/reader_tests/test_li_l2_nc.py +++ b/satpy/tests/reader_tests/test_li_l2_nc.py @@ -600,10 +600,11 @@ def test_coords_generation(self, filetype_infos): handler = LIL2NCFileHandler("filename", {}, extract_filetype_info(filetype_infos, prod)) # Get azimuth/elevation arrays from handler - x = handler.get_measured_variable(handler.swath_coordinates["azimuth"]) - azimuth = handler.apply_use_rescaling(x) - y = handler.get_measured_variable(handler.swath_coordinates["elevation"]) - elevation = handler.apply_use_rescaling(y) + azimuth = handler.get_measured_variable(handler.swath_coordinates["azimuth"]) + azimuth = handler.apply_use_rescaling(azimuth) + + elevation = handler.get_measured_variable(handler.swath_coordinates["elevation"]) + elevation = handler.apply_use_rescaling(elevation) # Initialize proj_dict proj_var = handler.swath_coordinates["projection"] From 1b52311852fecbb1cd1daef1233fa755315f298e Mon Sep 17 00:00:00 2001 From: andream Date: Wed, 22 May 2024 12:01:45 +0200 Subject: [PATCH 454/481] update comments and error message --- satpy/readers/li_l2_nc.py | 2 +- satpy/tests/reader_tests/test_li_l2_nc.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/readers/li_l2_nc.py b/satpy/readers/li_l2_nc.py index 4fe0826380..891372d596 100644 --- a/satpy/readers/li_l2_nc.py +++ b/satpy/readers/li_l2_nc.py @@ -73,7 +73,7 @@ def get_area_def(self, dsid): if var_with_swath_coord and self.with_area_def: return get_area_def("mtg_fci_fdss_2km") - raise NotImplementedError("Area definition is not supported for accumulated products.") + raise NotImplementedError("Area definition is not supported for non-accumulated products.") def is_var_with_swath_coord(self, dsid): """Check if the variable corresponding to this dataset is listed as variable with swath coordinates.""" diff --git a/satpy/tests/reader_tests/test_li_l2_nc.py b/satpy/tests/reader_tests/test_li_l2_nc.py index 24280539a1..1a198a7831 100644 --- a/satpy/tests/reader_tests/test_li_l2_nc.py +++ b/satpy/tests/reader_tests/test_li_l2_nc.py @@ -651,7 +651,7 @@ def test_coords_and_grid_consistency(self, filetype_infos): cols = x.astype(int) - 1 rows = (LI_GRID_SHAPE[0] - y.astype(int)) - # compute lonlat from 1-d coords generation + # compute lonlat from 1-d coords generation (called when with_area_definition==False) handler.generate_coords_from_scan_angles() lon = handler.internal_variables["longitude"].values lat = handler.internal_variables["latitude"].values From 54fbb1137e0b528ae9a6640cf8af5adad07d1afb Mon Sep 17 00:00:00 2001 From: clement laplace Date: Thu, 23 May 2024 09:38:55 +0000 Subject: [PATCH 455/481] typo: Add the typo modification asked by mraspo as shown in https://github.com/pytroll/satpy/pull/2778 --- satpy/etc/readers/fci_l1c_nc.yaml | 110 +++++++------------- satpy/readers/fci_l1c_nc.py | 2 +- satpy/tests/reader_tests/test_fci_l1c_nc.py | 2 +- 3 files changed, 40 insertions(+), 74 deletions(-) diff --git a/satpy/etc/readers/fci_l1c_nc.yaml b/satpy/etc/readers/fci_l1c_nc.yaml index dee588aff9..7b4ead398e 100644 --- a/satpy/etc/readers/fci_l1c_nc.yaml +++ b/satpy/etc/readers/fci_l1c_nc.yaml @@ -18,9 +18,7 @@ file_types: fci_l1c_fdhsi: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-FDHSI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-FDHSI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc" expected_segments: 40 required_netcdf_variables: &required-variables - attr/platform @@ -71,9 +69,7 @@ file_types: fci_l1c_hrfi: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-HRFI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-HRFI-{coverage}-{subsetting}-{component1}-BODY-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{count_in_repeat_cycle:>04d}.nc" expected_segments: 40 required_netcdf_variables: *required-variables variable_name_replacements: @@ -87,12 +83,11 @@ file_types: fci_l1c_af_vis_06: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-1KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-1KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-1KM-{coverage}-VIS06-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -101,10 +96,8 @@ file_types: fci_l1c_af_vis_04: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS04-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -113,10 +106,8 @@ file_types: fci_l1c_af_vis_05: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS05-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -125,10 +116,8 @@ file_types: fci_l1c_af_vis_08: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS08-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -137,10 +126,8 @@ file_types: fci_l1c_af_vis_09: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-VIS09-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -149,10 +136,8 @@ file_types: fci_l1c_af_nir_13: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-NIR13-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -161,10 +146,8 @@ file_types: fci_l1c_af_nir_16: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-NIR16-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -173,10 +156,8 @@ file_types: fci_l1c_af_nir_22: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-NIR22-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -185,10 +166,8 @@ file_types: fci_l1c_af_ir_38: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR38-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -197,10 +176,8 @@ file_types: fci_l1c_af_wv_63: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-WV63-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -209,10 +186,8 @@ file_types: fci_l1c_af_wv_73: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-WV73-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -221,10 +196,8 @@ file_types: fci_l1c_af_ir_87: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR87-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -233,10 +206,8 @@ file_types: fci_l1c_af_ir_97: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR97-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -245,10 +216,9 @@ file_types: fci_l1c_af_ir_105: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR105-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -257,10 +227,8 @@ file_types: fci_l1c_af_ir_123: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR123-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: @@ -269,10 +237,8 @@ file_types: fci_l1c_af_ir_133: file_reader: !!python/name:satpy.readers.fci_l1c_nc.FCIL1cNCFileHandler file_patterns: - [ - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc", - ] + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}-{data_source}-1C-RRAD-3KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" + - "{pflag}_{location_indicator},{data_designator},MTI{spacecraft_id:1d}+{data_source}-1C-RRAD-3KM-{coverage}-IR133-{component1}-x-{component3}-{purpose}-{format}_{oflag}_{originator}_{processing_time:%Y%m%d%H%M%S}_{facility_or_tool}_{environment}_{start_time:%Y%m%d%H%M%S}_{end_time:%Y%m%d%H%M%S}_{processing_mode}_{special_compression}_{disposition_mode}_{repeat_cycle_in_day:>04d}_{erraneous_count_in_repeat_cycle:>04d}.nc" expected_segments: 1 required_netcdf_variables: *required-variables variable_name_replacements: diff --git a/satpy/readers/fci_l1c_nc.py b/satpy/readers/fci_l1c_nc.py index f94377b91c..6499b0c657 100644 --- a/satpy/readers/fci_l1c_nc.py +++ b/satpy/readers/fci_l1c_nc.py @@ -29,7 +29,7 @@ .. note:: This reader currently supports Full Disk High Spectral Resolution Imagery - (FDHSI) ,High Spatial Resolution Fast Imagery (HRFI) data in full-disc ("FD") scanning mode. + (FDHSI), High Spatial Resolution Fast Imagery (HRFI) data in full-disc ("FD") scanning mode. In addition it also supports the L1C format for the African dissemination ("AF"), where each file contains the masked full-dic of a single channel see `AF PUG`_. If the user provides a list of both FDHSI and HRFI files from the same repeat cycle to the Satpy ``Scene``, diff --git a/satpy/tests/reader_tests/test_fci_l1c_nc.py b/satpy/tests/reader_tests/test_fci_l1c_nc.py index 98777d0e51..b278c2b230 100644 --- a/satpy/tests/reader_tests/test_fci_l1c_nc.py +++ b/satpy/tests/reader_tests/test_fci_l1c_nc.py @@ -682,7 +682,7 @@ def test_load_calibration(self, reader_configs, fh_param, assert expected_res_n[res_type] == len(res) for ch, grid_type in zip(list_chan, list_grid): - self._get_assert_load(res,ch,grid_type,DICT_CALIBRATION[calibration]) + self._get_assert_load(res, ch, grid_type, DICT_CALIBRATION[calibration]) @pytest.mark.parametrize(("calibration", "channel", "resolution"), [ (calibration, channel, resolution) From 4a052bc941c4408a8ee8205d0f98411bca74ec64 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 27 May 2024 21:28:56 +0800 Subject: [PATCH 456/481] Update msi.yaml --- satpy/etc/composites/msi.yaml | 121 ++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 55 deletions(-) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index 74dd859dfd..d357ed5d8b 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -1,133 +1,144 @@ sensor_name: visir/msi modifiers: - rayleigh_corr: + rayleigh_corrected: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: rayleigh_only prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_antarctic: + rayleigh_corrected_antarctic: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: antarctic_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_continental_average: + rayleigh_corrected_continental_average: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: continental_average_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_continental_clean: + rayleigh_corrected_continental_clean: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: continental_clean_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_continental_polluted: + rayleigh_corrected_continental_polluted: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: continental_polluted_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_desert: + rayleigh_corrected_desert: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: desert_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_marine_clean: + rayleigh_corrected_marine_clean: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: marine_clean_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_marine_polluted: + rayleigh_corrected_marine_polluted: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: marine_polluted_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_marine_tropical: + rayleigh_corrected_marine_tropical: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: marine_tropical_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_rural: + rayleigh_corrected_rural: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: rural_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle - name: solar_zenith_angle - rayleigh_corr_urban: + rayleigh_corrected_urban: modifier: !!python/name:satpy.modifiers.PSPRayleighReflectance atmosphere: us-standard aerosol_type: urban_aerosol prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] + modifiers: [sunz_corrected] + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle @@ -149,121 +160,121 @@ composites: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] standard_name: true_color true_color_antarctic: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_antarctic] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_antarctic] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_antarctic] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_antarctic] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_antarctic] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_antarctic] standard_name: true_color true_color_continental_average: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_average] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_continental_average] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_average] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_continental_average] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_average] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_continental_average] standard_name: true_color true_color_continental_clean: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_clean] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_continental_clean] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_clean] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_continental_clean] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_clean] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_continental_clean] standard_name: true_color true_color_continental_polluted: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_polluted] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_continental_polluted] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_polluted] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_continental_polluted] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_continental_polluted] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_continental_polluted] standard_name: true_color true_color_desert: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_desert] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_desert] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_desert] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_desert] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_desert] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_desert] standard_name: true_color true_color_marine_clean: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_clean] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_clean] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_clean] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_clean] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_clean] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_clean] standard_name: true_color true_color_marine_polluted: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_polluted] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_polluted] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_polluted] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_polluted] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_polluted] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_polluted] standard_name: true_color true_color_marine_tropical: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_tropical] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_tropical] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_tropical] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_tropical] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_marine_tropical] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_marine_tropical] standard_name: true_color true_color_rural: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_rural] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_rural] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_rural] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_rural] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_rural] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_rural] standard_name: true_color true_color_urban: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B04' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_urban] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_urban] - name: 'B03' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_urban] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_urban] - name: 'B02' - modifiers: [effective_solar_pathlength_corrected, rayleigh_corr_urban] + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected_urban] standard_name: true_color true_color_uncorr: From b7c1b8e3c0388ce71facd1b10bfc4b4a7186ac19 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 27 May 2024 21:30:45 +0800 Subject: [PATCH 457/481] Update msi.yaml --- satpy/etc/composites/msi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index d357ed5d8b..06bcd7bb5b 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -8,7 +8,7 @@ modifiers: prerequisites: - name: 'B04' modifiers: [sunz_corrected] - optional_prerequisites: + optional_prerequisites: - name: satellite_azimuth_angle - name: satellite_zenith_angle - name: solar_azimuth_angle From d968b4019e95e7ae161156491a7fdab54c492987 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 27 May 2024 23:23:41 +0800 Subject: [PATCH 458/481] dataid issues --- satpy/dataset/dataid.py | 2 -- satpy/etc/readers/msi_safe_l2a.yaml | 9 +++++++ satpy/tests/reader_tests/test_msi_safe.py | 33 +++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/satpy/dataset/dataid.py b/satpy/dataset/dataid.py index 7bca3d0147..3eadb2dc2c 100644 --- a/satpy/dataset/dataid.py +++ b/satpy/dataset/dataid.py @@ -255,8 +255,6 @@ def __hash__(self): "radiance", "radiance_wavenumber", "counts", - "aerosol_thickness", - "water_vapor" ], "transitive": True, }, diff --git a/satpy/etc/readers/msi_safe_l2a.yaml b/satpy/etc/readers/msi_safe_l2a.yaml index e11b521f51..a1e8d9e171 100644 --- a/satpy/etc/readers/msi_safe_l2a.yaml +++ b/satpy/etc/readers/msi_safe_l2a.yaml @@ -9,6 +9,15 @@ reader: default_channels: [] reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader +data_identification_keys: + calibration: + enum: + - reflectance + - radiance + - counts + - aerosol_thickness + - water_vapor + file_types: l2a_safe_granule_10m: file_reader: !!python/name:satpy.readers.msi_safe.SAFEMSIL1C diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index d2de3e1a54..0227e469da 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1449,6 +1449,39 @@ def jp2_builder(process_level, band_name, mask_saturated=True): jp2_fh = SAFEMSIL1C("somefile", filename_info, mock.MagicMock(), xml_fh, tile_xml_fh) return jp2_fh +def make_dataid(**items): + """Make a DataID with modified keys.""" + from satpy.dataset.dataid import WavelengthRange, ModifierTuple, DataID + modified_id_keys_config = { + "name": { + "required": True, + }, + "wavelength": { + "type": WavelengthRange, + }, + "resolution": { + "transitive": False, + }, + "calibration": { + "enum": [ + "reflectance", + "brightness_temperature", + "radiance", + "radiance_wavenumber", + "counts", + "aerosol_thickness", + "water_vapor" + ], + "transitive": True, + }, + "modifiers": { + "default": ModifierTuple(), + "type": ModifierTuple, + }, + } + + return DataID(modified_id_keys_config, **items) + class TestTileXML: """Test the SAFE TILE XML file handler. From 8194060be12b659d13764f6a82238d7712a3169a Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Mon, 27 May 2024 23:37:44 +0800 Subject: [PATCH 459/481] Update test_msi_safe.py --- satpy/tests/reader_tests/test_msi_safe.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 0227e469da..d6fe6808a1 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -24,8 +24,6 @@ import pytest import xarray as xr -from satpy.tests.utils import make_dataid - # Datetimes used for checking start time is correctly set. fname_dt = datetime(2020, 10, 1, 18, 35, 41) tilemd_dt = datetime(2020, 10, 1, 16, 34, 23, 153611) @@ -1449,7 +1447,7 @@ def jp2_builder(process_level, band_name, mask_saturated=True): jp2_fh = SAFEMSIL1C("somefile", filename_info, mock.MagicMock(), xml_fh, tile_xml_fh) return jp2_fh -def make_dataid(**items): +def make_alt_dataid(**items): """Make a DataID with modified keys.""" from satpy.dataset.dataid import WavelengthRange, ModifierTuple, DataID modified_id_keys_config = { @@ -1542,7 +1540,7 @@ def test_angles(self, process_level, angle_name, angle_tag, expected): dict(xml_tag=angle_tag[0] + "/" + angle_tag[1]) xml_tile_fh = xml_builder(process_level)[1] - res = xml_tile_fh.get_dataset(make_dataid(name=angle_name, resolution=60), info) + res = xml_tile_fh.get_dataset(make_alt_dataid(name=angle_name, resolution=60), info) if res is not None: res = res[::200, ::200] @@ -1561,7 +1559,7 @@ def test_navigation(self): from pyproj import CRS crs = CRS("EPSG:32616") - dsid = make_dataid(name="B01", resolution=60) + dsid = make_alt_dataid(name="B01", resolution=60) xml_tile_fh = xml_builder("L1C")[1] result = xml_tile_fh.get_area_def(dsid) area_extent = (499980.0, 3590220.0, 609780.0, 3700020.0) @@ -1657,7 +1655,7 @@ def test_calibration_and_masking(self, mask_saturated, dataset_name, calibration jp2_fh = jp2_builder("L2A", dataset_name.replace("_L2A", ""), mask_saturated) with mock.patch("xarray.open_dataset", return_value=self.fake_data): - res = jp2_fh.get_dataset(make_dataid(name=dataset_name, calibration=calibration), info=dict()) + res = jp2_fh.get_dataset(make_alt_dataid(name=dataset_name, calibration=calibration), info=dict()) if res is not None: np.testing.assert_allclose(res, expected) else: @@ -1673,8 +1671,8 @@ def test_filename_dsname_mismatch(self, process_level, band_name, dataset_name): jp2_fh = jp2_builder(process_level, band_name) with mock.patch("xarray.open_dataset", return_value=self.fake_data): - res1 = jp2_fh.get_dataset(make_dataid(name=dataset_name), info=dict()) - res2 = jp2_fh.get_area_def(make_dataid(name=dataset_name)) + res1 = jp2_fh.get_dataset(make_alt_dataid(name=dataset_name), info=dict()) + res2 = jp2_fh.get_area_def(make_alt_dataid(name=dataset_name)) assert res1 is None assert res2 is None From 911a6b636d08c165316f026f5f7e6d37b8fa408d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 15:39:51 +0000 Subject: [PATCH 460/481] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- satpy/tests/reader_tests/test_msi_safe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index d6fe6808a1..46a416977b 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1449,7 +1449,7 @@ def jp2_builder(process_level, band_name, mask_saturated=True): def make_alt_dataid(**items): """Make a DataID with modified keys.""" - from satpy.dataset.dataid import WavelengthRange, ModifierTuple, DataID + from satpy.dataset.dataid import DataID, ModifierTuple, WavelengthRange modified_id_keys_config = { "name": { "required": True, From 6d18e86e2eeed3125bd32dd899d3b046eb43f18c Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 28 May 2024 09:42:59 +0800 Subject: [PATCH 461/481] dataid --- satpy/dataset/dataid.py | 2 +- satpy/etc/readers/msi_safe_l2a.yaml | 27 ++++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/satpy/dataset/dataid.py b/satpy/dataset/dataid.py index 3eadb2dc2c..d8301bc453 100644 --- a/satpy/dataset/dataid.py +++ b/satpy/dataset/dataid.py @@ -254,7 +254,7 @@ def __hash__(self): "brightness_temperature", "radiance", "radiance_wavenumber", - "counts", + "counts" ], "transitive": True, }, diff --git a/satpy/etc/readers/msi_safe_l2a.yaml b/satpy/etc/readers/msi_safe_l2a.yaml index a1e8d9e171..bc9ca92552 100644 --- a/satpy/etc/readers/msi_safe_l2a.yaml +++ b/satpy/etc/readers/msi_safe_l2a.yaml @@ -8,15 +8,24 @@ reader: sensors: [msi] default_channels: [] reader: !!python/name:satpy.readers.yaml_reader.FileYAMLReader - -data_identification_keys: - calibration: - enum: - - reflectance - - radiance - - counts - - aerosol_thickness - - water_vapor + data_identification_keys: + name: + required: true + wavelength: + type: !!python/name:satpy.dataset.dataid.WavelengthRange + resolution: + transitive: false + calibration: + enum: + - reflectance + - radiance + - counts + - aerosol_thickness + - water_vapor + transitive: true + modifiers: + default: [] + type: !!python/name:satpy.dataset.dataid.ModifierTuple file_types: l2a_safe_granule_10m: From 82f742f133df5ff22c4cbf66c90fa57fc6f1c2d8 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 28 May 2024 10:04:19 +0800 Subject: [PATCH 462/481] Update msi.yaml --- satpy/etc/composites/msi.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index 06bcd7bb5b..11dc3fa000 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -150,6 +150,7 @@ composites: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - name: 'B11' + modifiers: [effective_solar_pathlength_corrected] - name: 'B08' modifiers: [effective_solar_pathlength_corrected] - name: 'B04' From d2e3c9f1d205fa2dae3f093b298157ea97153a99 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 28 May 2024 11:07:46 +0800 Subject: [PATCH 463/481] composites --- satpy/etc/composites/msi.yaml | 200 +++++++++++++++++----------- satpy/etc/readers/msi_safe_l2a.yaml | 12 ++ 2 files changed, 137 insertions(+), 75 deletions(-) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index 11dc3fa000..3681cf5183 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -146,17 +146,6 @@ modifiers: composites: - natural_color: - compositor: !!python/name:satpy.composites.GenericCompositor - prerequisites: - - name: 'B11' - modifiers: [effective_solar_pathlength_corrected] - - name: 'B08' - modifiers: [effective_solar_pathlength_corrected] - - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] - standard_name: natural_color - true_color: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: @@ -292,34 +281,45 @@ composites: true_color_raw: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B04' - #modifiers: [effective_solar_pathlength_corrected] - - name: 'B03' - #modifiers: [effective_solar_pathlength_corrected] - - name: 'B02' - #modifiers: [effective_solar_pathlength_corrected] + - name: 'B04' + # modifiers: [effective_solar_pathlength_corrected] + - name: 'B03' + # modifiers: [effective_solar_pathlength_corrected] + - name: 'B02' + # modifiers: [effective_solar_pathlength_corrected] standard_name: true_color - urban_color: + natural_color: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B12' - modifiers: [effective_solar_pathlength_corrected] - name: 'B11' modifiers: [effective_solar_pathlength_corrected] - - name: 'B04' + - name: 'B08' modifiers: [effective_solar_pathlength_corrected] + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] + standard_name: natural_color + + urban_color: + compositor: !!python/name:satpy.composites.GenericCompositor + prerequisites: + - name: 'B12' + modifiers: [effective_solar_pathlength_corrected] + - name: 'B11' + modifiers: [effective_solar_pathlength_corrected] + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] standard_name: natural_color false_color: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B08' - modifiers: [effective_solar_pathlength_corrected] - - name: 'B04' - modifiers: [effective_solar_pathlength_corrected] - - name: 'B03' - modifiers: [effective_solar_pathlength_corrected] + - name: 'B08' + modifiers: [effective_solar_pathlength_corrected] + - name: 'B04' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] + - name: 'B03' + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] standard_name: natural_color ndvi: @@ -331,12 +331,16 @@ composites: prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B08 - - name: B04 + - name: B08 + modifiers: [effective_solar_pathlength_corrected] + - name: B04 + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B08 - - name: B04 + - name: B08 + modifiers: [effective_solar_pathlength_corrected] + - name: B04 + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] standard_name: ndvi_msi ndmi: @@ -348,12 +352,16 @@ composites: prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B08 - - name: B11 + - name: B08 + modifiers: [effective_solar_pathlength_corrected] + - name: B11 + modifiers: [effective_solar_pathlength_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B08 - - name: B11 + - name: B08 + modifiers: [effective_solar_pathlength_corrected] + - name: B11 + modifiers: [effective_solar_pathlength_corrected] standard_name: ndmi_msi ndwi: @@ -365,12 +373,16 @@ composites: prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B03 - - name: B08 + - name: B03 + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] + - name: B08 + modifiers: [effective_solar_pathlength_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B03 - - name: B08 + - name: B03 + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] + - name: B08 + modifiers: [effective_solar_pathlength_corrected] standard_name: ndwi_msi ndsi: @@ -379,59 +391,78 @@ composites: compositor: !!python/name:satpy.composites.MaskingCompositor prerequisites: - name: B11 + modifiers: [effective_solar_pathlength_corrected] - compositor: !!python/name:satpy.composites.RatioCompositor prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B03 - - name: B11 + - name: B03 + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] + - name: B11 + modifiers: [effective_solar_pathlength_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B03 - - name: B11 + - name: B03 + modifiers: [effective_solar_pathlength_corrected, rayleigh_corrected] + - name: B11 + modifiers: [effective_solar_pathlength_corrected] conditions: - method: less_equal value: 0.42 transparency: 100 + - method: isnan + transparency: 100 standard_name: ndsi_msi ndsi_with_true_color: compositor: !!python/name:satpy.composites.BackgroundCompositor prerequisites: - - name: ndsi - - name: true_color + - name: ndsi + - name: true_color standard_name: no_enhancement true_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B04_L2A' - - name: 'B03_L2A' - - name: 'B02_L2A' + - name: 'B04_L2A' + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] + - name: 'B03_L2A' + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] + - name: 'B02_L2A' + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: true_color natural_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B11_L2A' - - name: 'B08_L2A' - - name: 'B04_L2A' + - name: 'B11_L2A' + modifiers: [esa_sunz_corrected] + - name: 'B08_L2A' + modifiers: [esa_sunz_corrected] + - name: 'B04_L2A' + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: natural_color urban_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B12_L2A' - - name: 'B11_L2A' - - name: 'B04_L2A' + - name: 'B12_L2A' + modifiers: [esa_sunz_corrected] + - name: 'B11_L2A' + modifiers: [esa_sunz_corrected] + - name: 'B04_L2A' + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: natural_color false_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B08_L2A' - - name: 'B04_L2A' - - name: 'B03_L2A' + - name: 'B08_L2A' + modifiers: [esa_sunz_corrected] + - name: 'B04_L2A' + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] + - name: 'B03_L2A' + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: natural_color aerosol_optical_thickness: @@ -463,12 +494,16 @@ composites: prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B08_L2A - - name: B04_L2A + - name: B08_L2A + modifiers: [esa_sunz_corrected] + - name: B04_L2A + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B08_L2A - - name: B04_L2A + - name: B08_L2A + modifiers: [esa_sunz_corrected] + - name: B04_L2A + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: ndvi_msi ndmi_l2a: @@ -480,12 +515,16 @@ composites: prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B8A_L2A - - name: B11_L2A + - name: B8A_L2A + modifiers: [esa_sunz_corrected] + - name: B11_L2A + modifiers: [esa_sunz_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B8A_L2A - - name: B11_L2A + - name: B8A_L2A + modifiers: [esa_sunz_corrected] + - name: B11_L2A + modifiers: [esa_sunz_corrected] standard_name: ndmi_msi ndwi_l2a: @@ -497,12 +536,16 @@ composites: prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B03_L2A - - name: B08_L2A + - name: B03_L2A + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] + - name: B08_L2A + modifiers: [esa_sunz_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B03_L2A - - name: B08_L2A + - name: B03_L2A + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] + - name: B08_L2A + modifiers: [esa_sunz_corrected] standard_name: ndwi_msi ndsi_l2a: @@ -511,25 +554,32 @@ composites: compositor: !!python/name:satpy.composites.MaskingCompositor prerequisites: - name: B11_L2A + modifiers: [esa_sunz_corrected] - compositor: !!python/name:satpy.composites.RatioCompositor prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B03_L2A - - name: B11_L2A + - name: B03_L2A + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] + - name: B11_L2A + modifiers: [esa_sunz_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B03_L2A - - name: B11_L2A + - name: B03_L2A + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] + - name: B11_L2A + modifiers: [esa_sunz_corrected] conditions: - method: less_equal value: 0.42 transparency: 100 + - method: isnan + transparency: 100 standard_name: ndsi_msi ndsi_l2a_with_true_color_l2a: compositor: !!python/name:satpy.composites.BackgroundCompositor prerequisites: - - name: ndsi_l2a - - name: true_color_l2a + - name: ndsi_l2a + - name: true_color_l2a standard_name: no_enhancement diff --git a/satpy/etc/readers/msi_safe_l2a.yaml b/satpy/etc/readers/msi_safe_l2a.yaml index bc9ca92552..5972f6b0f2 100644 --- a/satpy/etc/readers/msi_safe_l2a.yaml +++ b/satpy/etc/readers/msi_safe_l2a.yaml @@ -52,6 +52,7 @@ datasets: name: B01_L2A sensor: msi wavelength: [0.415, 0.443, 0.470] + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} @@ -70,6 +71,7 @@ datasets: name: B02_L2A sensor: msi wavelength: [0.440, 0.490, 0.540] + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] resolution: 10: {file_type: l2a_safe_granule_10m} 20: {file_type: l2a_safe_granule_20m} @@ -89,6 +91,7 @@ datasets: name: B03_L2A sensor: msi wavelength: [0.540, 0.560, 0.580] + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] resolution: 10: {file_type: l2a_safe_granule_10m} 20: {file_type: l2a_safe_granule_20m} @@ -108,6 +111,7 @@ datasets: name: B04_L2A sensor: msi wavelength: [0.645, 0.665, 0.685] + modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] resolution: 10: {file_type: l2a_safe_granule_10m} 20: {file_type: l2a_safe_granule_20m} @@ -127,6 +131,7 @@ datasets: name: B05_L2A sensor: msi wavelength: [0.695, 0.705, 0.715] + modifiers: [esa_sunz_corrected] resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} @@ -145,6 +150,7 @@ datasets: name: B06_L2A sensor: msi wavelength: [0.731, 0.740, 0.749] + modifiers: [esa_sunz_corrected] resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} @@ -163,6 +169,7 @@ datasets: name: B07_L2A sensor: msi wavelength: [0.764, 0.783, 0.802] + modifiers: [esa_sunz_corrected] resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} @@ -181,6 +188,7 @@ datasets: name: B08_L2A sensor: msi wavelength: [0.780, 0.842, 0.905] + modifiers: [esa_sunz_corrected] resolution: 10: {file_type: l2a_safe_granule_10m} calibration: @@ -198,6 +206,7 @@ datasets: name: B8A_L2A sensor: msi wavelength: [0.855, 0.865, 0.875] + modifiers: [esa_sunz_corrected] resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} @@ -216,6 +225,7 @@ datasets: name: B09_L2A sensor: msi wavelength: [0.935, 0.945, 0.955] + modifiers: [esa_sunz_corrected] resolution: 60: {file_type: l2a_safe_granule_60m} calibration: @@ -233,6 +243,7 @@ datasets: name: B11_L2A sensor: msi wavelength: [1.565, 1.610, 1.655] + modifiers: [esa_sunz_corrected] resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} @@ -251,6 +262,7 @@ datasets: name: B12_L2A sensor: msi wavelength: [2.100, 2.190, 2.280] + modifiers: [esa_sunz_corrected] resolution: 20: {file_type: l2a_safe_granule_20m} 60: {file_type: l2a_safe_granule_60m} From 1c0ce3777eeb686897388d30223b37152611405c Mon Sep 17 00:00:00 2001 From: "Sara.Hornquist" Date: Fri, 31 May 2024 14:25:56 +0200 Subject: [PATCH 464/481] Update the vii_l1b-reader, because of updated testdata from EUMETSAT. --- satpy/readers/vii_l1b_nc.py | 2 +- satpy/tests/reader_tests/test_vii_l1b_nc.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/satpy/readers/vii_l1b_nc.py b/satpy/readers/vii_l1b_nc.py index 2dbcb63eda..804c2481fa 100644 --- a/satpy/readers/vii_l1b_nc.py +++ b/satpy/readers/vii_l1b_nc.py @@ -47,7 +47,7 @@ def __init__(self, filename, filename_info, filetype_info, **kwargs): self._bt_conversion_a = self["data/calibration_data/bt_conversion_a"].values self._bt_conversion_b = self["data/calibration_data/bt_conversion_b"].values self._channel_cw_thermal = self["data/calibration_data/channel_cw_thermal"].values - self._integrated_solar_irradiance = self["data/calibration_data/Band_averaged_solar_irradiance"].values + self._integrated_solar_irradiance = self["data/calibration_data/band_averaged_solar_irradiance"].values # Computes the angle factor for reflectance calibration as inverse of cosine of solar zenith angle # (the values in the product file are on tie points and in degrees, # therefore interpolation and conversion to radians are required) diff --git a/satpy/tests/reader_tests/test_vii_l1b_nc.py b/satpy/tests/reader_tests/test_vii_l1b_nc.py index 22ab14e0a3..c302973a5a 100644 --- a/satpy/tests/reader_tests/test_vii_l1b_nc.py +++ b/satpy/tests/reader_tests/test_vii_l1b_nc.py @@ -68,7 +68,7 @@ def setUp(self): bt_b[:] = np.arange(9) cw = g1_1.createVariable("channel_cw_thermal", np.float32, dimensions=("num_chan_thermal",)) cw[:] = np.arange(9) - isi = g1_1.createVariable("Band_averaged_solar_irradiance", np.float32, dimensions=("num_chan_solar",)) + isi = g1_1.createVariable("band_averaged_solar_irradiance", np.float32, dimensions=("num_chan_solar",)) isi[:] = np.arange(11) # Create measurement_data group From c698e31ce396901b3fcc11c875d362302828eae3 Mon Sep 17 00:00:00 2001 From: "Sara.Hornquist" Date: Fri, 31 May 2024 15:27:57 +0200 Subject: [PATCH 465/481] Added my name to the list of authors. --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index fb43d0168d..21520bc96c 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -90,3 +90,4 @@ The following people have made contributions to this project: - [Yufei Zhu (yufeizhu600)](https://github.com/yufeizhu600) - [Youva Aoun (YouvaEUMex)](https://github.com/YouvaEUMex) - [Will Sharpe (wjsharpe)](https://github.com/wjsharpe) +- [Sara Hörnquist (shornqui)](https://github.com/shornqui) From 32d20b5c58b3604c1f227d6ef649389afa2774e8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 21:42:24 +0000 Subject: [PATCH 466/481] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.3 → v0.4.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.3...v0.4.7) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 53db32e42a..7fdc0a6b44 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ fail_fast: false repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: 'v0.4.3' + rev: 'v0.4.7' hooks: - id: ruff - repo: https://github.com/pre-commit/pre-commit-hooks From d04bd36f27bafbf786efeaa3fa7fa285973f17c7 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Tue, 4 Jun 2024 23:21:08 +0800 Subject: [PATCH 467/481] Update test_mersi_l1b.py --- satpy/tests/reader_tests/test_mersi_l1b.py | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/satpy/tests/reader_tests/test_mersi_l1b.py b/satpy/tests/reader_tests/test_mersi_l1b.py index ffe4562bd5..e9b8c45ae6 100644 --- a/satpy/tests/reader_tests/test_mersi_l1b.py +++ b/satpy/tests/reader_tests/test_mersi_l1b.py @@ -407,7 +407,7 @@ def _geo_prefix_for_file_type(self): return "" -def _test_helper(res, band_list, exp_result): +def _assert_bands_mda_as_exp(res, band_list, exp_result): """Remove test code duplication.""" exp_cal = exp_result[0] exp_unit = exp_result[1] @@ -521,17 +521,17 @@ def test_all_resolutions(self): res.__getitem__(band) if resolution in ["all", "250"]: - _test_helper(res, self.vis_250_bands, ("reflectance", "%", (2 * 40, 2048 * 2))) - _test_helper(res, self.ir_250_bands, ("brightness_temperature", "K", (2 * 40, 2048 * 2))) + _assert_bands_mda_as_exp(res, self.vis_250_bands, ("reflectance", "%", (2 * 40, 2048 * 2))) + _assert_bands_mda_as_exp(res, self.ir_250_bands, ("brightness_temperature", "K", (2 * 40, 2048 * 2))) if resolution == "all": - _test_helper(res, self.vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) - _test_helper(res, self.ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) + _assert_bands_mda_as_exp(res, self.vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) + _assert_bands_mda_as_exp(res, self.ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) else: - _test_helper(res, self.vis_250_bands, ("reflectance", "%", (2 * 10, 2048))) - _test_helper(res, self.vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) - _test_helper(res, self.ir_250_bands, ("brightness_temperature", "K", (2 * 10, 2048))) - _test_helper(res, self.ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) + _assert_bands_mda_as_exp(res, self.vis_250_bands, ("reflectance", "%", (2 * 10, 2048))) + _assert_bands_mda_as_exp(res, self.vis_1000_bands, ("reflectance", "%", (2 * 10, 2048))) + _assert_bands_mda_as_exp(res, self.ir_250_bands, ("brightness_temperature", "K", (2 * 10, 2048))) + _assert_bands_mda_as_exp(res, self.ir_1000_bands, ("brightness_temperature", "K", (2 * 10, 2048))) def test_counts_calib(self): """Test loading data at counts calibration.""" @@ -545,8 +545,8 @@ def test_counts_calib(self): ds_ids.append(make_dataid(name="satellite_zenith_angle")) res = reader.load(ds_ids) assert len(res) == len(self.bands_1000) + len(self.bands_250) + 1 - _test_helper(res, self.bands_250, ("counts", "1", (2 * 40, 2048 * 2))) - _test_helper(res, self.bands_1000, ("counts", "1", (2 * 10, 2048))) + _assert_bands_mda_as_exp(res, self.bands_250, ("counts", "1", (2 * 40, 2048 * 2))) + _assert_bands_mda_as_exp(res, self.bands_1000, ("counts", "1", (2 * 10, 2048))) def test_rad_calib(self): """Test loading data at radiance calibration. For MERSI-2/LL VIS/IR and MERSI-1 IR.""" @@ -563,11 +563,11 @@ def test_rad_calib(self): res = reader.load(ds_ids) assert len(res) == len(test_bands) if self.yaml_file in ["mersi2_l1b.yaml", "mersi_ll_l1b.yaml"]: - _test_helper(res, self.bands_250, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) - _test_helper(res, self.bands_1000, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048))) + _assert_bands_mda_as_exp(res, self.bands_250, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) + _assert_bands_mda_as_exp(res, self.bands_1000, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048))) else: - _test_helper(res, self.ir_250_bands, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) - _test_helper(res, self.ir_1000_bands, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048))) + _assert_bands_mda_as_exp(res, self.ir_250_bands, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 40, 2048 * 2))) + _assert_bands_mda_as_exp(res, self.ir_1000_bands, ("radiance", "mW/ (m2 cm-1 sr)", (2 * 10, 2048))) class TestFY3AMERSI1L1B(MERSI12llL1BTester): From 7b2e5a7fca8c8c46cdc5375d0d63a13c0d84387c Mon Sep 17 00:00:00 2001 From: Martin Raspaud Date: Wed, 5 Jun 2024 08:35:33 +0200 Subject: [PATCH 468/481] Update changelog for v0.49.0 --- CHANGELOG.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7281a80ceb..a1484ff13b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,54 @@ +## Version 0.49.0 (2024/06/05) + +### Issues Closed + +* [Issue 2790](https://github.com/pytroll/satpy/issues/2790) - VIIRS L1B DNB_SENZ file_key ([PR 2791](https://github.com/pytroll/satpy/pull/2791) by [@wjsharpe](https://github.com/wjsharpe)) +* [Issue 2781](https://github.com/pytroll/satpy/issues/2781) - [Question] Sun Zenith Correction +* [Issue 2765](https://github.com/pytroll/satpy/issues/2765) - abi_l2_nc reader Key Error 'calibration' when trying to load Mask from fire Hot Spot ([PR 2794](https://github.com/pytroll/satpy/pull/2794) by [@djhoese](https://github.com/djhoese)) + +In this release 3 issues were closed. + +### Pull Requests Merged + +#### Bugs fixed + +* [PR 2804](https://github.com/pytroll/satpy/pull/2804) - Fix LI L2 accumulated products `'with_area_definition': False` 1-d coordinates computation +* [PR 2794](https://github.com/pytroll/satpy/pull/2794) - Fix ABI L2 datasets when unitless and no calibration ([2765](https://github.com/pytroll/satpy/issues/2765)) +* [PR 2791](https://github.com/pytroll/satpy/pull/2791) - fixed DNB_SENZ file_key ([2790](https://github.com/pytroll/satpy/issues/2790)) + +#### Features added + +* [PR 2807](https://github.com/pytroll/satpy/pull/2807) - Update the vii_l1b-reader, for new testdata format of VII +* [PR 2801](https://github.com/pytroll/satpy/pull/2801) - Replace pytest-lazyfixture with pytest-lazy-fixtures +* [PR 2800](https://github.com/pytroll/satpy/pull/2800) - Add numpy rules to ruff +* [PR 2799](https://github.com/pytroll/satpy/pull/2799) - Add netcdf4 to goci2 optional dependency in `pyproject.toml` +* [PR 2795](https://github.com/pytroll/satpy/pull/2795) - Add support for MERSI-1 on FY-3A/B/C +* [PR 2789](https://github.com/pytroll/satpy/pull/2789) - Activate LI L2 accumulated products gridding by default +* [PR 2787](https://github.com/pytroll/satpy/pull/2787) - Fix datetime imports +* [PR 2778](https://github.com/pytroll/satpy/pull/2778) - Add the reader for the fci L1C Africa files +* [PR 2776](https://github.com/pytroll/satpy/pull/2776) - Add option to choose start time to MSI SAFE reader +* [PR 2727](https://github.com/pytroll/satpy/pull/2727) - Refactor Sentinel-1 SAR-C reader + +#### Documentation changes + +* [PR 2789](https://github.com/pytroll/satpy/pull/2789) - Activate LI L2 accumulated products gridding by default + +#### Backward incompatible changes + +* [PR 2789](https://github.com/pytroll/satpy/pull/2789) - Activate LI L2 accumulated products gridding by default + +#### Refactoring + +* [PR 2787](https://github.com/pytroll/satpy/pull/2787) - Fix datetime imports + +#### Clean ups + +* [PR 2797](https://github.com/pytroll/satpy/pull/2797) - Add missing coverage configuration section to pyproject.toml +* [PR 2784](https://github.com/pytroll/satpy/pull/2784) - Fix various issues in unstable CI + +In this release 18 pull requests were closed. + + ## Version 0.48.0 (2024/04/22) ### Issues Closed From 676a5a1d3280961720478d0796f4ac6aa339a07e Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 5 Jun 2024 22:58:41 +0800 Subject: [PATCH 469/481] drop l2a suffix --- satpy/etc/composites/msi.yaml | 64 +++++++++---------- satpy/etc/readers/msi_safe_l2a.yaml | 76 +++++++++++------------ satpy/readers/msi_safe.py | 25 ++------ satpy/tests/reader_tests/test_msi_safe.py | 18 +++--- 4 files changed, 85 insertions(+), 98 deletions(-) diff --git a/satpy/etc/composites/msi.yaml b/satpy/etc/composites/msi.yaml index 3681cf5183..602a0cd6b1 100644 --- a/satpy/etc/composites/msi.yaml +++ b/satpy/etc/composites/msi.yaml @@ -424,65 +424,65 @@ composites: true_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B04_L2A' + - name: 'B04' modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] - - name: 'B03_L2A' + - name: 'B03' modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] - - name: 'B02_L2A' + - name: 'B02' modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: true_color natural_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B11_L2A' + - name: 'B11' modifiers: [esa_sunz_corrected] - - name: 'B08_L2A' + - name: 'B08' modifiers: [esa_sunz_corrected] - - name: 'B04_L2A' + - name: 'B04' modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: natural_color urban_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B12_L2A' + - name: 'B12' modifiers: [esa_sunz_corrected] - - name: 'B11_L2A' + - name: 'B11' modifiers: [esa_sunz_corrected] - - name: 'B04_L2A' + - name: 'B04' modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: natural_color false_color_l2a: compositor: !!python/name:satpy.composites.GenericCompositor prerequisites: - - name: 'B08_L2A' + - name: 'B08' modifiers: [esa_sunz_corrected] - - name: 'B04_L2A' + - name: 'B04' modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] - - name: 'B03_L2A' + - name: 'B03' modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: natural_color aerosol_optical_thickness: compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: - - name: AOT_L2A + - name: AOT calibration: aerosol_thickness standard_name: aot_msi water_vapor_map: compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: - - name: WVP_L2A + - name: WVP calibration: water_vapor standard_name: wvp_msi scene_class: compositor: !!python/name:satpy.composites.SingleBandCompositor prerequisites: - - name: SCL_L2A + - name: SCL standard_name: scl_msi ndvi_l2a: @@ -494,15 +494,15 @@ composites: prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B08_L2A + - name: B08 modifiers: [esa_sunz_corrected] - - name: B04_L2A + - name: B04 modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B08_L2A + - name: B08 modifiers: [esa_sunz_corrected] - - name: B04_L2A + - name: B04 modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] standard_name: ndvi_msi @@ -515,15 +515,15 @@ composites: prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B8A_L2A + - name: B8A modifiers: [esa_sunz_corrected] - - name: B11_L2A + - name: B11 modifiers: [esa_sunz_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B8A_L2A + - name: B8A modifiers: [esa_sunz_corrected] - - name: B11_L2A + - name: B11 modifiers: [esa_sunz_corrected] standard_name: ndmi_msi @@ -536,15 +536,15 @@ composites: prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B03_L2A + - name: B03 modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] - - name: B08_L2A + - name: B08 modifiers: [esa_sunz_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B03_L2A + - name: B03 modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] - - name: B08_L2A + - name: B08 modifiers: [esa_sunz_corrected] standard_name: ndwi_msi @@ -553,21 +553,21 @@ composites: # For more information please review https://custom-scripts.sentinel-hub.com/sentinel-2/ndsi/ compositor: !!python/name:satpy.composites.MaskingCompositor prerequisites: - - name: B11_L2A + - name: B11 modifiers: [esa_sunz_corrected] - compositor: !!python/name:satpy.composites.RatioCompositor prerequisites: - compositor: !!python/name:satpy.composites.DifferenceCompositor prerequisites: - - name: B03_L2A + - name: B03 modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] - - name: B11_L2A + - name: B11 modifiers: [esa_sunz_corrected] - compositor: !!python/name:satpy.composites.SumCompositor prerequisites: - - name: B03_L2A + - name: B03 modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] - - name: B11_L2A + - name: B11 modifiers: [esa_sunz_corrected] conditions: - method: less_equal diff --git a/satpy/etc/readers/msi_safe_l2a.yaml b/satpy/etc/readers/msi_safe_l2a.yaml index 5972f6b0f2..6a6849ba3c 100644 --- a/satpy/etc/readers/msi_safe_l2a.yaml +++ b/satpy/etc/readers/msi_safe_l2a.yaml @@ -48,8 +48,8 @@ file_types: file_patterns: ['{fmission_id:3s}_MSI{process_level:3s}_{observation_time:%Y%m%dT%H%M%S}_N{fprocessing_baseline_number:4d}_R{relative_orbit_number:3d}_T{dtile_number:5s}_{dproduct_discriminator:%Y%m%dT%H%M%S}.SAFE/MTD_MSIL2A.xml'] datasets: - B01_L2A: - name: B01_L2A + B01: + name: B01 sensor: msi wavelength: [0.415, 0.443, 0.470] modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] @@ -67,8 +67,8 @@ datasets: standard_name: counts units: "1" - B02_L2A: - name: B02_L2A + B02: + name: B02 sensor: msi wavelength: [0.440, 0.490, 0.540] modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] @@ -87,8 +87,8 @@ datasets: standard_name: counts units: "1" - B03_L2A: - name: B03_L2A + B03: + name: B03 sensor: msi wavelength: [0.540, 0.560, 0.580] modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] @@ -107,8 +107,8 @@ datasets: standard_name: counts units: "1" - B04_L2A: - name: B04_L2A + B04: + name: B04 sensor: msi wavelength: [0.645, 0.665, 0.685] modifiers: [esa_sunz_corrected, esa_rayleigh_corrected] @@ -127,8 +127,8 @@ datasets: standard_name: counts units: "1" - B05_L2A: - name: B05_L2A + B05: + name: B05 sensor: msi wavelength: [0.695, 0.705, 0.715] modifiers: [esa_sunz_corrected] @@ -146,8 +146,8 @@ datasets: standard_name: counts units: "1" - B06_L2A: - name: B06_L2A + B06: + name: B06 sensor: msi wavelength: [0.731, 0.740, 0.749] modifiers: [esa_sunz_corrected] @@ -165,8 +165,8 @@ datasets: standard_name: counts units: "1" - B07_L2A: - name: B07_L2A + B07: + name: B07 sensor: msi wavelength: [0.764, 0.783, 0.802] modifiers: [esa_sunz_corrected] @@ -184,8 +184,8 @@ datasets: standard_name: counts units: "1" - B08_L2A: - name: B08_L2A + B08: + name: B08 sensor: msi wavelength: [0.780, 0.842, 0.905] modifiers: [esa_sunz_corrected] @@ -202,8 +202,8 @@ datasets: standard_name: counts units: "1" - B8A_L2A: - name: B8A_L2A + B8A: + name: B8A sensor: msi wavelength: [0.855, 0.865, 0.875] modifiers: [esa_sunz_corrected] @@ -221,8 +221,8 @@ datasets: standard_name: counts units: "1" - B09_L2A: - name: B09_L2A + B09: + name: B09 sensor: msi wavelength: [0.935, 0.945, 0.955] modifiers: [esa_sunz_corrected] @@ -239,8 +239,8 @@ datasets: standard_name: counts units: "1" - B11_L2A: - name: B11_L2A + B11: + name: B11 sensor: msi wavelength: [1.565, 1.610, 1.655] modifiers: [esa_sunz_corrected] @@ -258,8 +258,8 @@ datasets: standard_name: counts units: "1" - B12_L2A: - name: B12_L2A + B12: + name: B12 sensor: msi wavelength: [2.100, 2.190, 2.280] modifiers: [esa_sunz_corrected] @@ -277,8 +277,8 @@ datasets: standard_name: counts units: "1" - AOT_L2A: - name: AOT_L2A + AOT: + name: AOT sensor: msi resolution: 10: {file_type: l2a_safe_granule_10m} @@ -292,8 +292,8 @@ datasets: standard_name: counts units: "1" - WVP_L2A: - name: WVP_L2A + WVP: + name: WVP sensor: msi resolution: 10: {file_type: l2a_safe_granule_10m} @@ -307,8 +307,8 @@ datasets: standard_name: counts units: "1" - SCL_L2A: - name: SCL_L2A + SCL: + name: SCL sensor: msi resolution: 20: {file_type: l2a_safe_granule_20m} @@ -318,27 +318,27 @@ datasets: standard_name: counts units: "1" - solar_zenith_angle_l2a: - name: solar_zenith_angle_l2a + solar_zenith_angle: + name: solar_zenith_angle resolution: [10, 20, 60] file_type: l2a_safe_tile_metadata xml_tag: Sun_Angles_Grid/Zenith - solar_azimuth_angle_l2a: - name: solar_azimuth_angle_l2a + solar_azimuth_angle: + name: solar_azimuth_angle resolution: [10, 20, 60] file_type: l2a_safe_tile_metadata xml_tag: Sun_Angles_Grid/Azimuth - satellite_azimuth_angle_l2a: - name: satellite_azimuth_angle_l2a + satellite_azimuth_angle: + name: satellite_azimuth_angle resolution: [10, 20, 60] file_type: l2a_safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids xml_item: Azimuth - satellite_zenith_angle_l2a: - name: satellite_zenith_angle_l2a + satellite_zenith_angle: + name: satellite_zenith_angle resolution: [10, 20, 60] file_type: l2a_safe_tile_metadata xml_tag: Viewing_Incidence_Angles_Grids diff --git a/satpy/readers/msi_safe.py b/satpy/readers/msi_safe.py index d36350f7ab..b041436a74 100644 --- a/satpy/readers/msi_safe.py +++ b/satpy/readers/msi_safe.py @@ -32,9 +32,6 @@ https://sentinels.copernicus.eu/documents/247904/685211/S2-PDGS-TAS-DI-PSD-V14.9.pdf/3d3b6c9c-4334-dcc4-3aa7-f7c0deffbaf7?t=1643013091529 -Please note: for L2A datasets, the band name has been fixed with a "_L2A" suffix. Do not change it in the YAML file or -the reader can't recogonize it and nothing will be loaded. - """ import logging @@ -77,12 +74,8 @@ def __init__(self, filename, filename_info, filetype_info, mda, tile_mda, mask_s def get_dataset(self, key, info): """Load a dataset.""" - if self.process_level == "L1C": - if self._channel != key["name"]: - return - else: - if self._channel + "_L2A" != key["name"]: - return + if self._channel != key["name"]: + return logger.debug("Reading %s.", key["name"]) @@ -118,12 +111,8 @@ def end_time(self): def get_area_def(self, dsid): """Get the area def.""" - if self.process_level == "L1C": - if self._channel != dsid["name"]: - return - else: - if self._channel + "_L2A" != dsid["name"]: - return + if self._channel != dsid["name"]: + return return self._tile_mda.get_area_def(dsid) @@ -334,11 +323,9 @@ def interpolate_angles(self, angles, resolution): def _get_coarse_dataset(self, key, info): """Get the coarse dataset refered to by `key` from the XML data.""" angles = self.root.find(".//Tile_Angles") - if key["name"] in ["solar_zenith_angle", "solar_azimuth_angle", - "solar_zenith_angle_l2a", "solar_azimuth_angle_l2a"]: + if key["name"] in ["solar_zenith_angle", "solar_azimuth_angle"]: angles = self._get_solar_angles(angles, info) - elif key["name"] in ["satellite_zenith_angle", "satellite_azimuth_angle", - "satellite_zenith_angle_l2a", "satellite_azimuth_angle_l2a"]: + elif key["name"] in ["satellite_zenith_angle", "satellite_azimuth_angle"]: angles = self._get_satellite_angles(angles, info) else: angles = None diff --git a/satpy/tests/reader_tests/test_msi_safe.py b/satpy/tests/reader_tests/test_msi_safe.py index 46a416977b..84828f4ecf 100644 --- a/satpy/tests/reader_tests/test_msi_safe.py +++ b/satpy/tests/reader_tests/test_msi_safe.py @@ -1511,7 +1511,7 @@ class TestTileXML: 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837], [3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.7708, 3.24140837]]), - ("L2A", "solar_zenith_angle_l2a", ("Sun_Angles_Grid", "Zenith"), + ("L2A", "solar_zenith_angle", ("Sun_Angles_Grid", "Zenith"), [[39.8824, 39.83721367, 39.79230847, 39.74758442, 39.7030415, 39.65867687, 39.61455566, 39.57061558, 39.52685664, 39.48331372], [39.78150175, 39.73629896, 39.69128852, 39.64643679, 39.6018404, @@ -1643,16 +1643,16 @@ def setup_method(self): @pytest.mark.parametrize(("mask_saturated", "dataset_name", "calibration", "expected"), [ - (False, "B01_L2A", "reflectance", [[np.nan, -9.99], [645.34, 645.35]]), - (True, "B02_L2A", "radiance", [[np.nan, -265.970568], [17181.325973, np.inf]]), - (True, "B03_L2A", "counts", [[np.nan, 1], [65534, np.inf]]), - (False, "AOT_L2A", "aerosol_thickness", [[np.nan, 0.001], [65.534, 65.535]]), - (True, "WVP_L2A", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), - (True, "SNOW_L2A", "water_vapor", None), + (False, "B01", "reflectance", [[np.nan, -9.99], [645.34, 645.35]]), + (True, "B02", "radiance", [[np.nan, -265.970568], [17181.325973, np.inf]]), + (True, "B03", "counts", [[np.nan, 1], [65534, np.inf]]), + (False, "AOT", "aerosol_thickness", [[np.nan, 0.001], [65.534, 65.535]]), + (True, "WVP", "water_vapor", [[np.nan, 0.001], [65.534, np.inf]]), + (True, "SNOW", "water_vapor", None), ]) def test_calibration_and_masking(self, mask_saturated, dataset_name, calibration, expected): """Test that saturated is masked with inf when requested and that calibration is performed.""" - jp2_fh = jp2_builder("L2A", dataset_name.replace("_L2A", ""), mask_saturated) + jp2_fh = jp2_builder("L2A", dataset_name, mask_saturated) with mock.patch("xarray.open_dataset", return_value=self.fake_data): res = jp2_fh.get_dataset(make_alt_dataid(name=dataset_name, calibration=calibration), info=dict()) @@ -1664,7 +1664,7 @@ def test_calibration_and_masking(self, mask_saturated, dataset_name, calibration @pytest.mark.parametrize(("process_level", "band_name", "dataset_name"), [ ("L1C", "B01", "B03"), - ("L2A", "B02", "B03_L2A"), + ("L2A", "B02", "B03"), ]) def test_filename_dsname_mismatch(self, process_level, band_name, dataset_name): """Test when dataset name and file band name mismatch, the data and its area definition should both be None.""" From ab55c4a63cddb9bda1eae5093269baeb50c92519 Mon Sep 17 00:00:00 2001 From: yukaribbba Date: Wed, 5 Jun 2024 23:05:35 +0800 Subject: [PATCH 470/481] Update msi_safe_l2a.yaml --- satpy/etc/readers/msi_safe_l2a.yaml | 48 ++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/satpy/etc/readers/msi_safe_l2a.yaml b/satpy/etc/readers/msi_safe_l2a.yaml index 6a6849ba3c..f4c6e4221a 100644 --- a/satpy/etc/readers/msi_safe_l2a.yaml +++ b/satpy/etc/readers/msi_safe_l2a.yaml @@ -58,10 +58,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -78,10 +78,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -98,10 +98,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -118,10 +118,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -137,10 +137,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -156,10 +156,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -175,10 +175,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -193,10 +193,10 @@ datasets: 10: {file_type: l2a_safe_granule_10m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -212,10 +212,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -230,10 +230,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -249,10 +249,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts @@ -268,10 +268,10 @@ datasets: 60: {file_type: l2a_safe_granule_60m} calibration: reflectance: - standard_name: toa_bidirectional_reflectance + standard_name: boa_bidirectional_reflectance units: "%" radiance: - standard_name: toa_outgoing_radiance_per_unit_wavelength + standard_name: boa_outgoing_radiance_per_unit_wavelength units: W m-2 um-1 sr-1 counts: standard_name: counts From 23f6ae5fb24926d14c59efd15b49be82f8de36eb Mon Sep 17 00:00:00 2001 From: BENR0 Date: Wed, 12 Jun 2024 11:14:23 +0200 Subject: [PATCH 471/481] fix: error when projection is EPSG code --- doc/source/conf.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index b2d978a3a5..35c8ceb762 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -90,8 +90,11 @@ def __getattr__(cls, name): widths=[45, 60, 10], class_name="area-table")] for aname, params in area_dict.items(): + projection = params.get("projection") + projection_type = projection.get("proj") if isinstance(projection, dict) else projection + area_table.append(rst_table_row([f"`{aname}`_", params.get("description", ""), - params.get("projection").get("proj")])) + projection_type])) with open("area_def_list.rst", mode="w") as f: f.write("".join(area_table)) From ba46aca47e461a481288cbe7db08f7a8c9c722e1 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Wed, 12 Jun 2024 13:24:18 +0200 Subject: [PATCH 472/481] fix: links for areas without html repr. --- doc/source/_static/main.js | 7 ++++++- doc/source/conf.py | 15 ++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/doc/source/_static/main.js b/doc/source/_static/main.js index bf988ff1c7..f2da99d4e7 100644 --- a/doc/source/_static/main.js +++ b/doc/source/_static/main.js @@ -12,6 +12,11 @@ $(document).ready( function () { $('table.area-table').DataTable( { "paging": true, "pageLength": 15, - "dom": 'lfitp' + "layout": { + 'topStart': 'info', + 'topEnd': 'search', + 'bottomEnd': 'paging', + 'bottomStart': null + } } ); } ); diff --git a/doc/source/conf.py b/doc/source/conf.py index 35c8ceb762..83ffc61b78 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -24,7 +24,11 @@ sys.path.append(os.path.abspath("../../")) sys.path.append(os.path.abspath(os.path.dirname(__file__))) -from pyresample.area_config import _read_yaml_area_file_content, generate_area_def_rst_list # noqa: E402 +from pyresample.area_config import ( # noqa: E402 + _create_area_def_from_dict, + _read_yaml_area_file_content, + generate_area_def_rst_list, +) from reader_table import generate_reader_table, rst_table_header, rst_table_row # noqa: E402 import satpy # noqa: E402 @@ -90,11 +94,12 @@ def __getattr__(cls, name): widths=[45, 60, 10], class_name="area-table")] for aname, params in area_dict.items(): - projection = params.get("projection") - projection_type = projection.get("proj") if isinstance(projection, dict) else projection + area = _create_area_def_from_dict(aname, params) + if not hasattr(area, "_repr_html_"): + continue - area_table.append(rst_table_row([f"`{aname}`_", params.get("description", ""), - projection_type])) + area_table.append(rst_table_row([f"`{aname}`_", area.description, + area.proj_dict.get("proj")])) with open("area_def_list.rst", mode="w") as f: f.write("".join(area_table)) From fbb92b143bc49d79bcba61a494721a3f8b30b5da Mon Sep 17 00:00:00 2001 From: BENR0 Date: Wed, 12 Jun 2024 14:23:23 +0200 Subject: [PATCH 473/481] fix: relativ inlcude --- satpy/resample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satpy/resample.py b/satpy/resample.py index a592777059..50de0723f4 100644 --- a/satpy/resample.py +++ b/satpy/resample.py @@ -140,7 +140,7 @@ Area definitions included in Satpy ---------------------------------- -.. include:: area_def_list.rst +.. include:: /area_def_list.rst """ import hashlib From 79d95b6cc86dead042b89fe13827c059580d813a Mon Sep 17 00:00:00 2001 From: BENR0 Date: Wed, 12 Jun 2024 14:43:11 +0200 Subject: [PATCH 474/481] add cartopy to environment --- doc/rtd_environment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/rtd_environment.yml b/doc/rtd_environment.yml index 18173b2674..abd8add616 100644 --- a/doc/rtd_environment.yml +++ b/doc/rtd_environment.yml @@ -31,6 +31,7 @@ dependencies: - xarray - zarr - xarray-datatree + - cartopy - pip: - graphviz - pytest-lazy-fixtures From f9142b00e1a0744e6d6a5cfd866fbce6baa94ce5 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Wed, 12 Jun 2024 15:17:47 +0200 Subject: [PATCH 475/481] fix: columns widths --- doc/source/conf.py | 12 ++++++++---- doc/source/reader_table.py | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 83ffc61b78..30cbe4e81e 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -91,9 +91,11 @@ def __getattr__(cls, name): area_dict = _read_yaml_area_file_content(area_file) area_table = [rst_table_header("Area Definitions", header=["Name", "Description", "Projection"], - widths=[45, 60, 10], class_name="area-table")] + widths="auto", class_name="area-table")] -for aname, params in area_dict.items(): +for i, (aname, params) in enumerate(area_dict.items()): + if i == 18: + break area = _create_area_def_from_dict(aname, params) if not hasattr(area, "_repr_html_"): continue @@ -220,11 +222,13 @@ def __getattr__(cls, name): html_css_files = [ "theme_overrides.css", # override wide tables in RTD theme - "https://cdn.datatables.net/v/dt/dt-2.0.0/datatables.min.css", + # "https://cdn.datatables.net/v/dt/dt-2.0.0/datatables.min.css", + "https://cdn.datatables.net/v/dt/dt-2.0.8/r-3.0.2/datatables.min.css" ] html_js_files = [ - "https://cdn.datatables.net/v/dt/dt-2.0.0/datatables.min.js", + # "https://cdn.datatables.net/v/dt/dt-2.0.0/datatables.min.js", + "https://cdn.datatables.net/v/dt/dt-2.0.8/r-3.0.2/datatables.min.js", "main.js", ] diff --git a/doc/source/reader_table.py b/doc/source/reader_table.py index 4b6ebb66bd..0caf2c4c34 100644 --- a/doc/source/reader_table.py +++ b/doc/source/reader_table.py @@ -76,7 +76,7 @@ def generate_reader_table(): str """ table = [rst_table_header("Satpy Readers", header=["Description", "Reader name", "Status", "fsspec support"], - widths=[45, 25, 30, 30])] + widths="auto")] reader_configs = available_readers(as_dict=True, yaml_loader=BaseLoader) for rc in reader_configs: From 269315ca4ffb61b33ef6a5c813e1a5e1ffd278c9 Mon Sep 17 00:00:00 2001 From: BENR0 Date: Wed, 12 Jun 2024 15:25:22 +0200 Subject: [PATCH 476/481] remove testing code --- doc/source/conf.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 30cbe4e81e..62156e9760 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -93,9 +93,7 @@ def __getattr__(cls, name): area_table = [rst_table_header("Area Definitions", header=["Name", "Description", "Projection"], widths="auto", class_name="area-table")] -for i, (aname, params) in enumerate(area_dict.items()): - if i == 18: - break +for aname, params in area_dict.items(): area = _create_area_def_from_dict(aname, params) if not hasattr(area, "_repr_html_"): continue From 4d5b3f03a0047f80d1e9d2b9f7cd09c27e0abcb7 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Wed, 12 Jun 2024 10:36:06 -0500 Subject: [PATCH 477/481] Add missing hatchling dependency to unstable CI --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8955a154f1..3347414fec 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -71,7 +71,7 @@ jobs: # compatibility issues with numpy 2. When conda-forge has numpy 2 available # this shouldn't be needed. run: | - python -m pip install versioneer extension-helpers setuptools-scm configobj pkgconfig + python -m pip install versioneer extension-helpers setuptools-scm configobj pkgconfig hatchling python -m pip install \ --index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/ \ --trusted-host pypi.anaconda.org \ From 8895c4f7428fc32971a09e4ad2f22fa63a532d29 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Wed, 12 Jun 2024 10:41:40 -0500 Subject: [PATCH 478/481] Add missing hatch-vcs unstable CI dependency --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3347414fec..a046f911a1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -71,7 +71,7 @@ jobs: # compatibility issues with numpy 2. When conda-forge has numpy 2 available # this shouldn't be needed. run: | - python -m pip install versioneer extension-helpers setuptools-scm configobj pkgconfig hatchling + python -m pip install versioneer extension-helpers setuptools-scm configobj pkgconfig hatchling hatch-vcs python -m pip install \ --index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple/ \ --trusted-host pypi.anaconda.org \ From 3c7938cb602269a50f41808a1e211df176799967 Mon Sep 17 00:00:00 2001 From: David Hoese Date: Wed, 12 Jun 2024 11:00:34 -0500 Subject: [PATCH 479/481] Remove zarr unstable dependency install It is pure python and rarely causes issues. It also has many dependencies not used by anything else. --- .github/workflows/ci.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a046f911a1..ea685ddb7b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -93,7 +93,6 @@ jobs: git+https://github.com/Unidata/netcdf4-python \ git+https://github.com/dask/dask \ git+https://github.com/dask/distributed \ - git+https://github.com/zarr-developers/zarr \ git+https://github.com/Unidata/cftime \ git+https://github.com/rasterio/rasterio \ git+https://github.com/pydata/bottleneck \ From ed5213bd2e0b8e37a5e1f45b2b3d06d1948ff7f4 Mon Sep 17 00:00:00 2001 From: Johan Strandgren Date: Thu, 13 Jun 2024 14:05:34 +0000 Subject: [PATCH 480/481] Fix end_time computation, optimize SEVIRI imports and fix code style issues. --- satpy/readers/eum_l2_grib.py | 23 ++++++++++---------- satpy/tests/reader_tests/test_eum_l2_grib.py | 20 ++++++++--------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/satpy/readers/eum_l2_grib.py b/satpy/readers/eum_l2_grib.py index c3cc7e61c4..543aa71c30 100644 --- a/satpy/readers/eum_l2_grib.py +++ b/satpy/readers/eum_l2_grib.py @@ -22,6 +22,7 @@ https://navigator.eumetsat.int/ """ +import datetime as dt import logging import dask.array as da @@ -32,7 +33,9 @@ from satpy.readers.eum_base import get_service_mode from satpy.readers.fci_base import calculate_area_extent as fci_calculate_area_extent from satpy.readers.file_handlers import BaseFileHandler -from satpy.readers.seviri_base import PLATFORM_DICT, REPEAT_CYCLE_DURATION, REPEAT_CYCLE_DURATION_RSS +from satpy.readers.seviri_base import PLATFORM_DICT as SEVIRI_PLATFORM_DICT +from satpy.readers.seviri_base import REPEAT_CYCLE_DURATION as SEVIRI_REPEAT_CYCLE_DURATION +from satpy.readers.seviri_base import REPEAT_CYCLE_DURATION_RSS as SEVIRI_REPEAT_CYCLE_DURATION_RSS from satpy.readers.seviri_base import calculate_area_extent as seviri_calculate_area_extent from satpy.utils import get_legacy_chunk_size @@ -60,7 +63,7 @@ def __init__(self, filename, filename_info, filetype_info): if "seviri" in self.filetype_info["file_type"]: self.sensor = "seviri" - self.PLATFORM_NAME = PLATFORM_DICT[self.filename_info["spacecraft"]] + self.PLATFORM_NAME = SEVIRI_PLATFORM_DICT[self.filename_info["spacecraft"]] elif "fci" in self.filetype_info["file_type"]: self.sensor = "fci" self.PLATFORM_NAME = f"MTG-i{self.filename_info['spacecraft_id']}" @@ -74,8 +77,11 @@ def start_time(self): @property def end_time(self): """Return the sensing end time.""" - delta = REPEAT_CYCLE_DURATION_RSS if self._ssp_lon == 9.5 else REPEAT_CYCLE_DURATION - return self.start_time + delta + if self.sensor == "seviri": + delta = SEVIRI_REPEAT_CYCLE_DURATION_RSS if self._ssp_lon == 9.5 else SEVIRI_REPEAT_CYCLE_DURATION + return self.start_time + dt.timedelta(minutes=delta) + elif self.sensor == "fci": + return self.filename_info["end_time"] def get_area_def(self, dataset_id): """Return the area definition for a dataset.""" @@ -282,13 +288,8 @@ def _get_attributes(self): "projection_longitude": self._ssp_lon } - attributes = { - "orbital_parameters": orbital_parameters, - "sensor": self.sensor - } - - - attributes["platform_name"] = self.PLATFORM_NAME + attributes = {"orbital_parameters": orbital_parameters, "sensor": self.sensor, + "platform_name": self.PLATFORM_NAME} return attributes diff --git a/satpy/tests/reader_tests/test_eum_l2_grib.py b/satpy/tests/reader_tests/test_eum_l2_grib.py index a7846be706..8745fc33d2 100644 --- a/satpy/tests/reader_tests/test_eum_l2_grib.py +++ b/satpy/tests/reader_tests/test_eum_l2_grib.py @@ -60,7 +60,7 @@ FAKE_GID = [0, 1, 2, 3, None] -class Test_EUML2GribFileHandler(unittest.TestCase): +class TestEUML2GribFileHandler(unittest.TestCase): """Test the EUML2GribFileHandler reader.""" @mock.patch("satpy.readers.eum_l2_grib.ec") @@ -72,7 +72,7 @@ def setUp(self, ec_): def common_checks(self, mock_file, dataset_id): """Commmon checks for fci and seviri data.""" - # Checks that the codes_grib_multi_support_on function has been called + # Checks that the codes_grib_multi_support_on function has been called self.ec_.codes_grib_multi_support_on.assert_called() # Restarts the id generator and clears the call history @@ -110,9 +110,9 @@ def common_checks(self, mock_file, dataset_id): @mock.patch("satpy.readers.eum_l2_grib.da") def test_seviri_data_reading(self, da_, xr_): """Test the reading of data from the product.""" - from satpy.readers.eum_l2_grib import REPEAT_CYCLE_DURATION, EUML2GribFileHandler + from satpy.readers.eum_l2_grib import SEVIRI_REPEAT_CYCLE_DURATION, EUML2GribFileHandler from satpy.utils import get_legacy_chunk_size - CHUNK_SIZE = get_legacy_chunk_size() + chunk_size = get_legacy_chunk_size() with mock.patch("builtins.open", mock.mock_open()) as mock_file: with mock.patch("satpy.readers.eum_l2_grib.ec", self.ec_): @@ -126,7 +126,7 @@ def test_seviri_data_reading(self, da_, xr_): hour=19, minute=45, second=0) }, filetype_info={ - "file_type" : "seviri" + "file_type": "seviri" } ) @@ -135,7 +135,7 @@ def test_seviri_data_reading(self, da_, xr_): self.common_checks(mock_file, dataset_id) # Checks the basic data reading - assert REPEAT_CYCLE_DURATION == 15 + assert SEVIRI_REPEAT_CYCLE_DURATION == 15 # Checks the correct execution of the _get_global_attributes and _get_metadata_from_msg functions attributes = self.reader._get_attributes() @@ -154,7 +154,7 @@ def test_seviri_data_reading(self, da_, xr_): # Checks that dask.array has been called with the correct arguments name, args, kwargs = da_.mock_calls[0] assert np.all(args[0] == np.ones((1200, 1000))) - assert args[1] == CHUNK_SIZE + assert args[1] == chunk_size # Checks that xarray.DataArray has been called with the correct arguments name, args, kwargs = xr_.mock_calls[0] @@ -208,7 +208,7 @@ def test_fci_data_reading(self, da_, xr_): """Test the reading of fci data from the product.""" from satpy.readers.eum_l2_grib import EUML2GribFileHandler from satpy.utils import get_legacy_chunk_size - CHUNK_SIZE = get_legacy_chunk_size() + chunk_size = get_legacy_chunk_size() with mock.patch("builtins.open", mock.mock_open()) as mock_file: with mock.patch("satpy.readers.eum_l2_grib.ec", self.ec_): @@ -222,7 +222,7 @@ def test_fci_data_reading(self, da_, xr_): hour=19, minute=45, second=0) }, filetype_info={ - "file_type" : "fci" + "file_type": "fci" } ) @@ -247,7 +247,7 @@ def test_fci_data_reading(self, da_, xr_): # Checks that dask.array has been called with the correct arguments name, args, kwargs = da_.mock_calls[0] assert np.all(args[0] == np.ones((5568, 5568))) - assert args[1] == CHUNK_SIZE + assert args[1] == chunk_size # Checks that xarray.DataArray has been called with the correct arguments name, args, kwargs = xr_.mock_calls[0] From 164bcba5b8cb51081823e436a9861a53d6463259 Mon Sep 17 00:00:00 2001 From: Johan Strandgren Date: Thu, 13 Jun 2024 16:08:36 +0000 Subject: [PATCH 481/481] Add tests for end_time. --- satpy/tests/reader_tests/test_eum_l2_grib.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/satpy/tests/reader_tests/test_eum_l2_grib.py b/satpy/tests/reader_tests/test_eum_l2_grib.py index 8745fc33d2..593eb2f5af 100644 --- a/satpy/tests/reader_tests/test_eum_l2_grib.py +++ b/satpy/tests/reader_tests/test_eum_l2_grib.py @@ -110,7 +110,7 @@ def common_checks(self, mock_file, dataset_id): @mock.patch("satpy.readers.eum_l2_grib.da") def test_seviri_data_reading(self, da_, xr_): """Test the reading of data from the product.""" - from satpy.readers.eum_l2_grib import SEVIRI_REPEAT_CYCLE_DURATION, EUML2GribFileHandler + from satpy.readers.eum_l2_grib import EUML2GribFileHandler from satpy.utils import get_legacy_chunk_size chunk_size = get_legacy_chunk_size() @@ -134,8 +134,9 @@ def test_seviri_data_reading(self, da_, xr_): self.common_checks(mock_file, dataset_id) - # Checks the basic data reading - assert SEVIRI_REPEAT_CYCLE_DURATION == 15 + # Check end_time + assert self.reader.end_time == datetime.datetime(year=2020, month=10, day=20, + hour=19, minute=50, second=0) # Checks the correct execution of the _get_global_attributes and _get_metadata_from_msg functions attributes = self.reader._get_attributes() @@ -219,7 +220,9 @@ def test_fci_data_reading(self, da_, xr_): filename_info={ "spacecraft_id": "1", "start_time": datetime.datetime(year=2020, month=10, day=20, - hour=19, minute=45, second=0) + hour=19, minute=40, second=0), + "end_time": datetime.datetime(year=2020, month=10, day=20, + hour=19, minute=50, second=0) }, filetype_info={ "file_type": "fci" @@ -230,6 +233,10 @@ def test_fci_data_reading(self, da_, xr_): self.common_checks(mock_file, dataset_id) + # Check end_time + assert self.reader.end_time == datetime.datetime(year=2020, month=10, day=20, + hour=19, minute=50, second=0) + # Checks the correct execution of the _get_global_attributes and _get_metadata_from_msg functions attributes = self.reader._get_attributes() expected_attributes = {