@@ -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
23452414def merge_scans_nexrad2 (basepath , scan_list , radar_name , radar_res , voltime ,
0 commit comments