essreduce 25.5.3__tar.gz → 25.7.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {essreduce-25.5.3 → essreduce-25.7.1}/.copier-answers.ess.yml +1 -1
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/ISSUE_TEMPLATE/high-level-requirement.yml +8 -0
- {essreduce-25.5.3/src/essreduce.egg-info → essreduce-25.7.1}/PKG-INFO +1 -1
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/user-guide/tof/dream.ipynb +85 -72
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/user-guide/tof/frame-unwrapping.ipynb +99 -81
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/user-guide/tof/wfm.ipynb +66 -50
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/base.txt +1 -1
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/basetest.txt +1 -1
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/time_of_flight/__init__.py +23 -15
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/time_of_flight/eto_to_tof.py +7 -284
- essreduce-25.7.1/src/ess/reduce/time_of_flight/lut.py +478 -0
- essreduce-25.7.1/src/ess/reduce/time_of_flight/types.py +41 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/time_of_flight/workflow.py +9 -27
- {essreduce-25.5.3 → essreduce-25.7.1/src/essreduce.egg-info}/PKG-INFO +1 -1
- {essreduce-25.5.3 → essreduce-25.7.1}/src/essreduce.egg-info/SOURCES.txt +2 -2
- essreduce-25.7.1/tests/time_of_flight/lut_test.py +114 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/time_of_flight/unwrap_test.py +84 -102
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/time_of_flight/wfm_test.py +69 -54
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/time_of_flight/workflow_test.py +24 -50
- essreduce-25.5.3/.github/ISSUE_TEMPLATE/blank.md +0 -8
- essreduce-25.5.3/src/ess/reduce/time_of_flight/simulation.py +0 -108
- essreduce-25.5.3/src/ess/reduce/time_of_flight/types.py +0 -132
- {essreduce-25.5.3 → essreduce-25.7.1}/.copier-answers.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/dependabot.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/workflows/ci.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/workflows/docs.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/workflows/nightly_at_main.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/workflows/nightly_at_release.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/workflows/python-version-ci +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/workflows/release.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/workflows/test.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/workflows/unpinned.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.github/workflows/weekly_windows_macos.yml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.gitignore +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.pre-commit-config.yaml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/.python-version +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/CODE_OF_CONDUCT.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/CONTRIBUTING.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/LICENSE +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/MANIFEST.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/README.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/conda/meta.yaml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/_static/anaconda-icon.js +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/_static/favicon.svg +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/_static/logo-dark.svg +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/_static/logo.svg +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/_templates/class-template.rst +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/_templates/doc_version.html +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/_templates/module-template.rst +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/about/index.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/api-reference/index.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/conf.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/developer/coding-conventions.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/developer/dependency-management.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/developer/getting-started.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/developer/gui.ipynb +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/developer/index.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/index.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/user-guide/index.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/user-guide/installation.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/user-guide/reduction-workflow-guidelines.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/user-guide/tof/index.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/docs/user-guide/widget.md +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/pyproject.toml +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/base.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/basetest.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/ci.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/ci.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/dev.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/dev.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/docs.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/docs.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/make_base.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/mypy.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/mypy.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/nightly.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/nightly.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/static.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/static.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/test.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/test.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/wheels.in +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/requirements/wheels.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/resources/logo.svg +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/setup.cfg +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/__init__.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/data.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/live/__init__.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/live/raw.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/live/roi.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/live/workflow.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/logging.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/nexus/__init__.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/nexus/_nexus_loader.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/nexus/json_generator.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/nexus/json_nexus.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/nexus/types.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/nexus/workflow.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/parameter.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/py.typed +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/scripts/grow_nexus.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/streaming.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/time_of_flight/fakes.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/time_of_flight/interpolator_numba.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/time_of_flight/interpolator_scipy.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/time_of_flight/resample.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/ui.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/uncertainty.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/__init__.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_base.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_binedges_widget.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_bounds_widget.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_config.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_filename_widget.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_linspace_widget.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_optional_widget.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_spinner.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_string_widget.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_switchable_widget.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/widgets/_vector_widget.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/ess/reduce/workflow.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/essreduce.egg-info/dependency_links.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/essreduce.egg-info/entry_points.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/essreduce.egg-info/requires.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/src/essreduce.egg-info/top_level.txt +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/accumulators_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/live/raw_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/live/roi_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/json_generator_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/json_nexus_examples/array_dataset.json +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/json_nexus_examples/dataset.json +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/json_nexus_examples/detector.json +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/json_nexus_examples/entry.json +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/json_nexus_examples/event_data.json +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/json_nexus_examples/instrument.json +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/json_nexus_examples/log.json +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/json_nexus_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/nexus_loader_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/nexus/workflow_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/package_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/scripts/test_grow_nexus.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/streaming_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/time_of_flight/interpolator_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/time_of_flight/resample_tests.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/uncertainty_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tests/widget_test.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tools/shrink_nexus.py +0 -0
- {essreduce-25.5.3 → essreduce-25.7.1}/tox.ini +0 -0
|
@@ -79,6 +79,14 @@ body:
|
|
|
79
79
|
description: How can we test this requirement? Links to tests data and reference data, or other suggestions.
|
|
80
80
|
validations:
|
|
81
81
|
required: true
|
|
82
|
+
- type: textarea
|
|
83
|
+
id: existingimplementations
|
|
84
|
+
attributes:
|
|
85
|
+
label: Existing implementations
|
|
86
|
+
description: Are there any existing implementations or proof-of-concept implementations that we can imitate? This field is specifically for linking to source code.
|
|
87
|
+
placeholder: "Example: See this repository ... This script implements the procedure: https://file-storage.server.eu/script.code."
|
|
88
|
+
validations:
|
|
89
|
+
required: false
|
|
82
90
|
- type: textarea
|
|
83
91
|
id: comments
|
|
84
92
|
attributes:
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"import scipp as sc\n",
|
|
26
26
|
"from scippneutron.chopper import DiskChopper\n",
|
|
27
27
|
"from ess.reduce.nexus.types import DetectorData, SampleRun\n",
|
|
28
|
-
"from ess.reduce import
|
|
28
|
+
"from ess.reduce.time_of_flight import *"
|
|
29
29
|
]
|
|
30
30
|
},
|
|
31
31
|
{
|
|
@@ -286,14 +286,7 @@
|
|
|
286
286
|
"source": [
|
|
287
287
|
"## Computing time-of-flight\n",
|
|
288
288
|
"\n",
|
|
289
|
-
"
|
|
290
|
-
"\n",
|
|
291
|
-
"We use the `tof` module to propagate a pulse of neutrons through the chopper system to the detectors,\n",
|
|
292
|
-
"and predict the most likely neutron wavelength for a given time-of-arrival and distance from source.\n",
|
|
293
|
-
"\n",
|
|
294
|
-
"From this,\n",
|
|
295
|
-
"we build a lookup table on which bilinear interpolation is used to compute a wavelength (and its corresponding time-of-flight)\n",
|
|
296
|
-
"for every neutron event.\n",
|
|
289
|
+
"Next, we use a workflow that provides an estimate of the real time-of-flight as a function of neutron time-of-arrival.\n",
|
|
297
290
|
"\n",
|
|
298
291
|
"### Setting up the workflow"
|
|
299
292
|
]
|
|
@@ -305,19 +298,12 @@
|
|
|
305
298
|
"metadata": {},
|
|
306
299
|
"outputs": [],
|
|
307
300
|
"source": [
|
|
308
|
-
"wf =
|
|
309
|
-
"
|
|
310
|
-
" run_types=[SampleRun],\n",
|
|
311
|
-
" monitor_types=[],\n",
|
|
312
|
-
")\n",
|
|
301
|
+
"wf = GenericTofWorkflow(run_types=[SampleRun], monitor_types=[])\n",
|
|
302
|
+
"\n",
|
|
313
303
|
"wf[DetectorData[SampleRun]] = raw_data\n",
|
|
314
|
-
"wf[
|
|
315
|
-
"wf[time_of_flight.LtotalRange] = (\n",
|
|
316
|
-
" sc.scalar(75.5, unit=\"m\"),\n",
|
|
317
|
-
" sc.scalar(78.0, unit=\"m\"),\n",
|
|
318
|
-
")\n",
|
|
304
|
+
"wf[DetectorLtotal[SampleRun]] = Ltotal\n",
|
|
319
305
|
"\n",
|
|
320
|
-
"wf.visualize(
|
|
306
|
+
"wf.visualize(DetectorTofData[SampleRun])"
|
|
321
307
|
]
|
|
322
308
|
},
|
|
323
309
|
{
|
|
@@ -325,26 +311,47 @@
|
|
|
325
311
|
"id": "21",
|
|
326
312
|
"metadata": {},
|
|
327
313
|
"source": [
|
|
328
|
-
"
|
|
314
|
+
"By default, the workflow tries to load a `TimeOfFlightLookupTable` from a file.\n",
|
|
315
|
+
"\n",
|
|
316
|
+
"In this notebook, instead of using such a pre-made file,\n",
|
|
317
|
+
"we will build our own lookup table from the chopper information and apply it to the workflow."
|
|
318
|
+
]
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"cell_type": "markdown",
|
|
322
|
+
"id": "22",
|
|
323
|
+
"metadata": {},
|
|
324
|
+
"source": [
|
|
325
|
+
"### Building the time-of-flight lookup table\n",
|
|
329
326
|
"\n",
|
|
330
|
-
"
|
|
327
|
+
"We use the [Tof](https://scipp.github.io/tof/) package to propagate a pulse of neutrons through the chopper system to the detectors,\n",
|
|
328
|
+
"and predict the most likely neutron wavelength for a given time-of-arrival and distance from source.\n",
|
|
329
|
+
"\n",
|
|
330
|
+
"From this,\n",
|
|
331
|
+
"we build a lookup table on which bilinear interpolation is used to compute a wavelength (and its corresponding time-of-flight)\n",
|
|
332
|
+
"for every neutron event."
|
|
331
333
|
]
|
|
332
334
|
},
|
|
333
335
|
{
|
|
334
336
|
"cell_type": "code",
|
|
335
337
|
"execution_count": null,
|
|
336
|
-
"id": "
|
|
338
|
+
"id": "23",
|
|
337
339
|
"metadata": {},
|
|
338
340
|
"outputs": [],
|
|
339
341
|
"source": [
|
|
340
|
-
"
|
|
341
|
-
"
|
|
342
|
-
"
|
|
342
|
+
"lut_wf = TofLookupTableWorkflow()\n",
|
|
343
|
+
"lut_wf[DiskChoppers] = disk_choppers\n",
|
|
344
|
+
"lut_wf[SourcePosition] = source_position\n",
|
|
345
|
+
"lut_wf[LtotalRange] = (\n",
|
|
346
|
+
" sc.scalar(75.5, unit=\"m\"),\n",
|
|
347
|
+
" sc.scalar(78.0, unit=\"m\"),\n",
|
|
348
|
+
")\n",
|
|
349
|
+
"lut_wf.visualize(TimeOfFlightLookupTable)"
|
|
343
350
|
]
|
|
344
351
|
},
|
|
345
352
|
{
|
|
346
353
|
"cell_type": "markdown",
|
|
347
|
-
"id": "
|
|
354
|
+
"id": "24",
|
|
348
355
|
"metadata": {},
|
|
349
356
|
"source": [
|
|
350
357
|
"### Inspecting the lookup table\n",
|
|
@@ -361,11 +368,11 @@
|
|
|
361
368
|
{
|
|
362
369
|
"cell_type": "code",
|
|
363
370
|
"execution_count": null,
|
|
364
|
-
"id": "
|
|
371
|
+
"id": "25",
|
|
365
372
|
"metadata": {},
|
|
366
373
|
"outputs": [],
|
|
367
374
|
"source": [
|
|
368
|
-
"sim =
|
|
375
|
+
"sim = lut_wf.compute(SimulationResults)\n",
|
|
369
376
|
"\n",
|
|
370
377
|
"\n",
|
|
371
378
|
"def to_event_time_offset(sim):\n",
|
|
@@ -389,7 +396,7 @@
|
|
|
389
396
|
},
|
|
390
397
|
{
|
|
391
398
|
"cell_type": "markdown",
|
|
392
|
-
"id": "
|
|
399
|
+
"id": "26",
|
|
393
400
|
"metadata": {},
|
|
394
401
|
"source": [
|
|
395
402
|
"The lookup table is then obtained by computing the weighted mean of the time-of-flight inside each time-of-arrival bin.\n",
|
|
@@ -400,11 +407,11 @@
|
|
|
400
407
|
{
|
|
401
408
|
"cell_type": "code",
|
|
402
409
|
"execution_count": null,
|
|
403
|
-
"id": "
|
|
410
|
+
"id": "27",
|
|
404
411
|
"metadata": {},
|
|
405
412
|
"outputs": [],
|
|
406
413
|
"source": [
|
|
407
|
-
"table =
|
|
414
|
+
"table = lut_wf.compute(TimeOfFlightLookupTable)\n",
|
|
408
415
|
"\n",
|
|
409
416
|
"# Overlay mean on the figure above\n",
|
|
410
417
|
"table[\"distance\", 13].plot(ax=fig2.ax, color=\"C1\", ls=\"-\", marker=None)"
|
|
@@ -412,7 +419,7 @@
|
|
|
412
419
|
},
|
|
413
420
|
{
|
|
414
421
|
"cell_type": "markdown",
|
|
415
|
-
"id": "
|
|
422
|
+
"id": "28",
|
|
416
423
|
"metadata": {},
|
|
417
424
|
"source": [
|
|
418
425
|
"The full table covers a range of distances, and looks like"
|
|
@@ -421,7 +428,7 @@
|
|
|
421
428
|
{
|
|
422
429
|
"cell_type": "code",
|
|
423
430
|
"execution_count": null,
|
|
424
|
-
"id": "
|
|
431
|
+
"id": "29",
|
|
425
432
|
"metadata": {},
|
|
426
433
|
"outputs": [],
|
|
427
434
|
"source": [
|
|
@@ -431,28 +438,32 @@
|
|
|
431
438
|
{
|
|
432
439
|
"attachments": {},
|
|
433
440
|
"cell_type": "markdown",
|
|
434
|
-
"id": "
|
|
441
|
+
"id": "30",
|
|
435
442
|
"metadata": {},
|
|
436
443
|
"source": [
|
|
437
444
|
"### Computing a time-of-flight coordinate\n",
|
|
438
445
|
"\n",
|
|
439
|
-
"We will now
|
|
446
|
+
"We will now update our workflow, and use it to obtain our event data with a time-of-flight coordinate:"
|
|
440
447
|
]
|
|
441
448
|
},
|
|
442
449
|
{
|
|
443
450
|
"cell_type": "code",
|
|
444
451
|
"execution_count": null,
|
|
445
|
-
"id": "
|
|
452
|
+
"id": "31",
|
|
446
453
|
"metadata": {},
|
|
447
454
|
"outputs": [],
|
|
448
455
|
"source": [
|
|
449
|
-
"
|
|
456
|
+
"# Set the computed lookup table onto the original workflow\n",
|
|
457
|
+
"wf[TimeOfFlightLookupTable] = table\n",
|
|
458
|
+
"\n",
|
|
459
|
+
"# Compute time-of-flight of neutron events\n",
|
|
460
|
+
"tofs = wf.compute(DetectorTofData[SampleRun])\n",
|
|
450
461
|
"tofs"
|
|
451
462
|
]
|
|
452
463
|
},
|
|
453
464
|
{
|
|
454
465
|
"cell_type": "markdown",
|
|
455
|
-
"id": "
|
|
466
|
+
"id": "32",
|
|
456
467
|
"metadata": {},
|
|
457
468
|
"source": [
|
|
458
469
|
"Histogramming the data for a plot should show a profile with 6 bumps that correspond to the frames:"
|
|
@@ -461,7 +472,7 @@
|
|
|
461
472
|
{
|
|
462
473
|
"cell_type": "code",
|
|
463
474
|
"execution_count": null,
|
|
464
|
-
"id": "
|
|
475
|
+
"id": "33",
|
|
465
476
|
"metadata": {},
|
|
466
477
|
"outputs": [],
|
|
467
478
|
"source": [
|
|
@@ -470,7 +481,7 @@
|
|
|
470
481
|
},
|
|
471
482
|
{
|
|
472
483
|
"cell_type": "markdown",
|
|
473
|
-
"id": "
|
|
484
|
+
"id": "34",
|
|
474
485
|
"metadata": {},
|
|
475
486
|
"source": [
|
|
476
487
|
"### Converting to wavelength\n",
|
|
@@ -481,7 +492,7 @@
|
|
|
481
492
|
{
|
|
482
493
|
"cell_type": "code",
|
|
483
494
|
"execution_count": null,
|
|
484
|
-
"id": "
|
|
495
|
+
"id": "35",
|
|
485
496
|
"metadata": {},
|
|
486
497
|
"outputs": [],
|
|
487
498
|
"source": [
|
|
@@ -501,7 +512,7 @@
|
|
|
501
512
|
},
|
|
502
513
|
{
|
|
503
514
|
"cell_type": "markdown",
|
|
504
|
-
"id": "
|
|
515
|
+
"id": "36",
|
|
505
516
|
"metadata": {},
|
|
506
517
|
"source": [
|
|
507
518
|
"### Comparing to the ground truth\n",
|
|
@@ -513,7 +524,7 @@
|
|
|
513
524
|
{
|
|
514
525
|
"cell_type": "code",
|
|
515
526
|
"execution_count": null,
|
|
516
|
-
"id": "
|
|
527
|
+
"id": "37",
|
|
517
528
|
"metadata": {},
|
|
518
529
|
"outputs": [],
|
|
519
530
|
"source": [
|
|
@@ -530,7 +541,7 @@
|
|
|
530
541
|
},
|
|
531
542
|
{
|
|
532
543
|
"cell_type": "markdown",
|
|
533
|
-
"id": "
|
|
544
|
+
"id": "38",
|
|
534
545
|
"metadata": {},
|
|
535
546
|
"source": [
|
|
536
547
|
"## Multiple detector pixels\n",
|
|
@@ -546,7 +557,7 @@
|
|
|
546
557
|
{
|
|
547
558
|
"cell_type": "code",
|
|
548
559
|
"execution_count": null,
|
|
549
|
-
"id": "
|
|
560
|
+
"id": "39",
|
|
550
561
|
"metadata": {},
|
|
551
562
|
"outputs": [],
|
|
552
563
|
"source": [
|
|
@@ -564,7 +575,7 @@
|
|
|
564
575
|
},
|
|
565
576
|
{
|
|
566
577
|
"cell_type": "markdown",
|
|
567
|
-
"id": "
|
|
578
|
+
"id": "40",
|
|
568
579
|
"metadata": {},
|
|
569
580
|
"source": [
|
|
570
581
|
"Our raw data has now a `detector_number` dimension of length 2.\n",
|
|
@@ -575,7 +586,7 @@
|
|
|
575
586
|
{
|
|
576
587
|
"cell_type": "code",
|
|
577
588
|
"execution_count": null,
|
|
578
|
-
"id": "
|
|
589
|
+
"id": "41",
|
|
579
590
|
"metadata": {},
|
|
580
591
|
"outputs": [],
|
|
581
592
|
"source": [
|
|
@@ -590,7 +601,7 @@
|
|
|
590
601
|
},
|
|
591
602
|
{
|
|
592
603
|
"cell_type": "markdown",
|
|
593
|
-
"id": "
|
|
604
|
+
"id": "42",
|
|
594
605
|
"metadata": {},
|
|
595
606
|
"source": [
|
|
596
607
|
"Computing time-of-flight is done in the same way as above.\n",
|
|
@@ -600,16 +611,16 @@
|
|
|
600
611
|
{
|
|
601
612
|
"cell_type": "code",
|
|
602
613
|
"execution_count": null,
|
|
603
|
-
"id": "
|
|
614
|
+
"id": "43",
|
|
604
615
|
"metadata": {},
|
|
605
616
|
"outputs": [],
|
|
606
617
|
"source": [
|
|
607
618
|
"# Update workflow\n",
|
|
608
619
|
"wf[DetectorData[SampleRun]] = raw_data\n",
|
|
609
|
-
"wf[
|
|
620
|
+
"wf[DetectorLtotal[SampleRun]] = Ltotal\n",
|
|
610
621
|
"\n",
|
|
611
622
|
"# Compute tofs and wavelengths\n",
|
|
612
|
-
"tofs = wf.compute(
|
|
623
|
+
"tofs = wf.compute(DetectorTofData[SampleRun])\n",
|
|
613
624
|
"wav_wfm = tofs.transform_coords(\"wavelength\", graph=graph)\n",
|
|
614
625
|
"\n",
|
|
615
626
|
"# Compare in plot\n",
|
|
@@ -634,7 +645,7 @@
|
|
|
634
645
|
},
|
|
635
646
|
{
|
|
636
647
|
"cell_type": "markdown",
|
|
637
|
-
"id": "
|
|
648
|
+
"id": "44",
|
|
638
649
|
"metadata": {},
|
|
639
650
|
"source": [
|
|
640
651
|
"## Handling time overlap between subframes\n",
|
|
@@ -654,7 +665,7 @@
|
|
|
654
665
|
{
|
|
655
666
|
"cell_type": "code",
|
|
656
667
|
"execution_count": null,
|
|
657
|
-
"id": "
|
|
668
|
+
"id": "45",
|
|
658
669
|
"metadata": {},
|
|
659
670
|
"outputs": [],
|
|
660
671
|
"source": [
|
|
@@ -685,7 +696,7 @@
|
|
|
685
696
|
},
|
|
686
697
|
{
|
|
687
698
|
"cell_type": "markdown",
|
|
688
|
-
"id": "
|
|
699
|
+
"id": "46",
|
|
689
700
|
"metadata": {},
|
|
690
701
|
"source": [
|
|
691
702
|
"We can now see that there is no longer a gap between the two frames at the center of each pulse (green region).\n",
|
|
@@ -697,18 +708,14 @@
|
|
|
697
708
|
{
|
|
698
709
|
"cell_type": "code",
|
|
699
710
|
"execution_count": null,
|
|
700
|
-
"id": "
|
|
711
|
+
"id": "47",
|
|
701
712
|
"metadata": {},
|
|
702
713
|
"outputs": [],
|
|
703
714
|
"source": [
|
|
704
715
|
"# Update workflow\n",
|
|
705
|
-
"
|
|
706
|
-
" choppers=disk_choppers, source_position=source_position, neutrons=2_000_000\n",
|
|
707
|
-
")\n",
|
|
708
|
-
"wf[DetectorData[SampleRun]] = ess_beamline.get_monitor(\"detector\")[0]\n",
|
|
709
|
-
"wf[time_of_flight.DetectorLtotal[SampleRun]] = Ltotal\n",
|
|
716
|
+
"lut_wf[DiskChoppers] = disk_choppers\n",
|
|
710
717
|
"\n",
|
|
711
|
-
"sim =
|
|
718
|
+
"sim = lut_wf.compute(SimulationResults)\n",
|
|
712
719
|
"\n",
|
|
713
720
|
"events = to_event_time_offset(sim)\n",
|
|
714
721
|
"events.hist(wavelength=300, event_time_offset=300).plot(norm=\"log\")"
|
|
@@ -716,7 +723,7 @@
|
|
|
716
723
|
},
|
|
717
724
|
{
|
|
718
725
|
"cell_type": "markdown",
|
|
719
|
-
"id": "
|
|
726
|
+
"id": "48",
|
|
720
727
|
"metadata": {},
|
|
721
728
|
"source": [
|
|
722
729
|
"The data in the lookup table contains both the mean time-of-flight for each distance and time-of-arrival bin,\n",
|
|
@@ -733,17 +740,17 @@
|
|
|
733
740
|
{
|
|
734
741
|
"cell_type": "code",
|
|
735
742
|
"execution_count": null,
|
|
736
|
-
"id": "
|
|
743
|
+
"id": "49",
|
|
737
744
|
"metadata": {},
|
|
738
745
|
"outputs": [],
|
|
739
746
|
"source": [
|
|
740
|
-
"table =
|
|
747
|
+
"table = lut_wf.compute(TimeOfFlightLookupTable)\n",
|
|
741
748
|
"table.plot() / (sc.stddevs(table) / sc.values(table)).plot(norm=\"log\")"
|
|
742
749
|
]
|
|
743
750
|
},
|
|
744
751
|
{
|
|
745
752
|
"cell_type": "markdown",
|
|
746
|
-
"id": "
|
|
753
|
+
"id": "50",
|
|
747
754
|
"metadata": {},
|
|
748
755
|
"source": [
|
|
749
756
|
"The workflow has a parameter which is used to mask out regions where the standard deviation is above a certain threshold.\n",
|
|
@@ -757,18 +764,19 @@
|
|
|
757
764
|
{
|
|
758
765
|
"cell_type": "code",
|
|
759
766
|
"execution_count": null,
|
|
760
|
-
"id": "
|
|
767
|
+
"id": "51",
|
|
761
768
|
"metadata": {},
|
|
762
769
|
"outputs": [],
|
|
763
770
|
"source": [
|
|
764
|
-
"
|
|
771
|
+
"lut_wf[LookupTableRelativeErrorThreshold] = 0.01\n",
|
|
765
772
|
"\n",
|
|
766
|
-
"
|
|
773
|
+
"table = lut_wf.compute(TimeOfFlightLookupTable)\n",
|
|
774
|
+
"table.plot()"
|
|
767
775
|
]
|
|
768
776
|
},
|
|
769
777
|
{
|
|
770
778
|
"cell_type": "markdown",
|
|
771
|
-
"id": "
|
|
779
|
+
"id": "52",
|
|
772
780
|
"metadata": {},
|
|
773
781
|
"source": [
|
|
774
782
|
"We can now see that the central region is masked out.\n",
|
|
@@ -783,12 +791,17 @@
|
|
|
783
791
|
{
|
|
784
792
|
"cell_type": "code",
|
|
785
793
|
"execution_count": null,
|
|
786
|
-
"id": "
|
|
794
|
+
"id": "53",
|
|
787
795
|
"metadata": {},
|
|
788
796
|
"outputs": [],
|
|
789
797
|
"source": [
|
|
798
|
+
"wf[DetectorData[SampleRun]] = ess_beamline.get_monitor(\"detector\")[0]\n",
|
|
799
|
+
"wf[DetectorLtotal[SampleRun]] = Ltotal\n",
|
|
800
|
+
"\n",
|
|
801
|
+
"wf[TimeOfFlightLookupTable] = table\n",
|
|
802
|
+
"\n",
|
|
790
803
|
"# Compute time-of-flight\n",
|
|
791
|
-
"tofs = wf.compute(
|
|
804
|
+
"tofs = wf.compute(DetectorTofData[SampleRun])\n",
|
|
792
805
|
"# Compute wavelength\n",
|
|
793
806
|
"wav_wfm = tofs.transform_coords(\"wavelength\", graph=graph)\n",
|
|
794
807
|
"\n",
|