Note
Go to the end to download the full example code.
CSVs to SATURN .UFM Files#
Example code showing how to use caf.mat for converting CSVs to SATURN .UFM files.
##### IMPORTS #####
# Built-Ins
import argparse
import logging
import pathlib
# Third Party
import caf.toolkit as ctk
# Local Imports
from caf.mat.ufm import CSVFormat, UFMConverter
##### CONSTANTS #####
_NAME = "caf.mat.ufm_to_csv"
LOG = logging.getLogger(_NAME)
##### CLASSES & FUNCTIONS #####
def parse_args() -> tuple[pathlib.Path, pathlib.Path]:
"""Parse command-line arguments and return them
Returns
-------
pathlib.Path
Path to SATURN folder containing batch files.
pathlib.Path
Folder containing CSV matrices for conversion.
"""
parser = argparse.ArgumentParser(
description="Converts CSVs to SATURN UFM files.",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument("saturn_path", help="Path to SATURN folder", type=pathlib.Path)
parser.add_argument(
"matrix_folder",
help="Folder containing CSVs for conversion",
type=pathlib.Path,
)
args = parser.parse_args()
return args.saturn_path, args.matrix_folder
def main() -> None:
"""Convert CSVs to SATURN UFMs."""
saturn_path, matrix_folder = parse_args()
if not matrix_folder.is_dir():
raise NotADirectoryError(matrix_folder)
output_folder = matrix_folder / "UFMs"
output_folder.mkdir(exist_ok=True)
log_file = output_folder / f"{_NAME}.log"
details = ctk.ToolDetails(_NAME, "0.1.0")
with ctk.LogHelper("caf.mat", details, log_file=log_file):
converter = UFMConverter(saturn_path)
# Find all CSV files inside given folder and convert each to UFMs separately
matrices = list(matrix_folder.glob("*.csv"))
for i, path in enumerate(matrices, start=1):
LOG.info("Converting CSV %s: %s", i, path)
matrix = ctk.io.read_csv_matrix(path, format_="square")
# Write CSV in format expected by converter
csv_path = output_folder / f"{path.stem}-square.csv"
matrix.to_csv(csv_path, index=True, header=False, float_format="%.8f")
LOG.debug("Written CSV in SATURNs square format to: %s", csv_path)
ufm_path = converter.csv_to_ufm(csv_path, CSVFormat.SQUARE)
LOG.info("Written UFM: %s", ufm_path)
LOG.info("Done %s / %s (%s)", i, len(matrices), f"{i / len(matrices):.0%}")
if __name__ == "__main__":
main()