StormScope Meteosat FCI Nowcasting¶
StormScope inference workflow with MTG-I1 FCI satellite imagery.
This example will demonstrate how to run inference to generate nowcasts of Meteosat Third Generation (MTG-I1) FCI satellite imagery using StormScopeMeteosatEU, a generative diffusion model that predicts the next 10-minute FCI frame from a sliding window of recent observations.
In this example you will learn:
- How to instantiate
earth2studio.models.px.StormScopeMeteosatEU - Creating a
earth2studio.data.MeteosatFCIdata source - Fetching FCI observations as the model input
- Running iterative nowcasting
- Plotting an RGB composite of FCI channels with cartopy
Set Up¶
StormScopeMeteosatEU is a pure-observation nowcasting model: it requires no
external NWP conditioning. The only input is a sliding window of L
consecutive FCI frames ending at the analysis time.
The model operates on a rectangular sub-region of the full MTG disk defined
in native FCI pixel coordinates by
[StormScopeMeteosatEU.Model_FCI_BBox][]. We configure
earth2studio.data.MeteosatFCI with the matching pixel_bbox
so that data fetching returns exactly the pixels the model expects, with
no interpolation needed.
EUMETSAT Data Store credentials must be available via the environment
variables EUMETSAT_CONSUMER_KEY and EUMETSAT_CONSUMER_SECRET, or in
the ~/.eumdac/credentials file.
import os
from datetime import datetime, timezone
os.makedirs("outputs", exist_ok=True)
from dotenv import load_dotenv
load_dotenv()
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np
import torch
from tqdm import tqdm
from earth2studio.data import fetch_data
from earth2studio.data.meteosat_fci import (
PERSPECTIVE_POINT_HEIGHT,
SEMI_MAJOR_AXIS,
SEMI_MINOR_AXIS,
MeteosatFCI,
)
from earth2studio.models.px.stormscope_meteosat import StormScopeMeteosatEU
from earth2studio.utils.coords import map_coords
Load Model¶
Load StormScopeMeteosatEU from a package.
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
package = StormScopeMeteosatEU.load_default_package()
model = StormScopeMeteosatEU.load_model(package=package)
model = model.to(device)
model.eval()
model.compile_model()
Console output247 lines
Downloading config.yaml: 0%| | 0.00/438 [00:00<?, ?B/s]
Downloading config.yaml: 100%|โโโโโโโโโโ| 438/438 [00:00<00:00, 2.03kB/s]
Downloading config.yaml: 100%|โโโโโโโโโโ| 438/438 [00:00<00:00, 2.02kB/s]
Downloading StormscopeMTG-low.mdlus: 0%| | 0.00/1.14G [00:00<?, ?B/s]
Downloading StormscopeMTG-low.mdlus: 1%| | 10.0M/1.14G [00:01<03:01, 6.69MB/s]
Downloading StormscopeMTG-low.mdlus: 2%|โ | 20.0M/1.14G [00:01<01:23, 14.3MB/s]
Downloading StormscopeMTG-low.mdlus: 3%|โ | 30.0M/1.14G [00:01<00:55, 21.3MB/s]
Downloading StormscopeMTG-low.mdlus: 3%|โ | 40.0M/1.14G [00:02<00:42, 27.7MB/s]
Downloading StormscopeMTG-low.mdlus: 4%|โ | 50.0M/1.14G [00:02<00:36, 32.4MB/s]
Downloading StormscopeMTG-low.mdlus: 5%|โ | 60.0M/1.14G [00:02<00:31, 36.4MB/s]
Downloading StormscopeMTG-low.mdlus: 6%|โ | 70.0M/1.14G [00:04<01:20, 14.3MB/s]
Downloading StormscopeMTG-low.mdlus: 7%|โ | 80.0M/1.14G [00:04<01:09, 16.5MB/s]
Downloading StormscopeMTG-low.mdlus: 8%|โ | 90.0M/1.14G [00:04<00:55, 20.2MB/s]
Downloading StormscopeMTG-low.mdlus: 9%|โ | 100M/1.14G [00:05<00:43, 25.5MB/s]
Downloading StormscopeMTG-low.mdlus: 9%|โ | 110M/1.14G [00:05<00:35, 31.3MB/s]
Downloading StormscopeMTG-low.mdlus: 10%|โ | 120M/1.14G [00:05<00:29, 37.7MB/s]
Downloading StormscopeMTG-low.mdlus: 11%|โ | 130M/1.14G [00:05<00:23, 45.6MB/s]
Downloading StormscopeMTG-low.mdlus: 12%|โโ | 140M/1.14G [00:05<00:22, 47.7MB/s]
Downloading StormscopeMTG-low.mdlus: 13%|โโ | 150M/1.14G [00:05<00:22, 47.6MB/s]
Downloading StormscopeMTG-low.mdlus: 14%|โโ | 160M/1.14G [00:06<00:21, 49.3MB/s]
Downloading StormscopeMTG-low.mdlus: 15%|โโ | 170M/1.14G [00:06<00:21, 48.3MB/s]
Downloading StormscopeMTG-low.mdlus: 15%|โโ | 180M/1.14G [00:06<00:21, 47.6MB/s]
Downloading StormscopeMTG-low.mdlus: 16%|โโ | 190M/1.14G [00:06<00:21, 47.2MB/s]
Downloading StormscopeMTG-low.mdlus: 17%|โโ | 200M/1.14G [00:07<00:28, 36.0MB/s]
Downloading StormscopeMTG-low.mdlus: 18%|โโ | 210M/1.14G [00:07<00:24, 40.7MB/s]
Downloading StormscopeMTG-low.mdlus: 19%|โโ | 220M/1.14G [00:07<00:23, 41.7MB/s]
Downloading StormscopeMTG-low.mdlus: 20%|โโ | 230M/1.14G [00:07<00:20, 49.1MB/s]
Downloading StormscopeMTG-low.mdlus: 21%|โโ | 240M/1.14G [00:07<00:19, 51.0MB/s]
Downloading StormscopeMTG-low.mdlus: 21%|โโโ | 250M/1.14G [00:08<00:19, 49.0MB/s]
Downloading StormscopeMTG-low.mdlus: 22%|โโโ | 260M/1.14G [00:08<00:25, 37.3MB/s]
Downloading StormscopeMTG-low.mdlus: 23%|โโโ | 270M/1.14G [00:08<00:22, 41.2MB/s]
Downloading StormscopeMTG-low.mdlus: 24%|โโโ | 280M/1.14G [00:09<00:20, 46.1MB/s]
Downloading StormscopeMTG-low.mdlus: 25%|โโโ | 290M/1.14G [00:09<00:19, 46.4MB/s]
Downloading StormscopeMTG-low.mdlus: 26%|โโโ | 300M/1.14G [00:09<00:17, 50.8MB/s]
Downloading StormscopeMTG-low.mdlus: 27%|โโโ | 310M/1.14G [00:09<00:17, 50.8MB/s]
Downloading StormscopeMTG-low.mdlus: 27%|โโโ | 320M/1.14G [00:10<00:26, 34.0MB/s]
Downloading StormscopeMTG-low.mdlus: 28%|โโโ | 330M/1.14G [00:10<00:22, 39.5MB/s]
Downloading StormscopeMTG-low.mdlus: 29%|โโโ | 340M/1.14G [00:10<00:19, 45.0MB/s]
Downloading StormscopeMTG-low.mdlus: 30%|โโโ | 350M/1.14G [00:10<00:21, 40.2MB/s]
Downloading StormscopeMTG-low.mdlus: 31%|โโโ | 360M/1.14G [00:10<00:19, 44.1MB/s]
Downloading StormscopeMTG-low.mdlus: 32%|โโโโ | 370M/1.14G [00:11<00:17, 47.0MB/s]
Downloading StormscopeMTG-low.mdlus: 33%|โโโโ | 380M/1.14G [00:11<00:16, 50.0MB/s]
Downloading StormscopeMTG-low.mdlus: 33%|โโโโ | 390M/1.14G [00:12<00:40, 20.3MB/s]
Downloading StormscopeMTG-low.mdlus: 34%|โโโโ | 400M/1.14G [00:12<00:32, 24.7MB/s]
Downloading StormscopeMTG-low.mdlus: 35%|โโโโ | 410M/1.14G [00:13<00:28, 28.0MB/s]
Downloading StormscopeMTG-low.mdlus: 36%|โโโโ | 420M/1.14G [00:13<00:25, 31.0MB/s]
Downloading StormscopeMTG-low.mdlus: 37%|โโโโ | 430M/1.14G [00:13<00:22, 34.6MB/s]
Downloading StormscopeMTG-low.mdlus: 38%|โโโโ | 440M/1.14G [00:13<00:20, 37.2MB/s]
Downloading StormscopeMTG-low.mdlus: 39%|โโโโ | 450M/1.14G [00:14<00:25, 29.0MB/s]
Downloading StormscopeMTG-low.mdlus: 39%|โโโโ | 460M/1.14G [00:14<00:21, 34.1MB/s]
Downloading StormscopeMTG-low.mdlus: 40%|โโโโ | 470M/1.14G [00:14<00:19, 37.3MB/s]
Downloading StormscopeMTG-low.mdlus: 41%|โโโโ | 480M/1.14G [00:14<00:18, 39.9MB/s]
Downloading StormscopeMTG-low.mdlus: 42%|โโโโโ | 490M/1.14G [00:15<00:16, 42.9MB/s]
Downloading StormscopeMTG-low.mdlus: 43%|โโโโโ | 500M/1.14G [00:15<00:16, 43.0MB/s]
Downloading StormscopeMTG-low.mdlus: 44%|โโโโโ | 510M/1.14G [00:15<00:14, 48.7MB/s]
Downloading StormscopeMTG-low.mdlus: 45%|โโโโโ | 520M/1.14G [00:16<00:19, 34.8MB/s]
Downloading StormscopeMTG-low.mdlus: 45%|โโโโโ | 530M/1.14G [00:16<00:16, 40.6MB/s]
Downloading StormscopeMTG-low.mdlus: 46%|โโโโโ | 540M/1.14G [00:16<00:15, 42.9MB/s]
Downloading StormscopeMTG-low.mdlus: 47%|โโโโโ | 550M/1.14G [00:16<00:14, 43.6MB/s]
Downloading StormscopeMTG-low.mdlus: 48%|โโโโโ | 560M/1.14G [00:16<00:13, 46.9MB/s]
Downloading StormscopeMTG-low.mdlus: 49%|โโโโโ | 570M/1.14G [00:16<00:12, 49.7MB/s]
Downloading StormscopeMTG-low.mdlus: 50%|โโโโโ | 580M/1.14G [00:17<00:16, 37.4MB/s]
Downloading StormscopeMTG-low.mdlus: 50%|โโโโโ | 590M/1.14G [00:17<00:16, 36.6MB/s]
Downloading StormscopeMTG-low.mdlus: 51%|โโโโโโ | 600M/1.14G [00:17<00:14, 40.3MB/s]
Downloading StormscopeMTG-low.mdlus: 52%|โโโโโโ | 610M/1.14G [00:18<00:14, 40.3MB/s]
Downloading StormscopeMTG-low.mdlus: 53%|โโโโโโ | 620M/1.14G [00:18<00:17, 32.1MB/s]
Downloading StormscopeMTG-low.mdlus: 54%|โโโโโโ | 630M/1.14G [00:18<00:14, 40.0MB/s]
Downloading StormscopeMTG-low.mdlus: 55%|โโโโโโ | 640M/1.14G [00:19<00:16, 33.2MB/s]
Downloading StormscopeMTG-low.mdlus: 56%|โโโโโโ | 650M/1.14G [00:19<00:14, 36.3MB/s]
Downloading StormscopeMTG-low.mdlus: 56%|โโโโโโ | 660M/1.14G [00:19<00:12, 41.6MB/s]
Downloading StormscopeMTG-low.mdlus: 57%|โโโโโโ | 670M/1.14G [00:19<00:12, 43.0MB/s]
Downloading StormscopeMTG-low.mdlus: 58%|โโโโโโ | 680M/1.14G [00:20<00:11, 46.1MB/s]
Downloading StormscopeMTG-low.mdlus: 59%|โโโโโโ | 690M/1.14G [00:20<00:10, 47.9MB/s]
Downloading StormscopeMTG-low.mdlus: 60%|โโโโโโ | 700M/1.14G [00:20<00:09, 53.5MB/s]
Downloading StormscopeMTG-low.mdlus: 61%|โโโโโโ | 710M/1.14G [00:20<00:14, 32.5MB/s]
Downloading StormscopeMTG-low.mdlus: 62%|โโโโโโโ | 720M/1.14G [00:21<00:12, 37.9MB/s]
Downloading StormscopeMTG-low.mdlus: 62%|โโโโโโโ | 730M/1.14G [00:21<00:11, 40.2MB/s]
Downloading StormscopeMTG-low.mdlus: 63%|โโโโโโโ | 740M/1.14G [00:21<00:10, 42.6MB/s]
Downloading StormscopeMTG-low.mdlus: 64%|โโโโโโโ | 750M/1.14G [00:21<00:09, 44.5MB/s]
Downloading StormscopeMTG-low.mdlus: 65%|โโโโโโโ | 760M/1.14G [00:22<00:09, 46.8MB/s]
Downloading StormscopeMTG-low.mdlus: 66%|โโโโโโโ | 770M/1.14G [00:22<00:11, 35.7MB/s]
Downloading StormscopeMTG-low.mdlus: 67%|โโโโโโโ | 780M/1.14G [00:22<00:10, 39.4MB/s]
Downloading StormscopeMTG-low.mdlus: 68%|โโโโโโโ | 790M/1.14G [00:22<00:09, 40.6MB/s]
Downloading StormscopeMTG-low.mdlus: 68%|โโโโโโโ | 800M/1.14G [00:23<00:08, 45.0MB/s]
Downloading StormscopeMTG-low.mdlus: 69%|โโโโโโโ | 810M/1.14G [00:23<00:08, 46.9MB/s]
Downloading StormscopeMTG-low.mdlus: 70%|โโโโโโโ | 820M/1.14G [00:23<00:07, 48.0MB/s]
Downloading StormscopeMTG-low.mdlus: 71%|โโโโโโโ | 830M/1.14G [00:23<00:08, 41.3MB/s]
Downloading StormscopeMTG-low.mdlus: 72%|โโโโโโโโ | 840M/1.14G [00:24<00:11, 30.3MB/s]
Downloading StormscopeMTG-low.mdlus: 73%|โโโโโโโโ | 850M/1.14G [00:24<00:09, 36.6MB/s]
Downloading StormscopeMTG-low.mdlus: 74%|โโโโโโโโ | 860M/1.14G [00:24<00:08, 39.3MB/s]
Downloading StormscopeMTG-low.mdlus: 74%|โโโโโโโโ | 870M/1.14G [00:24<00:06, 44.9MB/s]
Downloading StormscopeMTG-low.mdlus: 75%|โโโโโโโโ | 880M/1.14G [00:25<00:06, 45.0MB/s]
Downloading StormscopeMTG-low.mdlus: 76%|โโโโโโโโ | 890M/1.14G [00:25<00:06, 47.8MB/s]
Downloading StormscopeMTG-low.mdlus: 77%|โโโโโโโโ | 900M/1.14G [00:25<00:07, 35.4MB/s]
Downloading StormscopeMTG-low.mdlus: 78%|โโโโโโโโ | 910M/1.14G [00:25<00:06, 42.2MB/s]
Downloading StormscopeMTG-low.mdlus: 79%|โโโโโโโโ | 920M/1.14G [00:26<00:05, 46.0MB/s]
Downloading StormscopeMTG-low.mdlus: 80%|โโโโโโโโ | 930M/1.14G [00:26<00:05, 47.6MB/s]
Downloading StormscopeMTG-low.mdlus: 80%|โโโโโโโโ | 940M/1.14G [00:26<00:04, 51.6MB/s]
Downloading StormscopeMTG-low.mdlus: 81%|โโโโโโโโโ | 950M/1.14G [00:26<00:03, 57.6MB/s]
Downloading StormscopeMTG-low.mdlus: 82%|โโโโโโโโโ | 960M/1.14G [00:27<00:06, 33.4MB/s]
Downloading StormscopeMTG-low.mdlus: 83%|โโโโโโโโโ | 970M/1.14G [00:27<00:05, 40.1MB/s]
Downloading StormscopeMTG-low.mdlus: 84%|โโโโโโโโโ | 980M/1.14G [00:27<00:04, 43.2MB/s]
Downloading StormscopeMTG-low.mdlus: 85%|โโโโโโโโโ | 990M/1.14G [00:27<00:04, 46.4MB/s]
Downloading StormscopeMTG-low.mdlus: 86%|โโโโโโโโโ | 0.98G/1.14G [00:27<00:03, 49.4MB/s]
Downloading StormscopeMTG-low.mdlus: 86%|โโโโโโโโโ | 0.99G/1.14G [00:28<00:03, 50.7MB/s]
Downloading StormscopeMTG-low.mdlus: 87%|โโโโโโโโโ | 1.00G/1.14G [00:28<00:03, 49.1MB/s]
Downloading StormscopeMTG-low.mdlus: 88%|โโโโโโโโโ | 1.01G/1.14G [00:29<00:04, 29.9MB/s]
Downloading StormscopeMTG-low.mdlus: 89%|โโโโโโโโโ | 1.02G/1.14G [00:29<00:05, 24.2MB/s]
Downloading StormscopeMTG-low.mdlus: 90%|โโโโโโโโโ | 1.03G/1.14G [00:30<00:06, 19.6MB/s]
Downloading StormscopeMTG-low.mdlus: 91%|โโโโโโโโโ | 1.04G/1.14G [00:31<00:06, 17.5MB/s]
Downloading StormscopeMTG-low.mdlus: 92%|โโโโโโโโโโ| 1.04G/1.14G [00:31<00:06, 16.3MB/s]
Downloading StormscopeMTG-low.mdlus: 92%|โโโโโโโโโโ| 1.05G/1.14G [00:32<00:05, 15.8MB/s]
Downloading StormscopeMTG-low.mdlus: 93%|โโโโโโโโโโ| 1.06G/1.14G [00:33<00:06, 13.5MB/s]
Downloading StormscopeMTG-low.mdlus: 94%|โโโโโโโโโโ| 1.07G/1.14G [00:34<00:05, 13.0MB/s]
Downloading StormscopeMTG-low.mdlus: 95%|โโโโโโโโโโ| 1.08G/1.14G [00:35<00:04, 12.6MB/s]
Downloading StormscopeMTG-low.mdlus: 96%|โโโโโโโโโโ| 1.09G/1.14G [00:36<00:04, 12.4MB/s]
Downloading StormscopeMTG-low.mdlus: 97%|โโโโโโโโโโ| 1.10G/1.14G [00:37<00:03, 12.4MB/s]
Downloading StormscopeMTG-low.mdlus: 98%|โโโโโโโโโโ| 1.11G/1.14G [00:37<00:02, 12.5MB/s]
Downloading StormscopeMTG-low.mdlus: 98%|โโโโโโโโโโ| 1.12G/1.14G [00:38<00:01, 12.5MB/s]
Downloading StormscopeMTG-low.mdlus: 99%|โโโโโโโโโโ| 1.13G/1.14G [00:39<00:00, 13.3MB/s]
Downloading StormscopeMTG-low.mdlus: 100%|โโโโโโโโโโ| 1.14G/1.14G [00:39<00:00, 16.7MB/s]
Downloading StormscopeMTG-low.mdlus: 100%|โโโโโโโโโโ| 1.14G/1.14G [00:39<00:00, 30.9MB/s]
Downloading StormscopeMTG-high.mdlus: 0%| | 0.00/1.14G [00:00<?, ?B/s]
Downloading StormscopeMTG-high.mdlus: 1%| | 10.0M/1.14G [00:01<02:43, 7.43MB/s]
Downloading StormscopeMTG-high.mdlus: 2%|โ | 20.0M/1.14G [00:01<01:20, 15.0MB/s]
Downloading StormscopeMTG-high.mdlus: 3%|โ | 30.0M/1.14G [00:01<00:53, 22.3MB/s]
Downloading StormscopeMTG-high.mdlus: 3%|โ | 40.0M/1.14G [00:02<00:42, 27.9MB/s]
Downloading StormscopeMTG-high.mdlus: 4%|โ | 50.0M/1.14G [00:02<00:34, 34.4MB/s]
Downloading StormscopeMTG-high.mdlus: 5%|โ | 60.0M/1.14G [00:02<00:31, 37.5MB/s]
Downloading StormscopeMTG-high.mdlus: 6%|โ | 70.0M/1.14G [00:03<00:43, 26.6MB/s]
Downloading StormscopeMTG-high.mdlus: 7%|โ | 80.0M/1.14G [00:03<00:33, 33.9MB/s]
Downloading StormscopeMTG-high.mdlus: 8%|โ | 90.0M/1.14G [00:03<00:28, 39.6MB/s]
Downloading StormscopeMTG-high.mdlus: 9%|โ | 100M/1.14G [00:03<00:24, 45.1MB/s]
Downloading StormscopeMTG-high.mdlus: 9%|โ | 110M/1.14G [00:03<00:23, 46.2MB/s]
Downloading StormscopeMTG-high.mdlus: 10%|โ | 120M/1.14G [00:03<00:20, 54.2MB/s]
Downloading StormscopeMTG-high.mdlus: 11%|โ | 130M/1.14G [00:04<00:27, 39.2MB/s]
Downloading StormscopeMTG-high.mdlus: 12%|โโ | 140M/1.14G [00:04<00:23, 45.0MB/s]
Downloading StormscopeMTG-high.mdlus: 13%|โโ | 150M/1.14G [00:04<00:22, 47.7MB/s]
Downloading StormscopeMTG-high.mdlus: 14%|โโ | 160M/1.14G [00:04<00:21, 49.3MB/s]
Downloading StormscopeMTG-high.mdlus: 15%|โโ | 170M/1.14G [00:04<00:18, 55.8MB/s]
Downloading StormscopeMTG-high.mdlus: 15%|โโ | 180M/1.14G [00:05<00:18, 54.7MB/s]
Downloading StormscopeMTG-high.mdlus: 16%|โโ | 190M/1.14G [00:05<00:17, 57.4MB/s]
Downloading StormscopeMTG-high.mdlus: 17%|โโ | 200M/1.14G [00:06<00:51, 19.8MB/s]
Downloading StormscopeMTG-high.mdlus: 18%|โโ | 210M/1.14G [00:06<00:41, 24.4MB/s]
Downloading StormscopeMTG-high.mdlus: 19%|โโ | 220M/1.14G [00:06<00:31, 31.1MB/s]
Downloading StormscopeMTG-high.mdlus: 21%|โโ | 240M/1.14G [00:07<00:20, 46.9MB/s]
Downloading StormscopeMTG-high.mdlus: 22%|โโโ | 260M/1.14G [00:07<00:17, 54.3MB/s]
Downloading StormscopeMTG-high.mdlus: 23%|โโโ | 270M/1.14G [00:07<00:16, 57.8MB/s]
Downloading StormscopeMTG-high.mdlus: 24%|โโโ | 280M/1.14G [00:07<00:15, 60.4MB/s]
Downloading StormscopeMTG-high.mdlus: 25%|โโโ | 290M/1.14G [00:07<00:15, 57.9MB/s]
Downloading StormscopeMTG-high.mdlus: 26%|โโโ | 300M/1.14G [00:08<00:16, 56.2MB/s]
Downloading StormscopeMTG-high.mdlus: 27%|โโโ | 310M/1.14G [00:08<00:15, 57.8MB/s]
Downloading StormscopeMTG-high.mdlus: 27%|โโโ | 320M/1.14G [00:08<00:20, 42.5MB/s]
Downloading StormscopeMTG-high.mdlus: 28%|โโโ | 330M/1.14G [00:08<00:19, 45.6MB/s]
Downloading StormscopeMTG-high.mdlus: 29%|โโโ | 340M/1.14G [00:09<00:16, 51.5MB/s]
Downloading StormscopeMTG-high.mdlus: 30%|โโโ | 350M/1.14G [00:09<00:16, 53.4MB/s]
Downloading StormscopeMTG-high.mdlus: 31%|โโโ | 360M/1.14G [00:09<00:16, 51.6MB/s]
Downloading StormscopeMTG-high.mdlus: 32%|โโโโ | 370M/1.14G [00:09<00:14, 58.3MB/s]
Downloading StormscopeMTG-high.mdlus: 33%|โโโโ | 380M/1.14G [00:09<00:14, 55.5MB/s]
Downloading StormscopeMTG-high.mdlus: 33%|โโโโ | 390M/1.14G [00:10<00:20, 40.7MB/s]
Downloading StormscopeMTG-high.mdlus: 34%|โโโโ | 400M/1.14G [00:10<00:18, 44.2MB/s]
Downloading StormscopeMTG-high.mdlus: 35%|โโโโ | 410M/1.14G [00:10<00:17, 46.5MB/s]
Downloading StormscopeMTG-high.mdlus: 36%|โโโโ | 420M/1.14G [00:10<00:16, 47.2MB/s]
Downloading StormscopeMTG-high.mdlus: 37%|โโโโ | 430M/1.14G [00:11<00:16, 47.5MB/s]
Downloading StormscopeMTG-high.mdlus: 38%|โโโโ | 440M/1.14G [00:11<00:15, 49.3MB/s]
Downloading StormscopeMTG-high.mdlus: 39%|โโโโ | 450M/1.14G [00:11<00:20, 36.8MB/s]
Downloading StormscopeMTG-high.mdlus: 39%|โโโโ | 460M/1.14G [00:11<00:17, 42.3MB/s]
Downloading StormscopeMTG-high.mdlus: 40%|โโโโ | 470M/1.14G [00:12<00:15, 47.9MB/s]
Downloading StormscopeMTG-high.mdlus: 41%|โโโโ | 480M/1.14G [00:12<00:14, 50.8MB/s]
Downloading StormscopeMTG-high.mdlus: 42%|โโโโโ | 490M/1.14G [00:12<00:13, 52.6MB/s]
Downloading StormscopeMTG-high.mdlus: 43%|โโโโโ | 500M/1.14G [00:12<00:13, 53.7MB/s]
Downloading StormscopeMTG-high.mdlus: 44%|โโโโโ | 510M/1.14G [00:12<00:12, 55.5MB/s]
Downloading StormscopeMTG-high.mdlus: 45%|โโโโโ | 520M/1.14G [00:13<00:16, 40.7MB/s]
Downloading StormscopeMTG-high.mdlus: 45%|โโโโโ | 530M/1.14G [00:13<00:14, 46.4MB/s]
Downloading StormscopeMTG-high.mdlus: 46%|โโโโโ | 540M/1.14G [00:13<00:13, 49.2MB/s]
Downloading StormscopeMTG-high.mdlus: 47%|โโโโโ | 550M/1.14G [00:13<00:12, 51.2MB/s]
Downloading StormscopeMTG-high.mdlus: 48%|โโโโโ | 560M/1.14G [00:13<00:11, 53.7MB/s]
Downloading StormscopeMTG-high.mdlus: 49%|โโโโโ | 570M/1.14G [00:14<00:11, 55.9MB/s]
Downloading StormscopeMTG-high.mdlus: 50%|โโโโโ | 580M/1.14G [00:14<00:15, 40.0MB/s]
Downloading StormscopeMTG-high.mdlus: 50%|โโโโโ | 590M/1.14G [00:14<00:13, 46.0MB/s]
Downloading StormscopeMTG-high.mdlus: 51%|โโโโโโ | 600M/1.14G [00:14<00:12, 48.6MB/s]
Downloading StormscopeMTG-high.mdlus: 52%|โโโโโโ | 610M/1.14G [00:14<00:11, 51.6MB/s]
Downloading StormscopeMTG-high.mdlus: 53%|โโโโโโ | 620M/1.14G [00:15<00:10, 55.2MB/s]
Downloading StormscopeMTG-high.mdlus: 54%|โโโโโโ | 630M/1.14G [00:15<00:10, 55.3MB/s]
Downloading StormscopeMTG-high.mdlus: 55%|โโโโโโ | 640M/1.14G [00:15<00:13, 41.0MB/s]
Downloading StormscopeMTG-high.mdlus: 56%|โโโโโโ | 650M/1.14G [00:15<00:12, 45.2MB/s]
Downloading StormscopeMTG-high.mdlus: 56%|โโโโโโ | 660M/1.14G [00:16<00:10, 50.5MB/s]
Downloading StormscopeMTG-high.mdlus: 57%|โโโโโโ | 670M/1.14G [00:16<00:10, 49.7MB/s]
Downloading StormscopeMTG-high.mdlus: 58%|โโโโโโ | 680M/1.14G [00:16<00:09, 51.6MB/s]
Downloading StormscopeMTG-high.mdlus: 59%|โโโโโโ | 690M/1.14G [00:16<00:09, 54.7MB/s]
Downloading StormscopeMTG-high.mdlus: 60%|โโโโโโ | 700M/1.14G [00:16<00:08, 57.5MB/s]
Downloading StormscopeMTG-high.mdlus: 61%|โโโโโโ | 710M/1.14G [00:17<00:12, 40.0MB/s]
Downloading StormscopeMTG-high.mdlus: 62%|โโโโโโโ | 720M/1.14G [00:17<00:10, 44.5MB/s]
Downloading StormscopeMTG-high.mdlus: 62%|โโโโโโโ | 730M/1.14G [00:17<00:09, 46.1MB/s]
Downloading StormscopeMTG-high.mdlus: 63%|โโโโโโโ | 740M/1.14G [00:17<00:08, 52.3MB/s]
Downloading StormscopeMTG-high.mdlus: 64%|โโโโโโโ | 750M/1.14G [00:17<00:08, 53.7MB/s]
Downloading StormscopeMTG-high.mdlus: 65%|โโโโโโโ | 760M/1.14G [00:18<00:07, 55.3MB/s]
Downloading StormscopeMTG-high.mdlus: 66%|โโโโโโโ | 770M/1.14G [00:18<00:10, 39.3MB/s]
Downloading StormscopeMTG-high.mdlus: 67%|โโโโโโโ | 780M/1.14G [00:18<00:09, 44.8MB/s]
Downloading StormscopeMTG-high.mdlus: 68%|โโโโโโโ | 790M/1.14G [00:18<00:08, 48.8MB/s]
Downloading StormscopeMTG-high.mdlus: 68%|โโโโโโโ | 800M/1.14G [00:19<00:07, 52.3MB/s]
Downloading StormscopeMTG-high.mdlus: 69%|โโโโโโโ | 810M/1.14G [00:19<00:06, 54.6MB/s]
Downloading StormscopeMTG-high.mdlus: 70%|โโโโโโโ | 820M/1.14G [00:19<00:06, 56.3MB/s]
Downloading StormscopeMTG-high.mdlus: 71%|โโโโโโโ | 830M/1.14G [00:19<00:06, 56.9MB/s]
Downloading StormscopeMTG-high.mdlus: 72%|โโโโโโโโ | 840M/1.14G [00:20<00:13, 24.6MB/s]
Downloading StormscopeMTG-high.mdlus: 73%|โโโโโโโโ | 850M/1.14G [00:20<00:11, 29.7MB/s]
Downloading StormscopeMTG-high.mdlus: 74%|โโโโโโโโ | 860M/1.14G [00:20<00:08, 36.0MB/s]
Downloading StormscopeMTG-high.mdlus: 74%|โโโโโโโโ | 870M/1.14G [00:21<00:08, 37.4MB/s]
Downloading StormscopeMTG-high.mdlus: 75%|โโโโโโโโ | 880M/1.14G [00:21<00:07, 42.8MB/s]
Downloading StormscopeMTG-high.mdlus: 76%|โโโโโโโโ | 890M/1.14G [00:21<00:07, 37.7MB/s]
Downloading StormscopeMTG-high.mdlus: 77%|โโโโโโโโ | 900M/1.14G [00:22<00:12, 22.5MB/s]
Downloading StormscopeMTG-high.mdlus: 78%|โโโโโโโโ | 910M/1.14G [00:22<00:09, 28.6MB/s]
Downloading StormscopeMTG-high.mdlus: 79%|โโโโโโโโ | 920M/1.14G [00:22<00:07, 34.3MB/s]
Downloading StormscopeMTG-high.mdlus: 80%|โโโโโโโโ | 930M/1.14G [00:23<00:06, 37.7MB/s]
Downloading StormscopeMTG-high.mdlus: 80%|โโโโโโโโ | 940M/1.14G [00:23<00:05, 45.0MB/s]
Downloading StormscopeMTG-high.mdlus: 81%|โโโโโโโโโ | 950M/1.14G [00:23<00:04, 49.3MB/s]
Downloading StormscopeMTG-high.mdlus: 82%|โโโโโโโโโ | 960M/1.14G [00:23<00:05, 37.8MB/s]
Downloading StormscopeMTG-high.mdlus: 83%|โโโโโโโโโ | 970M/1.14G [00:23<00:04, 42.0MB/s]
Downloading StormscopeMTG-high.mdlus: 84%|โโโโโโโโโ | 980M/1.14G [00:24<00:04, 49.0MB/s]
Downloading StormscopeMTG-high.mdlus: 85%|โโโโโโโโโ | 990M/1.14G [00:24<00:03, 47.8MB/s]
Downloading StormscopeMTG-high.mdlus: 86%|โโโโโโโโโ | 0.98G/1.14G [00:24<00:03, 49.3MB/s]
Downloading StormscopeMTG-high.mdlus: 86%|โโโโโโโโโ | 0.99G/1.14G [00:24<00:03, 54.5MB/s]
Downloading StormscopeMTG-high.mdlus: 87%|โโโโโโโโโ | 1.00G/1.14G [00:24<00:02, 52.0MB/s]
Downloading StormscopeMTG-high.mdlus: 88%|โโโโโโโโโ | 1.01G/1.14G [00:25<00:03, 39.0MB/s]
Downloading StormscopeMTG-high.mdlus: 89%|โโโโโโโโโ | 1.02G/1.14G [00:25<00:03, 44.3MB/s]
Downloading StormscopeMTG-high.mdlus: 90%|โโโโโโโโโ | 1.03G/1.14G [00:25<00:02, 45.6MB/s]
Downloading StormscopeMTG-high.mdlus: 91%|โโโโโโโโโ | 1.04G/1.14G [00:25<00:02, 52.1MB/s]
Downloading StormscopeMTG-high.mdlus: 92%|โโโโโโโโโโ| 1.04G/1.14G [00:26<00:01, 53.8MB/s]
Downloading StormscopeMTG-high.mdlus: 92%|โโโโโโโโโโ| 1.05G/1.14G [00:26<00:01, 59.6MB/s]
Downloading StormscopeMTG-high.mdlus: 93%|โโโโโโโโโโ| 1.06G/1.14G [00:26<00:02, 37.8MB/s]
Downloading StormscopeMTG-high.mdlus: 94%|โโโโโโโโโโ| 1.07G/1.14G [00:26<00:01, 40.7MB/s]
Downloading StormscopeMTG-high.mdlus: 95%|โโโโโโโโโโ| 1.08G/1.14G [00:27<00:01, 43.6MB/s]
Downloading StormscopeMTG-high.mdlus: 96%|โโโโโโโโโโ| 1.09G/1.14G [00:27<00:01, 47.7MB/s]
Downloading StormscopeMTG-high.mdlus: 97%|โโโโโโโโโโ| 1.10G/1.14G [00:27<00:00, 50.9MB/s]
Downloading StormscopeMTG-high.mdlus: 98%|โโโโโโโโโโ| 1.11G/1.14G [00:27<00:00, 50.1MB/s]
Downloading StormscopeMTG-high.mdlus: 98%|โโโโโโโโโโ| 1.12G/1.14G [00:28<00:00, 35.7MB/s]
Downloading StormscopeMTG-high.mdlus: 99%|โโโโโโโโโโ| 1.13G/1.14G [00:28<00:00, 30.6MB/s]
Downloading StormscopeMTG-high.mdlus: 100%|โโโโโโโโโโ| 1.14G/1.14G [00:28<00:00, 34.9MB/s]
Downloading StormscopeMTG-high.mdlus: 100%|โโโโโโโโโโ| 1.14G/1.14G [00:28<00:00, 42.6MB/s]
Downloading metadata.nc: 0%| | 0.00/32.2M [00:00<?, ?B/s]
Downloading metadata.nc: 31%|โโโ | 10.0M/32.2M [00:00<00:02, 11.0MB/s]
Downloading metadata.nc: 62%|โโโโโโโ | 20.0M/32.2M [00:01<00:00, 20.8MB/s]
Downloading metadata.nc: 93%|โโโโโโโโโโ| 30.0M/32.2M [00:01<00:00, 29.7MB/s]
Downloading metadata.nc: 100%|โโโโโโโโโโ| 32.2M/32.2M [00:01<00:00, 23.5MB/s]Set Up Data Sources¶
MeteosatFCI is configured with pixel_bbox matching the model's
domain (Model_FCI_BBox) so that the returned y/x scan-angle
coordinates align with what the model expects.
Meteosat FCI visible and NIR channels are provided by the EUMETSAT data store at 1 km resolution while IR channels are 2 km. The StormScope MTG model uses the 2 km grid for all channels, so we need to pull data from both 1 km and 2 km sources and do a minimal regrid on the visible and NIR channels.
Here we will set up data sources for both grid resolutions. The 1 km grid is exactly 2 times the pixels of the 2 km grid, so we get the 1 km bounding box by doubling the 2 km bounding box.
bbox_2km = StormScopeMeteosatEU.Model_FCI_BBox
FCI_BBox = {"2km": bbox_2km}
FCI_BBox["1km"] = (
(2 * bbox_2km[0][0], 2 * bbox_2km[0][1]),
(2 * bbox_2km[1][0], 2 * bbox_2km[1][1]),
)
fci = {
res: MeteosatFCI(resolution=res, pixel_bbox=bbox)
for (res, bbox) in FCI_BBox.items()
}
Fetch Initial Condition¶
We fetch initial window of 6 consecutive FCI frames ending at
the chosen analysis time. fetch_data calls the data source at
start_time + lead_time for each lead-time offset defined by the model
([-50 min, -40 min, ..., 0 min] for a 6-frame window).
StormScope MTG uses the 2 km grid for all channels, so we use
StormScopeMeteosatEU.combine_1km_2km_inputs to resize the channels
retrieved from the 1 km data source.
# Start time; replace with any time for which MTG-I1 FCI data is available.
# StormScopeMeteosatEU was trained on November 2024 - May 2026 data; start times
# should generally be outside that period.
start_time = np.datetime64(datetime(2026, 6, 30, 12, 0, 0, tzinfo=timezone.utc))
in_coords = model.input_coords()
variables = in_coords["variable"]
with torch.no_grad():
x_res = {}
for res in ["2km", "1km"]:
available_vars = fci[res].available_variables()
if res == "1km":
# use 2km version if variable available in both 1km and 2km
available_vars -= fci["2km"].available_variables()
variables_res = [var for var in variables if var in available_vars]
x_res[res] = fetch_data(
fci[res],
time=np.array([start_time]),
variable=variables_res,
lead_time=in_coords["lead_time"],
device=device,
)
# 2x downsample 1km data to common 2km grid
x, coords = StormScopeMeteosatEU.combine_1km_2km_inputs(
*x_res["1km"], *x_res["2km"]
)
del x_res
# ensure data is on model grid (reorders variables if needed)
x, coords = map_coords(x, coords, in_coords)
Console output65 lines
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
2026-09-03 11:34:18.421 | INFO | earth2studio.data.meteosat_fci:_fetch_product:629 - Downloading MTG FCI product: W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--x-x---x_C_EUMT_20260630111317_IDPFI_OPE_20260630111007_20260630111935_N__O_0068_0000
Downloading MTG products: 0%| | 0/1 [00:06<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [02:01<00:00, 121.87s/it]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [02:01<00:00, 121.87s/it]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
2026-09-03 11:36:25.505 | INFO | earth2studio.data.meteosat_fci:_fetch_product:629 - Downloading MTG FCI product: W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--x-x---x_C_EUMT_20260630112312_IDPFI_OPE_20260630112007_20260630112939_N__O_0069_0000
Downloading MTG products: 0%| | 0/1 [00:06<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [02:02<00:00, 122.99s/it]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [02:02<00:00, 122.99s/it]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
2026-09-03 11:38:31.280 | INFO | earth2studio.data.meteosat_fci:_fetch_product:629 - Downloading MTG FCI product: W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--x-x---x_C_EUMT_20260630113315_IDPFI_OPE_20260630113007_20260630113939_N__O_0070_0000
Downloading MTG products: 0%| | 0/1 [00:05<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [01:18<00:00, 78.60s/it]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [01:18<00:00, 78.60s/it]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
2026-09-03 11:39:52.150 | INFO | earth2studio.data.meteosat_fci:_fetch_product:629 - Downloading MTG FCI product: W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--x-x---x_C_EUMT_20260630114312_IDPFI_OPE_20260630114007_20260630114939_N__O_0071_0000
Downloading MTG products: 0%| | 0/1 [00:04<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [01:26<00:00, 86.07s/it]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [01:26<00:00, 86.07s/it]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
2026-09-03 11:41:21.551 | INFO | earth2studio.data.meteosat_fci:_fetch_product:629 - Downloading MTG FCI product: W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--x-x---x_C_EUMT_20260630115316_IDPFI_OPE_20260630115007_20260630115939_N__O_0072_0000
Downloading MTG products: 0%| | 0/1 [00:04<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [01:18<00:00, 78.47s/it]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [01:18<00:00, 78.47s/it]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
2026-09-03 11:42:47.390 | INFO | earth2studio.data.meteosat_fci:_fetch_product:629 - Downloading MTG FCI product: W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--x-x---x_C_EUMT_20260630120316_IDPFI_OPE_20260630120007_20260630120939_N__O_0073_0000
Downloading MTG products: 0%| | 0/1 [00:07<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [02:12<00:00, 132.69s/it]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [02:12<00:00, 132.71s/it]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [00:00<00:00, 672.92it/s]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [00:00<00:00, 55.54it/s]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [00:00<00:00, 53.65it/s]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [00:00<00:00, 46.49it/s]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [00:00<00:00, 44.95it/s]
Downloading MTG products: 0%| | 0/1 [00:00<?, ?it/s]
Downloading MTG products: 100%|โโโโโโโโโโ| 1/1 [00:00<00:00, 44.28it/s]Add Ensemble Dimension¶
The model expects input of shape (ensemble, time, lead_time, variable, y, x).
Up to GPU memory limits, ensemble_size can be increased to produce multiple
independent ensemble members in a single forward pass.
ensemble_size = 1
x = x.expand(ensemble_size, -1, -1, -1, -1, -1)
coords["ensemble"] = np.arange(ensemble_size)
coords.move_to_end("ensemble", last=False)
Execute the Nowcast¶
create_iterator handles the autoregressive rollout for us: the first
yielded value is the (unchanged) initial condition, and each subsequent
value advances the prediction by one 10-minute interval.
n_steps = 12 # 2 hours of 10-minute forecast steps
for step, (x_pred, coords_pred) in enumerate(
tqdm(model.create_iterator(x, coords), total=n_steps + 1)
):
if step == n_steps:
break
Console output13 lines
0%| | 0/13 [00:00<?, ?it/s]
15%|โโ | 2/13 [00:44<04:03, 22.16s/it]
23%|โโโ | 3/13 [01:13<04:11, 25.18s/it]
31%|โโโ | 4/13 [01:52<04:31, 30.21s/it]
38%|โโโโ | 5/13 [02:44<05:01, 37.71s/it]
46%|โโโโโ | 6/13 [03:32<04:49, 41.35s/it]
54%|โโโโโโ | 7/13 [04:28<04:36, 46.05s/it]
62%|โโโโโโโ | 8/13 [05:24<04:05, 49.16s/it]
69%|โโโโโโโ | 9/13 [06:20<03:25, 51.33s/it]
77%|โโโโโโโโ | 10/13 [07:19<02:40, 53.56s/it]
85%|โโโโโโโโโ | 11/13 [08:12<01:46, 53.42s/it]
92%|โโโโโโโโโโ| 12/13 [09:09<00:54, 54.42s/it]
92%|โโโโโโโโโโ| 12/13 [10:08<00:50, 50.69s/it]Post Processing¶
Plot the final predicted FCI frame as a true-color RGB composite (VIS 0.6 /
0.5 / 0.4 ยตm) in geostationary projection. Off-Earth pixels are already set
to NaN by denormalize.
rgb_channels = ["fci06vis", "fci05vis", "fci04vis"]
ch_idx = [list(model.variables).index(ch) for ch in rgb_channels]
# x_pred has shape (batch, time, 1, variable, y, x)
# here we approximately replicate EUMETSAT's recipe for "true-colour" RGB
rgb = (x_pred[0, 0, 0, ch_idx] / 24.0).clamp(min=0, max=1) * 255
rgb = rgb.permute(1, 2, 0).cpu().numpy()
rgb = np.interp(rgb, [0, 30, 60, 120, 190, 255], [0, 110, 160, 210, 240, 255]) / 255.0
proj = ccrs.Geostationary(
central_longitude=0.0,
satellite_height=PERSPECTIVE_POINT_HEIGHT,
globe=ccrs.Globe(semimajor_axis=SEMI_MAJOR_AXIS, semiminor_axis=SEMI_MINOR_AXIS),
)
extent = MeteosatFCI.projection_extent(resolution="2km", pixel_bbox=bbox_2km)
aspect = (extent[1] - extent[0]) / (extent[3] - extent[2])
fig_height = 8
fig = plt.figure(figsize=(fig_height * aspect, fig_height))
ax = fig.add_subplot(1, 1, 1, projection=proj)
ax.set_xlim(extent[0], extent[1])
ax.set_ylim(extent[2], extent[3])
ax.coastlines(color="white", linewidth=0.8)
im = ax.imshow(rgb, transform=proj, extent=extent, origin="lower")
valid_time = coords_pred["time"][0]
valid_time = datetime.fromisoformat(str(valid_time)).strftime("%Y-%m-%d %H:%M")
lead_min = coords_pred["lead_time"][0].astype("timedelta64[m]").item()
lead_min = int(lead_min / np.timedelta64(1, "m"))
ax.set_title(
f"StormScopeMeteosatEU โ RGB\n" f"Valid {valid_time} UTC (+{lead_min} min)"
)
fig.tight_layout()
fig.savefig("outputs/04_stormcast_meteosat_example.png", dpi=150)
print("Saved outputs/04_stormcast_meteosat_example.png")
Console output1 line
Saved outputs/04_stormcast_meteosat_example.png