Commit 3e2fb4ee authored by Julia Wagemann's avatar Julia Wagemann
Browse files

Dust workshop - Week 1 material

parent c5034539
%% Cell type:markdown id: tags:
<img src='./img/dust_banner.png' alt='Training school and workshop on dust' align='center' width='100%'></img>
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
#### Dust 2021 | 9-12 + 15-17 + 22-24 November 2021
%% Cell type:markdown id: tags:
# Training School and Workshop on Dust Aerosol Detection and Monitoring
%% Cell type:markdown id: tags:
Jointly organized by [EUMETSAT]( and the [WMO SDS-WAS Regional Center]( (which is managed by the [Barcelona Supercomputing Center BSC]( and the [Spanish Meteorological State Agency AEMET]( with the support of the [Copernicus]( and [ACTRIS]( programmes.
%% Cell type:markdown id: tags:
The course is split in two parts:
* **Phase 1: Introduction and data discovery**
* 1-hour webinars about the basics of aerosol and dust, principles of observations, modelling and forecasting
* 1-hour practical data discovery sessions learning about the key satellite, ground-based and model products for dust forecasting and monitoring
* **Phase 2: Practical Workshop (by application only)**
* Practical case studies and exercises
* Perform an analysis with multiple datasets on a real world dust event
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## Featured data
%% Cell type:markdown id: tags:
#### Satellite data
* [Sentinel-5P TROPOMI Level 2 Ultraviolet Aerosol Index](
* [Polar Multi-Sensor Aerosol Optical Properties (PMAp) Product](
* [AC SAF GOME-2 Level 3 Absorbing Aerosol Index](
* [Meteosat Second Generationg L1 true color and dust RGB](
* [MODIS 10km Level 2 Aerosol product](
* [MODIS L1B true color and dust RGB](
%% Cell type:markdown id: tags:
### Observation data
* [AERONET - AErosol RObotic NETwork](
* [European Aerosol Research Lidar Network (EARLINET) - Backscatter profiles](
* [European Environment Agency Air Quality Data](
%% Cell type:markdown id: tags:
### Model-based data
* [WMO SDS-WAS Dust Forecast - MONARCH](
* [CAMS Global atmospheric composition forecasts](!/dataset/cams-global-atmospheric-composition-forecasts?tab=overview)
* [CAMS European Air Quality Forecasts](!/dataset/cams-europe-air-quality-forecasts?tab=overview)
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## Notebook overview
#### Day 2: Introduction to satellite data
* [11 - Sentinel-5P TROPOMI Ultraviolet Aerosol Index Level 2](./01_satellite-based_data/11_Sentinel-5P_TROPOMI_AI_L2_load_browse.ipynb)
* [12 - Polar Multi-Sensor Aerosol Optical Properties (PMAp) Product - Aerosol Optical Depth](./01_satellite-based_data/12_PMAp_AOD_L2_load_browse.ipynb)
* [13 - Metop-ABC GOME-2 Absorbing Aerosol Index Level 3](./01_satellite-based_data/13_Metop-ABC_GOME-2_AAI_L3_load_browse.ipynb)
* [14 - Meteosat Second Generation SEVIRI Level 1 true colour and dust RGB](./01_satellite-based_data/14_MSG_dust_product_L1_load_browse.ipynb)
* [15 - MODIS Level 2 10 km aerosol product](./01_satellite-based_data/15_MODIS_10km_aerosol_product_L2_load_browse.ipynb)
* [16 - MODIS Level 1B true color and dust RGB](./01_satellite-based_data/16_MODIS_L1B_RGB_load_browse.ipynb)
#### Day 3: Introduction to ground-based observations
* [21 - AERONET - AErosol RObotic NETwork](./02_ground-based_observations/21_AERONET.ipynb)
* [22 - European Aerosol Research Lidar Network (EARLINET) - Backscatter profiles](./02_ground-based_observations/22_EARLINET.ipynb)
* [23 - European Environment Agency Air Quality Data](./02_ground-based_observations/23_EEA_Air_Quality.ipynb)
#### Day 4: Introduction to model-based data
* [31 - WMO SDS-WAS - Dust Forecast - MONARCH](./03_model-based_data/31_SDS-WAS_MONARCH_dust_forecast.ipynb)
* [32 - CAMS global atmospheric composition forecast - Dust Aerosol Optical Depth](./03_model-based_data/32_CAMS_global_forecast_duaod_load_browse.ipynb)
* [33 - CAMS European Air Quality Forecasts - Dust concentration](./03_model-based_data/33_CAMS_European_air_quality_forecast_dust_concentration_load_browse.ipynb)
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
**NOTE:** Throughout the course, general functions to `load`, `re-shape`, `process` and `visualize` the datasets are defined. These functions are re-used when applicable. The [functions notebook](./functions.ipynb) gives you an overview of useful functions defined.
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## Learning outcomes
%% Cell type:markdown id: tags:
The course is designed for `beginners and medium-level users`, who have basic Python knowledge.
After the course, you should have:
* an idea about **satellite and assimilated data products and observation data for dust monitoring**,
* knowledge about the most useful **Python packages** to handle, process and visualise atmospheric composition data
* an idea about how the **data can help to detect and monitor dust events**
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## Access to the training platform
%% Cell type:markdown id: tags:
The course material is made available on a JupyterLab training platform, a pre-defined environment that gives learners direct access to the data and Python packages required for following the course.
The `JupyterLab` can be accessed as follows:
%% Cell type:markdown id: tags:
* Web address: [](
* Create an account: [](
* Log into the `JupyterLab` with your account created.
%% Cell type:markdown id: tags:
**NOTE**: Access will be granted to the first 100 registrations on a first come, first serve basis.
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
<img src='../../img/copernicus_logo.png' alt='Logo EU Copernicus' align='right' width='20%'><br><br><br><br>
<p style="text-align:right;">This project is licensed under the <a href="./LICENSE">MIT License</a> and is developed under a Copernicus contract.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2012-2019 Satpy developers
# This file is part of satpy.
# satpy is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
# satpy is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with
# satpy. If not, see <>.
"""Convert human coordinates (lon and lat) to an area definition.
Here is a usage example.
python france stere 42.0 51.5 -5.5 8.0 1.5
The arguments are "name proj min_lat max_lat min_lon max_lon resolution(km)".
The command above yelds the following result.
### +proj=stere +lat_0=46.75 +lon_0=1.25 +ellps=WGS84
description: france
proj: stere
ellps: WGS84
lat_0: 46.75
lon_0: 1.25
height: 703
width: 746
lower_left_xy: [-559750.381098, -505020.675776]
upper_right_xy: [559750.381098, 549517.351948]
The first commented line is just a sum-up. The value of "description" can be changed to any descriptive text.
Such a custom yaml configuration can be profitably saved in a local areas.yaml configuration file that won't be
overridden by future updates of SatPy package. For that purpose the local processing script may have suitable
lines as reported below.
# set PPP_CONFIG_DIR for custom composites
import os
os.environ['PPP_CONFIG_DIR'] = '/my_local_path/for_satpy_configuration'
As a further functionality this script may give a quick display of the defined area,
provided the path for the GSHHG library is supplied via the "-s" option
and the modules PyCoast, Pillow and AggDraw have been installed.
python france stere 42.0 51.5 -5.5 8.0 1.5 -s /path/for/gshhs/library
The command above would first print the seen area definition and then launch a casual representation
of the area relying on the information about borders involved.
import argparse
import sys
from pyproj import Proj
if __name__ == '__main__':
parser = argparse.ArgumentParser()
help="The name of the area.")
help="The projection to use. Use proj.4 names, like 'stere', 'merc'...")
help="The the latitude of the bottom of the area",
help="The the latitude of the top of the area",
help="The the longitude of the left of the area",
help="The the longitude of the right of the area",
help="The resolution of the area (in km)",
parser.add_argument("-s", "--shapes",
help="Show a preview of the area using the coastlines in this directory")
args = parser.parse_args()
name =
proj = args.proj
left = args.min_lon
right = args.max_lon
up = args.min_lat
down = args.max_lat
res = args.resolution * 1000
lat_0 = (up + down) / 2
lon_0 = (right + left) / 2
p = Proj(proj=proj, lat_0=lat_0, lon_0=lon_0, ellps="WGS84")
left_ex1, up_ex1 = p(left, up)
right_ex1, up_ex2 = p(right, up)
left_ex2, down_ex1 = p(left, down)
right_ex2, down_ex2 = p(right, down)
left_ex3, dummy = p(left, lat_0)
right_ex3, dummy = p(right, lat_0)
area_extent = (min(left_ex1, left_ex2, left_ex3),
min(up_ex1, up_ex2),
max(right_ex1, right_ex2, right_ex3),
max(down_ex1, down_ex2))
xsize = int(round((area_extent[2] - area_extent[0]) / res))
ysize = int(round((area_extent[3] - area_extent[1]) / res))
proj4_string = "+" + \
" +".join(("proj=" + proj + ",lat_0=" + str(lat_0) +
",lon_0=" + str(lon_0) + ",ellps=WGS84").split(","))
print('### ' + proj4_string)
print(name + ":")
print(" description: " + name)
print(" projection:")
print(" proj: " + proj)
print(" ellps: WGS84")
print(" lat_0: " + str(lat_0))
print(" lon_0: " + str(lon_0))
print(" shape:")
print(" height: " + str(ysize))
print(" width: " + str(xsize))
print(" area_extent:")
print(" lower_left_xy: [%f, %f]" % (area_extent[0], area_extent[1]))
print(" upper_right_xy: [%f, %f]" % (area_extent[2], area_extent[3]))
if args.shapes is None:
from PIL import Image
from pycoast import ContourWriterAGG
img ='RGB', (xsize, ysize))
area_def = (proj4_string, area_extent)
cw = ContourWriterAGG(args.shapes)
cw.add_coastlines(img, (proj4_string, area_extent),
resolution='l', width=0.5)
cw.add_grid(img, area_def, (10.0, 10.0), (2.0, 2.0), write_text=False, outline='white', outline_opacity=175,
width=1.0, minor_outline='white', minor_outline_opacity=175, minor_width=0.2, minor_is_tick=False)
\ No newline at end of file
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment