EarthCARE Validation during ORCESTRA#
EarthCARE regularly flew over the measurement area, allowing each of the aircraft to fly underneath. The data from the underflights are used to validate the EarthCARE measurements. This page shows how to compare EarthCARE and HALO tracks.
Note
In this example, we use the EarthCARE orbit predictions as used for flight planning during ORCESTRA. With EarthCARE data being public, other ways to obtain the actual (past) orbits should be available at some point.
First, we load the track data. EarthCARE tracks are available for different regions of interest (roi
) and forecast days.
You can check sattracks.orcestra-campaign.org for an overview of all available forecasts.
from datetime import date
import cartopy.crs as ccrs
import cartopy.feature as cf
import matplotlib.pyplot as plt
import xarray as xr
from orcestra import bco, sat
# Get EartchCare track
date = date(2024, 8, 25)
ec_track = sat.SattrackLoader(
"EARTHCARE",
forecast_day=date,
kind="PRE",
roi="CAPE_VERDE",
).get_track_for_day(date)
EarthCare tracks include the ascending and descending orbits. For the plot, we select only the afternoon overpass that coincided with our flight.
ec_track = ec_track.sel(time=slice(f"{date} 12:00", f"{date} 23:59"))
Next, we will load the HALO position/attidue data for the corresponding flight. For plotting reasons, the coarsen the 100Hz data into 1min-averages.
# root = "ipns://latest.orcestra-campaign.org"
root = "ipfs://QmRmpJDydygnTkyBjYKgpjjzjnv1hfRiwUmB2uzkiCxZpZ"
halo_track = xr.open_dataset(
f"{root}/products/HALO/position_attitude/HALO-{date:%Y%m%d}a.zarr",
engine="zarr",
)
halo_track = halo_track.coarsen(time=6000, boundary="pad").mean("time") # 1min-average
Now we can plot the tracks:
fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={"projection": ccrs.PlateCarree()})
ax.set_extent([-50, -10, -5, 25])
ax.add_feature(cf.COASTLINE)
ax.add_feature(cf.LAND)
ax.add_feature(cf.OCEAN)
ax.plot(halo_track.lon, halo_track.lat, label="HALO", lw=3, c="tab:orange", transform=ccrs.Geodetic())
ax.plot(ec_track.lon, ec_track.lat, label="EarthCare", lw=1.5, c="tab:green", transform=ccrs.Geodetic())
ax.legend();
/home/runner/miniconda3/envs/orcestra_book/lib/python3.12/site-packages/cartopy/io/__init__.py:241: DownloadWarning: Downloading: https://naturalearth.s3.amazonaws.com/50m_physical/ne_50m_land.zip
warnings.warn(f'Downloading: {url}', DownloadWarning)
/home/runner/miniconda3/envs/orcestra_book/lib/python3.12/site-packages/cartopy/io/__init__.py:241: DownloadWarning: Downloading: https://naturalearth.s3.amazonaws.com/50m_physical/ne_50m_ocean.zip
warnings.warn(f'Downloading: {url}', DownloadWarning)
/home/runner/miniconda3/envs/orcestra_book/lib/python3.12/site-packages/cartopy/io/__init__.py:241: DownloadWarning: Downloading: https://naturalearth.s3.amazonaws.com/50m_physical/ne_50m_coastline.zip
warnings.warn(f'Downloading: {url}', DownloadWarning)