DMSC Integration Testing

Last updated: September 25, 2026 08:02:48

Test: nexusfiles-scipp|odin|can_compute_wavelength|beam_monitor_3

View job log here


ValueError: No strictly increasing sections found.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
    backend: <enum 'FrameUnwrapBackend'>,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/resample.py:91: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f814b9c5ac0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00022385.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:621: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:531: in _compute_wavelength_data
    out = rebin_strictly_increasing(data, dim='wavelength')
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

da = <scipp.DataArray>
Dimensions: Sizes[time:0, wavelength:716, ]
Coordinates:
* position                  vector3        ...e])  [nan, nan, ..., nan, nan]
Data:
                            float64  [dimensionless]  (time, wavelength)  []  []


dim = 'wavelength'

    def rebin_strictly_increasing(da: sc.DataArray, dim: str) -> sc.DataArray:
        """
        Find strictly monotonic sections in a coordinate dimension and rebin the data array
        into a regular grid based on these sections.
        """
        # Ensure the dimension is named like the coordinate.
        da = da.rename_dims({da.coords[dim].dim: dim})
        slices = find_strictly_increasing_sections(da.coords[dim])
        if len(slices) == 1:
            # Slices refer to the indices in the coord, which are bin edges.
            # For slicing data we need to stop at the last index minus one.
            return da[dim, slices[0].start : slices[0].stop - 1]
        if not slices:
>           raise ValueError("No strictly increasing sections found.")
E           ValueError: No strictly increasing sections found.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E               backend: <enum 'FrameUnwrapBackend'>,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/resample.py:91: ValueError

View job log here


ValueError: No strictly increasing sections found.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
    backend: <enum 'FrameUnwrapBackend'>,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/resample.py:91: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f7a900cb800>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00022255.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:621: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:531: in _compute_wavelength_data
    out = rebin_strictly_increasing(data, dim='wavelength')
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

da = <scipp.DataArray>
Dimensions: Sizes[time:0, wavelength:716, ]
Coordinates:
* position                  vector3        ...e])  [nan, nan, ..., nan, nan]
Data:
                            float64  [dimensionless]  (time, wavelength)  []  []


dim = 'wavelength'

    def rebin_strictly_increasing(da: sc.DataArray, dim: str) -> sc.DataArray:
        """
        Find strictly monotonic sections in a coordinate dimension and rebin the data array
        into a regular grid based on these sections.
        """
        # Ensure the dimension is named like the coordinate.
        da = da.rename_dims({da.coords[dim].dim: dim})
        slices = find_strictly_increasing_sections(da.coords[dim])
        if len(slices) == 1:
            # Slices refer to the indices in the coord, which are bin edges.
            # For slicing data we need to stop at the last index minus one.
            return da[dim, slices[0].start : slices[0].stop - 1]
        if not slices:
>           raise ValueError("No strictly increasing sections found.")
E           ValueError: No strictly increasing sections found.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E               backend: <enum 'FrameUnwrapBackend'>,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/resample.py:91: ValueError

View job log here


ValueError: No strictly increasing sections found.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
    backend: <enum 'FrameUnwrapBackend'>,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/resample.py:91: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f004817a630>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00022115.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:621: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:531: in _compute_wavelength_data
    out = rebin_strictly_increasing(data, dim='wavelength')
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

da = <scipp.DataArray>
Dimensions: Sizes[time:0, wavelength:716, ]
Coordinates:
* position                  vector3        ...e])  [nan, nan, ..., nan, nan]
Data:
                            float64  [dimensionless]  (time, wavelength)  []  []


dim = 'wavelength'

    def rebin_strictly_increasing(da: sc.DataArray, dim: str) -> sc.DataArray:
        """
        Find strictly monotonic sections in a coordinate dimension and rebin the data array
        into a regular grid based on these sections.
        """
        # Ensure the dimension is named like the coordinate.
        da = da.rename_dims({da.coords[dim].dim: dim})
        slices = find_strictly_increasing_sections(da.coords[dim])
        if len(slices) == 1:
            # Slices refer to the indices in the coord, which are bin edges.
            # For slicing data we need to stop at the last index minus one.
            return da[dim, slices[0].start : slices[0].stop - 1]
        if not slices:
>           raise ValueError("No strictly increasing sections found.")
E           ValueError: No strictly increasing sections found.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E               backend: <enum 'FrameUnwrapBackend'>,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/resample.py:91: ValueError

View job log here


ValueError: No strictly increasing sections found.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
    backend: <enum 'FrameUnwrapBackend'>,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/resample.py:91: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f7bb7cfc950>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00021975.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:621: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:531: in _compute_wavelength_data
    out = rebin_strictly_increasing(data, dim='wavelength')
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

da = <scipp.DataArray>
Dimensions: Sizes[time:0, wavelength:716, ]
Coordinates:
* position                  vector3        ...e])  [nan, nan, ..., nan, nan]
Data:
                            float64  [dimensionless]  (time, wavelength)  []  []


dim = 'wavelength'

    def rebin_strictly_increasing(da: sc.DataArray, dim: str) -> sc.DataArray:
        """
        Find strictly monotonic sections in a coordinate dimension and rebin the data array
        into a regular grid based on these sections.
        """
        # Ensure the dimension is named like the coordinate.
        da = da.rename_dims({da.coords[dim].dim: dim})
        slices = find_strictly_increasing_sections(da.coords[dim])
        if len(slices) == 1:
            # Slices refer to the indices in the coord, which are bin edges.
            # For slicing data we need to stop at the last index minus one.
            return da[dim, slices[0].start : slices[0].stop - 1]
        if not slices:
>           raise ValueError("No strictly increasing sections found.")
E           ValueError: No strictly increasing sections found.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E               backend: <enum 'FrameUnwrapBackend'>,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/resample.py:91: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f3c54163dd0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00021701.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7f3c5c193830>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f664012c650>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00021561.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7f66401b9ca0>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f4366312210>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00021411.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7f4360207d10>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f08041bed80>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00021271.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7f08134b6120>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f31c5a6f470>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00021131.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7f31c4825970>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f83a27c76b0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00020415.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7f83a011d520>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f4fb8526b10>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00020275.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7f4fb85e6960>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fecdddef9e0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00020202.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7fecda389eb0>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fbacb81db20>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00020202.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7fbacb6dde20>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f3a8034cf50>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00020114.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7f3a8109f530>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
In provider ess.reduce.nexus.workflow.load_nexus_component(
    location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
    nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f9e2370bc20>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00019971.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/workflow.py:242: in load_nexus_component
    nexus.load_component(location, nx_class=nx_class, definitions=definitions)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:99: in load_component
    with open_component_group(
/opt/miniforge/lib/python3.12/contextlib.py:137: in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:325: in open_component_group
    yield _unique_child_group(parent, nx_class, group_name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

group = <scippnexus.base.Group object at 0x7f9e183da1e0>
nx_class = <class 'scippnexus.nexus_classes.NXsource'>, name = None

    def _unique_child_group(
        group: snx.Group, nx_class: type[snx.NXobject], name: str | None
    ) -> snx.Group:
        if name is not None:
            child = group[name]
            if isinstance(child, snx.Field):
                raise ValueError(
                    f"Expected a NeXus group as item '{name}' but got a field."
                )
            if child.nx_class != nx_class:
                raise ValueError(
                    f"The NeXus group '{name}' was expected to be a "
                    f'{nx_class} but is a {child.nx_class}.'
                )
            return child
    
        children = group[nx_class]
        if len(children) != 1:
>           raise ValueError(
                f"Expected exactly one {nx_class.__name__} group '{group.name}', "
                f"got {len(children)}"
            )
E           ValueError: Expected exactly one NXsource group '/entry/instrument', got 2
E           In provider ess.reduce.nexus.workflow.load_nexus_component(
E               location: ess.reduce.nexus.types.NeXusComponentLocationSpec[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun],
E               nx_class: ess.reduce.nexus.types.NeXusClass[scippnexus.nexus_classes.NXsource],
E           ) -> ess.reduce.nexus.types.NeXusComponent[scippnexus.nexus_classes.NXsource, ess.imaging.types.SampleRun]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/nexus/_nexus_loader.py:384: ValueError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fb160160470>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00019453.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f9bb6a2ade0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00019453.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fbdc44f8d40>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00019373.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fa6398c8f80>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00019227.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f21a43977d0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00019096.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f4e5252b860>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00018956.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f8f568098b0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00018816.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fce145f52e0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00018676.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fd2e508ba40>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00018332.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f99e58ebdd0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00018332.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f4dc97f7c80>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00018332.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f8d9e1a7620>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00018252.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7ffa53da6060>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00018122.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
    monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
    pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
    keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fe2d63ef680>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00017982.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:140: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/_provider.py:145: in __call__
    return self._func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.
E           In provider ess.reduce.unwrap.to_wavelength.monitor_wavelength_data(
E               monitor_data: ess.reduce.nexus.types.RawMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               lookup: ess.reduce.unwrap.types.ErrorLimitedLookupTable[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               ltotal: ess.reduce.unwrap.types.MonitorLtotal[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1],
E               pulse_stride_offset: ess.reduce.unwrap.types.PulseStrideOffset,
E               keep_event_time_offset: ess.reduce.unwrap.types.KeepEventTimeOffset,
E           ) -> ess.reduce.unwrap.types.WavelengthMonitor[ess.imaging.types.SampleRun, ess.imaging.types.BeamMonitor1]

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f5bd9ff4e90>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00017745.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f627a2aff50>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00017657.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:565: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:482: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:162: in _compute_wavelength_histogram
    ).rebin({key: new_bins})
      ^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                float64       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7faa02a5c7d0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00017547.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fa55e4dc530>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00017397.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f8301456e40>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00017257.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f617d59f8f0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00017127.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f97a1cc4740>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00016977.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f76c968b2c0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00016707.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f27cc8c79e0>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00016557.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f2eca9bf770>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00016427.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f34f43bf170>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00016287.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7f037e6d1a00>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00016137.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError

View job log here


scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError
Full output
workflow = <sciline.pipeline.Pipeline object at 0x7fbe160e0740>
coda_nexus_file_path = PosixPath('/ess/data/coda/999999/raw/coda_odin_999999_00015997.hdf')
monitor_index = 3

    @pytest.mark.parametrize("monitor_index", [1, 2, 3])
    def test_can_compute_wavelength__beam_monitor_(
        workflow: sciline.Pipeline, coda_nexus_file_path: Path, monitor_index: int
    ) -> None:
        workflow[Filename[SampleRun]] = coda_nexus_file_path
        workflow[NeXusName[BeamMonitor1]] = f"beam_monitor_{monitor_index}"
>       result = workflow.compute(WavelengthMonitor[SampleRun, BeamMonitor1])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/nexusfiles-scipp/odin/odin_reduction_test.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/pipeline.py:191: in compute
    return self.get(tp, **kwargs).compute(reporter=reporter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/task_graph.py:122: in compute
    return self._scheduler.get(self._graph, [targets], reporter=reporter)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/sciline/scheduler.py:119: in get
    return self._dask_get(dsk, list(map(_to_dask_key, keys)))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/threaded.py:115: in get
    results = get_async(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:547: in get_async
    raise_exception(exc, tb)
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:351: in reraise
    raise exc
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/local.py:256: in execute_task
    result = task(data)
             ^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/_task_spec.py:768: in __call__
    return self.func(*new_argspec)
           ^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/dask/utils.py:81: in apply
    return func(*args)
           ^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:547: in monitor_wavelength_data
    _compute_wavelength_data(
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:474: in _compute_wavelength_data
    data = _compute_wavelength_histogram(da=da, lookup=lookup, ltotal=ltotal)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/ess/reduce/unwrap/to_wavelength.py:157: in _compute_wavelength_histogram
    rebinned = da.rebin({key: new_bins})
               ^^^^^^^^^^^^^^^^^^^^^^^^^
.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/data_group.py:755: in impl
    return func(data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

x = <scipp.DataArray>
Dimensions: Sizes[time:0, frame_time:7000, ]
Coordinates:
* frame_time                  int32       ...4             [ns]  (time)  []
Data:
                            float64             [au]  (time, frame_time)  []  []


arg_dict = {'frame_time': <scipp.Variable> (frame_time: 7002)    float64            [µs]  [0, 0, ..., 0, 71428.6]}
kwargs = {}

    @data_group_overload
    def rebin(
        x: Variable | DataArray | Dataset | DataGroup[Any],
        arg_dict: IntoStrDict[SupportsIndex | Variable] | None = None,
        /,
        **kwargs: SupportsIndex | Variable,
    ) -> Variable | DataArray | Dataset | DataGroup[Any]:
        """Rebin a data array or dataset.
    
        The coordinate of the input for the dimension to be rebinned must contain bin edges,
        i.e., the data must be histogrammed.
    
        If the input has masks that contain the dimension being rebinned then those
        masks are applied to the data before rebinning. That is, masked values are treated
        as zero.
    
        Parameters
        ----------
        x:
            Data to rebin.
        arg_dict:
            Dictionary mapping dimension labels to binning parameters.
        **kwargs:
            Mapping of dimension label to corresponding binning parameters.
    
        Returns
        -------
        :
            Data rebinned according to the new bin edges.
    
        See Also
        --------
        scipp.bin:
            For changing the binning of binned (as opposed to dense, histogrammed) data.
        scipp.hist:
            For histogramming data.
    
        Examples
        --------
    
        Rebin a data array along one of its dimensions, specifying (1) number of bins, (2)
        bin width, or (3) actual binning:
    
          >>> from numpy.random import default_rng
          >>> rng = default_rng(seed=1234)
          >>> x = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> y = sc.array(dims=['row'], unit='m', values=rng.random(100))
          >>> data = sc.ones(dims=['row'], unit='K', shape=[100])
          >>> table = sc.DataArray(data=data, coords={'x': x, 'y': y})
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=2).sizes
          {'x': 2, 'y': 100}
    
          >>> da.rebin(x=sc.scalar(0.2, unit='m')).sizes
          {'x': 5, 'y': 100}
    
          >>> da.rebin(x=sc.linspace('x', 0.2, 0.8, num=10, unit='m')).sizes
          {'x': 9, 'y': 100}
    
        Rebin a data array along two of its dimensions:
    
          >>> da = table.hist(x=100, y=100)
          >>> da.rebin(x=4, y=6).sizes
          {'x': 4, 'y': 6}
        """
        if isinstance(x, DataGroup):
            # Only to make mypy happy because we have `DataGroup` in annotation of `x`
            # so that Sphinx shows it.
            raise TypeError("Internal error: input should not be a DataGroup")
        edges = _make_edges(x, arg_dict, kwargs)
        out = x
        for dim, edge in edges.items():
>           out = _cpp.rebin(out, dim, edge)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
E           scipp._scipp.core.BinEdgeError: The input does not have coordinates with bin-edges.

.tox/nexusfiles-scipp-odin/lib/python3.12/site-packages/scipp/core/binning.py:992: BinEdgeError