Skip to content

Metadata

el_paso.variable.VariableMetadata dataclass

A class holding the metadata of a variable.

Attributes:

Name Type Description
unit UnitBase

The unit of the variable. Defaults to u.dimensionless_unscaled.

original_cadence_seconds float

The original cadence of the data in seconds. Defaults to 0.

source_files list[str]

The list of SourceFiles, which variable contains data from. Defaults to an empty list.

description str

The description of the variable explaining what kind of data this variable contains. Defaults to "".

processing_notes str

The processing notes of the variable explaining all steps done to achieve the final result. Defaults to "".

standard_name str

The name of the standard variable this variable complies to. Defaults to "".

Source code in el_paso/variable.py
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
@dataclass
class VariableMetadata:
    """A class holding the metadata of a variable.

    Attributes:
        unit (u.UnitBase): The unit of the variable. Defaults to
            `u.dimensionless_unscaled`.
        original_cadence_seconds (float): The original cadence of the data in seconds.
            Defaults to 0.
        source_files (list[str]): The list of SourceFiles, which variable contains
            data from. Defaults to an empty list.
        description (str): The description of the variable explaining what kind of data
            this variable contains. Defaults to "".
        processing_notes (str): The processing notes of the variable explaining all
            steps done to achieve the final result. Defaults to "".
        standard_name (str): The name of the standard variable this variable complies
            to. Defaults to "".
    """

    unit: u.UnitBase = u.dimensionless_unscaled
    original_cadence_seconds: float = 0
    source_files: list[str] = field(default_factory=list[str])
    description: str = ""
    processing_notes: str = ""
    standard_name: str = ""

    def __post_init__(self) -> None:
        """Initializes the processing_steps_counter attribute to 1 after the dataclass has been instantiated.

        This method is automatically called by the dataclass after the __init__ method.
        """
        self.processing_steps_counter = 1

        if ep.is_in_release_mode():
            self.processing_notes += ep.get_release_msg() + "\n"

    def add_processing_note(self, processing_note: str) -> None:
        """Adds a processing note to the metadata.

        The note is prefixed with the current processing steps counter and a newline
        character is appended. The processing steps counter is then incremented.

        Args:
            processing_note (str): The note to be added to the processing notes.
        """
        processing_note = f"{self.processing_steps_counter}) {processing_note}\n"

        self.processing_notes += processing_note
        self.processing_steps_counter += 1

Methods:

el_paso.variable.VariableMetadata.add_processing_note

add_processing_note

Adds a processing note to the metadata.

The note is prefixed with the current processing steps counter and a newline character is appended. The processing steps counter is then incremented.

Parameters:

Name Type Description Default
processing_note str

The note to be added to the processing notes.

required
Source code in el_paso/variable.py
61
62
63
64
65
66
67
68
69
70
71
72
73
def add_processing_note(self, processing_note: str) -> None:
    """Adds a processing note to the metadata.

    The note is prefixed with the current processing steps counter and a newline
    character is appended. The processing steps counter is then incremented.

    Args:
        processing_note (str): The note to be added to the processing notes.
    """
    processing_note = f"{self.processing_steps_counter}) {processing_note}\n"

    self.processing_notes += processing_note
    self.processing_steps_counter += 1

el_paso.dataset.metadata.DatasetMetadata

Attribute-accessible metadata container for a DataSet.

Source code in el_paso/dataset/metadata.py
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
class DatasetMetadata:
    """Attribute-accessible metadata container for a DataSet."""

    def __init__(self, dataset: DataSet | None = None) -> None:
        """Create a metadata namespace bound to a dataset."""
        self._dataset = dataset

    def _coerce_metadata(self, value: object) -> VariableMetadata | object:
        if isinstance(value, VariableMetadata):
            return value

        if isinstance(value, dict):
            metadata_dict = cast("dict[str, Any]", value)

            unit_value = metadata_dict.get("unit", u.dimensionless_unscaled)
            if isinstance(unit_value, str) and unit_value not in {"", "unknown"}:
                try:
                    unit_value = u.Unit(unit_value)
                except Exception:  # noqa: BLE001
                    unit_value = u.dimensionless_unscaled

            metadata = VariableMetadata(
                unit=unit_value if isinstance(unit_value, u.UnitBase) else u.dimensionless_unscaled,
                original_cadence_seconds=metadata_dict.get("original_cadence_seconds", 0),
                source_files=metadata_dict.get("source_files", []),
                description=metadata_dict.get("description", ""),
                processing_notes=metadata_dict.get("processing_notes", ""),
                standard_name=metadata_dict.get("standard_name", ""),
            )

            for key, attr_value in metadata_dict.items():
                if hasattr(metadata, key):
                    continue
                setattr(metadata, key, attr_value)

            return metadata

        return value

    def __getattr__(self, name: str) -> VariableMetadata | object:
        if name.startswith("_"):
            msg = f"'{self.__class__.__name__}' object has no attribute '{name}'"
            raise AttributeError(msg)

        if name in self.__dict__:
            return self.__dict__[name]

        dataset = self._dataset

        if dataset is not None:
            # Valid variable name
            if name in dataset.possible_variables:
                currently_loading = dataset.__dict__.get("_currently_loading", set())

                if name not in currently_loading:
                    dataset._load_variable(name)

                    if name in self.__dict__:
                        return self.__dict__[name]
                if name == "datetime":
                    epoch_standard = dataset.saving_strategy.data_standard.get_standard_name("Epoch")
                    epoch_meta = cast("VariableMetadata", self.__dict__.get(epoch_standard))
                    # Create a separate metadata object for `datetime` so we do not modify the original Epoch metadata
                    if epoch_meta is not None:
                        datetime_meta = VariableMetadata(
                            unit=epoch_meta.unit,
                            original_cadence_seconds=epoch_meta.original_cadence_seconds,
                            source_files=list(epoch_meta.source_files),
                            description=(
                                "Python datetime objects converted from Epoch variable. "
                                "This variable is not saved to disk but computed on the fly when requested."
                            ),
                            processing_notes=epoch_meta.processing_notes,
                            standard_name=epoch_meta.standard_name,
                        )

                        datetime_meta.add_processing_note("Computed datetime from Epoch.")

                        object.__setattr__(self, "datetime", datetime_meta)
                        return datetime_meta

                # Valid variable but no metadata found
                return {}

            # Invalid variable name
            _, levenstein_info = dataset.find_similar_variable(name)
            if levenstein_info["min_distance"] <= 2:
                msg = f"Cannot set attribute '{name}'. Maybe you meant '{levenstein_info['var_name']}'?"
            else:
                msg = f"Cannot set attribute '{name}'. It is not part of {dataset.saving_strategy.data_standard}."
        raise AttributeError(msg)

    def as_dict(self) -> dict[str, Any]:
        """Return metadata for all loaded variables as a dict."""
        return {name: value for name, value in self.__dict__.items() if not name.startswith("_")}

    def to_dict(self) -> dict[str, Any]:
        """Alias for `as_dict()` to provide a more intuitive method name for users."""
        return self.as_dict()

    def __repr__(self) -> str:
        return repr(self.to_dict())

    def __str__(self) -> str:
        return self.__repr__()

    def __setattr__(self, name: str, value: object) -> None:
        if name.startswith("_"):
            object.__setattr__(self, name, value)
            return

        object.__setattr__(self, name, self._coerce_metadata(value))

Methods:

el_paso.dataset.metadata.DatasetMetadata.as_dict

as_dict

Return metadata for all loaded variables as a dict.

Source code in el_paso/dataset/metadata.py
116
117
118
def as_dict(self) -> dict[str, Any]:
    """Return metadata for all loaded variables as a dict."""
    return {name: value for name, value in self.__dict__.items() if not name.startswith("_")}

el_paso.dataset.metadata.DatasetMetadata.to_dict

to_dict

Alias for as_dict() to provide a more intuitive method name for users.

Source code in el_paso/dataset/metadata.py
120
121
122
def to_dict(self) -> dict[str, Any]:
    """Alias for `as_dict()` to provide a more intuitive method name for users."""
    return self.as_dict()

el_paso.dataset.metadata.GFZMetaData

Bases: DatasetMetadata

Metadata container for GFZStandard.

Attributes:

Name Type Description
datetime VariableMetadata

VariableMetadata

time VariableMetadata

VariableMetadata

energy_channels VariableMetadata

VariableMetadata

alpha_local VariableMetadata

VariableMetadata

alpha_eq_model VariableMetadata

VariableMetadata

alpha_eq_real VariableMetadata

VariableMetadata

InvMu VariableMetadata

VariableMetadata

InvMu_real VariableMetadata

VariableMetadata

InvK VariableMetadata

VariableMetadata

InvV VariableMetadata

VariableMetadata

Lstar VariableMetadata

VariableMetadata

Lm VariableMetadata

VariableMetadata

Flux VariableMetadata

VariableMetadata

PSD VariableMetadata

VariableMetadata

MLT VariableMetadata

VariableMetadata

B_eq VariableMetadata

VariableMetadata

B_total VariableMetadata

VariableMetadata

xGEO VariableMetadata

VariableMetadata

P VariableMetadata

VariableMetadata

R0 VariableMetadata

VariableMetadata

density VariableMetadata

VariableMetadata

Source code in el_paso/dataset/metadata.py
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
class GFZMetaData(DatasetMetadata):
    """Metadata container for GFZStandard.

    Attributes:
        datetime: VariableMetadata
        time: VariableMetadata
        energy_channels: VariableMetadata
        alpha_local: VariableMetadata
        alpha_eq_model: VariableMetadata
        alpha_eq_real: VariableMetadata
        InvMu: VariableMetadata
        InvMu_real: VariableMetadata
        InvK: VariableMetadata
        InvV: VariableMetadata
        Lstar: VariableMetadata
        Lm: VariableMetadata
        Flux: VariableMetadata
        PSD: VariableMetadata
        MLT: VariableMetadata
        B_eq: VariableMetadata
        B_total: VariableMetadata
        xGEO: VariableMetadata
        P: VariableMetadata
        R0: VariableMetadata
        density: VariableMetadata
    """

    datetime: VariableMetadata
    time: VariableMetadata
    energy_channels: VariableMetadata
    alpha_local: VariableMetadata
    alpha_eq_model: VariableMetadata
    alpha_eq_real: VariableMetadata
    InvMu: VariableMetadata
    InvMu_real: VariableMetadata
    InvK: VariableMetadata
    InvV: VariableMetadata
    Lstar: VariableMetadata
    Lm: VariableMetadata
    Flux: VariableMetadata
    PSD: VariableMetadata
    MLT: VariableMetadata
    B_eq: VariableMetadata
    B_total: VariableMetadata
    xGEO: VariableMetadata  # noqa: N815
    P: VariableMetadata
    R0: VariableMetadata
    density: VariableMetadata

el_paso.dataset.metadata.PRBEMMetaData

Bases: DatasetMetadata

Metadata container for PRBEMStandard.

Attributes:

Name Type Description
datetime VariableMetadata

VariableMetadata

Epoch VariableMetadata

VariableMetadata

FEDU VariableMetadata

VariableMetadata

FEDO VariableMetadata

VariableMetadata

FEIU VariableMetadata

VariableMetadata

Energy_FEDU VariableMetadata

VariableMetadata

Alpha VariableMetadata

VariableMetadata

Alpha_Eq VariableMetadata

VariableMetadata

Position VariableMetadata

VariableMetadata

B_Calc VariableMetadata

VariableMetadata

B_Eq VariableMetadata

VariableMetadata

L_star VariableMetadata

VariableMetadata

I VariableMetadata

VariableMetadata

MLT VariableMetadata

VariableMetadata

L_m VariableMetadata

VariableMetadata

PSD VariableMetadata

VariableMetadata

R_Eq VariableMetadata

VariableMetadata

InvMu VariableMetadata

VariableMetadata

InvK VariableMetadata

VariableMetadata

Source code in el_paso/dataset/metadata.py
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
class PRBEMMetaData(DatasetMetadata):
    """Metadata container for PRBEMStandard.

    Attributes:
        datetime: VariableMetadata
        Epoch: VariableMetadata
        FEDU: VariableMetadata
        FEDO: VariableMetadata
        FEIU: VariableMetadata
        Energy_FEDU: VariableMetadata
        Alpha: VariableMetadata
        Alpha_Eq: VariableMetadata
        Position: VariableMetadata
        B_Calc: VariableMetadata
        B_Eq: VariableMetadata
        L_star: VariableMetadata
        I: VariableMetadata
        MLT: VariableMetadata
        L_m: VariableMetadata
        PSD: VariableMetadata
        R_Eq: VariableMetadata
        InvMu: VariableMetadata
        InvK: VariableMetadata
    """

    datetime: VariableMetadata
    Epoch: VariableMetadata
    FEDU: VariableMetadata
    FEDO: VariableMetadata
    FEIU: VariableMetadata
    Energy_FEDU: VariableMetadata
    Alpha: VariableMetadata
    Alpha_Eq: VariableMetadata
    Position: VariableMetadata
    B_Calc: VariableMetadata
    B_Eq: VariableMetadata
    L_star: VariableMetadata
    I: VariableMetadata  # noqa: E741
    MLT: VariableMetadata
    L_m: VariableMetadata
    PSD: VariableMetadata
    R_Eq: VariableMetadata
    InvMu: VariableMetadata
    InvK: VariableMetadata