def test_dec10216(self): res = dec10216(np.array([255, 255, 255, 255, 255], dtype=np.uint8)) exp = (np.ones((4, )) * 1023).astype(np.uint16) self.assertTrue(np.all(res == exp)) res = dec10216(np.array([1, 1, 1, 1, 1], dtype=np.uint8)) exp = np.array([4, 16, 64, 257], dtype=np.uint16) self.assertTrue(np.all(res == exp))
def get_dataset(self, dsid, info, xslice=slice(None), yslice=slice(None)): if dsid.name not in self.mda['channel_list']: raise KeyError('Channel % s not available in the file' % dsid.name) elif dsid.name not in ['HRV']: shape = (self.mda['number_of_lines'], self.mda['number_of_columns']) # Check if there is only 1 channel in the list as a change # is needed in the arrray assignment ie channl id is not present if len(self.mda['channel_list']) == 1: raw = self.dask_array['visir']['line_data'] else: i = self.mda['channel_list'].index(dsid.name) raw = self.dask_array['visir']['line_data'][:, i, :] data = dec10216(raw.flatten()) data = da.flipud(da.fliplr((data.reshape(shape)))) else: shape = (self.mda['hrv_number_of_lines'], self.mda['hrv_number_of_columns']) raw2 = self.dask_array['hrv']['line_data'][:, 2, :] raw1 = self.dask_array['hrv']['line_data'][:, 1, :] raw0 = self.dask_array['hrv']['line_data'][:, 0, :] shape_layer = (self.mda['number_of_lines'], self.mda['hrv_number_of_columns']) data2 = dec10216(raw2.flatten()) data2 = da.flipud(da.fliplr((data2.reshape(shape_layer)))) data1 = dec10216(raw1.flatten()) data1 = da.flipud(da.fliplr((data1.reshape(shape_layer)))) data0 = dec10216(raw0.flatten()) data0 = da.flipud(da.fliplr((data0.reshape(shape_layer)))) data = np.zeros(shape) idx = range(0, shape[0], 3) data[idx, :] = data2 idx = range(1, shape[0], 3) data[idx, :] = data1 idx = range(2, shape[0], 3) data[idx, :] = data0 xarr = xr.DataArray(data, dims=['y', 'x']).where(data != 0).astype(np.float32) if xarr is None: dataset = None else: dataset = self.calibrate(xarr, dsid) dataset.attrs['units'] = info['units'] dataset.attrs['wavelength'] = info['wavelength'] dataset.attrs['standard_name'] = info['standard_name'] dataset.attrs['platform_name'] = self.mda['platform_name'] dataset.attrs['sensor'] = 'seviri' dataset.attrs['orbital_parameters'] = { 'projection_longitude': self.mda['projection_parameters']['ssp_longitude'], 'projection_latitude': 0., 'projection_altitude': self.mda['projection_parameters']['h']} return dataset
def test_dec10216(self): """Test the dec10216 function.""" res = dec10216(np.array([255, 255, 255, 255, 255], dtype=np.uint8)) exp = (np.ones((4, )) * 1023).astype(np.uint16) np.testing.assert_equal(res, exp) res = dec10216(np.array([1, 1, 1, 1, 1], dtype=np.uint8)) exp = np.array([4, 16, 64, 257], dtype=np.uint16) np.testing.assert_equal(res, exp)
def _get_visir_channel(self, dataset_id): shape = (self.mda['number_of_lines'], self.mda['number_of_columns']) # Check if there is only 1 channel in the list as a change # is needed in the arrray assignment ie channl id is not present if len(self.mda['channel_list']) == 1: raw = self.dask_array['visir']['line_data'] else: i = self.mda['channel_list'].index(dataset_id['name']) raw = self.dask_array['visir']['line_data'][:, i, :] data = dec10216(raw.flatten()) data = data.reshape(shape) return data
def _get_hrv_channel(self): shape = (self.mda['hrv_number_of_lines'], self.mda['hrv_number_of_columns']) shape_layer = (self.mda['number_of_lines'], self.mda['hrv_number_of_columns']) data_list = [] for i in range(3): raw = self.dask_array['hrv']['line_data'][:, i, :] data = dec10216(raw.flatten()) data = data.reshape(shape_layer) data_list.append(data) return np.stack(data_list, axis=1).reshape(shape)
def read_band(self, key, info): """Read the data.""" shape = int(np.ceil(self.mda['data_field_length'] / 8.)) if self.mda['number_of_bits_per_pixel'] == 16: dtype = '>u2' shape //= 2 elif self.mda['number_of_bits_per_pixel'] in [8, 10]: dtype = np.uint8 shape = (shape, ) data = self._read_or_memmap_data(shape, dtype) data = da.from_array(data, chunks=shape[0]) if self.mda['number_of_bits_per_pixel'] == 10: data = dec10216(data) data = data.reshape((self.mda['number_of_lines'], self.mda['number_of_columns'])) return data
def read_band(self, key, info): """Read the data.""" shape = int(np.ceil(self.mda['data_field_length'] / 8.)) if self.mda['number_of_bits_per_pixel'] == 16: dtype = '>u2' shape //= 2 elif self.mda['number_of_bits_per_pixel'] in [8, 10]: dtype = np.uint8 shape = (shape, ) # For reading the image data, unzip_context is faster than generic_open with utils.unzip_context(self.filename) as fn: data = np.memmap(fn, mode='r', offset=self.mda['total_header_length'], dtype=dtype, shape=shape) data = da.from_array(data, chunks=shape[0]) if self.mda['number_of_bits_per_pixel'] == 10: data = dec10216(data) data = data.reshape( (self.mda['number_of_lines'], self.mda['number_of_columns'])) return data
def get_dataset(self, dataset_id, dataset_info): """Get the dataset.""" if dataset_id['name'] not in self.mda['channel_list']: raise KeyError('Channel % s not available in the file' % dataset_id['name']) elif dataset_id['name'] not in ['HRV']: shape = (self.mda['number_of_lines'], self.mda['number_of_columns']) # Check if there is only 1 channel in the list as a change # is needed in the arrray assignment ie channl id is not present if len(self.mda['channel_list']) == 1: raw = self.dask_array['visir']['line_data'] else: i = self.mda['channel_list'].index(dataset_id['name']) raw = self.dask_array['visir']['line_data'][:, i, :] data = dec10216(raw.flatten()) data = data.reshape(shape) else: shape = (self.mda['hrv_number_of_lines'], self.mda['hrv_number_of_columns']) raw2 = self.dask_array['hrv']['line_data'][:, 2, :] raw1 = self.dask_array['hrv']['line_data'][:, 1, :] raw0 = self.dask_array['hrv']['line_data'][:, 0, :] shape_layer = (self.mda['number_of_lines'], self.mda['hrv_number_of_columns']) data2 = dec10216(raw2.flatten()) data2 = data2.reshape(shape_layer) data1 = dec10216(raw1.flatten()) data1 = data1.reshape(shape_layer) data0 = dec10216(raw0.flatten()) data0 = data0.reshape(shape_layer) data = np.stack((data0, data1, data2), axis=1).reshape(shape) xarr = xr.DataArray(data, dims=['y', 'x']).where(data != 0).astype(np.float32) if xarr is None: dataset = None else: dataset = self.calibrate(xarr, dataset_id) dataset.attrs['units'] = dataset_info['units'] dataset.attrs['wavelength'] = dataset_info['wavelength'] dataset.attrs['standard_name'] = dataset_info['standard_name'] dataset.attrs['platform_name'] = self.mda['platform_name'] dataset.attrs['sensor'] = 'seviri' dataset.attrs['orbital_parameters'] = { 'projection_longitude': self.mda['projection_parameters']['ssp_longitude'], 'projection_latitude': 0., 'projection_altitude': self.mda['projection_parameters']['h'] } return dataset