JPSS_CRIS#

class earth2studio.data.JPSS_CRIS(
satellites=None,
subsample=1,
apodize=True,
time_tolerance=numpy.timedelta64(10, 'm'),
cache=True,
verbose=True,
async_timeout=600,
max_workers=24,
retries=3,
)[source]#
Global

JPSS CrIS (Cross-track Infrared Sounder) Full Spectral Resolution (FSR) Level 1 brightness temperature observations served from NOAA Open Data on AWS.

Raw spectral radiance from the HDF5 SDR files is converted to brightness temperature (K) via the inverse Planck function so that the observation column is directly comparable with UFSObsSat.

By default, Hamming apodization is applied to the unapodized (sinc ILS) radiance before the Planck inversion. This matches the processing used by NCEP/GSI (which receives Hamming-apodized CrIS radiance via BUFR) and produces brightness temperatures consistent with UFSObsSat. The 2 guard channels at each end of each band (4 per band, 12 total) are trimmed during apodization, yielding 2211 science channels. Set apodize=False to retain the full 2223 unapodized channels (including 12 guard channels with channel_index=0).

Each HDF5 granule contains a small number of scan lines, each with 30 Fields of Regard (FOR) and 9 Fields of View (FOV) per FOR (3x3 detector array). In FSR mode the instrument produces 2223 spectral channels:

  • LWIR (9.14–15.38 µm, 650–1095 cm^-1): 717 channels at 0.625 cm^-1

  • MWIR (5.71–8.26 µm, 1210–1750 cm^-1): 869 channels at 0.625 cm^-1

  • SWIR (3.92–4.64 µm, 2155–2550 cm^-1): 637 channels at 0.625 cm^-1

When apodize=True (default), guard channels are trimmed and the output has 2211 channels with contiguous channel_index 1–2211.

When apodize=False, the returned DataFrame has one row per FOV per channel including guard channels. The channel_index column uses the GSI sensor_chan numbering convention:

  • LWIR channels 0–1 (0-based) → sensor_chan 0 (guard; not in GSI)

  • LWIR channels 2–714 (0-based) → sensor_chan 1–713

  • LWIR channels 715–716 (0-based) → sensor_chan 0 (guard; not in GSI)

  • MWIR channels 717–718 (0-based) → sensor_chan 0 (guard; not in GSI)

  • MWIR channels 719–1583 (0-based) → sensor_chan 714–1578

  • MWIR channels 1584–1585 (0-based) → sensor_chan 0 (guard; not in GSI)

  • SWIR channels 1586–1587 (0-based) → sensor_chan 0 (guard; not in GSI)

  • SWIR channels 1588–2220 (0-based) → sensor_chan 1579–2211

  • SWIR channels 2221–2222 (0-based) → sensor_chan 0 (guard; not in GSI)

Data is stored as paired HDF5 files on S3:

  • SDR (SCRIF_*.h5): spectral radiance arrays

  • GEO (GCRSO_*.h5): geolocation (lat, lon, angles, time)

Parameters:
  • satellites (list[str] | None, optional) – Satellite short-names to query. Valid values are "n20" (NOAA-20), "n21" (NOAA-21), and "npp" (Suomi NPP). By default None, which queries all valid satellites.

  • subsample (int, optional) – Temporal sub-sampling factor applied at the granule level. Each CrIS granule covers roughly 32 seconds of observations; setting subsample=N selects every N-th granule from the time-ordered list, reducing data volume by approximately that factor. By default 1 (no sub-sampling).

  • apodize (bool, optional) –

    Apply Hamming apodization to the unapodized SDR radiance before converting to brightness temperature. When True (default), the 3-tap Hamming kernel [0.23, 0.54, 0.23] is convolved per-band in radiance space and the 2 guard channels at each end of each band are trimmed, yielding 2211 science channels that are directly comparable with UFSObsSat. Set to False to retain the unapodized spectra with all 2223 channels (including 12 guard channels with channel_index=0).

    Note

    The spectral-domain 3-tap kernel matches interferogram-domain Hamming for smooth spectral regions (window channels, sensor_chan ≥ 200: agreement < 0.5 K with UFS/GSI). Channels on sharp CO₂ Q-branch features near 667 cm⁻¹ and 720 cm⁻¹ may show residuals of 5–20 K because the 3-tap discrete convolution does not fully replicate the interferogram-domain apodization applied by NESDIS upstream of GSI.

  • time_tolerance (TimeTolerance, optional) – Time tolerance window for filtering observations. Accepts a single value (symmetric +/- window) or a tuple (lower, upper) for asymmetric windows, by default, np.timedelta64(10, ‘m’).

  • cache (bool, optional) – Cache downloaded HDF5 files locally, by default True

  • verbose (bool, optional) – Show download progress bars, by default True

  • async_timeout (int, optional) – Total timeout in seconds for the async fetch, by default 600

  • max_workers (int, optional) – Maximum number of concurrent S3 fetch tasks, by default 24

  • retries (int, optional) – Per-file retry count on transient I/O failures, by default 3

Warning

This is a remote data source and can potentially download a large amount of data to your local machine for large requests. Each CrIS granule pair (SDR + GEO) is approximately 16 MB.

__call__(time, variable, fields=None)[source]#

Fetch CrIS FSR brightness temperature observations.

Parameters:
  • time (datetime | list[datetime] | TimeArray) – Timestamps to return data for (UTC).

  • variable (str | list[str] | VariableArray) – Variable names to return (e.g. ["crisfsr"]).

  • fields (str | list[str] | pa.Schema | None, optional) – Subset of schema fields to include, by default None (all).

Returns:

Long-format DataFrame with one row per FOV per channel.

Return type:

pd.DataFrame

async fetch(time, variable, fields=None)[source]#

Async implementation of the data fetch.

Parameters:
  • time (datetime | list[datetime] | TimeArray) – Timestamps to return data for (UTC).

  • variable (str | list[str] | VariableArray) – Variable names to return.

  • fields (str | list[str] | pa.Schema | None, optional) – Subset of schema fields to include, by default None.

Returns:

Long-format DataFrame.

Return type:

pd.DataFrame

classmethod available(time)[source]#

Check whether data is available for a given time.

Parameters:

time (datetime | np.datetime64) – Date-time to check.

Return type:

bool