Source code for oasislmf.pytools.converters.bintocsv.utils.cdf

#!/usr/bin/env python

import logging
import numpy as np
from pathlib import Path

from oasislmf.pytools.common.data import resolve_file, write_ndarray_to_fmt_csv, items_dtype
from oasislmf.pytools.common.input_files import read_coverages
from oasislmf.pytools.converters.data import TOOL_INFO
from oasislmf.pytools.gul.common import coverage_type
from oasislmf.pytools.gul.manager import generate_item_map, gul_get_items, read_getmodel_stream

[docs] logger = logging.getLogger(__name__)
[docs] def get_cdf_data(event_id, damagecdfrecs, recs, rec_idx_ptr, cdf_dtype): """Get the cdf data produced by getmodel. Note that the input arrays are lists of cdf entries, namely the shape on axis=0 is the number of entries. Args: event_id (int): event_id damagecdfrecs (ndarray[damagecdfrec]): cdf record keys recs (ndarray[ProbMean]): cdf record values rec_idx_ptr (ndarray[int]): array with the indices of `rec` where each cdf record starts. cdf_dtype (np.dtype): cdf numpy dtype. Returns: data (ndarray[cdf_dtype]): cdf data extracted from recs/getmodel. """ assert len(damagecdfrecs) == len(rec_idx_ptr) - 1, "Number of cdfrecs groups does not match number of cdf keys found" data = np.zeros(len(recs), dtype=cdf_dtype) Nbins = len(rec_idx_ptr) - 1 idx = 0 for group_idx in range(Nbins): areaperil_id, vulnerability_id = damagecdfrecs[group_idx] for bin_index, rec in enumerate(recs[rec_idx_ptr[group_idx]:rec_idx_ptr[group_idx + 1]]): data[idx]["event_id"] = event_id data[idx]["areaperil_id"] = areaperil_id data[idx]["vulnerability_id"] = vulnerability_id data[idx]["bin_index"] = bin_index + 1 data[idx]["prob_to"] = rec["prob_to"] data[idx]["bin_mean"] = rec["bin_mean"] idx += 1 return data
[docs] def cdf_tocsv(stack, file_in, file_out, file_type, noheader, run_dir): headers = TOOL_INFO[file_type]["headers"] dtype = TOOL_INFO[file_type]["dtype"] fmt = TOOL_INFO[file_type]["fmt"] input_path = Path(run_dir, 'input') file_in = resolve_file(file_in, "rb", stack) if not noheader: file_out.write(",".join(headers) + "\n") items = gul_get_items(input_path) coverages_tiv = read_coverages(input_path) coverages = np.zeros(coverages_tiv.shape[0] + 1, coverage_type) coverages[1:]['tiv'] = coverages_tiv item_map = generate_item_map(items, coverages) del coverages_tiv compute = np.zeros(coverages.shape[0] + 1, items.dtype['coverage_id']) seeds = np.zeros(len(np.unique(items['group_id'])), dtype=items_dtype['group_id']) valid_area_peril_id = None for event_data in read_getmodel_stream(file_in, item_map, coverages, compute, seeds, valid_area_peril_id): event_id, compute_i, items_data, damagecdfrecs, recs, rec_idx_ptr, rng_index = event_data data = get_cdf_data(event_id, damagecdfrecs, recs, rec_idx_ptr, dtype) write_ndarray_to_fmt_csv(file_out, data, headers, fmt)