def get_fake_file_handler(start_time,
                          nlines,
                          ncols,
                          projection_longitude=0,
                          orbit_polynomials=ORBIT_POLYNOMIALS):
    """Create a mocked SEVIRI HRIT file handler."""
    prologue = get_fake_prologue(projection_longitude, orbit_polynomials)
    mda = get_fake_mda(nlines=nlines, ncols=ncols, start_time=start_time)
    filename_info = get_fake_filename_info(start_time)
    epilogue = get_fake_epilogue()

    m = mock.mock_open()
    with mock.patch('satpy.readers.seviri_l1b_hrit.np.fromfile') as fromfile, \
            mock.patch('satpy.readers.hrit_base.open', m, create=True) as newopen, \
            mock.patch('satpy.readers.seviri_l1b_hrit.CHANNEL_NAMES'), \
            mock.patch.object(HRITMSGFileHandler, '_get_hd', new=new_get_hd), \
            mock.patch.object(HRITMSGPrologueFileHandler, 'read_prologue',
                              new=get_new_read_prologue(prologue)):

        fromfile.return_value = np.array([(1, 2)],
                                         dtype=[('total_header_length', int),
                                                ('hdr_id', int)])
        newopen.return_value.__enter__.return_value.tell.return_value = 1
        prologue = HRITMSGPrologueFileHandler(
            filename='dummy_prologue_filename',
            filename_info=filename_info,
            filetype_info={})
        epilogue = mock.MagicMock(epilogue=epilogue)

        reader = HRITMSGFileHandler('filename', filename_info,
                                    {'filetype': 'info'}, prologue, epilogue)
        reader.mda.update(mda)
        return reader
Esempio n. 2
0
 def setUp(self, *mocks):
     """Set up the test case."""
     self.reader = HRITMSGPrologueFileHandler()
     self.reader.satpos = None
     self.reader.prologue = {
         'GeometricProcessing': {
             'EarthModel': {
                 'EquatorialRadius': 6378.169,
                 'NorthPolarRadius': 6356.5838,
                 'SouthPolarRadius': 6356.5838
             }
         },
         'ImageAcquisition': {
             'PlannedAcquisitionTime': {
                 'TrueRepeatCycleStart': datetime(2006, 1, 1, 12, 15, 9, 304888)
             }
         },
         'SatelliteStatus': {
             'Orbit': {
                 'OrbitPolynomial': {
                     'StartTime': np.array([
                         [datetime(2006, 1, 1, 6), datetime(2006, 1, 1, 12), datetime(2006, 1, 1, 18),
                          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)]]),
                     'X': [np.zeros(8),
                           [8.41607082e+04, 2.94319260e+00, 9.86748617e-01, -2.70135453e-01,
                            -3.84364650e-02, 8.48718433e-03, 7.70548174e-04, -1.44262718e-04],
                           np.zeros(8)],
                     'Y': [np.zeros(8),
                           [-5.21170255e+03, 5.12998948e+00, -1.33370453e+00, -3.09634144e-01,
                            6.18232793e-02, 7.50505681e-03, -1.35131011e-03, -1.12054405e-04],
                           np.zeros(8)],
                     'Z': [np.zeros(8),
                           [-6.51293855e+02, 1.45830459e+02, 5.61379400e+01, -3.90970565e+00,
                            -7.38137565e-01, 3.06131644e-02, 3.82892428e-03, -1.12739309e-04],
                           np.zeros(8)],
                 }
             }
         }
     }
     self.reader._reduced = None
Esempio n. 3
0
    def test_extra_kwargs(self, init, *mocks):
        """Test whether the prologue file handler accepts extra keyword arguments."""
        def init_patched(self, *args, **kwargs):
            self.mda = {}
        init.side_effect = init_patched

        HRITMSGPrologueFileHandler(filename=None,
                                   filename_info={'service': ''},
                                   filetype_info=None,
                                   ext_calib_coefs={},
                                   mda_max_array_size=123,
                                   calib_mode='nominal')
Esempio n. 4
0
    def test_calibrate(self, init, *mocks):
        """Test whether the prologue file handler accepts extra calibration keywords"""
        def init_patched(self, *args, **kwargs):
            self.mda = {}

        init.side_effect = init_patched

        HRITMSGPrologueFileHandler(filename=None,
                                   filename_info={'service': ''},
                                   filetype_info=None,
                                   ext_calib_coefs={},
                                   calib_mode='nominal')
Esempio n. 5
0
class TestHRITMSGPrologueFileHandler(unittest.TestCase):
    """Test the HRIT prologue file handler."""
    @mock.patch(
        'satpy.readers.seviri_l1b_hrit.HRITMSGPrologueFileHandler.__init__',
        return_value=None)
    def setUp(self, *mocks):
        self.reader = HRITMSGPrologueFileHandler()
        self.reader.satpos = None
        self.reader.prologue = {
            'GeometricProcessing': {
                'EarthModel': {
                    'EquatorialRadius': 6378.169,
                    'NorthPolarRadius': 6356.5838,
                    'SouthPolarRadius': 6356.5838
                }
            },
            'ImageAcquisition': {
                'PlannedAcquisitionTime': {
                    'TrueRepeatCycleStart': datetime(2006, 1, 1, 12, 15, 9,
                                                     304888)
                }
            },
            'SatelliteStatus': {
                'Orbit': {
                    'OrbitPolynomial': {
                        'StartTime':
                        np.array([[
                            datetime(2006, 1, 1, 6),
                            datetime(2006, 1, 1, 12),
                            datetime(2006, 1, 1, 18)
                        ]]),
                        'EndTime':
                        np.array([[
                            datetime(2006, 1, 1, 12),
                            datetime(2006, 1, 1, 18),
                            datetime(2006, 1, 2, 0)
                        ]]),
                        'X': [
                            np.zeros(8),
                            [
                                8.41607082e+04, 2.94319260e+00, 9.86748617e-01,
                                -2.70135453e-01, -3.84364650e-02,
                                8.48718433e-03, 7.70548174e-04, -1.44262718e-04
                            ],
                            np.zeros(8)
                        ],
                        'Y': [
                            np.zeros(8),
                            [
                                -5.21170255e+03, 5.12998948e+00,
                                -1.33370453e+00, -3.09634144e-01,
                                6.18232793e-02, 7.50505681e-03,
                                -1.35131011e-03, -1.12054405e-04
                            ],
                            np.zeros(8)
                        ],
                        'Z': [
                            np.zeros(8),
                            [
                                -6.51293855e+02, 1.45830459e+02,
                                5.61379400e+01, -3.90970565e+00,
                                -7.38137565e-01, 3.06131644e-02,
                                3.82892428e-03, -1.12739309e-04
                            ],
                            np.zeros(8)
                        ],
                    }
                }
            }
        }
        self.reader._reduced = None

    @mock.patch(
        'satpy.readers.seviri_l1b_hrit.HRITMSGPrologueFileHandler.read_prologue'
    )
    @mock.patch('satpy.readers.hrit_base.HRITFileHandler.__init__',
                autospec=True)
    def test_extra_kwargs(self, init, *mocks):
        """Test whether the prologue file handler accepts extra keyword arguments"""
        def init_patched(self, *args, **kwargs):
            self.mda = {}

        init.side_effect = init_patched

        HRITMSGPrologueFileHandler(filename=None,
                                   filename_info={'service': ''},
                                   filetype_info=None,
                                   ext_calib_coefs={},
                                   mda_max_array_size=123,
                                   calib_mode='nominal')

    def test_find_orbit_coefs(self):
        """Test identification of orbit coefficients"""

        self.assertEqual(self.reader._find_orbit_coefs(), 1)

        # No interval enclosing the given timestamp
        self.reader.prologue['ImageAcquisition']['PlannedAcquisitionTime'][
            'TrueRepeatCycleStart'] = datetime(2000, 1, 1)
        self.assertRaises(NoValidOrbitParams, self.reader._find_orbit_coefs)

    @mock.patch(
        'satpy.readers.seviri_l1b_hrit.HRITMSGPrologueFileHandler._find_orbit_coefs'
    )
    def test_get_satpos_cart(self, find_orbit_coefs):
        """Test satellite position in cartesian coordinates"""
        find_orbit_coefs.return_value = 1
        x, y, z = self.reader._get_satpos_cart()
        self.assertTrue(
            np.allclose(
                [x, y, z],
                [42078421.37095518, -2611352.744615312, -419828.9699940758]))

    @mock.patch(
        'satpy.readers.seviri_l1b_hrit.HRITMSGPrologueFileHandler._get_satpos_cart'
    )
    def test_get_satpos(self, get_satpos_cart):
        """Test satellite position in spherical coordinates"""
        get_satpos_cart.return_value = [
            42078421.37095518, -2611352.744615312, -419828.9699940758
        ]
        lon, lat, dist = self.reader.get_satpos()
        self.assertTrue(
            np.allclose(lon, lat, dist),
            [-3.5511754052132387, -0.5711189258409902, 35783328.146167226])

        # Test cache
        self.reader.get_satpos()
        self.assertEqual(get_satpos_cart.call_count, 1)

        # No valid coefficients
        self.reader.satpos = None  # reset cache
        get_satpos_cart.side_effect = NoValidOrbitParams
        self.reader.prologue['ImageAcquisition']['PlannedAcquisitionTime'][
            'TrueRepeatCycleStart'] = datetime(2000, 1, 1)
        self.assertTupleEqual(self.reader.get_satpos(), (None, None, None))

    def test_get_earth_radii(self):
        """Test readout of earth radii"""
        earth_model = self.reader.prologue['GeometricProcessing']['EarthModel']
        earth_model['EquatorialRadius'] = 2
        earth_model['NorthPolarRadius'] = 1
        earth_model['SouthPolarRadius'] = 2
        a, b = self.reader.get_earth_radii()
        self.assertEqual(a, 2000)
        self.assertEqual(b, 1500)

    @mock.patch('satpy.readers.seviri_l1b_hrit.utils.reduce_mda')
    def test_reduce(self, reduce_mda):
        """Test metadata reduction"""
        reduce_mda.return_value = 'reduced'

        # Set buffer
        self.assertEqual(self.reader.reduce(123), 'reduced')
        reduce_mda.assert_called()

        # Read buffer
        reduce_mda.reset_mock()
        self.reader._reduced = 'red'
        self.assertEqual(self.reader.reduce(123), 'red')
        reduce_mda.assert_not_called()