MiRAC-P#
The following example presents the nadir passive microwave radiometer MiRAC-P. The Microwave Radar/Radiometer for Arctic Clouds - passive (MiRAC-P) was installed during ACLOUD and AFLUX. During MOSAiC-ACA, passive microwave observations are conducted by the HATPRO instrument.
More information on MiRAC can be found in Mech et al. (2019). If you have questions or if you would like to use the data for a publication, please don’t hesitate to get in contact with the dataset authors as stated in the dataset attributes contact
or author
.
import os
from dotenv import load_dotenv
load_dotenv()
ac3cloud_username = os.environ['AC3_USER']
ac3cloud_password = os.environ['AC3_PASSWORD']
credentials = dict(user=ac3cloud_username, password=ac3cloud_password)
# local caching
kwds = {'simplecache': dict(
cache_storage=os.environ['INTAKE_CACHE'],
same_names=True
)}
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[1], line 2
1 import os
----> 2 from dotenv import load_dotenv
4 load_dotenv()
6 ac3cloud_username = os.environ['AC3_USER']
ModuleNotFoundError: No module named 'dotenv'
import ac3airborne
cat = ac3airborne.get_intake_catalog()
datasets = []
for campaign in ['ACLOUD', 'AFLUX']:
datasets.extend(list(cat[campaign]['P5']['MiRAC-P']))
datasets
['ACLOUD_P5_RF04',
'ACLOUD_P5_RF05',
'ACLOUD_P5_RF06',
'ACLOUD_P5_RF07',
'ACLOUD_P5_RF08',
'ACLOUD_P5_RF10',
'ACLOUD_P5_RF11',
'ACLOUD_P5_RF13',
'ACLOUD_P5_RF14',
'ACLOUD_P5_RF15',
'ACLOUD_P5_RF16',
'ACLOUD_P5_RF17',
'ACLOUD_P5_RF18',
'ACLOUD_P5_RF19',
'ACLOUD_P5_RF20',
'ACLOUD_P5_RF21',
'ACLOUD_P5_RF22',
'ACLOUD_P5_RF23',
'ACLOUD_P5_RF25',
'AFLUX_P5_RF02',
'AFLUX_P5_RF03',
'AFLUX_P5_RF04',
'AFLUX_P5_RF05',
'AFLUX_P5_RF06',
'AFLUX_P5_RF07',
'AFLUX_P5_RF08',
'AFLUX_P5_RF09',
'AFLUX_P5_RF10',
'AFLUX_P5_RF11',
'AFLUX_P5_RF12',
'AFLUX_P5_RF13',
'AFLUX_P5_RF14',
'AFLUX_P5_RF15']
Note
Have a look at the attributes of the xarray dataset ds_mirac_p
for all relevant information on the dataset, such as author, contact, or citation information.
ds_mirac_p = ds_cth = cat['ACLOUD']['P5']['MiRAC-P']['ACLOUD_P5_RF05'].to_dask()
ds_mirac_p
<xarray.Dataset> Dimensions: (channel: 8, time: 14883) Coordinates: * time (time) datetime64[ns] 2017-05-25T08:20:32 ... 2017-05-25T12:38:36 * channel (channel) int64 0 1 2 3 4 5 6 7 Data variables: frequency (channel) float32 183.9 184.8 185.8 186.8 188.3 190.8 243.0 340.0 tb (time, channel) float32 ... lon (time) float64 nan nan nan nan nan nan ... nan nan nan nan nan lat (time) float64 78.29 78.3 78.3 78.3 ... 78.31 78.31 78.31 78.31 Attributes: (12/14) institution: Institute for Geophysics and Meteorology (IGM), University ... source: airborne observation references: https://doi.org/10.5194/amt-12-5019-2019 author: Nils Risse convention: CF-1.8 featureType: trajectory ... ... flight_id: RF05 title: MiRAC-P brightness temperature instrument: MiRAC-P: Microwave Radar/radiometer for Arctic Clouds (pass... history: measured onboard Polar 5 during ACLOUD campaign; processed,... contact: mario.mech@uni-koeln.de, n.risse@uni-koeln.de created: 2021-11-09
- channel: 8
- time: 14883
- time(time)datetime64[ns]2017-05-25T08:20:32 ... 2017-05-...
- standard_name :
- time
- long_name :
- time in seconds since epoch
array(['2017-05-25T08:20:32.000000000', '2017-05-25T08:20:33.000000000', '2017-05-25T08:20:34.000000000', ..., '2017-05-25T12:38:34.000000000', '2017-05-25T12:38:35.000000000', '2017-05-25T12:38:36.000000000'], dtype='datetime64[ns]')
- channel(channel)int640 1 2 3 4 5 6 7
- standard_name :
- channel
- long_name :
- MiRAC-P radiometer channel number
array([0, 1, 2, 3, 4, 5, 6, 7])
- frequency(channel)float32...
- standard_name :
- frequency
- long_name :
- MiRAC-P radiometer channel center frequency
- units :
- GHz
array([183.91, 184.81, 185.81, 186.81, 188.31, 190.81, 243. , 340. ], dtype=float32)
- tb(time, channel)float32...
- standard_name :
- brightness_temperature
- long_name :
- MiRAC-P brightness temperature
- units :
- K
- description :
- MiRAC-P brightness temperature measured with 1 second integration time
[119064 values with dtype=float32]
- lon(time)float64...
- standard_name :
- longitude
- long_name :
- WGS84 datum/longitude
- units :
- degrees_east
array([nan, nan, nan, ..., nan, nan, nan])
- lat(time)float64...
- standard_name :
- latitude
- long_name :
- WGS84 datum/latitude
- units :
- degrees_north
array([78.294903, 78.295335, 78.295768, ..., 78.306642, 78.306582, 78.30652 ])
- institution :
- Institute for Geophysics and Meteorology (IGM), University of Cologne
- source :
- airborne observation
- references :
- https://doi.org/10.5194/amt-12-5019-2019
- author :
- Nils Risse
- convention :
- CF-1.8
- featureType :
- trajectory
- mission :
- ACLOUD
- platform :
- Polar 5
- flight_id :
- RF05
- title :
- MiRAC-P brightness temperature
- instrument :
- MiRAC-P: Microwave Radar/radiometer for Arctic Clouds (passive)
- history :
- measured onboard Polar 5 during ACLOUD campaign; processed, quality-checked and reformatted by University of Cologne
- contact :
- mario.mech@uni-koeln.de, n.risse@uni-koeln.de
- created :
- 2021-11-09
The dataset includes nadir brightness temperatures (tb
) observed by MiRAC-P at the 183.31 GHz water vapor absorption line (183±0.6, ±1.5, ±2.5, ±3.5, ±5.0, ±7.5 GHz) and two window channels at 243 and 340 GHz.
Load Polar 5 flight phase information#
Polar 5 flights are divided into segments to easily access start and end times of flight patterns. For more information have a look at the respective github repository.
At first we want to load the flight segments of (AC)³airborne
meta = ac3airborne.get_flight_segments()
The following command lists all flight segments into the dictionary segments
segments = {s.get("segment_id"): {**s, "flight_id": flight["flight_id"]}
for campaign in meta.values()
for platform in campaign.values()
for flight in platform.values()
for s in flight["segments"]
}
In this example we want to look at a high-level segment during ACLOUD RF05.
seg = segments["ACLOUD_P5_RF05_hl07"]
Using the start and end times of the segment ACLOUD_P5_RF05_hl07
stored in seg
, we slice the MiRAC-P data to the selected flight sections.
ds_mirac_p_sel = ds_mirac_p.sel(time=slice(seg["start"], seg["end"]))
In polar regions, the surface type is helpful for the interpretation of airborne passive microwave observations, especially near the marginal sea ice zone, as generally a higher emissivity is expected over sea ice compared to open ocean. Therefore, we also load AMSR2 sea ice concentration data along the Polar 5 flight track, which is operationally derived by the University of Bremen.
ds_sea_ice = cat['ACLOUD']['P5']['AMSR2_SIC']['ACLOUD_P5_RF05'].to_dask().sel(
time=slice(seg["start"], seg["end"]))
Plots#
The flight section during ACLOUD RF05 is flown at about 3 km altitude in west-east direction during a cold-air outbreak event perpendicular to the wind field. Clearly one can identify the roll-cloud structure in the radar reflectivity and the 89 GHz brightness temperature.
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib import cm
import numpy as np
plt.style.use("../../mplstyle/book")
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True, gridspec_kw=dict(height_ratios=(1, 1, 0.1)))
kwargs = dict(s=10, linewidths=0)
colors = cm.get_cmap('viridis', 6).colors
for i in range(0, 6):
ax1.scatter(ds_mirac_p_sel.time, ds_mirac_p_sel.tb.sel(channel=i), label='%g GHz'%ds_mirac_p_sel.frequency.sel(channel=i).item(), color=colors[i], **kwargs)
for i in range(6, 8):
ax2.scatter(ds_mirac_p_sel.time, ds_mirac_p_sel.tb.sel(channel=i), label='%g GHz'%ds_mirac_p_sel.frequency.sel(channel=i).item(), **kwargs)
ax1.legend(frameon=False, bbox_to_anchor=(1.05, 0.5), loc='center left')
ax2.legend(frameon=False, bbox_to_anchor=(1.05, 0.5), loc='center left')
ax1.set_ylabel('$T_b$ [K]')
ax2.set_ylabel('$T_b$ [K]')
# plot AMSR2 sea ice concentration
im = ax3.pcolormesh(ds_sea_ice.time,
np.array([0, 1]),
np.array([ds_sea_ice.sic,ds_sea_ice.sic]), cmap='Blues_r', vmin=0, vmax=100,
shading='auto')
cax = fig.add_axes([0.87, 0.085, 0.1, ax3.get_position().height])
fig.colorbar(im, cax=cax, orientation='horizontal', label='Sea ice [%]')
ax3.tick_params(axis='y', labelleft=False, left=False)
#ax3.spines[:].set_visible(True)
ax3.spines['top'].set_visible(True)
ax3.spines['right'].set_visible(True)
ax3.set_xlabel('Time (hh:mm) [UTC]')
ax3.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
plt.show()