Source code for ess.dream.beamline
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2025 Scipp contributors (https://github.com/scipp)
import enum
import scipp as sc
from scippneutron.chopper import DiskChopper
[docs]
class InstrumentConfiguration(enum.Enum):
"""
Choose between high-flux and high-resolution configurations.
The high_flux setting is the same as the high_flux_BC215. Setting the band chopper
phase explicitly should be favored over using the high_flux setting which is kept
for backwards compatibility.
"""
high_flux_BC215 = 1
high_flux = 1 # Legacy alias for high_flux
high_flux_BC240 = 2
high_resolution = 3
[docs]
def choppers(configuration: InstrumentConfiguration) -> dict[str, DiskChopper]:
"""Return the chopper configuration for the given instrument configuration."""
match configuration:
case InstrumentConfiguration.high_flux:
return {
"psc1": DiskChopper(
frequency=sc.scalar(14.0, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(286 - 180, unit="deg"),
axle_position=sc.vector(value=[0, 0, 6.145], unit="m"),
slit_begin=sc.array(
dims=["cutout"],
values=[
-1.23,
70.49,
84.765,
113.565,
170.29,
271.635,
286.035,
301.17,
],
unit="deg",
),
slit_end=sc.array(
dims=["cutout"],
values=[
1.23,
73.51,
88.035,
116.835,
175.31,
275.565,
289.965,
303.63,
],
unit="deg",
),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
"psc2": DiskChopper(
frequency=sc.scalar(-14.0, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(-236, unit="deg"),
axle_position=sc.vector(value=[0, 0, 6.155], unit="m"),
slit_begin=sc.array(
dims=["cutout"],
values=[
-1.23,
27.0,
55.8,
142.385,
156.765,
214.115,
257.23,
315.49,
],
unit="deg",
),
slit_end=sc.array(
dims=["cutout"],
values=[
1.23,
30.6,
59.4,
145.615,
160.035,
217.885,
261.17,
318.11,
],
unit="deg",
),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
"oc": DiskChopper(
frequency=sc.scalar(14.0, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(297 - 180 - 90, unit="deg"),
axle_position=sc.vector(value=[0, 0, 6.174], unit="m"),
slit_begin=sc.array(
dims=["cutout"], values=[-27.6 * 0.5], unit="deg"
),
slit_end=sc.array(dims=["cutout"], values=[27.6 * 0.5], unit="deg"),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
"bcc": DiskChopper(
frequency=sc.scalar(112.0, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(215 - 180, unit="deg"),
# Use 240 to reduce overlap between frames
# phase=sc.scalar(240 - 180, unit="deg"),
axle_position=sc.vector(value=[0, 0, 9.78], unit="m"),
slit_begin=sc.array(
dims=["cutout"], values=[-36.875, 143.125], unit="deg"
),
slit_end=sc.array(
dims=["cutout"], values=[36.875, 216.875], unit="deg"
),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
"t0": DiskChopper(
frequency=sc.scalar(28.0, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(280 - 180, unit="deg"),
axle_position=sc.vector(value=[0, 0, 13.05], unit="m"),
slit_begin=sc.array(
dims=["cutout"], values=[-314.9 * 0.5], unit="deg"
),
slit_end=sc.array(
dims=["cutout"], values=[314.9 * 0.5], unit="deg"
),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
}
case InstrumentConfiguration.high_resolution:
return (
{
"psc1": DiskChopper(
frequency=sc.scalar(15 * 14.0, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(25 - 180, unit="deg"),
axle_position=sc.vector(value=[0, 0, 6.145], unit="m"),
slit_begin=sc.array(
dims=["cutout"],
values=[
-1.23,
70.49,
84.765,
113.565,
170.29,
271.635,
286.035,
301.17,
],
unit="deg",
),
slit_end=sc.array(
dims=["cutout"],
values=[
1.23,
73.51,
88.035,
116.835,
175.31,
275.565,
289.965,
303.63,
],
unit="deg",
),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
"psc2": DiskChopper(
frequency=sc.scalar(-14.0 * 14, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(-100.5, unit="deg"),
axle_position=sc.vector(value=[0, 0, 6.155], unit="m"),
slit_begin=sc.array(
dims=["cutout"],
values=[
-1.23,
27.0,
55.8,
142.385,
156.765,
214.115,
257.23,
315.49,
],
unit="deg",
),
slit_end=sc.array(
dims=["cutout"],
values=[
1.23,
30.6,
59.4,
145.615,
160.035,
217.885,
261.17,
318.11,
],
unit="deg",
),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
"oc": DiskChopper(
frequency=sc.scalar(14.0, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(297 - 180 - 90, unit="deg"),
axle_position=sc.vector(value=[0, 0, 6.174], unit="m"),
slit_begin=sc.array(
dims=["cutout"], values=[-27.6 * 0.5], unit="deg"
),
slit_end=sc.array(
dims=["cutout"], values=[27.6 * 0.5], unit="deg"
),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
"bcc": DiskChopper(
frequency=sc.scalar(112.0, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(200 - 180, unit="deg"),
axle_position=sc.vector(value=[0, 0, 9.78], unit="m"),
slit_begin=sc.array(
dims=["cutout"], values=[-36.875, 143.125], unit="deg"
),
slit_end=sc.array(
dims=["cutout"], values=[36.875, 216.875], unit="deg"
),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
"t0": DiskChopper(
frequency=sc.scalar(28.0, unit="Hz"),
beam_position=sc.scalar(0.0, unit="deg"),
phase=sc.scalar(270 - 180, unit="deg"),
axle_position=sc.vector(value=[0, 0, 13.05], unit="m"),
slit_begin=sc.array(
dims=["cutout"], values=[-314.9 * 0.5], unit="deg"
),
slit_end=sc.array(
dims=["cutout"], values=[314.9 * 0.5], unit="deg"
),
slit_height=sc.scalar(10.0, unit="cm"),
radius=sc.scalar(30.0, unit="cm"),
),
},
)