Exemple #1
0
    def _create_int8_vector(height, standard_name=None, long_name=None, orig_name=None):
        default_array = DefaultData.create_default_vector(height, np.int8)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.int8))
        HIRS._set_name_attributes(long_name, orig_name, standard_name, variable)

        return variable
Exemple #2
0
    def test__get_add_offset_missing(self):
        default_array = DefaultData.create_default_vector(2, np.float32)
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.int8), ('_FillValue', -127),
                                  ('scale_factor', 0.023)])

        add_offset = DataUtility._get_add_offset(variable)
        self.assertEqual(0.0, add_offset)
Exemple #3
0
    def test__get_min_max(self):
        default_array = DefaultData.create_default_vector(2, np.float32)
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.int8), ('_FillValue', -127),
                                  ('scale_factor', 0.023)])

        min_max = DataUtility._get_min_max(variable)
        self.assertEqual(-128, min_max.min)
        self.assertEqual(127, min_max.max)
Exemple #4
0
    def test_check_scaling_ranges_int8_vector_unscaled(self):
        default_array = DefaultData.create_default_vector(4, np.int8)
        default_array[0] = 108
        default_array[1] = 109
        default_array[2] = -127
        default_array[3] = 110
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('_FillValue', -127)])

        DataUtility.check_scaling_ranges(variable)
Exemple #5
0
    def add_gridded_geolocation_variables(dataset, width, height):
        default_array = DefaultData.create_default_vector(height,
                                                          np.float32,
                                                          fill_value=np.NaN)
        variable = Variable(["y"], default_array)
        TemplateUtil.add_fill_value(variable, np.NaN)
        variable.attrs["standard_name"] = LAT_NAME
        variable.attrs["long_name"] = LAT_NAME
        variable.attrs["bounds"] = "lat_bnds"
        TemplateUtil.add_units(variable, LATITUDE_UNIT)
        dataset["lat"] = variable

        default_array = DefaultData.create_default_array(2,
                                                         height,
                                                         np.float32,
                                                         fill_value=np.NaN)
        variable = Variable(["y", "bounds"], default_array)
        TemplateUtil.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "latitude cell boundaries"
        TemplateUtil.add_units(variable, LATITUDE_UNIT)
        dataset["lat_bnds"] = variable

        default_array = DefaultData.create_default_vector(width,
                                                          np.float32,
                                                          fill_value=np.NaN)
        variable = Variable(["x"], default_array)
        TemplateUtil.add_fill_value(variable, np.NaN)
        variable.attrs["standard_name"] = LON_NAME
        variable.attrs["long_name"] = LON_NAME
        TemplateUtil.add_units(variable, LONGITUDE_UNIT)
        variable.attrs["bounds"] = "lon_bnds"
        dataset["lon"] = variable

        default_array = DefaultData.create_default_array(2,
                                                         width,
                                                         np.float32,
                                                         fill_value=np.NaN)
        variable = Variable(["x", "bounds"], default_array)
        TemplateUtil.add_fill_value(variable, np.NaN)
        TemplateUtil.add_units(variable, LONGITUDE_UNIT)
        variable.attrs["long_name"] = "longitude cell boundaries"
        dataset["lon_bnds"] = variable
Exemple #6
0
 def _create_float32_vector(fill_value, height, long_name, orig_name):
     default_array = DefaultData.create_default_vector(height, np.float32, fill_value=fill_value)
     variable = Variable(["y"], default_array)
     if fill_value is None:
         tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.float32))
     else:
         tu.add_fill_value(variable, fill_value)
     variable.attrs["long_name"] = long_name
     if orig_name is not None:
         variable.attrs["orig_name"] = orig_name
     return variable
Exemple #7
0
    def _create_scaled_uint16_vector(height, standard_name=None, original_name=None, long_name=None, dimension_name=None, scale_factor=0.01):
        default_array = DefaultData.create_default_vector(height, np.float32)
        if dimension_name is None:
            variable = Variable(["y"], default_array)
        else:
            variable = Variable(dimension_name, default_array)

        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), scale_factor)
        HIRS._set_name_attributes(long_name, original_name, standard_name, variable)

        return variable
Exemple #8
0
    def test__get_min_max_missing_type(self):
        default_array = DefaultData.create_default_vector(2, np.float32)
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('_FillValue', -127),
                                  ('scale_factor', 0.023)])

        try:
            DataUtility._get_min_max(variable)
            self.fail("ValueError expected")
        except ValueError:
            pass
Exemple #9
0
    def test_check_scaling_ranges_uint8_vector_ok(self):
        default_array = DefaultData.create_default_vector(4, np.float32)
        default_array[0] = 11.0  # 0
        default_array[1] = 16.1  # 255
        default_array[2] = np.NaN
        default_array[3] = 13.05
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.uint8), ('_FillValue', 255),
                                  ('scale_factor', 0.02), ('add_offset', 11)])

        DataUtility.check_scaling_ranges(variable)
Exemple #10
0
    def test_check_scaling_ranges_int8_vector_ok(self):
        default_array = DefaultData.create_default_vector(4, np.float32)
        default_array[0] = 11.872  # -128
        default_array[1] = 12.127  # 127
        default_array[2] = np.NaN
        default_array[3] = 12.04
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.int8), ('_FillValue', -127),
                                  ('scale_factor', 0.001), ('add_offset', 12)])

        DataUtility.check_scaling_ranges(variable)
Exemple #11
0
    def test_check_scaling_ranges_int32_vector_ok(self):
        default_array = DefaultData.create_default_vector(4, np.float32)
        default_array[0] = 21487.83647  # 2147483647
        default_array[1] = -21461.83648  # -2147483648
        default_array[2] = np.NaN
        default_array[3] = 14.04
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.int32),
                                  ('_FillValue', -2147483647),
                                  ('scale_factor', 0.00001),
                                  ('add_offset', 13)])

        DataUtility.check_scaling_ranges(variable)
Exemple #12
0
    def test_check_scaling_ranges_uint32_only_NaN(self):
        default_array = DefaultData.create_default_vector(4, np.float32)
        default_array[0] = np.NaN
        default_array[1] = np.NaN
        default_array[2] = np.NaN
        default_array[3] = np.NaN
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.uint32),
                                  ('_FillValue', 4294967295),
                                  ('scale_factor', 0.00002),
                                  ('add_offset', 14)])

        DataUtility.check_scaling_ranges(variable)
Exemple #13
0
    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)
Exemple #14
0
    def test_check_scaling_ranges_int8_vector_underflow(self):
        default_array = DefaultData.create_default_vector(4, np.float32)
        default_array[0] = 11.702  # underflow
        default_array[1] = 12.127  # 127
        default_array[2] = np.NaN
        default_array[3] = 12.04
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.int8), ('_FillValue', -127),
                                  ('scale_factor', 0.001), ('add_offset', 12)])

        try:
            DataUtility.check_scaling_ranges(variable)
            self.fail("ValueError expected")
        except ValueError:
            pass
Exemple #15
0
    def test_check_scaling_ranges_uint8_vector_overflow(self):
        default_array = DefaultData.create_default_vector(4, np.float32)
        default_array[0] = 11.0  # 0
        default_array[1] = 16.2  # overflow
        default_array[2] = np.NaN
        default_array[3] = 13.05
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.uint8), ('_FillValue', 255),
                                  ('scale_factor', 0.02), ('add_offset', 11)])

        try:
            DataUtility.check_scaling_ranges(variable)
            self.fail("ValueError expected")
        except ValueError:
            pass
Exemple #16
0
    def test_check_scaling_ranges_uint32_vector_overflow(self):
        default_array = DefaultData.create_default_vector(4, np.float32)
        default_array[0] = 14  # 0
        default_array[1] = 85913.4459  # 4294967295
        default_array[2] = np.NaN
        default_array[3] = 14.01
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.uint32),
                                  ('_FillValue', 4294967295),
                                  ('scale_factor', 0.00002),
                                  ('add_offset', 14)])

        try:
            DataUtility.check_scaling_ranges(variable)
            self.fail("ValueError expected")
        except ValueError:
            pass
Exemple #17
0
    def test_check_scaling_ranges_int32_vector_underflow(self):
        default_array = DefaultData.create_default_vector(4, np.float32)
        default_array[0] = 21487.83647  # 2147483647
        default_array[1] = -21461.93648  # underflow
        default_array[2] = np.NaN
        default_array[3] = 14.04
        variable = Variable(["y"], default_array)
        variable.encoding = dict([('dtype', np.int32),
                                  ('_FillValue', -2147483647),
                                  ('scale_factor', 0.00001),
                                  ('add_offset', 13)])

        try:
            DataUtility.check_scaling_ranges(variable)
            self.fail("ValueError expected")
        except ValueError:
            pass
Exemple #18
0
    def add_variables(dataset, width, height, num_samples=10):
        tu.add_geolocation_variables(dataset, width, height, chunksizes=CHUNKING)
        tu.add_quality_flags(dataset, width, height, chunksizes=CHUNKING)

        default_array = DefaultData.create_default_vector(height, np.int32, fill_value=4294967295)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable, 4294967295)
        variable.attrs["standard_name"] = "time"
        variable.attrs["long_name"] = "Acquisition time in seconds since 1970-01-01 00:00:00"
        tu.add_units(variable, "s")
        dataset["time"] = variable

        default_array = DefaultData.create_default_array_3d(width, height, num_samples, np.float32, fill_value=np.NaN)
        variable = Variable(["samples","y", "x"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["standard_name"] = "sea_surface_temperature"
        variable.attrs["units"] = "K"
        variable.attrs["coordinates"] = "longitude latitude"
        dataset["sst"] = variable
    def setUp(self):
        self.dataset = xr.Dataset()
        self.dataset.attrs["template_key"] = "HIRS2"

        default_array = DefaultData.create_default_array(5, 5, np.uint16, fill_value=0)
        variable = Variable(["y", "x"], default_array)
        self.dataset["data_quality_bitmask"] = variable
        self.dataset["quality_pixel_bitmask"] = variable

        default_array = DefaultData.create_default_vector(5, np.int32, fill_value=0)
        variable = Variable(["y"], default_array)
        self.dataset["quality_scanline_bitmask"] = variable

        default_array = DefaultData.create_default_array(19, 5, np.uint8, fill_value=0)
        variable = Variable(["y", "channel"], default_array)
        self.dataset["quality_channel_bitmask"] = variable

        tempDir = tempfile.gettempdir()
        self.testDir = os.path.join(tempDir, 'fcdr')
        os.mkdir(self.testDir)
Exemple #20
0
    def add_variables(dataset, width, height):
        # @todo 1 tb/tb add geolocation 2018-06-25

        tu.add_quality_flags(dataset, width, height, chunksizes=CHUNKING)

        default_array = DefaultData.create_default_vector(height,
                                                          np.int32,
                                                          fill_value=-1)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable, -1)
        variable.attrs["standard_name"] = "time"
        variable.attrs[
            "long_name"] = "Acquisition time in seconds since 1970-01-01 00:00:00"
        tu.add_units(variable, "s")
        dataset["time"] = variable

        default_array = DefaultData.create_default_array(width,
                                                         height,
                                                         np.float32,
                                                         fill_value=np.NaN)
        variable = Variable(["y", "x"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["standard_name"] = "surface_albedo"
        variable.attrs["coordinates"] = "longitude latitude"
        tu.add_chunking(variable, CHUNKING)
        dataset["surface_albedo"] = variable

        dataset["u_independent_surface_albedo"] = tu.create_CDR_uncertainty(
            width, height,
            "Uncertainty of surface_albedo due to independent effects")
        dataset["u_structured_surface_albedo"] = tu.create_CDR_uncertainty(
            width, height,
            "Uncertainty of surface_albedo due to structured effects")
        dataset["u_common_surface_albedo"] = tu.create_CDR_uncertainty(
            width, height,
            "Uncertainty of surface_albedo due to common effects")
Exemple #21
0
    def add_full_fcdr_variables(dataset, height):
        # height is ignored - supplied just for interface compatibility tb 2017-02-05

        # count_vis
        default_array = DefaultData.create_default_array(FULL_SIZE, FULL_SIZE, np.uint8)
        variable = Variable(["y", "x"], default_array)
        tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.uint8))
        variable.attrs["long_name"] = "Image counts"
        tu.add_units(variable, "count")
        tu.add_chunking(variable, CHUNKSIZES)
        dataset["count_vis"] = variable

        dataset["u_latitude"] = MVIRI._create_angle_variable_int(1.5E-05, long_name="Uncertainty in Latitude", unsigned=True)
        MVIRI._add_geo_correlation_attributes(dataset["u_latitude"])

        dataset["u_longitude"] = MVIRI._create_angle_variable_int(1.5E-05, long_name="Uncertainty in Longitude", unsigned=True)
        MVIRI._add_geo_correlation_attributes(dataset["u_longitude"])

        # u_time
        default_array = DefaultData.create_default_vector(IR_SIZE, np.float32, fill_value=np.NaN)
        variable = Variable([IR_Y_DIMENSION], default_array)
        variable.attrs["standard_name"] = "Uncertainty in Time"
        tu.add_units(variable, "s")
        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.009155273)
        variable.attrs["pdf_shape"] = "rectangle"
        dataset["u_time"] = variable

        dataset["u_satellite_zenith_angle"] = MVIRI._create_angle_variable_int(7.62939E-05, long_name="Uncertainty in Satellite Zenith Angle", unsigned=True)
        dataset["u_satellite_azimuth_angle"] = MVIRI._create_angle_variable_int(7.62939E-05, long_name="Uncertainty in Satellite Azimuth Angle", unsigned=True)
        dataset["u_solar_zenith_angle"] = MVIRI._create_angle_variable_int(7.62939E-05, long_name="Uncertainty in Solar Zenith Angle", unsigned=True)
        dataset["u_solar_azimuth_angle"] = MVIRI._create_angle_variable_int(7.62939E-05, long_name="Uncertainty in Solar Azimuth Angle", unsigned=True)

        dataset["a0_vis"] = tu.create_scalar_float_variable("Calibration Coefficient at Launch", units="Wm^-2sr^-1/count")
        dataset["a1_vis"] = tu.create_scalar_float_variable("Time variation of a0", units="Wm^-2sr^-1/count day^-1 10^5")
        dataset["a2_vis"] = tu.create_scalar_float_variable("Time variation of a0, quadratic term", units="Wm^-2sr^-1/count year^-2")
        dataset["mean_count_space_vis"] = tu.create_scalar_float_variable("Space count", units="count")

        # u_a0_vis
        variable = tu.create_scalar_float_variable("Uncertainty in a0", units="Wm^-2sr^-1/count")
        MVIRI._add_calibration_coeff_correlation_attributes(variable)
        dataset["u_a0_vis"] = variable

        # u_a1_vis
        variable = tu.create_scalar_float_variable("Uncertainty in a1", units="Wm^-2sr^-1/count day^-1 10^5")
        MVIRI._add_calibration_coeff_correlation_attributes(variable)
        dataset["u_a1_vis"] = variable

        # u_a2_vis
        variable = tu.create_scalar_float_variable("Uncertainty in a2", units="Wm^-2sr^-1/count year^-2")
        MVIRI._add_calibration_coeff_correlation_attributes(variable)
        dataset["u_a2_vis"] = variable

        # u_zero_vis
        variable = tu.create_scalar_float_variable("Uncertainty zero term", units="Wm^-2sr^-1/count")
        MVIRI._add_calibration_coeff_correlation_attributes(variable, image_correlation_scale=[-np.inf, np.inf])
        dataset["u_zero_vis"] = variable

        # covariance_a_vis
        variable = tu.create_float_variable(COV_SIZE, COV_SIZE, long_name="Covariance of calibration coefficients from fit to calibration runs", dim_names=["cov_size", "cov_size"], fill_value=np.NaN)
        tu.add_fill_value(variable, np.NaN)
        tu.add_units(variable, "Wm^-2sr^-1/count")
        MVIRI._add_calibration_coeff_correlation_attributes(variable, image_correlation_scale=[-np.inf, np.inf])
        dataset["covariance_a_vis"] = variable

        dataset["u_electronics_counts_vis"] = tu.create_scalar_float_variable("Uncertainty due to Electronics noise", units="count")
        dataset["u_digitization_counts_vis"] = tu.create_scalar_float_variable("Uncertainty due to digitization", units="count")

        # allan_deviation_counts_space_vis
        variable = tu.create_scalar_float_variable("Uncertainty of space count", units="count")
        variable.attrs[corr.SCAN_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.SCAN_CORR_UNIT] = corr.LINE
        variable.attrs[corr.SCAN_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs["pdf_shape"] = "digitised_gaussian"
        dataset["allan_deviation_counts_space_vis"] = variable

        # u_mean_counts_space_vis
        variable = tu.create_scalar_float_variable("Uncertainty of space count", units="count")
        variable.attrs[corr.PIX_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.PIX_CORR_UNIT] = corr.PIXEL
        variable.attrs[corr.PIX_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs[corr.SCAN_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.SCAN_CORR_UNIT] = corr.LINE
        variable.attrs[corr.SCAN_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs["pdf_shape"] = "digitised_gaussian"
        dataset["u_mean_counts_space_vis"] = variable

        # sensitivity_solar_irradiance_vis
        variable = tu.create_scalar_float_variable()
        variable.attrs["virtual"] = "true"
        variable.attrs["dimension"] = "y, x"
        variable.attrs[
            "expression"] = "distance_sun_earth * distance_sun_earth * PI * (count_vis - mean_count_space_vis) * (a2_vis * years_since_launch * years_since_launch + a1_vis * years_since_launch + a0_vis) / (cos(solar_zenith_angle * PI / 180.0) * solar_irradiance_vis * solar_irradiance_vis)"
        dataset["sensitivity_solar_irradiance_vis"] = variable

        # sensitivity_count_vis
        variable = tu.create_scalar_float_variable()
        variable.attrs["virtual"] = "true"
        variable.attrs["dimension"] = "y, x"
        variable.attrs[
            "expression"] = "distance_sun_earth * distance_sun_earth * PI * (a2_vis * years_since_launch * years_since_launch + a1_vis * years_since_launch + a0_vis) / (cos(solar_zenith_angle * PI / 180.0) * solar_irradiance_vis)"
        dataset["sensitivity_count_vis"] = variable

        # sensitivity_count_space
        variable = tu.create_scalar_float_variable()
        variable.attrs["virtual"] = "true"
        variable.attrs["dimension"] = "y, x"
        variable.attrs[
            "expression"] = "-1.0 * distance_sun_earth * distance_sun_earth * PI * (a2_vis * years_since_launch * years_since_launch + a1_vis * years_since_launch + a0_vis) / (cos(solar_zenith_angle * PI / 180.0) * solar_irradiance_vis)"
        dataset["sensitivity_count_space"] = variable

        # sensitivity_a0_vis
        variable = tu.create_scalar_float_variable()
        variable.attrs["virtual"] = "true"
        variable.attrs["dimension"] = "y, x"
        variable.attrs["expression"] = "distance_sun_earth * distance_sun_earth * PI * (count_vis - mean_count_space_vis) / (cos(solar_zenith_angle * PI / 180.0) * solar_irradiance_vis)"
        dataset["sensitivity_a0_vis"] = variable

        # sensitivity_a1_vis
        variable = tu.create_scalar_float_variable()
        variable.attrs["virtual"] = "true"
        variable.attrs["dimension"] = "y, x"
        variable.attrs[
            "expression"] = "distance_sun_earth * distance_sun_earth * PI * (count_vis - mean_count_space_vis) * years_since_launch / (cos(solar_zenith_angle * PI / 180.0) * solar_irradiance_vis)"
        dataset["sensitivity_a1_vis"] = variable

        # sensitivity_a2_vis
        variable = tu.create_scalar_float_variable()
        variable.attrs["virtual"] = "true"
        variable.attrs["dimension"] = "y, x"
        variable.attrs[
            "expression"] = "distance_sun_earth * distance_sun_earth * PI * (count_vis - mean_count_space_vis) * years_since_launch*years_since_launch / (cos(solar_zenith_angle * PI / 180.0) * solar_irradiance_vis)"
        dataset["sensitivity_a2_vis"] = variable

        effect_names = ["u_solar_irradiance_vis", "u_a0_vis", "u_a1_vis", "u_a2_vis", "u_zero_vis", "u_solar_zenith_angle", "u_mean_count_space_vis"]
        dataset["Ne"] = Coordinate("Ne", effect_names)

        num_effects = len(effect_names)
        default_array = DefaultData.create_default_array(num_effects, num_effects, np.float32, fill_value=np.NaN)
        variable = Variable(["Ne", "Ne"], default_array)
        tu.add_encoding(variable, np.int16, -32768, 3.05176E-05)
        variable.attrs["valid_min"] = -1
        variable.attrs["valid_max"] = 1
        variable.attrs["long_name"] = "Channel error correlation matrix for structured effects."
        variable.attrs["description"] = "Matrix_describing correlations between errors of the uncertainty_effects due to spectral response function errors (determined using Monte Carlo approach)"
        dataset["effect_correlation_matrix"] = variable
 def test_create_default_vector_int(self):
     default_array = DefaultData.create_default_vector(14, np.int32)
     self.assertEqual((14, ), default_array.shape)
     self.assertEqual(-2147483647, default_array.data[2])
 def test_create_default_vector_int_fill_value(self):
     default_array = DefaultData.create_default_vector(15,
                                                       np.int32,
                                                       fill_value=108)
     self.assertEqual((15, ), default_array.shape)
     self.assertEqual(108, default_array.data[3])
Exemple #24
0
    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"])
Exemple #25
0
    def add_full_fcdr_variables(dataset, height):
        # c_earth
        default_array = DefaultData.create_default_array_3d(SWATH_WIDTH, height, NUM_RAD_CHANNELS, np.uint16, dims_names=["rad_channel", "y", "x"])
        variable = Variable(["rad_channel", "y", "x"], default_array)
        tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.uint16))
        variable.attrs["long_name"] = "counts_earth"
        tu.add_units(variable, "count")
        variable.attrs["ancilliary_variables"] = "scnlinf quality_scanline_bitmask quality_channel_bitmask mnfrqualflags"
        dataset["c_earth"] = variable

        # L_earth
        default_array = DefaultData.create_default_array_3d(SWATH_WIDTH, height, NUM_RAD_CHANNELS, np.float32, np.NaN, ["rad_channel", "y", "x"])
        variable = Variable(["rad_channel", "y", "x"], default_array)
        tu.add_encoding(variable, np.uint32, DefaultData.get_default_fill_value(np.uint32), 0.0001)
        variable.attrs["standard_name"] = "toa_outgoing_inband_radiance"
        tu.add_units(variable, "W/Hz/m ** 2/sr")
        variable.attrs["long_name"] = "Channel radiance, NOAA/EUMETSAT calibrated"
        variable.attrs["ancilliary_variables"] = "scnlinf quality_scanline_bitmask quality_channel_bitmask mnfrqualflags"
        dataset["L_earth"] = variable

        # u_lat
        variable = HIRS._create_angle_variable(height, "uncertainty_latitude")
        dataset["u_lat"] = variable

        # u_lon
        variable = HIRS._create_angle_variable(height, "uncertainty_longitude")
        dataset["u_lon"] = variable

        # u_time
        variable = tu.create_float_variable(SWATH_WIDTH, height, "uncertainty_time")
        tu.add_encoding(variable, np.uint16, 65535, 0.01)
        tu.add_units(variable, "s")
        dataset["u_time"] = variable

        # u_c_earth
        default_array = DefaultData.create_default_array(NUM_CALIBRATION_CYCLE, NUM_CHANNELS, np.uint16, dims_names=["channel", "calibration_cycle"])
        variable = Variable(["channel", "calibration_cycle"], default_array)
        tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.uint16))
        tu.add_units(variable, "count")
        variable.attrs["long_name"] = "uncertainty counts for Earth views"
        variable.attrs["ancilliary_variables"] = "u_c_earth_chan_corr"
        variable.attrs["channels_affected"] = "all"
        variable.attrs["parameter"] = "C_E"
        variable.attrs["pdf_shape"] = "gaussian"
        dataset["u_c_earth"] = variable

        # u_L_earth_independent
        variable = HIRS._create_3d_rad_uncertainty_variable(height, "uncertainty_radiance_Earth_random")
        tu.add_encoding(variable, np.uint32, DefaultData.get_default_fill_value(np.uint32), 0.01)
        tu.add_units(variable, "mW m^-2 sr^-1 cm")
        dataset["u_L_earth_independent"] = variable

        # u_L_earth_structured
        variable = HIRS._create_3d_rad_uncertainty_variable(height, "uncertainty_radiance_Earth_structured")
        tu.add_encoding(variable, np.uint32, DefaultData.get_default_fill_value(np.uint32), 0.01)
        tu.add_units(variable, "mW m^-2 sr^-1 cm")
        dataset["u_L_earth_structured"] = variable

        # u_L_earth_systematic
        variable = HIRS._create_3d_rad_uncertainty_variable(height, "uncertainty_radiance_Earth_systematic")
        tu.add_encoding(variable, np.uint32, DefaultData.get_default_fill_value(np.uint32), 0.01)
        tu.add_units(variable, "mW m^-2 sr^-1 cm")
        dataset["u_L_earth_systematic"] = variable

        # u_L_earth_total
        variable = HIRS._create_3d_rad_uncertainty_variable(height, "uncertainty_radiance_Earth_total")
        tu.add_encoding(variable, np.uint32, DefaultData.get_default_fill_value(np.uint32), 0.01)
        tu.add_units(variable, "mW m^-2 sr^-1 cm")
        dataset["u_L_earth_total"] = variable

        # S_u_L_earth
        variable = tu.create_float_variable(NUM_RAD_CHANNELS, NUM_RAD_CHANNELS, "covariance_radiance_Earth", dim_names=["rad_channel", "rad_channel"])
        tu.add_encoding(variable, np.uint32, DefaultData.get_default_fill_value(np.uint32), 0.01)
        dataset["S_u_L_earth"] = variable

        # u_bt_random
        variable = HIRS._create_3d_bt_uncertainty_variable(height, "uncertainty_bt_random")
        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.01)
        tu.add_units(variable, "K")
        dataset["u_bt_random"] = variable

        # u_bt_structured
        variable = HIRS._create_3d_bt_uncertainty_variable(height, "uncertainty_bt_structured")
        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.01)
        tu.add_units(variable, "K")
        dataset["u_bt_structured"] = variable

        # u_bt_systematic
        variable = HIRS._create_3d_bt_uncertainty_variable(height, "uncertainty_bt_systematic")
        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.01)
        tu.add_units(variable, "K")
        dataset["u_bt_systematic"] = variable

        # u_bt_total
        variable = HIRS._create_3d_bt_uncertainty_variable(height, "uncertainty_bt_total")
        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.01)
        tu.add_units(variable, "K")
        dataset["u_bt_total"] = variable

        # S_bt
        variable = tu.create_float_variable(NUM_RAD_CHANNELS, NUM_RAD_CHANNELS, "covariance_brightness_temperature", dim_names=["rad_channel", "rad_channel"])
        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.01)
        dataset["S_bt"] = variable

        # l1b_calcof
        default_array = DefaultData.create_default_array(height, NUM_COEFFS, np.float32, dims_names=["coeffs", "y"])
        variable = Variable(["coeffs", "y"], default_array)
        tu.add_encoding(variable, np.int32, DefaultData.get_default_fill_value(np.int32), 0.01)
        variable.attrs["standard_name"] = "calibration_coefficients"
        dataset["l1b_calcof"] = variable

        # navigation_status
        variable = HIRS._create_int32_vector(height, standard_name="status_flag", long_name="Navigation status bit field", orig_name="hrs_navstat")
        dataset["navigation_status"] = variable

        # quality_flags
        variable = HIRS._create_int32_vector(height, standard_name="status_flag", long_name="Quality indicator bit field", orig_name="hrs_qualind")
        dataset["quality_flags"] = variable

        variable = HIRS._create_scaled_uint16_vector(height, long_name="Platform altitude", original_name="hrs_scalti")
        tu.add_units(variable, "km")
        dataset["platform_altitude"] = variable

        variable = HIRS._create_scaled_int16_vector(height, long_name="Platform pitch angle", original_name="hrs_pitchang")
        tu.add_units(variable, "degree")
        dataset["platform_pitch_angle"] = variable

        variable = HIRS._create_scaled_int16_vector(height, long_name="Platform roll angle", original_name="hrs_rollang")
        tu.add_units(variable, "degree")
        dataset["platform_roll_angle"] = variable

        variable = HIRS._create_scaled_int16_vector(height, long_name="Platform yaw angle", original_name="hrs_yawang")
        tu.add_units(variable, "degree")
        dataset["platform_yaw_angle"] = variable

        # scan_angles
        default_array = DefaultData.create_default_array(NUM_SCAN_ANGLES, height, np.float32, dims_names=["y", "num_scan_angles"], fill_value=np.NaN)
        variable = Variable(["y", "num_scan_angles"], default_array)
        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), scale_factor=0.01)
        tu.add_units(variable, "degree")
        variable.attrs["long_name"] = "Scan angles"
        variable.attrs["orig_name"] = "hrs_ang"
        dataset["scan_angles"] = variable

        dataset["l1b_scanline_number"] = HIRS._create_int16_vector(height, long_name="scanline number", orig_name="hrs_scnlin")
        dataset["scanline_position"] = HIRS._create_int8_vector(height, long_name="Scanline position number in 32 second cycle", orig_name="hrs_scnpos")

        # second_original_calibration_coefficients
        default_array = DefaultData.create_default_array(WIDTH_TODO, height, np.float32, fill_value=np.NaN)
        variable = Variable(["y", "width_todo"], default_array)
        tu.add_encoding(variable, np.int32, DefaultData.get_default_fill_value(np.int32), scale_factor=0.01)
        variable.attrs["long_name"] = "Second original calibration coefficients (unsorted)"
        variable.attrs["orig_name"] = "hrs_scalcof"
        dataset["l1b_second_original_calibration_coefficients"] = variable

        dataset["Tc_baseplate"] = HIRS._create_counts_vector(height, "temperature_baseplate_counts")
        dataset["Tc_ch"] = HIRS._create_counts_vector(height, "temperature_coolerhousing_counts")
        dataset["Tc_elec"] = HIRS._create_counts_vector(height, "temperature_electronics_counts")
        dataset["Tc_fsr"] = HIRS._create_counts_vector(height, "temperature_first_stage_radiator_counts")
        dataset["Tc_fwh"] = HIRS._create_counts_vector(height, "temperature_filter_wheel_housing_counts")
        dataset["Tc_fwm"] = HIRS._create_counts_vector(height, "temperature_filter_wheel_monitor_counts")
        dataset["Tc_icct"] = HIRS._create_counts_vector(height, "temperature_internal_cold_calibration_target_counts")
        dataset["Tc_iwct"] = HIRS._create_counts_vector(height, "temperature_internal_warm_calibration_target_counts")
        dataset["Tc_patch_exp"] = HIRS._create_counts_vector(height, "temperature_patch_expanded_scale_counts")
        dataset["Tc_patch_full"] = HIRS._create_counts_vector(height, "temperature_patch_full_range_counts")
        dataset["Tc_tlscp_prim"] = HIRS._create_counts_vector(height, "temperature_telescope_primary_counts")
        dataset["Tc_tlscp_sec"] = HIRS._create_counts_vector(height, "temperature_telescope_secondary_counts")
        dataset["Tc_tlscp_tert"] = HIRS._create_counts_vector(height, "temperature_telescope_tertiary_counts")
        dataset["Tc_scanmirror"] = HIRS._create_counts_vector(height, "temperature_scanmirror_counts")
        dataset["Tc_scanmotor"] = HIRS._create_counts_vector(height, "temperature_scanmotor_counts")

        dataset["u_Tc_baseplate"] = HIRS._create_counts_uncertainty_vector(height, "uncertainty_temperature_baseplate_counts")
        dataset["u_Tc_ch"] = HIRS._create_counts_uncertainty_vector(height, "uncertainty_temperature_coolerhousing_counts")
        dataset["u_Tc_elec"] = HIRS._create_counts_uncertainty_vector(height, "uncertainty_temperature_electronics_counts")
        dataset["u_Tc_fsr"] = HIRS._create_counts_uncertainty_vector(height, "uncertainty_temperature_first_stage_radiator_counts")
        dataset["u_Tc_fwh"] = HIRS._create_counts_uncertainty_vector(height, "uncertainty_temperature_filter_wheel_housing_counts")
        dataset["u_Tc_fwm"] = HIRS._create_counts_uncertainty_vector(height, "uncertainty_temperature_filter_wheel_monitor_counts")
        dataset["u_Tc_icct"] = HIRS._create_counts_uncertainty_vector_uint32(height, "uncertainty_temperature_internal_cold_calibration_target_counts")
        dataset["u_Tc_iwct"] = HIRS._create_counts_uncertainty_vector_uint32(height, "uncertainty_temperature_internal_warm_calibration_target_counts")
        dataset["u_Tc_patch_exp"] = HIRS._create_counts_uncertainty_vector_uint32(height, "uncertainty_temperature_patch_expanded_scale_counts")
        dataset["u_Tc_patch_full"] = HIRS._create_counts_uncertainty_vector_uint32(height, "uncertainty_temperature_patch_full_range_counts")
        dataset["u_Tc_tlscp_prim"] = HIRS._create_counts_uncertainty_vector_uint32(height, "uncertainty_temperature_telescope_primary_counts")
        dataset["u_Tc_tlscp_sec"] = HIRS._create_counts_uncertainty_vector_uint32(height, "uncertainty_temperature_telescope_secondary_counts")
        dataset["u_Tc_tlscp_tert"] = HIRS._create_counts_uncertainty_vector_uint32(height, "uncertainty_temperature_telescope_tertiary_counts")
        dataset["u_Tc_scanmirror"] = HIRS._create_counts_uncertainty_vector_uint32(height, "uncertainty_temperature_scanmirror_counts")
        dataset["u_Tc_scanmotor"] = HIRS._create_counts_uncertainty_vector_uint32(height, "uncertainty_temperature_scanmotor_counts")

        dataset["u_sol_za"] = HIRS._create_geo_angle_uncertainty_variable("uncertainty_solar_zenith_angle", height, FILL_VALUE)
        dataset["u_sol_aa"] = HIRS._create_geo_angle_uncertainty_variable("uncertainty_solar_azimuth_angle", height, FILL_VALUE)
        dataset["u_sat_za"] = HIRS._create_geo_angle_uncertainty_variable("uncertainty_satellite_zenith_angle", height, FILL_VALUE)
        dataset["u_sat_aa"] = HIRS._create_geo_angle_uncertainty_variable("uncertainty_local_azimuth_angle", height, FILL_VALUE)

        # u_c_earth_chan_corr
        dataset["u_c_earth_chan_corr"] = HIRS._create_channel_correlation_variable("u_c_earth channel correlations", np.int16)

        # u_c_space
        default_array = DefaultData.create_default_array(NUM_CALIBRATION_CYCLE, NUM_CHANNELS, np.uint16, dims_names=["channel", "calibration_cycle"])
        variable = Variable(["channel", "calibration_cycle"], default_array)
        tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.uint16))
        tu.add_units(variable, "count")
        tu.add_scale_factor(variable, 0.005)
        variable.attrs["long_name"] = "uncertainty counts for space views"
        variable.attrs["ancilliary_variables"] = "u_c_space_chan_corr"
        variable.attrs["channels_affected"] = "all"
        variable.attrs["parameter"] = "C_s"
        variable.attrs["pdf_shape"] = "gaussian"
        dataset["u_c_space"] = variable

        # u_c_space_chan_corr
        dataset["u_c_space_chan_corr"] = HIRS._create_channel_correlation_variable("u_c_space channel correlations", np.uint16)

        # u_Earthshine
        dataset["u_Earthshine"] = HIRS._create_channel_uncertainty_uint16(height)

        # u_O_Re
        dataset["u_O_Re"] = HIRS._create_channel_uncertainty_uint16(height)

        # u_O_TIWCT
        default_array = DefaultData.create_default_vector(height, np.float32, np.NaN)
        variable = Variable(["y"], default_array)
        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.01)
        dataset["u_O_TIWCT"] = variable

        # u_O_TPRT
        default_array = DefaultData.create_default_vector(height, np.uint16, DefaultData.get_default_fill_value(np.uint16))
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable, 65535)
        tu.add_scale_factor(variable, 0.01)
        tu.add_units(variable, "K")
        variable.attrs["channels_affected"] = "all"
        variable.attrs[corr.PIX_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.PIX_CORR_UNIT] = corr.PIXEL
        variable.attrs[corr.PIX_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs[corr.SCAN_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.SCAN_CORR_UNIT] = corr.LINE
        variable.attrs[corr.SCAN_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs[corr.IMG_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.IMG_CORR_UNIT] = corr.IMG
        variable.attrs[corr.IMG_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs["parameter"] = "O_TPRT"
        variable.attrs["pdf_shape"] = "gaussian"
        variable.attrs["short_name"] = "O_TPRT"
        variable.attrs["ancilliary_variables"] = "u_O_TPRT_chan_corr"
        dataset["u_O_TPRT"] = variable

        dataset["u_Rself"] = HIRS._create_channel_uncertainty_uint16(height)
        dataset["u_SRF_calib"] = HIRS._create_channel_uncertainty_uint16(height)

        default_array = DefaultData.create_default_array(PRT_NUMBER_IWT, PRT_READING, dtype=np.float32, dims_names=["prt_number_iwt", "prt_reading"], fill_value=np.NaN)
        variable = Variable(["prt_number_iwt", "prt_reading"], default_array)
        tu.add_encoding(variable, np.uint16, DefaultData.get_default_fill_value(np.uint16), 0.01)
        dataset["u_d_PRT"] = variable

        dataset["u_electronics"] = HIRS._create_channel_uncertainty_uint16(height)
        dataset["u_periodic_noise"] = HIRS._create_channel_uncertainty_uint16(height)
        dataset["u_nonlinearity"] = HIRS._create_scaled_uint16_vector(NUM_CHANNELS, dimension_name=["channel"], scale_factor=0.01)
        dataset["emissivity"] = tu.create_scalar_float_variable("emissivity", units="1")
        dataset["temp_corr_slope"] = tu.create_scalar_float_variable("Slope for effective temperature correction", units="1")
        dataset["temp_corr_offset"] = tu.create_scalar_float_variable("Offset for effective temperature correction", units="1")

        # mnfrqualflags
        default_array = DefaultData.create_default_array(NUM_MINOR_FRAME, height, np.int32, dims_names=["y", "minor_frame"], fill_value=0)
        variable = Variable(["y", "minor_frame"], default_array)
        variable.attrs["standard_name"] = "status_flag"
        variable.attrs["long_name"] = "minor_frame_quality_flags_bitfield"
        dataset["mnfrqualflags"] = variable

        # scnlintime
        variable = HIRS._create_int32_vector(height, standard_name="time", long_name="Scan line time of day", orig_name="hrs_scnlintime")
        tu.add_units(variable, "ms")
        dataset["scnlintime"] = variable

        # scnlinf
        default_array = DefaultData.create_default_vector(height, np.int16, fill_value=0)
        variable = Variable(["y"], default_array)
        variable.attrs["standard_name"] = "status_flag"
        variable.attrs["long_name"] = "scanline_bitfield"
        variable.attrs["flag_masks"] = "16384, 32768"
        variable.attrs["flag_meanings"] = "clock_drift_correction southbound_data"
        dataset["scnlinf"] = variable

        # scantype
        default_array = DefaultData.create_default_vector(height, np.int8, fill_value=0)
        variable = Variable(["y"], default_array)
        variable.attrs["standard_name"] = "status_flag"
        variable.attrs["long_name"] = "scantype_bitfield"
        variable.attrs["flag_values"] = "0, 1, 2, 3"
        variable.attrs["flag_meanings"] = "earth_view space_view cold_bb_view main_bb_view"
        dataset["scantype"] = variable
Exemple #26
0
    def add_original_variables(dataset, height, srf_size=None):
        tu.add_geolocation_variables(dataset, SWATH_WIDTH, height)
        tu.add_quality_flags(dataset, SWATH_WIDTH, height)

        # Temperature_misc_housekeeping
        default_array = DefaultData.create_default_array(
            height,
            NUM_THERMISTORS,
            np.float32,
            dims_names=["housekeeping", "y"],
            fill_value=np.NaN)
        variable = Variable(["housekeeping", "y"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        variable.attrs["units"] = "TODO"
        dataset["Temperature_misc_housekeeping"] = variable

        # ancil_data
        default_array = DefaultData.create_default_array(
            height,
            ANCIL_VAL,
            np.float64,
            dims_names=["ancil_val", "y"],
            fill_value=np.NaN)
        variable = Variable(["ancil_val", "y"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "Additional per scan information: year, day_of_year, secs_of_day, sat_lat, " \
                                      "sat_long, sat_alt, sat_heading, year, day_of_year, secs_of_day"
        dataset["ancil_data"] = variable

        # channel_quality_flag
        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_fill_value(variable, np.NaN)
        dataset["channel_quality_flag"] = variable

        # cold_counts
        default_array = DefaultData.create_default_array_3d(
            SWATH_WIDTH, height, CALIB_NUMBER, np.float32, np.NaN)
        variable = Variable(["calib_number", "y", "x"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["cold_counts"] = variable

        # counts_to_tb_gain
        default_array = DefaultData.create_default_array(
            height,
            NUM_CHANNELS,
            np.float32,
            dims_names=["channel", "y"],
            fill_value=np.NaN)
        variable = Variable([
            "channel",
            "y",
        ], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["counts_to_tb_gain"] = variable

        # counts_to_tb_offset
        default_array = DefaultData.create_default_array(
            height,
            NUM_CHANNELS,
            np.float32,
            dims_names=["channel", "y"],
            fill_value=np.NaN)
        variable = Variable([
            "channel",
            "y",
        ], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["counts_to_tb_offset"] = variable

        # gain_control
        default_array = DefaultData.create_default_array(
            height,
            NUM_CHANNELS,
            np.float32,
            dims_names=["channel", "y"],
            fill_value=np.NaN)
        variable = Variable([
            "channel",
            "y",
        ], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["gain_control"] = variable

        # tb
        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_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        variable.attrs["standard_name"] = "toa_brightness_temperature"
        tu.add_units(variable, "K")
        dataset["tb"] = variable

        # thermal_reference
        default_array = DefaultData.create_default_vector(
            height, np.float32, np.NaN)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        tu.add_units(variable, "TODO")
        dataset["thermal_reference"] = variable

        # warm_counts
        default_array = DefaultData.create_default_array_3d(
            SWATH_WIDTH, height, CALIB_NUMBER, np.float32, np.NaN)
        variable = Variable(["calib_number", "y", "x"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["warm_counts"] = variable
Exemple #27
0
    def add_full_fcdr_variables(dataset, height):
        # u_Temperature_misc_housekeeping
        default_array = DefaultData.create_default_array(
            height,
            NUM_THERMISTORS,
            np.float32,
            dims_names=["housekeeping", "y"],
            fill_value=np.NaN)
        variable = Variable(["housekeeping", "y"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        variable.attrs["units"] = "TODO"
        dataset["u_Temperature_misc_housekeeping"] = variable

        # u_cold_counts
        default_array = DefaultData.create_default_array_3d(
            SWATH_WIDTH, height, CALIB_NUMBER, np.float32, np.NaN)
        variable = Variable(["calib_number", "y", "x"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["u_cold_counts"] = variable

        # u_counts_to_tb_gain
        default_array = DefaultData.create_default_array(
            height,
            NUM_CHANNELS,
            np.float32,
            dims_names=["channel", "y"],
            fill_value=np.NaN)
        variable = Variable([
            "channel",
            "y",
        ], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["u_counts_to_tb_gain"] = variable

        # u_counts_to_tb_offset
        default_array = DefaultData.create_default_array(
            height,
            NUM_CHANNELS,
            np.float32,
            dims_names=["channel", "y"],
            fill_value=np.NaN)
        variable = Variable([
            "channel",
            "y",
        ], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["u_counts_to_tb_offset"] = variable

        # u_gain_control
        default_array = DefaultData.create_default_array(
            height,
            NUM_CHANNELS,
            np.float32,
            dims_names=["channel", "y"],
            fill_value=np.NaN)
        variable = Variable([
            "channel",
            "y",
        ], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["u_gain_control"] = variable

        # u_tb
        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_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        tu.add_units(variable, "K")
        dataset["u_tb"] = variable

        # u_thermal_reference
        default_array = DefaultData.create_default_vector(
            height, np.float32, np.NaN)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        tu.add_units(variable, "TODO")
        dataset["u_thermal_reference"] = variable

        # u_warm_counts
        default_array = DefaultData.create_default_array_3d(
            SWATH_WIDTH, height, CALIB_NUMBER, np.float32, np.NaN)
        variable = Variable(["calib_number", "y", "x"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "TODO"
        dataset["u_warm_counts"] = variable
Exemple #28
0
    def add_full_fcdr_variables(dataset, height):
        # u_latitude
        variable = AVHRR._create_angle_uncertainty_variable("latitude", height)
        dataset["u_latitude"] = variable

        # u_longitude
        variable = AVHRR._create_angle_uncertainty_variable(
            "longitude", height)
        dataset["u_longitude"] = variable

        # u_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["long_name"] = "uncertainty of acquisition time"
        dataset["u_time"] = variable

        # u_satellite_azimuth_angle
        variable = AVHRR._create_angle_uncertainty_variable(
            "satellite azimuth angle", height)
        dataset["u_satellite_azimuth_angle"] = variable

        # u_satellite_zenith_angle
        variable = AVHRR._create_angle_uncertainty_variable(
            "satellite zenith angle", height)
        dataset["u_satellite_zenith_angle"] = variable

        # u_solar_azimuth_angle
        variable = AVHRR._create_angle_uncertainty_variable(
            "solar azimuth angle", height)
        dataset["u_solar_azimuth_angle"] = variable

        # u_solar_zenith_angle
        variable = AVHRR._create_angle_uncertainty_variable(
            "solar zenith angle", height)
        dataset["u_solar_zenith_angle"] = variable

        # PRT_C
        default_array = DefaultData.create_default_array(
            PRT_WIDTH, height, np.int16)
        variable = Variable(["y", "n_prt"], default_array)
        tu.add_fill_value(variable,
                          DefaultData.get_default_fill_value(np.int16))
        variable.attrs["long_name"] = "Prt counts"
        tu.add_units(variable, "count")
        dataset["PRT_C"] = variable

        # u_prt
        default_array = DefaultData.create_default_array(PRT_WIDTH,
                                                         height,
                                                         np.float32,
                                                         fill_value=np.NaN)
        variable = Variable(["y", "n_prt"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "Uncertainty on the PRT counts"
        tu.add_units(variable, "count")
        variable.attrs[corr.PIX_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.PIX_CORR_UNIT] = corr.PIXEL
        variable.attrs[corr.PIX_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs[corr.SCAN_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.SCAN_CORR_UNIT] = corr.LINE
        variable.attrs[corr.SCAN_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs["pdf_shape"] = "rectangle"
        variable.attrs["pdf_parameter"] = 0.1
        dataset["u_prt"] = variable

        # R_ICT
        default_array = DefaultData.create_default_array(PRT_WIDTH,
                                                         height,
                                                         np.float32,
                                                         fill_value=np.NaN)
        variable = Variable(["y", "n_prt"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "Radiance of the PRT"
        tu.add_units(variable, "mW m^-2 sr^-1 cm")
        dataset["R_ICT"] = variable

        # T_instr
        default_array = DefaultData.create_default_vector(height,
                                                          np.float32,
                                                          fill_value=np.NaN)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "Instrument temperature"
        tu.add_units(variable, "K")
        dataset["T_instr"] = variable

        # Chx_Csp
        standard_names = [
            "Ch1 Space counts", "Ch2 Space counts", "Ch3a Space counts",
            "Ch3b Space counts", "Ch4 Space counts", "Ch5 Space counts"
        ]
        names = [
            "Ch1_Csp", "Ch2_Csp", "Ch3a_Csp", "Ch3b_Csp", "Ch4_Csp", "Ch5_Csp"
        ]
        AVHRR._add_counts_variables(dataset, height, names, standard_names)

        # Chx_Cict
        standard_names = [
            "Ch3b ICT counts", "Ch4 ICT counts", "Ch5 ICT counts"
        ]
        names = ["Ch3b_Cict", "Ch4_Cict", "Ch5_Cict"]
        AVHRR._add_counts_variables(dataset, height, names, standard_names)

        # Chx_Ce
        standard_names = [
            "Ch1 Earth counts", "Ch2 Earth counts", "Ch3a Earth counts",
            "Ch3b Earth counts", "Ch4 Earth counts", "Ch5 Earth counts"
        ]
        names = ["Ch1_Ce", "Ch2_Ce", "Ch3a_Ce", "Ch3b_Ce", "Ch4_Ce", "Ch5_Ce"]
        AVHRR._add_counts_variables(dataset, height, names, standard_names)

        # Chx_u_Csp
        standard_names = [
            "Ch1 Uncertainty on space counts",
            "Ch2 Uncertainty on space counts",
            "Ch3a Uncertainty on space counts",
            "Ch3b Uncertainty on space counts",
            "Ch4 Uncertainty on space counts",
            "Ch5 Uncertainty on space counts"
        ]
        names = [
            "Ch1_u_Csp", "Ch2_u_Csp", "Ch3a_u_Csp", "Ch3b_u_Csp", "Ch4_u_Csp",
            "Ch5_u_Csp"
        ]
        AVHRR._add_counts_uncertainties_variables(
            dataset, height, names, standard_names,
            COUNT_CORRELATION_ATTRIBUTES)

        # Chx_Cict
        standard_names = [
            "Ch3b Uncertainty on ICT counts", "Ch4 Uncertainty on ICT counts",
            "Ch5 Uncertainty on ICT counts"
        ]
        names = ["Ch3b_u_Cict", "Ch4_u_Cict", "Ch5_u_Cict"]
        AVHRR._add_counts_uncertainties_variables(
            dataset, height, names, standard_names,
            COUNT_CORRELATION_ATTRIBUTES)

        # Chx_u_Ce
        standard_names = [
            "Ch1 Uncertainty on earth counts",
            "Ch2 Uncertainty on earth counts",
            "Ch3a Uncertainty on earth counts",
            "Ch3b Uncertainty on earth counts",
            "Ch4 Uncertainty on earth counts",
            "Ch5 Uncertainty on earth counts"
        ]
        names = [
            "Ch1_u_Ce", "Ch2_u_Ce", "Ch3a_u_Ce", "Ch3b_u_Ce", "Ch4_u_Ce",
            "Ch5_u_Ce"
        ]
        attributes = {"pdf_shape": "digitised_gaussian"}
        AVHRR._add_counts_uncertainties_variables(dataset, height, names,
                                                  standard_names, attributes)

        # Chx_u_Refl
        long_names = [
            "Ch1 Total uncertainty on toa reflectance",
            "Ch2 Total uncertainty on toa reflectance",
            "Ch3a Total uncertainty on toa reflectance"
        ]
        names = ["Ch1_u_Refl", "Ch2_u_Refl", "Ch3a_u_Refl"]
        AVHRR._add_refl_uncertainties_variables(dataset, height, names,
                                                long_names)

        # Chx_u_Bt
        standard_names = [
            "Ch3b Total uncertainty on brightness temperature",
            "Ch4 Total uncertainty on brightness temperature",
            "Ch5 Total uncertainty on brightness temperature"
        ]
        names = ["Ch3b_u_Bt", "Ch4_u_Bt", "Ch5_u_Bt"]
        AVHRR._add_bt_uncertainties_variables(dataset, height, names,
                                              standard_names)

        # Chx_ur_Bt
        standard_names = [
            "Ch3b Random uncertainty on brightness temperature",
            "Ch4 Random uncertainty on brightness temperature",
            "Ch5 Random uncertainty on brightness temperature"
        ]
        names = ["Ch3b_ur_Bt", "Ch4_ur_Bt", "Ch5_ur_Bt"]
        AVHRR._add_bt_uncertainties_variables(dataset, height, names,
                                              standard_names)

        # Chx_us_Bt
        standard_names = [
            "Ch3b Systematic uncertainty on brightness temperature",
            "Ch4 Systematic uncertainty on brightness temperature",
            "Ch5 Systematic uncertainty on brightness temperature"
        ]
        names = ["Ch3b_us_Bt", "Ch4_us_Bt", "Ch5_us_Bt"]
        AVHRR._add_bt_uncertainties_variables(dataset, height, names,
                                              standard_names)
Exemple #29
0
    def add_original_variables(dataset,
                               height,
                               srf_size=None,
                               corr_dx=None,
                               corr_dy=None,
                               lut_size=None):
        tu.add_geolocation_variables(dataset, SWATH_WIDTH, height)
        tu.add_quality_flags(dataset, SWATH_WIDTH, height)

        # btemps
        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"
        tu.add_encoding(variable, np.int32, -999999, scale_factor=0.01)
        tu.add_units(variable, "K")
        variable.attrs["ancillary_variables"] = "chanqual qualind scanqual"
        dataset["btemps"] = variable

        # chanqual
        default_array = DefaultData.create_default_array(
            height,
            NUM_CHANNELS,
            np.int32,
            dims_names=["channel", "y"],
            fill_value=0)
        variable = Variable(["channel", "y"], default_array)
        variable.attrs["standard_name"] = "status_flag"
        variable.attrs["flag_masks"] = "1, 2, 4, 8, 16, 32"
        variable.attrs[
            "flag_meanings"] = "some_bad_prt_temps some_bad_space_view_counts some_bad_bb_counts no_good_prt_temps no_good_space_view_counts no_good_bb_counts"
        dataset["chanqual"] = variable

        # instrtemp
        default_array = DefaultData.create_default_vector(height,
                                                          np.float32,
                                                          fill_value=np.NaN)
        variable = Variable(["y"], default_array)
        tu.add_units(variable, "K")
        tu.add_encoding(variable,
                        np.int32,
                        DefaultData.get_default_fill_value(np.int32),
                        scale_factor=0.01)
        variable.attrs["long_name"] = "instrument_temperature"
        dataset["instrtemp"] = variable

        # qualind
        default_array = DefaultData.create_default_vector(height,
                                                          np.int32,
                                                          fill_value=0)
        variable = Variable(["y"], default_array)
        variable.attrs["standard_name"] = "status_flag"
        variable.attrs[
            "flag_masks"] = "33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648"
        variable.attrs[
            "flag_meanings"] = "instr_status_changed first_good_clock_update no_earth_loc no_calib data_gap_precedes time_seq_error not_use_scan"
        dataset["qualind"] = variable

        # scanqual
        default_array = DefaultData.create_default_vector(height,
                                                          np.int32,
                                                          fill_value=0)
        variable = Variable(["y"], default_array)
        variable.attrs["standard_name"] = "status_flag"
        variable.attrs[
            "flag_masks"] = "8, 16, 32, 64, 128, 1024, 2048, 4096, 8192, 16384, 32768, 1048576, 2097152, 4194304, 8388608"
        variable.attrs[
            "flag_meanings"] = "earth_loc_quest_ant_pos earth_loc_quest_reas earth_loc_quest_margin earth_loc_quest_time no_earth_loc_time uncalib_instr_mode uncalib_channels calib_marg_prt uncalib_bad_prt calib_few_scans uncalib_bad_time repeat_scan_times inconsistent_time time_field_bad time_field_inferred"
        dataset["scanqual"] = variable

        # scnlin
        default_array = DefaultData.create_default_vector(height, np.int32)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable,
                          DefaultData.get_default_fill_value(np.int32))
        variable.attrs["long_name"] = "scanline"
        dataset["scnlin"] = variable

        # scnlindy
        default_array = DefaultData.create_default_vector(height, np.int32)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable,
                          DefaultData.get_default_fill_value(np.int32))
        variable.attrs["long_name"] = "Acquisition day of year of scan"
        dataset["scnlindy"] = variable

        # scnlintime
        default_array = DefaultData.create_default_vector(height, np.int32)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable,
                          DefaultData.get_default_fill_value(np.int32))
        variable.attrs[
            "long_name"] = "Acquisition time of scan in milliseconds since beginning of the day"
        tu.add_units(variable, "ms")
        dataset["scnlintime"] = variable

        # scnlinyr
        default_array = DefaultData.create_default_vector(height, np.int32)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable,
                          DefaultData.get_default_fill_value(np.int32))
        variable.attrs["long_name"] = "Acquisition year of scan"
        dataset["scnlinyr"] = variable

        # satellite_azimuth_angle
        variable = AMSUB_MHS.create_angle_variable(height,
                                                   "sensor_azimuth_angle")
        dataset["satellite_azimuth_angle"] = variable

        # satellite_zenith_angle
        variable = AMSUB_MHS.create_angle_variable(height,
                                                   "sensor_zenith_angle")
        dataset["satellite_zenith_angle"] = variable

        # solar_azimuth_angle
        variable = AMSUB_MHS.create_angle_variable(height,
                                                   "solar_azimuth_angle")
        dataset["solar_azimuth_angle"] = variable

        # solar_zenith_angle
        variable = AMSUB_MHS.create_angle_variable(height,
                                                   "solar_zenith_angle")
        dataset["solar_zenith_angle"] = variable

        # acquisition_time
        default_array = DefaultData.create_default_vector(height, np.int32)
        variable = Variable(["y"], default_array)
        tu.add_fill_value(variable,
                          DefaultData.get_default_fill_value(np.int32))
        variable.attrs["standard_name"] = "time"
        variable.attrs[
            "long_name"] = "Acquisition time in seconds since 1970-01-01 00:00:00"
        tu.add_units(variable, "s")
        dataset["acquisition_time"] = variable
Exemple #30
0
    def add_original_variables(dataset, height, srf_size=None):
        # height is ignored - supplied just for interface compatibility tb 2017-02-05

        tu.add_quality_flags(dataset, FULL_SIZE, FULL_SIZE, chunksizes=CHUNKSIZES)

        # time
        default_array = DefaultData.create_default_array(IR_SIZE, IR_SIZE, np.uint32)
        variable = Variable([IR_Y_DIMENSION, IR_X_DIMENSION], default_array)
        tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.uint32))
        variable.attrs["standard_name"] = "time"
        variable.attrs["long_name"] = "Acquisition time of pixel"
        tu.add_units(variable, "seconds since 1970-01-01 00:00:00")
        tu.add_offset(variable, TIME_FILL_VALUE)
        tu.add_chunking(variable, CHUNKSIZES)
        dataset["time"] = variable

        dataset["solar_azimuth_angle"] = MVIRI._create_angle_variable_int(0.005493164, standard_name="solar_azimuth_angle", unsigned=True)
        dataset["solar_zenith_angle"] = MVIRI._create_angle_variable_int(0.005493248, standard_name="solar_zenith_angle")
        dataset["satellite_azimuth_angle"] = MVIRI._create_angle_variable_int(0.01, standard_name="sensor_azimuth_angle", long_name="sensor_azimuth_angle", unsigned=True)
        dataset["satellite_zenith_angle"] = MVIRI._create_angle_variable_int(0.01, standard_name="platform_zenith_angle", unsigned=True)

        # count_ir
        default_array = DefaultData.create_default_array(IR_SIZE, IR_SIZE, np.uint8)
        variable = Variable([IR_Y_DIMENSION, IR_X_DIMENSION], default_array)
        tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.uint8))
        variable.attrs["long_name"] = "Infrared Image Counts"
        tu.add_units(variable, "count")
        tu.add_chunking(variable, CHUNKSIZES)
        dataset["count_ir"] = variable

        # count_wv
        default_array = DefaultData.create_default_array(IR_SIZE, IR_SIZE, np.uint8)
        variable = Variable([IR_Y_DIMENSION, IR_X_DIMENSION], default_array)
        tu.add_fill_value(variable, DefaultData.get_default_fill_value(np.uint8))
        variable.attrs["long_name"] = "WV Image Counts"
        tu.add_units(variable, "count")
        tu.add_chunking(variable, CHUNKSIZES)
        dataset["count_wv"] = variable

        default_array = DefaultData.create_default_array(FULL_SIZE, FULL_SIZE, np.uint8, fill_value=0)
        variable = Variable(["y", "x"], default_array)
        variable.attrs["flag_masks"] = "1, 2, 4, 8, 16, 32"
        variable.attrs["flag_meanings"] = "uncertainty_suspicious uncertainty_too_large space_view_suspicious not_on_earth suspect_time suspect_geo"
        variable.attrs["standard_name"] = "status_flag"
        tu.add_chunking(variable, CHUNKSIZES)
        dataset["data_quality_bitmask"] = variable

        # distance_sun_earth
        dataset["distance_sun_earth"] = tu.create_scalar_float_variable(long_name="Sun-Earth distance", units="au")

        # solar_irradiance_vis
        dataset["solar_irradiance_vis"] = tu.create_scalar_float_variable(standard_name="solar_irradiance_vis", long_name="Solar effective Irradiance", units="W*m-2")

        # u_solar_irradiance_vis
        default_array = np.full([], np.NaN, np.float32)
        variable = Variable([], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "Uncertainty in Solar effective Irradiance"
        tu.add_units(variable, "Wm^-2")
        variable.attrs[corr.PIX_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.PIX_CORR_UNIT] = corr.PIXEL
        variable.attrs[corr.PIX_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs[corr.SCAN_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.SCAN_CORR_UNIT] = corr.LINE
        variable.attrs[corr.SCAN_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs[corr.IMG_CORR_FORM] = corr.RECT_ABS
        variable.attrs[corr.IMG_CORR_UNIT] = corr.DAYS
        variable.attrs[corr.IMG_CORR_SCALE] = [-np.inf, np.inf]
        variable.attrs["pdf_shape"] = "rectangle"
        dataset["u_solar_irradiance_vis"] = variable

        if srf_size is None:
            srf_size = SRF_SIZE

        default_array = DefaultData.create_default_array(srf_size, NUM_CHANNELS, 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, NUM_CHANNELS, np.float32, fill_value=np.NaN)
        variable = Variable(["channel", "n_frequencies"], default_array)
        variable.attrs["long_name"] = 'Spectral Response Function frequencies'
        variable.attrs["description"] = 'Per channel: frequencies for the relative spectral response function'
        tu.add_encoding(variable, np.int32, -2147483648, 0.0001)
        tu.add_units(variable, "nm")
        variable.attrs["source"] = "Filename of SRF"
        variable.attrs["Valid(YYYYDDD)"] = "datestring"
        dataset['SRF_frequencies'] = variable

        # srf covariance_
        default_array = DefaultData.create_default_array(srf_size, srf_size, np.float32, fill_value=np.NaN)
        variable = Variable([SRF_VIS_DIMENSION, SRF_VIS_DIMENSION], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "Covariance of the Visible Band Spectral Response Function"
        tu.add_chunking(variable, CHUNKSIZES)
        dataset["covariance_spectral_response_function_vis"] = variable

        # u_srf_ir
        default_array = DefaultData.create_default_vector(srf_size, np.float32, fill_value=np.NaN)
        variable = Variable([SRF_IR_WV_DIMENSION], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "Uncertainty in Spectral Response Function for IR channel"
        dataset["u_spectral_response_function_ir"] = variable

        # u_srf_wv
        default_array = DefaultData.create_default_vector(srf_size, np.float32, fill_value=np.NaN)
        variable = Variable([SRF_IR_WV_DIMENSION], default_array)
        tu.add_fill_value(variable, np.NaN)
        variable.attrs["long_name"] = "Uncertainty in Spectral Response Function for WV channel"
        dataset["u_spectral_response_function_wv"] = variable

        dataset["a_ir"] = tu.create_scalar_float_variable(long_name="Calibration parameter a for IR Band", units="mWm^-2sr^-1cm^-1")
        dataset["b_ir"] = tu.create_scalar_float_variable(long_name="Calibration parameter b for IR Band", units="mWm^-2sr^-1cm^-1/DC")
        dataset["u_a_ir"] = tu.create_scalar_float_variable(long_name="Uncertainty of calibration parameter a for IR Band", units="mWm^-2sr^-1cm^-1")
        dataset["u_b_ir"] = tu.create_scalar_float_variable(long_name="Uncertainty of calibration parameter b for IR Band", units="mWm^-2sr^-1cm^-1/DC")
        dataset["a_wv"] = tu.create_scalar_float_variable(long_name="Calibration parameter a for WV Band", units="mWm^-2sr^-1cm^-1")
        dataset["b_wv"] = tu.create_scalar_float_variable(long_name="Calibration parameter b for WV Band", units="mWm^-2sr^-1cm^-1/DC")
        dataset["u_a_wv"] = tu.create_scalar_float_variable(long_name="Uncertainty of calibration parameter a for WV Band", units="mWm^-2sr^-1cm^-1")
        dataset["u_b_wv"] = tu.create_scalar_float_variable(long_name="Uncertainty of calibration parameter b for WV Band", units="mWm^-2sr^-1cm^-1/DC")
        dataset["bt_a_ir"] = tu.create_scalar_float_variable(long_name="IR Band BT conversion parameter A", units="1")
        dataset["bt_b_ir"] = tu.create_scalar_float_variable(long_name="IR Band BT conversion parameter B", units="1")
        dataset["bt_a_wv"] = tu.create_scalar_float_variable(long_name="WV Band BT conversion parameter A", units="1")
        dataset["bt_b_wv"] = tu.create_scalar_float_variable(long_name="WV Band BT conversion parameter B", units="1")
        dataset["years_since_launch"] = tu.create_scalar_float_variable(long_name="Fractional year since launch of satellite", units="years")

        x_ir_wv_dim = dataset.dims["x_ir_wv"]
        dataset["x_ir_wv"] = Coordinate("x_ir_wv", np.arange(x_ir_wv_dim, dtype=np.uint16))

        y_ir_wv_dim = dataset.dims["y_ir_wv"]
        dataset["y_ir_wv"] = Coordinate("y_ir_wv", np.arange(y_ir_wv_dim, dtype=np.uint16))

        srf_size_dim = dataset.dims["srf_size"]
        dataset["srf_size"] = Coordinate("srf_size", np.arange(srf_size_dim, dtype=np.uint16))