11 Commits

5 changed files with 103 additions and 12 deletions

View File

@@ -63,7 +63,11 @@ classdef base_logger < handle
methods(Access=private) methods(Access=private)
function this = base_logger() function this = base_logger()
this.fid = fopen(getenv("APP_LOG_FILE"), 'a'); logFileName = getenv("APP_LOG_FILE");
if isempty(logFileName)
logFileName = 'base-logger-log.log';
end
this.fid = fopen(logFileName, 'a');
if this.fid == -1 if this.fid == -1
error('Failed to open log file'); error('Failed to open log file');
end end

View File

@@ -63,7 +63,11 @@ classdef base_logger < handle
methods methods
function this = base_logger() function this = base_logger()
this.fid = fopen(getenv("APP_LOG_FILE"), 'a'); logFileName = getenv("APP_LOG_FILE");
if isempty(logFileName)
logFileName = 'base-logger-log.log';
end
this.fid = fopen(logFileName, 'a');
if this.fid == -1 if this.fid == -1
error('Failed to open log file'); error('Failed to open log file');
end end

View File

@@ -0,0 +1,36 @@
# -----------------
# Copyright © 2024 ACK Cyfronet AGH, Poland.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This work was partially funded by DT-GEO Project.
# -----------------
def find_catalog_column(catalog, field_name):
"""
Finds the index of a column in the catalog based on its field name.
Parameters:
catalog (np.ndarray): A structured NumPy array representing a catalog in EPISODES Platform format:
https://docs.cyfronet.pl/display/ISDOC/Catalogs
field_name (str): The field name of the entry to search for.
Returns:
int: The index of the entry matching the given field name.
Raises:
ValueError: If the specified field name is not found in the catalog.
"""
for idx, col in enumerate(catalog):
if col['field'] == field_name:
return idx
raise ValueError(f'No {field_name} field found in the catalog.')

View File

@@ -0,0 +1,44 @@
# -----------------
# Copyright © 2024 ACK Cyfronet AGH, Poland.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This work was partially funded by DT-GEO Project.
# -----------------
import numpy as np
from find_catalog_column import find_catalog_column
def sort_by_time(catalog):
"""
Sorts the given catalog based on the 'Time' column. Requires find_catalog_column script to work.
Parameters:
catalog (np.ndarray): A structured NumPy array representing a seismic catalog in EPISODES Platform format:
https://docs.cyfronet.pl/display/ISDOC/Seismic+catalog
Returns:
np.ndarray: The sorted catalog, where rows in 'val' fields are ordered by ascending 'Time' values.
Raises:
ValueError: If the 'Time' column is not found in the catalog.
"""
time_col_index = find_catalog_column(catalog, 'Time')
time_values = catalog[time_col_index]['val'].flatten()
sorted_indexes = np.argsort(time_values)
sorted_catalog = catalog.copy()
for field in sorted_catalog:
field['val'] = field['val'][sorted_indexes]
return sorted_catalog

View File

@@ -11,8 +11,10 @@ def getDefaultLogger(name):
Retrieves or creates a logger with the specified name and sets it up with a file handler. Retrieves or creates a logger with the specified name and sets it up with a file handler.
The logger is configured to write log messages to the file path specified by the The logger is configured to write log messages to the file path specified by the
'DEFAULT_LOG_PATH' environment variable. It uses the 'INFO' level as the default 'APP_LOG_FILE' environment variable. If the environment variable is not set,
logging level and writes log entries in the following format: the logger will write to the file 'base-logger-log.log' in the current
working directory. The logger uses the 'INFO' level as the default logging level
and writes log entries in the following format:
'YYYY-MM-DD HH:MM:SS,ms LEVEL logger_name message' 'YYYY-MM-DD HH:MM:SS,ms LEVEL logger_name message'
@@ -30,13 +32,9 @@ def getDefaultLogger(name):
-------- --------
logger : logging.Logger logger : logging.Logger
A logger instance with the specified name. The logger is configured with a A logger instance with the specified name. The logger is configured with a
file handler that writes to the file specified by the 'DEFAULT_LOG_PATH' file handler that writes to the file specified by the 'APP_LOG_FILE'
environment variable. environment variable, or to 'base-logger-log.log' if the environment
variable is not set.
Raises:
-------
KeyError:
If the 'DEFAULT_LOG_PATH' environment variable is not set.
Example: Example:
-------- --------
@@ -47,10 +45,15 @@ def getDefaultLogger(name):
except Exception: except Exception:
logger.exception('An error occurred') logger.exception('An error occurred')
Notes:
------
- The 'APP_LOG_FILE' environment variable should specify the full path to the log file.
- If 'APP_LOG_FILE' is not set, logs will be written to 'base-logger-log.log'.
""" """
logger = logging.getLogger(name) logger = logging.getLogger(name)
if not logger.hasHandlers(): if not logger.hasHandlers():
file_handler = logging.FileHandler(os.environ['APP_LOG_FILE'], mode='a') file_handler = logging.FileHandler(os.environ.get('APP_LOG_FILE', 'base-logger-log.log'), mode='a')
formatter = logging.Formatter('%(asctime)s,%(msecs)d %(levelname)s %(name)s %(message)s') formatter = logging.Formatter('%(asctime)s,%(msecs)d %(levelname)s %(name)s %(message)s')
file_handler.setFormatter(formatter) file_handler.setFormatter(formatter)
logger.addHandler(file_handler) logger.addHandler(file_handler)