示例#1
0
 def test_fix_modifier_attr(self):
     """Check that fix modifier can handle empty list as modifier attribute."""
     self.reader = SatpyCFFileHandler('filename', {}, {'filetype': 'info'})
     ds_info = {'modifiers': []}
     self.reader.fix_modifier_attr(ds_info)
     self.assertEqual(ds_info['modifiers'], ())
示例#2
0
class TestCFReader(unittest.TestCase):
    """Test case for CF reader."""
    def setUp(self):
        """Create a test scene."""
        tstart = datetime(2019, 4, 1, 12, 0)
        tend = datetime(2019, 4, 1, 12, 15)
        data_visir = [[1, 2], [3, 4]]
        y_visir = [1, 2]
        x_visir = [1, 2]
        z_visir = [1, 2, 3, 4, 5, 6, 7]
        qual_data = [[1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7]]
        time_vis006 = [1, 2]
        lat = 33.0 * np.array([[1, 2], [3, 4]])
        lon = -13.0 * np.array([[1, 2], [3, 4]])
        common_attrs = {
            'start_time': tstart,
            'end_time': tend,
            'platform_name': 'tirosn',
            'orbit_number': 99999
        }
        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')
                              })

        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
                           },
                           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([])
                           })
        self.scene = Scene()
        self.scene.attrs['sensor'] = ['avhrr-1', 'avhrr-2', 'avhrr-3']
        scene_dict = {
            'image0': vis006,
            'image1': ir_108,
            'lat': lat,
            'lon': lon,
            'qual_flags': qual_f
        }
        for key in scene_dict:
            self.scene[key] = scene_dict[key]
            self.scene[key].attrs.update(common_attrs)

    def test_write_and_read(self):
        """Save a file with cf_writer and read the data again."""
        filename = 'testingcfwriter{:s}-viirs-mband-20201007075915-20201007080744.nc'.format(
            datetime.utcnow().strftime('%Y%j%H%M%S'))
        try:
            self.scene.save_datasets(writer='cf',
                                     filename=filename,
                                     header_attrs={'instrument': 'avhrr'},
                                     engine='h5netcdf',
                                     flatten_attrs=True,
                                     pretty=True)
            scn_ = Scene(reader='satpy_cf_nc', filenames=[filename])
            scn_.load(['image0', 'image1', 'lat'])
            self.assertTrue(
                np.all(scn_['image0'].data == self.scene['image0'].data))
            self.assertTrue(
                np.all(scn_['lat'].data ==
                       self.scene['lat'].data))  # lat loaded as dataset
            self.assertTrue(
                np.all(scn_['image0'].coords['lon'] ==
                       self.scene['lon'].data))  # lon loded as coord
            assert isinstance(scn_['image0'].attrs['wavelength'],
                              WavelengthRange)
        finally:
            with suppress(PermissionError):
                os.remove(filename)

    def test_fix_modifier_attr(self):
        """Check that fix modifier can handle empty list as modifier attribute."""
        self.reader = SatpyCFFileHandler('filename', {}, {'filetype': 'info'})
        ds_info = {'modifiers': []}
        self.reader.fix_modifier_attr(ds_info)
        self.assertEqual(ds_info['modifiers'], ())
示例#3
0
class TestCFReader(unittest.TestCase):
    """Test case for CF reader."""
    def setUp(self):
        """Create a test scene."""
        tstart = datetime(2019, 4, 1, 12, 0)
        tend = datetime(2019, 4, 1, 12, 15)
        data_visir = [[1, 2], [3, 4]]
        y_visir = [1, 2]
        x_visir = [1, 2]
        z_visir = [1, 2, 3, 4, 5, 6, 7]
        qual_data = [[1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7]]
        time_vis006 = [1, 2]
        lat = 33.0 * np.array([[1, 2], [3, 4]])
        lon = -13.0 * np.array([[1, 2], [3, 4]])
        common_attrs = {
            'start_time': tstart,
            'end_time': tend,
            'platform_name': 'tirosn',
            'orbit_number': 99999
        }
        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')
                              })

        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
                           },
                           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([])
                           })
        self.scene = Scene()
        self.scene.attrs['sensor'] = ['avhrr-1', 'avhrr-2', 'avhrr-3']
        scene_dict = {
            'image0': vis006,
            'image1': ir_108,
            'lat': lat,
            'lon': lon,
            'qual_flags': qual_f
        }
        for key in scene_dict:
            self.scene[key] = scene_dict[key]
            self.scene[key].attrs.update(common_attrs)

    def test_write_and_read(self):
        """Save a file with cf_writer and read the data again."""
        filename = 'testingcfwriter{:s}-viirs-mband-20201007075915-20201007080744.nc'.format(
            datetime.utcnow().strftime('%Y%j%H%M%S'))
        try:
            self.scene.save_datasets(writer='cf',
                                     filename=filename,
                                     header_attrs={'instrument': 'avhrr'},
                                     engine='h5netcdf',
                                     flatten_attrs=True,
                                     pretty=True)
            scn_ = Scene(reader='satpy_cf_nc', filenames=[filename])
            scn_.load(['image0', 'image1', 'lat'])
            np.testing.assert_array_equal(scn_['image0'].data,
                                          self.scene['image0'].data)
            np.testing.assert_array_equal(
                scn_['lat'].data,
                self.scene['lat'].data)  # lat loaded as dataset
            np.testing.assert_array_equal(
                scn_['image0'].coords['lon'],
                self.scene['lon'].data)  # lon loded as coord
            assert isinstance(scn_['image0'].attrs['wavelength'],
                              WavelengthRange)
        finally:
            with suppress(PermissionError):
                os.remove(filename)

    def test_fix_modifier_attr(self):
        """Check that fix modifier can handle empty list as modifier attribute."""
        self.reader = SatpyCFFileHandler('filename', {}, {'filetype': 'info'})
        ds_info = {'modifiers': []}
        self.reader.fix_modifier_attr(ds_info)
        self.assertEqual(ds_info['modifiers'], ())

    def _dataset_for_prefix_testing(self):
        data_visir = [[1, 2], [3, 4]]
        y_visir = [1, 2]
        x_visir = [1, 2]
        lat = 33.0 * np.array([[1, 2], [3, 4]])
        lon = -13.0 * np.array([[1, 2], [3, 4]])
        vis006 = xr.DataArray(data_visir,
                              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')
                              })
        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([])
                           })
        scene = Scene()
        scene.attrs['sensor'] = ['avhrr-1', 'avhrr-2', 'avhrr-3']
        scene['1'] = vis006
        scene['lat'] = lat
        scene['lon'] = lon

        return scene

    def test_read_prefixed_channels(self):
        """Check channels starting with digit is prefixed and read back correctly."""
        scene = self._dataset_for_prefix_testing()
        # Testing with default prefixing
        filename = 'testingcfwriter{:s}-viirs-mband-20201007075915-20201007080744.nc'.format(
            datetime.utcnow().strftime('%Y%j%H%M%S'))
        try:
            scene.save_datasets(writer='cf',
                                filename=filename,
                                header_attrs={'instrument': 'avhrr'},
                                engine='netcdf4',
                                flatten_attrs=True,
                                pretty=True)
            scn_ = Scene(reader='satpy_cf_nc', filenames=[filename])
            scn_.load(['1'])
            np.testing.assert_array_equal(scn_['1'].data, scene['1'].data)
            np.testing.assert_array_equal(
                scn_['1'].coords['lon'],
                scene['lon'].data)  # lon loaded as coord

            scn_ = Scene(reader='satpy_cf_nc',
                         filenames=[filename],
                         reader_kwargs={})
            scn_.load(['1'])
            np.testing.assert_array_equal(scn_['1'].data, scene['1'].data)
            np.testing.assert_array_equal(
                scn_['1'].coords['lon'],
                scene['lon'].data)  # lon loaded as coord

            # Check that variables starting with a digit is written to filename variable prefixed
            with xr.open_dataset(filename) as ds_disk:
                np.testing.assert_array_equal(ds_disk['CHANNEL_1'].data,
                                              scene['1'].data)
        finally:
            with suppress(PermissionError):
                os.remove(filename)

    def test_read_prefixed_channels_include_orig_name(self):
        """Check channels starting with digit and includeed orig name is prefixed and read back correctly."""
        scene = self._dataset_for_prefix_testing()
        # Testing with default prefixing
        filename = 'testingcfwriter{:s}-viirs-mband-20201007075915-20201007080744.nc'.format(
            datetime.utcnow().strftime('%Y%j%H%M%S'))
        try:
            scene.save_datasets(writer='cf',
                                filename=filename,
                                header_attrs={'instrument': 'avhrr'},
                                engine='netcdf4',
                                flatten_attrs=True,
                                pretty=True,
                                include_orig_name=True)
            scn_ = Scene(reader='satpy_cf_nc', filenames=[filename])
            scn_.load(['1'])
            np.testing.assert_array_equal(scn_['1'].data, scene['1'].data)
            np.testing.assert_array_equal(
                scn_['1'].coords['lon'],
                scene['lon'].data)  # lon loaded as coord

            self.assertEqual(scn_['1'].attrs['original_name'], '1')

            # Check that variables starting with a digit is written to filename variable prefixed
            with xr.open_dataset(filename) as ds_disk:
                np.testing.assert_array_equal(ds_disk['CHANNEL_1'].data,
                                              scene['1'].data)
        finally:
            with suppress(PermissionError):
                os.remove(filename)

    def test_read_prefixed_channels_by_user(self):
        """Check channels starting with digit is prefixed by user and read back correctly."""
        scene = self._dataset_for_prefix_testing()
        filename = 'testingcfwriter{:s}-viirs-mband-20201007075915-20201007080744.nc'.format(
            datetime.utcnow().strftime('%Y%j%H%M%S'))
        try:
            scene.save_datasets(writer='cf',
                                filename=filename,
                                header_attrs={'instrument': 'avhrr'},
                                engine='netcdf4',
                                flatten_attrs=True,
                                pretty=True,
                                numeric_name_prefix='USER')
            scn_ = Scene(reader='satpy_cf_nc',
                         filenames=[filename],
                         reader_kwargs={'numeric_name_prefix': 'USER'})
            scn_.load(['1'])
            np.testing.assert_array_equal(scn_['1'].data, scene['1'].data)
            np.testing.assert_array_equal(
                scn_['1'].coords['lon'],
                scene['lon'].data)  # lon loded as coord

            # Check that variables starting with a digit is written to filename variable prefixed
            with xr.open_dataset(filename) as ds_disk:
                np.testing.assert_array_equal(ds_disk['USER1'].data,
                                              scene['1'].data)
        finally:
            with suppress(PermissionError):
                os.remove(filename)

    def test_read_prefixed_channels_by_user2(self):
        """Check channels starting with digit is prefixed by user when saving and read back correctly without prefix."""
        scene = self._dataset_for_prefix_testing()
        filename = 'testingcfwriter{:s}-viirs-mband-20201007075915-20201007080744.nc'.format(
            datetime.utcnow().strftime('%Y%j%H%M%S'))
        try:
            scene.save_datasets(writer='cf',
                                filename=filename,
                                header_attrs={'instrument': 'avhrr'},
                                engine='netcdf4',
                                flatten_attrs=True,
                                pretty=True,
                                include_orig_name=False,
                                numeric_name_prefix='USER')
            scn_ = Scene(reader='satpy_cf_nc', filenames=[filename])
            scn_.load(['USER1'])
            np.testing.assert_array_equal(scn_['USER1'].data, scene['1'].data)
            np.testing.assert_array_equal(
                scn_['USER1'].coords['lon'],
                scene['lon'].data)  # lon loded as coord

        finally:
            with suppress(PermissionError):
                os.remove(filename)

    def test_read_prefixed_channels_by_user_include_prefix(self):
        """Check channels starting with digit is prefixed by user and include original name when saving."""
        scene = self._dataset_for_prefix_testing()
        filename = 'testingcfwriter2{:s}-viirs-mband-20201007075915-20201007080744.nc'.format(
            datetime.utcnow().strftime('%Y%j%H%M%S'))
        try:
            scene.save_datasets(writer='cf',
                                filename=filename,
                                header_attrs={'instrument': 'avhrr'},
                                engine='netcdf4',
                                flatten_attrs=True,
                                pretty=True,
                                include_orig_name=True,
                                numeric_name_prefix='USER')
            scn_ = Scene(reader='satpy_cf_nc', filenames=[filename])
            scn_.load(['1'])
            np.testing.assert_array_equal(scn_['1'].data, scene['1'].data)
            np.testing.assert_array_equal(
                scn_['1'].coords['lon'],
                scene['lon'].data)  # lon loded as coord

        finally:
            with suppress(PermissionError):
                os.remove(filename)

    def test_read_prefixed_channels_by_user_no_prefix(self):
        """Check channels starting with digit is not prefixed by user."""
        scene = self._dataset_for_prefix_testing()
        filename = 'testingcfwriter3{:s}-viirs-mband-20201007075915-20201007080744.nc'.format(
            datetime.utcnow().strftime('%Y%j%H%M%S'))
        try:
            scene.save_datasets(writer='cf',
                                filename=filename,
                                header_attrs={'instrument': 'avhrr'},
                                engine='netcdf4',
                                flatten_attrs=True,
                                pretty=True,
                                numeric_name_prefix='')
            scn_ = Scene(reader='satpy_cf_nc', filenames=[filename])
            scn_.load(['1'])
            np.testing.assert_array_equal(scn_['1'].data, scene['1'].data)
            np.testing.assert_array_equal(
                scn_['1'].coords['lon'],
                scene['lon'].data)  # lon loded as coord

        finally:
            with suppress(PermissionError):
                os.remove(filename)