9. Level 4 (L4) Product Specification#
9.1. Overview description of the GHRSST L4 data product#
L4 products are the analyzed SST products, usually derived from GHRSST L2P products. L4 data products should ideally be made available within the GHRSST R/GTS framework to the user community within 24 hours.
L4 products include gap-free analyzed SST data together with a number of ancillary fields that simplify interpretation and application of the SST data. Data providers are responsible for providing documentation on their analysis procedure. The common format of L4 products allows data users to code with the security that as new SST data products are brought on-line, very minimal code changes are required to make full use of a new L4 product. Time previously spent on coding different I/O routines for each satellite data set can be spent working with the data to produce results.
The GHRSST Science Team determined that there will be 4 mandatory fields that form the core data content of a GHRSST L4 data file. In addition to global attributes and geo-location information, producers must include the following within a L4 file:
Sea Surface temperature data (SST)
Error estimates for SST data
Sea ice fraction (only and sea ice covered areas)
Land/sea/ice flag
In addition, there are a number of optional fields that may be used at the data provider’s discretion.
The GHRSST L4 file contents are summarized in Table 9.1 below.
Description |
Required |
|---|---|
Coordinate variables |
Information to permit locating data on grids, as defined in Section 6 |
Data record variables |
Core and auxiliary variables as defined in Table 9.2 |
Global Attributes |
A collection of required global attributes describing general characteristics of the file, as defined in section Section 5.2 |
9.2. L4 data record format specification#
L4 analysed data products are derived from an analysis procedure implemented at regular intervals (daily, six-hourly or other time periods). L4 data products include SST, error statistics, sea ice fraction, land/sea/ice mask, and other optional data for each grid-cell. A 6-byte experimental block is available for data providers to test new aspects of the file or information specific to the analysis system that will eventually transition into a GHRSST standard L4 analysis field once tested.
Table 9.2 describes the format of GDS L4 variables that should be created for each L4 grid cell. In the following sections, each variable within the L4 data file is described in detail.
Variable Name |
Description |
Units |
Storage type |
|---|---|---|---|
SST from analysis system |
K (kelvin) |
short |
|
Error standard deviation estimate |
K (kelvin) |
short |
|
Fractional Sea Ice area concentration |
1 (dimensionless) |
byte |
|
If the error estimates on the sea ice field are available, it is recommended to provide this information as an experimental field |
1 (dimensionless) |
byte |
|
land/ice/lake mask |
mask of bits |
byte |
|
Optional/experimental fields defined by data provider |
9.2.1. analysed_sst#
The variable analysed_sst will be included with the format requirements shown
in Table 9.3.
The data provider is responsible for providing GHRSST with documentation on
how the analysed SST is determined. Note that the RDAC should place the
_FillValue value in pixels that fall on land.
Storage type |
Name |
Description |
Unit |
|---|---|---|---|
short |
|
SST values from analysis systems |
K (kelvin) |
short analysed_sst(time, lat, lon) ;
analysed_sst:_FillValue = -32768s ;
analysed_sst:long_name = "analysed sea surface temperature" ;
analysed_sst:standard_name = "sea_surface_foundation_temperature" ;
analysed_sst:units = "K" ;
analysed_sst:coverage_content_type = "physicalMeasurement" ;
analysed_sst:add_offset = 273.15 ;
analysed_sst:scale_factor = 0.01 ;
9.3. analysis_error#
The variable analysis_error will be included with the format requirements
shown in Table 9.4.
The data provider is responsible for providing GHRSST with documentation on how
analysis_error is determined.
Storage type |
Name |
Description |
Unit |
|---|---|---|---|
short |
|
Error estimate from analysis system |
K (kelvin) |
short analysis_error(time, lat, lon) ;
analysis_error:_FillValue = -32768s ;
analysis_error:long_name = "estimated error standard deviation of analysed_sst" ;
analysis_error:units = "K" ;
analysis_error:coverage_content_type = "qualityInformation" ;
analysis_error:add_offset = 0. ;
analysis_error:scale_factor = 0.01 ;
9.4. sea_ice_fraction#
The variable sea_ice_fraction will be included with the format requirements shown in Table 9.5.
Some SST data are contaminated in part or wholly by sea ice and the L4 variable
sea_ice_fraction is used to quantify the fraction of an area contaminated
with sea ice. If the error estimates on the sea ice field are available, it
is recommended to provide this information as an experimental variable called
sea_ice_fraction_error.
Storage type |
Name |
Description |
Unit |
|---|---|---|---|
byte |
|
Fractional sea ice area concentration |
1 (unitless) |
byte sea_ice_fraction(time, lat, lon) ;
sea_ice_fraction:_FillValue = -128b ;
sea_ice_fraction:long_name = "sea ice area fraction" ;
sea_ice_fraction:standard_name = "sea_ice_area_fraction" ;
sea_ice_fraction:units = "1" ;
sea_ice_fraction:coverage_content_type = "auxiliaryInformation" ;
sea_ice_fraction:source = "EUMETSAT OSI-SAF" ;
sea_ice_fraction:add_offset = 0. ;
sea_ice_fraction:scale_factor = 0.01 ;
9.5. mask#
The variable mask will be included with the format requirements shown in Table 9.6.
Storage type |
Name |
Description |
Unit |
|---|---|---|---|
byte |
|
land/sea/ice/lake mask |
none |
byte mask(time, lat, lon) ;
mask:long_name = "land sea ice lake bit mask" ;
mask:flag_masks = 1b, 2b, 4b, 8b ;
mask:flag_meanings = "sea land lake ice" ;
9.6. Optional Variable sea_ice_fraction_error#
If the error estimates on the sea ice field are available, it is recommended
to provide this information as an optional field called
sea_ice_fraction_error. The data provider is responsible for providing
GHRSST with documentation on how sea_ice_fraction_error is estimated.
Storage type |
Name |
Description |
Unit |
|---|---|---|---|
byte |
|
Fractional sea ice area concentration error |
1 |
byte sea_ice_fraction_error(time, lat, lon) ;
sea_ice_fraction_error:_FillValue = -128b ;
sea_ice_fraction_error:long_name = "Sea ice area fraction error estimate" ;
sea_ice_fraction_error:units = "1" ;
sea_ice_fraction_error:source = "EUMETSAT SAF O&SI sea ice version 1.0" ;
sea_ice_fraction_error:scale_factor = 0.01 ;
sea_ice_fraction_error:add_offset = 0. ;
sea_ice_fraction_error:coverage_content_type = "auxiliaryInformation" ;
sea_ice_fraction_error:comment = "This will be different for each system" ;
9.6.1. Optional experimental L4 variables included by data provider#
Flexibility of L4 product content is provided through the netCDF API, which allows fully self-describing fields, and additional L4 variables may be included by L4 data providers if they are considered relevant for L4 users. The GDS-2.2r0 also permits the inclusion of R&D variables (e.g. estimates of sea ice fraction error, SST anomaly, etc.) and 6 bytes per pixel are available in total for optional/experimental variables in any combination (i.e., variables can be defined as 6 x byte, 3 x short, 2 x short + 2 x byte, etc). The use of optional/experimental variables provides a limited amount of flexibility within the GDS-2.2r0 for regional user requirements while maintaining an overall upper limit on GDS-2.2r0 L4 products for data management groups and archive scaling. In exceptional cases a waiver on the 6 byte ceiling can be requested to extend up to 12 bytes per pixel.
The GDS-2.2r0 issues the following guidance on the inclusion of optional or experimental variables within L4 data products:
The sum total of all experimental variables shall not increase L4 record size by more than 6 bytes per SST pixel. A waiver can be requested for higher amounts up to 12 bytes.
CF-1.7 or later compliance should be maintained for all optional/experimental variables. Where available, a standard_name attribute should be used.
It is permitted to use a provider defined coordinate variable associated with experimental fields but this shall be documented in data provider documentation.
Time difference data (dtime values) should be provided for variables when appropriate.
The source of data should be indicated: in the single source case as a variable attribute; as a dedicated variable when mixed data sources are present.
Use of experimental variables requires clear documentation by the GHRSST producer. They shall provide adequate documentation that describes each variable following the CDL examples provided in this document.
The variable attribute
commentshall be used to provide a URL link to a full description of each data producer defined variable included in the L4 product.Experimental L4 variables if present in an L4 product will be included with the minimum format requirements shown in Section 9.6
Additional global variables may be declared within the L4 product.
9.7. CDL example L4 dataset#
The following CDL has been generated for a detailed example global L4 dataset:
netcdf l4_full_example {
dimensions:
lat = 1600 ;
lon = 3600 ;
time = 1 ;
variables:
float lat(lat) ;
lat:long_name = "latitude" ;
lat:standard_name = "latitude" ;
lat:axis = "Y" ;
lat:units = "degrees_north" ;
lat:authority = "CF-1.7" ;
lat:valid_range = -90., 90. ;
lat:coverage_content_type = "coordinate" ;
lat:comment = "geographical coordinates, WGS84 projection" ;
float lon(lon) ;
lon:long_name = "longitude" ;
lon:standard_name = "longitude" ;
lon:axis = "X" ;
lon:units = "degrees_east" ;
lon:authority = "CF-1.7" ;
lon:valid_range = -180., 180. ;
lon:coverage_content_type = "coordinate" ;
lon:comment = "geographical coordinates, WGS84 projection" ;
short analysed_sst(time, lat, lon) ;
analysed_sst:_FillValue = -32768s ;
analysed_sst:long_name = "analysed sea surface temperature" ;
analysed_sst:standard_name = "sea_surface_foundation_temperature" ;
analysed_sst:units = "K" ;
analysed_sst:coverage_content_type = "physicalMeasurement" ;
analysed_sst:add_offset = 273.15 ;
analysed_sst:scale_factor = 0.01 ;
short analysis_error(time, lat, lon) ;
analysis_error:_FillValue = -32768s ;
analysis_error:long_name = "estimated error standard deviation of analysed_sst" ;
analysis_error:units = "K" ;
analysis_error:coverage_content_type = "qualityInformation" ;
analysis_error:add_offset = 0. ;
analysis_error:scale_factor = 0.01 ;
byte mask(time, lat, lon) ;
mask:long_name = "land sea ice lake bit mask" ;
mask:flag_masks = 1b, 2b, 4b, 8b ;
mask:flag_meanings = "sea land lake ice" ;
byte sea_ice_fraction(time, lat, lon) ;
sea_ice_fraction:_FillValue = -128b ;
sea_ice_fraction:long_name = "sea ice area fraction" ;
sea_ice_fraction:standard_name = "sea_ice_area_fraction" ;
sea_ice_fraction:units = "1" ;
sea_ice_fraction:coverage_content_type = "auxiliaryInformation" ;
sea_ice_fraction:source = "EUMETSAT OSI-SAF" ;
sea_ice_fraction:add_offset = 0. ;
sea_ice_fraction:scale_factor = 0.01 ;
double time(time) ;
time:long_name = "reference time of field" ;
time:standard_name = "time" ;
time:axis = "T" ;
time:authority = "CF-1.7" ;
time:coverage_content_type = "coordinate" ;
time:units = "seconds since 1981-01-01" ;
time:calendar = "proleptic_gregorian" ;
byte sea_ice_fraction_error(time, lat, lon) ;
sea_ice_fraction_error:_FillValue = -128b ;
sea_ice_fraction_error:long_name = "Sea ice area fraction error estimate" ;
sea_ice_fraction_error:units = "1" ;
sea_ice_fraction_error:source = "EUMETSAT SAF O&SI sea ice version 1.0" ;
sea_ice_fraction_error:scale_factor = 0.01 ;
sea_ice_fraction_error:add_offset = 0. ;
sea_ice_fraction_error:coverage_content_type = "auxiliaryInformation" ;
sea_ice_fraction_error:comment = "This will be different for each system" ;
short sst_anomaly(time, lat, lon) ;
sst_anomaly:_FillValue = -32768s ;
sst_anomaly:long_name = "SST anomaly from a seasonal SST climatology based on data over 2003-2014 period" ;
sst_anomaly:units = "K" ;
sst_anomaly:source = "ODYSSEA L4" ;
sst_anomaly:scale_factor = 0.001 ;
sst_anomaly:add_offset = 0. ;
sst_anomaly:coverage_content_type = "auxiliaryInformation" ;
sst_anomaly:comment = "anomaly reference to the day-of-year average between 2003 and 2014" ;
// global attributes:
:Conventions = "CF-1.7, ACDD-1.3, ISO 8601" ;
:standard_name_vocabulary = "Climate and Forecast (CF) Standard Name Table v79" ;
:naming_authority = "org.ghrsst" ;
:netcdf_version_id = "4.9.2 of Sep 1 2023 15:18:59 $" ;
:title = "ODYSSEA Global Sea Surface Temperature Gridded Level 4 Daily Multi-Sensor Observations" ;
:id = "ODYSSEA-IFR-L4-GLOB_002-v2.1" ;
:cmems_product_id = "SST_GLO_PHY_L4_NRT_010_043" ;
:summary = "This dataset provide a times series of daily multi-sensor optimal interpolation of Sea Surface Temperature (SST) foundation over Global Ocean on a 0.1 degree resolution grid, every 24 hours. It is produced for the Copernicus Marine Service." ;
:references = "Product User Manual for L4 Odyssea Product over the Global Ocean, v1.0, Jan 2023, https://catalogue.marine.copernicus.eu/documents/PUM/CMEMS-SST-PUM-010-043.pdf" ;
:metadata_link = "https://data.marine.copernicus.eu/product/SST_GLO_PHY_L4_NRT_010_043/description" ;
:doi = "https://doi.org/10.48670/mds-00321" ;
:processing_level = "L4" ;
:keywords = "Oceans > Ocean Temperature > Sea Surface Temperature" ;
:keywords_vocabulary = "NASA Global Change Master Directory (GCMD) Science Keywords" ;
:project = "Copernicus Marine Service" ;
:program = "Copernicus, GHRSST" ;
:institution = "Institut Francais de Recherche pour l\'Exploitation de la mer / Centre d\'Exploitation et de Recherche Satellitaire" ;
:institution_abbreviation = "Ifremer / CERSAT" ;
:license = "These data are available free of charge under the CMEMS data policy, refer to http://marine.copernicus.eu/services-portfolio/service-commitments-and-licence/" ;
:acknowledgment = "This dataset is funded by Copernicus Marine Service" ;
:citation = "Ifremer / CERSAT. 2022. ODYSSEA Global High-Resolution Sea Surface Temperature Gridded Level 4 Daily dataset for Copernicus Marine Service. Ver. 2.1. Ifremer, Plouzane, France. Dataset accessed [YYYY-MM-DD]." ;
:contact = "emmanuelle.autret@ifremer.fr;jfpiolle@ifremer.fr" ;
:technical_support_contact = "cersat@ifremer.fr" ;
:scientific_support_contact = "emmanuelle.autret@ifremer.fr;jfpiolle@ifremer.fr" ;
:creator_email = "cersat@ifremer.fr" ;
:creator_type = "institution" ;
:creator_institution = "Ifremer" ;
:creator_name = "CERSAT" ;
:creator_url = "http://cersat.ifremer.fr" ;
:publisher_institution = "Copernicus Marine Service" ;
:publisher_name = "Copernicus Marine Service" ;
:publisher_url = "https://marine.copernicus.eu" ;
:format_version = "GHRSST GDS v2.1" ;
:gds_version_id = "2.1" ;
:processing_software = "ODYSSEA OI 2.1" ;
:source = "Odyssea L4 processor" ;
:source_version = "3.0.2" ;
:geospatial_bounds = "POLYGON ((-180 -80.0, 180.0 -80.0, 180.0 80.0, -180 80.0, -180 -80.0))" ;
:geospatial_bounds_crs = "EPSG:4326" ;
:geospatial_bounds_vertical_crs = "EPSG:5831" ;
:geospatial_lat_max = 80. ;
:geospatial_lat_min = -80. ;
:geospatial_lat_resolution = 0.1 ;
:geospatial_lat_units = "degrees_north" ;
:geospatial_lon_max = 180. ;
:geospatial_lon_min = -180 ;
:geospatial_lon_resolution = 0.1 ;
:geospatial_lon_units = "degrees_east" ;
:geospatial_vertical_min = 0. ;
:geospatial_vertical_max = 0. ;
:time_coverage_start = "2024-02-28T12:00:00Z" ;
:time_coverage_end = "2024-02-29T12:00:00Z" ;
:time_coverage_resolution = "P1D" ;
:spatial_resolution = " 0.1 degree" ;
:temporal_resolution = "daily" ;
:cdm_data_type = "grid" ;
:source_data = "VIIRS_NPP-STAR-L2P-v2.80 VIIRS_N20-STAR-L2P-v2.80 AVHRR_SST_METOP_B-OSISAF-L2P-v1.0 AVHRR_SST_METOP_C-OSISAF-L2P-v1.0 SLSTRA-MAR-L2P-v1.0 SLSTRB-MAR-L2P-v1.0 ABI_G18-STAR-L3C-v2.90 SEVIRI_SST-OSISAF-L3C-v1.0 GOES16-OSISAF-L3C-v1.0 SEVIRI_IO_SST-OSISAF-L3C-v1.0 AHI_H09-STAR-L3C-v2.9 AMSR2-REMSS-L2P-v8.2" ;
:platform = "NPP;NOAA-20;Metop-B;Metop-C;Sentinel-3A;Sentinel-3B;GOES-18;Meteosat-10;GOES-16;Meteosat-9;Himawari-9;GCOM-W" ;
:platform_type = "polar_orbiter;polar_orbiter;polar_orbiter;polar_orbiter;polar_orbiter;polar_orbiter;geostationary;geostationary;geostationary;geostationary;geostationary;polar_orbiter" ;
:platform_vocabulary = "CEOS mission table" ;
:instrument = "VIIRS;VIIRS;AVHRR/3;AVHRR/3;SLSTR;SLSTR;ABI;SEVIRI;ABI;SEVIRI;AHI;AMSR-2" ;
:instrument_type = "radiometer;radiometer;radiometer;radiometer;radiometer;radiometer;radiometer;radiometer;radiometer;radiometer;radiometer;radiometer" ;
:instrument_vocabulary = "CEOS instrument table" ;
:product_version = " 1.0" ;
:date_created = "2024-03-05T16:23:28" ;
:date_modified = "2024-03-05T16:23:28" ;
:date_issued = "2024-03-05T16:23:28" ;
:date_metadata_modified = "2023-11-01T00:00:00" ;
:history = "Optimally interpolated SST originally produced by Ifremer/CERSAT with ODYSSEA OI processor 2.1, ODYSSEA system 3.0.2" ;
:uuid = "2527ec2f-8d70-40d3-b56c-79757ce8574f" ;
:file_quality_level = 3 ;
}
Comments:
Comments This is a land/sea/ice mask with the following bit values:
Bit 0:1 = water in grid
Bit 1:1 = land in grid
Bit 2:1 = optional, lake surface in grid
Bit 3:1 = sea ice
Bit 4:1 = optional, river surface in grid
Bits [5-7] spare
Note that the lake and river surface bit values are optional.
The
sourceattribute should list any data product used in creating this mask, a semi-colon separated list of identifiers <provider>_<type_of_mask>_<version_mask>.