From 7e90ee71230a2f6e6f0a61e72c9674c5bd9dd682 Mon Sep 17 00:00:00 2001 From: Gerrit Holl Date: Wed, 16 Feb 2022 09:52:23 +0100 Subject: [PATCH 1/2] Allow skipping unit conversion in NinJoTIFF Add an option to the NinJoTIFF writer to skip unit conversion. For a detailed rationale, see https://github.com/pytroll/satpy/issues/2024. --- satpy/tests/writer_tests/test_ninjotiff.py | 13 +++++++++++++ satpy/writers/ninjotiff.py | 9 ++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/satpy/tests/writer_tests/test_ninjotiff.py b/satpy/tests/writer_tests/test_ninjotiff.py index 233b74b0d2..1eac33f82a 100644 --- a/satpy/tests/writer_tests/test_ninjotiff.py +++ b/satpy/tests/writer_tests/test_ninjotiff.py @@ -67,6 +67,19 @@ def test_dataset(self, iwsd): uconv.assert_called_once_with(dataset, 'K', 'CELSIUS') self.assertEqual(iwsd.call_count, 1) + @mock.patch('satpy.writers.ninjotiff.ImageWriter.save_dataset') + @mock.patch('satpy.writers.ninjotiff.nt', pyninjotiff_mock.ninjotiff) + def test_dataset_skip_unit_conversion(self, iwsd): + """Test saving a dataset without unit conversion.""" + from satpy.writers.ninjotiff import NinjoTIFFWriter + ntw = NinjoTIFFWriter() + dataset = xr.DataArray([1, 2, 3], attrs={'units': 'K'}) + with mock.patch('satpy.writers.ninjotiff.convert_units') as uconv: + ntw.save_dataset(dataset, physic_unit='CELSIUS', + convert_temperature_units=False) + uconv.assert_not_called() + self.assertEqual(iwsd.call_count, 1) + @mock.patch('satpy.writers.ninjotiff.NinjoTIFFWriter.save_dataset') @mock.patch('satpy.writers.ninjotiff.ImageWriter.save_image') @mock.patch('satpy.writers.ninjotiff.nt', pyninjotiff_mock.ninjotiff) diff --git a/satpy/writers/ninjotiff.py b/satpy/writers/ninjotiff.py index 577dc57b2a..1b5448b363 100644 --- a/satpy/writers/ninjotiff.py +++ b/satpy/writers/ninjotiff.py @@ -177,12 +177,14 @@ def save_image(self, img, filename=None, compute=True, **kwargs): # floating_po return nt.save(img, filename, data_is_scaled_01=True, compute=compute, **kwargs) def save_dataset( - self, dataset, filename=None, fill_value=None, compute=True, **kwargs + self, dataset, filename=None, fill_value=None, compute=True, + convert_temperature_units=True, **kwargs ): """Save a dataset to ninjotiff format. This calls `save_image` in turn, but first preforms some unit conversion - if necessary. + if necessary and desired. Unit conversion can be suppressed by passing + ``convert_temperature_units=False``. """ nunits = kwargs.get("physic_unit", None) if nunits is None: @@ -201,7 +203,8 @@ def save_dataset( "Saving to physical ninjo file without units defined in dataset!" ) else: - dataset = convert_units(dataset, units, nunits) + if convert_temperature_units: + dataset = convert_units(dataset, units, nunits) return super(NinjoTIFFWriter, self).save_dataset( dataset, filename=filename, compute=compute, fill_value=fill_value, **kwargs ) From 0ab9806cbfade2e999e474f889b68b31125b95b7 Mon Sep 17 00:00:00 2001 From: Gerrit Holl Date: Wed, 16 Feb 2022 11:03:57 +0100 Subject: [PATCH 2/2] Add debug messages for ninjotiff unit conversion --- satpy/writers/ninjotiff.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/satpy/writers/ninjotiff.py b/satpy/writers/ninjotiff.py index 1b5448b363..557b2749d0 100644 --- a/satpy/writers/ninjotiff.py +++ b/satpy/writers/ninjotiff.py @@ -116,6 +116,7 @@ def convert_units(dataset, in_unit, out_unit): return dataset if in_unit.lower() in {"k", "kelvin"} and out_unit.lower() in {"c", "celsius"}: + logger.debug("Converting temperature units from K to °C") with xr.set_options(keep_attrs=True): new_dataset = dataset - 273.15 new_dataset.attrs["units"] = out_unit @@ -205,6 +206,8 @@ def save_dataset( else: if convert_temperature_units: dataset = convert_units(dataset, units, nunits) + else: + logger.debug("Omitting unit conversion") return super(NinjoTIFFWriter, self).save_dataset( dataset, filename=filename, compute=compute, fill_value=fill_value, **kwargs )