Skip to content
Snippets Groups Projects
Commit 1885e2fb authored by Wernle, Alexandra Nicole's avatar Wernle, Alexandra Nicole
Browse files

Deleted field-work attribute and added Field_Work to categories. Deleted...

Deleted field-work attribute and added Field_Work to categories. Deleted source and added additional validators and class methods to ArtificialDisturbances.
parent 48852dd9
No related branches found
No related tags found
1 merge request!344New MetadataAlgorithm, SpikesAlgorithm, and flag-spikes application
from typing import Dict, Union, List, Optional
from datetime import timedelta
import numpy as np
from obspy import UTCDateTime
from pydantic import BaseModel, Field, validator
from enum import Enum
......@@ -11,6 +10,7 @@ class FlagCategory(str, Enum):
ARTIFICIAL_DISTURBANCE = "ARTIFICIAL_DISTURBANCE"
GAP = "GAP"
EVENT = "EVENT"
FIELD_WORK = "FIELD_WORK"
OTHER = "OTHER"
......@@ -23,30 +23,26 @@ class Flag(BaseModel):
automatic_flag = Metadata(
created_by='ex_algorithm',
start_time=UTCDateTime('2023-01-01T03:05:10'),
end_time=UTCDateTime('2023-01-01T03:05:11'),
end_time=UTCDateTime('2023-01-01T03:10:11'),
network='NT',
station='BOU',
channel='BEH',
category=MetadataCategory.FLAG,
comment="spike detected",
priority=1,
data_valid=False,
data_valid=True,
metadata= ArtificialDisturbance{
"description": "Spike in magnetic field strength",
"field_work": false,
"corrected": false,
"description": "Spikes in magnetic field strength",
"flag_category": ARTIFICIAL_DISTURBANCE,
"artificial_disturbance_type": ArtificialDisturbanceType.SPIKE,
"source": "Lightning",
"deviation": None,
"spikes": ['2023-01-01T03:05:10','2023-01-01T03:07:20','2023-01-01T03:10:11']
}
)
```
"""
description: str = Field(..., description="Description of the flag")
field_work: bool = Field(..., description="Flag signaling field work")
corrected: int = Field(..., description="Corrected ID for processing stage")
flag_category: FlagCategory = "OTHER"
......@@ -70,24 +66,56 @@ class ArtificialDisturbance(Flag):
----------
artificial_disturbance_type:ArtificialDisturbanceType
The type of artificial disturbance(s).
source: str
Source of the disturbance if known or suspected.
deviation: float
Deviation of an offset in nt.
spikes: np.ndarray
NumPy array of timestamps as UTCDateTime. Can be a single spike or many spikes.
spikes: List[UTCDateTime]
Array of timestamps as UTCDateTime. Can be a single spike or many spikes.
"""
artificial_disturbance_type: ArtificialDisturbanceType
deviation: Optional[float] = None
source: Optional[str] = None
spikes: Optional[np.ndarray] = None
spikes: Optional[List[UTCDateTime]] = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.flag_category = "ARTIFICIAL_DISTURBANCE"
@validator("spikes", always=True)
def validate_spikes(cls, spikes):
if len(spikes) == 0:
raise ValueError("Spikes list cannot be empty.")
return spikes
@validator("spikes", always=True)
def check_spikes_duration(cls, spikes):
if spikes is None or len(spikes) < 2:
return spikes
duration = spikes[-1] - spikes[0]
if duration > timedelta(days=1).total_seconds():
raise ValueError(
f"The duration between the first and last spike timestamp must not exceed 1 day. Duration: {duration} seconds"
)
return spikes
@classmethod
def check_spikes_match_times(cls, spikes, values):
metadata_starttime = values.get("starttime")
metadata_endtime = values.get("endtime")
if spikes[0] != metadata_starttime:
raise ValueError(
f"The first spike timestamp {spikes[0]} does not match the starttime {metadata_starttime}."
)
if spikes[-1] != metadata_endtime:
raise ValueError(
f"The last spike timestamp {spikes[-1]} does not match the endtime {metadata_endtime}."
)
class Gap(Flag):
"""
......@@ -145,37 +173,27 @@ class Event(Flag):
# More example usage:
timestamps_array = np.array(
[
UTCDateTime("2023-11-16T12:00:0"),
UTCDateTime("2023-11-16T12:01:10"),
UTCDateTime("2023-11-16T12:02:30"),
]
)
timestamps_array = [
UTCDateTime("2023-11-16T12:00:0"),
UTCDateTime("2023-11-16T12:01:10"),
UTCDateTime("2023-11-16T12:02:30"),
]
spikes_data = {
"starttime": "2023-11-16 12:00:00",
"endtime": "2023-11-16 12:02:30",
"description": "Spikes description",
"field_work": False,
"corrected": 32265,
"disturbance_type": ArtificialDisturbanceType.SPIKES,
"source": "processing",
"spikes": timestamps_array,
}
offset_data = {
"description": "Offset description",
"field_work": False,
"corrected": 47999,
"disturbance_type": ArtificialDisturbanceType.OFFSET,
"source": "Bin change",
"deviation": 10.0,
}
geomagnetic_storm_data = {
"description": "Geomagnetic storm",
"field_work": False,
"corrected": 36999,
"event_type": EventType.GEOMAGNETIC_STORM,
"scale": "G3",
"index": 7,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment