Skip to content

Commit 0d5dde8

Browse files
authored
Refactor averaging.py and manipulations.py to use quantities (#207)
* Refactors sasmanipulations to use new data objects for input * Refactors sasmanipulations to use new data objects for output * Adds new dataset type "angle_dim" * Uses ordinate property in manipulations code * Fixes use of "center" quantity value in tests * Addresses review comments
1 parent d6aeda2 commit 0d5dde8

13 files changed

Lines changed: 639 additions & 590 deletions

sasdata/data.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ def __init__(
3939
@property
4040
def ordinate(self) -> Quantity:
4141
match self.dataset_type:
42-
case dataset_types.one_dim | dataset_types.two_dim:
42+
case (dataset_types.one_dim |
43+
dataset_types.two_dim |
44+
dataset_types.angle_dim):
4345
return self._data_contents["I"]
4446
case dataset_types.sesans:
4547
return self._data_contents["Depolarisation"]
@@ -70,6 +72,8 @@ def abscissae(self) -> Quantity:
7072
# probably want to avoid creating a new Quantity but at the moment I
7173
# can't see a way around it.
7274
return Quantity(data_contents, reference_data_content.units, name=self._data_contents["Qx"].name, id_header=self._data_contents["Qx"]._id_header)
75+
case dataset_types.angle_dim:
76+
return self._data_contents["Phi"]
7377
case dataset_types.sesans:
7478
return self._data_contents["SpinEchoLength"]
7579
case _:
@@ -148,3 +152,38 @@ def default(self, obj):
148152
}
149153
case _:
150154
return super().default(obj)
155+
156+
157+
def sasdata_reader2D_converter(data2d: SasData | None = None) -> SasData:
158+
"""
159+
convert old 2d format opened by IhorReader or danse_reader
160+
to new 2D SasData format
161+
This is mainly used by the Readers
162+
163+
:param data2d: SasData object with 2D arrays
164+
:return: SasData object with 1D arrays
165+
166+
"""
167+
if data2d._data_contents["I"] is None or data2d.x_bins is None or data2d.y_bins is None:
168+
raise ValueError("Can't convert this data: data=None...")
169+
new_x = np.tile(data2d.x_bins, (len(data2d.y_bins), 1))
170+
new_y = np.tile(data2d.y_bins, (len(data2d.x_bins), 1))
171+
new_y = new_y.swapaxes(0, 1)
172+
173+
new_data = data2d._data_contents["I"].value.flatten()
174+
qx_data = new_x.flatten()
175+
qy_data = new_y.flatten()
176+
err_data = np.sqrt(data2d._data_contents["I"].variance.value)
177+
if not data2d._data_contents["I"].has_variance or np.any(err_data <= 0):
178+
new_err_data = np.sqrt(np.abs(new_data))
179+
else:
180+
new_err_data = err_data.flatten()
181+
mask = np.ones(len(new_data), dtype=bool)
182+
183+
data2d._data_contents["I"].value = new_data
184+
data2d._data_contents["I"].variance.value = new_err_data ** 2
185+
data2d._data_contents["Qx"].value = qx_data
186+
data2d._data_contents["Qy"].value = qy_data
187+
data2d.mask = mask
188+
189+
return data2d

0 commit comments

Comments
 (0)