Source code for kuibit.cactus_twopunctures
#!/usr/bin/env python3
# Copyright (C) 2022-2023 Gabriele Bozzola
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <https://www.gnu.org/licenses/>.
"""The :py:mod:`~.cactus_twopunctures` module reads the metadata output by TwoPunctures.
The module is rather straightforward and has only one dictionary-like object
that reads the ``TwoPunctures.bbh`` file created by ``TwoPunctures``.
"""
from __future__ import annotations
import configparser
from collections.abc import KeysView
from typing import Union
[docs]class TwoPuncturesDir:
"""Read and process metadata from TwoPunctures.
This object represents the metadata read from `TwoPunctures.bbh` as a
dictionary.
"""
def __init__(self, sd) -> None:
"""Read and process the `TwoPunctures.bbh` file, if in the SimDir."""
# This is where we store the output
self._metadata = None
_metadata_files = [
path for path in sd.allfiles if path.endswith("TwoPunctures.bbh")
]
if _metadata_files:
if len(_metadata_files) > 1:
raise RuntimeError(
f"Multiple TwoPunctures.bbh found: {_metadata_files}"
)
# We have only one TwoPunctures.bbh
#
# The structure of the file is essentially a .ini file, so we can
# read it with configparser
data = configparser.ConfigParser()
data.read(*_metadata_files)
def try_convert(what: Union[str, float]) -> Union[str, float]:
# Convert what to a float if it makes sense
try:
ret = float(what)
except ValueError:
ret = what
return ret
self._metadata = {
k: try_convert(v) for k, v in data["metadata"].items()
}
@property
def has_metadata(self) -> bool:
"""Was a TwoPunctures.bbh file found and read?"""
return self._metadata is not None
def __getitem__(self, key: str) -> Union[str, float]:
if self.has_metadata:
# Everything is stored lowercase
key_l = key.lower()
if key_l in self._metadata:
return self._metadata[key_l]
raise KeyError(f"{key} is not a metadata for TwoPunctures")
raise RuntimeError("Metadata not available")
def keys(self) -> KeysView:
if self.has_metadata:
return self._metadata.keys()
return {}.keys()