diff --git a/docs/requirements.txt b/docs/requirements.txt index 4deec92..192ce38 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,4 @@ scipp -scippneutron plopp scipy sphinx diff --git a/docs/wfm-stitching.ipynb b/docs/wfm-stitching.ipynb deleted file mode 100644 index 6ba7dd3..0000000 --- a/docs/wfm-stitching.ipynb +++ /dev/null @@ -1,622 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "6b645603-12c0-4b3d-ab3c-529ad4f373e3", - "metadata": {}, - "source": [ - "# Stitching WFM data\n", - "\n", - "Wavelength-frame-multiplication (WFM) is a technique commonly used at long-pulse facilities to improve the resolution of the results measured at the neutron detectors.\n", - "See for example the article by [Schmakat et al. (2020)](https://www.sciencedirect.com/science/article/pii/S0168900220308640) for a description of how WFM works.\n", - "\n", - "In this notebook, we show how `tof` can be used to find the boundaries of the WFM frames, and apply a time correction to each frame,\n", - "in order to obtain more accurate wavelengths." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "899a245a-0ae7-45dd-b684-3b9d1c034cc6", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import scipp as sc\n", - "from scippneutron.conversion.graph.beamline import beamline\n", - "from scippneutron.conversion.graph.tof import elastic\n", - "import plopp as pp\n", - "import tof\n", - "\n", - "Hz = sc.Unit(\"Hz\")\n", - "deg = sc.Unit(\"deg\")\n", - "meter = sc.Unit(\"m\")" - ] - }, - { - "cell_type": "markdown", - "id": "3890d24c-93ab-4faa-b653-c9208b5eba23", - "metadata": {}, - "source": [ - "## Create a source pulse\n", - "\n", - "We first create a source with one pulse containing 1 million neutrons whose distribution follows the ESS time and wavelength profiles (both thermal and cold neutrons are included)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "872800a5-4cf7-424e-8d2d-0db81292456c", - "metadata": {}, - "outputs": [], - "source": [ - "source = tof.Source(facility=\"ess\", neutrons=1_000_000)\n", - "source.plot()" - ] - }, - { - "cell_type": "markdown", - "id": "b5ffdab6-10cd-4719-8ff2-86e5e1d10571", - "metadata": {}, - "source": [ - "## Chopper set-up\n", - "\n", - "We create a list of choppers that will be included in our beamline.\n", - "In our case, we make two WFM choppers, and two frame-overlap choppers.\n", - "All choppers have 6 openings.\n", - "\n", - "Finally, we also add a pulse-overlap chopper with a single opening.\n", - "These choppers are copied after the [V20 ESS beamline at HZB](https://www.sciencedirect.com/science/article/pii/S0168900216309597)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "34314bcc-978c-468c-b5a1-d84ce33e53d5", - "metadata": {}, - "outputs": [], - "source": [ - "choppers = [\n", - " tof.Chopper(\n", - " frequency=70.0 * Hz,\n", - " open=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[98.71, 155.49, 208.26, 257.32, 302.91, 345.3],\n", - " unit=\"deg\",\n", - " ),\n", - " close=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[109.7, 170.79, 227.56, 280.33, 329.37, 375.0],\n", - " unit=\"deg\",\n", - " ),\n", - " phase=47.10 * deg,\n", - " distance=6.6 * meter,\n", - " name=\"WFM1\",\n", - " ),\n", - " tof.Chopper(\n", - " frequency=70 * Hz,\n", - " open=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[80.04, 141.1, 197.88, 250.67, 299.73, 345.0],\n", - " unit=\"deg\",\n", - " ),\n", - " close=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[91.03, 156.4, 217.18, 269.97, 322.74, 375.0],\n", - " unit=\"deg\",\n", - " ),\n", - " phase=76.76 * deg,\n", - " distance=7.1 * meter,\n", - " name=\"WFM2\",\n", - " ),\n", - " tof.Chopper(\n", - " frequency=56 * Hz,\n", - " open=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[74.6, 139.6, 194.3, 245.3, 294.8, 347.2],\n", - " unit=\"deg\",\n", - " ),\n", - " close=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[95.2, 162.8, 216.1, 263.1, 310.5, 371.6],\n", - " unit=\"deg\",\n", - " ),\n", - " phase=62.40 * deg,\n", - " distance=8.8 * meter,\n", - " name=\"Frame-overlap 1\",\n", - " ),\n", - " tof.Chopper(\n", - " frequency=28 * Hz,\n", - " open=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[98.0, 154.0, 206.8, 254.0, 299.0, 344.65],\n", - " unit=\"deg\",\n", - " ),\n", - " close=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[134.6, 190.06, 237.01, 280.88, 323.56, 373.76],\n", - " unit=\"deg\",\n", - " ),\n", - " phase=12.27 * deg,\n", - " distance=15.9 * meter,\n", - " name=\"Frame-overlap 2\",\n", - " ),\n", - " tof.Chopper(\n", - " frequency=7 * Hz,\n", - " open=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[30.0],\n", - " unit=\"deg\",\n", - " ),\n", - " close=sc.array(\n", - " dims=[\"cutout\"],\n", - " values=[140.0],\n", - " unit=\"deg\",\n", - " ),\n", - " phase=0 * deg,\n", - " distance=22 * meter,\n", - " name=\"Pulse-overlap\",\n", - " ),\n", - "]" - ] - }, - { - "cell_type": "markdown", - "id": "bd6e1399-7f05-4d5c-83e3-7d249d9e0a61", - "metadata": {}, - "source": [ - "## Detector set-up\n", - "\n", - "We add a detector 32 meters from the source." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a377e75c-51a5-4994-af9c-92139d27bee3", - "metadata": {}, - "outputs": [], - "source": [ - "detectors = [\n", - " tof.Detector(distance=32.0 * meter, name=\"detector\"),\n", - "]" - ] - }, - { - "cell_type": "markdown", - "id": "fcb52d39-56d6-4cfb-8bcd-be9f45f4cc70", - "metadata": {}, - "source": [ - "## Find WFM frame edges\n", - "\n", - "To compute the frame edges, we use one of the openings in the WFM choppers at a time,\n", - "run the `tof` simulation, and find the min and max tof of the neutrons that make it through the chopper cascade." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "20597dbd-5204-49fc-8867-9a9ba73fd8de", - "metadata": {}, - "outputs": [], - "source": [ - "nframes = len(choppers[0].open)\n", - "results = []\n", - "\n", - "print(\"Computing frames\")\n", - "\n", - "# Run the model with a single frame at a time\n", - "for i in range(nframes):\n", - " wfm_choppers = [\n", - " tof.Chopper(\n", - " frequency=choppers[j].frequency,\n", - " open=choppers[j].open[i : i + 1],\n", - " close=choppers[j].close[i : i + 1],\n", - " phase=choppers[j].phase,\n", - " distance=choppers[j].distance,\n", - " name=choppers[j].name,\n", - " )\n", - " for j in (0, 1)\n", - " ]\n", - " new_choppers = wfm_choppers + choppers[2:]\n", - " model = tof.Model(source=source, choppers=new_choppers, detectors=detectors)\n", - " res = model.run()\n", - " results.append(res)\n", - "\n", - "invalid_frames = True\n", - "fact = 0.01\n", - "while invalid_frames:\n", - " print(f\"Searching for bounds: threshold={fact:.2f}\")\n", - " frame_bounds = []\n", - " for res in results:\n", - " toas = res.detectors[\"detector\"].toas.data[\"visible\"][\"pulse:0\"].hist(toa=500)\n", - " toas.coords[\"toa\"] = sc.midpoints(toas.coords[\"toa\"])\n", - " # We need to filter out the outliers because some stray rays from other frames make it through\n", - " filtered = toas[toas.data > fact * toas.data.max()].coords[\"toa\"]\n", - " frame_bounds.append((filtered.min(), filtered.max()))\n", - " if all(\n", - " frame_bounds[k][1] < frame_bounds[k + 1][0]\n", - " for k in range(len(frame_bounds) - 1)\n", - " ):\n", - " invalid_frames = False\n", - " else:\n", - " fact += 0.01" - ] - }, - { - "cell_type": "markdown", - "id": "866a02f3-6314-40b5-ac1c-cd8ddacee366", - "metadata": {}, - "source": [ - "The edges of the frames are the following" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ed050525-7f88-4bb2-af2f-827d1d7afe92", - "metadata": {}, - "outputs": [], - "source": [ - "frame_bounds" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a5283e4c-699d-4669-a1ff-3f86a751cd68", - "metadata": {}, - "outputs": [], - "source": [ - "frames = sc.DataGroup(\n", - " {\n", - " \"time_min\": sc.concat([b[0] for b in frame_bounds], dim=\"frame\"),\n", - " \"time_max\": sc.concat([b[1] for b in frame_bounds], dim=\"frame\"),\n", - " }\n", - ")\n", - "frames" - ] - }, - { - "cell_type": "markdown", - "id": "3891b351-4c17-42c2-9c88-68facd82b2aa", - "metadata": {}, - "source": [ - "### Inspecting the frames\n", - "\n", - "As a consistency check, we can run the model with all of the chopper openings, and overlay the frame bounds,\n", - "to verify that there is no overlap between the frames." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d425e97a-247f-47ac-ad85-10b6cb1fea0e", - "metadata": {}, - "outputs": [], - "source": [ - "model = tof.Model(source=source, choppers=choppers, detectors=detectors)\n", - "res = model.run()\n", - "f = res.detectors[\"detector\"].toas.plot(legend=False)\n", - "for i, bound in enumerate(frame_bounds):\n", - " col = f\"C{i + 1}\"\n", - " f.ax.axvspan(bound[0].value, bound[1].value, alpha=0.1, color=col)\n", - " f.ax.axvline(bound[0].value, color=col)\n", - " f.ax.axvline(bound[1].value, color=col)\n", - "f" - ] - }, - { - "cell_type": "markdown", - "id": "5fd905ab-f9b2-437f-9c3a-1bad599447d5", - "metadata": {}, - "source": [ - "### Time-distance diagram\n", - "\n", - "Another way of verifying the frames that were computed is to find the fastest and slowest neutron in each frame,\n", - "and propagate those through the choppers and show the time-distance diagram." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "35f59c87-7435-4248-b8df-c05a1eda0c5e", - "metadata": {}, - "outputs": [], - "source": [ - "frame_min = []\n", - "frame_max = []\n", - "\n", - "for i in range(nframes):\n", - " print(\"frame\", i)\n", - " da = results[i][\"detector\"].data.squeeze()\n", - " da = da[~da.masks[\"blocked_by_others\"]]\n", - " ts = da.coords[\"toa\"]\n", - " sel = (ts > frames[\"time_min\"][i]) & (ts < frames[\"time_max\"][i])\n", - " filtered = da[sel]\n", - " frame_min.append(filtered[np.argmin(filtered.coords[\"toa\"])])\n", - " frame_max.append(filtered[np.argmax(filtered.coords[\"toa\"])])\n", - "\n", - "# Create a source by manually setting neutron birth times and wavelengths\n", - "birth_times = sc.concat(\n", - " [f.coords[\"time\"] for f in frame_min] + [f.coords[\"time\"] for f in frame_max],\n", - " dim=\"event\",\n", - ")\n", - "wavelengths = sc.concat(\n", - " [f.coords[\"wavelength\"] for f in frame_min]\n", - " + [f.coords[\"wavelength\"] for f in frame_max],\n", - " dim=\"event\",\n", - ")\n", - "source_min_max = tof.Source.from_neutrons(\n", - " birth_times=birth_times, wavelengths=wavelengths\n", - ")\n", - "source_min_max" - ] - }, - { - "cell_type": "markdown", - "id": "3ce82c32-2b0d-4e19-a17e-e280caa734c4", - "metadata": {}, - "source": [ - "We can see that the source has 12 neutrons, which is 2 per frame.\n", - "Re-running the model with those yields" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a797542b-130d-4571-8d3f-6b81fb4781df", - "metadata": {}, - "outputs": [], - "source": [ - "model = tof.Model(source=source_min_max, choppers=choppers, detectors=detectors)\n", - "model.run().plot()" - ] - }, - { - "cell_type": "markdown", - "id": "54b85305-c89b-4077-97c2-10c447793725", - "metadata": {}, - "source": [ - "What is interesting, and also a contract of WFM, is that the wavelength of the slowest neutron in one frame is very close to the wavelength of the fastest neutron in the next frame." - ] - }, - { - "cell_type": "markdown", - "id": "c808287b-e569-48c6-a964-ee19d06380ef", - "metadata": {}, - "source": [ - "## Stitching the data: computing time-of-flight\n", - "\n", - "Using WFM choppers allows us to re-define the burst time of the neutrons, and compute a more accurate wavelength.\n", - "\n", - "In the following, we use the boundaries of the frames to select neutrons in each frame,\n", - "and compute a time-of-flight between the time when the WFM choppers are open and the time of arrival at detector.\n", - "\n", - "### Computing wavelengths from the naive time-of-arrival\n", - "\n", - "We first begin by computing the neutron wavelengths as if there were no WFM choppers.\n", - "We take the distance from the source to the detector, and use the neutron arrival time at the detector to compute a speed and hence a wavelength." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "979a7fd7-3597-4522-ab41-9ddf6098c241", - "metadata": {}, - "outputs": [], - "source": [ - "# Extract the tof data of the events that make it through to the detector\n", - "toas = res[\"detector\"].toas.data[\"visible\"][\"pulse:0\"].copy()\n", - "toas.coords[\"source_position\"] = sc.vector([0.0, 0.0, 0.0], unit=\"m\")\n", - "toas.coords[\"position\"] = sc.vector(\n", - " [0.0, 0.0, detectors[0].distance.value], unit=detectors[0].distance.unit\n", - ")\n", - "toas.coords[\"tof\"] = toas.coords[\"toa\"] # Scippneutron requires a tof coordinate\n", - "toas" - ] - }, - { - "cell_type": "markdown", - "id": "1584ab73-9a08-43e5-9047-9f8ec15e56e4", - "metadata": {}, - "source": [ - "Converting the time-of-arrival to wavelength is done using Scipp's `transform_coords`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dbb79512-efbc-4f9c-92e4-e1125f18b07f", - "metadata": {}, - "outputs": [], - "source": [ - "# Make a coordinate transformation graph to compute wavelength from toa\n", - "graph = {**beamline(scatter=False), **elastic(\"tof\")}\n", - "wav_naive = toas.transform_coords(\"wavelength\", graph=graph)\n", - "wav_naive.hist(wavelength=300).plot()" - ] - }, - { - "cell_type": "markdown", - "id": "f72c4e94-2052-488d-90d3-113af1334287", - "metadata": {}, - "source": [ - "### Computing time-of-flight from WFM choppers to detector\n", - "\n", - "Instead of using the source as the departure point of the neutrons, we use the WFM choppers.\n", - "This means that the distance used for the flight is from the WFM choppers to the detector,\n", - "and the flight time is from when the choppers open to the arrival time at detector.\n", - "\n", - "We first get the times when the choppers are open (mid-point between open and close times for the 2 WFM choppers):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7d792986-194a-4714-9e75-f7a038102f43", - "metadata": {}, - "outputs": [], - "source": [ - "times_wfm1 = choppers[0].open_close_times()\n", - "times_wfm2 = choppers[1].open_close_times()\n", - "\n", - "corrections = [\n", - " sc.concat(\n", - " [\n", - " times_wfm1[0][i + nframes], # open wfm1\n", - " times_wfm1[1][i + nframes], # close wfm1\n", - " times_wfm2[0][i + nframes], # open wfm2\n", - " times_wfm2[1][i + nframes], # close wfm2\n", - " ],\n", - " dim=\"x\",\n", - " ).mean()\n", - " for i in range(nframes)\n", - "]\n", - "\n", - "frames[\"time_correction\"] = sc.concat(corrections, dim=\"frame\")\n", - "frames" - ] - }, - { - "cell_type": "markdown", - "id": "8c7daac3-b38f-41e4-a90d-b9daf2d18a1b", - "metadata": {}, - "source": [ - "We apply the correction which effectively 'stitches' the data back together:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d7da162f-bb0b-4bf9-812e-ba14b12ad1fd", - "metadata": {}, - "outputs": [], - "source": [ - "def stitch(\n", - " data: sc.DataArray,\n", - " frames: sc.DataGroup,\n", - " dim: str,\n", - ") -> sc.DataArray:\n", - " edges = sc.flatten(\n", - " sc.transpose(\n", - " sc.concat([frames[\"time_min\"], frames[\"time_max\"]], \"dummy\"),\n", - " dims=[\"frame\", \"dummy\"],\n", - " ),\n", - " to=dim,\n", - " )\n", - "\n", - " binned = data.bin({dim: edges})\n", - "\n", - " for i in range(frames.sizes[\"frame\"]):\n", - " binned[dim, i * 2].bins.coords[dim] -= frames[\"time_correction\"][\"frame\", i]\n", - "\n", - " binned.masks[\"frame_gaps\"] = (\n", - " sc.arange(dim, 2 * frames.sizes[\"frame\"] - 1) % 2\n", - " ).astype(bool)\n", - " binned.masks[\"frame_gaps\"].unit = None\n", - " return binned.bins.concat()\n", - "\n", - "\n", - "wfm_toas = stitch(data=toas, frames=frames, dim=\"toa\")" - ] - }, - { - "cell_type": "markdown", - "id": "8895fba5-c777-4190-ab02-9d7be7acbe8e", - "metadata": {}, - "source": [ - "Finally, we change the `source_position` to now be the mid-point between the WFM choppers:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "160412bd-6253-4ac3-87ff-058e9db2132f", - "metadata": {}, - "outputs": [], - "source": [ - "wfm_toas.coords[\"source_position\"] = sc.vector(\n", - " [0.0, 0.0, 0.5 * (choppers[0].distance.value + choppers[1].distance.value)],\n", - " unit=choppers[0].distance.unit,\n", - ")\n", - "wfm_toas" - ] - }, - { - "cell_type": "markdown", - "id": "c2bdf70a-a2c9-4d93-a17b-5191d3f8c784", - "metadata": {}, - "source": [ - "We can now compute wavelengths using the `transform_coords`, as before:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ea7a25f0-4ce8-4ace-9bec-2cece7e4ee08", - "metadata": {}, - "outputs": [], - "source": [ - "wfm_toas.bins.coords[\"tof\"] = wfm_toas.bins.coords[\"toa\"]\n", - "wav_wfm = wfm_toas.transform_coords(\"wavelength\", graph=graph)" - ] - }, - { - "cell_type": "markdown", - "id": "ea677910-7670-4588-991b-baa3fc54f0eb", - "metadata": {}, - "source": [ - "### Comparison between naive and WFM computations\n", - "\n", - "We compare the wavelengths computed using the naive approach, the WFM approach, and also with the true wavelengths of the neutrons:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "893a2d62-82d0-4bd2-acf2-688cd0d5fec9", - "metadata": {}, - "outputs": [], - "source": [ - "pp.plot(\n", - " {\n", - " \"naive\": wav_naive.hist(wavelength=300),\n", - " \"wfm\": wav_wfm.hist(wavelength=300),\n", - " \"truth\": res[\"detector\"]\n", - " .wavelengths.data[\"visible\"][\"pulse:0\"]\n", - " .hist(wavelength=300),\n", - " }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "da6a161b-2051-4afa-a49a-7eb045356d01", - "metadata": {}, - "source": [ - "As we can see, the WFM approach vastly outperforms the naive approach." - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/wfm.ipynb b/docs/wfm.ipynb index f5571bd..b461582 100644 --- a/docs/wfm.ipynb +++ b/docs/wfm.ipynb @@ -5,7 +5,7 @@ "id": "6b645603-12c0-4b3d-ab3c-529ad4f373e3", "metadata": {}, "source": [ - "# WFM beamlimes\n", + "# WFM beamlines\n", "\n", "Wavelength-frame-multiplication (WFM) is a technique commonly used at long-pulse facilities to improve the resolution of the results measured at the neutron detectors.\n", "See for example the article by [Schmakat et al. (2020)](https://www.sciencedirect.com/science/article/pii/S0168900220308640) for a description of how WFM works.\n", diff --git a/requirements/base.in b/requirements/base.in new file mode 100644 index 0000000..e1fd970 --- /dev/null +++ b/requirements/base.in @@ -0,0 +1,3 @@ +plopp +scipp +scipy diff --git a/requirements/base.txt b/requirements/base.txt new file mode 100644 index 0000000..577959e --- /dev/null +++ b/requirements/base.txt @@ -0,0 +1,39 @@ +# SHA1:7a8a35017d78f5fa79c7372cb6a3c03990f828bb +# +# This file is autogenerated by pip-compile-multi +# To update, run: +# +# pip-compile-multi +# +contourpy==1.3.0 + # via matplotlib +cycler==0.12.1 + # via matplotlib +fonttools==4.54.1 + # via matplotlib +kiwisolver==1.4.7 + # via matplotlib +matplotlib==3.9.2 + # via plopp +numpy==2.1.2 + # via + # contourpy + # matplotlib + # scipp + # scipy +packaging==24.1 + # via matplotlib +pillow==10.4.0 + # via matplotlib +plopp==24.9.3 + # via -r base.in +pyparsing==3.1.4 + # via matplotlib +python-dateutil==2.9.0.post0 + # via matplotlib +scipp==24.9.1 + # via -r base.in +scipy==1.14.1 + # via -r base.in +six==1.16.0 + # via python-dateutil diff --git a/requirements/ci.txt b/requirements/ci.txt index 8fe58fb..0d4eb6b 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -11,11 +11,11 @@ certifi==2024.8.30 # via requests chardet==5.2.0 # via tox -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 # via requests colorama==0.4.6 # via tox -distlib==0.3.8 +distlib==0.3.9 # via virtualenv filelock==3.16.1 # via diff --git a/requirements/docs.in b/requirements/docs.in index 729f9d8..0782d40 100644 --- a/requirements/docs.in +++ b/requirements/docs.in @@ -1,8 +1,8 @@ +-r base.in gitpython ipykernel ipywidgets nbsphinx -scippneutron sphinx sphinx-autodoc-typehints sphinx-book-theme diff --git a/requirements/docs.txt b/requirements/docs.txt index 47bc44e..554d60a 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -1,10 +1,11 @@ -# SHA1:6fd4d9201f4bf5006252fb9dc1d498ef452c7015 +# SHA1:61342e00557198c97a6eea2b16541427e2532e61 # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # +-r base.txt accessible-pygments==0.0.5 # via pydata-sphinx-theme alabaster==1.0.0 @@ -27,16 +28,12 @@ bleach==6.1.0 # via nbconvert certifi==2024.8.30 # via requests -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 # via requests comm==0.2.2 # via # ipykernel # ipywidgets -contourpy==1.3.0 - # via matplotlib -cycler==0.12.1 - # via matplotlib debugpy==1.8.6 # via ipykernel decorator==5.1.1 @@ -54,16 +51,10 @@ executing==2.1.0 # via stack-data fastjsonschema==2.20.0 # via nbformat -fonttools==4.54.1 - # via matplotlib gitdb==4.0.11 # via gitpython gitpython==3.1.43 # via -r docs.in -h5py==3.12.1 - # via - # scippneutron - # scippnexus idna==3.10 # via requests imagesize==1.4.1 @@ -85,7 +76,7 @@ jinja2==3.1.4 # sphinx jsonschema==4.23.0 # via nbformat -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 # via jsonschema jupyter-client==8.6.3 # via @@ -102,24 +93,16 @@ jupyterlab-pygments==0.3.0 # via nbconvert jupyterlab-widgets==3.0.13 # via ipywidgets -kiwisolver==1.4.7 - # via matplotlib -markupsafe==2.1.5 +markupsafe==3.0.1 # via # jinja2 # nbconvert -matplotlib==3.9.2 - # via - # mpltoolbox - # plopp matplotlib-inline==0.1.7 # via # ipykernel # ipython mistune==3.0.2 # via nbconvert -mpltoolbox==24.5.1 - # via scippneutron nbclient==0.10.0 # via nbconvert nbconvert==7.16.4 @@ -133,34 +116,14 @@ nbsphinx==0.9.5 # via -r docs.in nest-asyncio==1.6.0 # via ipykernel -numpy==2.1.2 - # via - # contourpy - # h5py - # matplotlib - # mpltoolbox - # scipp - # scippneutron - # scipy -packaging==24.1 - # via - # ipykernel - # matplotlib - # nbconvert - # pydata-sphinx-theme - # sphinx pandocfilters==1.5.1 # via nbconvert parso==0.8.4 # via jedi pexpect==4.9.0 # via ipython -pillow==10.4.0 - # via matplotlib platformdirs==4.3.6 # via jupyter-core -plopp==24.9.3 - # via scippneutron prompt-toolkit==3.0.48 # via ipython psutil==6.0.0 @@ -178,13 +141,6 @@ pygments==2.18.0 # nbconvert # pydata-sphinx-theme # sphinx -pyparsing==3.1.4 - # via matplotlib -python-dateutil==2.9.0.post0 - # via - # jupyter-client - # matplotlib - # scippnexus pyzmq==26.2.0 # via # ipykernel @@ -199,23 +155,6 @@ rpds-py==0.20.0 # via # jsonschema # referencing -scipp==24.9.1 - # via - # scippneutron - # scippnexus -scippneutron==24.9.0 - # via -r docs.in -scippnexus==24.10.0 - # via scippneutron -scipy==1.14.1 - # via - # scippneutron - # scippnexus -six==1.16.0 - # via - # asttokens - # bleach - # python-dateutil smmap==5.0.1 # via gitdb snowballstemmer==2.2.0 @@ -230,7 +169,7 @@ sphinx==8.0.2 # sphinx-autodoc-typehints # sphinx-book-theme # sphinx-copybutton -sphinx-autodoc-typehints==2.4.4 +sphinx-autodoc-typehints==2.5.0 # via -r docs.in sphinx-book-theme==1.1.3 # via -r docs.in diff --git a/requirements/static.txt b/requirements/static.txt index 4910f30..6d65fbd 100644 --- a/requirements/static.txt +++ b/requirements/static.txt @@ -7,7 +7,7 @@ # cfgv==3.4.0 # via pre-commit -distlib==0.3.8 +distlib==0.3.9 # via virtualenv filelock==3.16.1 # via virtualenv @@ -17,7 +17,7 @@ nodeenv==1.9.1 # via pre-commit platformdirs==4.3.6 # via virtualenv -pre-commit==4.0.0 +pre-commit==4.0.1 # via -r static.in pyyaml==6.0.2 # via pre-commit diff --git a/requirements/test.in b/requirements/test.in index e079f8a..1cf404d 100644 --- a/requirements/test.in +++ b/requirements/test.in @@ -1 +1,2 @@ +-r base.in pytest diff --git a/requirements/test.txt b/requirements/test.txt index f661d5c..bcb65c4 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,16 +1,15 @@ -# SHA1:0eaa389e1fdb3a1917c0f987514bd561be5718ee +# SHA1:a035a60fcbac4cd7bf595dbd81ee7994505d4a95 # # This file is autogenerated by pip-compile-multi # To update, run: # # pip-compile-multi # +-r base.txt exceptiongroup==1.2.2 # via pytest iniconfig==2.0.0 # via pytest -packaging==24.1 - # via pytest pluggy==1.5.0 # via pytest pytest==8.3.3