Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add illustration of inhomogeneity from absorption #113

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
140 changes: 140 additions & 0 deletions docs/user-guide/dream/dream-visualize-absorption.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you want this notebook to appear in the docs, you need to add it to the dream/index.md.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Forgot that, thanks.

"cells": [
{
"cell_type": "markdown",
"id": "0",
"metadata": {},
"source": [
"# DREAM instrument view\n",
"\n",
"This notebook is a simple example of how to use the instrument view for the DREAM instrument.\n",
"\n",
"- The DREAM-specific instrument view is capable of slicing the data with a slider widget along a dimension (e.g. `tof`) by using the `dim` argument.\n",
"- There are also checkboxes to hide/show the different elements that make up the DREAM detectors.\n",
"\n",
"We begin with relevant imports.\n",
"We will be using tutorial data downloaded with `pooch`.\n",
"If you get an error about a missing module `pooch`, you can install it with `!pip install pooch`:"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the text in here needs updating? (seems it was copied from the instrument view notebook)

]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1",
"metadata": {},
"outputs": [],
"source": [
"import scipp as sc\n",
"from ess import dream\n",
"import ess.dream.data # noqa: F401"
]
},
{
"cell_type": "markdown",
"id": "2",
"metadata": {},
"source": [
"## Load the data\n",
"\n",
"We load a dataset from a Geant4 simulation (stored as a `.csv` file).\n",
"In each detector bank, the data is organised by `wire`, `strip`, `module`, `segment`, and `counter`.\n",
"The high resolution detector also has an additional `sector` dimension."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3",
"metadata": {},
"outputs": [],
"source": [
"dg = dream.io.load_geant4_csv(dream.data.get_path(\"data_dream0_new_hkl_Si_pwd.csv.zip\"))\n",
"dg = dg[\"instrument\"] # Extract the instrument data\n",
"\n",
"# Extract the events from nested data groups\n",
"dg = sc.DataGroup({key: detector[\"events\"] for key, detector in dg.items()})\n",
"dg"
]
},
{
"cell_type": "markdown",
"id": "4",
"metadata": {},
"source": [
"## Display inhomogeneity from absorption\n",
"\n",
"If the sample absorbs or scatters a large fraction of the incoming neutrons the intensity in the detector will vary even if the scattering is inhomogeneous.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5",
"metadata": {},
"outputs": [],
"source": [
"import scipp as sc\n",
"\n",
"from scippneutron.absorption import compute_transmission_map\n",
"from scippneutron.absorption.cylinder import Cylinder\n",
"from scippneutron.absorption.material import Material\n",
"from scippneutron.atoms import ScatteringParams\n",
"\n",
"\n",
"material = Material(\n",
" scattering_params=ScatteringParams.for_isotope('V'),\n",
" effective_sample_number_density=sc.scalar(0.07192, unit='1/angstrom**3')\n",
")\n",
"sample_shape = Cylinder(\n",
" symmetry_line=sc.vector([0, 1, 0]),\n",
" center_of_base=sc.vector([0, -2.5, 0], unit='cm'),\n",
" radius=sc.scalar(1, unit='cm'),\n",
" height=sc.scalar(5., unit='cm')\n",
")\n",
"\n",
"transmission_fraction = compute_transmission_map(\n",
" sample_shape,\n",
" material,\n",
" beam_direction=sc.vector([0, 0, 1]),\n",
" wavelength=sc.linspace('wavelength', 4, 8, 20, unit='angstrom'),\n",
" detector_position=dg['mantle'].coords['position']['strip', ::4]['wire', ::2].copy(),\n",
" quadrature_kind='cheap',\n",
")\n",
"\n",
"transmission_fraction.coords['position'] = transmission_fraction.coords.pop('detector_position')\n",
"dream.instrument_view(transmission_fraction.transpose((*set(transmission_fraction.dims) - {'wavelength'}, 'wavelength')), dim='wavelength')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6",
"metadata": {},
"outputs": [],
"source": [
"transmission_fraction"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.14"
}
},
"nbformat": 4,
"nbformat_minor": 5
}