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,
sensor_indices=None,
)[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 Planck brightness temperature (K) at each channel center wavenumber. Reproducing a coefficient-based downstream product exactly also requires that product’s release-pinned Planck constants.

By default, Hamming apodization is applied to the unapodized (sinc ILS) radiance before the Planck inversion. This follows the NOAA three-point radiance-space Hamming definition. The 2 guard channels at each end of each band (4 per band, 12 total) are trimmed during apodization. With no sensor_indices projection, this yields 2211 science channels; setting apodize=False instead retains all 2223 unapodized channels, including 12 guard channels with sensor_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

With sensor_indices=None and apodize=True (default), guard channels are trimmed and the output has 2211 channels with contiguous sensor_index 1–2211.

scan_line, field_of_regard, and field_of_view preserve the one-based source-array position of each footprint. scan_line is local to its source granule. scan_angle is the nominal CrIS look angle derived from FOR/FOV geometry, while satellite_za preserves the independently measured SatelliteZenithAngle from the GEO product.

With sensor_indices=None and apodize=False, the returned DataFrame has one row per FOV per channel including guard channels. The sensor_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 the 2211-channel Hamming- apodized science grid before any sensor_indices projection. Set to False to retain the unapodized source grid; with no projection this contains all 2223 channels, including 12 guards with sensor_index=0.

    Note

    NOAA’s CrIS SDR ATBD defines Hamming apodization on the Nyquist grid as this exact three-point radiance-space operator. Exact brightness-temperature reproduction additionally requires the same Planck constants as the comparison product.

  • 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

  • sensor_indices (list[int] | np.ndarray | None, optional) – Science-channel sensor_index values to return (1–2211). Values are normalized to source order and must be unique. Projection occurs after full-band Hamming apodization (when enabled), but before Planck inversion and long-format expansion. By default None, all channels are returned; for apodize=False this includes the 12 guard channels whose sensor_index is 0.

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