Skip to content

Commit 8d417ec

Browse files
authored
Merge pull request #58 from MeteoSwiss/dev
Dev
2 parents 13f8131 + 55b1ed1 commit 8d417ec

File tree

4 files changed

+129
-50
lines changed

4 files changed

+129
-50
lines changed

.github/workflows/pyrad_tests_mch_dev.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
fail-fast: false
2020
matrix:
2121
os: [ "ubuntu-latest" ]
22-
python-version: [ "3.9", "3.10"]
22+
python-version: [ "3.9", "3.10", "3.11"]
2323
max-parallel: 6
2424

2525
defaults:

config/pyart/mf_config.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@
317317
rainfall_accumulation = 'rainfall_accumulation'
318318
radar_rainrate_relation = 'radar_rainrate_relation'
319319
radar_estimated_rain_rate_flag = 'radar_estimated_rain_rate_flag'
320+
adjustment_factor = 'adjustment_factor'
320321

321322
# melting layer
322323
melting_layer = 'melting_layer'
@@ -696,6 +697,7 @@
696697
'sun_hit_h': sun_hit_h,
697698
'sun_hit_v': sun_hit_v,
698699
'sun_hit_zdr': sun_hit_zdr,
700+
'adjustment_factor': adjustment_factor,
699701
'radar_estimated_rain_rate': radar_estimated_rain_rate,
700702
'corrected_radar_estimated_rain_rate': corrected_radar_estimated_rain_rate,
701703
'rainfall_accumulation': rainfall_accumulation,
@@ -2250,6 +2252,12 @@
22502252
'long_name': 'Birds Density',
22512253
'coordinates': 'elevation azimuth range'},
22522254

2255+
adjustment_factor: {
2256+
'units': 'dB',
2257+
'standard_name': 'adjustment_factor',
2258+
'long_name': 'Adjustment Factor',
2259+
'coordinates': 'elevation azimuth range'},
2260+
22532261
radar_estimated_rain_rate: {
22542262
'units': 'mm/h',
22552263
'standard_name': 'radar_estimated_rain_rate',
@@ -3967,6 +3975,7 @@ def spectrum_width_limit(container=None, selection=0):
39673975
quant90_corrected_velocity: 'pyart_BuDRd18',
39683976
quant95_corrected_velocity: 'pyart_BuDRd18',
39693977
vpr_correction: 'pyart_BuDRd18',
3978+
adjustment_factor: 'pyart_BuDRd18',
39703979

39713980
spectrum_width: 'pyart_NWS_SPW',
39723981
corrected_spectrum_width: 'pyart_NWS_SPW',
@@ -4236,6 +4245,7 @@ def spectrum_width_limit(container=None, selection=0):
42364245
velocity_difference: (-15., 15.),
42374246
wind_speed: (0., 50.),
42384247
wind_direction: (0., 360.),
4248+
adjustment_factor: (-5., 5),
42394249

42404250
spectrum_width: spectrum_width_limit,
42414251
corrected_spectrum_width: spectrum_width_limit,

src/pyart

src/pyrad_proc/pyrad/io/read_data_radar.py

Lines changed: 117 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2253,9 +2253,26 @@ def merge_scans_mfcfradial(basepath, scan_list, voltime, datatype_list,
22532253
radar object
22542254
22552255
"""
2256+
# Mapping of MeteoFrance and JMA field names to Py-ART field names
2257+
field_names = {
2258+
'DBZH': 'reflectivity', # JMA
2259+
'TH': 'unfiltered_reflectivity', # MF
2260+
'ZDR': 'differential_reflectivity', # MF & JMA
2261+
'RHOHV': 'cross_correlation_ratio', # MF & JMA
2262+
'PHIDP': 'uncorrected_differential_phase', # MF
2263+
'PSIDP': 'differential_phase', # JMA
2264+
'KDP': 'specific_differential_phase', # JMA
2265+
'VRAD': 'velocity', # MF
2266+
'VEL': 'velocity', # JMA
2267+
'WIDTH': 'spectrum_width', # JMA
2268+
'SIGMA': 'sigma_zh' # MF
2269+
}
22562270

22572271
radar = None
2258-
voltime.strftime('%H%M')
2272+
2273+
# get list of files to combine
2274+
flist = []
2275+
scan_list_aux = []
22592276

22602277
fpath_strf = (
22612278
dataset_list[0][
@@ -2269,20 +2286,106 @@ def merge_scans_mfcfradial(basepath, scan_list, voltime, datatype_list,
22692286
filename_aux, date_format=fdate_strf)
22702287
if fdatetime == voltime:
22712288
filename = [filename_aux]
2272-
2273-
# Mapping of MeteoFrance field names to Py-ART field names
2274-
field_names = {
2275-
'RHOHV': 'uncorrected_cross_correlation_ratio',
2276-
'TH': 'unfiltered_reflectivity',
2277-
'PHIDP': 'uncorrected_differential_phase',
2278-
'ZDR': 'unfiltered_differential_reflectivity',
2279-
'VRAD': 'velocity',
2280-
'SIGMA': 'sigma_zh'}
2289+
break
22812290

22822291
if not filename:
2283-
warn('No file found in ' + datapath)
2292+
warn(f'No file found in {datapath} for scan {scan_list[0]}'
2293+
f' and time {voltime}')
22842294
else:
2285-
radar = pyart.io.read_cfradial(filename[0], field_names=field_names)
2295+
flist.append(filename[0])
2296+
scan_list_aux.append(scan_list[0])
2297+
2298+
if len(scan_list) > 1:
2299+
# merge the elevations into a single radar instance
2300+
for scan in scan_list[1:]:
2301+
filenames = glob.glob(f'{datapath}*{scan}*')
2302+
filename = []
2303+
for filename_aux in filenames:
2304+
fdatetime = find_date_in_file_name(
2305+
filename_aux, date_format=fdate_strf)
2306+
if cfg['MasterScanTimeTol'][ind_rad] == 0:
2307+
if fdatetime == voltime:
2308+
filename = [filename_aux]
2309+
break
2310+
elif cfg['MasterScanTimeTol'][ind_rad] == 1:
2311+
if (voltime <= fdatetime < voltime
2312+
+ datetime.timedelta(
2313+
minutes=cfg['ScanPeriod'])):
2314+
filename = [filename_aux]
2315+
print(os.path.basename(filename[0]))
2316+
break
2317+
else:
2318+
if (voltime
2319+
- datetime.timedelta(minutes=cfg['ScanPeriod'])
2320+
< fdatetime <= voltime):
2321+
filename = [filename_aux]
2322+
print(os.path.basename(filename[0]))
2323+
break
2324+
if not filename:
2325+
warn(f'No file found in {datapath} for scan {scan}'
2326+
f' and time {voltime}')
2327+
continue
2328+
flist.append(filename[0])
2329+
scan_list_aux.append(scan)
2330+
2331+
if not flist:
2332+
return radar
2333+
2334+
if cfg['DataTypeID'] is None:
2335+
for fname, scan in zip(flist, scan_list_aux):
2336+
radar_aux = pyart.io.read_cfradial(fname, field_names=field_names)
2337+
if radar_aux is None:
2338+
continue
2339+
if radar is None:
2340+
radar = radar_aux
2341+
continue
2342+
radar = pyart.util.radar_utils.join_radar(radar, radar_aux)
2343+
else:
2344+
for datatype in datatype_list:
2345+
if datatype not in cfg['DataTypeID'].keys():
2346+
warn(f'No file contains data type {datatype}')
2347+
continue
2348+
nscans = 0
2349+
radar_aux = None
2350+
for fname, scan in zip(flist, scan_list_aux):
2351+
if cfg['DataTypeID'][datatype] not in os.path.basename(fname):
2352+
continue
2353+
radar_aux2 = pyart.io.read_cfradial(
2354+
fname, field_names=field_names)
2355+
if radar_aux2 is None:
2356+
continue
2357+
if radar_aux is None:
2358+
radar_aux = radar_aux2
2359+
nscans += 1
2360+
continue
2361+
radar_aux = pyart.util.radar_utils.join_radar(
2362+
radar_aux, radar_aux2)
2363+
nscans += 1
2364+
if radar is None:
2365+
radar = radar_aux
2366+
nscans_expected = nscans
2367+
continue
2368+
if nscans != nscans_expected:
2369+
warn(f'Unable to merge datatype {datatype} into radar object.'
2370+
f' Number of scans containing the datatype {nscans}'
2371+
f' different from number of scans expected'
2372+
f' {nscans_expected}')
2373+
continue
2374+
field_name = get_fieldname_pyart(datatype)
2375+
try:
2376+
radar.add_field(field_name, radar_aux.fields[field_name])
2377+
except ValueError:
2378+
if radar.nrays * radar.ngates > radar_aux.nrays * radar_aux.ngates:
2379+
warn(f'Field {field_name} will be interpolated')
2380+
radar = add_field(radar, radar_aux)
2381+
else:
2382+
warn(
2383+
f'Fields will be adapted to {field_name} field size')
2384+
radar = add_field(radar_aux, radar)
2385+
print(f'nrays: {radar.nrays} ngates: {radar.ngates}')
2386+
2387+
if radar is None:
2388+
return radar
22862389

22872390
rmin = None
22882391
rmax = None
@@ -2303,43 +2406,9 @@ def merge_scans_mfcfradial(basepath, scan_list, voltime, datatype_list,
23032406
if cfg['azmax'] is not None:
23042407
azmax = cfg['azmax'][ind_rad]
23052408

2306-
if len(scan_list) == 1:
2307-
if radar is None:
2308-
return radar
2309-
2310-
return pyart.util.subset_radar(
2311-
radar, radar.fields.keys(), rng_min=rmin, rng_max=rmax,
2312-
ele_min=elmin, ele_max=elmax, azi_min=azmin, azi_max=azmax)
2313-
2314-
# merge the elevations into a single radar instance
2315-
for scan in scan_list[1:]:
2316-
filenames = glob.glob(datapath + '*' + scan + '*')
2317-
filename = []
2318-
for filename_aux in filenames:
2319-
fdatetime = find_date_in_file_name(
2320-
filename_aux, date_format=fdate_strf)
2321-
if fdatetime == voltime:
2322-
filename = [filename_aux]
2323-
break
2324-
if not filename:
2325-
warn('No file found in ' + datapath)
2326-
else:
2327-
radar_aux = pyart.io.read_cfradial(
2328-
filename[0], field_names=field_names)
2329-
if radar_aux is None:
2330-
continue
2331-
2332-
if radar is None:
2333-
radar = radar_aux
2334-
else:
2335-
radar = pyart.util.radar_utils.join_radar(radar, radar_aux)
2336-
2337-
if radar is None:
2338-
return radar
2339-
23402409
return pyart.util.subset_radar(
2341-
radar, radar.fields.keys(), rng_min=rmin, rng_max=rmax,
2342-
ele_min=elmin, ele_max=elmax, azi_min=azmin, azi_max=azmax)
2410+
radar, radar.fields.keys(), rng_min=rmin, rng_max=rmax, ele_min=elmin,
2411+
ele_max=elmax, azi_min=azmin, azi_max=azmax)
23432412

23442413

23452414
def merge_scans_nexrad2(basepath, scan_list, radar_name, radar_res, voltime,

0 commit comments

Comments
 (0)