import argparse import configparser import logging import pathlib import matplotlib.pyplot as plt from matplotlib.ticker import MultipleLocator import numpy as np parser = argparse.ArgumentParser(description="Pre-process time-series") parser.add_argument("-v", "--verbose", action="count", default=0) parser.add_argument("-c", "--config", default="config.ini") args = parser.parse_args() logging.basicConfig(level=max((10, 20 - 10 * args.verbose))) log = logging.getLogger("bathy") log.info("Starting time-series pre-processing") config = configparser.ConfigParser() config.read(args.config) inp_root = pathlib.Path(config.get("inp", "root")) out_root = pathlib.Path(config.get("out", "root")) out_ts = out_root.joinpath("ts.dat") raw_ts = [] for tsi in config.get("inp", "raw_ts").split(","): raw_ts.append( np.loadtxt( inp_root.joinpath(tsi), dtype=[("state", int), ("z", float), ("y", float), ("x", float)], delimiter=",", max_rows=2304, ) ) n = len(raw_ts) raw_ts = np.concatenate(raw_ts) log.debug(f"{raw_ts=}") if (errs := np.count_nonzero(raw_ts["state"])) != 0: log.warning(f"{errs} transmission errors!") log.debug(f"{dict(zip(*np.unique(raw_ts['state'], return_counts=True)))}") t = np.linspace(0, 30 * 60 * n, 2304 * n + 1)[:-1] log.debug(f"{t=}") log.info(f"Saving timeseries to '{out_ts}'") np.savetxt(out_ts, np.stack((t, raw_ts["z"] / 100), axis=1)) fig, ax = plt.subplots(figsize=(8 / 2.54, 2 / 3 * 10 / 2.54), constrained_layout=True) tp = np.datetime64("2017-02-28T17:00:00") + t.astype(np.timedelta64)[-(t.size // 3) :] ax.plot( tp, raw_ts["z"][-(t.size // 3) :] * 1e-2, color="k", lw=1, ) ax.axvline( np.datetime64("2017-02-28T17:00:00") + np.timedelta64(23 * 60 + 8), color="k", alpha=0.1, lw=20, ) ax.autoscale(True, "x", True) ax.set(xlabel="t (s)", ylabel="z (m)") yabs_max = abs(max(ax.get_ylim(), key=abs)) ax.set(ylim=(-10, 10)) ax.set( xticks=( np.datetime64("2017-02-28T17:20:00"), np.datetime64("2017-02-28T17:25:00"), np.datetime64("2017-02-28T17:30:00"), ), xticklabels=( "17:20", "17:25", "17:30", ), ) ax.yaxis.set_minor_locator(MultipleLocator(1)) ax.grid(color="k", alpha=0.2) fig.savefig(out_root.joinpath("ts.pdf")) fig.savefig(out_root.joinpath("ts.jpg"), dpi=200)