diff --git a/satpy/readers/core/seviri.py b/satpy/readers/core/seviri.py index 79af4d1052..e726437dd9 100644 --- a/satpy/readers/core/seviri.py +++ b/satpy/readers/core/seviri.py @@ -134,6 +134,15 @@ scn['IR_108']['y'] = mi scn['IR_108'].sel(time=np.datetime64('2019-03-01T12:06:13.052000000')) + Computing this coordinate can add a performance penalty for some readers. + For ``seviri_l1b_native`` it can be disabled with: + + .. code-block:: python + + scene = satpy.Scene(filenames, + reader='seviri_l1b_native', + reader_kwargs={'include_scanline_acq_time': False}) + * HRIT and Native readers can add raw metadata from the file header, such as calibration coefficients, to dataset attributes. Use the reader keyword argument ``include_raw_metadata``. Here's an example for extracting diff --git a/satpy/readers/seviri_l1b_native.py b/satpy/readers/seviri_l1b_native.py index 1178db2f5b..ce1cfae268 100644 --- a/satpy/readers/seviri_l1b_native.py +++ b/satpy/readers/seviri_l1b_native.py @@ -173,11 +173,19 @@ class NativeMSGFileHandler(BaseFileHandler): See :mod:`satpy.readers.core.seviri`. + **Scanline acquisition time** + + By default, datasets include the ``acq_time`` coordinate (mean acquisition + time per scanline). For native files this requires additional work and can + slow down loading. If not needed, disable it with + ``reader_kwargs={'include_scanline_acq_time': False}``. + """ def __init__(self, filename, filename_info, filetype_info, calib_mode="nominal", fill_disk=False, ext_calib_coefs=None, - include_raw_metadata=False, mda_max_array_size=100): + include_raw_metadata=False, mda_max_array_size=100, + include_scanline_acq_time=True): """Initialize the reader.""" super(NativeMSGFileHandler, self).__init__(filename, filename_info, @@ -188,6 +196,7 @@ def __init__(self, filename, filename_info, filetype_info, self.fill_disk = fill_disk self.include_raw_metadata = include_raw_metadata self.mda_max_array_size = mda_max_array_size + self.include_scanline_acq_time = include_scanline_acq_time # Declare required variables. self.header = {} @@ -583,7 +592,8 @@ def get_dataset(self, dataset_id, dataset_info): return None dataset = self.calibrate(xarr, dataset_id) - self._add_scanline_acq_time(dataset, dataset_id) + if self.include_scanline_acq_time: + self._add_scanline_acq_time(dataset, dataset_id) self._update_attrs(dataset, dataset_info) if self.fill_disk and not (dataset_id["name"] != "HRV" and self.mda["is_full_disk"]): diff --git a/satpy/tests/reader_tests/test_seviri_l1b_native.py b/satpy/tests/reader_tests/test_seviri_l1b_native.py index 5765024cc5..01db10fc1b 100644 --- a/satpy/tests/reader_tests/test_seviri_l1b_native.py +++ b/satpy/tests/reader_tests/test_seviri_l1b_native.py @@ -935,6 +935,7 @@ def file_handler(self): fh.ext_calib_coefs = {} fh.include_raw_metadata = False fh.mda_max_array_size = 100 + fh.include_scanline_acq_time = True return fh @staticmethod @@ -1007,6 +1008,24 @@ def test_get_dataset(self, file_handler): 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_get_dataset_without_scanline_acq_time(self, file_handler): + """Test optional skip of scanline acquisition-time coordinate.""" + dataset_id = make_dataid( + name="VIS006", + resolution=3000, + calibration="counts" + ) + dataset_info = { + "units": "1", + "wavelength": (1, 2, 3), + "standard_name": "counts" + } + file_handler.include_scanline_acq_time = False + with mock.patch.object(file_handler, "_add_scanline_acq_time") as mocked_add: + xarr = file_handler.get_dataset(dataset_id, dataset_info) + mocked_add.assert_not_called() + assert "acq_time" not in xarr.coords + def test_time(self, file_handler): """Test start/end nominal/observation time handling.""" assert dt.datetime(2006, 1, 1, 12, 15, 9, 304888) == file_handler.observation_start_time