def get_precipitation_fields( num_prev_files=0, num_next_files=0, return_raw=False, metadata=False, upscale=None, source="mch", log_transform=True, clip=None, **importer_kwargs, ): """ Get a precipitation field from the archive to be used as reference. Source: bom Reference time: 2018/06/16 10000 UTC Source: fmi Reference time: 2016/09/28 1600 UTC Source: knmi Reference time: 2010/08/26 0000 UTC Source: mch Reference time: 2015/05/15 1630 UTC Source: opera Reference time: 2018/08/24 1800 UTC Source: saf Reference time: 2018/06/01 0700 UTC Source: mrms Reference time: 2019/06/10 0000 UTC Parameters ---------- num_prev_files: int, optional Number of previous times (files) to return with respect to the reference time. num_next_files: int, optional Number of future times (files) to return with respect to the reference time. return_raw: bool, optional Do not preprocess the precipitation fields. False by default. The pre-processing steps are: 1) Convert to mm/h, 2) Mask invalid values, 3) Log-transform the data [dBR]. metadata: bool, optional If True, also return file metadata. clip: scalars (left, right, bottom, top), optional The extent of the bounding box in data coordinates to be used to clip the data. upscale: float or None, optional Upscale fields in space during the pre-processing steps. If it is None, the precipitation field is not modified. If it is a float, represents the length of the space window that is used to upscale the fields. source: {"bom", "fmi" , "knmi", "mch", "opera", "saf", "mrms"}, optional Name of the data source to be used. log_transform: bool Whether to transform the output to dB. Other Parameters ---------------- importer_kwargs : dict Additional keyword arguments passed to the importer. Returns ------- reference_field : array metadata : dict """ if source == "bom": pytest.importorskip("netCDF4") if source == "fmi": pytest.importorskip("pyproj") if source == "knmi": pytest.importorskip("h5py") if source == "mch": pytest.importorskip("PIL") if source == "opera": pytest.importorskip("h5py") if source == "saf": pytest.importorskip("netCDF4") if source == "mrms": pytest.importorskip("pygrib") try: date = _reference_dates[source] except KeyError: raise ValueError(f"Unknown source name '{source}'\n" "The available data sources are: " f"{str(list(_reference_dates.keys()))}") data_source = rcparams.data_sources[source] root_path = data_source["root_path"] path_fmt = data_source["path_fmt"] fn_pattern = data_source["fn_pattern"] fn_ext = data_source["fn_ext"] importer_name = data_source["importer"] _importer_kwargs = data_source["importer_kwargs"].copy() _importer_kwargs.update(**importer_kwargs) timestep = data_source["timestep"] # Find the input files from the archive fns = io.archive.find_by_date( date, root_path, path_fmt, fn_pattern, fn_ext, timestep=timestep, num_prev_files=num_prev_files, num_next_files=num_next_files, ) # Read the radar composites importer = io.get_method(importer_name, "importer") reference_field, __, ref_metadata = io.read_timeseries( fns, importer, **_importer_kwargs) if not return_raw: if (num_prev_files == 0) and (num_next_files == 0): # Remove time dimension reference_field = np.squeeze(reference_field) # Convert to mm/h reference_field, ref_metadata = stp.utils.to_rainrate( reference_field, ref_metadata) # Clip domain reference_field, ref_metadata = stp.utils.clip_domain( reference_field, ref_metadata, clip) # Upscale data reference_field, ref_metadata = aggregate_fields_space( reference_field, ref_metadata, upscale) # Mask invalid values reference_field = np.ma.masked_invalid(reference_field) if log_transform: # Log-transform the data [dBR] reference_field, ref_metadata = stp.utils.dB_transform( reference_field, ref_metadata, threshold=0.1, zerovalue=-15.0) # Set missing values with the fill value np.ma.set_fill_value(reference_field, -15.0) reference_field.data[reference_field.mask] = -15.0 if metadata: return reference_field, ref_metadata return reference_field
importer_kwargs = data_source["importer_kwargs"] timestep = data_source["timestep"] # Find the input files from the archive fns = io.archive.find_by_date( date, root_path, path_fmt, fn_pattern, fn_ext, timestep=5, num_next_files=35, ) # Read the radar composites importer = io.get_method(importer_name, "importer") R, __, metadata = io.read_timeseries(fns, importer, **importer_kwargs) # Convert to mm/h R, metadata = conversion.to_rainrate(R, metadata) # Upscale to 2 km (simply to reduce the memory demand) R, metadata = dimension.aggregate_fields_space(R, metadata, 2000) # Keep only one frame every 10 minutes (i.e., every 2 timesteps) # (to highlight the need for advection correction) R = R[::2] ################################################################################ # Advection correction # --------------------
source = "".join([i for i in case if not i.isdigit()]) data_source = pysteps.rcparams.data_sources[source] # Find the input files from the archive file_names = io.archive.find_by_date( case_date, data_source["root_path"], data_source["path_fmt"], data_source["fn_pattern"], data_source["fn_ext"], data_source["timestep"], num_prev_files=0, num_next_files=frames - 1, ) if None in file_names[0]: raise FileNotFoundError(f"Error loading {case} case. Some files are missing.") # Read the radar composites importer = io.get_method(data_source["importer"], "importer") importer_kwargs = data_source["importer_kwargs"] reflectivity, _, metadata = io.read_timeseries( file_names, importer, **importer_kwargs ) # Convert to rain rate precip, metadata = conversion.to_rainrate(reflectivity, metadata) return precip, metadata, data_source["timestep"]
fn_ext = radar_data_source["fn_ext"] importer_name = radar_data_source["importer"] importer_kwargs = radar_data_source["importer_kwargs"] timestep = 10.0 # Find the radar files in the archive fns = io.find_by_date(date_radar, root_path, path_fmt, fn_pattern, fn_ext, timestep, num_prev_files=2) # Read the radar composites importer = io.get_method(importer_name, "importer") radar_precip, _, radar_metadata = io.read_timeseries(fns, importer, **importer_kwargs) # Import the NWP data filename = os.path.join( nwp_data_source["root_path"], datetime.strftime(date_nwp, nwp_data_source["path_fmt"]), datetime.strftime(date_nwp, nwp_data_source["fn_pattern"]) + "." + nwp_data_source["fn_ext"], ) nwp_importer = io.get_method("bom_nwp", "importer") nwp_precip, _, nwp_metadata = nwp_importer(filename) # Only keep the NWP forecasts from the last radar observation time (2020-10-31 04:00)
def get_precipitation_fields(num_prev_files=0, num_next_files=0, return_raw=False, metadata=False, upscale=None): """ Get a precipitation field from the archive to be used as reference. Source: mch Reference time: 2015/05/15 1630 UTC Parameters ---------- num_prev_files: int Number of previous times (files) to return with respect to the reference time. num_next_files: int Number of future times (files) to return with respect to the reference time. return_raw: bool Do not preprocess the precipitation fields. False by default. The pre-processing steps are: 1) Convert to mm/h, 2) Mask invalid values, 3) Log-transform the data [dBR]. metadata : bool If True, also return file metadata. upscale: float or None Upscale fields in space during the pre-processing steps. If it is None, the precipitation field is not modified. If it is a float, represents the length of the space window that is used to upscale the fields. Returns ------- reference_field : array metadata : dict """ pytest.importorskip('PIL') # Selected case date = datetime.strptime("201505151630", "%Y%m%d%H%M") data_source = rcparams.data_sources["mch"] root_path = data_source["root_path"] path_fmt = data_source["path_fmt"] fn_pattern = data_source["fn_pattern"] fn_ext = data_source["fn_ext"] importer_name = data_source["importer"] importer_kwargs = data_source["importer_kwargs"] timestep = data_source["timestep"] # Find the input files from the archive fns = io.archive.find_by_date(date, root_path, path_fmt, fn_pattern, fn_ext, timestep=timestep, num_prev_files=num_prev_files, num_next_files=num_next_files) # Read the radar composites importer = io.get_method(importer_name, "importer") reference_field, __, ref_metadata = io.read_timeseries(fns, importer, **importer_kwargs) if not return_raw: if (num_prev_files == 0) and (num_next_files == 0): # Remove time dimension reference_field = np.squeeze(reference_field) # Convert to mm/h reference_field, ref_metadata = stp.utils.to_rainrate(reference_field, ref_metadata) # Upscale data to 2 km reference_field, ref_metadata = aggregate_fields_space(reference_field, ref_metadata, upscale) # Mask invalid values reference_field = np.ma.masked_invalid(reference_field) # Log-transform the data [dBR] reference_field, ref_metadata = stp.utils.dB_transform(reference_field, ref_metadata, threshold=0.1, zerovalue=-15.0) # Set missing values with the fill value reference_field.data[reference_field.mask] = -15.0 if metadata: return reference_field, ref_metadata return reference_field