Source code for seed_vault.service.events

"""
The events service should get the events based on a selection (filter) settings.
UI should generate the selection and pass it here. We need a single function
here that gets the selection and runs Rob's script.

We should also be able to support multi-select areas.

@TODO: For now, dummy scripts are used. @Yunlong to fix.
"""

import pandas as pd
import streamlit as st
import requests


from obspy.core.event import Catalog

from seed_vault.models.config import SeismoLoaderSettings
from seed_vault.service.seismoloader import get_events


# @st.cache_data
# def get_event_data(settings_json_str: str):

#     settings = SeismoLoaderSettings.model_validate_json(settings_json_str)
#     return get_events(settings)


[docs] def remove_duplicate_events(events): unique_resource_ids = set() unique_events = Catalog() for event in events: resource_id = event.resource_id.id #the .id makes it a string if resource_id not in unique_resource_ids: unique_resource_ids.add(resource_id) unique_events.append(event) return unique_events
# @st.cache_data
[docs] def get_event_data(settings: SeismoLoaderSettings): return remove_duplicate_events(get_events(settings))
[docs] def event_response_to_df(data): """ @TODO: base on response from FSDN, below should be re-written """ records = [] for event in data: # Extract the preferred origin (location info) origin = event.preferred_origin() or event.origins[0] magnitude = event.preferred_magnitude() or event.magnitudes[0] # Extract location (longitude, latitude, depth) longitude = origin.longitude latitude = origin.latitude depth = origin.depth / 1000 if origin.depth is not None else 0.99999 # Convert depth to kilometers # Extract the time and place time = origin.time.datetime place = event.event_descriptions[0].text if event.event_descriptions else "Unknown place" # Extract the magnitude mag = magnitude.mag if magnitude.mag is not None else 0.99999 mag_type = magnitude.magnitude_type if magnitude.magnitude_type is not None else "[-]" # Create the record dictionary record = { 'place': place, 'magnitude': mag, 'magnitude type': mag_type, 'time': pd.to_datetime(time), # Convert to pandas datetime 'longitude': longitude, 'latitude': latitude, 'depth (km)': depth, # in kilometers } records.append(record) return pd.DataFrame(records)