def _create_refl_uncertainty_variable(height, long_name=None, structured=False): default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.float32, fill_value=np.NaN) variable = Variable(["y", "x"], default_array) tu.add_units(variable, "percent") tu.add_geolocation_attribute(variable) variable.attrs["long_name"] = long_name if structured: tu.add_encoding(variable, np.int16, DefaultData.get_default_fill_value(np.int16), 0.01, chunksizes=CHUNKS_2D) variable.attrs["valid_min"] = 3 variable.attrs["valid_max"] = 5 else: tu.add_encoding(variable, np.int16, DefaultData.get_default_fill_value(np.int16), 0.00001, chunksizes=CHUNKS_2D) variable.attrs["valid_max"] = 1000 variable.attrs["valid_min"] = 10 return variable
def test_add_geolocation_attribute(self): default_array = DefaultData.create_default_array_3d( 8, 6, 4, np.float32, np.NaN) variable = Variable(["channel", "y", "x"], default_array) TemplateUtil.add_geolocation_attribute(variable) self.assertEqual("longitude latitude", variable.attrs["coordinates"])
def _create_counts_uncertainty_variable(height, long_name): variable = tu.create_float_variable(SWATH_WIDTH, height, long_name=long_name, fill_value=np.NaN) tu.add_units(variable, "count") tu.add_geolocation_attribute(variable) tu.add_chunking(variable, CHUNKS_2D) return variable
def _create_angle_uncertainty_variable(angle_name, height): variable = tu.create_float_variable(SWATH_WIDTH, height, long_name="uncertainty of " + angle_name, fill_value=np.NaN) tu.add_units(variable, "degree") tu.add_geolocation_attribute(variable) tu.add_chunking(variable, CHUNKS_2D) return variable
def _create_easy_fcdr_variable(height, long_name): default_array = DefaultData.create_default_array_3d(SWATH_WIDTH, height, NUM_CHANNELS, np.float32, np.NaN) variable = Variable(["channel", "y", "x"], default_array) tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.001, chunksizes=CHUNKING_BT) variable.attrs["long_name"] = long_name tu.add_units(variable, "K") tu.add_geolocation_attribute(variable) variable.attrs["valid_min"] = 1 variable.attrs["valid_max"] = 65534 return variable
def _create_counts_variable(height, long_name): default_array = DefaultData.create_default_array( SWATH_WIDTH, height, np.int32) variable = Variable(["y", "x"], default_array) tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.int32)) variable.attrs["long_name"] = long_name tu.add_units(variable, "count") tu.add_geolocation_attribute(variable) tu.add_chunking(variable, CHUNKS_2D) return variable
def _create_geo_angle_variable(standard_name, height, orig_name=None, chunking=None): default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.float32, fill_value=np.NaN) variable = Variable(["y", "x"], default_array) variable.attrs["standard_name"] = standard_name if orig_name is not None: variable.attrs["orig_name"] = orig_name tu.add_units(variable, "degree") tu.add_geolocation_attribute(variable) tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.01, -180.0, chunking) return variable
def add_quality_flags(dataset, height): tu.add_quality_flags(dataset, SWATH_WIDTH, height, chunksizes=CHUNKING_2D) default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.uint16, fill_value=0) variable = Variable(["y", "x"], default_array) variable.attrs["flag_masks"] = "1, 2, 4, 8, 16" variable.attrs["flag_meanings"] = "suspect_mirror suspect_geo suspect_time outlier_nos uncertainty_too_large" variable.attrs["standard_name"] = "status_flag" tu.add_chunking(variable, CHUNKING_2D) tu.add_geolocation_attribute(variable) dataset["data_quality_bitmask"] = variable
def add_bt_variable(dataset, height): # bt default_array = DefaultData.create_default_array_3d(SWATH_WIDTH, height, NUM_CHANNELS, np.float32, np.NaN) variable = Variable(["channel", "y", "x"], default_array) variable.attrs["standard_name"] = "toa_brightness_temperature" variable.attrs["long_name"] = "Brightness temperature, NOAA/EUMETSAT calibrated" tu.add_units(variable, "K") tu.add_encoding(variable, np.int16, FILL_VALUE, 0.01, 150.0, chunksizes=CHUNKING_BT) tu.add_geolocation_attribute(variable) variable.attrs["ancilliary_variables"] = "quality_scanline_bitmask quality_channel_bitmask" dataset["bt"] = variable
def _add_angle_variables(dataset, height): default_array = DefaultData.create_default_vector(height, np.float32, fill_value=np.NaN) variable = Variable(["y"], default_array) variable.attrs["standard_name"] = "platform_zenith_angle" tu.add_units(variable, "degree") tu.add_geolocation_attribute(variable) tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.01, -180.0) dataset["satellite_zenith_angle"] = variable dataset["solar_azimuth_angle"] = HIRS._create_geo_angle_variable( "solar_azimuth_angle", height, chunking=CHUNKING_2D)
def _create_bt_uncertainty_variable(height, long_name): default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.float32, fill_value=np.NaN) variable = Variable(["y", "x"], default_array) tu.add_units(variable, "K") tu.add_geolocation_attribute(variable) tu.add_encoding(variable, np.int16, DefaultData.get_default_fill_value(np.int16), 0.001, chunksizes=CHUNKS_2D) variable.attrs["valid_max"] = 15000 variable.attrs["valid_min"] = 1 variable.attrs["long_name"] = long_name return variable
def _create_channel_refl_variable(height, long_name): default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.float32, fill_value=np.NaN) variable = Variable(["y", "x"], default_array) variable.attrs["standard_name"] = "toa_reflectance" variable.attrs["long_name"] = long_name tu.add_units(variable, "1") tu.add_encoding(variable, np.int16, DefaultData.get_default_fill_value(np.int16), 0.0001, chunksizes=CHUNKS_2D) variable.attrs["valid_max"] = 15000 variable.attrs["valid_min"] = 0 tu.add_geolocation_attribute(variable) return variable
def _create_channel_bt_variable(height, long_name): default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.float32, fill_value=np.NaN) variable = Variable(["y", "x"], default_array) variable.attrs["standard_name"] = "toa_brightness_temperature" variable.attrs["long_name"] = long_name tu.add_units(variable, "K") variable.attrs["valid_max"] = 10000 variable.attrs["valid_min"] = -20000 tu.add_geolocation_attribute(variable) tu.add_encoding(variable, np.int16, DefaultData.get_default_fill_value(np.int16), 0.01, 273.15, chunksizes=CHUNKS_2D) return variable
def _create_refl_uncertainty_variable(height, minmax, scale_factor, long_name=None, units=None): default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.float32, fill_value=np.NaN) variable = Variable(["y", "x"], default_array) tu.add_units(variable, units) tu.add_geolocation_attribute(variable) variable.attrs["long_name"] = long_name tu.add_encoding(variable, np.int16, DefaultData.get_default_fill_value(np.int16), scale_factor, chunksizes=CHUNKS_2D) variable.attrs["valid_min"] = minmax[0] variable.attrs["valid_max"] = minmax[1] return variable
def add_original_variables(dataset, height, srf_size=None): tu.add_geolocation_variables(dataset, SWATH_WIDTH, height, chunksizes=CHUNKS_2D) tu.add_quality_flags(dataset, SWATH_WIDTH, height, chunksizes=CHUNKS_2D) # Time default_array = DefaultData.create_default_vector(height, np.float64, fill_value=np.NaN) variable = Variable(["y"], default_array) tu.add_fill_value(variable, np.NaN) tu.add_units(variable, "s") variable.attrs["standard_name"] = "time" variable.attrs[ "long_name"] = "Acquisition time in seconds since 1970-01-01 00:00:00" dataset["Time"] = variable # relative_azimuth_angle default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.float32, fill_value=np.NaN) variable = Variable(["y", "x"], default_array) variable.attrs["standard_name"] = "relative_azimuth_angle" tu.add_units(variable, "degree") tu.add_encoding(variable, np.int16, DefaultData.get_default_fill_value(np.int16), 0.01, chunksizes=CHUNKS_2D) variable.attrs["valid_max"] = 18000 variable.attrs["valid_min"] = -18000 tu.add_geolocation_attribute(variable) dataset["relative_azimuth_angle"] = variable # satellite_zenith_angle default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.float32, fill_value=np.NaN) variable = Variable(["y", "x"], default_array) variable.attrs["standard_name"] = "sensor_zenith_angle" tu.add_units(variable, "degree") tu.add_encoding(variable, np.int16, DefaultData.get_default_fill_value(np.int16), 0.01, chunksizes=CHUNKS_2D) variable.attrs["valid_max"] = 9000 variable.attrs["valid_min"] = 0 tu.add_geolocation_attribute(variable) dataset["satellite_zenith_angle"] = variable # solar_zenith_angle default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.float32, fill_value=np.NaN) variable = Variable(["y", "x"], default_array) variable.attrs["standard_name"] = "solar_zenith_angle" tu.add_units(variable, "degree") tu.add_encoding(variable, np.int16, DefaultData.get_default_fill_value(np.int16), 0.01, chunksizes=CHUNKS_2D) variable.attrs["valid_max"] = 18000 variable.attrs["valid_min"] = 0 tu.add_geolocation_attribute(variable) dataset["solar_zenith_angle"] = variable dataset["Ch1"] = AVHRR._create_channel_refl_variable( height, "Channel 1 Reflectance") dataset["Ch2"] = AVHRR._create_channel_refl_variable( height, "Channel 2 Reflectance") dataset["Ch3a"] = AVHRR._create_channel_refl_variable( height, "Channel 3a Reflectance") dataset["Ch3b"] = AVHRR._create_channel_bt_variable( height, "Channel 3b Brightness Temperature") dataset["Ch4"] = AVHRR._create_channel_bt_variable( height, "Channel 4 Brightness Temperature") dataset["Ch5"] = AVHRR._create_channel_bt_variable( height, "Channel 5 Brightness Temperature") # data_quality_bitmask default_array = DefaultData.create_default_array(SWATH_WIDTH, height, np.uint8, fill_value=0) variable = Variable(["y", "x"], default_array) variable.attrs["standard_name"] = 'status_flag' variable.attrs["long_name"] = 'bitmask for quality per pixel' variable.attrs["flag_masks"] = '1,2' variable.attrs[ 'flag_meanings'] = 'bad_geolocation_timing_err bad_calibration_radiometer_err' tu.add_chunking(variable, CHUNKS_2D) tu.add_geolocation_attribute(variable) dataset['data_quality_bitmask'] = variable default_array = DefaultData.create_default_vector(height, np.uint8, fill_value=0) variable = Variable(["y"], default_array) variable.attrs["long_name"] = 'bitmask for quality per scanline' variable.attrs["standard_name"] = 'status_flag' variable.attrs["flag_masks"] = '1,2,4,8,16,32,64' variable.attrs[ 'flag_meanings'] = 'do_not_use bad_time bad_navigation bad_calibration channel3a_present solar_contamination_failure solar_contamination' dataset['quality_scanline_bitmask'] = variable default_array = DefaultData.create_default_array(N_CHANS, height, np.uint8, fill_value=0) variable = Variable(["y", "channel"], default_array) variable.attrs["long_name"] = 'bitmask for quality per channel' variable.attrs["standard_name"] = 'status_flag' variable.attrs["flag_masks"] = '1,2' variable.attrs[ 'flag_meanings'] = 'bad_channel some_pixels_not_detected_2sigma' dataset['quality_channel_bitmask'] = variable if srf_size is None: srf_size = MAX_SRF_SIZE default_array = DefaultData.create_default_array(srf_size, N_CHANS, np.float32, fill_value=np.NaN) variable = Variable(["channel", "n_frequencies"], default_array) variable.attrs["long_name"] = 'Spectral Response Function weights' variable.attrs[ "description"] = 'Per channel: weights for the relative spectral response function' tu.add_encoding(variable, np.int16, -32768, 0.000033) dataset['SRF_weights'] = variable default_array = DefaultData.create_default_array(srf_size, N_CHANS, np.float32, fill_value=np.NaN) variable = Variable(["channel", "n_frequencies"], default_array) variable.attrs["long_name"] = 'Spectral Response Function wavelengths' variable.attrs[ "description"] = 'Per channel: wavelengths for the relative spectral response function' tu.add_encoding(variable, np.int32, -2147483648, 0.0001) tu.add_units(variable, "um") dataset['SRF_wavelengths'] = variable default_vector = DefaultData.create_default_vector(height, np.uint8, fill_value=255) variable = Variable(["y"], default_vector) tu.add_fill_value(variable, 255) variable.attrs["long_name"] = 'Indicator of original file' variable.attrs[ "description"] = "Indicator for mapping each line to its corresponding original level 1b file. See global attribute 'source' for the filenames. 0 corresponds to 1st listed file, 1 to 2nd file." dataset["scanline_map_to_origl1bfile"] = variable default_vector = DefaultData.create_default_vector( height, np.int16, fill_value=DefaultData.get_default_fill_value(np.int16)) variable = Variable(["y"], default_vector) tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.int16)) variable.attrs["long_name"] = 'Original_Scan_line_number' variable.attrs[ "description"] = 'Original scan line numbers from corresponding l1b records' dataset["scanline_origl1b"] = variable tu.add_coordinates(dataset, ["Ch1", "Ch2", "Ch3a", "Ch3b", "Ch4", "Ch5"])