Skip to content

Commit

Permalink
Merge pull request #123 from scipp/live-raw-test
Browse files Browse the repository at this point in the history
Add more tests for `live.raw` module
  • Loading branch information
SimonHeybrock authored Oct 28, 2024
2 parents 1cd29a1 + aa2d775 commit e8a29e6
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 5 deletions.
12 changes: 7 additions & 5 deletions src/ess/reduce/live/raw.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ def project_xy(
return sc.DataGroup(x=position.fields.x * t, y=position.fields.y * t, z=zplane)


def project_onto_cylinder(
def project_onto_cylinder_z(
position: sc.Variable, *, radius: sc.Variable | None = None
) -> dict[str, sc.Variable]:
"""
Expand All @@ -365,8 +365,10 @@ def project_onto_cylinder(
radius = r_xy.min()
t = radius / r_xy
phi = sc.atan2(y=y, x=x).to(unit='deg')
arclength = radius * (phi * sc.scalar(np.pi / 180.0, unit='1/deg'))
return sc.DataGroup(phi=phi, r=radius, z=position.fields.z * t, arclength=arclength)
arc_length = radius * (phi * sc.scalar(np.pi / 180.0, unit='1/deg'))
return sc.DataGroup(
phi=phi, r=radius, z=position.fields.z * t, arc_length=arc_length
)


def pixel_shape(component: NeXusComponent[snx.NXdetector, SampleRun]) -> PixelShape:
Expand Down Expand Up @@ -476,5 +478,5 @@ def make_xy_plane_coords(
def make_cylinder_mantle_coords(
position: CalibratedPositionWithNoisyReplicas,
) -> ProjectedCoords:
radius = project_onto_cylinder(position['replica', 0])['r']
return project_onto_cylinder(position, radius=radius)
radius = project_onto_cylinder_z(position['replica', 0])['r']
return project_onto_cylinder_z(position, radius=radius)
81 changes: 81 additions & 0 deletions tests/live/raw_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2024 Scipp contributors (https://github.com/scipp)
import numpy as np
import pytest
import scipp as sc

Expand Down Expand Up @@ -69,3 +70,83 @@ def test_RollingDetectorView_raises_if_subwindow_exceeds_window() -> None:
det.get(4)
with pytest.raises(ValueError, match="Window size"):
det.get(-1)


def test_RollingDetectorView_projects_counts() -> None:
detector_number = sc.array(dims=['pixel'], values=[1, 2, 3], unit=None)
# Dummy projection that just drops the first pixel
det = raw.RollingDetectorView(
detector_number=detector_number,
window=3,
projection=lambda da: da['pixel', 1:].rename(pixel='abc'),
)
expected = sc.DataArray(
sc.array(dims=['pixel'], values=[0, 0], unit='counts', dtype='int32'),
coords={'detector_number': detector_number[1:]},
).rename(pixel='abc')

det.add_counts([1, 2, 3, 2])
expected.values = [2, 1]
assert sc.identical(det.get(), expected)

det.add_counts([1, 3, 3, 1])
expected.values = [2, 3]
assert sc.identical(det.get(), expected)


def test_project_xy_with_given_zplane_scales() -> None:
result = raw.project_xy(
sc.vectors(
dims=['point'],
values=[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [6.0, 10.0, 12.0]],
unit='m',
),
zplane=sc.scalar(6.0, unit='m'),
)
assert sc.identical(
result,
sc.DataGroup(
x=sc.array(dims=['point'], values=[2.0, 4.0, 3.0], unit='m'),
y=sc.array(dims=['point'], values=[4.0, 5.0, 5.0], unit='m'),
z=sc.scalar(6.0, unit='m'),
),
)


def test_project_xy_defaults_to_scale_to_zmin() -> None:
result = raw.project_xy(
sc.vectors(
dims=['point'],
values=[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [6.0, 10.0, 12.0]],
unit='m',
)
)
assert sc.identical(
result,
sc.DataGroup(
# Note same relative values as with zplane=6, just scaled.
x=sc.array(dims=['point'], values=[1.0, 2.0, 1.5], unit='m'),
y=sc.array(dims=['point'], values=[2.0, 2.5, 2.5], unit='m'),
z=sc.scalar(3.0, unit='m'),
),
)


def test_project_onto_cylinder_z() -> None:
radius = sc.scalar(2.0, unit='m')
# Input radii are 4 and 1 => scale by 1/2 and 2.
result = raw.project_onto_cylinder_z(
sc.vectors(dims=['point'], values=[[0.0, 4.0, 3.0], [1.0, 0.0, 6.0]], unit='m'),
radius=radius,
)
assert sc.identical(result['r'], radius)
assert sc.identical(
result['z'], sc.array(dims=['point'], values=[1.5, 12.0], unit='m')
)
assert sc.identical(
result['phi'], sc.array(dims=['point'], values=[90.0, 0.0], unit='deg')
)
assert sc.identical(
result['arc_length'],
sc.array(dims=['point'], values=[radius.value * np.pi * 0.5, 0.0], unit='m'),
)

0 comments on commit e8a29e6

Please sign in to comment.