def test_bufr_multi_element_constant_arrays(): eccodes.codes_bufr_multi_element_constant_arrays_off() bid = eccodes.codes_bufr_new_from_samples("BUFR3_local_satellite") eccodes.codes_set(bid, "unpack", 1) assert eccodes.codes_get_size(bid, "satelliteIdentifier") == 1 eccodes.codes_release(bid) eccodes.codes_bufr_multi_element_constant_arrays_on() bid = eccodes.codes_bufr_new_from_samples("BUFR3_local_satellite") eccodes.codes_set(bid, "unpack", 1) numSubsets = eccodes.codes_get(bid, "numberOfSubsets") assert eccodes.codes_get_size(bid, "satelliteIdentifier") == numSubsets eccodes.codes_release(bid)
def test_bufr_encode(tmpdir): ibufr = eccodes.codes_bufr_new_from_samples("BUFR3_local_satellite") eccodes.codes_set_array(ibufr, "inputDelayedDescriptorReplicationFactor", (4, )) eccodes.codes_set(ibufr, "masterTableNumber", 0) eccodes.codes_set(ibufr, "bufrHeaderSubCentre", 0) eccodes.codes_set(ibufr, "bufrHeaderCentre", 98) eccodes.codes_set(ibufr, "updateSequenceNumber", 0) eccodes.codes_set(ibufr, "dataCategory", 12) eccodes.codes_set(ibufr, "dataSubCategory", 139) eccodes.codes_set(ibufr, "masterTablesVersionNumber", 13) eccodes.codes_set(ibufr, "localTablesVersionNumber", 1) eccodes.codes_set(ibufr, "numberOfSubsets", 492) eccodes.codes_set(ibufr, "localNumberOfObservations", 492) eccodes.codes_set(ibufr, "satelliteID", 4) eccodes.codes_set(ibufr, "observedData", 1) eccodes.codes_set(ibufr, "compressedData", 1) eccodes.codes_set(ibufr, "unexpandedDescriptors", 312061) eccodes.codes_set(ibufr, "pixelSizeOnHorizontal1", 1.25e04) eccodes.codes_set(ibufr, "orbitNumber", 31330) eccodes.codes_set(ibufr, "#1#beamIdentifier", 1) eccodes.codes_set(ibufr, "#4#likelihoodComputedForSolution", eccodes.CODES_MISSING_DOUBLE) eccodes.codes_set(ibufr, "pack", 1) output = tmpdir.join("test_bufr_encode.bufr") with open(str(output), "wb") as fout: eccodes.codes_write(ibufr, fout) eccodes.codes_release(ibufr)
def test_bufr_set_float(): ibufr = eccodes.codes_bufr_new_from_samples("BUFR4") eccodes.codes_set(ibufr, "unpack", 1) eccodes.codes_set(ibufr, "totalPrecipitationPast24Hours", np.float32(1.26e04)) eccodes.codes_set(ibufr, "totalPrecipitationPast24Hours", np.float16(1.27e04)) eccodes.codes_release(ibufr)
def seviri_l2_bufr_test(self, ): """Test the SEVIRI BUFR handler.""" from satpy.readers.seviri_l2_bufr import SeviriL2BufrFileHandler import eccodes as ec buf1 = ec.codes_bufr_new_from_samples('BUFR4_local_satellite') ec.codes_set(buf1, 'unpac' 'k', 1) samp1 = np.random.uniform(low=250, high=350, size=(128, )) samp2 = np.random.uniform(low=-60, high=60, size=(128, )) samp3 = np.random.uniform(low=10, high=60, size=(128, )) # write the bufr test data twice as we want to read in and the concatenate the data in the reader ec.codes_set_array(buf1, '#1#brightnessTemperature', samp1) ec.codes_set_array(buf1, '#1#brightnessTemperature', samp1) ec.codes_set_array(buf1, 'latitude', samp2) ec.codes_set_array(buf1, 'latitude', samp2) ec.codes_set_array(buf1, 'longitude', samp3) ec.codes_set_array(buf1, 'longitude', samp3) m = mock.mock_open() with mock.patch( 'satpy.readers.seviri_l2_bufr.np.fromfile') as fromfile: fromfile.return_value = MPEF_PRODUCT_HEADER with mock.patch('satpy.readers.seviri_l2_bufr.recarray2dict' ) as recarray2dict: recarray2dict.side_effect = (lambda x: x) fh = SeviriL2BufrFileHandler(None, {}, FILETYPE_INFO) fh.mpef_header = MPEF_PRODUCT_HEADER with mock.patch('satpy.readers.seviri_l2_bufr.open', m, create=True): with mock.patch('eccodes.codes_bufr_new_from_file', side_effect=[ buf1, buf1, None, buf1, buf1, None, buf1, buf1, None ]) as ec1: ec1.return_value = ec1.side_effect with mock.patch('eccodes.codes_set') as ec2: ec2.return_value = 1 with mock.patch('eccodes.codes_release') as ec5: ec5.return_value = 1 z = fh.get_dataset(None, DATASET_INFO) # concatenate the original test arrays as # get dataset will have read and concatented the data x1 = np.concatenate((samp1, samp1), axis=0) x2 = np.concatenate((samp2, samp2), axis=0) x3 = np.concatenate((samp3, samp3), axis=0) np.testing.assert_array_equal(z.values, x1) np.testing.assert_array_equal( z.coords['latitude'].values, x2) np.testing.assert_array_equal( z.coords['longitude'].values, x3) self.assertEqual( z.attrs['platform_name'], DATASET_ATTRS['platform_name']) self.assertEqual(z.attrs['ssp_lon'], DATASET_ATTRS['ssp_lon']) self.assertEqual(z.attrs['seg_size'], DATASET_ATTRS['seg_size'])
def __init__(self, filename, with_adef=False, rect_lon='default'): """Initialize by mocking test data for testing the SEVIRI L2 BUFR reader.""" import eccodes as ec from satpy.readers.seviri_l2_bufr import SeviriL2BufrFileHandler self.buf1 = ec.codes_bufr_new_from_samples('BUFR4_local_satellite') ec.codes_set(self.buf1, 'unpack', 1) # write the bufr test data twice as we want to read in and the concatenate the data in the reader # 55 id corresponds to METEOSAT 8` ec.codes_set(self.buf1, 'satelliteIdentifier', 55) ec.codes_set_array(self.buf1, 'latitude', LAT) ec.codes_set_array(self.buf1, 'latitude', LAT) ec.codes_set_array(self.buf1, 'longitude', LON) ec.codes_set_array(self.buf1, 'longitude', LON) ec.codes_set_array(self.buf1, '#1#brightnessTemperature', DATA) ec.codes_set_array(self.buf1, '#1#brightnessTemperature', DATA) self.m = mock.mock_open() # only our offline product contain MPEF product headers so we get the metadata from there if ('BUFRProd' in filename): with mock.patch( 'satpy.readers.seviri_l2_bufr.np.fromfile') as fromfile: fromfile.return_value = MPEF_PRODUCT_HEADER with mock.patch('satpy.readers.seviri_l2_bufr.recarray2dict' ) as recarray2dict: recarray2dict.side_effect = (lambda x: x) self.fh = SeviriL2BufrFileHandler( filename, FILENAME_INFO2, FILETYPE_INFO, with_area_definition=with_adef, rectification_longitude=rect_lon) self.fh.mpef_header = MPEF_PRODUCT_HEADER else: # No Mpef Header so we get the metadata from the BUFR messages with mock.patch('satpy.readers.seviri_l2_bufr.open', self.m, create=True): with mock.patch('eccodes.codes_bufr_new_from_file', side_effect=[ self.buf1, None, self.buf1, None, self.buf1, None ]) as ec1: ec1.return_value = ec1.side_effect with mock.patch('eccodes.codes_set') as ec2: ec2.return_value = 1 with mock.patch('eccodes.codes_release') as ec5: ec5.return_value = 1 self.fh = SeviriL2BufrFileHandler( filename, FILENAME_INFO, FILETYPE_INFO, with_area_definition=with_adef, rectification_longitude=rect_lon)
def test_bufr_set_string_array(): ibufr = eccodes.codes_bufr_new_from_samples("BUFR3_local_satellite") eccodes.codes_set(ibufr, "numberOfSubsets", 3) eccodes.codes_set(ibufr, "unexpandedDescriptors", 307022) inputVals = ("ARD2-LPTR", "EPFL-LPTR", "BOU2-LPTR") eccodes.codes_set_array(ibufr, "stationOrSiteName", inputVals) eccodes.codes_set(ibufr, "pack", 1) outputVals = eccodes.codes_get_string_array(ibufr, "stationOrSiteName") assert len(outputVals) == 3 assert outputVals[0] == "ARD2-LPTR" assert outputVals[1] == "EPFL-LPTR" assert outputVals[2] == "BOU2-LPTR" eccodes.codes_release(ibufr)
def test_codes_bufr_key_is_header(): bid = eccodes.codes_bufr_new_from_samples("BUFR4_local_satellite") assert eccodes.codes_bufr_key_is_header(bid, "edition") assert eccodes.codes_bufr_key_is_header(bid, "satelliteID") assert eccodes.codes_bufr_key_is_header(bid, "unexpandedDescriptors") with pytest.raises(eccodes.KeyValueNotFoundError): eccodes.codes_bufr_key_is_header(bid, "satelliteSensorIndicator") eccodes.codes_set(bid, "unpack", 1) assert not eccodes.codes_bufr_key_is_header(bid, "satelliteSensorIndicator") assert not eccodes.codes_bufr_key_is_header(bid, "#6#brightnessTemperature")
def save_test_data(path): """Save the test file to the indicated directory.""" import eccodes as ec filepath = os.path.join(path, FILENAME) with open(filepath, "wb") as f: for m in [MSG]: buf = ec.codes_bufr_new_from_samples('BUFR4_local_satellite') for key in m: val = m[key] if np.isscalar(val): ec.codes_set(buf, key, val) else: ec.codes_set_array(buf, key, val) ec.codes_set(buf, 'pack', 1) ec.codes_write(buf, f) ec.codes_release(buf) return filepath
def test_bufr_keys_iterator(): bid = eccodes.codes_bufr_new_from_samples("BUFR3_local_satellite") # Header keys only iterid = eccodes.codes_bufr_keys_iterator_new(bid) count = 0 while eccodes.codes_bufr_keys_iterator_next(iterid): keyname = eccodes.codes_bufr_keys_iterator_get_name(iterid) assert "#" not in keyname count += 1 # assert count == 54 eccodes.codes_set(bid, "unpack", 1) eccodes.codes_bufr_keys_iterator_rewind(iterid) count = 0 while eccodes.codes_bufr_keys_iterator_next(iterid): keyname = eccodes.codes_bufr_keys_iterator_get_name(iterid) count += 1 # assert count == 157 eccodes.codes_bufr_keys_iterator_rewind(iterid) eccodes.codes_bufr_keys_iterator_delete(iterid) eccodes.codes_release(bid)
def seviri_l2_bufr_test(self, filename): """Test the SEVIRI BUFR handler.""" from satpy.readers.seviri_l2_bufr import SeviriL2BufrFileHandler import eccodes as ec buf1 = ec.codes_bufr_new_from_samples('BUFR4_local_satellite') ec.codes_set(buf1, 'unpack', 1) samp1 = np.random.uniform(low=250, high=350, size=(128, )) # write the bufr test data twice as we want to read in and the concatenate the data in the reader # 55 id corresponds to METEOSAT 8 ec.codes_set(buf1, 'satelliteIdentifier', 55) ec.codes_set_array(buf1, '#1#brightnessTemperature', samp1) ec.codes_set_array(buf1, '#1#brightnessTemperature', samp1) m = mock.mock_open() # only our offline product contain MPEF product headers so we get the metadata from there if ('BUFRProd' in filename): with mock.patch( 'satpy.readers.seviri_l2_bufr.np.fromfile') as fromfile: fromfile.return_value = MPEF_PRODUCT_HEADER with mock.patch('satpy.readers.seviri_l2_bufr.recarray2dict' ) as recarray2dict: recarray2dict.side_effect = (lambda x: x) fh = SeviriL2BufrFileHandler(filename, FILENAME_INFO2, FILETYPE_INFO) fh.mpef_header = MPEF_PRODUCT_HEADER else: # No Mpef Header so we get the metadata from the BUFR messages with mock.patch('satpy.readers.seviri_l2_bufr.open', m, create=True): with mock.patch( 'eccodes.codes_bufr_new_from_file', side_effect=[buf1, None, buf1, None, buf1, None]) as ec1: ec1.return_value = ec1.side_effect with mock.patch('eccodes.codes_set') as ec2: ec2.return_value = 1 with mock.patch('eccodes.codes_release') as ec5: ec5.return_value = 1 fh = SeviriL2BufrFileHandler( filename, FILENAME_INFO, FILETYPE_INFO) with mock.patch('satpy.readers.seviri_l2_bufr.open', m, create=True): with mock.patch('eccodes.codes_bufr_new_from_file', side_effect=[buf1, buf1, None]) as ec1: ec1.return_value = ec1.side_effect with mock.patch('eccodes.codes_set') as ec2: ec2.return_value = 1 with mock.patch('eccodes.codes_release') as ec5: ec5.return_value = 1 z = fh.get_dataset(None, DATASET_INFO) # concatenate the original test arrays as # get dataset will have read and concatented the data x1 = np.concatenate((samp1, samp1), axis=0) np.testing.assert_array_equal(z.values, x1) self.assertEqual(z.attrs['platform_name'], DATASET_ATTRS['platform_name']) self.assertEqual(z.attrs['ssp_lon'], DATASET_ATTRS['ssp_lon']) self.assertEqual(z.attrs['seg_size'], DATASET_ATTRS['seg_size'])
def test_bufr_get_message_offset(): gid = eccodes.codes_bufr_new_from_samples("BUFR3_local") assert eccodes.codes_get_message_offset(gid) == 0