Source code for mth5.tables.tf_table

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 23 14:09:38 2022

@author: jpeacock
"""

# =============================================================================
# Imports
# =============================================================================
import pandas as pd
import numpy as np
import h5py

from mth5 import TF_DTYPE
from mth5.tables import MTH5Table
from mth5.helpers import validate_name

# =============================================================================


[docs]class TFSummaryTable(MTH5Table): """ Object to hold the channel summary and provide some convenience functions like fill, to_dataframe ... """ def __init__(self, hdf5_dataset): super().__init__(hdf5_dataset) self._dtype = TF_DTYPE
[docs] def to_dataframe(self): """ Create a pandas DataFrame from the table for easier querying. :return: Channel Summary :rtype: :class:`pandas.DataFrame` """ df = pd.DataFrame(self.array[()]) for key in [ "station", "survey", "tf_id", "units", ]: setattr(df, key, getattr(df, key).str.decode("utf-8")) return df
[docs] def summarize(self): """ :return: DESCRIPTION :rtype: TYPE """ self.clear_table() def recursive_get_tf_entry(group): """ a function to get tf entry, hopefully this is faster than looping and getting the correct group object. """ if isinstance(group, (h5py._hl.group.Group, h5py._hl.files.File)): for key, node in group.items(): try: group_type = node.attrs["mth5_type"].lower() if group_type == "transferfunction": has_impedance = False has_tipper = False has_covariance = False if "transfer_function" in node.keys(): tf_dataset = node["transfer_function"] if tf_dataset != (1, 1, 1): nz = np.nonzero(tf_dataset) unique_values = np.unique(nz[1]) if 0 in unique_values or 1 in unique_values: has_impedance = True if 2 in unique_values: has_tipper = True if ( "residual_covariance" in node.keys() and "inverse_signal_power" in node.keys() ): res = node["residual_covariance"] isp = node["inverse_signal_power"] if res.shape != (1, 1, 1) and isp.shape != (1, 1, 1): has_covariance = True if "period" in node.keys(): period = node["period"][()] else: period = np.zeros(2) tf_entry = np.array( [ ( validate_name(node.parent.parent.attrs["id"]), validate_name( node.parent.parent.parent.parent.attrs["id"] ), node.parent.parent.attrs["location.latitude"], node.parent.parent.attrs["location.longitude"], node.parent.parent.attrs["location.elevation"], validate_name(node.attrs["id"]), node.attrs["units"], has_impedance, has_tipper, has_covariance, period.min(), period.max(), node.ref, node.parent.parent.ref, ) ], dtype=TF_DTYPE, ) self.add_row(tf_entry) else: recursive_get_tf_entry(node) except KeyError: recursive_get_tf_entry(node) elif isinstance(group, h5py._hl.dataset.Dataset): pass recursive_get_tf_entry(self.array.parent)