Match spaceborn SR (GPM/TRMM) with ground radars GR#
The idea is to match ground radar (GR) and space-born radar (SR) measurements in order to create spatially and temporally coicident samples without interpolation. The procedure had been suggested by Schwaller and Morris (2011) and is based on the adaption by Warren, et. al. (2017).
The basic principle is illustrated in Fig. 2 of the original paper of Schwaller and Morris (2011):

Quote Warren, et.al: “[…] In this approach, intersections between indi vidual SR beams and GR elevation sweeps are identified and the reflectivity values from both instruments are averaged within a spatial neighborhood around the intersection. Specifically, SR data are averaged in range over the width of the GR beam at the GR range of the intersection, while GR data are averaged in the range–azimuth plane within the footprint of the SR beam. The result is a pair of reflectivity measurements corresponding to approximately the same volume of atmosphere. […]”.
This becomes clearer in Fig. 3:
Schwaller, MR, and Morris, KR. 2011. A ground validation network for the Global Precipitation Measurement mission. J. Atmos. Oceanic Technol., 28, 301-319.
Warren, R.A., A. Protat, S.T. Siems, H.A. Ramsay, V. Louf, M.J. Manton, and T.A. Kane, 0: Calibrating ground-based radars against TRMM and GPM. J. Atmos. Oceanic Technol., 0,
Conventions#
This code is based on the following conventions:
gr
indicates ground radarsr
indicates space-born precipitation radar (TRMM or GPM)
The base routines are designed to process one GR sweep at a time. If a full GR volume with nelev
of sweeps is available, you can iterate over each sweep. In this code, ee
is an index that points to one of the nelev
sweeps/elevation angles. Accordingly, a GR data set will be organised as an array of shape (nelev_gr, nray_gr, ngate_gr)
.
A SR data set is typically organised as arrays with dimensions (nscan_sr, nray_sr, ngate_sr)
.
[1]:
import warnings
#warnings.filterwarnings("ignore")
import wradlib as wrl
import matplotlib.pyplot as plt
import matplotlib as mpl
try:
get_ipython().run_line_magic("matplotlib inline")
except:
plt.ion()
import numpy as np
import datetime as dt
from osgeo import osr
import xarray as xr
import xradar as xd
Acquire datafiles#
[2]:
# define GPM data set
gpm_file = wrl.util.get_wradlib_data_file(
"gpm/2A-CS-151E24S154E30S.GPM.Ku.V7-20170308.20141206-S095002-E095137.004383.V05A.HDF5"
)
# define matching ground radar file
gr2gpm_file = wrl.util.get_wradlib_data_file("hdf5/IDR66_20141206_094829.vol.h5")
# define TRMM data sets
trmm_2a23_file = wrl.util.get_wradlib_data_file(
"trmm/2A-CS-151E24S154E30S.TRMM.PR.2A23.20100206-S111425-E111526.069662.7.HDF"
)
trmm_2a25_file = wrl.util.get_wradlib_data_file(
"trmm/2A-CS-151E24S154E30S.TRMM.PR.2A25.20100206-S111425-E111526.069662.7.HDF"
)
# define matching ground radar file
gr2trmm_file = wrl.util.get_wradlib_data_file("hdf5/IDR66_20100206_111233.vol.h5")
Downloading file 'gpm/2A-CS-151E24S154E30S.GPM.Ku.V7-20170308.20141206-S095002-E095137.004383.V05A.HDF5' from 'https://github.com/wradlib/wradlib-data/raw/pooch/data/gpm/2A-CS-151E24S154E30S.GPM.Ku.V7-20170308.20141206-S095002-E095137.004383.V05A.HDF5' to '/home/runner/work/wradlib/wradlib/wradlib-data'.
Downloading file 'hdf5/IDR66_20141206_094829.vol.h5' from 'https://github.com/wradlib/wradlib-data/raw/pooch/data/hdf5/IDR66_20141206_094829.vol.h5' to '/home/runner/work/wradlib/wradlib/wradlib-data'.
Downloading file 'trmm/2A-CS-151E24S154E30S.TRMM.PR.2A23.20100206-S111425-E111526.069662.7.HDF' from 'https://github.com/wradlib/wradlib-data/raw/pooch/data/trmm/2A-CS-151E24S154E30S.TRMM.PR.2A23.20100206-S111425-E111526.069662.7.HDF' to '/home/runner/work/wradlib/wradlib/wradlib-data'.
Downloading file 'trmm/2A-CS-151E24S154E30S.TRMM.PR.2A25.20100206-S111425-E111526.069662.7.HDF' from 'https://github.com/wradlib/wradlib-data/raw/pooch/data/trmm/2A-CS-151E24S154E30S.TRMM.PR.2A25.20100206-S111425-E111526.069662.7.HDF' to '/home/runner/work/wradlib/wradlib/wradlib-data'.
Downloading file 'hdf5/IDR66_20100206_111233.vol.h5' from 'https://github.com/wradlib/wradlib-data/raw/pooch/data/hdf5/IDR66_20100206_111233.vol.h5' to '/home/runner/work/wradlib/wradlib/wradlib-data'.
Set SR and GR parameters#
[3]:
# Space-born precipitation radar parameters
sr_pars = {
"trmm": {
"zt": 402500.0, # orbital height of TRMM (post boost) APPROXIMATION!
"dr": 250.0, # gate spacing of TRMM
"gr_file": gr2trmm_file,
},
"gpm": {
"zt": 407000.0, # orbital height of GPM APPROXIMATION!
"dr": 125.0, # gate spacing of GPM
"gr_file": gr2gpm_file,
},
}
[4]:
# Set parameters for this procedure
bw_sr = 0.71 # SR beam width
platf = "gpm" # SR platform/product: one out of ["gpm", "trmm"]
zt = sr_pars[platf]["zt"] # SR orbit height (meters)
dr_sr = sr_pars[platf]["dr"] # SR gate length (meters)
gr_file = sr_pars[platf]["gr_file"]
ee = 2 # Index that points to the GR elevation angle to be used
Data Input#
Ground Radar GR#
Read GR data into datatree using xradar#
The following code reads data in ODIM H5 format. If your GR data is in some other format respective adaptions are needed.
[5]:
gr_data = xd.io.open_odim_datatree(gr_file)
display(gr_data)
<xarray.DatasetView> Dimensions: () Data variables: volume_number int64 0 platform_type <U5 'fixed' instrument_type <U5 'radar' time_coverage_start <U20 '2014-12-06T09:48:29Z' time_coverage_end <U20 '2014-12-06T09:53:15Z' longitude float64 153.2 altitude float64 175.0 latitude float64 -27.72 Attributes: Conventions: None version: None title: None institution: None references: None source: None history: None comment: im/exported using xradar instrument_name: None
Extract relevant GR data and meta-data#
[6]:
swp = gr_data[f"sweep_{ee}"].ds
display(swp)
print(swp.sweep_fixed_angle.values)
<xarray.DatasetView> Dimensions: (azimuth: 360, range: 600) Coordinates: * azimuth (azimuth) float32 0.5 1.5 2.5 3.5 ... 357.5 358.5 359.5 elevation (azimuth) float32 ... time (azimuth) datetime64[ns] 2014-12-06T09:49:31.036111104... * range (range) float32 125.0 375.0 625.0 ... 1.496e+05 1.499e+05 longitude float64 ... latitude float64 ... altitude float64 ... Data variables: DBZH (azimuth, range) float32 ... sweep_mode <U20 ... sweep_number int64 ... prt_mode <U7 ... follow_mode <U7 ... sweep_fixed_angle float64 ...
1.2999999523162842
Georeference GR (AEQD)#
[7]:
swp = swp.wrl.georef.georeference()
display(swp)
<xarray.Dataset> Dimensions: (azimuth: 360, range: 600) Coordinates: (12/14) * azimuth (azimuth) float32 0.5 1.5 2.5 3.5 ... 357.5 358.5 359.5 elevation (azimuth) float32 1.3 1.3 1.3 1.3 1.3 ... 1.3 1.3 1.3 1.3 time (azimuth) datetime64[ns] 2014-12-06T09:49:31.036111104... * range (range) float32 125.0 375.0 625.0 ... 1.496e+05 1.499e+05 longitude float64 153.2 latitude float64 -27.72 ... ... y (azimuth, range) float32 125.0 374.9 ... 1.498e+05 z (azimuth, range) float32 178.0 183.0 ... 4.895e+03 gr (azimuth, range) float32 125.0 374.9 ... 1.498e+05 rays (azimuth, range) float32 0.5 0.5 0.5 ... 359.5 359.5 bins (azimuth, range) float32 125.0 375.0 ... 1.499e+05 spatial_ref int64 0 Data variables: DBZH (azimuth, range) float32 ... sweep_mode <U20 'azimuth_surveillance' sweep_number int64 ... prt_mode <U7 ... follow_mode <U7 ... sweep_fixed_angle float64 1.3
Assign lonlat coords to GR#
[8]:
ll = swp.wrl.georef.spherical_to_proj()
swp = swp.assign_coords(lon=ll[..., 0], lat=ll[..., 1])
display(swp)
<xarray.Dataset> Dimensions: (azimuth: 360, range: 600) Coordinates: (12/16) * azimuth (azimuth) float32 0.5 1.5 2.5 3.5 ... 357.5 358.5 359.5 elevation (azimuth) float32 1.3 1.3 1.3 1.3 1.3 ... 1.3 1.3 1.3 1.3 time (azimuth) datetime64[ns] 2014-12-06T09:49:31.036111104... * range (range) float32 125.0 375.0 625.0 ... 1.496e+05 1.499e+05 longitude float64 153.2 latitude float64 -27.72 ... ... gr (azimuth, range) float32 125.0 374.9 ... 1.498e+05 rays (azimuth, range) float32 0.5 0.5 0.5 ... 359.5 359.5 bins (azimuth, range) float32 125.0 375.0 ... 1.499e+05 spatial_ref int64 0 lon (azimuth, range) float64 153.2 153.2 ... 153.2 153.2 lat (azimuth, range) float64 -27.72 -27.71 ... -26.37 -26.37 Data variables: DBZH (azimuth, range) float32 ... sweep_mode <U20 'azimuth_surveillance' sweep_number int64 ... prt_mode <U7 ... follow_mode <U7 ... sweep_fixed_angle float64 1.3
Get GR Grid Polygons#
[9]:
# todo: move to wradlib function
def get_grid_polygons(ds):
x = ds.x
for i in reversed(range(x.ndim)):
x = xr.plot.utils._infer_interval_breaks(x, axis=i)
y = ds.y
for i in reversed(range(y.ndim)):
y = xr.plot.utils._infer_interval_breaks(y, axis=i)
coords = np.stack([x, y], axis=-1)
ll = np.dstack([coords[0:-1, 0:-1], ds.z.values[..., None]])
ul = np.dstack([coords[0:-1, 1:], ds.z.values[..., None]])
ur = np.dstack([coords[1:, 1:], ds.z.values[..., None]])
lr = np.dstack([coords[1:, 0:-1], ds.z.values[..., None]])
return np.stack([ll, ul, ur, lr, ll], axis=-2)
[10]:
gr_poly = get_grid_polygons(swp)
Calculate GR Bounding Box#
[11]:
bbox = wrl.zonalstats.get_bbox(swp.lon, swp.lat)
print(
"Radar bounding box:\n\t%.2f\n%.2f %.2f\n\t%.2f"
% (bbox["top"], bbox["left"], bbox["right"], bbox["bottom"])
)
Radar bounding box:
-26.37
151.72 154.76
-29.07
Satellite data SR#
Read GPM data#
[12]:
# read spaceborn SR data
if platf == "gpm":
sr_data = wrl.io.open_gpm_dataset(gpm_file, group="NS")
sr_data = sr_data.set_coords(["Longitude", "Latitude"])
sr_data = xr.decode_cf(sr_data)
sr_data.attrs["platform"] = "GPM"
# sr_data = wrl.io.read_gpm(gpm_file, bbox=bbox)
elif platf == "trmm":
sr_data = wrl.io.read_trmm(trmm_2a23_file, trmm_2a25_file, bbox=bbox)
dvars = {
"pflag": "flagPrecip",
"ptype": "typePrecip",
"zbb": "heightBB",
"bbwidth": "widthBB",
"sfc": None,
"quality": "qualityBB",
"zenith": "localZenithAngle",
"refl": "zFactorCorrected",
"date": "time",
"lon": "Longitude",
"lat": "Latitude",
}
dims = ["nscan", "nray", "nbin"]
data_vars = {
dvars[k] if dvars[k] is not None else k: (dims[: v.ndim], v)
for k, v in sr_data.items()
if k in dvars
}
sr_data = xr.Dataset(data_vars=data_vars)
# sr_data = sr_data.rename_vars(date="time")
sr_data = sr_data.set_coords(["time", "Longitude", "Latitude"])
sr_data["zFactorCorrected"] = sr_data["zFactorCorrected"][..., ::-1]
sr_data["dprAlt"] = sr_pars["trmm"]["zt"]
sr_data.attrs["platform"] = "TRMM"
else:
raise ("Invalid platform")
display(sr_data)
<xarray.Dataset> Dimensions: (nswath: 1, nscan: 136, nray: 49, XYZ: 3, nbin: 176, nNP: 4, method: 6, foreBack: 2, nearFar: 2, nNode: 5, nbinSZP: 7, nDSD: 2, nNUBF: 3, LS: 2) Coordinates: Latitude (nscan, nray) float32 ... Longitude (nscan, nray) float32 ... date (nscan) datetime64[ns] 2014-12-06T09:50:02.0... Dimensions without coordinates: nswath, nscan, nray, XYZ, nbin, nNP, method, foreBack, nearFar, nNode, nbinSZP, nDSD, nNUBF, LS Data variables: (12/96) AlgorithmRuntimeInfo (nswath) |S929 ... dataQuality (nscan) float32 ... dataWarning (nscan) float32 ... missing (nscan) float32 ... modeStatus (nscan) float32 ... geoError (nscan) float32 ... ... ... phaseNearSurface (nscan, nray) float32 ... epsilon (nscan, nray, nbin) float32 ... flagEcho (nscan, nray, nbin) float32 ... qualityData (nscan, nray) float64 ... qualityFlag (nscan, nray) float32 ... flagSensor (nscan) float32 ... Attributes: FileHeader: DOI=10.5067/GPM/DPR/Ku/2A/05;\nDOIauthority=http://dx.... InputRecord: InputFileNames=GPMCOR_KUR_1412060833_1006_004383_1BS_D... NavigationRecord: LongitudeOnEquator=-27.312063;\nUTCDateTimeOnEquator=2... FileInfo: DataFormatVersion=cn;\nTKCodeBuildVersion=1;\nMetadata... JAXAInfo: GranuleFirstScanUTCDateTime=2014-12-06T08:33:33.292Z;\... platform: GPM
[13]:
sr_data["dprAlt"].values
[13]:
array([404030., 404040., 404040., 404060., 404070., 404070., 404080.,
404090., 404090., 404100., 404110., 404130., 404130., 404140.,
404150., 404150., 404160., 404170., 404170., 404180., 404200.,
404210., 404210., 404220., 404230., 404230., 404250., 404260.,
404260., 404270., 404280., 404290., 404290., 404310., 404320.,
404320., 404330., 404340., 404340., 404350., 404370., 404380.,
404380., 404390., 404400., 404400., 404410., 404430., 404430.,
404440., 404450., 404460., 404460., 404470., 404490., 404490.,
404500., 404510., 404510., 404530., 404540., 404550., 404550.,
404560., 404580., 404580., 404590., 404600., 404600., 404610.,
404630., 404640., 404640., 404650., 404660., 404660., 404670.,
404690., 404690., 404700., 404720., 404730., 404730., 404740.,
404750., 404750., 404770., 404780., 404780., 404790., 404800.,
404810., 404810., 404830., 404840., 404840., 404860., 404870.,
404870., 404880., 404890., 404910., 404910., 404920., 404930.,
404930., 404940., 404960., 404960., 404970., 404990., 405000.,
405000., 405010., 405020., 405020., 405030., 405050., 405050.,
405060., 405070., 405090., 405090., 405100., 405110., 405110.,
405130., 405140., 405140., 405150., 405170., 405180., 405180.,
405190., 405210., 405210.], dtype=float32)
[14]:
# Todo: make height level parameterizable via keyword argument
# Todo: plot gr radar domain and satellite swath outlines
def plot_unmatched_refl(sr_data, gr_data, level=-5):
"""
Plotting unmatched SR and GR Reflectivity
# Input:
# ------
gr_data ::: graund radar sweep data
sr_data ::: satellite data
# Output:
# ------
Plot of SR Refl. and GR Refl.
"""
plt.figure(figsize=(12, 4))
ax1 = plt.subplot(1, 2, 1)
# pm = sr_data.zFactorFinal[:, :, -5, 0].plot(x="Longitude", y="Latitude", cmap='jet', vmin=0, vmax=40, add_labels=False, add_colorbar=False)
pm = sr_data.zFactorCorrected[:, :, level].plot(
x="Longitude",
y="Latitude",
cmap="jet",
vmin=0,
vmax=40,
add_labels=False,
add_colorbar=False,
)
cbar = plt.colorbar(pm, ax=ax1, ticks=np.arange(0, 42, 2))
cbar.set_label("SR Reflectivity (dBz)", fontsize=12)
cbar.ax.tick_params(labelsize=12)
ax1.set_xlabel("Longitude (°)", fontsize=12)
ax1.set_ylabel("Latitude (°)", fontsize=12)
ax1.tick_params(axis="both", labelsize=12)
ax1.set_title(sr_data.attrs["platform"], fontsize=12, loc="left")
ax1.grid(lw=0.25, color="grey")
ax1.set_xlim(sr_data.Longitude.min(), sr_data.Longitude.max())
ax1.set_ylim(sr_data.Latitude.min(), sr_data.Latitude.max())
ax2 = plt.subplot(1, 2, 2)
swp = gr_data["sweep_2"].ds
ll = swp.wrl.georef.spherical_to_proj()
swp = swp.assign_coords(lon=ll[..., 0], lat=ll[..., 1])
pm = swp.DBZH.plot(
x="lon",
y="lat",
cmap="jet",
vmin=0,
vmax=40,
ax=ax2,
add_labels=False,
add_colorbar=False,
)
cbar = plt.colorbar(pm, ax=ax2, ticks=np.arange(0, 42, 2))
cbar.set_label("GR Reflectivity (dBz)", fontsize=12)
cbar.ax.tick_params(labelsize=12)
ax2.set_xlabel("Longitude (°)", fontsize=12)
ax2.set_ylabel("Latitude (°)", fontsize=12)
ax2.tick_params(axis="both", labelsize=12)
ax2.set_title("Ground Radar", fontsize=12, loc="left")
ax2.grid(lw=0.25, color="grey")
ax2.set_xlim(sr_data.Longitude.min(), sr_data.Longitude.max())
ax2.set_ylim(sr_data.Latitude.min(), sr_data.Latitude.max())
plt.tight_layout()
[15]:
if platf == "trmm":
level = 75
else:
level = 171
plot_unmatched_refl(sr_data, gr_data, level=level)

Georeference SR data#
add radar AEQD coords to the SR Dataset
Set fundamental georeferencing parameters#
[16]:
# Todo: only keep one method
# Calculate equivalent earth radius
wgs84 = wrl.georef.get_default_projection()
# lon0_gr = gr_data.latitude.values
re1 = gr_data.ds.wrl.georef.get_earth_radius(sr=wgs84)
print("Earth radius 1:", re1)
a = wgs84.GetSemiMajor()
b = wgs84.GetSemiMinor()
print("SemiMajor, SemiMinor:", a, b)
# Set up aeqd-projection gr-centered
rad = wrl.georef.projstr_to_osr(
("+proj=aeqd +lon_0={lon:f} " + "+lat_0={lat:f} +a={a:f} " + "+b={b:f}").format(
lon=gr_data.ds.longitude.values, lat=gr_data.ds.latitude.values, a=a, b=b
)
)
re2 = gr_data.ds.wrl.georef.get_earth_radius(sr=rad)
print("Earth radius 2:", re2)
Earth radius 1: 6373541.039814419
SemiMajor, SemiMinor: 6378137.0 6356752.314245179
Earth radius 2: 6373541.039814382
[17]:
# todo: use dpr altitude instead fix valued zt
[18]:
sr_data = sr_data.wrl.georef.reproject(
coords=dict(x="Longitude", y="Latitude"), src_crs=wgs84, trg_crs=rad
)
sr_data
[18]:
<xarray.Dataset> Dimensions: (nswath: 1, nscan: 136, nray: 49, XYZ: 3, nbin: 176, nNP: 4, method: 6, foreBack: 2, nearFar: 2, nNode: 5, nbinSZP: 7, nDSD: 2, nNUBF: 3, LS: 2) Coordinates: Latitude (nscan, nray) float32 ... Longitude (nscan, nray) float32 ... date (nscan) datetime64[ns] 2014-12-06T09:50:02.0... x (nscan, nray) float64 -2.706e+05 ... 2.36e+05 y (nscan, nray) float64 2.446e+05 ... -2.394e+05 Dimensions without coordinates: nswath, nscan, nray, XYZ, nbin, nNP, method, foreBack, nearFar, nNode, nbinSZP, nDSD, nNUBF, LS Data variables: (12/96) AlgorithmRuntimeInfo (nswath) |S929 ... dataQuality (nscan) float32 ... dataWarning (nscan) float32 ... missing (nscan) float32 ... modeStatus (nscan) float32 ... geoError (nscan) float32 ... ... ... phaseNearSurface (nscan, nray) float32 ... epsilon (nscan, nray, nbin) float32 ... flagEcho (nscan, nray, nbin) float32 ... qualityData (nscan, nray) float64 ... qualityFlag (nscan, nray) float32 ... flagSensor (nscan) float32 ... Attributes: FileHeader: DOI=10.5067/GPM/DPR/Ku/2A/05;\nDOIauthority=http://dx.... InputRecord: InputFileNames=GPMCOR_KUR_1412060833_1006_004383_1BS_D... NavigationRecord: LongitudeOnEquator=-27.312063;\nUTCDateTimeOnEquator=2... FileInfo: DataFormatVersion=cn;\nTKCodeBuildVersion=1;\nMetadata... JAXAInfo: GranuleFirstScanUTCDateTime=2014-12-06T08:33:33.292Z;\... platform: GPM
Subset relevant SR data#
Calculate distance of each SR bin to the ground radar location and select only locations within the GR range.
[19]:
# calculate range and mask srdata
r = np.sqrt(sr_data.x**2 + sr_data.y**2)
sr_cut = sr_data.where(r < swp.gr.max(), drop=True)
sr_cut.zFactorCorrected[..., level].plot(x="x", y="y", vmin=-32, vmax=50)
[19]:
<matplotlib.collections.QuadMesh at 0x7f2c7a9cd2d0>

Subset relevant SR data with precip flag#
[20]:
precip_mask = xr.where(sr_cut.flagPrecip > 0, 1, 0)
precip_mask.plot(x="x", y="y")
[20]:
<matplotlib.collections.QuadMesh at 0x7f2c7aac00d0>

SR Parallax Correction#
Correct for parallax, get 3D-XYZ-Array
[21]:
# dr_sr = 125.
# todo: make this available from wradlib
sr_cut = sr_cut.wrl.georef.correct_parallax(dr_sr)
display(sr_cut)
<xarray.Dataset> Dimensions: (nswath: 1, nscan: 61, nray: 49, XYZ: 3, nbin: 176, nNP: 4, method: 6, foreBack: 2, nearFar: 2, nNode: 5, nbinSZP: 7, nDSD: 2, nNUBF: 3, LS: 2) Coordinates: (12/13) Latitude (nscan, nray) float32 -27.1 -27.08 ... -28.47 Longitude (nscan, nray) float32 151.4 151.4 ... 154.9 date (nscan) datetime64[ns] 2014-12-06T09:50:30.0... x (nscan, nray) float64 -1.861e+05 ... 1.613e+05 y (nscan, nray) float64 6.695e+04 ... -8.461e+04 longitude float64 153.2 ... ... altitude float64 175.0 spatial_ref int64 0 xp (nscan, nray, nbin) float64 nan nan ... nan nan yp (nscan, nray, nbin) float64 nan nan ... nan nan zp (nscan, nray, nbin) float64 nan nan ... nan nan sr_range (nbin) float64 2.188e+04 2.175e+04 ... 0.0 Dimensions without coordinates: nswath, nscan, nray, XYZ, nbin, nNP, method, foreBack, nearFar, nNode, nbinSZP, nDSD, nNUBF, LS Data variables: (12/96) AlgorithmRuntimeInfo (nswath, nscan, nray) object nan nan ... nan dataQuality (nscan, nray) float32 nan nan nan ... nan nan dataWarning (nscan, nray) float32 nan nan nan ... nan nan missing (nscan, nray) float32 nan nan nan ... nan nan modeStatus (nscan, nray) float32 nan nan nan ... nan nan geoError (nscan, nray) float32 nan nan nan ... nan nan ... ... phaseNearSurface (nscan, nray) float32 nan nan nan ... nan nan epsilon (nscan, nray, nbin) float32 nan nan ... nan nan flagEcho (nscan, nray, nbin) float32 nan nan ... nan nan qualityData (nscan, nray) float64 nan nan nan ... nan nan qualityFlag (nscan, nray) float32 nan nan nan ... nan nan flagSensor (nscan, nray) float32 nan nan nan ... nan nan Attributes: FileHeader: DOI=10.5067/GPM/DPR/Ku/2A/05;\nDOIauthority=http://dx.... InputRecord: InputFileNames=GPMCOR_KUR_1412060833_1006_004383_1BS_D... NavigationRecord: LongitudeOnEquator=-27.312063;\nUTCDateTimeOnEquator=2... FileInfo: DataFormatVersion=cn;\nTKCodeBuildVersion=1;\nMetadata... JAXAInfo: GranuleFirstScanUTCDateTime=2014-12-06T08:33:33.292Z;\... platform: GPM