satpy.readers.goes_imager_nc module

Reader for GOES 8-15 imager data in netCDF format.

Supports netCDF files from both NOAA-CLASS and EUMETSAT.

NOAA-CLASS

GOES-Imager netCDF files from NOAA-CLASS contain detector counts alongside latitude and longitude coordinates.

Note

If ordering files via NOAA CLASS, select 16 bits/pixel.

Note

Some essential information are missing in the netCDF files:

  1. Subsatellite point

  2. Calibration coefficients

  3. Detector-scanline assignment, i.e. information about which scanline was recorded by which detector

Items 1. and 2. are not critical because the images are geo-located and NOAA provides static calibration coefficients ([VIS], [IR]). The detector-scanline assignment however cannot be reconstructed properly. This is where an approximation has to be applied (see below).

Oversampling

GOES-Imager oversamples the viewed scene in E-W direction by a factor of 1.75: IR/VIS pixels are 112/28 urad on a side, but the instrument samples every 64/16 urad in E-W direction (see [BOOK-I] and [BOOK-N]). That means pixels are actually overlapping on the ground. This cannot be represented by a pyresample area definition.

For full disk images it is possible to estimate an area definition with uniform sampling where pixels don’t overlap. This can be used for resampling and is available via scene[dataset].attrs["area_def_uni"]. The pixel size is derived from altitude and N-S sampling angle. The area extent is based on the maximum scanning angles at the earth’s limb.

Calibration

Calibration is performed according to [VIS] and [IR], but with an average calibration coefficient applied to all detectors in a certain channel. The reason for and impact of this approximation is described below.

The GOES imager simultaneously records multiple scanlines per sweep using multiple detectors per channel. The VIS channel has 8 detectors, the IR channels have 1-2 detectors (see e.g. Figures 3-5a/b, 3-6a/b and 3-7/a-b in [BOOK-N]). Each detector has its own calibration coefficients, so in order to perform an accurate calibration, the detector-scanline assignment is needed.

In theory it is known which scanline was recorded by which detector (VIS: 5,6,7,8,1,2,3,4; IR: 1,2). However, the plate on which the detectors are mounted flexes due to thermal gradients in the instrument which leads to a N-S shift of +/- 8 visible or +/- 2 IR pixels. This shift is compensated in the GVAR scan formation process, but in a way which is hard to reconstruct properly afterwards. See [GVAR], section 3.2.1. for details.

Since the calibration coefficients of the detectors in a certain channel only differ slightly, a workaround is to calibrate each scanline with the average calibration coefficients. A worst case estimate of the introduced error can be obtained by calibrating all possible counts with both the minimum and the maximum calibration coefficients and computing the difference. The maximum differences are:

GOES-8

Channel

Diff

Unit

00_7

0.0

% # Counts are normalized

03_9

0.187

K

06_8

0.0

K # only one detector

10_7

0.106

K

12_0

0.036

K

GOES-9

Channel

Diff

Unit

00_7

0.0

% # Counts are normalized

03_9

0.0

K # coefs identical

06_8

0.0

K # only one detector

10_7

0.021

K

12_0

0.006

K

GOES-10

Channel

Diff

Unit

00_7

1.05

%

03_9

0.0

K # coefs identical

06_8

0.0

K # only one detector

10_7

0.013

K

12_0

0.004

K

GOES-11

Channel

Diff

Unit

00_7

1.25

%

03_9

0.0

K # coefs identical

06_8

0.0

K # only one detector

10_7

0.0

K # coefs identical

12_0

0.065

K

GOES-12

Channel

Diff

Unit

00_7

0.8

%

03_9

0.0

K # coefs identical

06_5

0.044

K

10_7

0.0

K # coefs identical

13_3

0.0

K # only one detector

GOES-13

Channel

Diff

Unit

00_7

1.31

%

03_9

0.0

K # coefs identical

06_5

0.085

K

10_7

0.008

K

13_3

0.0

K # only one detector

GOES-14

Channel

Diff

Unit

00_7

0.66

%

03_9

0.0

K # coefs identical

06_5

0.043

K

10_7

0.006

K

13_3

0.003

K

GOES-15

Channel

Diff

Unit

00_7

0.86

%

03_9

0.0

K # coefs identical

06_5

0.02

K

10_7

0.009

K

13_3

0.008

K

EUMETSAT

During tandem operations of GOES-15 and GOES-17, EUMETSAT distributed a variant of this dataset with the following differences:

  1. The geolocation is in a separate file, used for all bands

  2. VIS data is calibrated to Albedo (or reflectance)

  3. IR data is calibrated to radiance.

  4. VIS data is downsampled to IR resolution (4km)

  5. File name differs also slightly

  6. Data is received via EumetCast

References:

  • [GVAR] GVAR transmission format

  • [BOOK-N] GOES-N databook

  • [BOOK-I] GOES-I databook (broken)

  • [IR] Conversion of GVAR Infrared Data to Scene Radiance or Temperature

  • [VIS] Calibration of the Visible Channels of the GOES Imagers and Sounders

  • [GLOSSARY] GVAR_IMG Glossary

  • [SCHED-W] GOES-15 Routine Imager Schedule

  • [SCHED-E] Optimized GOES-East Routine Imager Schedule

class satpy.readers.goes_imager_nc.AreaDefEstimator(platform_name, channel)[source]

Bases: object

Estimate area definition for GOES-Imager.

Create the instance.

_create_area_def(projection, area_extent, shape)[source]
_get_area_description()[source]
_get_area_extent_at_max_scan_angle(proj_dict)[source]
_get_max_scan_angle(proj_dict)[source]
_get_projection(projection_longitude)[source]
_get_shape_with_uniform_pixel_size(area_extent)[source]
_get_uniform_pixel_size()[source]
get_area_def_with_uniform_sampling(projection_longitude)[source]

Get area definition with uniform sampling.

The area definition is based on geometry and instrument properties: Pixel size is derived from altitude and N-S sampling angle. Area extent is based on the maximum scanning angles at the limb of the earth.

class satpy.readers.goes_imager_nc.GOESCoefficientReader(ir_url, vis_url)[source]

Bases: object

Read GOES Imager calibration coefficients from NOAA reference HTMLs.

Init the coef reader.

_denoise(string)[source]
_float(string)[source]

Convert string to float.

Take care of numbers in exponential format

_get_ir_coefs(platform, channel)[source]
_get_table(root, heading, heading_type)[source]
_get_vis_coefs(platform)[source]
_load_url_or_file(url)[source]
get_coefs(platform, channel)[source]

Get the coefs.

gvar_channels = {'GOES-10': {'00_7': 1, '03_9': 2, '06_8': 3, '10_7': 4, '12_0': 5}, 'GOES-11': {'00_7': 1, '03_9': 2, '06_8': 3, '10_7': 4, '12_0': 5}, 'GOES-12': {'00_7': 1, '03_9': 2, '06_5': 3, '10_7': 4, '13_3': 6}, 'GOES-13': {'00_7': 1, '03_9': 2, '06_5': 3, '10_7': 4, '13_3': 6}, 'GOES-14': {'00_7': 1, '03_9': 2, '06_5': 3, '10_7': 4, '13_3': 6}, 'GOES-15': {'00_7': 1, '03_9': 2, '06_5': 3, '10_7': 4, '13_3': 6}, 'GOES-8': {'00_7': 1, '03_9': 2, '06_8': 3, '10_7': 4, '12_0': 5}, 'GOES-9': {'00_7': 1, '03_9': 2, '06_8': 3, '10_7': 4, '12_0': 5}}
ir_tables = {'GOES-10': '2-3', 'GOES-11': '2-4', 'GOES-12': '2-5a', 'GOES-13': '2-6', 'GOES-14': '2-7c', 'GOES-15': '2-8b', 'GOES-8': '2-1', 'GOES-9': '2-2'}
vis_tables = {'GOES-10': 'Table 2.', 'GOES-11': 'Table 3.', 'GOES-12': 'Table 4.', 'GOES-13': 'Table 5.', 'GOES-14': 'Table 6.', 'GOES-15': 'Table 7.', 'GOES-8': 'Table 1.', 'GOES-9': 'Table 1.'}
class satpy.readers.goes_imager_nc.GOESEUMGEONCFileHandler(filename, filename_info, filetype_info)[source]

Bases: BaseFileHandler

File handler for GOES Geolocation data in EUM netCDF format.

Initialize the reader.

get_dataset(key, info)[source]

Load dataset designated by the given key from file.

property resolution

Specify the spatial resolution of the dataset.

In the EUMETSAT format VIS data is downsampled to IR resolution (4km).

class satpy.readers.goes_imager_nc.GOESEUMNCFileHandler(filename, filename_info, filetype_info, geo_data)[source]

Bases: GOESNCBaseFileHandler

File handler for GOES Imager data in EUM netCDF format.

TODO: Remove datasets which are not available in the file (counts, VIS radiance) via available_datasets() -> See #434

Initialize the reader.

calibrate(data, calibration, channel)[source]

Perform calibration.

get_dataset(key, info)[source]

Load dataset designated by the given key from file.

ir_sectors = {(566, 3464): 'Southern Hemisphere (GOES-East)', (1062, 2760): 'Southern Hemisphere (GOES-West)', (1354, 3312): 'Northern Hemisphere (GOES-West)', (1826, 3464): 'Northern Hemisphere (GOES-East)', (2704, 5208): 'Full Disc'}
vis_sectors = {(566, 3464): 'Southern Hemisphere (GOES-East)', (1062, 2760): 'Southern Hemisphere (GOES-West)', (1354, 3312): 'Northern Hemisphere (GOES-West)', (1826, 3464): 'Northern Hemisphere (GOES-East)', (2704, 5208): 'Full Disc'}
class satpy.readers.goes_imager_nc.GOESNCBaseFileHandler(filename, filename_info, filetype_info, geo_data=None)[source]

Bases: BaseFileHandler

File handler for GOES Imager data in netCDF format.

Initialize the reader.

_calibrate(radiance, coefs, channel, calibration)[source]

Convert radiance to reflectance or brightness temperature.

static _calibrate_ir(radiance, coefs)[source]

Convert IR radiance to brightness temperature.

Reference: [IR]

Parameters:
  • radiance – Radiance [mW m-2 cm-1 sr-1]

  • coefs – Dictionary of calibration coefficients. Keys: n: The channel’s central wavenumber [cm-1] a: Offset [K] b: Slope [1] btmin: Minimum brightness temperature threshold [K] btmax: Maximum brightness temperature threshold [K]

Returns:

Brightness temperature [K]

static _calibrate_vis(radiance, k)[source]

Convert VIS radiance to reflectance.

Note: Angle of incident radiation and annual variation of the earth-sun distance is not taken into account. A value of 100% corresponds to the radiance of a perfectly reflecting diffuse surface illuminated at normal incidence when the sun is at its annual-average distance from the Earth.

TODO: Take angle of incident radiation (cos sza) and annual variation of the earth-sun distance into account.

Reference: [VIS]

Parameters:
  • radiance – Radiance [mW m-2 cm-1 sr-1]

  • k – pi / H, where H is the solar spectral irradiance at annual-average sun-earth distance, averaged over the spectral response function of the detector). Units of k: [m2 um sr W-1]

Returns:

Reflectance [%]

_counts2radiance(counts, coefs, channel)[source]

Convert raw detector counts to radiance.

_get_area_def_uniform_sampling(lon0, channel)[source]

Get area definition with uniform sampling.

static _get_earth_mask(lat)[source]

Identify earth/space pixels.

Returns:

Mask (1=earth, 0=space)

static _get_nadir_pixel(earth_mask, sector)[source]

Find the nadir pixel.

Parameters:
  • earth_mask – Mask identifying earth and space pixels

  • sector – Specifies the scanned sector

Returns:

nadir row, nadir column

static _get_platform_name(ncattr)[source]

Determine name of the platform.

_get_sector(channel, nlines, ncols)[source]

Determine which sector was scanned.

static _ircounts2radiance(counts, scale, offset)[source]

Convert IR counts to radiance.

Reference: [IR].

Parameters:
  • counts – Raw detector counts

  • scale – Scale [mW-1 m2 cm sr]

  • offset – Offset [1]

Returns:

Radiance [mW m-2 cm-1 sr-1]

_is_yaw_flip(lat)[source]

Determine whether the satellite is yaw-flipped (‘upside down’).

_update_metadata(data, ds_info)[source]

Update metadata of the given DataArray.

static _viscounts2radiance(counts, slope, offset)[source]

Convert VIS counts to radiance.

References: [VIS]

Parameters:
  • counts – Raw detector counts

  • slope – Slope [W m-2 um-1 sr-1]

  • offset – Offset [W m-2 um-1 sr-1]

Returns:

Radiance [W m-2 um-1 sr-1]

available_datasets(configured_datasets=None)[source]

Update information for or add datasets provided by this file.

If this file handler can load a dataset then it will supplement the dataset info with the resolution and possibly coordinate datasets needed to load it. Otherwise it will continue passing the dataset information down the chain.

See satpy.readers.file_handlers.BaseFileHandler.available_datasets() for details.

abstract calibrate(data, calibration, channel)[source]

Perform calibration.

property end_time

End timestamp of the dataset.

abstract get_dataset(key, info)[source]

Load dataset designated by the given key from file.

get_shape(key, info)[source]

Get the shape of the data.

Returns:

Number of lines, number of columns

abstract property ir_sectors

Get the ir sectors.

property meta

Derive metadata from the coordinates.

property resolution

Specify the spatial resolution of the dataset.

Channel 13_3’s spatial resolution changes from one platform to another while the wavelength and file format remain the same. In order to avoid multiple YAML reader definitions for the same file format, read the channel’s resolution from the file instead of defining it in the YAML dataset. This information will then be used by the YAML reader to complement the YAML definition of the dataset.

Returns:

Spatial resolution in kilometers

property start_time

Start timestamp of the dataset.

abstract property vis_sectors

Get the vis sectors.

yaw_flip_sampling_distance = 10
class satpy.readers.goes_imager_nc.GOESNCFileHandler(filename, filename_info, filetype_info)[source]

Bases: GOESNCBaseFileHandler

File handler for GOES Imager data in netCDF format.

Initialize the reader.

calibrate(counts, calibration, channel)[source]

Perform calibration.

get_dataset(key, info)[source]

Load dataset designated by the given key from file.

ir_sectors = {(566, 3464): 'Southern Hemisphere (GOES-East)', (1062, 2760): 'Southern Hemisphere (GOES-West)', (1354, 3312): 'Northern Hemisphere (GOES-West)', (1826, 3464): 'Northern Hemisphere (GOES-East)', (2704, 5208): 'Full Disc'}
vis_sectors = {(2267, 13852): 'Southern Hemisphere (GOES-East)', (4251, 11044): 'Southern Hemisphere (GOES-West)', (5419, 13244): 'Northern Hemisphere (GOES-West)', (7307, 13852): 'Northern Hemisphere (GOES-East)', (10819, 20800): 'Full Disc'}
satpy.readers.goes_imager_nc.is_vis_channel(channel)[source]

Determine whether the given channel is a visible channel.

satpy.readers.goes_imager_nc.test_coefs(ir_url, vis_url)[source]

Test calibration coefficients against NOAA reference pages.

Currently the reference pages are:

ir_url = https://www.ospo.noaa.gov/Operations/GOES/calibration/gvar-conversion.html vis_url = https://www.ospo.noaa.gov/Operations/GOES/calibration/goes-vis-ch-calibration.html

Parameters:
  • ir_url – Path or URL to HTML page with IR coefficients

  • vis_url – Path or URL to HTML page with VIS coefficients

Raises:

ValueError if coefficients don't match the reference