Skip to content

Commit fe0638f

Browse files
committed
Update for restructured NeXus base workflow from ess.reduce.nexus
1 parent 45b8fd4 commit fe0638f

File tree

6 files changed

+56
-49
lines changed

6 files changed

+56
-49
lines changed

src/ess/dream/io/geant4.py

+30-14
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,20 @@
44
import numpy as np
55
import sciline
66
import scipp as sc
7+
import scippnexus as snx
78

89
from ess.powder.types import (
910
CalibratedDetector,
1011
CalibrationData,
1112
CalibrationFilename,
1213
DetectorData,
1314
Filename,
14-
NeXusDetector,
15+
NeXusComponent,
1516
NeXusDetectorName,
16-
NeXusSample,
17-
NeXusSource,
17+
Position,
1818
RunType,
1919
)
20+
from ess.reduce.nexus.types import CalibratedBeamline
2021
from ess.reduce.nexus.workflow import GenericNeXusWorkflow
2122

2223
MANTLE_DETECTOR_ID = sc.index(7)
@@ -60,9 +61,23 @@ def load_geant4_csv(file_path: Filename[RunType]) -> AllRawDetectors[RunType]:
6061

6162
def extract_geant4_detector(
6263
detectors: AllRawDetectors[RunType], detector_name: NeXusDetectorName
63-
) -> NeXusDetector[RunType]:
64+
) -> NeXusComponent[snx.NXdetector, RunType]:
6465
"""Extract a single detector from a loaded GEANT4 simulation."""
65-
return NeXusDetector[RunType](detectors["instrument"][detector_name])
66+
return NeXusComponent[snx.NXdetector, RunType](
67+
detectors["instrument"][detector_name]
68+
)
69+
70+
71+
def get_calibrated_geant4_detector(
72+
detector: NeXusComponent[snx.NXdetector, RunType],
73+
) -> CalibratedDetector[RunType]:
74+
"""
75+
Replacement for :py:func:`ess.reduce.nexus.workflow.get_calibrated_detector`.
76+
77+
Since the Geant4 detectors already have computed positions as well as logical shape,
78+
this just extracts the relevant event data.
79+
"""
80+
return detector['events'].copy(deep=False)
6681

6782

6883
def _load_raw_events(file_path: str) -> sc.DataArray:
@@ -171,21 +186,21 @@ def geant4_load_calibration(filename: CalibrationFilename) -> CalibrationData:
171186

172187

173188
def dummy_assemble_detector_data(
174-
detector: CalibratedDetector[RunType],
189+
detector: CalibratedBeamline[RunType],
175190
) -> DetectorData[RunType]:
176191
"""Dummy assembly of detector data, detector already contains neutron data."""
177192
return DetectorData[RunType](detector)
178193

179194

180-
def dummy_source() -> NeXusSource[RunType]:
181-
return NeXusSource[RunType](
182-
sc.DataGroup(position=sc.vector([np.nan, np.nan, np.nan], unit="mm"))
195+
def dummy_source_position() -> Position[snx.NXsource, RunType]:
196+
return Position[snx.NXsource, RunType](
197+
sc.vector([np.nan, np.nan, np.nan], unit="mm")
183198
)
184199

185200

186-
def dummy_sample() -> NeXusSample[RunType]:
187-
return NeXusSample[RunType](
188-
sc.DataGroup(position=sc.vector([np.nan, np.nan, np.nan], unit="mm"))
201+
def dummy_sample_position() -> Position[snx.NXsample, RunType]:
202+
return Position[snx.NXsample, RunType](
203+
sc.vector([np.nan, np.nan, np.nan], unit="mm")
189204
)
190205

191206

@@ -197,7 +212,8 @@ def LoadGeant4Workflow() -> sciline.Pipeline:
197212
wf.insert(extract_geant4_detector)
198213
wf.insert(load_geant4_csv)
199214
wf.insert(geant4_load_calibration)
215+
wf.insert(get_calibrated_geant4_detector)
200216
wf.insert(dummy_assemble_detector_data)
201-
wf.insert(dummy_source)
202-
wf.insert(dummy_sample)
217+
wf.insert(dummy_source_position)
218+
wf.insert(dummy_sample_position)
203219
return wf

src/ess/dream/workflow.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66
import sciline
77
import scipp as sc
8+
import scippnexus as snx
89

910
from ess.powder import providers as powder_providers
1011
from ess.powder.types import (
1112
AccumulatedProtonCharge,
12-
NeXusSample,
13-
NeXusSource,
13+
Position,
1414
SampleRun,
1515
VanadiumRun,
1616
)
@@ -23,14 +23,14 @@
2323

2424
def default_parameters() -> dict:
2525
# Quantities not available in the simulated data
26-
sample = sc.DataGroup(position=sc.vector([0.0, 0.0, 0.0], unit="mm"))
27-
source = sc.DataGroup(position=sc.vector([-3.478, 0.0, -76550], unit="mm"))
26+
sample_position = sc.vector([0.0, 0.0, 0.0], unit="mm")
27+
source_position = sc.vector([-3.478, 0.0, -76550], unit="mm")
2828
charge = sc.scalar(1.0, unit="µAh")
2929
return {
30-
NeXusSample[SampleRun]: sample,
31-
NeXusSample[VanadiumRun]: sample,
32-
NeXusSource[SampleRun]: source,
33-
NeXusSource[VanadiumRun]: source,
30+
Position[snx.NXsample, SampleRun]: sample_position,
31+
Position[snx.NXsample, VanadiumRun]: sample_position,
32+
Position[snx.NXsource, SampleRun]: source_position,
33+
Position[snx.NXsource, VanadiumRun]: source_position,
3434
AccumulatedProtonCharge[SampleRun]: charge,
3535
AccumulatedProtonCharge[VanadiumRun]: charge,
3636
CIFAuthors: CIFAuthors([]),

src/ess/powder/types.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,12 @@
2929
MonitorData = reduce_t.MonitorData
3030
MonitorPositionOffset = reduce_t.MonitorPositionOffset
3131
MonitorType = reduce_t.MonitorType
32-
NeXusMonitorName = reduce_t.NeXusMonitorName
33-
NeXusDetector = reduce_t.NeXusDetector
34-
NeXusMonitor = reduce_t.NeXusMonitor
35-
NeXusSample = reduce_t.NeXusSample
36-
NeXusSource = reduce_t.NeXusSource
32+
NeXusDetectorName = reduce_t.NeXusDetectorName
33+
NeXusMonitorName = reduce_t.NeXusName
34+
NeXusComponent = reduce_t.NeXusComponent
3735
RunType = reduce_t.RunType
3836
SampleRun = reduce_t.SampleRun
39-
SamplePosition = reduce_t.SamplePosition
40-
SourcePosition = reduce_t.SourcePosition
37+
Position = reduce_t.Position
4138
VanadiumRun = reduce_t.VanadiumRun
4239

4340
DetectorBankSizes = reduce_t.DetectorBankSizes

tests/dream/geant4_reduction_test.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import sciline
88
import scipp as sc
99
import scipp.testing
10+
import scippnexus as snx
1011
from scippneutron.io.cif import Author
1112

1213
import ess.dream.data # noqa: F401
@@ -22,9 +23,8 @@
2223
IofDspacingTwoTheta,
2324
MaskedData,
2425
NeXusDetectorName,
25-
NeXusSample,
26-
NeXusSource,
2726
NormalizedByProtonCharge,
27+
Position,
2828
ReducedDspacingCIF,
2929
SampleRun,
3030
TofMask,
@@ -35,8 +35,8 @@
3535
WavelengthMask,
3636
)
3737

38-
sample = sc.DataGroup(position=sc.vector([0.0, 0.0, 0.0], unit='mm'))
39-
source = sc.DataGroup(position=sc.vector([-3.478, 0.0, -76550], unit='mm'))
38+
sample = sc.vector([0.0, 0.0, 0.0], unit='mm')
39+
source = sc.vector([-3.478, 0.0, -76550], unit='mm')
4040
charge = sc.scalar(1.0, unit='µAh')
4141

4242
params = {
@@ -48,10 +48,10 @@
4848
DspacingBins: sc.linspace('dspacing', 0.0, 2.3434, 201, unit='angstrom'),
4949
TofMask: lambda x: (x < sc.scalar(0.0, unit='ns'))
5050
| (x > sc.scalar(86e6, unit='ns')),
51-
NeXusSample[SampleRun]: sample,
52-
NeXusSample[VanadiumRun]: sample,
53-
NeXusSource[SampleRun]: source,
54-
NeXusSource[VanadiumRun]: source,
51+
Position[snx.NXsample, SampleRun]: sample,
52+
Position[snx.NXsample, VanadiumRun]: sample,
53+
Position[snx.NXsource, SampleRun]: source,
54+
Position[snx.NXsource, VanadiumRun]: source,
5555
AccumulatedProtonCharge[SampleRun]: charge,
5656
AccumulatedProtonCharge[VanadiumRun]: charge,
5757
TwoThetaMask: None,

tests/dream/io/geant4_test.py

+5-11
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,11 @@
88
import pytest
99
import scipp as sc
1010
import scipp.testing
11+
import scippnexus as snx
1112

1213
from ess.dream import data, load_geant4_csv
1314
from ess.dream.io.geant4 import LoadGeant4Workflow
14-
from ess.powder.types import (
15-
Filename,
16-
NeXusDetector,
17-
NeXusDetectorName,
18-
NeXusSample,
19-
NeXusSource,
20-
SampleRun,
21-
)
15+
from ess.powder.types import Filename, NeXusComponent, NeXusDetectorName, SampleRun
2216

2317

2418
@pytest.fixture(scope="module")
@@ -186,13 +180,13 @@ def test_geant4_in_pipeline(file_path, file):
186180
pipeline = LoadGeant4Workflow()
187181
pipeline[Filename[SampleRun]] = file_path
188182
pipeline[NeXusDetectorName] = NeXusDetectorName("mantle")
189-
pipeline[NeXusSample[SampleRun]] = sc.DataGroup(
183+
pipeline[NeXusComponent[snx.NXsample, SampleRun]] = sc.DataGroup(
190184
position=sc.vector([0.0, 0.0, 0.0], unit="mm")
191185
)
192-
pipeline[NeXusSource[SampleRun]] = sc.DataGroup(
186+
pipeline[NeXusComponent[snx.NXsource, SampleRun]] = sc.DataGroup(
193187
position=sc.vector([-3.478, 0.0, -76550], unit="mm")
194188
)
195189

196-
detector = pipeline.compute(NeXusDetector[SampleRun])['events']
190+
detector = pipeline.compute(NeXusComponent[snx.NXdetector, SampleRun])['events']
197191
expected = load_geant4_csv(file)["instrument"]["mantle"]["events"]
198192
sc.testing.assert_identical(detector, expected)

tests/dream/io/nexus_test.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
Filename,
1414
Monitor1,
1515
NeXusDetectorName,
16-
NeXusMonitorName,
1716
SampleRun,
1817
)
18+
from ess.reduce.nexus.types import NeXusName as NeXusMonitorName
1919

2020
bank_dims = {'wire', 'module', 'segment', 'strip', 'counter'}
2121
hr_sans_dims = {'strip', 'other'}

0 commit comments

Comments
 (0)