Skip to content

Cold-Point Tropopause (CTP) diagnostic and sample recipe - #4565

Draft
aoifemcquaid wants to merge 3 commits into
mainfrom
EVA_convection_diagnostics_CTP
Draft

Cold-Point Tropopause (CTP) diagnostic and sample recipe#4565
aoifemcquaid wants to merge 3 commits into
mainfrom
EVA_convection_diagnostics_CTP

Conversation

@aoifemcquaid

@aoifemcquaid aoifemcquaid commented Jul 23, 2026

Copy link
Copy Markdown

Summary

This PR adds a new tropical cold-point tropopause (CTP) Hovmoeller diagnostic to ESMValTool. It identifies the CTP as the minimum-temperature level in a configurable pressure range and produces longitude-time and latitude-time Hovmoeller plots of CTP temperature, specific humidity, and relative humidity w.r.t. ice, with CTP pressure shown as filled contours. The recipe runs the diagnostic against ERA5 and CMIP6 data.

Files added/changed

  • esmvaltool/recipes/recipe_tropical_cpt_hovmoeller.yml — new recipe defining ERA5 (native6) and CMIP6 (MPI-ESM1-2-LR) datasets, monthly ta/hus variables, and the diagnostic script config (pressure/latitude bounds, plot filename prefix, resolution/dpi settings).
  • esmvaltool/diag_scripts/tropopause/cpt_hovmoeller.py — new diagnostic script implementing the CTP calculation and Hovmoeller plotting (details below).

CTP diagnostic workflow

  • CTP calculation: for each grid point and time step, the script searches for the minimum temperature between the configured pressure bounds (default 500–10 hPaessure as CTP pressure. It then samples specific humidity at that same level to get CTP specific humidity, and derives CTP relative humidity with respect to from the CTP temperature, specific humidity, an-vapour-pressure-over-ice formula. This reduction happens at full model resolution before any spatial averaging.
  • Plots produced: for each dataset, the script produces two Hovmoeller views: time-vs-longitude (monthly mean, averaged over the -20°S–20°N tropical band, full longitude range) and time-vs-latitude (monthly mean, restricted to -20°S–20°N, averaged over the full longitude range). Each view produces one standalone figure per variable (temperature, specific humidity, RH over ice), with CTP pressure as f variable as black contour lines. Filenames follow {plot_filename}{dataset}{variable}_{lon|lat}.png (e.g. tropical_cpt_hovmoeller_ERA5_temperature_lon.png), giving 6 figures per dataset (12 total for ERA5+CMIP6).
  • Other processing: datasets are grouped by the alias metadata facet and processed independently; the script also supports
    an optional raw-ICON input pathway (file-pattel preprocessing) that can run alongside preprocessed datasets in the same invocation, used for local ICON testing (see below) but not part of this recipe.

Data included

The recipe uses only ERA5 (project: native6) and CMIP6 (MPI-ESM1-2-LR, historical, r1i1p1f1, gn) — both standard ESMValTool-accessible sources. No local or absolute file paths are included in this recipe. A separate ICON-inclusive variant of this recipe (adding a local-path ICON dataset block) exists outside this repository for local development use only and is not part of this PR.

Testing

Run locally end-to-end with ESMValTool via the repo’s pixi environment (project.toml, pixi.lock; ESMValCore dependency pinned to >=2.14.0, ESMValTool dev version v2.14.0-74-g9ea83ca94 per git describe). The recipe completed successfully and produced all expected output plots for every dataset/variable/plot-type combination (12 PNGs: ERA5 and CMIP6, 3 variables each, lon and lat views). No further validation (e.g. against reference/published CTP climatologies) has been performed.

  • Closes #issue_number
  • Link to documentation: TODO

Before you get started

Checklist

It is the responsibility of the author to make sure the pull request is ready to review. The icons indicate whether the item will be subject to the 🛠 Technical or 🧪 Scientific review.

New or updated recipe/diagnostic


To help with the number of pull requests:

…-ML. Longitude hovmoeller plot with CPT P, T, q and RH_i. RH_i derived from other variables.
- Replace the hard-coded local-path-only ICON recipe with ERA5 (native6) and CMIP6 (MPI-ESM1-2-LR), and preserve the original ICON local-path setup as a separate copy outside the repo.
- Split each dataset's single 3-panel figure into standalone, self-contained per-variable plots (temperature, specific humidity, RH over ice), so more compatible with ICONEval as plots can be produced independently
- Add a parallel time-vs-latitude Hovmoeller view (restricted to -20°/+20°) alongside the existing time-vs-longitude view for every variable/dataset, doubling figure count with a consistent _lon/_lat filename suffix.
- Fix main() so preprocessed datasets (ERA5/CMIP6) and a raw ICON block can both run in the same invocation rather than ICON short-circuiting dataset processing, without altering the underlying CTP calculation logic.
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@schlunma schlunma added this to the v2.16.0 milestone Jul 24, 2026

@schlunma schlunma left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @aoifemcquaid, looks great already! Just a couple of comments to make the code simpler.

Please remove all special treatment of ICON data, it should be possible to read this without any special treatment in the diagnostic. If you need the ICON data to be on a regular grid with a regular pressure level Z coordinate, you can use the following preprocessors in the recipe:

preprocessors:
  preprocess_icon:
    custom_order: true
    extract_levels:
      levels: {cmor_table: CMIP6, coordinate: plev19}
      scheme: linear
      coordinate: air_pressure
    regrid:
      target_grid: 2x2
      scheme: area_weighted

It would be great if you could also add documentation to the recipe/diagnostic (e.g., like done in #3155).

If you want, you can also add your name to the CITATION.cff and .zenodo.json to become an official contributor.

Thanks 🚀

Comment thread esmvaltool/diag_scripts/tropopause/cpt_hovmoeller.py
Comment thread esmvaltool/diag_scripts/tropopause/cpt_hovmoeller.py
Comment thread esmvaltool/diag_scripts/tropopause/cpt_hovmoeller.py
Comment thread esmvaltool/diag_scripts/tropopause/cpt_hovmoeller.py
Comment thread esmvaltool/diag_scripts/tropopause/cpt_hovmoeller.py
Comment thread esmvaltool/diag_scripts/tropopause/cpt_hovmoeller.py
Comment thread esmvaltool/diag_scripts/tropopause/cpt_hovmoeller.py
Comment on lines +11 to +12
- weigel_katja
- schlund_manuel

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- weigel_katja
- schlund_manuel
- mcquaid_aoife

- weigel_katja
- schlund_manuel
maintainer:
- unmaintained

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- unmaintained
- schlund_manuel

Comment thread esmvaltool/diag_scripts/tropopause/cpt_hovmoeller.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants