diff --git a/python/catalog/find_catalog_column.py b/python/catalog/find_catalog_column.py new file mode 100644 index 0000000..a1dcd40 --- /dev/null +++ b/python/catalog/find_catalog_column.py @@ -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.') \ No newline at end of file diff --git a/python/catalog/sort_by_time.py b/python/catalog/sort_by_time.py new file mode 100644 index 0000000..0af065c --- /dev/null +++ b/python/catalog/sort_by_time.py @@ -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. + + 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 \ No newline at end of file diff --git a/python/catalog/sort_by_time_standalone.py b/python/catalog/sort_by_time_standalone.py new file mode 100644 index 0000000..25508a6 --- /dev/null +++ b/python/catalog/sort_by_time_standalone.py @@ -0,0 +1,50 @@ +# ----------------- +# 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 + +def sort_by_time(catalog): + """ + Sorts the given catalog based on the 'Time' column. + + 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 = None + for idx, col in enumerate(catalog): + if col['field'] == "Time": + time_col_index = idx + + if time_col_index is None: + raise ValueError("No 'Time' field found in the catalog.") + + 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 \ No newline at end of file