Skip to content

Commit a0d4a6c

Browse files
authored
Merge pull request #35 from BAMresearch/modifying_databundle_and_associates
change internal_units to signal_units and removing ingest and display…
2 parents 29bec04 + fa04cd7 commit a0d4a6c

File tree

2 files changed

+72
-10
lines changed

2 files changed

+72
-10
lines changed

src/modacor/dataclasses/basedata.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
from typing import Dict, List, Optional, Self
55

66
import numpy as np
7-
import pint
87
from attrs import define, field
98
from attrs import validators as v
109

10+
from modacor import ureg
11+
1112
logger = logging.getLogger(__name__)
1213

1314

@@ -32,11 +33,6 @@ class BaseData:
3233
It is designed to be used as a base class for more specialized data classes.
3334
"""
3435

35-
# Unit information using Pint units - required input (ingest, internal, and display)
36-
ingest_units: pint.Unit = field(validator=v.instance_of(pint.Unit))
37-
internal_units: pint.Unit = field(validator=v.instance_of(pint.Unit))
38-
display_units: pint.Unit = field(validator=v.instance_of(pint.Unit))
39-
4036
# Core data array stored as an xarray DataArray
4137
signal: np.ndarray = field(factory=np.ndarray, validator=[v.instance_of(np.ndarray)])
4238

@@ -55,11 +51,16 @@ class BaseData:
5551
)
5652
normalization_factor: float = field(default=1.0, validator=v.instance_of(float))
5753
normalization_factor_variance: float = field(default=0.0, validator=v.instance_of(float))
58-
normalization_units: pint.Unit = field(
59-
default=pint.Unit("dimensionless"), validator=v.instance_of(pint.Unit)
54+
# Unit information using Pint units - required input (ingest, internal, and display)
55+
signal_units: ureg.Unit = field(
56+
default=ureg.Unit("dimensionless"), validator=v.instance_of(ureg.Unit)
57+
)
58+
59+
normalization_units: ureg.Unit = field(
60+
default=ureg.Unit("dimensionless"), validator=v.instance_of(ureg.Unit)
6061
)
61-
normalization_factor_units: pint.Unit = field(
62-
default=pint.Unit("dimensionless"), validator=v.instance_of(pint.Unit)
62+
normalization_factor_units: ureg.Unit = field(
63+
default=ureg.Unit("dimensionless"), validator=v.instance_of(ureg.Unit)
6364
)
6465
# array with some normalization (exposure time, solid-angle ....)
6566

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
__coding__ = "utf-8"
2+
__author__ = "Brian R. Pauw"
3+
__copyright__ = "MoDaCor team"
4+
__license__ = "BSD3"
5+
__date__ = "23/05/2025"
6+
__version__ = "20250523.1"
7+
__status__ = "Development" # "Development", "Production"
8+
9+
10+
from pathlib import Path
11+
12+
from modacor import ureg
13+
from modacor.dataclasses.databundle import DataBundle
14+
from modacor.dataclasses.process_step import ProcessStep
15+
from modacor.dataclasses.process_step_describer import ProcessStepDescriber
16+
from modacor.dataclasses.processingdata import ProcessingData
17+
from modacor.math.variance_calculations import divide
18+
19+
20+
class MultiplyByVariable(ProcessStep):
21+
"""
22+
Adding Poisson uncertainties to the data
23+
"""
24+
25+
documentation = ProcessStepDescriber(
26+
calling_name="Multiply by data source variable",
27+
calling_id="MultiplyByVariable",
28+
calling_module_path=Path(__file__),
29+
calling_version=__version__,
30+
required_data_keys=["signal"],
31+
works_on={"signal": ["normalization_factor", "variances"]},
32+
calling_arguments={"scalar": None, "scalar_units": None, "scalar_uncertainty": None},
33+
step_keywords=["multiply", "variable", "scalar"],
34+
step_doc="Multiply by a variable loaded from a data source",
35+
step_reference="DOI 10.1088/0953-8984/25/38/383201",
36+
step_note="""This loads a scalar (value, units and uncertainty)
37+
from an IOSource and applies it to the data""",
38+
)
39+
40+
def calculate(self) -> dict[str, DataBundle]:
41+
""" """
42+
self.processing_data: ProcessingData
43+
key = self.configuration.get("with_processing_keys")
44+
data: DataBundle = self.processing_data[key]
45+
46+
# apply factor to the data
47+
f, v = divide(
48+
data["signal"].normalization_factor,
49+
data["signal"].normalization_factor_variances,
50+
self.configuration.get("scalar"),
51+
self.configuration.get("scalar_uncertainty", 0),
52+
)
53+
data["signal"].normalization_factor = f
54+
# propagate uncertainties into normalization_factor_
55+
data["signal"].normalization_factor_variances = v
56+
# propagate units into normalization_factor_units
57+
data["signal"].normalization_factor_units /= ureg.Unit(
58+
self.configuration.get("units", "dimensionless")
59+
)
60+
61+
return {key: data}

0 commit comments

Comments
 (0)