Source code for polyfemos.back.seismic.edlogreader
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# This file is part of Polyfemos.
#
# Polyfemos is free software: you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by the Free
# Software Foundation, either version 3 of the License, or any later version.
#
# Polyfemos 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 Lesser General Public License for more
# details.
#
# You should have received a copy of the GNU Lesser General Public License and
# GNU General Public License along with Polyfemos. If not, see
# <https://www.gnu.org/licenses/>.'
#
# Author: Henrik Jänkävaara
# -----------------------------------------------------------------------------
r"""
Reads Earth Data LOG files
Includes :func:`~polyfemos.back.seismic.edlogreader.get_data` function for
extracting data from Earth Data LOG files
Extracts 1 datapoint per day (this is everthing that is available).
Other state of health parameters are available as MSEED files containing
continuous data.
Parameters available using :func:`~polyfemos.back.seismic.edlogreader.get_data`
``key`` in parentheses
- latitude (lat)
- longitude (long)
- date (date), a string containing year, month and day
- time (time), a string containing hour, minute and second
- heading (hdng) *
- magnetic variation (mva) *
- velocity (vel) *
- 16 bit phase error in 1 second pll (plle) **
| * Are these important? Do they contain any useful information?
| ** Also available as MSEED so better to use that
:copyright:
2019, University of Oulu, Sodankyla Geophysical Observatory
:license:
GNU Lesser General Public License v3.0 or later
(https://spdx.org/licenses/LGPL-3.0-or-later.html)
"""
from polyfemos.parser import typeoperator as to
from polyfemos.util import fileutils
[docs]def _ed_log_replacer(str_):
"""
The function is used to replace some string in the Earth Data LOG file
to their respective ``key`` names
:type str\_: str
:param str\_:
:rtype: str
:return: A string with some values replaced
"""
rlist = [
[r"\x00", ""],
[":", ""],
["latitude", "lat"],
["longitude", "long"],
["heading", "hdng"],
["velocity", "vel"],
["magnetic variation", "mva"],
["16 bit phase error in 1 second pll", "plle"],
]
for r in rlist:
str_ = str_.replace(*r)
return str_
[docs]def _ed_log_get_value_from_rows(rows, key):
"""
Searches for ``key`` in rows
If the ``key`` is found, returns the value to the 'right' of the key
:type rows: list
:param rows: list of lists of strings
:type key: str
:param key:
:rtype: None, str
:return: Value corresponding to the key or ``None``
if the key is not found in ``rows``
"""
for row in rows:
if key not in row:
continue
# Look for key, index=i
# then try to return value next to it, (i+1)
i = row.index(key) + 1
if i >= len(row):
continue
return row[i]
return None
[docs]def _ed_log_valid_row(row):
"""
Used to filter out rows which does not contain desired information
:type row: list
:param row:
:rtype: bool
:return:
"""
if "GPS" in row:
return True
if "plle" in row:
return True
return False
[docs]def _ed_log_parse_row(row):
"""
Converts a (binary) string ``row`` to list
:type row: str
:param row: (binary) string
:rtype: list
:return: A modified ``row``
"""
row = row.strip()
row = str(row)
row = row.strip("'")
row = _ed_log_replacer(row)
row = [r for r in row.split() if r]
return row
[docs]@fileutils.check_filepath
def get_data(path="", key="", scale=lambda x: x):
"""
:type path: str
:param path: filename of the Earth Data LOG file
:type key: str
:param key: A value to be extracted
:rtype: float or None
:return: A single float value read from ED log file,
If somenthing went wrong (e.g. the path was invalid), return ``None``.
"""
rows = fileutils.read_file(path, mode="rb")
# Convert every row into a list
rows = (_ed_log_parse_row(row) for row in rows)
# Filter out unnecessary rows
rows = [row for row in rows if _ed_log_valid_row(row)]
value = _ed_log_get_value_from_rows(rows, key)
value = to.float_(value)
if value is None:
return None
return scale(value)