Example #1
0
def test_combine_dicts_different(test_mda):
    """Test combination of dictionaries differing in various ways."""
    from satpy.dataset.metadata import combine_metadata
    mda = {'a': {'b': np.array([1, 2, 3]), 'c': 1.0}, 'd': 'foo'}
    test_metadata = [{'raw_metadata': mda}, {'raw_metadata': test_mda}]
    result = combine_metadata(*test_metadata)
    assert not result
Example #2
0
    def test_combine_one_metadata_object(self):
        """Test combining one metadata object."""
        mda_objects = ({'_FillValue': np.nan,
                        'valid_range': np.array([0., 0.00032], dtype=np.float32),
                        'ancillary_variables': ['cpp_status_flag',
                                                'cpp_conditions',
                                                'cpp_quality',
                                                'cpp_reff_pal',
                                                '-'],
                        'platform_name': 'NOAA-20',
                        'sensor': {'viirs'}},)

        expected = {'_FillValue': np.nan,
                    'valid_range': np.array([0., 0.00032], dtype=np.float32),
                    'ancillary_variables': ['cpp_status_flag',
                                            'cpp_conditions',
                                            'cpp_quality',
                                            'cpp_reff_pal',
                                            '-'],
                    'platform_name': 'NOAA-20',
                    'sensor': {'viirs'}}

        from satpy.dataset.metadata import combine_metadata
        result = combine_metadata(*mda_objects)
        assert np.allclose(result.pop('_FillValue'), expected.pop('_FillValue'), equal_nan=True)
        assert np.allclose(result.pop('valid_range'), expected.pop('valid_range'))
        assert result == expected
Example #3
0
def test_combine_dicts_close():
    """Test combination of dictionaries whose values are close."""
    from satpy.dataset.metadata import combine_metadata
    attrs = {
        'raw_metadata': {
            'a': 1,
            'b': 'foo',
            'c': [1, 2, 3],
            'd': {
                'e': np.str('bar'),
                'f': datetime(2020, 1, 1, 12, 15, 30),
                'g': np.array([1, 2, 3]),
            },
            'h': np.array([datetime(2020, 1, 1), datetime(2020, 1, 1)])
        }
    }
    attrs_close = {
        'raw_metadata': {
            'a': 1 + 1E-12,
            'b': 'foo',
            'c': np.array([1, 2, 3]) + 1E-12,
            'd': {
                'e': np.str('bar'),
                'f': 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)])
        }
    }
    test_metadata = [attrs, attrs_close]
    result = combine_metadata(*test_metadata)
    assert result == attrs
Example #4
0
    def test_combine_lists_different_size(self):
        """Test combine metadata with different size lists."""
        from satpy.dataset.metadata import combine_metadata
        metadatas = [
            {'prerequisites': [1, 2, 3, 4]},
            {'prerequisites': []},
        ]
        res = combine_metadata(*metadatas)
        assert 'prerequisites' not in res

        metadatas = [
            {'prerequisites': [1, 2, 3, 4]},
            {'prerequisites': [1, 2, 3]},
        ]
        res = combine_metadata(*metadatas)
        assert 'prerequisites' not in res
Example #5
0
 def test_combine_numpy_arrays(self):
     """Test combining values that are numpy arrays."""
     from satpy.dataset.metadata import combine_metadata
     test_metadata = [{'valid_range': np.array([0., 0.00032], dtype=np.float32)},
                      {'valid_range': np.array([0., 0.00032], dtype=np.float32)},
                      {'valid_range': np.array([0., 0.00032], dtype=np.float32)}]
     result = combine_metadata(*test_metadata)
     assert np.allclose(result['valid_range'], np.array([0., 0.00032], dtype=np.float32))
Example #6
0
 def test_combine_dask_arrays(self):
     """Test combining values that are dask arrays."""
     from satpy.dataset.metadata import combine_metadata
     import dask.array as da
     test_metadata = [{'valid_range': da.from_array(np.array([0., 0.00032], dtype=np.float32))},
                      {'valid_range': da.from_array(np.array([0., 0.00032], dtype=np.float32))}]
     result = combine_metadata(*test_metadata)
     assert 'valid_range' not in result
Example #7
0
 def test_combine_identical_numpy_scalars(self):
     """Test combining idendical fill values."""
     from satpy.dataset.metadata import combine_metadata
     test_metadata = [{
         '_FillValue': np.uint16(42)
     }, {
         '_FillValue': np.uint16(42)
     }]
     assert combine_metadata(*test_metadata) == {'_FillValue': 42}
Example #8
0
 def test_combine_lists_same_size_diff_values(self):
     """Test combine metadata with lists with different values."""
     from satpy.dataset.metadata import combine_metadata
     metadatas = [
         {'prerequisites': [1, 2, 3, 4]},
         {'prerequisites': [1, 2, 3, 5]},
     ]
     res = combine_metadata(*metadatas)
     assert 'prerequisites' not in res
Example #9
0
 def test_combine_lists_identical(self):
     """Test combine metadata with identical lists."""
     from satpy.dataset.metadata import combine_metadata
     metadatas = [
         {'prerequisites': [1, 2, 3, 4]},
         {'prerequisites': [1, 2, 3, 4]},
     ]
     res = combine_metadata(*metadatas)
     assert res['prerequisites'] == [1, 2, 3, 4]
Example #10
0
 def test_combine_arrays(self):
     """Test the combine_metadata with arrays."""
     from satpy.dataset.metadata import combine_metadata
     from numpy import arange, ones
     from xarray import DataArray
     dts = [
             {"quality": (arange(25) % 2).reshape(5, 5).astype("?")},
             {"quality": (arange(1, 26) % 3).reshape(5, 5).astype("?")},
             {"quality": ones((5, 5,), "?")},
     ]
     assert "quality" not in combine_metadata(*dts)
     dts2 = [{"quality": DataArray(d["quality"])} for d in dts]
     assert "quality" not in combine_metadata(*dts2)
     # the ancillary_variables attribute is actually a list of data arrays
     dts3 = [{"quality": [d["quality"]]} for d in dts]
     assert "quality" not in combine_metadata(*dts3)
     # check cases with repeated arrays
     dts4 = [
             {"quality": dts[0]["quality"]},
             {"quality": dts[0]["quality"]},
             ]
     assert "quality" in combine_metadata(*dts4)
     dts5 = [
             {"quality": dts3[0]["quality"]},
             {"quality": dts3[0]["quality"]},
             ]
     assert "quality" in combine_metadata(*dts5)
     # check with other types
     dts6 = [
             DataArray(arange(5), attrs=dts[0]),
             DataArray(arange(5), attrs=dts[0]),
             DataArray(arange(5), attrs=dts[1]),
             object()
           ]
     assert "quality" not in combine_metadata(*dts6)
Example #11
0
    def test_combine_real_world_mda(self):
        """Test with real data."""
        mda_objects = ({'_FillValue': np.nan,
                        'valid_range': np.array([0., 0.00032], dtype=np.float32),
                        'ancillary_variables': ['cpp_status_flag',
                                                'cpp_conditions',
                                                'cpp_quality',
                                                'cpp_reff_pal',
                                                '-'],
                        'platform_name': 'NOAA-20',
                        'sensor': {'viirs'},
                        'raw_metadata': {'foo': {'bar': np.array([1, 2, 3])}}},
                       {'_FillValue': np.nan,
                        'valid_range': np.array([0., 0.00032], dtype=np.float32),
                        'ancillary_variables': ['cpp_status_flag',
                                                'cpp_conditions',
                                                'cpp_quality',
                                                'cpp_reff_pal',
                                                '-'],
                        'platform_name': 'NOAA-20',
                        'sensor': {'viirs'},
                        'raw_metadata': {'foo': {'bar': np.array([1, 2, 3])}}})

        expected = {'_FillValue': np.nan,
                    'valid_range': np.array([0., 0.00032], dtype=np.float32),
                    'ancillary_variables': ['cpp_status_flag',
                                            'cpp_conditions',
                                            'cpp_quality',
                                            'cpp_reff_pal',
                                            '-'],
                    'platform_name': 'NOAA-20',
                    'sensor': {'viirs'},
                    'raw_metadata': {'foo': {'bar': np.array([1, 2, 3])}}}

        from satpy.dataset.metadata import combine_metadata
        result = combine_metadata(*mda_objects)
        assert np.allclose(result.pop('_FillValue'), expected.pop('_FillValue'), equal_nan=True)
        assert np.allclose(result.pop('valid_range'), expected.pop('valid_range'))
        np.testing.assert_equal(result.pop('raw_metadata'),
                                expected.pop('raw_metadata'))
        assert result == expected
Example #12
0
 def test_combine_nans(self):
     """Test combining nan fill values."""
     from satpy.dataset.metadata import combine_metadata
     test_metadata = [{'_FillValue': np.nan}, {'_FillValue': np.nan}]
     assert combine_metadata(*test_metadata) == {'_FillValue': np.nan}
Example #13
0
 def test_combine_empty_metadata(self):
     """Test combining empty metadata."""
     from satpy.dataset.metadata import combine_metadata
     test_metadata = [{}, {}]
     assert combine_metadata(*test_metadata) == {}
Example #14
0
 def test_combine_times_without_averaging(self):
     """Test the combine_metadata with times without averaging."""
     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
     self.assertNotIn('start_time', ret)
Example #15
0
 def test_combine_times_with_averaging(self):
     """Test the combine_metadata with times with averaging."""
     from satpy.dataset.metadata import combine_metadata
     ret = combine_metadata(*self.datetime_dts)
     self.assertEqual(self.datetime_dts[2]['start_time'], ret['start_time'])